mirror of
https://github.com/getcompanion-ai/co-mono.git
synced 2026-04-15 19:05:11 +00:00
feat(ai): add OpenAI Codex OAuth + responses provider
This commit is contained in:
parent
6ddfd1be13
commit
1650041a63
22 changed files with 2705 additions and 5 deletions
|
|
@ -156,6 +156,7 @@ Use `/login` to authenticate with subscription-based or free-tier providers:
|
|||
| GitHub Copilot | GPT-4o, Claude, Gemini via Copilot subscription | Subscription |
|
||||
| Google Gemini CLI | Gemini 2.0/2.5 models | Free (Google account) |
|
||||
| Google Antigravity | Gemini 3, Claude, GPT-OSS | Free (Google account) |
|
||||
| OpenAI Codex (ChatGPT Plus/Pro) | Codex models via ChatGPT subscription | Subscription |
|
||||
|
||||
```bash
|
||||
pi
|
||||
|
|
@ -173,8 +174,18 @@ pi
|
|||
- Antigravity uses a sandbox endpoint with access to Gemini 3, Claude (sonnet/opus thinking), and GPT-OSS models
|
||||
- Both are free with any Google account, subject to rate limits
|
||||
|
||||
**OpenAI Codex notes:**
|
||||
- Requires ChatGPT Plus/Pro OAuth (`/login openai-codex`)
|
||||
- Prompt cache stored under `~/.pi/agent/cache/openai-codex/`
|
||||
- Intended for personal use with your own subscription; not for resale or multi-user services. For production, use the OpenAI Platform API.
|
||||
|
||||
Credentials stored in `~/.pi/agent/auth.json`. Use `/logout` to clear.
|
||||
|
||||
**Troubleshooting (OAuth):**
|
||||
- **Port 1455 in use:** Close the conflicting process or paste the auth code/URL when prompted.
|
||||
- **Token expired / refresh failed:** Run `/login` again for the provider to refresh credentials.
|
||||
- **Usage limits (429):** Wait for the reset window; pi will surface a friendly message with the approximate retry time.
|
||||
|
||||
### Quick Start
|
||||
|
||||
```bash
|
||||
|
|
@ -525,7 +536,7 @@ Add custom models (Ollama, vLLM, LM Studio, etc.) via `~/.pi/agent/models.json`:
|
|||
}
|
||||
```
|
||||
|
||||
**Supported APIs:** `openai-completions`, `openai-responses`, `anthropic-messages`, `google-generative-ai`
|
||||
**Supported APIs:** `openai-completions`, `openai-responses`, `openai-codex-responses`, `anthropic-messages`, `google-generative-ai`
|
||||
|
||||
**API key resolution:** The `apiKey` field is checked as environment variable name first, then used as literal value.
|
||||
|
||||
|
|
@ -913,7 +924,7 @@ pi [options] [@files...] [messages...]
|
|||
|
||||
| Option | Description |
|
||||
|--------|-------------|
|
||||
| `--provider <name>` | Provider: `anthropic`, `openai`, `google`, `mistral`, `xai`, `groq`, `cerebras`, `openrouter`, `zai`, `github-copilot`, `google-gemini-cli`, `google-antigravity`, or custom |
|
||||
| `--provider <name>` | Provider: `anthropic`, `openai`, `openai-codex`, `google`, `mistral`, `xai`, `groq`, `cerebras`, `openrouter`, `zai`, `github-copilot`, `google-gemini-cli`, `google-antigravity`, or custom |
|
||||
| `--model <id>` | Model ID |
|
||||
| `--api-key <key>` | API key (overrides environment) |
|
||||
| `--system-prompt <text\|file>` | Custom system prompt (text or file path) |
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@ import {
|
|||
loginAntigravity,
|
||||
loginGeminiCli,
|
||||
loginGitHubCopilot,
|
||||
loginOpenAICodex,
|
||||
type OAuthCredentials,
|
||||
type OAuthProvider,
|
||||
} from "@mariozechner/pi-ai";
|
||||
|
|
@ -180,6 +181,9 @@ export class AuthStorage {
|
|||
case "google-antigravity":
|
||||
credentials = await loginAntigravity(callbacks.onAuth, callbacks.onProgress);
|
||||
break;
|
||||
case "openai-codex":
|
||||
credentials = await loginOpenAICodex(callbacks);
|
||||
break;
|
||||
default:
|
||||
throw new Error(`Unknown OAuth provider: ${provider}`);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -34,6 +34,7 @@ const ModelDefinitionSchema = Type.Object({
|
|||
Type.Union([
|
||||
Type.Literal("openai-completions"),
|
||||
Type.Literal("openai-responses"),
|
||||
Type.Literal("openai-codex-responses"),
|
||||
Type.Literal("anthropic-messages"),
|
||||
Type.Literal("google-generative-ai"),
|
||||
]),
|
||||
|
|
@ -59,6 +60,7 @@ const ProviderConfigSchema = Type.Object({
|
|||
Type.Union([
|
||||
Type.Literal("openai-completions"),
|
||||
Type.Literal("openai-responses"),
|
||||
Type.Literal("openai-codex-responses"),
|
||||
Type.Literal("anthropic-messages"),
|
||||
Type.Literal("google-generative-ai"),
|
||||
]),
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ import type { ModelRegistry } from "./model-registry.js";
|
|||
export const defaultModelPerProvider: Record<KnownProvider, string> = {
|
||||
anthropic: "claude-sonnet-4-5",
|
||||
openai: "gpt-5.1-codex",
|
||||
"openai-codex": "gpt-5.2-codex",
|
||||
google: "gemini-2.5-pro",
|
||||
"google-gemini-cli": "gemini-2.5-pro",
|
||||
"google-antigravity": "gemini-3-pro-high",
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue