






















@@ -2,7 +2,7 @@ import type { OpenClawConfig } from "../config/types.openclaw.js";
22import { normalizeOptionalLowercaseString } from "../shared/string-coerce.js";
33import { normalizeEmbeddedAgentRuntime } from "./pi-embedded-runner/runtime.js";
44import { resolveProviderIdForAuth } from "./provider-auth-aliases.js";
5-import { normalizeProviderId } from "./provider-id.js";
5+import { findNormalizedProviderValue, normalizeProviderId } from "./provider-id.js";
6677export const OPENAI_PROVIDER_ID = "openai";
88export const OPENAI_CODEX_PROVIDER_ID = "openai-codex";
@@ -78,6 +78,20 @@ export function hasOpenAICodexAuthProfileOverride(value: unknown): boolean {
7878);
7979}
808081+function configuredOpenAIAuthOrderStartsWithCodexProfile(config: OpenClawConfig | undefined) {
82+if (!openAIProviderUsesCodexRuntimeByDefault({ provider: OPENAI_PROVIDER_ID, config })) {
83+return false;
84+}
85+const configuredOpenAIOrder = findNormalizedProviderValue(
86+config?.auth?.order,
87+OPENAI_PROVIDER_ID,
88+);
89+const firstProfile = configuredOpenAIOrder?.find(
90+(profileId) => typeof profileId === "string" && profileId.trim().length > 0,
91+);
92+return hasOpenAICodexAuthProfileOverride(firstProfile);
93+}
94+8195export function shouldRouteOpenAIPiThroughCodexAuthProvider(params: {
8296provider: string;
8397harnessRuntime?: string;
@@ -87,16 +101,16 @@ export function shouldRouteOpenAIPiThroughCodexAuthProvider(params: {
87101config?: OpenClawConfig;
88102workspaceDir?: string;
89103}): boolean {
90-if (
91-!isOpenAIProvider(params.provider) ||
92-!hasOpenAICodexAuthProfileOverride(params.authProfileId)
93-) {
104+if (!isOpenAIProvider(params.provider)) {
94105return false;
95106}
96107const runtime = normalizeEmbeddedAgentRuntime(params.agentHarnessId ?? params.harnessRuntime);
97108if (runtime !== "pi") {
98109return false;
99110}
111+if (!hasOpenAICodexAuthProfileOverride(params.authProfileId)) {
112+return false;
113+}
100114const aliasLookupParams = {
101115config: params.config,
102116workspaceDir: params.workspaceDir,
@@ -112,6 +126,7 @@ export function listOpenAIAuthProfileProvidersForAgentRuntime(params: {
112126provider: string;
113127harnessRuntime?: string;
114128agentHarnessId?: string;
129+config?: OpenClawConfig;
115130}): string[] {
116131if (!isOpenAIProvider(params.provider)) {
117132return [params.provider];
@@ -123,6 +138,9 @@ export function listOpenAIAuthProfileProvidersForAgentRuntime(params: {
123138return [OPENAI_CODEX_PROVIDER_ID];
124139}
125140if (runtime === "pi") {
141+if (configuredOpenAIAuthOrderStartsWithCodexProfile(params.config)) {
142+return [OPENAI_CODEX_PROVIDER_ID, OPENAI_PROVIDER_ID];
143+}
126144return [OPENAI_PROVIDER_ID, OPENAI_CODEX_PROVIDER_ID];
127145}
128146return [params.provider];
@@ -150,6 +168,27 @@ export function resolveOpenAIRuntimeProviderForPi(params: {
150168 : params.provider;
151169}
152170171+export function resolveSelectedOpenAIPiRuntimeProvider(params: {
172+provider: string;
173+harnessRuntime?: string;
174+agentHarnessId?: string;
175+authProfileProvider?: string;
176+authProfileId?: string;
177+config?: OpenClawConfig;
178+workspaceDir?: string;
179+}): string {
180+if (shouldRouteOpenAIPiThroughCodexAuthProvider(params)) {
181+return OPENAI_CODEX_PROVIDER_ID;
182+}
183+const runtime = normalizeEmbeddedAgentRuntime(params.agentHarnessId ?? params.harnessRuntime);
184+return isOpenAIProvider(params.provider) &&
185+runtime === "pi" &&
186+!params.authProfileId?.trim() &&
187+configuredOpenAIAuthOrderStartsWithCodexProfile(params.config)
188+ ? OPENAI_CODEX_PROVIDER_ID
189+ : params.provider;
190+}
191+153192export function resolveContextConfigProviderForRuntime(params: {
154193provider: string;
155194runtimeId?: string;
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。