MCPcopy Index your code
hub / github.com/ben-vargas/ai-sdk-provider-codex-cli

github.com/ben-vargas/ai-sdk-provider-codex-cli @v1.2.2

Chat with this repo
repository ↗ · DeepWiki ↗ · release v1.2.2 ↗ · + Follow
558 symbols 1,543 edges 136 files 10 documented · 2% 1 cross-repo links updated 4d agov1.2.2 · 2026-06-11★ 65

Browse by type

Functions 414 Types & classes 144
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

AI SDK Provider for Codex CLI

npm version npm downloads License: MIT Node >= 18 AI SDK v6 Modules: ESM + CJS TypeScript PRs welcome Latest Release

A community provider for Vercel AI SDK v6 that integrates OpenAI's Codex CLI with current GPT models such as gpt-5.5, gpt-5.2, and gpt-5.1, plus Codex-specific slugs like gpt-5.3-codex, gpt-5.2-codex, *-codex-max, and *-codex-mini, using your ChatGPT Plus/Pro subscription.

This package ships two provider modes:

  • codexExec: non-interactive codex exec (spawn a new process per call)
  • codexAppServer: persistent codex app-server JSON-RPC client (shared process, true delta streaming, optional stateful threads)

  • Works with generateText, streamText, and generateObject

  • Uses ChatGPT OAuth from codex login (tokens in ~/.codex/auth.json) or OPENAI_API_KEY
  • Node-only (spawns a local process); supports CI and local dev
  • v1.0.0: AI SDK v6 stable migration with LanguageModelV3 interface
  • v0.5.0: Adds comprehensive logging system with verbose mode and custom logger support
  • v0.3.0: Adds comprehensive tool streaming support for monitoring autonomous tool execution

Version Compatibility

Provider Version AI SDK Version NPM Tag NPM Installation
1.x.x v6 latest npm i ai-sdk-provider-codex-cli ai@^6.0.0
0.x.x v5 ai-sdk-v5 npm i ai-sdk-provider-codex-cli@ai-sdk-v5 ai@^5.0.0

Installation

For AI SDK v6 (default)

  1. Install and authenticate Codex CLI
npm i -g @openai/codex
codex login   # or set OPENAI_API_KEY
  1. Install provider and AI SDK v6
npm i ai ai-sdk-provider-codex-cli

For AI SDK v5

npm i ai@^5.0.0 ai-sdk-provider-codex-cli@ai-sdk-v5

⚠️ Codex CLI Version: Requires the current stable Codex CLI 0.130.x for full support of both provider modes (codexExec and codexAppServer). This package pins its optional @openai/codex dependency to ^0.130.0, the latest non-alpha release validated for this maintenance update. If you supply your own Codex CLI (global install or custom codexPath), check it with codex --version and upgrade if needed.

bash npm i -g @openai/codex@latest

Quick Start

Exec provider (codexExec) — process-per-call

import { generateText } from 'ai';
import { codexExec } from 'ai-sdk-provider-codex-cli';

const model = codexExec('gpt-5.5', {
  allowNpx: true,
  skipGitRepoCheck: true,
  approvalMode: 'on-failure',
  sandboxMode: 'workspace-write',
});

const { text } = await generateText({
  model,
  prompt: 'Reply with a single word: hello.',
});
console.log(text);

App-server provider (createCodexAppServer) — persistent process

import { streamText } from 'ai';
import { createCodexAppServer } from 'ai-sdk-provider-codex-cli';

const provider = createCodexAppServer({
  defaultSettings: {
    minCodexVersion: '0.130.0',
    autoApprove: false,
    personality: 'pragmatic',
  },
});

const { textStream } = await streamText({
  model: provider('gpt-5.5'),
  prompt: 'Write two short lines of encouragement.',
});
for await (const chunk of textStream) process.stdout.write(chunk);

await provider.close();

App-server stateful threads (optional)

By default, codexAppServer is stateless (new ephemeral thread per call). To continue a prior conversation across calls, start a persistent thread and then pass its threadId in providerOptions['codex-app-server'].

import { generateText } from 'ai';
import { createCodexAppServer } from 'ai-sdk-provider-codex-cli';

const provider = createCodexAppServer();

const first = await generateText({
  model: provider('gpt-5.5'),
  prompt: 'Start a migration checklist.',
  providerOptions: {
    'codex-app-server': { threadMode: 'persistent' },
  },
});

const threadId = first.providerMetadata?.['codex-app-server']?.threadId;

const second = await generateText({
  model: provider('gpt-5.5'),
  prompt: 'Continue from step 2.',
  providerOptions: {
    'codex-app-server': { threadId },
  },
});

await provider.close();

Object generation (Zod)

import { generateObject } from 'ai';
import { z } from 'zod';
import { codexExec } from 'ai-sdk-provider-codex-cli';

const schema = z.object({ name: z.string(), age: z.number().int() });
const { object } = await generateObject({
  model: codexExec('gpt-5.5', { allowNpx: true, skipGitRepoCheck: true }),
  schema,
  prompt: 'Generate a small user profile.',
});
console.log(object);

Features

  • AI SDK v6 compatible (LanguageModelV3)
  • Dual provider architecture:
  • codexExec / createCodexExec for codex exec
  • codexAppServer / createCodexAppServer for codex app-server
  • Backward-compatible aliases: codexCli / createCodexCli map to exec mode
  • Streaming and non‑streaming
  • Configurable logging (v0.5.0+) - Verbose mode, custom loggers, or silent operation
  • Tool streaming support (v0.3.0+) - Monitor autonomous tool execution in real-time
  • Native JSON Schema support via --output-schema (API-enforced with strict: true)
  • JSON object generation with Zod schemas (100-200 fewer tokens per request vs prompt engineering)
  • Safe defaults for non‑interactive automation (on-failure, workspace-write, --skip-git-repo-check)
  • Fallback to npx @openai/codex when not on PATH (allowNpx)
  • Usage tracking from experimental JSON event format
  • Image support - Local binary images in both providers, plus remote HTTP/HTTPS image URLs in app-server mode

Image Support

The provider supports multimodal (image) inputs for vision-capable models:

import { generateText } from 'ai';
import { codexExec } from 'ai-sdk-provider-codex-cli';
import { readFileSync } from 'fs';

const model = codexExec('gpt-5.5', { allowNpx: true, skipGitRepoCheck: true });
const imageBuffer = readFileSync('./screenshot.png');

const { text } = await generateText({
  model,
  messages: [
    {
      role: 'user',
      content: [
        { type: 'text', text: 'What do you see in this image?' },
        { type: 'image', image: imageBuffer, mimeType: 'image/png' },
      ],
    },
  ],
});
console.log(text);

Supported image formats:

  • Base64 data URL (data:image/png;base64,...)
  • Base64 string (without data URL prefix)
  • Buffer / Uint8Array / ArrayBuffer

Remote image URLs:

  • codexExec mode: HTTP/HTTPS image URLs are not supported (provide binary/image data)
  • codexAppServer mode: HTTP/HTTPS image URLs are supported and forwarded to app-server as remote image inputs

Local image data is written to temporary files and passed to Codex CLI via --image (or app-server localImage). Temp files are automatically cleaned up after each request.

See examples/exec/image-support.mjs and examples/app-server/image-support.mjs for complete working examples.

Tool Streaming (v0.3.0+)

The provider supports comprehensive tool streaming, enabling real-time monitoring of Codex CLI's autonomous tool execution:

import { streamText } from 'ai';
import { codexExec } from 'ai-sdk-provider-codex-cli';

const result = await streamText({
  model: codexExec('gpt-5.5', { allowNpx: true, skipGitRepoCheck: true }),
  prompt: 'List files and count lines in the largest one',
});

for await (const part of result.fullStream) {
  if (part.type === 'tool-call') {
    console.log('🔧 Tool:', part.toolName);
  }
  if (part.type === 'tool-result') {
    console.log('✅ Result:', part.result);
  }
}

What you get:

  • Tool invocation events when Codex starts executing tools (exec, patch, web_search, mcp_tool_call)
  • Tool input tracking with full parameter visibility
  • Tool result events with complete output payloads
  • providerExecuted: true on all tool calls (Codex executes autonomously, app doesn't need to)

Current behavior:

  • codexExec: tool outputs are delivered in final tool-result events.
  • codexAppServer: when Codex emits tool output delta notifications, the provider surfaces tool-result parts with result.type === 'output-delta' during streaming.

See examples/exec/streaming-tool-calls.mjs, examples/exec/streaming-multiple-tools.mjs, and their app-server counterparts under examples/app-server/.

Logging Configuration (v0.5.0+)

Control logging verbosity and integrate with your observability stack:

import { codexExec } from 'ai-sdk-provider-codex-cli';

// Default: warn/error only (clean production output)
const model = codexExec('gpt-5.5', {
  allowNpx: true,
  skipGitRepoCheck: true,
});

// Verbose mode: enable debug/info logs for troubleshooting
const verboseModel = codexExec('gpt-5.5', {
  allowNpx: true,
  skipGitRepoCheck: true,
  verbose: true, // Shows all log levels
});

// Custom logger: integrate with Winston, Pino, Datadog, etc.
const customModel = codexExec('gpt-5.5', {
  allowNpx: true,
  skipGitRepoCheck: true,
  verbose: true,
  logger: {
    debug: (msg) => myLogger.debug('Codex:', msg),
    info: (msg) => myLogger.info('Codex:', msg),
    warn: (msg) => myLogger.warn('Codex:', msg),
    error: (msg) => myLogger.error('Codex:', msg),
  },
});

// Silent: disable all logging
const silentModel = codexExec('gpt-5.5', {
  allowNpx: true,
  skipGitRepoCheck: true,
  logger: false, // No logs at all
});

Log Levels:

  • debug: Detailed execution traces (verbose mode only)
  • info: General execution flow (verbose mode only)
  • warn: Warnings and misconfigurations (always shown)
  • error: Errors and failures (always shown)

Default Logger: Adds level tags [DEBUG], [INFO], [WARN], [ERROR] to console output. Use a custom logger or logger: false if you need different formatting.

See examples/exec/logging-*.mjs and examples/app-server/logging-*.mjs for complete examples, and docs/ai-sdk-v5/guide.md for detailed configuration.

Text Streaming behavior

codexExec mode: Incremental streaming is not currently available with codex exec --experimental-json.

The --experimental-json output format (introduced Sept 25, 2025) currently only emits item.completed events with full text content. Incremental streaming via item.updated or delta events is not yet implemented by OpenAI.

What this means in exec mode:

  • streamText() works functionally but delivers the entire response in a single chunk after generation completes
  • No incremental text deltas—you wait for the full response, then receive it all at once
  • The AI SDK's streaming interface is supported, but actual incremental streaming is not available

codexAppServer mode: supports true incremental text deltas via item/agentMessage/delta, so streamText() emits progressively as tokens arrive.

When OpenAI adds streaming support to codex exec --experimental-json, this provider will surface those deltas in exec mode as well.

Documentation

Authentication

  • Preferred: ChatGPT OAuth via codex login (stores tokens at ~/.codex/auth.json)
  • Alternative: export OPENAI_API_KEY in the provider’s env settings (forwarded to the spawned process)

Configuration (high level)

  • allowNpx: If true, falls back to npx -y @openai/codex when Codex is not on PATH
  • cwd: Working directory for Codex
  • addDirs: Extra directories Codex may read/write (repeats --add-dir)
  • Autonomy/sandbox:
  • fullAuto (equivalent to --full-auto)
  • dangerouslyBypassApprovalsAndSandbox (bypass approvals and sandbox; dangerous)
  • Otherwise the provider writes -c approval_policy=... and -c sandbox_mode=... for you; defaults to on-failure and workspace-write
  • skipGitRepoCheck: enable by default for CI/non‑repo contexts
  • color: always | never | auto
  • outputLastMessageFile: by default the provider sets a temp path and rea

Extension points exported contracts — how you extend this code

Core symbols most depended-on inside this repo

Shape

Function 212
Method 202
Interface 116
Class 28

Languages

TypeScript100%

Modules by API surface

src/app-server/rpc/client.ts57 symbols
src/app-server/protocol/types.ts49 symbols
src/exec-language-model.ts32 symbols
src/app-server/language-model.ts32 symbols
src/app-server/session.ts21 symbols
src/app-server/stream/turn-stream-controller.ts20 symbols
src/app-server/stream/emitter.ts17 symbols
src/app-server/types.ts16 symbols
src/app-server/stream/router.ts15 symbols
src/shared-utils.ts14 symbols
src/converters/prompt-converter.ts13 symbols
src/__tests__/app-server-language-model.test.ts13 symbols

Used by 1 indexed graphs manifest dependencies, hub-wide

For agents

$ claude mcp add ai-sdk-provider-codex-cli \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact

Ask about this repo answers extend the page