diff --git a/src/agents/pi-embedded-runner/extra-params.ts b/src/agents/pi-embedded-runner/extra-params.ts index 553dccd575270..e841b19594086 100644 --- a/src/agents/pi-embedded-runner/extra-params.ts +++ b/src/agents/pi-embedded-runner/extra-params.ts @@ -4,6 +4,10 @@ import { streamSimple } from "@mariozechner/pi-ai"; import type { OpenClawConfig } from "../../config/config.js"; import { log } from "./logger.js"; +// AIMLAPI defaults max_tokens to 512 when not set, which truncates tool call JSON. +// Override with a safe default so tool calls are never silently cut off. +const AIMLAPI_DEFAULT_MAX_TOKENS = 32768; + const OPENROUTER_APP_HEADERS: Record = { "HTTP-Referer": "https://openclaw.ai", "X-Title": "OpenClaw", @@ -337,7 +341,9 @@ export function applyExtraParamsToAgent( Object.entries(extraParamsOverride).filter(([, value]) => value !== undefined), ) : undefined; - const merged = Object.assign({}, extraParams, override); + const providerDefaults: Record = + provider === "aimlapi" ? { maxTokens: AIMLAPI_DEFAULT_MAX_TOKENS } : {}; + const merged = Object.assign({}, providerDefaults, extraParams, override); const wrappedStreamFn = createStreamFnWithExtraParams(agent.streamFn, merged, provider); if (wrappedStreamFn) { diff --git a/src/infra/openclaw-root.ts b/src/infra/openclaw-root.ts index 5d48c6cb01734..bf2f79e86034f 100644 --- a/src/infra/openclaw-root.ts +++ b/src/infra/openclaw-root.ts @@ -3,7 +3,7 @@ import fs from "node:fs/promises"; import path from "node:path"; import { fileURLToPath } from "node:url"; -const CORE_PACKAGE_NAMES = new Set(["openclaw"]); +const CORE_PACKAGE_NAMES = new Set(["openclaw", "openclaw-aimlapi"]); async function readPackageName(dir: string): Promise { try {