mirror of
https://github.com/openclaw/openclaw.git
synced 2026-06-27 04:09:32 +00:00
Repairs a batch of narrow model/provider edge cases:
- honor OpenAI and Anthropic base URL environment overrides when provider config does not set an explicit base URL
- preserve OpenRouter Anthropic cache retention while stripping unsupported transport options
- allow apply_patch for non-OpenAI providers when the tool config otherwise permits it
- prune stale same-provider model selections from configure/model picker state
- expose GitHub Copilot bundled thinking policy metadata to offline/provider-policy lookups
- repair additive SQLite shared-state upgrades for existing databases
- keep same-size rotated log readers from reusing stale content in CI tooling
Proof:
- GitHub PR checks green on exact head 46514909b0
- Crabbox delegated Blacksmith Testbox tbx_01kt3em5r9vd7g0bnykrff6jdk exited 0
- Focused local Vitest/oxlint/format proof recorded in PR body and land-ready comment
Fixes #80347.
Fixes #88357.
Fixes #45269.
Supersedes #74427, #74432, #79370, #79894, #80366, and #88359.
71 lines
3.3 KiB
TypeScript
71 lines
3.3 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import {
|
|
canonicalizeCodexResponsesBaseUrl,
|
|
isOpenAIApiBaseUrl,
|
|
isOpenAICodexBaseUrl,
|
|
OPENAI_API_BASE_URL,
|
|
OPENAI_CODEX_RESPONSES_BASE_URL,
|
|
resolveOpenAIDefaultBaseUrl,
|
|
} from "./base-url.js";
|
|
|
|
describe("openai base URL helpers", () => {
|
|
it("recognizes direct OpenAI API routes", () => {
|
|
expect(isOpenAIApiBaseUrl("https://api.openai.com")).toBe(true);
|
|
expect(isOpenAIApiBaseUrl("https://api.openai.com/v1")).toBe(true);
|
|
expect(isOpenAIApiBaseUrl("https://api.openai.com/v1/")).toBe(true);
|
|
});
|
|
|
|
it("rejects proxy or unrelated API routes", () => {
|
|
expect(isOpenAIApiBaseUrl("https://proxy.example.com/v1")).toBe(false);
|
|
expect(isOpenAIApiBaseUrl("https://chatgpt.com/backend-api")).toBe(false);
|
|
expect(isOpenAIApiBaseUrl(undefined)).toBe(false);
|
|
});
|
|
|
|
it("recognizes Codex ChatGPT backend routes", () => {
|
|
// New canonical form (includes /codex segment; OpenAI removed the
|
|
// /backend-api/responses alias server-side on 2026-04).
|
|
expect(isOpenAICodexBaseUrl("https://chatgpt.com/backend-api/codex")).toBe(true);
|
|
expect(isOpenAICodexBaseUrl("https://chatgpt.com/backend-api/codex/")).toBe(true);
|
|
expect(isOpenAICodexBaseUrl("https://chatgpt.com/backend-api/codex/v1")).toBe(true);
|
|
expect(isOpenAICodexBaseUrl("https://chatgpt.com/backend-api/codex/v1/")).toBe(true);
|
|
// Legacy form still recognized as a Codex baseURL for backward
|
|
// compatibility with existing user configs.
|
|
expect(isOpenAICodexBaseUrl("https://chatgpt.com/backend-api")).toBe(true);
|
|
expect(isOpenAICodexBaseUrl("https://chatgpt.com/backend-api/")).toBe(true);
|
|
expect(isOpenAICodexBaseUrl("https://chatgpt.com/backend-api/v1")).toBe(true);
|
|
expect(isOpenAICodexBaseUrl("https://chatgpt.com/backend-api/v1/")).toBe(true);
|
|
});
|
|
|
|
it("rejects non-Codex backend routes", () => {
|
|
expect(isOpenAICodexBaseUrl("https://api.openai.com/v1")).toBe(false);
|
|
expect(isOpenAICodexBaseUrl("https://chatgpt.com")).toBe(false);
|
|
expect(isOpenAICodexBaseUrl("https://chatgpt.com/backend-api/v2")).toBe(false);
|
|
expect(isOpenAICodexBaseUrl("https://chatgpt.com/backend-api/codex/v2")).toBe(false);
|
|
expect(isOpenAICodexBaseUrl(undefined)).toBe(false);
|
|
});
|
|
|
|
it("canonicalizes legacy Codex Responses base URLs", () => {
|
|
expect(canonicalizeCodexResponsesBaseUrl("https://chatgpt.com/backend-api")).toBe(
|
|
OPENAI_CODEX_RESPONSES_BASE_URL,
|
|
);
|
|
expect(canonicalizeCodexResponsesBaseUrl("https://chatgpt.com/backend-api/v1")).toBe(
|
|
OPENAI_CODEX_RESPONSES_BASE_URL,
|
|
);
|
|
expect(canonicalizeCodexResponsesBaseUrl("https://chatgpt.com/backend-api/codex/v1")).toBe(
|
|
OPENAI_CODEX_RESPONSES_BASE_URL,
|
|
);
|
|
expect(canonicalizeCodexResponsesBaseUrl("https://proxy.example.com/v1")).toBe(
|
|
"https://proxy.example.com/v1",
|
|
);
|
|
expect(canonicalizeCodexResponsesBaseUrl(undefined)).toBeUndefined();
|
|
});
|
|
|
|
it("resolves default API base URL from OPENAI_BASE_URL", () => {
|
|
expect(resolveOpenAIDefaultBaseUrl({})).toBe(OPENAI_API_BASE_URL);
|
|
expect(resolveOpenAIDefaultBaseUrl({ OPENAI_BASE_URL: " " })).toBe(OPENAI_API_BASE_URL);
|
|
expect(resolveOpenAIDefaultBaseUrl({ OPENAI_BASE_URL: " https://proxy.example/v1 " })).toBe(
|
|
"https://proxy.example/v1",
|
|
);
|
|
});
|
|
});
|