@@ -16,8 +16,9 @@ import (
1616 cohere "github.com/cohere-ai/cohere-go/v2"
1717 "github.com/gabriel-vasile/mimetype"
1818 anthropic "github.com/liushuangls/go-anthropic/v2"
19+ "github.com/openai/openai-go"
20+ "github.com/openai/openai-go/shared/constant"
1921 "github.com/rs/xid"
20- openai "github.com/sashabaranov/go-openai"
2122 gemini "google.golang.org/genai"
2223
2324 "github.com/bububa/atomic-agents/schema"
@@ -50,7 +51,7 @@ type LLMResponse struct {
5051}
5152
5253// FromOpenAI convnert response from openai
53- func (r * LLMResponse ) FromOpenAI (v * openai.ChatCompletionResponse ) {
54+ func (r * LLMResponse ) FromOpenAI (v * openai.ChatCompletion ) {
5455 r .ID = v .ID
5556 r .Role = AssistantRole
5657 r .Model = v .Model
@@ -67,8 +68,8 @@ func (r *LLMResponse) FromAnthropic(v *anthropic.MessagesResponse) {
6768 r .Role = AssistantRole
6869 r .Model = string (v .Model )
6970 r .Usage = & LLMUsage {
70- InputTokens : v .Usage .InputTokens ,
71- OutputTokens : v .Usage .OutputTokens ,
71+ InputTokens : int64 ( v .Usage .InputTokens ) ,
72+ OutputTokens : int64 ( v .Usage .OutputTokens ) ,
7273 }
7374 r .Details = v .Content
7475}
@@ -83,10 +84,10 @@ func (r *LLMResponse) FromCohere(v *cohere.NonStreamedChatResponse) {
8384 if usage := meta .Tokens ; usage != nil {
8485 r .Usage = new (LLMUsage )
8586 if usage .InputTokens != nil {
86- r .Usage .InputTokens = int (* usage .InputTokens )
87+ r .Usage .InputTokens = int64 (* usage .InputTokens )
8788 }
8889 if usage .OutputTokens != nil {
89- r .Usage .OutputTokens = int (* usage .OutputTokens )
90+ r .Usage .OutputTokens = int64 (* usage .OutputTokens )
9091 }
9192 }
9293 if version := meta .ApiVersion ; version != nil {
@@ -100,15 +101,15 @@ func (r *LLMResponse) FromGemini(v *gemini.GenerateContentResponse) {
100101 r .Role = AssistantRole
101102 if v .UsageMetadata != nil && (v .UsageMetadata .PromptTokenCount > 0 || v .UsageMetadata .CandidatesTokenCount > 0 ) {
102103 r .Usage = new (LLMUsage )
103- r .Usage .InputTokens = int (v .UsageMetadata .PromptTokenCount )
104- r .Usage .OutputTokens = int (v .UsageMetadata .CachedContentTokenCount )
104+ r .Usage .InputTokens = int64 (v .UsageMetadata .PromptTokenCount )
105+ r .Usage .OutputTokens = int64 (v .UsageMetadata .CachedContentTokenCount )
105106 }
106107 r .Details = v .Candidates
107108}
108109
109110type LLMUsage struct {
110- InputTokens int `json:"input_tokens,omitempty"`
111- OutputTokens int `json:"output_tokens,omitempty"`
111+ InputTokens int64 `json:"input_tokens,omitempty"`
112+ OutputTokens int64 `json:"output_tokens,omitempty"`
112113}
113114
114115func (u * LLMUsage ) Merge (v * LLMUsage ) {
@@ -256,12 +257,12 @@ func (m Message) TryAttachChunkPrompt(idx int) string {
256257}
257258
258259// ToOpenAI convert message to openai ChatCompletionMessage
259- func (m Message ) ToOpenAI (dist * openai.ChatCompletionMessage ) []openai.ChatCompletionMessage {
260+ func (m Message ) ToOpenAI (dist * openai.ChatCompletionMessageParamUnion ) []openai.ChatCompletionMessageParamUnion {
260261 m .toOpenAI (dist , 0 )
261262 if l := len (m .Chunks ()); l > 0 {
262- list := make ([]openai.ChatCompletionMessage , 0 , l )
263+ list := make ([]openai.ChatCompletionMessageParamUnion , 0 , l )
263264 for idx := range l {
264- var llmMsg openai.ChatCompletionMessage
265+ var llmMsg openai.ChatCompletionMessageParamUnion
265266 if err := m .toOpenAI (& llmMsg , idx + 1 ); err == nil {
266267 list = append (list , llmMsg )
267268 }
@@ -271,7 +272,7 @@ func (m Message) ToOpenAI(dist *openai.ChatCompletionMessage) []openai.ChatCompl
271272 return nil
272273}
273274
274- func (m Message ) toOpenAI (dist * openai.ChatCompletionMessage , idx int ) error {
275+ func (m Message ) toOpenAI (dist * openai.ChatCompletionMessageParamUnion , idx int ) error {
275276 src := m
276277 chunks := m .Chunks ()
277278 if idx > 0 {
@@ -281,35 +282,40 @@ func (m Message) toOpenAI(dist *openai.ChatCompletionMessage, idx int) error {
281282 return errors .New ("invalid chunk index" )
282283 }
283284 }
284- dist .Role = m .role
285285 txt := m .TryAttachChunkPrompt (idx )
286- if attachement := src .Attachement (); attachement != nil && (len (attachement .ImageURLs ) > 0 || len (attachement .VideoURLs ) > 0 ) {
287- dist .MultiContent = make ([]openai.ChatMessagePart , 0 , len (attachement .ImageURLs )+ len (attachement .VideoURLs )+ 1 )
288- dist .MultiContent = append (dist .MultiContent , openai.ChatMessagePart {
289- Type : openai .ChatMessagePartTypeText ,
290- Text : txt ,
291- })
286+ if attachement := src .Attachement (); m .role == UserRole && attachement != nil && (len (attachement .ImageURLs ) > 0 || len (attachement .VideoURLs ) > 0 ) {
287+ contents := make ([]openai.ChatCompletionContentPartUnionParam , 0 , len (attachement .ImageURLs )+ len (attachement .VideoURLs )+ 1 )
288+ contents = append (contents , openai .TextContentPart (txt ))
292289 for _ , imageURL := range attachement .ImageURLs {
293- dist .MultiContent = append (dist .MultiContent , openai.ChatMessagePart {
294- Type : openai .ChatMessagePartTypeImageURL ,
295- ImageURL : & openai.ChatMessageImageURL {
296- URL : imageURL ,
297- },
298- })
290+ contents = append (contents , openai .ImageContentPart (openai.ChatCompletionContentPartImageImageURLParam {
291+ URL : imageURL ,
292+ }))
299293 }
300294 for _ , videoURL := range attachement .VideoURLs {
301- dist . MultiContent = append ( dist . MultiContent , openai.ChatMessagePart {
302- Type : "video_url" ,
303- VideoURL : & openai. ChatMessageVideoURL {
304- URL : videoURL ,
305- },
306- Video : & openai. ChatMessageVideo {
307- URL : videoURL ,
295+ videoParam := & openai.ChatCompletionContentPartImageParam {
296+ Type : constant . ImageURL ( "video_url" ) ,
297+ }
298+ videoParam . SetExtraFields ( map [ string ] any {
299+ "video_url" : openai. ImageURL {
300+ URL : videoURL ,
301+ Detail : openai . ImageURLDetailAuto ,
308302 },
309303 })
304+ part := openai.ChatCompletionContentPartUnionParam {
305+ OfImageURL : videoParam ,
306+ }
307+ contents = append (contents , part )
310308 }
311- } else {
312- dist .Content = txt
309+ * dist = openai .UserMessage (contents )
310+ return nil
311+ }
312+ switch m .role {
313+ case SystemRole :
314+ * dist = openai .SystemMessage (txt )
315+ case AssistantRole :
316+ * dist = openai .AssistantMessage (txt )
317+ case UserRole :
318+ * dist = openai .UserMessage (txt )
313319 }
314320 return nil
315321}
0 commit comments