import type { Model } from
"@mariozechner/pi-ai" ;
import { beforeAll, beforeEach, describe, expect, it, vi } from
"vitest" ;
import type { OpenClawConfig } from
"../config/config.js" ;
const createAnthropicVertexStreamFnForModel = vi.fn();
const ensureCustomApiRegistered = vi.fn();
const resolveProviderStreamFn = vi.fn();
const buildTransportAwareSimpleStreamFn = vi.fn();
const prepareTransportAwareSimpleModel = vi.fn();
vi.mock(
"./anthropic-vertex-stream.js" , () => ({
createAnthropicVertexStreamFnForModel,
}));
vi.mock(
"./custom-api-registry.js" , () => ({
ensureCustomApiRegistered,
}));
vi.mock(
"./provider-transport-stream.js" , () => ({
buildTransportAwareSimpleStreamFn,
prepareTransportAwareSimpleModel,
}));
vi.mock(
"../plugins/provider-runtime.js" , async () => {
const actual = await vi.importActual<
typeof import (
"../plugins/provider-runtime.js" )>(
"../plugins/provider-runtime.js" ,
);
return {
...actual,
resolveProviderStreamFn,
};
});
let prepareModelForSimpleCompletion:
typeof import (
"./simple-completion-transport.js" ).prepareModelForSimpleCompletion;
describe(
"prepareModelForSimpleCompletion" , () => {
beforeAll(async () => {
({ prepareModelForSimpleCompletion } = await
import (
"./simple-completion-transport.js" ));
});
beforeEach(() => {
createAnthropicVertexStreamFnForModel.mockReset();
ensureCustomApiRegistered.mockReset();
resolveProviderStreamFn.mockReset();
buildTransportAwareSimpleStreamFn.mockReset();
prepareTransportAwareSimpleModel.mockReset();
createAnthropicVertexStreamFnForModel.mockReturnValue(
"vertex-stream" );
resolveProviderStreamFn.mockReturnValue(
"ollama-stream" );
buildTransportAwareSimpleStreamFn.mockReturnValue(undefined);
prepareTransportAwareSimpleModel.mockImplementation((model) => model);
});
it(
"registers the configured Ollama transport and keeps the original api" , () => {
const model: Model<
"ollama" > = {
id:
"llama3" ,
name:
"Llama 3" ,
api:
"ollama" ,
provider:
"ollama" ,
baseUrl:
"http://localhost:11434 ",
reasoning:
false ,
input: [
"text" ],
cost: { input:
0 , output:
0 , cacheRead:
0 , cacheWrite:
0 },
contextWindow:
8192 ,
maxTokens:
4096 ,
headers: {},
};
const cfg: OpenClawConfig = {
models: {
providers: {
ollama: {
baseUrl:
"http://remote-ollama:11434 ",
models: [],
},
},
},
};
const result = prepareModelForSimpleCompletion({
model,
cfg,
});
expect(resolveProviderStreamFn).toHaveBeenCalledWith(
expect.objectContaining({
provider:
"ollama" ,
config: cfg,
context: expect.objectContaining({
provider:
"ollama" ,
modelId:
"llama3" ,
model,
}),
}),
);
expect(ensureCustomApiRegistered).toHaveBeenCalledWith(
"ollama" ,
"ollama-stream" )
;
expect(result).toBe(model);
});
it("uses a custom api alias for Anthropic Vertex simple completions" , () => {
const model: Model<"anthropic-messages" > = {
id: "claude-sonnet" ,
name: "Claude Sonnet" ,
api: "anthropic-messages" ,
provider: "anthropic-vertex" ,
baseUrl: "https://us-central1-aiplatform.googleapis.com ",
reasoning: true ,
input: ["text" ],
cost: { input: 0 , output: 0 , cacheRead: 0 , cacheWrite: 0 },
contextWindow: 200000 ,
maxTokens: 8192 ,
};
resolveProviderStreamFn.mockReturnValueOnce(undefined);
const result = prepareModelForSimpleCompletion({ model });
expect(createAnthropicVertexStreamFnForModel).toHaveBeenCalledWith(model);
expect(ensureCustomApiRegistered).toHaveBeenCalledWith(
"openclaw-anthropic-vertex-simple:https%3A%2F%2Fus-central1-aiplatform.googleapis.com" ,
"vertex-stream" ,
);
expect(result).toEqual({
...model,
api: "openclaw-anthropic-vertex-simple:https%3A%2F%2Fus-central1-aiplatform.googleapis.com" ,
});
});
it("uses a transport-aware custom api alias when llm request transport overrides are present" , () => {
const model: Model<"openai-responses" > = {
id: "gpt-5" ,
name: "GPT-5" ,
api: "openai-responses" ,
provider: "openai" ,
baseUrl: "https://api.openai.com/v1 ",
reasoning: true ,
input: ["text" ],
cost: { input: 0 , output: 0 , cacheRead: 0 , cacheWrite: 0 },
contextWindow: 200000 ,
maxTokens: 8192 ,
};
resolveProviderStreamFn.mockReturnValueOnce(undefined);
buildTransportAwareSimpleStreamFn.mockReturnValueOnce("transport-stream" );
prepareTransportAwareSimpleModel.mockReturnValueOnce({
...model,
api: "openclaw-openai-responses-transport" ,
});
const result = prepareModelForSimpleCompletion({ model });
expect(prepareTransportAwareSimpleModel).toHaveBeenCalledWith(model, { cfg: undefined });
expect(buildTransportAwareSimpleStreamFn).toHaveBeenCalledWith(model, { cfg: undefined });
expect(ensureCustomApiRegistered).toHaveBeenCalledWith(
"openclaw-openai-responses-transport" ,
"transport-stream" ,
);
expect(result).toEqual({
...model,
api: "openclaw-openai-responses-transport" ,
});
});
});
Messung V0.5 in Prozent C=98 H=100 G=98
¤ Dauer der Verarbeitung: 0.19 Sekunden
(vorverarbeitet am 2026-06-09)
¤
*© Formatika GbR, Deutschland