
























@@ -14,8 +14,10 @@ import {
1414function createAttemptParams(params: {
1515provider: string;
1616authProfileId?: string;
17+authProfileType?: "oauth" | "api_key";
1718authProfileProvider?: string;
1819authProfileProviders?: Record<string, string>;
20+runtimeExternalProfileIds?: string[];
1921bootstrapContextMode?: "full" | "lightweight";
2022bootstrapContextRunKind?: "default" | "heartbeat" | "cron";
2123images?: EmbeddedRunAttemptParams["images"];
@@ -25,6 +27,7 @@ function createAttemptParams(params: {
2527(params.authProfileId
2628 ? { [params.authProfileId]: params.authProfileProvider ?? "openai" }
2729 : {});
30+const authProfileType = params.authProfileType ?? "oauth";
2831return {
2932provider: params.provider,
3033modelId: "gpt-5.4",
@@ -40,15 +43,24 @@ function createAttemptParams(params: {
4043profiles: Object.fromEntries(
4144Object.entries(authProfileProviders).map(([profileId, provider]) => [
4245profileId,
43-{
44-type: "oauth" as const,
45- provider,
46-access: "access-token",
47-refresh: "refresh-token",
48-expires: Date.now() + 60_000,
49-},
46+authProfileType === "api_key"
47+ ? {
48+type: "api_key" as const,
49+ provider,
50+key: "sk-test",
51+}
52+ : {
53+type: "oauth" as const,
54+ provider,
55+access: "access-token",
56+refresh: "refresh-token",
57+expires: Date.now() + 60_000,
58+},
5059]),
5160),
61+ ...(params.runtimeExternalProfileIds
62+ ? { runtimeExternalProfileIds: params.runtimeExternalProfileIds }
63+ : {}),
5264},
5365} as EmbeddedRunAttemptParams;
5466}
@@ -578,7 +590,11 @@ describe("Codex app-server model provider selection", () => {
578590"omits public %s modelProvider when forwarding native Codex auth on thread/start",
579591(provider) => {
580592const request = buildThreadStartParams(
581-createAttemptParams({ provider, authProfileId: "work" }),
593+createAttemptParams({
594+ provider,
595+authProfileId: "work",
596+runtimeExternalProfileIds: ["work"],
597+}),
582598{
583599cwd: "/repo",
584600dynamicTools: [],
@@ -596,6 +612,7 @@ describe("Codex app-server model provider selection", () => {
596612createAttemptParams({
597613provider: "openai",
598614authProfileProviders: { bound: "openai" },
615+runtimeExternalProfileIds: ["bound"],
599616}),
600617{
601618threadId: "thread-1",
@@ -613,6 +630,7 @@ describe("Codex app-server model provider selection", () => {
613630createAttemptParams({
614631provider: "openai",
615632authProfileId: "openai:work",
633+authProfileType: "api_key",
616634authProfileProvider: "openai",
617635}),
618636{
@@ -626,6 +644,24 @@ describe("Codex app-server model provider selection", () => {
626644expect(request.modelProvider).toBe("openai");
627645});
628646647+it("omits public OpenAI modelProvider for persisted Codex OAuth profiles", () => {
648+const request = buildThreadStartParams(
649+createAttemptParams({
650+provider: "openai",
651+authProfileId: "openai:work",
652+authProfileProvider: "openai",
653+}),
654+{
655+cwd: "/repo",
656+dynamicTools: [],
657+appServer: createAppServerOptions() as never,
658+developerInstructions: "test instructions",
659+},
660+);
661+662+expect(request).not.toHaveProperty("modelProvider");
663+});
664+629665it("keeps public OpenAI modelProvider when no native Codex auth profile is selected", () => {
630666const request = buildThreadStartParams(createAttemptParams({ provider: "openai" }), {
631667cwd: "/repo",
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。