Skip to content

Commit d82c949

Browse files
committed
Upgrade openai to 4.91.1 and fix typing issues
1 parent 9074900 commit d82c949

File tree

14 files changed

+128
-22
lines changed

14 files changed

+128
-22
lines changed

.changeset/eleven-terms-clap.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'token.js': minor
3+
---
4+
5+
Upgrade the openai client library to 4.91.1

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
"cohere-ai": "7.10.6",
4141
"mime-types": "^2.1.35",
4242
"nanoid": "^5.0.7",
43-
"openai": "4.52.2"
43+
"openai": "4.91.1"
4444
},
4545
"devDependencies": {
4646
"@babel/eslint-parser": "^7.18.2",

pnpm-lock.yaml

Lines changed: 12 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/handlers/ai21.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {
1010
} from '../userTypes/index.js'
1111
import { BaseHandler } from './base.js'
1212
import { InputError } from './types.js'
13-
import { getTimestamp } from './utils.js'
13+
import { convertMessageContentToString, getTimestamp } from './utils.js'
1414

1515
type AI21ChatCompletionParams = {
1616
model: string
@@ -73,7 +73,7 @@ const convertMessages = (
7373
if (i === 0 && message.role === 'system') {
7474
output.push({
7575
role: 'system',
76-
content: message.content,
76+
content: convertMessageContentToString(message.content),
7777
})
7878
} else if (
7979
message.role === 'user' ||
@@ -268,6 +268,10 @@ export class AI21Handler extends BaseHandler<AI21Model> {
268268
const convertedChoices = data.choices.map((choice) => {
269269
return {
270270
...choice,
271+
message: {
272+
...choice.message,
273+
refusal: null,
274+
},
271275
logprobs: null,
272276
}
273277
})

src/handlers/anthropic.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import { BaseHandler } from './base.js'
2828
import { InputError, InvariantError } from './types.js'
2929
import {
3030
consoleWarn,
31+
convertMessageContentToString,
3132
fetchThenParseImage,
3233
getTimestamp,
3334
isEmptyObject,
@@ -247,12 +248,14 @@ const toChatCompletionChoiceMessage = (
247248
const messageContent = content.every(isToolUseBlock) ? null : ''
248249
return {
249250
role,
251+
refusal: null,
250252
content: messageContent,
251253
tool_calls: toolCalls,
252254
}
253255
} else {
254256
return {
255257
role,
258+
refusal: null,
256259
content: textBlocks.map((textBlock) => textBlock.text).join('\n'),
257260
tool_calls: toolCalls,
258261
}
@@ -361,7 +364,7 @@ export const convertMessages = async (
361364
// unchanged.
362365
let systemMessage: string | undefined
363366
if (clonedMessages.length > 0 && clonedMessages[0].role === 'system') {
364-
systemMessage = clonedMessages[0].content
367+
systemMessage = convertMessageContentToString(clonedMessages[0].content)
365368
clonedMessages.shift()
366369
}
367370

@@ -448,7 +451,7 @@ export const convertMessages = async (
448451
return {
449452
type: 'text',
450453
text,
451-
}
454+
} as TextBlockParam
452455
} else {
453456
const parsedImage = await fetchThenParseImage(e.image_url.url)
454457
return {
@@ -458,7 +461,7 @@ export const convertMessages = async (
458461
media_type: parsedImage.mimeType,
459462
type: 'base64',
460463
},
461-
}
464+
} as ImageBlockParam
462465
}
463466
})
464467
)

src/handlers/bedrock.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import { BaseHandler } from './base.js'
2929
import { InputError, InvariantError, MIMEType } from './types.js'
3030
import {
3131
consoleWarn,
32+
convertMessageContentToString,
3233
fetchThenParseImage,
3334
getTimestamp,
3435
normalizeTemperature,
@@ -84,6 +85,7 @@ const toChatCompletionChoiceMessage = (
8485
): CompletionResponse['choices'][0]['message'] => {
8586
if (output?.message?.content === undefined) {
8687
return {
88+
refusal: null,
8789
content: '',
8890
role: 'assistant',
8991
}
@@ -146,13 +148,15 @@ const toChatCompletionChoiceMessage = (
146148
: ''
147149
return {
148150
role,
151+
refusal: null,
149152
content: messageContent,
150153
tool_calls: toolCalls,
151154
}
152155
} else {
153156
const content = textBlocks.map((textBlock) => textBlock.text).join('\n')
154157
return {
155158
role,
159+
refusal: null,
156160
content,
157161
tool_calls: toolCalls,
158162
}
@@ -187,7 +191,10 @@ export const convertMessages = async (
187191
const systemMessages: Array<SystemContentBlock> = []
188192
if (supportsSystemMessages(model)) {
189193
while (clonedMessages.length > 0 && clonedMessages[0].role === 'system') {
190-
systemMessages.push({ text: clonedMessages[0].content })
194+
const messageContent = convertMessageContentToString(
195+
clonedMessages[0].content
196+
)
197+
systemMessages.push({ text: messageContent })
191198
clonedMessages.shift()
192199
}
193200
}
@@ -247,7 +254,7 @@ export const convertMessages = async (
247254
toolUseId: message.tool_call_id,
248255
content: [
249256
{
250-
text: message.content,
257+
text: convertMessageContentToString(message.content),
251258
},
252259
],
253260
},

src/handlers/cohere.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,11 @@ import {
2828
} from '../userTypes/index.js'
2929
import { BaseHandler } from './base.js'
3030
import { InputError, InvariantError, MessageRole } from './types.js'
31-
import { consoleWarn, getTimestamp } from './utils.js'
31+
import {
32+
consoleWarn,
33+
convertMessageContentToString,
34+
getTimestamp,
35+
} from './utils.js'
3236

3337
type CohereMessageRole = 'CHATBOT' | 'SYSTEM' | 'USER' | 'TOOL'
3438

@@ -41,6 +45,8 @@ const convertRole = (role: MessageRole): CohereMessageRole => {
4145
return 'TOOL'
4246
} else if (role === 'user') {
4347
return 'USER'
48+
} else if (role === 'developer') {
49+
return 'SYSTEM'
4450
} else {
4551
throw new InputError(`Unknown role: ${role}`)
4652
}
@@ -259,12 +265,13 @@ const toToolResult = (
259265
)
260266
}
261267

268+
const tollCallContentStr = convertMessageContentToString(toolMessage.content)
262269
const toolResult: ToolResult = {
263270
call: {
264271
name: toolCall.function.name,
265272
parameters: JSON.parse(toolCall.function.arguments),
266273
},
267-
outputs: [JSON.parse(toolMessage.content)],
274+
outputs: [JSON.parse(tollCallContentStr)],
268275
}
269276
return toolResult
270277
}
@@ -318,9 +325,10 @@ export const convertMessages = (
318325
})
319326
}
320327
} else if (message.role === 'assistant') {
328+
const messageContentStr = convertMessageContentToString(message.content)
321329
chatHistory.push({
322330
role: convertRole(message.role),
323-
message: message.content ?? '',
331+
message: messageContentStr,
324332
toolCalls: message.tool_calls?.map((toolCall) => {
325333
return {
326334
name: toolCall.function.name,
@@ -567,6 +575,7 @@ export class CohereHandler extends BaseHandler<CohereModel> {
567575
logprobs: null,
568576
message: {
569577
role: 'assistant',
578+
refusal: null, // openai requires this field, fill in if Cohere ever supports
570579
content: response.text,
571580
tool_calls: toolCalls,
572581
},

src/handlers/gemini.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,12 @@ import {
3131
} from '../userTypes/index.js'
3232
import { BaseHandler } from './base.js'
3333
import { InputError } from './types.js'
34-
import { consoleWarn, fetchThenParseImage, getTimestamp } from './utils.js'
34+
import {
35+
consoleWarn,
36+
convertMessageContentToString,
37+
fetchThenParseImage,
38+
getTimestamp,
39+
} from './utils.js'
3540

3641
// Google's `GenerateContentCandidate.content` field should be optional, but it's a required field
3742
// in Google's types. This field can be undefined if a content filter is triggered when the user
@@ -164,7 +169,9 @@ export const convertMessageToContent = async (
164169
{
165170
functionResponse: {
166171
name: message.tool_call_id,
167-
response: JSON.parse(message.content),
172+
response: JSON.parse(
173+
convertMessageContentToString(message.content)
174+
),
168175
},
169176
},
170177
],
@@ -304,6 +311,7 @@ export const convertResponseMessage = (
304311
content: candidate.content?.parts.map((part) => part.text).join('') ?? null,
305312
role: 'assistant',
306313
tool_calls: convertToolCalls(candidate),
314+
refusal: null,
307315
}
308316
}
309317

src/handlers/mistral.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import {
2626
} from '../userTypes/index.js'
2727
import { BaseHandler } from './base.js'
2828
import { InputError } from './types.js'
29+
import { convertMessageContentToString } from './utils.js'
2930

3031
export const findLinkedToolCallName = (
3132
messages: ChatCompletionMessage[],
@@ -46,6 +47,7 @@ export const convertMessages = (
4647
messages: (ChatCompletionMessageParam | ChatCompletionMessage)[]
4748
): Array<Message | ChatCompletionResponseChoice['message']> => {
4849
return messages.map((message) => {
50+
const messageContent = convertMessageContentToString(message.content)
4951
if (message.role === 'tool') {
5052
const name = findLinkedToolCallName(
5153
messages as ChatCompletionMessage[],
@@ -55,20 +57,20 @@ export const convertMessages = (
5557
return {
5658
name,
5759
role: 'tool',
58-
content: message.content,
60+
content: messageContent,
5961
tool_call_id: message.tool_call_id,
6062
}
6163
}
6264

6365
if (message.role === 'system') {
6466
return {
6567
role: message.role,
66-
content: message.content ?? '',
68+
content: messageContent,
6769
}
6870
} else if (message.role === 'assistant') {
6971
return {
7072
role: message.role,
71-
content: message.content ?? '',
73+
content: messageContent,
7274
tool_calls: message.tool_calls ?? null,
7375
}
7476
} else if (message.role === 'user') {
@@ -239,6 +241,7 @@ const toCompletionResponse = (
239241
index: choice.index,
240242
message: {
241243
role: 'assistant',
244+
refusal: null,
242245
content: choice.message.content,
243246
tool_calls: convertToolCalls(choice.message.tool_calls),
244247
},

src/handlers/types.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
1-
export type MessageRole = 'system' | 'user' | 'assistant' | 'tool' | 'function'
1+
export type MessageRole =
2+
| 'system'
3+
| 'user'
4+
| 'assistant'
5+
| 'tool'
6+
| 'function'
7+
| 'developer'
28
export type MIMEType = 'image/jpeg' | 'image/png' | 'image/gif' | 'image/webp'
39

410
export class InputError extends Error {

0 commit comments

Comments
 (0)