diff --git a/.changeset/grumpy-parks-stand.md b/.changeset/grumpy-parks-stand.md new file mode 100644 index 000000000..ab4252471 --- /dev/null +++ b/.changeset/grumpy-parks-stand.md @@ -0,0 +1,8 @@ +--- +'@livekit/agents-plugin-google': patch +'@livekit/agents-plugin-openai': patch +'@livekit/agents-plugins-test': patch +'@livekit/agents': patch +--- + +bump openai to 6.x diff --git a/agents/package.json b/agents/package.json index 5c5300501..dfcee3555 100644 --- a/agents/package.json +++ b/agents/package.json @@ -56,13 +56,13 @@ "heap-js": "^2.6.0", "json-schema": "^0.4.0", "livekit-server-sdk": "^2.13.3", - "openai": "^4.91.1", + "openai": "^6.8.1", "pidusage": "^4.0.1", "pino": "^8.19.0", "pino-pretty": "^11.0.0", "sharp": "0.34.3", "uuid": "^11.1.0", - "ws": "^8.16.0", + "ws": "^8.18.0", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { diff --git a/agents/src/inference/llm.ts b/agents/src/inference/llm.ts index 17e9a0b71..01547a2d8 100644 --- a/agents/src/inference/llm.ts +++ b/agents/src/inference/llm.ts @@ -7,6 +7,7 @@ import { APIStatusError, APITimeoutError, DEFAULT_API_CONNECT_OPTIONS, + type Expand, toError, } from '../index.js'; import * as llm from '../llm/index.js'; @@ -34,9 +35,10 @@ export type KimiModels = 'moonshotai/kimi-k2-instruct'; export type DeepSeekModels = 'deepseek-ai/deepseek-v3'; -type ChatCompletionPredictionContentParam = OpenAI.Chat.Completions.ChatCompletionPredictionContent; -type WebSearchOptions = OpenAI.Chat.Completions.ChatCompletionCreateParams.WebSearchOptions; -type ToolChoice = OpenAI.Chat.Completions.ChatCompletionCreateParams['tool_choice']; +type ChatCompletionPredictionContentParam = + Expand; +type WebSearchOptions = Expand; +type ToolChoice = Expand; type Verbosity = 'low' | 'medium' | 'high'; export interface ChatCompletionOptions extends Record { @@ -180,9 +182,13 @@ export class LLM extends llm.LLM { modelOptions.parallel_tool_calls = parallelToolCalls; } - toolChoice = toolChoice !== undefined ? toolChoice : this.opts.modelOptions.tool_choice; + toolChoice = + toolChoice !== undefined + ? toolChoice + : (this.opts.modelOptions.tool_choice as llm.ToolChoice | undefined); + if (toolChoice) { - modelOptions.tool_choice = toolChoice; + modelOptions.tool_choice = toolChoice as ToolChoice; } // TODO(AJS-270): Add response_format support here @@ -238,7 +244,7 @@ export class LLMStream extends llm.LLMStream { toolCtx?: llm.ToolContext; gatewayOptions?: GatewayOptions; connOptions: APIConnectOptions; - modelOptions: Record; + modelOptions: Record; providerFmt?: llm.ProviderFormat; }, ) { @@ -270,7 +276,7 @@ export class LLMStream extends llm.LLMStream { description: func.description, parameters: llm.toJsonSchema( func.parameters, - ) as unknown as OpenAI.Chat.Completions.ChatCompletionTool['function']['parameters'], + ) as unknown as OpenAI.Chat.Completions.ChatCompletionFunctionTool['function']['parameters'], }, })) : undefined; @@ -345,7 +351,7 @@ export class LLMStream extends llm.LLMStream { options: { statusCode: error.status, body: error.error, - requestId: error.request_id, + requestId: error.requestID, retryable, }, }); @@ -387,10 +393,10 @@ export class LLMStream extends llm.LLMStream { * * Choice(delta=ChoiceDelta(content=None, function_call=None, refusal=None, role='assistant', tool_calls=None), finish_reason=None, index=0, logprobs=None) * [ChoiceDeltaToolCall(index=0, id='call_LaVeHWUHpef9K1sd5UO8TtLg', function=ChoiceDeltaToolCallFunction(arguments='', name='get_weather'), type='function')] - * [ChoiceDeltaToolCall(index=0, id=None, function=ChoiceDeltaToolCallFunction(arguments='{"location": "P', name=None), type=None)] - * [ChoiceDeltaToolCall(index=0, id=None, function=ChoiceDeltaToolCallFunction(arguments='aris}', name=None), type=None)] + * [ChoiceDeltaToolCall(index=0, id=None, function=ChoiceDeltaToolCallFunction(arguments='\{"location": "P', name=None), type=None)] + * [ChoiceDeltaToolCall(index=0, id=None, function=ChoiceDeltaToolCallFunction(arguments='aris\}', name=None), type=None)] * [ChoiceDeltaToolCall(index=1, id='call_ThU4OmMdQXnnVmpXGOCknXIB', function=ChoiceDeltaToolCallFunction(arguments='', name='get_weather'), type='function')] - * [ChoiceDeltaToolCall(index=1, id=None, function=ChoiceDeltaToolCallFunction(arguments='{"location": "T', name=None), type=None)] + * [ChoiceDeltaToolCall(index=1, id=None, function=ChoiceDeltaToolCallFunction(arguments='\{"location": "T', name=None), type=None)] * [ChoiceDeltaToolCall(index=1, id=None, function=ChoiceDeltaToolCallFunction(arguments='okyo', name=None), type=None)] * Choice(delta=ChoiceDelta(content=None, function_call=None, refusal=None, role=None, tool_calls=None), finish_reason='tool_calls', index=0, logprobs=None) */ diff --git a/agents/src/llm/llm.ts b/agents/src/llm/llm.ts index beb147892..aa1ac4374 100644 --- a/agents/src/llm/llm.ts +++ b/agents/src/llm/llm.ts @@ -78,7 +78,7 @@ export abstract class LLM extends (EventEmitter as new () => TypedEmitter; + extraKwargs?: Record; }): LLMStream; /** diff --git a/agents/src/llm/provider_format/google.ts b/agents/src/llm/provider_format/google.ts index 82f925fec..abe595c39 100644 --- a/agents/src/llm/provider_format/google.ts +++ b/agents/src/llm/provider_format/google.ts @@ -12,11 +12,11 @@ export interface GoogleFormatData { export async function toChatCtx( chatCtx: ChatContext, injectDummyUserMessage: boolean = true, -): Promise<[Record[], GoogleFormatData]> { - const turns: Record[] = []; +): Promise<[Record[], GoogleFormatData]> { + const turns: Record[] = []; const systemMessages: string[] = []; let currentRole: string | null = null; - let parts: Record[] = []; + let parts: Record[] = []; // Flatten all grouped tool calls to get individual messages const itemGroups = groupToolCalls(chatCtx); @@ -104,7 +104,7 @@ export async function toChatCtx( ]; } -async function toImagePart(image: ImageContent): Promise> { +async function toImagePart(image: ImageContent): Promise> { const cacheKey = 'serialized_image'; if (!image._cache[cacheKey]) { image._cache[cacheKey] = await serializeImage(image); diff --git a/agents/src/utils.ts b/agents/src/utils.ts index 209c3fb39..ae2be3139 100644 --- a/agents/src/utils.ts +++ b/agents/src/utils.ts @@ -15,6 +15,23 @@ import { TransformStream, type TransformStreamDefaultController } from 'node:str import { v4 as uuidv4 } from 'uuid'; import { log } from './log.js'; +/** + * Recursively expands all nested properties of a type, + * resolving aliases so as to inspect the real shape in IDE. + */ +// eslint-disable-next-line @typescript-eslint/ban-types +export type Expand = T extends Function + ? T + : T extends object + ? T extends Array + ? Array> + : T extends Map + ? Map, Expand> + : T extends Set + ? Set> + : { [K in keyof T]: Expand } + : T; + /** Union of a single and a list of {@link AudioFrame}s */ export type AudioBuffer = AudioFrame[] | AudioFrame; diff --git a/examples/package.json b/examples/package.json index 4f418f145..153c76fb7 100644 --- a/examples/package.json +++ b/examples/package.json @@ -37,7 +37,7 @@ "@livekit/noise-cancellation-node": "^0.1.9", "@livekit/rtc-node": "^0.13.11", "livekit-server-sdk": "^2.13.3", - "ws": "^8.16.0" + "ws": "^8.18.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" diff --git a/plugins/google/src/llm.test.ts b/plugins/google/src/llm.test.ts index 46790928d..140ae2449 100644 --- a/plugins/google/src/llm.test.ts +++ b/plugins/google/src/llm.test.ts @@ -5,11 +5,12 @@ import { llm } from '@livekit/agents-plugins-test'; import { describe } from 'vitest'; import { LLM } from './llm.js'; -describe.skip('Google', async () => { +describe('Google', async () => { await llm( new LLM({ model: 'gemini-2.5-flash', temperature: 0, }), + true, ); }); diff --git a/plugins/openai/package.json b/plugins/openai/package.json index befd8b917..b2b1f2c98 100644 --- a/plugins/openai/package.json +++ b/plugins/openai/package.json @@ -45,8 +45,8 @@ }, "dependencies": { "@livekit/mutex": "^1.1.1", - "openai": "^4.91.1", - "ws": "^8.16.0" + "openai": "^6.8.1", + "ws": "^8.18.0" }, "peerDependencies": { "@livekit/agents": "workspace:*", diff --git a/plugins/openai/src/llm.test.ts b/plugins/openai/src/llm.test.ts index 13cbf7753..700ba2820 100644 --- a/plugins/openai/src/llm.test.ts +++ b/plugins/openai/src/llm.test.ts @@ -10,5 +10,6 @@ describe('OpenAI', async () => { new LLM({ temperature: 0, }), + false, ); }); diff --git a/plugins/openai/src/llm.ts b/plugins/openai/src/llm.ts index 9557780bc..99a5c4932 100644 --- a/plugins/openai/src/llm.ts +++ b/plugins/openai/src/llm.ts @@ -445,9 +445,9 @@ export class LLM extends llm.LLM { connOptions?: APIConnectOptions; parallelToolCalls?: boolean; toolChoice?: llm.ToolChoice; - extraKwargs?: Record; + extraKwargs?: Record; }): LLMStream { - const extras: Record = { ...extraKwargs }; // eslint-disable-line @typescript-eslint/no-explicit-any + const extras: Record = { ...extraKwargs }; if (this.#opts.metadata) { extras.metadata = this.#opts.metadata; diff --git a/plugins/test/src/llm.ts b/plugins/test/src/llm.ts index 7ad31e0f9..22720ef19 100644 --- a/plugins/test/src/llm.ts +++ b/plugins/test/src/llm.ts @@ -3,7 +3,7 @@ // SPDX-License-Identifier: Apache-2.0 import { initializeLogger, llm as llmlib } from '@livekit/agents'; import { describe, expect, it } from 'vitest'; -import { z } from 'zod'; +import { z } from 'zod/v4'; const toolCtx: llmlib.ToolContext = { getWeather: llmlib.tool({ @@ -58,8 +58,9 @@ const toolCtx: llmlib.ToolContext = { }), }; -export const llm = async (llm: llmlib.LLM) => { +export const llm = async (llm: llmlib.LLM, isGoogle: boolean) => { initializeLogger({ pretty: false }); + describe('LLM', async () => { it('should properly respond to chat', async () => { const chatCtx = new llmlib.ChatContext(); @@ -120,7 +121,7 @@ export const llm = async (llm: llmlib.LLM) => { expect(calls.length).toStrictEqual(1); expect(JSON.parse(calls[0]!.args).unit).toStrictEqual('celsius'); }); - it('should handle optional arguments', async () => { + it.skipIf(isGoogle)('should handle optional arguments', async () => { const calls = await requestFncCall( llm, 'Use a tool call to update the user info to name Theo. Leave email and address blank.', @@ -129,8 +130,8 @@ export const llm = async (llm: llmlib.LLM) => { expect(calls.length).toStrictEqual(1); expect(JSON.parse(calls[0]!.args).name).toStrictEqual('Theo'); - expect(JSON.parse(calls[0]!.args).email).toBeNull(); - expect(JSON.parse(calls[0]!.args).address).toBeNull(); + expect(JSON.parse(calls[0]!.args).email).toBeUndefined(); + expect(JSON.parse(calls[0]!.args).address).toBeUndefined(); }); }); }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5cd45837a..0ff5271e8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -122,8 +122,8 @@ importers: specifier: ^2.13.3 version: 2.13.3 openai: - specifier: ^4.91.1 - version: 4.91.1(ws@8.17.0)(zod@3.25.76) + specifier: ^6.8.1 + version: 6.8.1(ws@8.18.3)(zod@3.25.76) pidusage: specifier: ^4.0.1 version: 4.0.1 @@ -140,8 +140,8 @@ importers: specifier: ^11.1.0 version: 11.1.0 ws: - specifier: ^8.16.0 - version: 8.17.0 + specifier: ^8.18.0 + version: 8.18.3 zod-to-json-schema: specifier: ^3.24.6 version: 3.24.6(zod@3.25.76) @@ -222,7 +222,7 @@ importers: specifier: ^2.13.3 version: 2.13.3 ws: - specifier: ^8.16.0 + specifier: ^8.18.0 version: 8.18.3 devDependencies: '@types/node': @@ -495,11 +495,11 @@ importers: specifier: ^1.1.1 version: 1.1.1 openai: - specifier: ^4.91.1 - version: 4.91.1(ws@8.17.0)(zod@3.25.76) + specifier: ^6.8.1 + version: 6.8.1(ws@8.18.3)(zod@4.1.12) ws: - specifier: ^8.16.0 - version: 8.17.0 + specifier: ^8.18.0 + version: 8.18.3 devDependencies: '@livekit/agents': specifier: workspace:* @@ -1950,15 +1950,9 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/node-fetch@2.6.11': - resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} - '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@18.19.64': - resolution: {integrity: sha512-955mDqvO2vFf/oL7V3WiUtiz+BugyX8uVbaT2H8oj3+8dRyH2FLiNdowe7eNqRM7IOIZvzDH76EoAT+gwm6aIQ==} - '@types/node@22.15.30': resolution: {integrity: sha512-6Q7lr06bEHdlfplU6YRbgG1SFBdlsfNC4/lX+SkhiTs0cpJkOElmWls8PxDFv4yY/xKb8Y6SO0OmSX4wgqTZbA==} @@ -2110,10 +2104,6 @@ packages: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} - agentkeepalive@4.5.0: - resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} - engines: {node: '>= 8.0.0'} - ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -2214,9 +2204,6 @@ packages: async@0.2.10: resolution: {integrity: sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==} - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - atomic-sleep@1.0.0: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} @@ -2363,10 +2350,6 @@ packages: colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - commander@12.0.0: resolution: {integrity: sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==} engines: {node: '>=18'} @@ -2472,10 +2455,6 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} @@ -2893,17 +2872,6 @@ packages: resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} engines: {node: '>=14'} - form-data-encoder@1.7.2: - resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==} - - form-data@4.0.1: - resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} - engines: {node: '>= 6'} - - formdata-node@4.4.1: - resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} - engines: {node: '>= 12.20'} - fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} @@ -3080,9 +3048,6 @@ packages: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} @@ -3483,14 +3448,6 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - mimic-fn@4.0.0: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} @@ -3553,11 +3510,6 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} - deprecated: Use your platform's native DOMException instead - node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -3630,12 +3582,12 @@ packages: onnxruntime-web@1.22.0-dev.20250409-89f8206ba4: resolution: {integrity: sha512-0uS76OPgH0hWCPrFKlL8kYVV7ckM7t/36HfbgoFw6Nd0CZVVbQC4PkrR8mBX8LtNUFZO25IQBqV2Hx2ho3FlbQ==} - openai@4.91.1: - resolution: {integrity: sha512-DbjrR0hIMQFbxz8+3qBsfPJnh3+I/skPgoSlT7f9eiZuhGBUissPQULNgx6gHNkLoZ3uS0uYS6eXPUdtg4nHzw==} + openai@6.8.1: + resolution: {integrity: sha512-ACifslrVgf+maMz9vqwMP4+v9qvx5Yzssydizks8n+YUJ6YwUoxj51sKRQ8HYMfR6wgKLSIlaI108ZwCk+8yig==} hasBin: true peerDependencies: ws: ^8.18.0 - zod: ^3.23.8 + zod: ^3.25 || ^4.0 peerDependenciesMeta: ws: optional: true @@ -4408,9 +4360,6 @@ packages: unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} @@ -4534,10 +4483,6 @@ packages: resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} engines: {node: '>=10.13.0'} - web-streams-polyfill@4.0.0-beta.3: - resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} - engines: {node: '>= 14'} - webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -5740,17 +5685,8 @@ snapshots: '@types/json5@0.0.29': {} - '@types/node-fetch@2.6.11': - dependencies: - '@types/node': 22.15.30 - form-data: 4.0.1 - '@types/node@12.20.55': {} - '@types/node@18.19.64': - dependencies: - undici-types: 5.26.5 - '@types/node@22.15.30': dependencies: undici-types: 6.21.0 @@ -5956,10 +5892,6 @@ snapshots: agent-base@7.1.4: {} - agentkeepalive@4.5.0: - dependencies: - humanize-ms: 1.2.1 - ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -6087,8 +6019,6 @@ snapshots: async@0.2.10: {} - asynckit@0.4.0: {} - atomic-sleep@1.0.0: {} available-typed-arrays@1.0.7: @@ -6238,10 +6168,6 @@ snapshots: colorette@2.0.20: {} - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - commander@12.0.0: {} commander@4.1.1: {} @@ -6327,8 +6253,6 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 - delayed-stream@1.0.0: {} - dequal@2.0.3: {} detect-indent@6.1.0: {} @@ -6935,19 +6859,6 @@ snapshots: cross-spawn: 7.0.3 signal-exit: 4.1.0 - form-data-encoder@1.7.2: {} - - form-data@4.0.1: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - - formdata-node@4.4.1: - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 4.0.0-beta.3 - fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 @@ -7156,10 +7067,6 @@ snapshots: human-signals@5.0.0: {} - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 @@ -7529,12 +7436,6 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 - mime-db@1.52.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - mimic-fn@4.0.0: {} minimatch@3.0.8: @@ -7589,8 +7490,6 @@ snapshots: natural-compare@1.4.0: {} - node-domexception@1.0.0: {} - node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 @@ -7672,20 +7571,15 @@ snapshots: platform: 1.3.6 protobufjs: 7.4.0 - openai@4.91.1(ws@8.17.0)(zod@3.25.76): - dependencies: - '@types/node': 18.19.64 - '@types/node-fetch': 2.6.11 - abort-controller: 3.0.0 - agentkeepalive: 4.5.0 - form-data-encoder: 1.7.2 - formdata-node: 4.4.1 - node-fetch: 2.7.0 + openai@6.8.1(ws@8.18.3)(zod@3.25.76): optionalDependencies: - ws: 8.17.0 + ws: 8.18.3 zod: 3.25.76 - transitivePeerDependencies: - - encoding + + openai@6.8.1(ws@8.18.3)(zod@4.1.12): + optionalDependencies: + ws: 8.18.3 + zod: 4.1.12 optionator@0.9.4: dependencies: @@ -8548,8 +8442,6 @@ snapshots: has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 - undici-types@5.26.5: {} - undici-types@6.21.0: {} universalify@0.1.2: {} @@ -8686,8 +8578,6 @@ snapshots: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 - web-streams-polyfill@4.0.0-beta.3: {} - webidl-conversions@3.0.1: {} webidl-conversions@4.0.2: {}