mirror of
https://github.com/openclaw/openclaw.git
synced 2026-03-12 07:20:45 +00:00
fix: normalize stale openai completions transport
This commit is contained in:
@@ -54,9 +54,33 @@ function normalizeOpenAICodexTransport(params: {
|
||||
} as Model<Api>;
|
||||
}
|
||||
|
||||
function normalizeOpenAITransport(params: { provider: string; model: Model<Api> }): Model<Api> {
|
||||
if (normalizeProviderId(params.provider) !== "openai") {
|
||||
return params.model;
|
||||
}
|
||||
|
||||
const useResponsesTransport =
|
||||
params.model.api === "openai-completions" &&
|
||||
(!params.model.baseUrl || isOpenAIApiBaseUrl(params.model.baseUrl));
|
||||
|
||||
if (!useResponsesTransport) {
|
||||
return params.model;
|
||||
}
|
||||
|
||||
return {
|
||||
...params.model,
|
||||
api: "openai-responses",
|
||||
} as Model<Api>;
|
||||
}
|
||||
|
||||
export function normalizeResolvedProviderModel(params: {
|
||||
provider: string;
|
||||
model: Model<Api>;
|
||||
}): Model<Api> {
|
||||
return normalizeModelCompat(normalizeOpenAICodexTransport(params));
|
||||
const normalizedOpenAI = normalizeOpenAITransport(params);
|
||||
const normalizedCodex = normalizeOpenAICodexTransport({
|
||||
provider: params.provider,
|
||||
model: normalizedOpenAI,
|
||||
});
|
||||
return normalizeModelCompat(normalizedCodex);
|
||||
}
|
||||
|
||||
@@ -518,6 +518,54 @@ describe("resolveModel", () => {
|
||||
});
|
||||
});
|
||||
|
||||
it("normalizes stale native openai gpt-5.4 completions transport to responses", () => {
|
||||
mockDiscoveredModel({
|
||||
provider: "openai",
|
||||
modelId: "gpt-5.4",
|
||||
templateModel: buildForwardCompatTemplate({
|
||||
id: "gpt-5.4",
|
||||
name: "GPT-5.4",
|
||||
provider: "openai",
|
||||
api: "openai-completions",
|
||||
baseUrl: "https://api.openai.com/v1",
|
||||
}),
|
||||
});
|
||||
|
||||
const result = resolveModel("openai", "gpt-5.4", "/tmp/agent");
|
||||
|
||||
expect(result.error).toBeUndefined();
|
||||
expect(result.model).toMatchObject({
|
||||
provider: "openai",
|
||||
id: "gpt-5.4",
|
||||
api: "openai-responses",
|
||||
baseUrl: "https://api.openai.com/v1",
|
||||
});
|
||||
});
|
||||
|
||||
it("keeps proxied openai completions transport untouched", () => {
|
||||
mockDiscoveredModel({
|
||||
provider: "openai",
|
||||
modelId: "gpt-5.4",
|
||||
templateModel: buildForwardCompatTemplate({
|
||||
id: "gpt-5.4",
|
||||
name: "GPT-5.4",
|
||||
provider: "openai",
|
||||
api: "openai-completions",
|
||||
baseUrl: "https://proxy.example.com/v1",
|
||||
}),
|
||||
});
|
||||
|
||||
const result = resolveModel("openai", "gpt-5.4", "/tmp/agent");
|
||||
|
||||
expect(result.error).toBeUndefined();
|
||||
expect(result.model).toMatchObject({
|
||||
provider: "openai",
|
||||
id: "gpt-5.4",
|
||||
api: "openai-completions",
|
||||
baseUrl: "https://proxy.example.com/v1",
|
||||
});
|
||||
});
|
||||
|
||||
it("builds an anthropic forward-compat fallback for claude-opus-4-6", () => {
|
||||
mockDiscoveredModel({
|
||||
provider: "anthropic",
|
||||
|
||||
Reference in New Issue
Block a user