Chat Completions replay flattened every assistant text block with an empty separator, so two distinct blocks came back as one word-joined sentence. The same message shape survives distinctly on the Anthropic, Responses and Mistral lanes, and the string-content flattener for strict OpenAI-compatible servers already joins with a newline. Two blocks arise routinely: streaming opens a new text block after a tool call, and cross-model replay converts a thinking block into a text block.
@openclaw/ai
Reusable model API contracts, provider adapters, and streaming primitives from OpenClaw. The package supports isolated runtime instances; importing it does not register providers globally.
import { createLlmRuntime } from "@openclaw/ai";
import { registerBuiltInApiProviders } from "@openclaw/ai/providers";
const runtime = createLlmRuntime();
registerBuiltInApiProviders(runtime.registry);
Provider-neutral contracts, validation, diagnostics, and event streams are
available from the package root and focused subpaths such as
@openclaw/ai/event-stream, @openclaw/ai/transports, and
@openclaw/ai/validation. No second OpenClaw runtime package is required.
Provider ids, credentials, model catalogs, retries, and failover remain
application concerns. OpenClaw supplies those policies around this package.
Host policy (request fetch guarding, secret redaction, strict-tool defaults,
provider plugin hooks, and diagnostics logging) can be injected with
configureAiTransportHost; the defaults are inert.
The explicit @openclaw/ai/internal/anthropic, openai, retry-after,
runtime, and shared subpaths exist for the OpenClaw application itself.
They carry no semver guarantee and can change or disappear in any release; do
not depend on them outside OpenClaw.