python-codex 0.1.0__py3-none-any.whl → 0.1.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,267 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: python-codex
3
- Version: 0.1.0
4
- Summary: A minimal Python extraction of Codex's main agent loop
5
- License-File: LICENSE
6
- Requires-Python: >=3.10
7
- Requires-Dist: debugpy>=1.8.20
8
- Requires-Dist: fastapi>=0.115
9
- Requires-Dist: loguru>=0.7.3
10
- Requires-Dist: prompt-toolkit>=3.0
11
- Requires-Dist: requests>=2.31
12
- Requires-Dist: tomli>=2.0; python_version < '3.11'
13
- Requires-Dist: uvicorn>=0.32
14
- Description-Content-Type: text/markdown
15
-
16
- # pycodex
17
-
18
- PyPI distribution name: `python-codex`
19
- Import path and CLI command remain `pycodex`.
20
-
21
- 这个仓库把上游 Codex(`https://github.com/openai/codex`)里最核心的 agent
22
- 闭环先抽成一个尽量小的 Python 版本,重点保留两层结构:
23
-
24
- - `submission_loop`:顺序消费提交的操作。
25
- - `run_turn`:在单个 turn 内持续执行 `模型采样 -> 工具调用 -> 把工具结果喂回模型`,直到拿到最终回答。
26
-
27
- 对应的 Rust 参考点:
28
-
29
- - `codex-rs/core/src/codex.rs` 里的 `submission_loop`
30
- - `codex-rs/core/src/codex.rs` 里的 `run_turn`
31
- - `codex-rs/core/src/codex.rs` 里的 `run_sampling_request`
32
- - `codex-rs/core/src/tools/router.rs` 里的 `ToolRouter`
33
- - `codex-rs/core/src/stream_events_utils.rs` 里的 `handle_output_item_done`
34
-
35
- ## 快速开始
36
-
37
- 先安装开发依赖:
38
-
39
- ```bash
40
- uv sync
41
- ```
42
-
43
- 试一下真实入口:
44
-
45
- ```bash
46
- uv run pycodex "Reply with exactly OK."
47
- uv run pycodex
48
- ```
49
-
50
- ## 设计取舍
51
-
52
- 这里不是对 Rust 版本做 1:1 移植,而是先收敛到一个最小可复用内核:
53
-
54
- 1. 用一个很薄的 `ModelClient` 协议抽象模型侧。
55
- 2. 用 `ToolRegistry` 管理工具规格和执行器。
56
- 3. 用 `AgentLoop` 实现核心闭环。
57
- 4. 用 `AgentRuntime` 保留外层提交队列,方便以后继续对齐 Rust 的 `submission_loop`。
58
-
59
- 暂时刻意不包含:
60
-
61
- - TUI / 流式增量渲染
62
- - MCP / connectors / sandbox / approvals
63
- - memory / compact / hooks / review mode
64
- - 真实 OpenAI 适配器
65
-
66
- 这些都可以后续继续往上叠,但当前项目先把最核心的“工具增强推理主循环”钉住。
67
-
68
- ## 目录
69
-
70
- - `pycodex/protocol.py`:最小的会话 item / prompt / event 协议
71
- - `pycodex/model.py`:模型客户端协议和 Responses API 适配器
72
- - `pycodex/cli.py`:`pycodex` 单轮命令行入口
73
- - `pycodex/tools/base_tool.py`:`BaseTool`、`ToolRegistry`、`ToolContext`
74
- - `pycodex/tools/`:具体工具实现
75
- - `pycodex/agent.py`:主循环
76
- - `pycodex/runtime.py`:外层提交队列
77
- - `tests/test_agent.py`:核心行为测试
78
-
79
- ## 当前对齐状态
80
-
81
- 当前进度可以分成两层看:
82
-
83
- - prompt/context 对齐:
84
- - 非交互 `exec` 路径下,`instructions` 和 `input` 已经对齐到上游 Codex;
85
- - 这一层现在主要由 `pycodex/context.py` 和 vendored prompt data 负责。
86
- - turn-loop 语义对齐:
87
- - `AgentLoop` 默认不再使用固定 12 轮上限;
88
- - 现在和上游一样,按 “还有没有 follow-up / tool handoff” 自然收敛;
89
- - 本地不再保留额外的 iteration-limit 参数。
90
- - request-level 对齐:
91
- - 非交互 `exec` 路径的 request body 已基本对齐;
92
- - 默认 CLI 的 non-exec 首轮请求现在也已切到 `codex-tui` + `<collaboration_mode>` 这条上游路径;
93
- - 默认 CLI 的两轮主线程对话 request/header 也已补抓并对齐,包括后续 turn 不再携带 `workspaces`;
94
- - 当前剩余重点主要转向更外围的行为分支,而不是这条已比较路径上的 request/header。
95
- - tool round-trip 对齐:
96
- - `request_user_input` 的 Default-mode unavailable 路径已按真实 upstream capture 对齐;
97
- - Plan-mode happy path 现在也已按 upstream 源码补齐到工具/协议层:会强制 `isOther=true`、要求非空 `options`,并以 JSON 字符串 + `success=true` 回传结构化答案;
98
- - 新增了一个基于 `tests/fake_responses_server.py` proxy 模式的 deterministic round-trip compare 脚本 `tests/compare_request_user_input_roundtrip.py`;它在本机已安装的 `codex-cli 0.115.0` 上确认:Plan-mode live capture 里唯一剩余的 `function_call_output` schema 差异是 `pycodex` 多带了 `success=true`。
99
-
100
- 更细的对齐说明见 `docs/ALIGNMENT.md`。
101
-
102
- ## 真实模型联调
103
-
104
- 如果本机已经有 Codex CLI 配置,可直接复用 `~/.codex/config.toml` 里的
105
- `model`、`model_provider`、`base_url`、`env_key`:
106
-
107
- ```python
108
- from pycodex import ResponsesModelClient
109
-
110
- client = ResponsesModelClient.from_codex_config()
111
- ```
112
-
113
- 当前实现走 OpenAI-compatible Responses API 的流式 `/responses` 接口。这个点
114
- 已经用本机 `~/.codex/config.toml` 做过联调验证。
115
-
116
- 通过 CLI 启动时,`pycodex` 还会在读取配置前加载同目录下的 `.env`
117
- (通常是 `~/.codex/.env`),方便把 provider key 之类的环境变量放在那里。
118
- 为对齐上游 Codex,`.env` 中以 `CODEX_` 开头的变量不会被导入。
119
-
120
- ## pycodex
121
-
122
- `pycodex` 现在默认是一个最小交互式入口,内部通过 `AgentRuntime` 驱动 turn
123
- 提交循环,默认直接复用 `~/.codex/config.toml`:
124
-
125
- ```bash
126
- pycodex
127
- pycodex "Summarize this repo in one sentence."
128
- printf 'Reply with exactly OK.' | pycodex
129
- pycodex --json "Reply with exactly OK."
130
- pycodex --profile model_proxy "Reply with exactly OK."
131
- pycodex --vllm-endpoint http://127.0.0.1:18000 "Reply with exactly OK."
132
- pycodex doctor
133
- ```
134
-
135
- 当前行为:
136
-
137
- - 没有 argv prompt 且 stdin 是 TTY 时,进入交互模式
138
- - 有 argv prompt 或 stdin 管道输入时,执行单轮请求
139
- - 交互模式下支持 `/exit` 和 `/quit`
140
- - 交互模式下会显示简洁阶段事件流,例如工具执行状态和模型回看工具结果
141
- - assistant 文本会按流式 delta 直接打印
142
- - 交互模式下支持 `/history`、`/title` 和 `/model`
143
- - `/model <name>` 会切换当前交互会话后续请求使用的模型;`/model` 会显示当前模型和可选模型
144
- - 交互模式默认支持 steer:普通输入会走 runtime 的 steer 路径,当前请求会在下一个安全边界尽快停下,后续 steer 文本会按顺序并入下一次模型请求的 `input`;如需明确排队可用 `/queue <message>`,会打印 `[steer] queued: ...`,随后等该 turn 真正开始时再打印 `[steer] inserted: ...`
145
- - 当前默认注册一组与原版 Codex 一一对应的本地工具子集:`shell`、`shell_command`、`exec_command`、`write_stdin`、`exec`、`wait`、`web_search`、`update_plan`、`request_user_input`、`request_permissions`、`spawn_agent`、`send_input`、`resume_agent`、`wait_agent`、`close_agent`、`apply_patch`、`grep_files`、`read_file`、`list_dir`、`view_image`
146
- - `--vllm-endpoint http://host:port` 会自动拉起一个本地 `responses_server` compat 层;当 path 为空时会内部补 `/v1`,再把 `/responses` 请求转到下游 `/v1/chat/completions`,并在 provider 侧适配 mock `web_search` 与 custom-tool function wrapper
147
- - `pycodex doctor` 会检查配置、`.env`、API key、DNS、TCP/TLS,以及可选的 live Responses API 请求
148
-
149
- 它目前主要用于:
150
-
151
- - 验证 provider / model / auth 配置是否可用
152
- - 调试 `ResponsesModelClient`
153
- - 做最小单轮 / 多轮 smoke test
154
-
155
- `doctor` 示例:
156
-
157
- ```bash
158
- pycodex doctor
159
- pycodex doctor --skip-live
160
- pycodex doctor --json
161
- ```
162
-
163
- ## 示例
164
-
165
- ```python
166
- import asyncio
167
-
168
- from pycodex import (
169
- AgentLoop,
170
- BaseTool,
171
- ContextManager,
172
- ResponsesModelClient,
173
- ToolRegistry,
174
- )
175
-
176
-
177
- class EchoTool(BaseTool):
178
- name = "echo"
179
- description = "Echo the provided text."
180
- input_schema = {
181
- "type": "object",
182
- "properties": {"text": {"type": "string"}},
183
- "required": ["text"],
184
- }
185
-
186
- async def run(self, context, args):
187
- del context
188
- return args["text"]
189
-
190
-
191
- async def main() -> None:
192
- model = ResponsesModelClient.from_codex_config()
193
- context_manager = ContextManager.from_codex_config()
194
-
195
- tools = ToolRegistry()
196
- tools.register(EchoTool())
197
-
198
- agent = AgentLoop(model, tools, context_manager)
199
- result = await agent.run_turn("Call the echo tool with text=hello, then tell me what it returned.")
200
- print(result.output_text)
201
-
202
-
203
- asyncio.run(main())
204
- ```
205
-
206
- ## 对齐清单
207
-
208
- 更细的说明见 `docs/ALIGNMENT.md`。这里保留一个高层 checklist,方便直接看当前进度。
209
-
210
- ### Tools 对齐
211
-
212
- 上游官方工具:
213
-
214
- - [x] `shell` — 执行 argv 形式的 shell 命令。
215
- - [x] `shell_command` — 执行字符串形式的 shell script。
216
- - [x] `exec_command` — 启动带 session 的长命令执行。
217
- - [x] `write_stdin` — 向已有执行 session 写入 stdin 或轮询输出。
218
- - [x] `web_search` — 暴露 provider-native 的网页搜索能力。
219
- - [x] `update_plan` — 更新任务计划并维护步骤状态。
220
- - [x] `request_user_input` — 向用户发起结构化问题并等待回答。
221
- - [x] `request_permissions` — 请求额外权限再继续执行。
222
- - [x] `spawn_agent` — 创建并启动子 agent。
223
- - [x] `send_input` — 给已有子 agent 继续发送输入。
224
- - [x] `resume_agent` — 恢复已关闭的子 agent。
225
- - [x] `wait_agent` — 等待子 agent 进入终态。
226
- - [x] `close_agent` — 关闭不再需要的子 agent。
227
- - [x] `apply_patch` — 用 freeform patch 精确修改文件。
228
- - [x] `grep_files` — 按模式搜索文件内容。
229
- - [x] `read_file` — 读取文件片段并保留行号语义。
230
- - [x] `list_dir` — 列出目录树片段。
231
- - [x] `view_image` — 把本地图片转成模型可见输入。
232
-
233
- 尚未单独建模的上游官方低频 / 特殊模式工具:
234
-
235
- - [ ] `wait_infinite` — 长时间阻塞等待外部事件或后续输入。
236
- - [ ] `spawn_agents_on_csv` — 按 CSV 批量创建子 agent 任务。
237
- - [ ] `report_agent_job_result` — 上报批处理 agent job 的结果。
238
- - [ ] `js_repl` — JavaScript REPL / code-mode 主入口。
239
- - [ ] `js_repl_reset` — 重置 `js_repl` 的运行状态。
240
- - [ ] `artifacts` — 生成或管理结构化工件输出。
241
- - [ ] `list_mcp_resources` — 列出 MCP 资源。
242
- - [ ] `list_mcp_resource_templates` — 列出 MCP 资源模板。
243
- - [ ] `read_mcp_resource` — 读取 MCP 资源内容。
244
- - [ ] `multi_tool_use.parallel` — 并行包装多个 developer tools 调用。
245
-
246
- 本仓库额外兼容层 / 过渡工具:
247
-
248
- - [x] `exec` — 当前对 code-mode 的本地近似实现。
249
- - [x] `wait` — 当前对 code-mode 等待行为的本地近似实现。
250
-
251
- ### 行为对齐
252
-
253
- - [x] `AgentLoop` / `AgentRuntime` 主循环骨架 — turn 闭环和提交队列已成立。
254
- - [x] 非交互 `exec` 路径的 `instructions` 对齐 — base instructions 已对齐上游。
255
- - [x] 非交互 `exec` 路径的 `input` 对齐 — prompt input 已对齐上游。
256
- - [x] developer/contextual-user message 的 shape 对齐 — message/content 结构已对齐。
257
- - [x] `AGENTS.md` + `<environment_context>` 注入逻辑对齐 — 上下文拼接顺序已对齐。
258
- - [x] 非交互 `exec` 路径的工具子集对齐 — 暴露给模型的工具集合已收敛。
259
- - [x] `include = ["reasoning.encrypted_content"]` — reasoning include 字段已对齐。
260
- - [x] `prompt_cache_key` — 请求级 prompt cache key 已补齐。
261
- - [x] `x-client-request-id` — 请求 id header 已补齐。
262
- - [x] `x-codex-turn-metadata` — turn id / sandbox header 已补齐。
263
- - [x] `originator` — mode-aware originator header 已补齐。
264
- - [x] `user-agent` 精确字符串对齐 — 非交互 `exec` 路径已对齐上游字符串。
265
- - [x] exec-mode tool schema 的逐字段对齐 — 当前通过工具层直接复用上游 snapshot。
266
- - [ ] 交互模式与非 `exec` 路径的完整行为对齐 — non-exec 首轮 context 已切到 `codex-tui` 路径,但 REPL 连续多轮行为还未完全验证。
267
- - [ ] sandbox / approvals / compact / memory 等外围行为对齐 — 外围系统仍在后续范围。