Use your existing ChatGPT Plus or Pro subscription to access OpenAI’s Codex models without consuming API credits. The SDK handles OAuth authentication, credential caching, and automatic token refresh.
The LLM.subscription_login() class method handles the entire authentication flow:
Copy
Ask AI
from openhands.sdk import LLMllm = LLM.subscription_login(vendor="openai", model="gpt-5.2-codex")
On first run, this opens your browser for OAuth authentication with OpenAI. After successful login, credentials are cached locally in ~/.openhands/auth/ for future use.
"""Example: Using ChatGPT subscription for Codex models.This example demonstrates how to use your ChatGPT Plus/Pro subscriptionto access OpenAI's Codex models without consuming API credits.The subscription_login() method handles:- OAuth PKCE authentication flow- Credential caching (~/.openhands/auth/)- Automatic token refreshSupported models:- gpt-5.2-codex- gpt-5.2- gpt-5.1-codex-max- gpt-5.1-codex-miniRequirements:- Active ChatGPT Plus or Pro subscription- Browser access for initial OAuth login"""import osfrom openhands.sdk import LLM, Agent, Conversation, Toolfrom openhands.tools.file_editor import FileEditorToolfrom openhands.tools.terminal import TerminalTool# First time: Opens browser for OAuth login# Subsequent calls: Reuses cached credentials (auto-refreshes if expired)llm = LLM.subscription_login( vendor="openai", model="gpt-5.2-codex", # or "gpt-5.2", "gpt-5.1-codex-max", "gpt-5.1-codex-mini")# Alternative: Force a fresh login (useful if credentials are stale)# llm = LLM.subscription_login(vendor="openai", model="gpt-5.2-codex", force_login=True)# Alternative: Disable auto-opening browser (prints URL to console instead)# llm = LLM.subscription_login(# vendor="openai", model="gpt-5.2-codex", open_browser=False# )# Verify subscription mode is activeprint(f"Using subscription mode: {llm.is_subscription}")# Use the LLM with an agent as usualagent = Agent( llm=llm, tools=[ Tool(name=TerminalTool.name), Tool(name=FileEditorTool.name), ],)cwd = os.getcwd()conversation = Conversation(agent=agent, workspace=cwd)conversation.send_message("List the files in the current directory.")conversation.run()print("Done!")
You can run the example code as-is.
The model name should follow the LiteLLM convention: provider/model_name (e.g., anthropic/claude-sonnet-4-5-20250929, openai/gpt-4o).
The LLM_API_KEY should be the API key for your chosen provider.
ChatGPT Plus/Pro subscribers: You can use LLM.subscription_login() to authenticate with your ChatGPT account and access Codex models without consuming API credits. See the LLM Subscriptions guide for details.