content.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. package message
  2. import (
  3. "encoding/base64"
  4. "time"
  5. )
  6. type MessageRole string
  7. const (
  8. Assistant MessageRole = "assistant"
  9. User MessageRole = "user"
  10. System MessageRole = "system"
  11. Tool MessageRole = "tool"
  12. )
  13. type ContentPart interface {
  14. isPart()
  15. }
  16. type ReasoningContent struct {
  17. Thinking string `json:"thinking"`
  18. }
  19. func (tc ReasoningContent) String() string {
  20. return tc.Thinking
  21. }
  22. func (ReasoningContent) isPart() {}
  23. type TextContent struct {
  24. Text string `json:"text"`
  25. }
  26. func (tc TextContent) String() string {
  27. return tc.Text
  28. }
  29. func (TextContent) isPart() {}
  30. type ImageURLContent struct {
  31. URL string `json:"url"`
  32. Detail string `json:"detail,omitempty"`
  33. }
  34. func (iuc ImageURLContent) String() string {
  35. return iuc.URL
  36. }
  37. func (ImageURLContent) isPart() {}
  38. type BinaryContent struct {
  39. MIMEType string
  40. Data []byte
  41. }
  42. func (bc BinaryContent) String() string {
  43. base64Encoded := base64.StdEncoding.EncodeToString(bc.Data)
  44. return "data:" + bc.MIMEType + ";base64," + base64Encoded
  45. }
  46. func (BinaryContent) isPart() {}
  47. type ToolCall struct {
  48. ID string `json:"id"`
  49. Name string `json:"name"`
  50. Input string `json:"input"`
  51. Type string `json:"type"`
  52. Metadata any `json:"metadata"`
  53. Finished bool `json:"finished"`
  54. }
  55. func (ToolCall) isPart() {}
  56. type ToolResult struct {
  57. ToolCallID string `json:"tool_call_id"`
  58. Name string `json:"name"`
  59. Content string `json:"content"`
  60. IsError bool `json:"is_error"`
  61. }
  62. func (ToolResult) isPart() {}
  63. type Finish struct {
  64. Reason string `json:"reason"`
  65. Time int64 `json:"time"`
  66. }
  67. func (Finish) isPart() {}
  68. type Message struct {
  69. ID string
  70. Role MessageRole
  71. SessionID string
  72. Parts []ContentPart
  73. CreatedAt int64
  74. UpdatedAt int64
  75. }
  76. func (m *Message) Content() TextContent {
  77. for _, part := range m.Parts {
  78. if c, ok := part.(TextContent); ok {
  79. return c
  80. }
  81. }
  82. return TextContent{}
  83. }
  84. func (m *Message) ReasoningContent() ReasoningContent {
  85. for _, part := range m.Parts {
  86. if c, ok := part.(ReasoningContent); ok {
  87. return c
  88. }
  89. }
  90. return ReasoningContent{}
  91. }
  92. func (m *Message) ImageURLContent() []ImageURLContent {
  93. imageURLContents := make([]ImageURLContent, 0)
  94. for _, part := range m.Parts {
  95. if c, ok := part.(ImageURLContent); ok {
  96. imageURLContents = append(imageURLContents, c)
  97. }
  98. }
  99. return imageURLContents
  100. }
  101. func (m *Message) BinaryContent() []BinaryContent {
  102. binaryContents := make([]BinaryContent, 0)
  103. for _, part := range m.Parts {
  104. if c, ok := part.(BinaryContent); ok {
  105. binaryContents = append(binaryContents, c)
  106. }
  107. }
  108. return binaryContents
  109. }
  110. func (m *Message) ToolCalls() []ToolCall {
  111. toolCalls := make([]ToolCall, 0)
  112. for _, part := range m.Parts {
  113. if c, ok := part.(ToolCall); ok {
  114. toolCalls = append(toolCalls, c)
  115. }
  116. }
  117. return toolCalls
  118. }
  119. func (m *Message) ToolResults() []ToolResult {
  120. toolResults := make([]ToolResult, 0)
  121. for _, part := range m.Parts {
  122. if c, ok := part.(ToolResult); ok {
  123. toolResults = append(toolResults, c)
  124. }
  125. }
  126. return toolResults
  127. }
  128. func (m *Message) IsFinished() bool {
  129. for _, part := range m.Parts {
  130. if _, ok := part.(Finish); ok {
  131. return true
  132. }
  133. }
  134. return false
  135. }
  136. func (m *Message) FinishPart() *Finish {
  137. for _, part := range m.Parts {
  138. if c, ok := part.(Finish); ok {
  139. return &c
  140. }
  141. }
  142. return nil
  143. }
  144. func (m *Message) FinishReason() string {
  145. for _, part := range m.Parts {
  146. if c, ok := part.(Finish); ok {
  147. return c.Reason
  148. }
  149. }
  150. return ""
  151. }
  152. func (m *Message) IsThinking() bool {
  153. if m.ReasoningContent().Thinking != "" && m.Content().Text == "" && !m.IsFinished() {
  154. return true
  155. }
  156. return false
  157. }
  158. func (m *Message) AppendContent(delta string) {
  159. found := false
  160. for i, part := range m.Parts {
  161. if c, ok := part.(TextContent); ok {
  162. m.Parts[i] = TextContent{Text: c.Text + delta}
  163. found = true
  164. }
  165. }
  166. if !found {
  167. m.Parts = append(m.Parts, TextContent{Text: delta})
  168. }
  169. }
  170. func (m *Message) AppendReasoningContent(delta string) {
  171. found := false
  172. for i, part := range m.Parts {
  173. if c, ok := part.(ReasoningContent); ok {
  174. m.Parts[i] = ReasoningContent{Thinking: c.Thinking + delta}
  175. found = true
  176. }
  177. }
  178. if !found {
  179. m.Parts = append(m.Parts, ReasoningContent{Thinking: delta})
  180. }
  181. }
  182. func (m *Message) AddToolCall(tc ToolCall) {
  183. for i, part := range m.Parts {
  184. if c, ok := part.(ToolCall); ok {
  185. if c.ID == tc.ID {
  186. m.Parts[i] = tc
  187. return
  188. }
  189. }
  190. }
  191. m.Parts = append(m.Parts, tc)
  192. }
  193. func (m *Message) SetToolCalls(tc []ToolCall) {
  194. for _, toolCall := range tc {
  195. m.Parts = append(m.Parts, toolCall)
  196. }
  197. }
  198. func (m *Message) AddToolResult(tr ToolResult) {
  199. m.Parts = append(m.Parts, tr)
  200. }
  201. func (m *Message) SetToolResults(tr []ToolResult) {
  202. for _, toolResult := range tr {
  203. m.Parts = append(m.Parts, toolResult)
  204. }
  205. }
  206. func (m *Message) AddFinish(reason string) {
  207. m.Parts = append(m.Parts, Finish{Reason: reason, Time: time.Now().Unix()})
  208. }
  209. func (m *Message) AddImageURL(url, detail string) {
  210. m.Parts = append(m.Parts, ImageURLContent{URL: url, Detail: detail})
  211. }
  212. func (m *Message) AddBinary(mimeType string, data []byte) {
  213. m.Parts = append(m.Parts, BinaryContent{MIMEType: mimeType, Data: data})
  214. }