diff --git a/CHANGELOG.md b/CHANGELOG.md index d5ad45bc44f..c083eb98c0e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ Docs: https://docs.openclaw.ai - Agents/tools: add optional per-call `timeoutMs` support for image, video, music, and TTS generation tools so agents can extend provider request timeouts only when a specific generation needs it. - Agents/subagents: add optional forked context for native `sessions_spawn` runs so agents can let a child inherit the requester transcript when needed, while keeping clean isolated sessions as the default; includes prompt guidance, context-engine hook metadata, docs, and QA coverage. - Codex harness: add structured debug logging for embedded harness selection decisions so `/status` stays simple while gateway logs explain auto-selection and Pi fallback reasons. (#70760) Thanks @100yenadmin. -- Providers/OpenAI: add forward-compatible `gpt-5.5` and `gpt-5.5-pro` support for OpenAI API keys, OpenAI Codex OAuth, and the Codex CLI default model. +- Dependencies/Pi: update bundled Pi packages to `0.70.0`, use Pi's upstream `gpt-5.5` catalog metadata for OpenAI and OpenAI Codex, and keep only local `gpt-5.5-pro` forward-compat handling. - Providers/OpenAI: add image generation and reference-image editing through Codex OAuth, so `openai/gpt-image-2` works without an `OPENAI_API_KEY`. Fixes #70703. - Image generation: let agents request provider-supported quality and output format hints, and pass OpenAI-specific background, moderation, compression, and user hints through the `image_generate` tool. (#70503) Thanks @ottodeng. diff --git a/extensions/amazon-bedrock-mantle/package.json b/extensions/amazon-bedrock-mantle/package.json index 0fb373386a8..b4959887ef5 100644 --- a/extensions/amazon-bedrock-mantle/package.json +++ b/extensions/amazon-bedrock-mantle/package.json @@ -7,7 +7,7 @@ "dependencies": { "@anthropic-ai/sdk": "0.90.0", "@aws/bedrock-token-generator": "^1.1.0", - "@mariozechner/pi-ai": "0.69.0" + "@mariozechner/pi-ai": "0.70.0" }, "devDependencies": { "@openclaw/plugin-sdk": "workspace:*" diff --git a/extensions/amazon-bedrock/index.test.ts b/extensions/amazon-bedrock/index.test.ts index 532b2757e36..7e0e924023f 100644 --- a/extensions/amazon-bedrock/index.test.ts +++ b/extensions/amazon-bedrock/index.test.ts @@ -5,7 +5,9 @@ import type { OpenClawConfig } from "../../src/config/config.js"; import { buildPluginApi } from "../../src/plugins/api-builder.js"; import type { PluginRuntime } from "../../src/plugins/runtime/types.js"; import { registerSingleProviderPlugin } from "../../test/helpers/plugins/plugin-registration.js"; +import { resetBedrockDiscoveryCacheForTest } from "./discovery.js"; import amazonBedrockPlugin from "./index.js"; +import { resetBedrockAppProfileCacheEligibilityForTest } from "./register.sync.runtime.js"; type BedrockClientResult = | { @@ -15,14 +17,44 @@ type BedrockClientResult = } | Error; -const inferenceProfileResults: BedrockClientResult[] = []; +const foundationModelResults: BedrockClientResult[] = []; +const inferenceProfileListResults: BedrockClientResult[] = []; +const inferenceProfileGetResults: BedrockClientResult[] = []; const bedrockClientConfigs: Array> = []; -const sendGetInferenceProfile = vi.fn(async () => { - const next = inferenceProfileResults.shift(); +const sendBedrockCommand = vi.fn(async (command: unknown) => { + const commandName = command?.constructor?.name; + const queue = + commandName === "ListFoundationModelsCommand" + ? foundationModelResults + : commandName === "ListInferenceProfilesCommand" + ? inferenceProfileListResults + : inferenceProfileGetResults; + const next = queue.shift(); if (next instanceof Error) { throw next; } - return next ?? { models: [] }; + if (next) { + return next; + } + if (commandName === "ListFoundationModelsCommand") { + return { + modelSummaries: [ + { + modelId: NON_ANTHROPIC_MODEL, + modelName: "Nova Micro", + providerName: "Amazon", + inputModalities: ["TEXT"], + outputModalities: ["TEXT"], + responseStreamingSupported: true, + modelLifecycle: { status: "ACTIVE" }, + }, + ], + }; + } + if (commandName === "ListInferenceProfilesCommand") { + return { inferenceProfileSummaries: [] }; + } + return { models: [] }; }); vi.mock("@aws-sdk/client-bedrock", () => { @@ -43,7 +75,7 @@ vi.mock("@aws-sdk/client-bedrock", () => { bedrockClientConfigs.push(config); } - send = sendGetInferenceProfile; + send = sendBedrockCommand; } return { @@ -156,17 +188,6 @@ function callWrappedStream( return result; } -async function runCatalog( - provider: RegisteredProviderPlugin, - config: OpenClawConfig, - env: NodeJS.ProcessEnv = {} as NodeJS.ProcessEnv, -) { - return provider.catalog?.run({ - config, - env, - } as never); -} - function runtimePluginConfig(config?: Record): OpenClawConfig { return { plugins: { @@ -183,9 +204,13 @@ function runtimePluginConfig(config?: Record): OpenClawConfig { describe("amazon-bedrock provider plugin", () => { beforeEach(() => { - inferenceProfileResults.length = 0; + foundationModelResults.length = 0; + inferenceProfileListResults.length = 0; + inferenceProfileGetResults.length = 0; bedrockClientConfigs.length = 0; - sendGetInferenceProfile.mockClear(); + sendBedrockCommand.mockClear(); + resetBedrockDiscoveryCacheForTest(); + resetBedrockAppProfileCacheEligibilityForTest(); }); it("marks Claude 4.6 Bedrock models as adaptive by default", async () => { @@ -439,51 +464,6 @@ describe("amazon-bedrock provider plugin", () => { }); }); - describe("discovery config", () => { - it("uses live plugin config to re-enable discovery after startup disable", async () => { - inferenceProfileResults.push( - { - modelSummaries: [ - { - modelId: NON_ANTHROPIC_MODEL, - modelName: "Nova Micro", - providerName: "Amazon", - inputModalities: ["TEXT"], - outputModalities: ["TEXT"], - responseStreamingSupported: true, - modelLifecycle: { status: "ACTIVE" }, - }, - ], - }, - { - inferenceProfileSummaries: [], - }, - ); - const provider = await registerWithConfig({ - discovery: { - enabled: false, - }, - }); - - const catalog = await runCatalog( - provider, - runtimePluginConfig({ - discovery: { - enabled: true, - region: "us-east-1", - }, - }), - ); - - expect(catalog).toMatchObject({ - provider: { - baseUrl: "https://bedrock-runtime.us-east-1.amazonaws.com", - api: "bedrock-converse-stream", - }, - }); - }); - }); - describe("application inference profile cache point injection", () => { /** * Invoke wrapStreamFn with a payload containing system/messages, then @@ -721,7 +701,7 @@ describe("amazon-bedrock provider plugin", () => { it("injects cache points for opaque application inference profile ARNs after profile lookup", async () => { const modelId = "arn:aws:bedrock:us-east-1:123456789012:application-inference-profile/z27qyso459da"; - inferenceProfileResults.push({ + inferenceProfileGetResults.push({ models: [ { modelArn: @@ -745,14 +725,14 @@ describe("amazon-bedrock provider plugin", () => { const system = payload.system as Array>; expect(system[1]).toEqual({ cachePoint: { type: "default" } }); - expect(sendGetInferenceProfile).toHaveBeenCalledTimes(1); + expect(sendBedrockCommand).toHaveBeenCalledTimes(1); expect(bedrockClientConfigs).toEqual([{ region: "us-east-1" }]); }); it("does not inject cache points when any resolved profile target is not cacheable", async () => { const modelId = "arn:aws:bedrock:us-east-1:123456789012:application-inference-profile/z27qyso459db"; - inferenceProfileResults.push({ + inferenceProfileGetResults.push({ models: [ { modelArn: @@ -785,7 +765,7 @@ describe("amazon-bedrock provider plugin", () => { it("retries opaque profile lookup after a transient failure instead of caching the fallback", async () => { const modelId = "arn:aws:bedrock:us-east-1:123456789012:application-inference-profile/z27qyso459dc"; - inferenceProfileResults.push(new Error("throttled"), { + inferenceProfileGetResults.push(new Error("throttled"), { models: [ { modelArn: @@ -823,7 +803,7 @@ describe("amazon-bedrock provider plugin", () => { { text: "You are helpful." }, { cachePoint: { type: "default" } }, ]); - expect(sendGetInferenceProfile).toHaveBeenCalledTimes(2); + expect(sendBedrockCommand).toHaveBeenCalledTimes(2); }); }); }); diff --git a/extensions/amazon-bedrock/register.sync.runtime.ts b/extensions/amazon-bedrock/register.sync.runtime.ts index ae9c1f2c8f3..962afdc947e 100644 --- a/extensions/amazon-bedrock/register.sync.runtime.ts +++ b/extensions/amazon-bedrock/register.sync.runtime.ts @@ -157,6 +157,10 @@ function resolvedModelSupportsCaching(modelArn: string): boolean { */ const appProfileCacheEligibleCache = new Map(); +export function resetBedrockAppProfileCacheEligibilityForTest(): void { + appProfileCacheEligibleCache.clear(); +} + async function resolveAppProfileCacheEligible( modelId: string, fallbackRegion: string | undefined, diff --git a/extensions/anthropic/package.json b/extensions/anthropic/package.json index 9ef7fcff69f..55fae899b25 100644 --- a/extensions/anthropic/package.json +++ b/extensions/anthropic/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw Anthropic provider plugin", "type": "module", "dependencies": { - "@mariozechner/pi-ai": "0.69.0" + "@mariozechner/pi-ai": "0.70.0" }, "devDependencies": { "@openclaw/plugin-sdk": "workspace:*" diff --git a/extensions/codex/package.json b/extensions/codex/package.json index 932f60ce4c1..a24c63f75f4 100644 --- a/extensions/codex/package.json +++ b/extensions/codex/package.json @@ -4,7 +4,7 @@ "description": "OpenClaw Codex harness and model provider plugin", "type": "module", "dependencies": { - "@mariozechner/pi-coding-agent": "0.69.0", + "@mariozechner/pi-coding-agent": "0.70.0", "ws": "^8.20.0", "zod": "^4.3.6" }, diff --git a/extensions/fireworks/package.json b/extensions/fireworks/package.json index 338f41b712b..354a4bcb116 100644 --- a/extensions/fireworks/package.json +++ b/extensions/fireworks/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw Fireworks provider plugin", "type": "module", "dependencies": { - "@mariozechner/pi-ai": "0.69.0" + "@mariozechner/pi-ai": "0.70.0" }, "devDependencies": { "@openclaw/plugin-sdk": "workspace:*" diff --git a/extensions/github-copilot/package.json b/extensions/github-copilot/package.json index 830c0cd2664..d688ddd0924 100644 --- a/extensions/github-copilot/package.json +++ b/extensions/github-copilot/package.json @@ -6,7 +6,7 @@ "type": "module", "dependencies": { "@clack/prompts": "^1.2.0", - "@mariozechner/pi-ai": "0.69.0" + "@mariozechner/pi-ai": "0.70.0" }, "devDependencies": { "@openclaw/plugin-sdk": "workspace:*" diff --git a/extensions/google/package.json b/extensions/google/package.json index ad8c5688285..992d243b670 100644 --- a/extensions/google/package.json +++ b/extensions/google/package.json @@ -6,7 +6,7 @@ "type": "module", "dependencies": { "@google/genai": "^1.50.1", - "@mariozechner/pi-ai": "0.69.0" + "@mariozechner/pi-ai": "0.70.0" }, "devDependencies": { "@openclaw/plugin-sdk": "workspace:*" diff --git a/extensions/kimi-coding/package.json b/extensions/kimi-coding/package.json index 3efe9bd8d5e..873e0502611 100644 --- a/extensions/kimi-coding/package.json +++ b/extensions/kimi-coding/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw Kimi provider plugin", "type": "module", "dependencies": { - "@mariozechner/pi-ai": "0.69.0" + "@mariozechner/pi-ai": "0.70.0" }, "devDependencies": { "@openclaw/plugin-sdk": "workspace:*" diff --git a/extensions/lmstudio/package.json b/extensions/lmstudio/package.json index 2b1dded8c5a..93faaf4c4aa 100644 --- a/extensions/lmstudio/package.json +++ b/extensions/lmstudio/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw LM Studio provider plugin", "type": "module", "dependencies": { - "@mariozechner/pi-ai": "0.69.0" + "@mariozechner/pi-ai": "0.70.0" }, "openclaw": { "extensions": [ diff --git a/extensions/ollama/package.json b/extensions/ollama/package.json index 2a4b25f7b75..11e21600e72 100644 --- a/extensions/ollama/package.json +++ b/extensions/ollama/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw Ollama provider plugin", "type": "module", "dependencies": { - "@mariozechner/pi-ai": "0.69.0", + "@mariozechner/pi-ai": "0.70.0", "typebox": "1.1.28" }, "devDependencies": { diff --git a/extensions/openai/openai-codex-provider.test.ts b/extensions/openai/openai-codex-provider.test.ts index 90ab4ef6dc1..212f5cb6e48 100644 --- a/extensions/openai/openai-codex-provider.test.ts +++ b/extensions/openai/openai-codex-provider.test.ts @@ -329,13 +329,19 @@ describe("openai codex provider", () => { }); }); - it("resolves gpt-5.5 and gpt-5.5-pro with launch pricing and codex-sized runtime cap", () => { + it("uses Pi metadata for gpt-5.5 and local launch metadata for gpt-5.5-pro", () => { const provider = buildOpenAICodexProviderPlugin(); const model = provider.resolveDynamicModel?.({ provider: "openai-codex", modelId: "gpt-5.5", - modelRegistry: createSingleModelRegistry(createCodexTemplate({ id: "gpt-5.4" })) as never, + modelRegistry: createSingleModelRegistry( + createCodexTemplate({ + id: "gpt-5.5", + cost: { input: 5, output: 30, cacheRead: 0.5, cacheWrite: 0 }, + contextWindow: 400_000, + }), + ) as never, }); const pro = provider.resolveDynamicModel?.({ provider: "openai-codex", @@ -347,10 +353,9 @@ describe("openai codex provider", () => { id: "gpt-5.5", api: "openai-codex-responses", baseUrl: "https://chatgpt.com/backend-api", - contextWindow: 1_000_000, - contextTokens: 272_000, + contextWindow: 400_000, maxTokens: 128_000, - cost: { input: 5, output: 30, cacheRead: 0, cacheWrite: 0 }, + cost: { input: 5, output: 30, cacheRead: 0.5, cacheWrite: 0 }, }); expect(pro).toMatchObject({ id: "gpt-5.5-pro", @@ -432,7 +437,7 @@ describe("openai codex provider", () => { expect(model).not.toHaveProperty("contextTokens"); }); - it("augments catalog with gpt-5.5 and gpt-5.4 native metadata", () => { + it("augments catalog with gpt-5.5-pro and gpt-5.4 native metadata", () => { const provider = buildOpenAICodexProviderPlugin(); const entries = provider.augmentModelCatalog?.({ @@ -449,12 +454,9 @@ describe("openai codex provider", () => { ], } as never); - expect(entries).toContainEqual( + expect(entries).not.toContainEqual( expect.objectContaining({ id: "gpt-5.5", - contextWindow: 1_000_000, - contextTokens: 272_000, - cost: { input: 5, output: 30, cacheRead: 0, cacheWrite: 0 }, }), ); expect(entries).toContainEqual( diff --git a/extensions/openai/openai-codex-provider.ts b/extensions/openai/openai-codex-provider.ts index 8be2ee3d2cf..424578ccd98 100644 --- a/extensions/openai/openai-codex-provider.ts +++ b/extensions/openai/openai-codex-provider.ts @@ -50,18 +50,12 @@ const OPENAI_CODEX_GPT_54_MODEL_ID = "gpt-5.4"; const OPENAI_CODEX_GPT_54_LEGACY_MODEL_ID = "gpt-5.4-codex"; const OPENAI_CODEX_GPT_54_PRO_MODEL_ID = "gpt-5.4-pro"; const OPENAI_CODEX_GPT_54_MINI_MODEL_ID = "gpt-5.4-mini"; -const OPENAI_CODEX_GPT_55_NATIVE_CONTEXT_TOKENS = 1_000_000; -const OPENAI_CODEX_GPT_55_DEFAULT_CONTEXT_TOKENS = 272_000; +const OPENAI_CODEX_GPT_55_PRO_NATIVE_CONTEXT_TOKENS = 1_000_000; +const OPENAI_CODEX_GPT_55_PRO_DEFAULT_CONTEXT_TOKENS = 272_000; const OPENAI_CODEX_GPT_54_NATIVE_CONTEXT_TOKENS = 1_050_000; const OPENAI_CODEX_GPT_54_DEFAULT_CONTEXT_TOKENS = 272_000; const OPENAI_CODEX_GPT_54_MINI_CONTEXT_TOKENS = 272_000; const OPENAI_CODEX_GPT_54_MAX_TOKENS = 128_000; -const OPENAI_CODEX_GPT_55_COST = { - input: 5, - output: 30, - cacheRead: 0, - cacheWrite: 0, -} as const; const OPENAI_CODEX_GPT_55_PRO_COST = { input: 30, output: 180, @@ -92,7 +86,7 @@ const OPENAI_CODEX_GPT_54_CATALOG_SYNTH_TEMPLATE_MODEL_IDS = [ ...OPENAI_CODEX_GPT_54_TEMPLATE_MODEL_IDS, OPENAI_CODEX_GPT_54_MODEL_ID, ] as const; -const OPENAI_CODEX_GPT_55_TEMPLATE_MODEL_IDS = [ +const OPENAI_CODEX_GPT_55_PRO_TEMPLATE_MODEL_IDS = [ OPENAI_CODEX_GPT_54_MODEL_ID, OPENAI_CODEX_GPT_54_PRO_MODEL_ID, ...OPENAI_CODEX_GPT_54_TEMPLATE_MODEL_IDS, @@ -187,21 +181,20 @@ function resolveCodexForwardCompatModel(ctx: ProviderResolveDynamicModelContext) const trimmedModelId = ctx.modelId.trim(); const lower = normalizeLowercaseStringOrEmpty(trimmedModelId); + if (lower === OPENAI_CODEX_GPT_55_MODEL_ID) { + const model = ctx.modelRegistry.find(PROVIDER_ID, trimmedModelId) as + | ProviderRuntimeModel + | undefined; + return model; + } + let templateIds: readonly string[]; let patch: Parameters[0]["patch"]; - if (lower === OPENAI_CODEX_GPT_55_MODEL_ID) { - templateIds = OPENAI_CODEX_GPT_55_TEMPLATE_MODEL_IDS; + if (lower === OPENAI_CODEX_GPT_55_PRO_MODEL_ID) { + templateIds = OPENAI_CODEX_GPT_55_PRO_TEMPLATE_MODEL_IDS; patch = { - contextWindow: OPENAI_CODEX_GPT_55_NATIVE_CONTEXT_TOKENS, - contextTokens: OPENAI_CODEX_GPT_55_DEFAULT_CONTEXT_TOKENS, - maxTokens: OPENAI_CODEX_GPT_54_MAX_TOKENS, - cost: OPENAI_CODEX_GPT_55_COST, - }; - } else if (lower === OPENAI_CODEX_GPT_55_PRO_MODEL_ID) { - templateIds = OPENAI_CODEX_GPT_55_TEMPLATE_MODEL_IDS; - patch = { - contextWindow: OPENAI_CODEX_GPT_55_NATIVE_CONTEXT_TOKENS, - contextTokens: OPENAI_CODEX_GPT_55_DEFAULT_CONTEXT_TOKENS, + contextWindow: OPENAI_CODEX_GPT_55_PRO_NATIVE_CONTEXT_TOKENS, + contextTokens: OPENAI_CODEX_GPT_55_PRO_DEFAULT_CONTEXT_TOKENS, maxTokens: OPENAI_CODEX_GPT_54_MAX_TOKENS, cost: OPENAI_CODEX_GPT_55_PRO_COST, }; @@ -517,10 +510,10 @@ export function buildOpenAICodexProviderPlugin(): ProviderPlugin { providerId: PROVIDER_ID, templateIds: OPENAI_CODEX_GPT_54_CATALOG_SYNTH_TEMPLATE_MODEL_IDS, }); - const gpt55Template = findCatalogTemplate({ + const gpt55ProTemplate = findCatalogTemplate({ entries: ctx.entries, providerId: PROVIDER_ID, - templateIds: OPENAI_CODEX_GPT_55_TEMPLATE_MODEL_IDS, + templateIds: OPENAI_CODEX_GPT_55_PRO_TEMPLATE_MODEL_IDS, }); const gpt54MiniTemplate = findCatalogTemplate({ entries: ctx.entries, @@ -528,20 +521,12 @@ export function buildOpenAICodexProviderPlugin(): ProviderPlugin { templateIds: OPENAI_CODEX_GPT_54_MINI_TEMPLATE_MODEL_IDS, }); return [ - buildOpenAISyntheticCatalogEntry(gpt55Template, { - id: OPENAI_CODEX_GPT_55_MODEL_ID, - reasoning: true, - input: ["text", "image"], - contextWindow: OPENAI_CODEX_GPT_55_NATIVE_CONTEXT_TOKENS, - contextTokens: OPENAI_CODEX_GPT_55_DEFAULT_CONTEXT_TOKENS, - cost: OPENAI_CODEX_GPT_55_COST, - }), - buildOpenAISyntheticCatalogEntry(gpt55Template, { + buildOpenAISyntheticCatalogEntry(gpt55ProTemplate, { id: OPENAI_CODEX_GPT_55_PRO_MODEL_ID, reasoning: true, input: ["text", "image"], - contextWindow: OPENAI_CODEX_GPT_55_NATIVE_CONTEXT_TOKENS, - contextTokens: OPENAI_CODEX_GPT_55_DEFAULT_CONTEXT_TOKENS, + contextWindow: OPENAI_CODEX_GPT_55_PRO_NATIVE_CONTEXT_TOKENS, + contextTokens: OPENAI_CODEX_GPT_55_PRO_DEFAULT_CONTEXT_TOKENS, cost: OPENAI_CODEX_GPT_55_PRO_COST, }), buildOpenAISyntheticCatalogEntry(gpt54Template, { diff --git a/extensions/openai/openai-provider.test.ts b/extensions/openai/openai-provider.test.ts index 869c7048a21..ec8d9fdee79 100644 --- a/extensions/openai/openai-provider.test.ts +++ b/extensions/openai/openai-provider.test.ts @@ -229,7 +229,7 @@ describe("buildOpenAIProvider", () => { }); }); - it("resolves gpt-5.5 and gpt-5.5-pro with launch metadata", () => { + it("leaves gpt-5.5 to Pi and resolves gpt-5.5-pro locally", () => { const provider = buildOpenAIProvider(); const model = provider.resolveDynamicModel?.({ @@ -275,15 +275,7 @@ describe("buildOpenAIProvider", () => { } as never, }); - expect(model).toMatchObject({ - provider: "openai", - id: "gpt-5.5", - api: "openai-responses", - baseUrl: "https://api.openai.com/v1", - contextWindow: 1_000_000, - maxTokens: 128_000, - cost: { input: 5, output: 30, cacheRead: 0, cacheWrite: 0 }, - }); + expect(model).toBeUndefined(); expect(pro).toMatchObject({ provider: "openai", id: "gpt-5.5-pro", @@ -295,7 +287,7 @@ describe("buildOpenAIProvider", () => { }); }); - it("surfaces gpt-5.5 in xhigh and augmented catalog metadata", () => { + it("surfaces gpt-5.5 in xhigh without synthetic catalog metadata", () => { const provider = buildOpenAIProvider(); expect( @@ -312,14 +304,10 @@ describe("buildOpenAIProvider", () => { entries: [{ provider: "openai", id: "gpt-5.4", name: "GPT-5.4" }], } as never); - expect(entries).toContainEqual( + expect(entries).not.toContainEqual( expect.objectContaining({ provider: "openai", id: "gpt-5.5", - name: "gpt-5.5", - reasoning: true, - input: ["text", "image"], - contextWindow: 1_000_000, }), ); }); diff --git a/extensions/openai/openai-provider.ts b/extensions/openai/openai-provider.ts index 773c3241423..2db1b79fa82 100644 --- a/extensions/openai/openai-provider.ts +++ b/extensions/openai/openai-provider.ts @@ -28,14 +28,12 @@ const OPENAI_GPT_54_MODEL_ID = "gpt-5.4"; const OPENAI_GPT_54_PRO_MODEL_ID = "gpt-5.4-pro"; const OPENAI_GPT_54_MINI_MODEL_ID = "gpt-5.4-mini"; const OPENAI_GPT_54_NANO_MODEL_ID = "gpt-5.4-nano"; -const OPENAI_GPT_55_CONTEXT_TOKENS = 1_000_000; const OPENAI_GPT_55_PRO_CONTEXT_TOKENS = 1_000_000; const OPENAI_GPT_54_CONTEXT_TOKENS = 1_050_000; const OPENAI_GPT_54_PRO_CONTEXT_TOKENS = 1_050_000; const OPENAI_GPT_54_MINI_CONTEXT_TOKENS = 400_000; const OPENAI_GPT_54_NANO_CONTEXT_TOKENS = 400_000; const OPENAI_GPT_54_MAX_TOKENS = 128_000; -const OPENAI_GPT_55_COST = { input: 5, output: 30, cacheRead: 0, cacheWrite: 0 } as const; const OPENAI_GPT_55_PRO_COST = { input: 30, output: 180, cacheRead: 0, cacheWrite: 0 } as const; const OPENAI_GPT_54_COST = { input: 2.5, output: 15, cacheRead: 0.25, cacheWrite: 0 } as const; const OPENAI_GPT_54_PRO_COST = { input: 30, output: 180, cacheRead: 0, cacheWrite: 0 } as const; @@ -51,7 +49,6 @@ const OPENAI_GPT_54_NANO_COST = { cacheRead: 0.02, cacheWrite: 0, } as const; -const OPENAI_GPT_55_TEMPLATE_MODEL_IDS = [OPENAI_GPT_54_MODEL_ID, "gpt-5.2"] as const; const OPENAI_GPT_55_PRO_TEMPLATE_MODEL_IDS = [ OPENAI_GPT_54_PRO_MODEL_ID, OPENAI_GPT_54_MODEL_ID, @@ -63,21 +60,21 @@ const OPENAI_GPT_54_PRO_TEMPLATE_MODEL_IDS = ["gpt-5.2-pro", "gpt-5.2"] as const const OPENAI_GPT_54_MINI_TEMPLATE_MODEL_IDS = ["gpt-5-mini"] as const; const OPENAI_GPT_54_NANO_TEMPLATE_MODEL_IDS = ["gpt-5-nano", "gpt-5-mini"] as const; const OPENAI_XHIGH_MODEL_IDS = [ - "gpt-5.5", - "gpt-5.5-pro", - "gpt-5.4", - "gpt-5.4-pro", - "gpt-5.4-mini", - "gpt-5.4-nano", + OPENAI_GPT_55_MODEL_ID, + OPENAI_GPT_55_PRO_MODEL_ID, + OPENAI_GPT_54_MODEL_ID, + OPENAI_GPT_54_PRO_MODEL_ID, + OPENAI_GPT_54_MINI_MODEL_ID, + OPENAI_GPT_54_NANO_MODEL_ID, "gpt-5.2", ] as const; const OPENAI_MODERN_MODEL_IDS = [ - "gpt-5.5", - "gpt-5.5-pro", - "gpt-5.4", - "gpt-5.4-pro", - "gpt-5.4-mini", - "gpt-5.4-nano", + OPENAI_GPT_55_MODEL_ID, + OPENAI_GPT_55_PRO_MODEL_ID, + OPENAI_GPT_54_MODEL_ID, + OPENAI_GPT_54_PRO_MODEL_ID, + OPENAI_GPT_54_MINI_MODEL_ID, + OPENAI_GPT_54_NANO_MODEL_ID, "gpt-5.2", ] as const; const OPENAI_DIRECT_SPARK_MODEL_ID = "gpt-5.3-codex-spark"; @@ -119,19 +116,7 @@ function resolveOpenAIGptForwardCompatModel(ctx: ProviderResolveDynamicModelCont const lower = normalizeLowercaseStringOrEmpty(trimmedModelId); let templateIds: readonly string[]; let patch: Partial; - if (lower === OPENAI_GPT_55_MODEL_ID) { - templateIds = OPENAI_GPT_55_TEMPLATE_MODEL_IDS; - patch = { - api: "openai-responses", - provider: PROVIDER_ID, - baseUrl: "https://api.openai.com/v1", - reasoning: true, - input: ["text", "image"], - cost: OPENAI_GPT_55_COST, - contextWindow: OPENAI_GPT_55_CONTEXT_TOKENS, - maxTokens: OPENAI_GPT_54_MAX_TOKENS, - }; - } else if (lower === OPENAI_GPT_55_PRO_MODEL_ID) { + if (lower === OPENAI_GPT_55_PRO_MODEL_ID) { templateIds = OPENAI_GPT_55_PRO_TEMPLATE_MODEL_IDS; patch = { api: "openai-responses", @@ -288,11 +273,6 @@ export function buildOpenAIProvider(): ProviderPlugin { }; }, augmentModelCatalog: (ctx) => { - const openAiGpt55Template = findCatalogTemplate({ - entries: ctx.entries, - providerId: PROVIDER_ID, - templateIds: OPENAI_GPT_55_TEMPLATE_MODEL_IDS, - }); const openAiGpt55ProTemplate = findCatalogTemplate({ entries: ctx.entries, providerId: PROVIDER_ID, @@ -319,12 +299,6 @@ export function buildOpenAIProvider(): ProviderPlugin { templateIds: OPENAI_GPT_54_NANO_TEMPLATE_MODEL_IDS, }); return [ - buildOpenAISyntheticCatalogEntry(openAiGpt55Template, { - id: OPENAI_GPT_55_MODEL_ID, - reasoning: true, - input: ["text", "image"], - contextWindow: OPENAI_GPT_55_CONTEXT_TOKENS, - }), buildOpenAISyntheticCatalogEntry(openAiGpt55ProTemplate, { id: OPENAI_GPT_55_PRO_MODEL_ID, reasoning: true, diff --git a/extensions/openai/package.json b/extensions/openai/package.json index 28787d39748..ef6d889839e 100644 --- a/extensions/openai/package.json +++ b/extensions/openai/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw OpenAI provider plugins", "type": "module", "dependencies": { - "@mariozechner/pi-ai": "0.69.0", + "@mariozechner/pi-ai": "0.70.0", "ws": "^8.20.0" }, "devDependencies": { diff --git a/extensions/xai/package.json b/extensions/xai/package.json index 2d4843cd694..96a7c8bce21 100644 --- a/extensions/xai/package.json +++ b/extensions/xai/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw xAI plugin", "type": "module", "dependencies": { - "@mariozechner/pi-ai": "0.69.0", + "@mariozechner/pi-ai": "0.70.0", "typebox": "1.1.28", "ws": "^8.20.0" }, diff --git a/package.json b/package.json index f77f197e974..04b50100133 100644 --- a/package.json +++ b/package.json @@ -1548,10 +1548,10 @@ "@clack/prompts": "^1.2.0", "@homebridge/ciao": "^1.3.6", "@lydell/node-pty": "1.2.0-beta.12", - "@mariozechner/pi-agent-core": "0.69.0", - "@mariozechner/pi-ai": "0.69.0", - "@mariozechner/pi-coding-agent": "0.69.0", - "@mariozechner/pi-tui": "0.69.0", + "@mariozechner/pi-agent-core": "0.70.0", + "@mariozechner/pi-ai": "0.70.0", + "@mariozechner/pi-coding-agent": "0.70.0", + "@mariozechner/pi-tui": "0.70.0", "@modelcontextprotocol/sdk": "1.29.0", "@mozilla/readability": "^0.6.0", "@vincentkoc/qrcode-tui": "0.2.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ca40ce5fea5..b593ea4df26 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -55,17 +55,17 @@ importers: specifier: 1.2.0-beta.12 version: 1.2.0-beta.12 '@mariozechner/pi-agent-core': - specifier: 0.69.0 - version: 0.69.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) + specifier: 0.70.0 + version: 0.70.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) '@mariozechner/pi-ai': - specifier: 0.69.0 - version: 0.69.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) + specifier: 0.70.0 + version: 0.70.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) '@mariozechner/pi-coding-agent': - specifier: 0.69.0 - version: 0.69.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) + specifier: 0.70.0 + version: 0.70.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) '@mariozechner/pi-tui': - specifier: 0.69.0 - version: 0.69.0 + specifier: 0.70.0 + version: 0.70.0 '@modelcontextprotocol/sdk': specifier: 1.29.0 version: 1.29.0(zod@4.3.6) @@ -280,8 +280,8 @@ importers: specifier: ^1.1.0 version: 1.1.0 '@mariozechner/pi-ai': - specifier: 0.69.0 - version: 0.69.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) + specifier: 0.70.0 + version: 0.70.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) devDependencies: '@openclaw/plugin-sdk': specifier: workspace:* @@ -290,8 +290,8 @@ importers: extensions/anthropic: dependencies: '@mariozechner/pi-ai': - specifier: 0.69.0 - version: 0.69.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) + specifier: 0.70.0 + version: 0.70.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) devDependencies: '@openclaw/plugin-sdk': specifier: workspace:* @@ -377,8 +377,8 @@ importers: extensions/codex: dependencies: '@mariozechner/pi-coding-agent': - specifier: 0.69.0 - version: 0.69.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) + specifier: 0.70.0 + version: 0.70.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) ws: specifier: ^8.20.0 version: 8.20.0 @@ -568,8 +568,8 @@ importers: extensions/fireworks: dependencies: '@mariozechner/pi-ai': - specifier: 0.69.0 - version: 0.69.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) + specifier: 0.70.0 + version: 0.70.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) devDependencies: '@openclaw/plugin-sdk': specifier: workspace:* @@ -581,8 +581,8 @@ importers: specifier: ^1.2.0 version: 1.2.0 '@mariozechner/pi-ai': - specifier: 0.69.0 - version: 0.69.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) + specifier: 0.70.0 + version: 0.70.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) devDependencies: '@openclaw/plugin-sdk': specifier: workspace:* @@ -594,8 +594,8 @@ importers: specifier: ^1.50.1 version: 1.50.1(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6)) '@mariozechner/pi-ai': - specifier: 0.69.0 - version: 0.69.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) + specifier: 0.70.0 + version: 0.70.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) devDependencies: '@openclaw/plugin-sdk': specifier: workspace:* @@ -659,8 +659,8 @@ importers: extensions/kimi-coding: dependencies: '@mariozechner/pi-ai': - specifier: 0.69.0 - version: 0.69.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) + specifier: 0.70.0 + version: 0.70.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) devDependencies: '@openclaw/plugin-sdk': specifier: workspace:* @@ -701,8 +701,8 @@ importers: extensions/lmstudio: dependencies: '@mariozechner/pi-ai': - specifier: 0.69.0 - version: 0.69.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) + specifier: 0.70.0 + version: 0.70.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) extensions/lobster: dependencies: @@ -928,8 +928,8 @@ importers: extensions/ollama: dependencies: '@mariozechner/pi-ai': - specifier: 0.69.0 - version: 0.69.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) + specifier: 0.70.0 + version: 0.70.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) typebox: specifier: 1.1.28 version: 1.1.28 @@ -947,8 +947,8 @@ importers: extensions/openai: dependencies: '@mariozechner/pi-ai': - specifier: 0.69.0 - version: 0.69.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) + specifier: 0.70.0 + version: 0.70.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) ws: specifier: ^8.20.0 version: 8.20.0 @@ -1354,8 +1354,8 @@ importers: extensions/xai: dependencies: '@mariozechner/pi-ai': - specifier: 0.69.0 - version: 0.69.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) + specifier: 0.70.0 + version: 0.70.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) typebox: specifier: 1.1.28 version: 1.1.28 @@ -1523,6 +1523,10 @@ packages: resolution: {integrity: sha512-CDI4njdtLEd3voxApQMI32IJN/HhpM3FtAh0quJ+aIWNmyDbW3cp2SwQ56Pnsrq1OV40Apw/O4yD822K4aK9HA==} engines: {node: '>=20.0.0'} + '@aws-sdk/client-bedrock-runtime@3.1034.0': + resolution: {integrity: sha512-49igCAONPtL0ZkWWIs/6gWAq3CjWRISbqtFi5ysDljAGaZXMnPigKMly1CuOGlw/zIPaWbIjk2bGhyLtz2AuXg==} + engines: {node: '>=20.0.0'} + '@aws-sdk/client-bedrock@3.1033.0': resolution: {integrity: sha512-UkYqTE8a+uxOvFw8TX62jlL76iy0IiUb3bewF3cu6sLUROZDaHSM/fM45IeFVViTcI9vmgJaSxznopOMQ3B2Mw==} engines: {node: '>=20.0.0'} @@ -1539,6 +1543,10 @@ packages: resolution: {integrity: sha512-oav5AOAz+1XkwUfp6SrEm42UPDpUP5D4jNYXkDwFR1VfWqYX62+jpytdfzURmJ9McSoJIQwi0OJlC4oCi6t0VQ==} engines: {node: '>=20.0.0'} + '@aws-sdk/core@3.974.3': + resolution: {integrity: sha512-W3aJJm2clu8OmsrwMOMnfof13O6LGnbknnZIQeSRbxjqKah2nVvkjbUBBZVhWrt08KC69H7WsINTdrxC/2SXQw==} + engines: {node: '>=20.0.0'} + '@aws-sdk/crc64-nvme@3.972.7': resolution: {integrity: sha512-QUagVVBbC8gODCF6e1aV0mE2TXWB9Opz4k8EJFdNrujUVQm5R4AjJa1mpOqzwOuROBzqJU9zawzig7M96L8Ejg==} engines: {node: '>=20.0.0'} @@ -1551,34 +1559,66 @@ packages: resolution: {integrity: sha512-87GdRJ2OR0qR4VkMjXN/SZi66DZsunW2qQCbtw9rKw3Y7JurFi6tQWYKOSLY/gOADrU6OxGqFmdw3hKzZqDZOQ==} engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-env@3.972.29': + resolution: {integrity: sha512-rf+AlUxgTeSzQ/4zoS0D+Bt7XvgpY48PnWG8Yg/N9fdMgyK2Jaqa+6tLZp4MYMIMHkGrfAxnbSeb2YLMGFMg6g==} + engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-http@3.972.30': resolution: {integrity: sha512-6quozmW2PKwBJTUQLb+lk1q8w5Pm45qaqhx4Tld9EIqYYQOVGj+MT0a8NRVS7QgWJj7rzGlB7rQu3KYBFHemJw==} engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-http@3.972.31': + resolution: {integrity: sha512-TR2/lQ3qKFj2EOrsiASzemsNEz2uzZ/SUBf48+U4Cr9a/FZlHfH/hwAeBJNBp1gMyJNxROJZhT3dn1cO+jnYfQ==} + engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-ini@3.972.32': resolution: {integrity: sha512-Nkr+UKtczZlocUjc6g96WzQadZSIZO/HVXPki4qbfaVOZYSbfLQKWKfADtJ0kGYsCvSYOZrO66tSc9dkboUt/w==} engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-ini@3.972.33': + resolution: {integrity: sha512-UwdbJbOrgnOxZbshaNZ4DzX35h5wQd33MNYTGzWhN3ORG9lG9KQbDX6l6tDJSAdaGTktJoZPSritmUoW1rYkRA==} + engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-login@3.972.32': resolution: {integrity: sha512-UxgwT1HmZz1QPXuBy5ZUPJNFXOSlhwdQL61eGhWRthF0xRrT02BCOVJ1p5Ejg5AXfnESTWoKPJ7v/sCkNUtB9g==} engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-login@3.972.33': + resolution: {integrity: sha512-WyZuPVoDM1HGNl41eVg8HSSXIB+FGkuuK63GhDbh4TMdfWU03AciWvF/QqOVWvJtWVYaLddANJ+aUklVr2ieuw==} + engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-node@3.972.33': resolution: {integrity: sha512-6pGQnEdSeRvBViTQh/FwaRKB38a3Th+W2mVxuvqAd2Z1Ayo3e6eJ5QqJoZwEMwR6xoxkl3wz3qAfiB1xRhMC+w==} engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-node@3.972.34': + resolution: {integrity: sha512-sPcisURibKU4x0PCWJkWF1KJYm49Cph9dCn/PAnG5FU0wq5Id3g2v7RuEWAtNlKv1Af4gUJYBVGOeNpSEEx41A==} + engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-process@3.972.28': resolution: {integrity: sha512-CRAlD8u6oNBhjnX/3ekVGocarD+lFmEn/qeDzytgIdmwrmwMJGFPqS9lGwEfhOTihZKrQ0xSp3z6paX+iXJJhA==} engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-process@3.972.29': + resolution: {integrity: sha512-DURisqWS3bUgiwMXTmzymVNGlcRW0FnbPZ3SZknhmxnCXm3n9idkTJ6T+Uir359KRKtJNFLRViskk8HsSVLi1w==} + engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-sso@3.972.32': resolution: {integrity: sha512-whhmQghRYOt9mJxFyVMhX7eB8n0oA25OCvqoR7dzFAZjmioCkf7WVB22Bc6llM5cFpBXFX7s4Jv+xVq32VPGWg==} engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-sso@3.972.33': + resolution: {integrity: sha512-9y9obU4IQWru9f+NiiscUeyCe5ZmQav4FKEb1qfUNrik/C3BzBGUnHQWyPEyXjOX9cb+vx1TYx0qZBtinKdzTA==} + engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-web-identity@3.972.32': resolution: {integrity: sha512-Z0Y0LDaqyQDznlmr9gv6n4+eWKKWNgmi9j5L6RENr6wyOCguhO8FRPmqDbVLSw0DPdMqICKnA3PurJiS8bD6Cw==} engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-web-identity@3.972.33': + resolution: {integrity: sha512-RazhlN0YAkna2T2p2v4YuuRlVBVRNo8V0SL+9JePTWDndEUAeOBAjYeQfAMbtDyCh120+zA0Op6V0jS4dw2+iw==} + engines: {node: '>=20.0.0'} + '@aws-sdk/credential-providers@3.1033.0': resolution: {integrity: sha512-yxwiYB3z8ilVLmtLEwrEL/MIISYDLRyhAJmXoziNIxqKLoCnZed4A2AhlCcPMvFfA8B56oNJ64nGoepMaEagzw==} engines: {node: '>=20.0.0'} @@ -1623,6 +1663,10 @@ packages: resolution: {integrity: sha512-5hS08Fp0Rm+59uGCmkWhZmveXiA7OUV7Wa+IARejdzf9JTZ1qAVeIOE9JoBpsLPvUgEjmsGNHBuFbtGmYyqiqQ==} engines: {node: '>=20.0.0'} + '@aws-sdk/middleware-sdk-s3@3.972.32': + resolution: {integrity: sha512-dc2O2x0V5pGJhmdQYQveUIFtMZsur7GrGuSgoKM4oQJuEcfvwnJ3sj+ip6WnxR5l6TrX5zkl4KgcgswOy3wAzQ==} + engines: {node: '>=20.0.0'} + '@aws-sdk/middleware-ssec@3.972.10': resolution: {integrity: sha512-Gli9A0u8EVVb+5bFDGS/QbSVg28w/wpEidg1ggVcSj65BDTdGR6punsOcVjqdiu1i42WHWo51MCvARPIIz9juw==} engines: {node: '>=20.0.0'} @@ -1631,6 +1675,10 @@ packages: resolution: {integrity: sha512-HQ0x9DDKqLZOGhDiL2eicYXXkYT5dogE4mw0lAfHCpJ6t7MM0PNIsJl2TZzWKU9SpBzOMXHRa7K6ZLKUJu1y0w==} engines: {node: '>=20.0.0'} + '@aws-sdk/middleware-user-agent@3.972.33': + resolution: {integrity: sha512-mqtT3Fo7xanWMk2SbAcKLGGI/q1GHWNrExBj7cnWP2W2mkTMheXB4ntJvwPZ1UxPrQobrsv2dWFXmaOJeSOiDg==} + engines: {node: '>=20.0.0'} + '@aws-sdk/middleware-websocket@3.972.16': resolution: {integrity: sha512-86+S9oCyRVGzoMRpQhxkArp7kD2K75GPmaNevd9B6EyNhWoNvnCZZ3WbgN4j7ZT+jvtvBCGZvI2XHsWZJ+BRIg==} engines: {node: '>= 14.0.0'} @@ -1639,10 +1687,18 @@ packages: resolution: {integrity: sha512-4bI5GHjUiY5R8N6PtchpG6tW2Dl8I2IcZNg3JwqwxHRXjfvQlPoo4VMknG4qkd5W0t3Y20rQ6C7pSR561YG5JQ==} engines: {node: '>=20.0.0'} + '@aws-sdk/nested-clients@3.997.1': + resolution: {integrity: sha512-Afc9hc2WZs3X4Jb8dnxyuYiZsLoWRO51roTCRf497gPnAKN2WRdXANu1vaVCTzwnDMOYFXb/cYv4ZSjxqAqcKA==} + engines: {node: '>=20.0.0'} + '@aws-sdk/region-config-resolver@3.972.12': resolution: {integrity: sha512-QQI43Mxd53nBij0pm8HXC+t4IOC6gnhhZfzxE0OATQyO6QfPV4e+aTIRRuAJKA6Nig/cR8eLwPryqYTX9ZrjAQ==} engines: {node: '>=20.0.0'} + '@aws-sdk/region-config-resolver@3.972.13': + resolution: {integrity: sha512-CvJ2ZIjK/jVD/lbOpowBVElJyC1YxLTIJ13yM0AEo0t2v7swOzGjSA6lJGH+DwZXQhcjUjoYwc8bVYCX5MDr1A==} + engines: {node: '>=20.0.0'} + '@aws-sdk/s3-request-presigner@3.1033.0': resolution: {integrity: sha512-8PVtuRzL9k59TgceC2KXA4SbG5V+nKzwO0YVtpp3ylf3Ios1DB7+psoMFS/P6zmsCHMT+S3ChrIUDXv4QmRawQ==} engines: {node: '>=20.0.0'} @@ -1651,10 +1707,18 @@ packages: resolution: {integrity: sha512-7Sy8+GhfwUi06NQNLplxuJuXMKJURDsNQfK8yTW6E9wN2J1B+8S5dWZG7vg3InvPPhaXqkcYTr8pzeE+dLjMbQ==} engines: {node: '>=20.0.0'} + '@aws-sdk/signature-v4-multi-region@3.996.20': + resolution: {integrity: sha512-MEj6DhEcaO8RgVtFCJ+xpCQnZC3Iesr09avdY75qkMQfckQULu447IegK7Rs1MCGerVBfKnJQ4q+pQq9hI5lng==} + engines: {node: '>=20.0.0'} + '@aws-sdk/token-providers@3.1033.0': resolution: {integrity: sha512-/TsXhqjyRAFb0xVgmbFAha3cJfZdWjnyn6ohJ3AB4E3peLgxNcmKfYr45hruHymyJAydiHoXC3N1a8qgl41cog==} engines: {node: '>=20.0.0'} + '@aws-sdk/token-providers@3.1034.0': + resolution: {integrity: sha512-8E+KGcD4ET0H9FXJ2/ZWbfFnQNYEkTZZYJxAs1lkdJlve1AYuqaydInIFfvNgoz5GbYtzbK8/ugsSMu5wPm6kA==} + engines: {node: '>=20.0.0'} + '@aws-sdk/types@3.973.8': resolution: {integrity: sha512-gjlAdtHMbtR9X5iIhVUvbVcy55KnznpC6bkDUWW9z915bi0ckdUr5cjf16Kp6xq0bP5HBD2xzgbL9F9Quv5vUw==} engines: {node: '>=20.0.0'} @@ -1667,6 +1731,10 @@ packages: resolution: {integrity: sha512-ty4LQxN1QC+YhUP28NfEgZDEGXkyqOQy+BDriBozqHsrYO4JMgiPhfizqOGF7P+euBTZ5Ez6SKlLAMCLo8tzmw==} engines: {node: '>=20.0.0'} + '@aws-sdk/util-endpoints@3.996.8': + resolution: {integrity: sha512-oOZHcRDihk5iEe5V25NVWg45b3qEA8OpHWVdU/XQh8Zj4heVPAJqWvMphQnU7LkufmUo10EpvFPZuQMiFLJK3g==} + engines: {node: '>=20.0.0'} + '@aws-sdk/util-format-url@3.972.10': resolution: {integrity: sha512-DEKiHNJVtNxdyTeQspzY+15Po/kHm6sF0Cs4HV9Q2+lplB63+DrvdeiSoOSdWEWAoO2RcY1veoXVDz2tWxWCgQ==} engines: {node: '>=20.0.0'} @@ -1687,6 +1755,15 @@ packages: aws-crt: optional: true + '@aws-sdk/util-user-agent-node@3.973.19': + resolution: {integrity: sha512-ZAfHjpzdbrzkAftC139JoYGfXzDh5HY+AxRzw8pGJ8cULsf+l721sKAMK8mV5NvRETaW/BwghSwQhGgoNgrxMw==} + engines: {node: '>=20.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + '@aws-sdk/xml-builder@3.972.18': resolution: {integrity: sha512-BMDNVG1ETXRhl1tnisQiYBef3RShJ1kfZA7x7afivTFMLirfHNTb6U71K569HNXhSXbQZsweHvSDZ6euBw8hPA==} engines: {node: '>=20.0.0'} @@ -2662,22 +2739,22 @@ packages: resolution: {integrity: sha512-faGUlTcXka5l7rv0lP3K3vGW/ejRuOS24RR2aSFWREUQqzjgdsuWNo/IiPqL3kWRGt6Ahl2+qcDAwtdeWeuGUw==} hasBin: true - '@mariozechner/pi-agent-core@0.69.0': - resolution: {integrity: sha512-dYZjee7QEIwVVbDGCGriiLjDT34IdMlXMjMp4drVKcLEuVc+BztyODwu3w4ZORVvwaySGGlF9UALjJKUVoXiug==} + '@mariozechner/pi-agent-core@0.70.0': + resolution: {integrity: sha512-ZwfM5QPvSwza/apZhPIXjrI/blJBFqbVpK30ma4zNwH8VAyseKlzGDExCx/k+81Xydg60sQuG2BQVkYGmofuSg==} engines: {node: '>=20.0.0'} - '@mariozechner/pi-ai@0.69.0': - resolution: {integrity: sha512-bl838sr57zx/apkiTeNPFQgbBkGXN4HHhm2oghzSRohJIBrR+H001bTeco7Osuke+EZTxO3V5Aev2qlZdUa2xw==} + '@mariozechner/pi-ai@0.70.0': + resolution: {integrity: sha512-lVT9bb0eFkNr5YXvZ5r00TNA5r110fOO8uJV9VLCQ5GdtunWIjcptWitzIjjl2MF0/NDs7Kb2EwZctXQWWP7eA==} engines: {node: '>=20.0.0'} hasBin: true - '@mariozechner/pi-coding-agent@0.69.0': - resolution: {integrity: sha512-/EFn43RO2TtMgZI4fMXNepIvbWm2GqhhaLIHBkrO7tRbRCzgvDYkw9sMLKhdf1Ihom2CjC3T/fzQRIPasRSIrQ==} + '@mariozechner/pi-coding-agent@0.70.0': + resolution: {integrity: sha512-Sw5odG9BYIcRItb/o4Gmq0nSIgoWfx61Isjk3Gk4KqocxHZAOwZZYQ4mgb4GCsevqOMmAzX/H6PC52/TiN76fw==} engines: {node: '>=20.6.0'} hasBin: true - '@mariozechner/pi-tui@0.69.0': - resolution: {integrity: sha512-/82SOMzCA1srivwfcSO8r9XLdAgJNcgpWzNZY33IqqvGev8Q4iWY/hA1wAkLB0l7PKJJ4Dh57xS4IGHbyVM7lA==} + '@mariozechner/pi-tui@0.70.0': + resolution: {integrity: sha512-x/CwIMP8v9KNrmgEFA0+AWIwSWeNAitEI4eVQtQ6q2a0PpE+vx1+j2oc+iDPe7E1YqrMHXaNlHJVCaVAv/UYrg==} engines: {node: '>=20.0.0'} '@matrix-org/matrix-sdk-crypto-nodejs@0.4.0': @@ -2711,8 +2788,8 @@ packages: resolution: {integrity: sha512-M/skUNJFD+lIVNa+ng0iy8t3sFmki6NOiWpGwnWOBAKFgTYBTJVtPfWm6SNdGFTCUsV9rjep4s9S5zTKUg2HJg==} engines: {node: '>=20'} - '@mistralai/mistralai@2.2.0': - resolution: {integrity: sha512-JQUGIXjFWnw/J9LpTSf/ZXwVW3Sh8FBAcfTo5QvAHqkl4CfSiIwnjRJhMoAFcP6ncCe84YPU1ncDGX+p3OXnfg==} + '@mistralai/mistralai@2.2.1': + resolution: {integrity: sha512-uKU8CZmL2RzYKmplsU01hii4p3pe4HqJefpWNRWXm1Tcm0Sm4xXfwSLIy4k7ZCPlbETCGcp69E7hZs+WOJ5itQ==} '@modelcontextprotocol/sdk@1.29.0': resolution: {integrity: sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==} @@ -7964,6 +8041,58 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/client-bedrock-runtime@3.1034.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.974.3 + '@aws-sdk/credential-provider-node': 3.972.34 + '@aws-sdk/eventstream-handler-node': 3.972.14 + '@aws-sdk/middleware-eventstream': 3.972.10 + '@aws-sdk/middleware-host-header': 3.972.10 + '@aws-sdk/middleware-logger': 3.972.10 + '@aws-sdk/middleware-recursion-detection': 3.972.11 + '@aws-sdk/middleware-user-agent': 3.972.33 + '@aws-sdk/middleware-websocket': 3.972.16 + '@aws-sdk/region-config-resolver': 3.972.13 + '@aws-sdk/token-providers': 3.1034.0 + '@aws-sdk/types': 3.973.8 + '@aws-sdk/util-endpoints': 3.996.8 + '@aws-sdk/util-user-agent-browser': 3.972.10 + '@aws-sdk/util-user-agent-node': 3.973.19 + '@smithy/config-resolver': 4.4.17 + '@smithy/core': 3.23.16 + '@smithy/eventstream-serde-browser': 4.2.14 + '@smithy/eventstream-serde-config-resolver': 4.3.14 + '@smithy/eventstream-serde-node': 4.2.14 + '@smithy/fetch-http-handler': 5.3.17 + '@smithy/hash-node': 4.2.14 + '@smithy/invalid-dependency': 4.2.14 + '@smithy/middleware-content-length': 4.2.14 + '@smithy/middleware-endpoint': 4.4.31 + '@smithy/middleware-retry': 4.5.4 + '@smithy/middleware-serde': 4.2.19 + '@smithy/middleware-stack': 4.2.14 + '@smithy/node-config-provider': 4.3.14 + '@smithy/node-http-handler': 4.6.0 + '@smithy/protocol-http': 5.3.14 + '@smithy/smithy-client': 4.12.12 + '@smithy/types': 4.14.1 + '@smithy/url-parser': 4.2.14 + '@smithy/util-base64': 4.3.2 + '@smithy/util-body-length-browser': 4.2.2 + '@smithy/util-body-length-node': 4.2.3 + '@smithy/util-defaults-mode-browser': 4.3.48 + '@smithy/util-defaults-mode-node': 4.2.53 + '@smithy/util-endpoints': 3.4.2 + '@smithy/util-middleware': 4.2.14 + '@smithy/util-retry': 4.3.3 + '@smithy/util-stream': 4.5.24 + '@smithy/util-utf8': 4.2.2 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/client-bedrock@3.1033.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 @@ -8013,17 +8142,17 @@ snapshots: dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.974.2 - '@aws-sdk/credential-provider-node': 3.972.33 + '@aws-sdk/core': 3.974.3 + '@aws-sdk/credential-provider-node': 3.972.34 '@aws-sdk/middleware-host-header': 3.972.10 '@aws-sdk/middleware-logger': 3.972.10 '@aws-sdk/middleware-recursion-detection': 3.972.11 - '@aws-sdk/middleware-user-agent': 3.972.32 - '@aws-sdk/region-config-resolver': 3.972.12 + '@aws-sdk/middleware-user-agent': 3.972.33 + '@aws-sdk/region-config-resolver': 3.972.13 '@aws-sdk/types': 3.973.8 - '@aws-sdk/util-endpoints': 3.996.7 + '@aws-sdk/util-endpoints': 3.996.8 '@aws-sdk/util-user-agent-browser': 3.972.10 - '@aws-sdk/util-user-agent-node': 3.973.18 + '@aws-sdk/util-user-agent-node': 3.973.19 '@smithy/config-resolver': 4.4.17 '@smithy/core': 3.23.16 '@smithy/fetch-http-handler': 5.3.17 @@ -8129,6 +8258,23 @@ snapshots: '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 + '@aws-sdk/core@3.974.3': + dependencies: + '@aws-sdk/types': 3.973.8 + '@aws-sdk/xml-builder': 3.972.18 + '@smithy/core': 3.23.16 + '@smithy/node-config-provider': 4.3.14 + '@smithy/property-provider': 4.2.14 + '@smithy/protocol-http': 5.3.14 + '@smithy/signature-v4': 5.3.14 + '@smithy/smithy-client': 4.12.12 + '@smithy/types': 4.14.1 + '@smithy/util-base64': 4.3.2 + '@smithy/util-middleware': 4.2.14 + '@smithy/util-retry': 4.3.3 + '@smithy/util-utf8': 4.2.2 + tslib: 2.8.1 + '@aws-sdk/crc64-nvme@3.972.7': dependencies: '@smithy/types': 4.14.1 @@ -8146,7 +8292,15 @@ snapshots: '@aws-sdk/credential-provider-env@3.972.28': dependencies: - '@aws-sdk/core': 3.974.2 + '@aws-sdk/core': 3.974.3 + '@aws-sdk/types': 3.973.8 + '@smithy/property-provider': 4.2.14 + '@smithy/types': 4.14.1 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-env@3.972.29': + dependencies: + '@aws-sdk/core': 3.974.3 '@aws-sdk/types': 3.973.8 '@smithy/property-provider': 4.2.14 '@smithy/types': 4.14.1 @@ -8154,7 +8308,20 @@ snapshots: '@aws-sdk/credential-provider-http@3.972.30': dependencies: - '@aws-sdk/core': 3.974.2 + '@aws-sdk/core': 3.974.3 + '@aws-sdk/types': 3.973.8 + '@smithy/fetch-http-handler': 5.3.17 + '@smithy/node-http-handler': 4.6.0 + '@smithy/property-provider': 4.2.14 + '@smithy/protocol-http': 5.3.14 + '@smithy/smithy-client': 4.12.12 + '@smithy/types': 4.14.1 + '@smithy/util-stream': 4.5.24 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-http@3.972.31': + dependencies: + '@aws-sdk/core': 3.974.3 '@aws-sdk/types': 3.973.8 '@smithy/fetch-http-handler': 5.3.17 '@smithy/node-http-handler': 4.6.0 @@ -8167,7 +8334,7 @@ snapshots: '@aws-sdk/credential-provider-ini@3.972.32': dependencies: - '@aws-sdk/core': 3.974.2 + '@aws-sdk/core': 3.974.3 '@aws-sdk/credential-provider-env': 3.972.28 '@aws-sdk/credential-provider-http': 3.972.30 '@aws-sdk/credential-provider-login': 3.972.32 @@ -8184,9 +8351,28 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/credential-provider-ini@3.972.33': + dependencies: + '@aws-sdk/core': 3.974.3 + '@aws-sdk/credential-provider-env': 3.972.29 + '@aws-sdk/credential-provider-http': 3.972.31 + '@aws-sdk/credential-provider-login': 3.972.33 + '@aws-sdk/credential-provider-process': 3.972.29 + '@aws-sdk/credential-provider-sso': 3.972.33 + '@aws-sdk/credential-provider-web-identity': 3.972.33 + '@aws-sdk/nested-clients': 3.997.1 + '@aws-sdk/types': 3.973.8 + '@smithy/credential-provider-imds': 4.2.14 + '@smithy/property-provider': 4.2.14 + '@smithy/shared-ini-file-loader': 4.4.9 + '@smithy/types': 4.14.1 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/credential-provider-login@3.972.32': dependencies: - '@aws-sdk/core': 3.974.2 + '@aws-sdk/core': 3.974.3 '@aws-sdk/nested-clients': 3.997.0 '@aws-sdk/types': 3.973.8 '@smithy/property-provider': 4.2.14 @@ -8197,6 +8383,19 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/credential-provider-login@3.972.33': + dependencies: + '@aws-sdk/core': 3.974.3 + '@aws-sdk/nested-clients': 3.997.1 + '@aws-sdk/types': 3.973.8 + '@smithy/property-provider': 4.2.14 + '@smithy/protocol-http': 5.3.14 + '@smithy/shared-ini-file-loader': 4.4.9 + '@smithy/types': 4.14.1 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/credential-provider-node@3.972.33': dependencies: '@aws-sdk/credential-provider-env': 3.972.28 @@ -8214,9 +8413,35 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/credential-provider-node@3.972.34': + dependencies: + '@aws-sdk/credential-provider-env': 3.972.29 + '@aws-sdk/credential-provider-http': 3.972.31 + '@aws-sdk/credential-provider-ini': 3.972.33 + '@aws-sdk/credential-provider-process': 3.972.29 + '@aws-sdk/credential-provider-sso': 3.972.33 + '@aws-sdk/credential-provider-web-identity': 3.972.33 + '@aws-sdk/types': 3.973.8 + '@smithy/credential-provider-imds': 4.2.14 + '@smithy/property-provider': 4.2.14 + '@smithy/shared-ini-file-loader': 4.4.9 + '@smithy/types': 4.14.1 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/credential-provider-process@3.972.28': dependencies: - '@aws-sdk/core': 3.974.2 + '@aws-sdk/core': 3.974.3 + '@aws-sdk/types': 3.973.8 + '@smithy/property-provider': 4.2.14 + '@smithy/shared-ini-file-loader': 4.4.9 + '@smithy/types': 4.14.1 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-process@3.972.29': + dependencies: + '@aws-sdk/core': 3.974.3 '@aws-sdk/types': 3.973.8 '@smithy/property-provider': 4.2.14 '@smithy/shared-ini-file-loader': 4.4.9 @@ -8225,7 +8450,7 @@ snapshots: '@aws-sdk/credential-provider-sso@3.972.32': dependencies: - '@aws-sdk/core': 3.974.2 + '@aws-sdk/core': 3.974.3 '@aws-sdk/nested-clients': 3.997.0 '@aws-sdk/token-providers': 3.1033.0 '@aws-sdk/types': 3.973.8 @@ -8236,9 +8461,22 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/credential-provider-sso@3.972.33': + dependencies: + '@aws-sdk/core': 3.974.3 + '@aws-sdk/nested-clients': 3.997.1 + '@aws-sdk/token-providers': 3.1034.0 + '@aws-sdk/types': 3.973.8 + '@smithy/property-provider': 4.2.14 + '@smithy/shared-ini-file-loader': 4.4.9 + '@smithy/types': 4.14.1 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/credential-provider-web-identity@3.972.32': dependencies: - '@aws-sdk/core': 3.974.2 + '@aws-sdk/core': 3.974.3 '@aws-sdk/nested-clients': 3.997.0 '@aws-sdk/types': 3.973.8 '@smithy/property-provider': 4.2.14 @@ -8248,16 +8486,28 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/credential-provider-web-identity@3.972.33': + dependencies: + '@aws-sdk/core': 3.974.3 + '@aws-sdk/nested-clients': 3.997.1 + '@aws-sdk/types': 3.973.8 + '@smithy/property-provider': 4.2.14 + '@smithy/shared-ini-file-loader': 4.4.9 + '@smithy/types': 4.14.1 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/credential-providers@3.1033.0': dependencies: '@aws-sdk/client-cognito-identity': 3.1033.0 - '@aws-sdk/core': 3.974.2 + '@aws-sdk/core': 3.974.3 '@aws-sdk/credential-provider-cognito-identity': 3.972.25 '@aws-sdk/credential-provider-env': 3.972.28 '@aws-sdk/credential-provider-http': 3.972.30 '@aws-sdk/credential-provider-ini': 3.972.32 '@aws-sdk/credential-provider-login': 3.972.32 - '@aws-sdk/credential-provider-node': 3.972.33 + '@aws-sdk/credential-provider-node': 3.972.34 '@aws-sdk/credential-provider-process': 3.972.28 '@aws-sdk/credential-provider-sso': 3.972.32 '@aws-sdk/credential-provider-web-identity': 3.972.32 @@ -8365,6 +8615,23 @@ snapshots: '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 + '@aws-sdk/middleware-sdk-s3@3.972.32': + dependencies: + '@aws-sdk/core': 3.974.3 + '@aws-sdk/types': 3.973.8 + '@aws-sdk/util-arn-parser': 3.972.3 + '@smithy/core': 3.23.16 + '@smithy/node-config-provider': 4.3.14 + '@smithy/protocol-http': 5.3.14 + '@smithy/signature-v4': 5.3.14 + '@smithy/smithy-client': 4.12.12 + '@smithy/types': 4.14.1 + '@smithy/util-config-provider': 4.2.2 + '@smithy/util-middleware': 4.2.14 + '@smithy/util-stream': 4.5.24 + '@smithy/util-utf8': 4.2.2 + tslib: 2.8.1 + '@aws-sdk/middleware-ssec@3.972.10': dependencies: '@aws-sdk/types': 3.973.8 @@ -8382,6 +8649,17 @@ snapshots: '@smithy/util-retry': 4.3.3 tslib: 2.8.1 + '@aws-sdk/middleware-user-agent@3.972.33': + dependencies: + '@aws-sdk/core': 3.974.3 + '@aws-sdk/types': 3.973.8 + '@aws-sdk/util-endpoints': 3.996.8 + '@smithy/core': 3.23.16 + '@smithy/protocol-http': 5.3.14 + '@smithy/types': 4.14.1 + '@smithy/util-retry': 4.3.3 + tslib: 2.8.1 + '@aws-sdk/middleware-websocket@3.972.16': dependencies: '@aws-sdk/types': 3.973.8 @@ -8401,17 +8679,61 @@ snapshots: dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.974.2 + '@aws-sdk/core': 3.974.3 '@aws-sdk/middleware-host-header': 3.972.10 '@aws-sdk/middleware-logger': 3.972.10 '@aws-sdk/middleware-recursion-detection': 3.972.11 - '@aws-sdk/middleware-user-agent': 3.972.32 - '@aws-sdk/region-config-resolver': 3.972.12 + '@aws-sdk/middleware-user-agent': 3.972.33 + '@aws-sdk/region-config-resolver': 3.972.13 '@aws-sdk/signature-v4-multi-region': 3.996.19 '@aws-sdk/types': 3.973.8 - '@aws-sdk/util-endpoints': 3.996.7 + '@aws-sdk/util-endpoints': 3.996.8 '@aws-sdk/util-user-agent-browser': 3.972.10 - '@aws-sdk/util-user-agent-node': 3.973.18 + '@aws-sdk/util-user-agent-node': 3.973.19 + '@smithy/config-resolver': 4.4.17 + '@smithy/core': 3.23.16 + '@smithy/fetch-http-handler': 5.3.17 + '@smithy/hash-node': 4.2.14 + '@smithy/invalid-dependency': 4.2.14 + '@smithy/middleware-content-length': 4.2.14 + '@smithy/middleware-endpoint': 4.4.31 + '@smithy/middleware-retry': 4.5.4 + '@smithy/middleware-serde': 4.2.19 + '@smithy/middleware-stack': 4.2.14 + '@smithy/node-config-provider': 4.3.14 + '@smithy/node-http-handler': 4.6.0 + '@smithy/protocol-http': 5.3.14 + '@smithy/smithy-client': 4.12.12 + '@smithy/types': 4.14.1 + '@smithy/url-parser': 4.2.14 + '@smithy/util-base64': 4.3.2 + '@smithy/util-body-length-browser': 4.2.2 + '@smithy/util-body-length-node': 4.2.3 + '@smithy/util-defaults-mode-browser': 4.3.48 + '@smithy/util-defaults-mode-node': 4.2.53 + '@smithy/util-endpoints': 3.4.2 + '@smithy/util-middleware': 4.2.14 + '@smithy/util-retry': 4.3.3 + '@smithy/util-utf8': 4.2.2 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/nested-clients@3.997.1': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.974.3 + '@aws-sdk/middleware-host-header': 3.972.10 + '@aws-sdk/middleware-logger': 3.972.10 + '@aws-sdk/middleware-recursion-detection': 3.972.11 + '@aws-sdk/middleware-user-agent': 3.972.33 + '@aws-sdk/region-config-resolver': 3.972.13 + '@aws-sdk/signature-v4-multi-region': 3.996.20 + '@aws-sdk/types': 3.973.8 + '@aws-sdk/util-endpoints': 3.996.8 + '@aws-sdk/util-user-agent-browser': 3.972.10 + '@aws-sdk/util-user-agent-node': 3.973.19 '@smithy/config-resolver': 4.4.17 '@smithy/core': 3.23.16 '@smithy/fetch-http-handler': 5.3.17 @@ -8449,6 +8771,14 @@ snapshots: '@smithy/types': 4.14.1 tslib: 2.8.1 + '@aws-sdk/region-config-resolver@3.972.13': + dependencies: + '@aws-sdk/types': 3.973.8 + '@smithy/config-resolver': 4.4.17 + '@smithy/node-config-provider': 4.3.14 + '@smithy/types': 4.14.1 + tslib: 2.8.1 + '@aws-sdk/s3-request-presigner@3.1033.0': dependencies: '@aws-sdk/signature-v4-multi-region': 3.996.19 @@ -8469,6 +8799,15 @@ snapshots: '@smithy/types': 4.14.1 tslib: 2.8.1 + '@aws-sdk/signature-v4-multi-region@3.996.20': + dependencies: + '@aws-sdk/middleware-sdk-s3': 3.972.32 + '@aws-sdk/types': 3.973.8 + '@smithy/protocol-http': 5.3.14 + '@smithy/signature-v4': 5.3.14 + '@smithy/types': 4.14.1 + tslib: 2.8.1 + '@aws-sdk/token-providers@3.1033.0': dependencies: '@aws-sdk/core': 3.974.2 @@ -8481,6 +8820,18 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/token-providers@3.1034.0': + dependencies: + '@aws-sdk/core': 3.974.3 + '@aws-sdk/nested-clients': 3.997.1 + '@aws-sdk/types': 3.973.8 + '@smithy/property-provider': 4.2.14 + '@smithy/shared-ini-file-loader': 4.4.9 + '@smithy/types': 4.14.1 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/types@3.973.8': dependencies: '@smithy/types': 4.14.1 @@ -8498,6 +8849,14 @@ snapshots: '@smithy/util-endpoints': 3.4.2 tslib: 2.8.1 + '@aws-sdk/util-endpoints@3.996.8': + dependencies: + '@aws-sdk/types': 3.973.8 + '@smithy/types': 4.14.1 + '@smithy/url-parser': 4.2.14 + '@smithy/util-endpoints': 3.4.2 + tslib: 2.8.1 + '@aws-sdk/util-format-url@3.972.10': dependencies: '@aws-sdk/types': 3.973.8 @@ -8525,6 +8884,15 @@ snapshots: '@smithy/util-config-provider': 4.2.2 tslib: 2.8.1 + '@aws-sdk/util-user-agent-node@3.973.19': + dependencies: + '@aws-sdk/middleware-user-agent': 3.972.33 + '@aws-sdk/types': 3.973.8 + '@smithy/node-config-provider': 4.3.14 + '@smithy/types': 4.14.1 + '@smithy/util-config-provider': 4.2.2 + tslib: 2.8.1 + '@aws-sdk/xml-builder@3.972.18': dependencies: '@smithy/types': 4.14.1 @@ -9564,9 +9932,9 @@ snapshots: std-env: 3.10.0 yoctocolors: 2.1.2 - '@mariozechner/pi-agent-core@0.69.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6)': + '@mariozechner/pi-agent-core@0.70.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6)': dependencies: - '@mariozechner/pi-ai': 0.69.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) + '@mariozechner/pi-ai': 0.70.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) typebox: 1.1.28 transitivePeerDependencies: - '@modelcontextprotocol/sdk' @@ -9577,12 +9945,12 @@ snapshots: - ws - zod - '@mariozechner/pi-ai@0.69.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6)': + '@mariozechner/pi-ai@0.70.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6)': dependencies: '@anthropic-ai/sdk': 0.90.0(zod@4.3.6) - '@aws-sdk/client-bedrock-runtime': 3.1033.0 + '@aws-sdk/client-bedrock-runtime': 3.1034.0 '@google/genai': 1.50.1(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6)) - '@mistralai/mistralai': 2.2.0 + '@mistralai/mistralai': 2.2.1 chalk: 5.6.2 openai: 6.26.0(ws@8.20.0)(zod@4.3.6) partial-json: 0.1.7 @@ -9599,12 +9967,12 @@ snapshots: - ws - zod - '@mariozechner/pi-coding-agent@0.69.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6)': + '@mariozechner/pi-coding-agent@0.70.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6)': dependencies: '@mariozechner/jiti': 2.6.5 - '@mariozechner/pi-agent-core': 0.69.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) - '@mariozechner/pi-ai': 0.69.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) - '@mariozechner/pi-tui': 0.69.0 + '@mariozechner/pi-agent-core': 0.70.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) + '@mariozechner/pi-ai': 0.70.0(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(ws@8.20.0)(zod@4.3.6) + '@mariozechner/pi-tui': 0.70.0 '@silvia-odwyer/photon-node': 0.3.4 chalk: 5.6.2 cli-highlight: 2.1.11 @@ -9633,7 +10001,7 @@ snapshots: - ws - zod - '@mariozechner/pi-tui@0.69.0': + '@mariozechner/pi-tui@0.70.0': dependencies: '@types/mime-types': 2.1.4 chalk: 5.6.2 @@ -9722,7 +10090,7 @@ snapshots: transitivePeerDependencies: - debug - '@mistralai/mistralai@2.2.0': + '@mistralai/mistralai@2.2.1': dependencies: ws: 8.20.0 zod: 4.3.6 diff --git a/scripts/check-changed.mjs b/scripts/check-changed.mjs index 8802549ad0a..67cdb6f78c1 100644 --- a/scripts/check-changed.mjs +++ b/scripts/check-changed.mjs @@ -10,7 +10,7 @@ import { printTimingSummary } from "./lib/check-timing-summary.mjs"; import { runManagedCommand } from "./lib/managed-child-process.mjs"; import { resolveChangedTestTargetPlan } from "./test-projects.test-support.mjs"; -export const CHANGED_CHECK_VITEST_NO_OUTPUT_TIMEOUT_MS = "60000"; +export const CHANGED_CHECK_VITEST_NO_OUTPUT_TIMEOUT_MS = "300000"; const VITEST_NO_OUTPUT_TIMEOUT_ENV_KEY = "OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS"; const VITEST_NO_OUTPUT_RETRY_ENV_KEY = "OPENCLAW_VITEST_NO_OUTPUT_RETRY"; diff --git a/src/agents/openai-responses-payload-policy.ts b/src/agents/openai-responses-payload-policy.ts index da26ee217dd..4727238fe73 100644 --- a/src/agents/openai-responses-payload-policy.ts +++ b/src/agents/openai-responses-payload-policy.ts @@ -9,7 +9,7 @@ type OpenAIResponsesPayloadModel = { id?: unknown; provider?: unknown; contextWindow?: unknown; - compat?: { supportsStore?: boolean }; + compat?: unknown; }; type OpenAIResponsesPayloadPolicyOptions = { @@ -50,6 +50,14 @@ function resolveOpenAIResponsesCompactThreshold(model: { contextWindow?: unknown return 80_000; } +function readCompatBoolean(compat: unknown, key: "supportsStore"): boolean | undefined { + if (!compat || typeof compat !== "object") { + return undefined; + } + const value = (compat as Record)[key]; + return typeof value === "boolean" ? value : undefined; +} + function shouldEnableOpenAIResponsesServerCompaction( explicitStore: boolean | undefined, provider: unknown, @@ -124,7 +132,9 @@ export function resolveOpenAIResponsesPayloadPolicy( shouldStripPromptCache: options.enablePromptCacheStripping === true && capabilities.shouldStripResponsesPromptCache, shouldStripStore: - explicitStore !== true && model.compat?.supportsStore === false && isResponsesApi, + explicitStore !== true && + readCompatBoolean(model.compat, "supportsStore") === false && + isResponsesApi, useServerCompaction: options.enableServerCompaction === true && shouldEnableOpenAIResponsesServerCompaction( diff --git a/src/agents/openai-strict-tool-setting.ts b/src/agents/openai-strict-tool-setting.ts index af6d52f8b15..6e5dfc069a1 100644 --- a/src/agents/openai-strict-tool-setting.ts +++ b/src/agents/openai-strict-tool-setting.ts @@ -8,7 +8,7 @@ type OpenAIStrictToolModel = { api?: unknown; baseUrl?: unknown; id?: unknown; - compat?: { supportsStore?: boolean }; + compat?: unknown; }; const optionalString = readStringValue; @@ -24,10 +24,7 @@ export function resolvesToNativeOpenAIStrictTools( capability: "llm", transport, modelId: optionalString(model.id), - compat: - model.compat && typeof model.compat === "object" - ? (model.compat as { supportsStore?: boolean }) - : undefined, + compat: model.compat, }); if (!capabilities.usesKnownNativeOpenAIRoute) { return false; diff --git a/src/agents/openai-transport-stream.test.ts b/src/agents/openai-transport-stream.test.ts index 9f9012fe58c..fe994c7e9db 100644 --- a/src/agents/openai-transport-stream.test.ts +++ b/src/agents/openai-transport-stream.test.ts @@ -732,7 +732,7 @@ describe("openai transport stream", () => { compat: { supportedReasoningEfforts: ["minimal", "low", "medium", "high"], }, - } satisfies Model<"openai-responses">; + } as unknown as Model<"openai-responses">; const params = buildOpenAIResponsesParams( model, @@ -770,7 +770,7 @@ describe("openai transport stream", () => { compat: { supportedReasoningEfforts: ["minimal", "low", "medium", "high"], }, - } satisfies Model<"openai-responses">; + } as unknown as Model<"openai-responses">; const params = buildOpenAIResponsesParams( model, diff --git a/src/agents/openai-transport-stream.ts b/src/agents/openai-transport-stream.ts index b6d0fd58305..0c0e943f265 100644 --- a/src/agents/openai-transport-stream.ts +++ b/src/agents/openai-transport-stream.ts @@ -19,6 +19,7 @@ import type { ResponseInput, ResponseInputMessageContentList, } from "openai/resources/responses/responses.js"; +import type { ModelCompatConfig } from "../config/types.models.js"; import type { ProviderRuntimeModel } from "../plugins/provider-runtime-model.types.js"; import { resolveProviderTransportTurnStateWithPlugin } from "../plugins/provider-runtime.js"; import { buildCopilotDynamicHeaders, hasCopilotVisionInput } from "./copilot-dynamic-headers.js"; @@ -80,8 +81,8 @@ type OpenAICompletionsOptions = BaseStreamOptions & { reasoningEffort?: OpenAIReasoningEffort; }; -type OpenAIModeModel = Model & { - compat?: Record; +type OpenAIModeModel = Omit, "compat"> & { + compat?: ModelCompatConfig; }; type MutableAssistantOutput = { @@ -1505,31 +1506,24 @@ function getCompat(model: OpenAIModeModel): { : detected.supportsReasoningEffort; return { supportsStore, - supportsDeveloperRole: - (compat.supportsDeveloperRole as boolean | undefined) ?? detected.supportsDeveloperRole, + supportsDeveloperRole: compat.supportsDeveloperRole ?? detected.supportsDeveloperRole, supportsReasoningEffort, reasoningEffortMap: resolveOpenAIReasoningEffortMap(model, detected.reasoningEffortMap), - supportsUsageInStreaming: - (compat.supportsUsageInStreaming as boolean | undefined) ?? detected.supportsUsageInStreaming, + supportsUsageInStreaming: compat.supportsUsageInStreaming ?? detected.supportsUsageInStreaming, maxTokensField: (compat.maxTokensField as string | undefined) ?? detected.maxTokensField, - requiresToolResultName: - (compat.requiresToolResultName as boolean | undefined) ?? detected.requiresToolResultName, + requiresToolResultName: compat.requiresToolResultName ?? detected.requiresToolResultName, requiresAssistantAfterToolResult: - (compat.requiresAssistantAfterToolResult as boolean | undefined) ?? - detected.requiresAssistantAfterToolResult, - requiresThinkingAsText: - (compat.requiresThinkingAsText as boolean | undefined) ?? detected.requiresThinkingAsText, + compat.requiresAssistantAfterToolResult ?? detected.requiresAssistantAfterToolResult, + requiresThinkingAsText: compat.requiresThinkingAsText ?? detected.requiresThinkingAsText, thinkingFormat: (compat.thinkingFormat as string | undefined) ?? detected.thinkingFormat, openRouterRouting: (compat.openRouterRouting as Record | undefined) ?? {}, vercelGatewayRouting: (compat.vercelGatewayRouting as Record | undefined) ?? detected.vercelGatewayRouting, - supportsStrictMode: - (compat.supportsStrictMode as boolean | undefined) ?? detected.supportsStrictMode, - requiresStringContent: (compat.requiresStringContent as boolean | undefined) ?? false, + supportsStrictMode: compat.supportsStrictMode ?? detected.supportsStrictMode, + requiresStringContent: compat.requiresStringContent ?? false, visibleReasoningDetailTypes: - (compat.visibleReasoningDetailTypes as string[] | undefined) ?? - detected.visibleReasoningDetailTypes, + compat.visibleReasoningDetailTypes ?? detected.visibleReasoningDetailTypes, }; } diff --git a/src/agents/pi-embedded-runner/model.provider-runtime.test-support.ts b/src/agents/pi-embedded-runner/model.provider-runtime.test-support.ts index 2c4e629e032..982e0c08384 100644 --- a/src/agents/pi-embedded-runner/model.provider-runtime.test-support.ts +++ b/src/agents/pi-embedded-runner/model.provider-runtime.test-support.ts @@ -230,8 +230,14 @@ function buildDynamicModel( } case "openai-codex": { const isLegacyGpt54Alias = lower === "gpt-5.4-codex"; + if (lower === "gpt-5.5") { + return ( + (params.modelRegistry.find("openai-codex", modelId) as ResolvedModelLike | null) ?? + undefined + ); + } const template = - lower === "gpt-5.5" || lower === "gpt-5.5-pro" + lower === "gpt-5.5-pro" ? findTemplate(params, "openai-codex", ["gpt-5.4", "gpt-5.4-pro", "gpt-5.3-codex"]) : lower === "gpt-5.4" || isLegacyGpt54Alias || lower === "gpt-5.4-pro" ? findTemplate(params, "openai-codex", ["gpt-5.4", "gpt-5.3-codex", "gpt-5.2-codex"]) @@ -259,7 +265,7 @@ function buildDynamicModel( contextWindow: DEFAULT_CONTEXT_WINDOW, maxTokens: DEFAULT_CONTEXT_WINDOW, }; - if (lower === "gpt-5.5" || lower === "gpt-5.5-pro") { + if (lower === "gpt-5.5-pro") { return cloneTemplate( template, modelId, @@ -267,10 +273,7 @@ function buildDynamicModel( provider: "openai-codex", api: "openai-codex-responses", baseUrl: OPENAI_CODEX_BASE_URL, - cost: - lower === "gpt-5.5-pro" - ? { input: 30, output: 180, cacheRead: 0, cacheWrite: 0 } - : { input: 5, output: 30, cacheRead: 0, cacheWrite: 0 }, + cost: { input: 30, output: 180, cacheRead: 0, cacheWrite: 0 }, contextWindow: 1_000_000, contextTokens: 272_000, maxTokens: 128_000, diff --git a/src/agents/pi-embedded-runner/model.test.ts b/src/agents/pi-embedded-runner/model.test.ts index 9a1fcdcf932..02ddda4c506 100644 --- a/src/agents/pi-embedded-runner/model.test.ts +++ b/src/agents/pi-embedded-runner/model.test.ts @@ -1101,10 +1101,12 @@ describe("resolveModel", () => { it("lets official openai-codex metadata override legacy unmarked models-add rows", () => { mockDiscoveredModel(discoverModels, { provider: "openai-codex", - modelId: "gpt-5.4", + modelId: "gpt-5.5", templateModel: { - ...buildOpenAICodexForwardCompatExpectation("gpt-5.4"), - name: "GPT-5.4", + ...buildOpenAICodexForwardCompatExpectation("gpt-5.5"), + name: "GPT-5.5", + cost: { input: 5, output: 30, cacheRead: 0.5, cacheWrite: 0 }, + contextWindow: 400_000, }, }); @@ -1137,9 +1139,8 @@ describe("resolveModel", () => { expect(result.model).toMatchObject({ provider: "openai-codex", id: "gpt-5.5", - cost: { input: 5, output: 30, cacheRead: 0, cacheWrite: 0 }, - contextWindow: 1_000_000, - contextTokens: 272_000, + cost: { input: 5, output: 30, cacheRead: 0.5, cacheWrite: 0 }, + contextWindow: 400_000, maxTokens: 128_000, }); }); @@ -1147,10 +1148,12 @@ describe("resolveModel", () => { it("preserves unmarked manual openai-codex metadata overrides", () => { mockDiscoveredModel(discoverModels, { provider: "openai-codex", - modelId: "gpt-5.4", + modelId: "gpt-5.5", templateModel: { - ...buildOpenAICodexForwardCompatExpectation("gpt-5.4"), - name: "GPT-5.4", + ...buildOpenAICodexForwardCompatExpectation("gpt-5.5"), + name: "GPT-5.5", + cost: { input: 5, output: 30, cacheRead: 0.5, cacheWrite: 0 }, + contextWindow: 400_000, }, }); diff --git a/src/agents/pi-embedded-runner/openai-stream-wrappers.ts b/src/agents/pi-embedded-runner/openai-stream-wrappers.ts index f1b97c954ec..ebdb33a3455 100644 --- a/src/agents/pi-embedded-runner/openai-stream-wrappers.ts +++ b/src/agents/pi-embedded-runner/openai-stream-wrappers.ts @@ -26,7 +26,7 @@ function resolveOpenAIRequestCapabilities(model: { api?: unknown; provider?: unknown; baseUrl?: unknown; - compat?: { supportsStore?: boolean }; + compat?: unknown; }) { return resolveProviderRequestPolicyConfig({ provider: readStringValue(model.provider), diff --git a/src/agents/provider-attribution.ts b/src/agents/provider-attribution.ts index 0e9caae688d..23b4cfe9ff0 100644 --- a/src/agents/provider-attribution.ts +++ b/src/agents/provider-attribution.ts @@ -91,10 +91,7 @@ export type ProviderRequestPolicyResolution = { export type ProviderRequestCapabilitiesInput = ProviderRequestPolicyInput & { modelId?: string | null; - compat?: { - supportsStore?: boolean; - supportsPromptCacheKey?: boolean; - } | null; + compat?: unknown; }; export type ProviderRequestCompatibilityFamily = "moonshot"; @@ -111,6 +108,17 @@ export type ProviderRequestCapabilities = ProviderRequestPolicyResolution & { compatibilityFamily?: ProviderRequestCompatibilityFamily; }; +function readCompatBoolean( + compat: unknown, + key: "supportsStore" | "supportsPromptCacheKey", +): boolean | undefined { + if (!compat || typeof compat !== "object") { + return undefined; + } + const value = (compat as Record)[key]; + return typeof value === "boolean" ? value : undefined; +} + const OPENCLAW_ATTRIBUTION_PRODUCT = "OpenClaw"; const OPENCLAW_ATTRIBUTION_ORIGINATOR = "openclaw"; @@ -630,7 +638,7 @@ export function resolveProviderRequestCapabilities( } const isResponsesApi = isOpenAIResponsesApi(api); - const promptCacheKeySupport = input.compat?.supportsPromptCacheKey; + const promptCacheKeySupport = readCompatBoolean(input.compat, "supportsPromptCacheKey"); // Default strip behavior (proxy-like endpoints with responses APIs) is // preserved as a safety net for providers that reject prompt_cache_key, // see #48155 (Volcano Engine DeepSeek). Operators running their payload @@ -672,9 +680,10 @@ export function resolveProviderRequestCapabilities( (endpointClass === "default" || endpointClass === "anthropic-public"), // This is intentionally the gate for emitting `store: false` on Responses // transports, not just a statement about vendor support in the abstract. - supportsResponsesStoreField: input.compat?.supportsStore !== false && isResponsesApi, + supportsResponsesStoreField: + readCompatBoolean(input.compat, "supportsStore") !== false && isResponsesApi, allowsResponsesStore: - input.compat?.supportsStore !== false && + readCompatBoolean(input.compat, "supportsStore") !== false && provider !== undefined && isResponsesApi && OPENAI_RESPONSES_PROVIDERS.has(provider) && diff --git a/src/agents/provider-request-config.ts b/src/agents/provider-request-config.ts index 38bb90d5637..74dcde7767c 100644 --- a/src/agents/provider-request-config.ts +++ b/src/agents/provider-request-config.ts @@ -160,10 +160,7 @@ type ResolveProviderRequestPolicyConfigParams = { callerHeaders?: Record; precedence?: ProviderRequestHeaderPrecedence; authHeader?: boolean; - compat?: { - supportsStore?: boolean; - supportsPromptCacheKey?: boolean; - } | null; + compat?: unknown; modelId?: string | null; allowPrivateNetwork?: boolean; request?: ModelProviderRequestTransportOverrides; diff --git a/src/config/types.models.ts b/src/config/types.models.ts index 55f3a18e5b2..0efe8498a05 100644 --- a/src/config/types.models.ts +++ b/src/config/types.models.ts @@ -1,4 +1,8 @@ -import type { OpenAICompletionsCompat } from "@mariozechner/pi-ai"; +import type { + AnthropicMessagesCompat, + OpenAICompletionsCompat, + OpenAIResponsesCompat, +} from "@mariozechner/pi-ai"; import type { ConfiguredModelProviderRequest } from "./types.provider-request.js"; import type { SecretInput } from "./types.secrets.js"; @@ -27,6 +31,22 @@ type SupportedOpenAICompatFields = Pick< | "requiresToolResultName" | "requiresAssistantAfterToolResult" | "requiresThinkingAsText" + | "openRouterRouting" + | "vercelGatewayRouting" + | "zaiToolStream" + | "cacheControlFormat" + | "sendSessionAffinityHeaders" + | "supportsLongCacheRetention" +>; + +type SupportedOpenAIResponsesCompatFields = Pick< + OpenAIResponsesCompat, + "sendSessionIdHeader" | "supportsLongCacheRetention" +>; + +type SupportedAnthropicMessagesCompatFields = Pick< + AnthropicMessagesCompat, + "supportsEagerToolInputStreaming" | "supportsLongCacheRetention" >; type SupportedThinkingFormat = @@ -34,19 +54,22 @@ type SupportedThinkingFormat = | "openrouter" | "qwen-chat-template"; -export type ModelCompatConfig = SupportedOpenAICompatFields & { - thinkingFormat?: SupportedThinkingFormat; - visibleReasoningDetailTypes?: string[]; - supportsTools?: boolean; - supportsPromptCacheKey?: boolean; - requiresStringContent?: boolean; - toolSchemaProfile?: string; - unsupportedToolSchemaKeywords?: string[]; - nativeWebSearchTool?: boolean; - toolCallArgumentsEncoding?: string; - requiresMistralToolIds?: boolean; - requiresOpenAiAnthropicToolPayload?: boolean; -}; +export type ModelCompatConfig = SupportedOpenAICompatFields & + SupportedOpenAIResponsesCompatFields & + SupportedAnthropicMessagesCompatFields & { + thinkingFormat?: SupportedThinkingFormat; + supportedReasoningEfforts?: string[]; + visibleReasoningDetailTypes?: string[]; + supportsTools?: boolean; + supportsPromptCacheKey?: boolean; + requiresStringContent?: boolean; + toolSchemaProfile?: string; + unsupportedToolSchemaKeywords?: string[]; + nativeWebSearchTool?: boolean; + toolCallArgumentsEncoding?: string; + requiresMistralToolIds?: boolean; + requiresOpenAiAnthropicToolPayload?: boolean; + }; export type ModelProviderAuthMode = "api-key" | "aws-sdk" | "oauth" | "token"; diff --git a/src/plugins/provider-model-compat.ts b/src/plugins/provider-model-compat.ts index 550393c9fc1..e088669c8d9 100644 --- a/src/plugins/provider-model-compat.ts +++ b/src/plugins/provider-model-compat.ts @@ -2,7 +2,7 @@ import type { Api, Model } from "@mariozechner/pi-ai"; import { detectOpenAICompletionsCompat } from "../agents/openai-completions-compat.js"; import type { ModelCompatConfig } from "../config/types.models.js"; -function extractModelCompat( +export function extractModelCompat( modelOrCompat: { compat?: unknown } | ModelCompatConfig | undefined, ): ModelCompatConfig | undefined { if (!modelOrCompat || typeof modelOrCompat !== "object") { diff --git a/src/plugins/provider-runtime.test-support.ts b/src/plugins/provider-runtime.test-support.ts index 184add6d262..d095f166111 100644 --- a/src/plugins/provider-runtime.test-support.ts +++ b/src/plugins/provider-runtime.test-support.ts @@ -19,10 +19,8 @@ export const expectedAugmentedOpenaiCodexCatalogEntries = [ ]; export const expectedAugmentedOpenaiCodexCatalogEntriesWithGpt55 = [ - { provider: "openai", id: "gpt-5.5", name: "gpt-5.5" }, { provider: "openai", id: "gpt-5.5-pro", name: "gpt-5.5-pro" }, ...expectedAugmentedOpenaiCodexCatalogEntries.slice(0, 4), - { provider: "openai-codex", id: "gpt-5.5", name: "gpt-5.5" }, { provider: "openai-codex", id: "gpt-5.5-pro", name: "gpt-5.5-pro" }, ...expectedAugmentedOpenaiCodexCatalogEntries.slice(4), ]; diff --git a/test/helpers/plugins/provider-runtime-contract.ts b/test/helpers/plugins/provider-runtime-contract.ts index 756a8404934..20e43e0c22e 100644 --- a/test/helpers/plugins/provider-runtime-contract.ts +++ b/test/helpers/plugins/provider-runtime-contract.ts @@ -445,7 +445,7 @@ export function describeOpenAIProviderRuntimeContract(load: ProviderRuntimeContr }); }); - it("owns openai gpt-5.5 forward-compat resolution", () => { + it("leaves openai gpt-5.5 forward-compat resolution to Pi", () => { const provider = requireProviderContractProvider("openai"); const model = provider.resolveDynamicModel?.({ provider: "openai", @@ -463,14 +463,7 @@ export function describeOpenAIProviderRuntimeContract(load: ProviderRuntimeContr } as never, }); - expect(model).toMatchObject({ - id: "gpt-5.5", - provider: "openai", - api: "openai-responses", - baseUrl: "https://api.openai.com/v1", - contextWindow: 1_000_000, - maxTokens: 128_000, - }); + expect(model).toBeUndefined(); }); it("owns openai gpt-5.4 mini forward-compat resolution", () => { @@ -570,19 +563,23 @@ export function describeOpenAIProviderRuntimeContract(load: ProviderRuntimeContr }); }); - it("owns forward-compat codex gpt-5.5 models", () => { + it("uses Pi registry metadata for codex gpt-5.5 models", () => { const provider = requireProviderContractProvider("openai-codex"); const model = provider.resolveDynamicModel?.({ provider: "openai-codex", modelId: "gpt-5.5", modelRegistry: { find: (_provider: string, id: string) => - id === "gpt-5.4" + id === "gpt-5.5" ? createModel({ id, api: "openai-codex-responses", provider: "openai-codex", baseUrl: "https://chatgpt.com/backend-api", + input: ["text", "image"], + cost: { input: 5, output: 30, cacheRead: 0.5, cacheWrite: 0 }, + contextWindow: 400_000, + maxTokens: 128_000, }) : null, } as never, @@ -592,8 +589,7 @@ export function describeOpenAIProviderRuntimeContract(load: ProviderRuntimeContr id: "gpt-5.5", provider: "openai-codex", api: "openai-codex-responses", - contextWindow: 1_000_000, - contextTokens: 272_000, + contextWindow: 400_000, maxTokens: 128_000, }); }); diff --git a/test/scripts/changed-lanes.test.ts b/test/scripts/changed-lanes.test.ts index 15b071882fd..4a8277bcc8c 100644 --- a/test/scripts/changed-lanes.test.ts +++ b/test/scripts/changed-lanes.test.ts @@ -364,7 +364,8 @@ describe("scripts/changed-lanes", () => { expect(plan.runFullTests).toBe(false); }); - it("sets a fail-fast Vitest watchdog for changed checks", () => { + it("sets a five-minute Vitest watchdog for changed checks", () => { + expect(CHANGED_CHECK_VITEST_NO_OUTPUT_TIMEOUT_MS).toBe("300000"); expect(createChangedCheckVitestEnv({ PATH: "/usr/bin" })).toMatchObject({ PATH: "/usr/bin", OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS: CHANGED_CHECK_VITEST_NO_OUTPUT_TIMEOUT_MS,