Codex
- openai/codex
- Apache-2.0, Rust, Coding Agent
- OpenAI 的 coding agent,提供 CLI、IDE 集成、App 与 app-server/exec-server 协议边界。
Codex 将 user turn 放入 thread,由 turn loop 构造上下文、请求模型、调用工具,并把结果回填到后续上下文和 rollout history。
Runtime
client
│ submit turn
▼
thread / session
│
▼
turn loop
├── build context
├── model response
├── tool calls
├── approval / sandbox
├── update history
└── emit events
- Session 使用 Submission Queue 接收 turn,使用 Event Queue 输出进度和结果。
run_turn()负责单个 turn 的模型请求、工具调用、上下文更新、hook、skill 和 compact 编排。- Rollout history 是可恢复的运行记录,不等同于模型当前可见的完整上下文。
Instructions
- Base instructions、developer instructions、environment、tools、skills 和 plugins 作为不同上下文来源组合到模型输入中。
AGENTS.md从 project root 到当前 working directory 依次加载;AGENTS.override.md用于本地覆盖。- untrusted project 不加载 project instructions,只保留 host 提供的用户指令。
- Skill 通过 manifest 和资源标识加载;skill 内容本身不会自动获得额外工具或文件权限。
Tools
type ToolResult = unknown;
/** 编码工作区工具。 */
interface BuiltinTools {
exec_command(input: {
command: string;
workdir?: string;
timeout_ms?: number;
shell?: string;
environment_id?: string;
}): ToolResult;
write_stdin(input: {
session_id: string;
chars?: string;
yield_time_ms?: number;
max_output_chars?: number;
environment_id?: string;
}): ToolResult;
apply_patch(input: { patch: string; environment_id?: string }): ToolResult;
view_image(input: { path: string; detail?: 'low' | 'high' | 'auto'; environment_id?: string }): ToolResult;
/** 任务计划;按功能开关启用。 */
update_plan(input: {
plan: Array<{
step: string;
status: 'pending' | 'in_progress' | 'completed';
}>;
}): ToolResult;
/** 向用户提出结构化问题;按功能开关启用。 */
request_user_input(input: {
questions: Array<{
id: string;
header: string;
question: string;
options?: Array<{
label: string;
description?: string;
}>;
}>;
}): ToolResult;
request_permissions(input: { permissions: string[]; reason?: string }): ToolResult;
get_context_remaining(input: {}): ToolResult;
new_context(input: {}): ToolResult;
wait_for_environment(input: { environment_id?: string }): ToolResult;
send_user_message_async(input: { message: string }): ToolResult;
list_mcp_resources(input: { server?: string }): ToolResult;
list_mcp_resource_templates(input: { server?: string }): ToolResult;
read_mcp_resource(input: { server?: string; uri: string }): ToolResult;
/** 搜索并加载延迟暴露的工具。 */
tool_search(input: { query?: string; namespaces?: string[] }): ToolResult;
list_available_plugins_to_install(input: {}): ToolResult;
request_plugin_install(input: { plugin?: string; source?: string }): ToolResult;
/** 测试或实验工具;按模型能力启用。 */
test_sync_tool(input: {
sleep_before_ms?: number;
sleep_after_ms?: number;
barrier?: {
id: string;
participants: number;
timeout_ms?: number;
};
wait_for_git_enrichment?: boolean;
}): ToolResult;
}
/** 以 clock namespace 暴露的工具。 */
interface ClockTools {
curr_time(input: {}): ToolResult;
sleep(input: { duration_ms: number }): ToolResult;
}
/** MCP server 工具名称由 server 和 tool 动态决定。 */
interface McpTools {
[toolName: string]: (input: Record<string, unknown>) => ToolResult;
}
/** Hosted web search 工具:web.run。 */
interface WebTools {
run(input: {
search_query?: Array<{
q: string;
recency?: number;
domains?: string[];
}>;
image_query?: Array<{
q: string;
recency?: number;
domains?: string[];
}>;
open?: Array<{
ref_id: string;
lineno?: number;
}>;
click?: Array<{
ref_id: string;
id: number;
}>;
find?: Array<{
ref_id: string;
pattern: string;
}>;
screenshot?: Array<{
ref_id: string;
pageno: number;
}>;
finance?: Array<{
ticker: string;
type: "equity" | "fund" | "crypto" | "index";
market?: string;
}>;
weather?: Array<{
location: string;
start?: string;
duration?: number;
}>;
sports?: Array<{
tool?: "sports";
fn: "schedule" | "standings";
league:
| "nba"
| "wnba"
| "nfl"
| "nhl"
| "mlb"
| "epl"
| "ncaamb"
| "ncaawb"
| "ipl";
team?: string;
opponent?: string;
date_from?: string;
date_to?: string;
num_games?: number;
locale?: string;
}>;
time?: Array<{
utc_offset: string;
}>;
response_length?: "short" | "medium" | "long";
}): ToolResult;
}
/** Hosted 图像生成工具:image_gen.imagegen。 */
interface ImageGenerationTools {
imagegen(input: {
prompt: string;
referenced_image_paths?: string[];
num_last_images_to_include?: number;
}): ToolResult;
}
/** Multi-agent v1 和 v2 工具。 */
interface CollaborationTools {
spawn_agent(input: { task: string; model?: string; agent_type?: string }): ToolResult;
send_input(input: { agent_id: string; message: string }): ToolResult;
resume_agent(input: { agent_id: string }): ToolResult;
wait_agent(input: { agent_id: string }): ToolResult;
close_agent(input: { agent_id: string }): ToolResult;
send_message(input: { agent_id: string; message: string }): ToolResult;
followup_task(input: { agent_id: string; task: string }): ToolResult;
interrupt_agent(input: { agent_id: string }): ToolResult;
list_agents(input: {}): ToolResult;
}
/** Code Mode 对外暴露的工具。 */
interface CodeModeTools {
exec(source: string): ToolResult;
wait(input: {
cell_id: string;
yield_time_ms?: number;
max_tokens?: number;
terminate?: boolean;
}): ToolResult;
}
/** 已知的可选扩展工具。 */
interface ExtensionTools {
'skills.list'(input: { authority: 'orchestrator' | 'executor'; cursor?: string }): ToolResult;
'skills.read'(input: { package: string; resource?: string; cursor?: string }): ToolResult;
'memories.list'(input: { path?: string; cursor?: string; max_results?: number }): ToolResult;
'memories.read'(input: { path: string; line_offset?: number; max_lines?: number }): ToolResult;
'memories.search'(input: {
queries: string[];
match_mode?: 'any' | 'all_on_same_line' | { type: 'all_within_lines'; line_count: number };
path?: string;
cursor?: string;
context_lines?: number;
case_sensitive?: boolean;
normalized?: boolean;
max_results?: number;
}): ToolResult;
'memories.add_ad_hoc_note'(input: { filename: string; note: string }): ToolResult;
}
/** 持久化 thread goal 工具;使用 default namespace。 */
interface GoalTools {
get_goal(input: {}): ToolResult;
create_goal(input: { objective: string; token_budget?: number }): ToolResult;
update_goal(input: { status: 'complete' | 'blocked' }): ToolResult;
}
Sandbox And Approval
type SandboxPolicy =
| { type: 'danger-full-access' }
| { type: 'read-only'; filesystem: unknown; network: unknown }
| { type: 'workspace-write'; writable_roots: string[]; network: unknown }
| { type: 'external-sandbox'; executor: 'external' };
type AskForApproval = 'never' | 'on-request' | 'unless-trusted' | { type: 'granular'; rules: unknown[] };
- sandbox 定义执行环境的文件系统和网络边界;approval 定义何时需要用户授权。
- 获得 approval 不自动扩大 sandbox;
ExternalSandbox表示隔离由外部 executor 提供和强制。 - 工具权限不能只依赖工具描述中的自然语言,必须由 policy、guardian 或 executor 处理。
Compact And Persistence
- compact 使用 summarization prompt 生成摘要 checkpoint,并替换 live model history。
- pre-turn/manual compact 和 mid-turn compact 对 initial context、summary 和最后一条 user message 的排列要求不同。
- rollout 的物理压缩只减少持久化体积;context compact 会改变后续 inference 使用的 live history。
Design Notes
- Thread/rollout 是 durable execution trace,当前 context 是受 token 上限控制的模型输入投影。
AGENTS.md、Skills、plugins、tool specs、sandbox policy 和 approval policy 各自拥有独立 authority。- app-server/exec-server 是公开协议 surface;experimental 方法、字段和 raw response item 不应假定兼容性。