@@ -28,6 +28,11 @@ type ChatRequest struct {
28
28
PresencePenalty int `json:"presence_penalty,omitempty"`
29
29
}
30
30
31
+ func (r * ChatRequest ) ApplyParams (params * schemas.ChatParams ) {
32
+ r .Messages = params .Messages
33
+ // TODO(185): set other params
34
+ }
35
+
31
36
// NewChatRequestFromConfig fills the struct from the config. Not using reflection because of performance penalty it gives
32
37
func NewChatRequestFromConfig (cfg * Config ) * ChatRequest {
33
38
return & ChatRequest {
@@ -36,50 +41,29 @@ func NewChatRequestFromConfig(cfg *Config) *ChatRequest {
36
41
TopP : cfg .DefaultParams .TopP ,
37
42
MaxTokens : cfg .DefaultParams .MaxTokens ,
38
43
StopWords : cfg .DefaultParams .StopWords ,
39
- Stream : false , // unsupported right now
40
44
FrequencyPenalty : cfg .DefaultParams .FrequencyPenalty ,
41
45
PresencePenalty : cfg .DefaultParams .PresencePenalty ,
42
46
}
43
47
}
44
48
45
- func NewChatMessagesFromUnifiedRequest (request * schemas.ChatRequest ) []ChatMessage {
46
- messages := make ([]ChatMessage , 0 , len (request .MessageHistory )+ 1 )
47
-
48
- // Add items from messageHistory first and the new chat message last
49
- for _ , message := range request .MessageHistory {
50
- messages = append (messages , ChatMessage {Role : message .Role , Content : message .Content })
51
- }
52
-
53
- messages = append (messages , ChatMessage {Role : request .Message .Role , Content : request .Message .Content })
54
-
55
- return messages
56
- }
57
-
58
49
// Chat sends a chat request to the specified octoml model.
59
- func (c * Client ) Chat (ctx context.Context , request * schemas.ChatRequest ) (* schemas.ChatResponse , error ) {
50
+ func (c * Client ) Chat (ctx context.Context , params * schemas.ChatParams ) (* schemas.ChatResponse , error ) {
60
51
// Create a new chat request
61
- chatRequest := c .createChatRequestSchema (request )
52
+ // TODO: consider using objectpool to optimize memory allocation
53
+ chatReq := * c .chatRequestTemplate // hoping to get a copy of the template
54
+ chatReq .ApplyParams (params )
55
+
56
+ chatReq .Stream = false
57
+
58
+ chatResponse , err := c .doChatRequest (ctx , & chatReq )
62
59
63
- chatResponse , err := c .doChatRequest (ctx , chatRequest )
64
60
if err != nil {
65
61
return nil , err
66
62
}
67
63
68
- if len (chatResponse .ModelResponse .Message .Content ) == 0 {
69
- return nil , ErrEmptyResponse
70
- }
71
-
72
64
return chatResponse , nil
73
65
}
74
66
75
- func (c * Client ) createChatRequestSchema (request * schemas.ChatRequest ) * ChatRequest {
76
- // TODO: consider using objectpool to optimize memory allocation
77
- chatRequest := c .chatRequestTemplate // hoping to get a copy of the template
78
- chatRequest .Messages = NewChatMessagesFromUnifiedRequest (request )
79
-
80
- return chatRequest
81
- }
82
-
83
67
func (c * Client ) doChatRequest (ctx context.Context , payload * ChatRequest ) (* schemas.ChatResponse , error ) {
84
68
// Build request payload
85
69
rawPayload , err := json .Marshal (payload )
@@ -121,33 +105,39 @@ func (c *Client) doChatRequest(ctx context.Context, payload *ChatRequest) (*sche
121
105
}
122
106
123
107
// Parse the response JSON
124
- var openAICompletion openai.ChatCompletion // Octo uses the same response schema as OpenAI
108
+ var completion openai.ChatCompletion // Octo uses the same response schema as OpenAI
125
109
126
- err = json .Unmarshal (bodyBytes , & openAICompletion )
110
+ err = json .Unmarshal (bodyBytes , & completion )
127
111
if err != nil {
128
112
c .telemetry .Logger .Error ("failed to parse openai chat response" , zap .Error (err ))
129
113
return nil , err
130
114
}
131
115
116
+ modelChoice := completion .Choices [0 ]
117
+
118
+ if len (modelChoice .Message .Content ) == 0 {
119
+ return nil , ErrEmptyResponse
120
+ }
121
+
132
122
// Map response to UnifiedChatResponse schema
133
123
response := schemas.ChatResponse {
134
- ID : openAICompletion .ID ,
135
- Created : openAICompletion .Created ,
124
+ ID : completion .ID ,
125
+ Created : completion .Created ,
136
126
Provider : providerName ,
137
- ModelName : openAICompletion .ModelName ,
127
+ ModelName : completion .ModelName ,
138
128
Cached : false ,
139
129
ModelResponse : schemas.ModelResponse {
140
130
Metadata : map [string ]string {
141
- "system_fingerprint" : openAICompletion .SystemFingerprint ,
131
+ "system_fingerprint" : completion .SystemFingerprint ,
142
132
},
143
133
Message : schemas.ChatMessage {
144
- Role : openAICompletion . Choices [ 0 ] .Message .Role ,
145
- Content : openAICompletion . Choices [ 0 ] .Message .Content ,
134
+ Role : modelChoice .Message .Role ,
135
+ Content : modelChoice .Message .Content ,
146
136
},
147
137
TokenUsage : schemas.TokenUsage {
148
- PromptTokens : openAICompletion .Usage .PromptTokens ,
149
- ResponseTokens : openAICompletion .Usage .CompletionTokens ,
150
- TotalTokens : openAICompletion .Usage .TotalTokens ,
138
+ PromptTokens : completion .Usage .PromptTokens ,
139
+ ResponseTokens : completion .Usage .CompletionTokens ,
140
+ TotalTokens : completion .Usage .TotalTokens ,
151
141
},
152
142
},
153
143
}
0 commit comments