+
+
+
Key Status
+
{keyStatus.description}
+
+
{keyStatus.label}
+
+
+
Interactive Authentication
+
+ Click connect, sign in with OpenAI, and enter the verification code shown here. Bifrost stores the resulting Codex credentials for
+ you.
+
+
+ {!isEditing ? (
+
+ Ready to connect
+
+ Click connect below. If this is a new key, Bifrost will save the draft automatically before opening the sign-in link and code
+ flow.
+
+
+ ) : null}
+
+ void beginDeviceFlow()}
+ disabled={isStartingDevice}
+ data-testid="codex-connect-btn"
+ >
+ {isStartingDevice ? : null}
+ {isConnected ? "Reconnect with OpenAI" : "Connect with OpenAI"}
+
+
+ {isConnected ?
This key already has Codex credentials configured.
: null}
+
+
setIsOpen(open)}>
+
+
+ Connect ChatGPT Plus/Pro
+ Open the verification link, sign in, then enter the code below on the OpenAI page.
+
+
+
+ {session?.verification_uri ? (
+
+ ) : null}
+
+ {session?.user_code ? (
+
+
Step 2: Enter this code
+
+
+ ) : null}
+
+
+ Status: {session?.status ?? "pending"}
+ {statusMessage ?
{statusMessage}
: null}
+
+
+
+
+ {session?.status === "pending" ? (
+ void handleCancel()}>
+ Cancel authorization
+
+ ) : null}
+
+ Close
+
+
+
+
+
+ );
+}
diff --git a/ui/app/workspace/providers/fragments/index.ts b/ui/app/workspace/providers/fragments/index.ts
index 9f6d506fe2..cb8bcc9779 100644
--- a/ui/app/workspace/providers/fragments/index.ts
+++ b/ui/app/workspace/providers/fragments/index.ts
@@ -1,5 +1,6 @@
export { AllowedRequestsFields } from "./allowedRequestsFields";
export { BetaHeadersFormFragment } from "./betaHeadersFormFragment";
+export { CodexAuthControls } from "./codexAuthControls";
export { ApiKeyFormFragment } from "./apiKeysFormFragment";
export { ApiStructureFormFragment } from "./apiStructureFormFragment";
export { DebuggingFormFragment } from "./debuggingFormFragment";
diff --git a/ui/app/workspace/providers/views/providerKeyForm.tsx b/ui/app/workspace/providers/views/providerKeyForm.tsx
index f9a550fc83..8885c12ed1 100644
--- a/ui/app/workspace/providers/views/providerKeyForm.tsx
+++ b/ui/app/workspace/providers/views/providerKeyForm.tsx
@@ -3,7 +3,7 @@ import { ConfigSyncAlert } from "@/components/ui/configSyncAlert";
import { Form } from "@/components/ui/form";
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip";
import { getErrorMessage, useUpdateProviderMutation } from "@/lib/store";
-import { ModelProvider } from "@/lib/types/config";
+import { DefaultCodexKeyConfig, ModelProvider } from "@/lib/types/config";
import { modelProviderKeySchema } from "@/lib/types/schemas";
import { zodResolver } from "@hookform/resolvers/zod";
import { Save } from "lucide-react";
@@ -30,6 +30,7 @@ type ProviderKeyFormValues = z.infer