Skip to content

Commit c17b56a

Browse files
committed
Upgrade openai to 4.91.1 and fix typing issues
Fix typescript issues reset pnpm-lock to match more with main
1 parent 9074900 commit c17b56a

File tree

15 files changed

+180
-72
lines changed

15 files changed

+180
-72
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: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ import {
99
ConverseStreamCommandOutput,
1010
ImageFormat,
1111
SystemContentBlock,
12+
Tool,
1213
ToolChoice,
14+
ToolConfiguration,
15+
ToolSpecification,
1316
} from '@aws-sdk/client-bedrock-runtime'
1417
import { ChatCompletionMessageToolCall } from 'openai/resources/index'
1518

@@ -29,6 +32,7 @@ import { BaseHandler } from './base.js'
2932
import { InputError, InvariantError, MIMEType } from './types.js'
3033
import {
3134
consoleWarn,
35+
convertMessageContentToString,
3236
fetchThenParseImage,
3337
getTimestamp,
3438
normalizeTemperature,
@@ -84,6 +88,7 @@ const toChatCompletionChoiceMessage = (
8488
): CompletionResponse['choices'][0]['message'] => {
8589
if (output?.message?.content === undefined) {
8690
return {
91+
refusal: null,
8792
content: '',
8893
role: 'assistant',
8994
}
@@ -146,13 +151,15 @@ const toChatCompletionChoiceMessage = (
146151
: ''
147152
return {
148153
role,
154+
refusal: null,
149155
content: messageContent,
150156
tool_calls: toolCalls,
151157
}
152158
} else {
153159
const content = textBlocks.map((textBlock) => textBlock.text).join('\n')
154160
return {
155161
role,
162+
refusal: null,
156163
content,
157164
tool_calls: toolCalls,
158165
}
@@ -187,7 +194,10 @@ export const convertMessages = async (
187194
const systemMessages: Array<SystemContentBlock> = []
188195
if (supportsSystemMessages(model)) {
189196
while (clonedMessages.length > 0 && clonedMessages[0].role === 'system') {
190-
systemMessages.push({ text: clonedMessages[0].content })
197+
const messageContent = convertMessageContentToString(
198+
clonedMessages[0].content
199+
)
200+
systemMessages.push({ text: messageContent })
191201
clonedMessages.shift()
192202
}
193203
}
@@ -247,7 +257,7 @@ export const convertMessages = async (
247257
toolUseId: message.tool_call_id,
248258
content: [
249259
{
250-
text: message.content,
260+
text: convertMessageContentToString(message.content),
251261
},
252262
],
253263
},
@@ -288,7 +298,7 @@ export const convertMessages = async (
288298
const text = makeTextContent(message.role, e.text)
289299
return {
290300
text,
291-
}
301+
} as ContentBlock.TextMember
292302
} else {
293303
const parsedImage = await fetchThenParseImage(e.image_url.url)
294304
return {
@@ -298,7 +308,7 @@ export const convertMessages = async (
298308
bytes: Buffer.from(parsedImage.content, 'base64'),
299309
},
300310
},
301-
}
311+
} as ContentBlock.ImageMember
302312
}
303313
})
304314
)
@@ -354,27 +364,24 @@ export const convertToolParams = (
354364
return undefined
355365
}
356366

357-
const convertedTools =
367+
const convertedTools: (Tool | undefined)[] =
358368
tools.length > 0
359369
? tools.map((tool) => {
360-
const inputSchema = tool.function.parameters
361-
? {
370+
const inputSchema: ToolSpecification['inputSchema'] | undefined = tool
371+
.function.parameters
372+
? ({
362373
// Bedrock and OpenAI's function parameter types are incompatible even though they both
363374
// adhere to the JSON schema, so we set the type to `any` to prevent a TypeScript error.
364375
json: tool.function.parameters as any,
365-
// TypeScript throws a type error if we don't define this field:
366-
$unknown: undefined,
367-
}
376+
} satisfies ToolSpecification['inputSchema'])
368377
: undefined
369378
return {
370-
// TypeScript throws a type error if we don't define this field:
371-
$unknown: undefined,
372379
toolSpec: {
373380
name: tool.function.name,
374381
description: tool.function.description,
375382
inputSchema,
376383
},
377-
}
384+
} satisfies Tool
378385
})
379386
: undefined
380387

@@ -387,7 +394,10 @@ export const convertToolParams = (
387394
convertedToolChoice = { tool: { name: toolChoice.function.name } }
388395
}
389396

390-
return { toolChoice: convertedToolChoice, tools: convertedTools }
397+
return {
398+
toolChoice: convertedToolChoice,
399+
tools: convertedTools,
400+
} satisfies ToolConfiguration
391401
}
392402

393403
const convertStopReason = (

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
},

0 commit comments

Comments
 (0)