build: update Pi model dependencies

This commit is contained in:
Peter Steinberger
2026-04-24 01:24:23 +01:00
parent 7e16e3d077
commit f04a3dced0
35 changed files with 671 additions and 339 deletions

View File

@@ -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.

View File

@@ -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:*"

View File

@@ -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<Record<string, unknown>> = [];
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<string, unknown>): OpenClawConfig {
return {
plugins: {
@@ -183,9 +204,13 @@ function runtimePluginConfig(config?: Record<string, unknown>): 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<Record<string, unknown>>;
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);
});
});
});

View File

@@ -157,6 +157,10 @@ function resolvedModelSupportsCaching(modelArn: string): boolean {
*/
const appProfileCacheEligibleCache = new Map<string, boolean>();
export function resetBedrockAppProfileCacheEligibilityForTest(): void {
appProfileCacheEligibleCache.clear();
}
async function resolveAppProfileCacheEligible(
modelId: string,
fallbackRegion: string | undefined,

View File

@@ -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:*"

View File

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

View File

@@ -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:*"

View File

@@ -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:*"

View File

@@ -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:*"

View File

@@ -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:*"

View File

@@ -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": [

View File

@@ -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": {

View File

@@ -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(

View File

@@ -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<typeof cloneFirstTemplateModel>[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, {

View File

@@ -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,
}),
);
});

View File

@@ -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<ProviderRuntimeModel>;
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,

View File

@@ -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": {

View File

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

View File

@@ -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",

510
pnpm-lock.yaml generated
View File

@@ -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

View File

@@ -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";

View File

@@ -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<string, unknown>)[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(

View File

@@ -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;

View File

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

View File

@@ -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<Api> & {
compat?: Record<string, unknown>;
type OpenAIModeModel = Omit<Model<Api>, "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<string, unknown> | undefined) ?? {},
vercelGatewayRouting:
(compat.vercelGatewayRouting as Record<string, unknown> | 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,
};
}

View File

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

View File

@@ -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,
},
});

View File

@@ -26,7 +26,7 @@ function resolveOpenAIRequestCapabilities(model: {
api?: unknown;
provider?: unknown;
baseUrl?: unknown;
compat?: { supportsStore?: boolean };
compat?: unknown;
}) {
return resolveProviderRequestPolicyConfig({
provider: readStringValue(model.provider),

View File

@@ -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<string, unknown>)[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) &&

View File

@@ -160,10 +160,7 @@ type ResolveProviderRequestPolicyConfigParams = {
callerHeaders?: Record<string, string>;
precedence?: ProviderRequestHeaderPrecedence;
authHeader?: boolean;
compat?: {
supportsStore?: boolean;
supportsPromptCacheKey?: boolean;
} | null;
compat?: unknown;
modelId?: string | null;
allowPrivateNetwork?: boolean;
request?: ModelProviderRequestTransportOverrides;

View File

@@ -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";

View File

@@ -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") {

View File

@@ -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),
];

View File

@@ -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,
});
});

View File

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