feat(codex): xAI (Grok) OAuth managed provider with native Responses compat

Add a managed "xAI (Grok) OAuth" Codex provider that routes through the
local proxy to api.x.ai via the shared Grok CLI OAuth identity, plus the
native-Responses compatibility layer that makes Codex 0.142+ traffic work
against xAI's strict upstream serde parser.

Provider:
- codex.rs: recognize the xai_oauth placeholder in extract_auth, hard-pin
  the base URL to api.x.ai and the tool profile to native Responses
- forwarder.rs: treat xAI OAuth auth failures as non-retryable
- presets + ProviderForm/CodexFormFields: managed OAuth preset that hides
  the api key/endpoint fields and derives the provider type across apps

Native Responses compatibility (gated on is_xai_oauth, so no other
provider is affected):
- transform_codex_responses_namespace: flatten Codex's private
  namespace/plugin tool declarations into top-level function tools on the
  request; restore the flat function_call names back to {name, namespace}
  on the response (streaming and non-streaming) so the client matches its
  own namespaced tool registry
- transform_codex_responses_xai_sanitize: strip the OpenAI-backend-private
  fields xAI rejects (external_web_access, prompt_cache_retention,
  safety_identifier, the additional_tools carrier, tool_search, ...) with
  deterministic removals that keep the prompt-cache prefix stable
- wire both into the native passthrough after the request transform;
  response restore runs in a dedicated handler so the generic passthrough
  hot path is untouched

Ports the proven approach of sub2api's Grok Responses gateway. Verified
with a 4-round codex -> xAI OAuth workload: all tasks green, zero upstream
errors.
This commit is contained in:
Jason
2026-07-20 23:50:24 +08:00
parent 8dcedbc062
commit dbb5bd1537
12 changed files with 1734 additions and 54 deletions
+27
View File
@@ -33,6 +33,10 @@ export interface CodexProviderPreset {
iconColor?: string; // 图标颜色
// Codex API 格式
apiFormat?: CodexApiFormat;
// 托管账号预设:目前仅 xAI OAuth(Grok 订阅经本地代理注入 token 直连 api.x.ai
providerType?: "xai_oauth";
// OAuth 预设:隐藏 API Key 输入,保存前要求已登录托管账号
requiresOAuth?: boolean;
// Codex Chat 本地路由模式下的模型目录
modelCatalog?: CodexCatalogModel[];
// Codex Responses -> Chat Completions reasoning capability defaults
@@ -1023,6 +1027,29 @@ requires_openai_auth = true`,
icon: "xai",
iconColor: "#000000",
},
{
name: "xAI (Grok) OAuth",
websiteUrl: "https://x.ai/grok",
auth: generateThirdPartyAuth(""),
// 托管 OAuth:真实 token 由本地代理按请求注入,CodexAdapter 硬定向
// api.x.ai;这里的 base_url / 空 auth 只是配置快照,转发时不生效。
config: generateThirdPartyConfig("xai", "https://api.x.ai/v1", "grok-4.5"),
apiFormat: "openai_responses",
providerType: "xai_oauth",
requiresOAuth: true,
modelCatalog: modelCatalog([
{
model: "grok-4.5",
displayName: "Grok 4.5",
contextWindow: 500000,
supportsParallelToolCalls: true,
inputModalities: ["text", "image"],
},
]),
category: "third_party",
icon: "xai",
iconColor: "#000000",
},
{
name: "Nvidia",
websiteUrl: "https://build.nvidia.com",