codex exec --json emits duplicate id keys for web-search items

Đang mở Phù hợp với người mới
#60,992 0 bình luận 0 reaction 0 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 1 ngày

Chưa có ai nhận issue này.

Đánh giá

Độ khó
2/5
Thời gian dự kiến
1-3 giờ
Mức phù hợp với người mới
84/100
Loại issue
Lỗi
Độ rõ ràng
Đặc tả rõ ràng
Mức độ hoạt động
Sôi nổi
Công nghệ
json, python, rust

Hướng nghiên cứu

Bắt đầu trong codex-rs/exec/src/exec_events.rs, nơi issue trỏ đến mục bên ngoài và các định nghĩa payload tìm kiếm web được làm phẳng. Theo dõi cách các trường đó được tuần tự hóa, rồi thêm một kiểm thử tuần tự hóa JSON thô từ chối các khóa trùng lặp, như issue yêu cầu. Công việc hoàn tất khi mỗi mục tìm kiếm web được phát ra có một id rõ ràng và kiểm thử xác nhận các khóa trùng lặp bị từ chối.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

bug CLI exec

What issue are you seeing?

codex exec --json emits two different id properties in each web-search item. Parsers that keep the first property identify the item as item_1; parsers that keep the last identify it as ws-1. A duplicate-rejecting parser cannot consume the event.

This is separate from #60990, which concerns an omitted TypeScript field.

Reproduction

Run from the repository root with the Python SDK dependencies and codex on PATH. The Responses API is a local mock; no external web request is made.

import json, os, shutil, subprocess, sys, tempfile
from pathlib import Path

sys.path[:0] = [str(Path("sdk/python/src").resolve()),
                str(Path("sdk/python/tests").resolve())]
from app_server_harness import (
    AppServerHarness, ev_assistant_message, ev_completed,
    ev_response_created, sse,
)

def reject_duplicates(pairs):
    result = {}
    for key, value in pairs:
        if key in result:
            raise ValueError(f"duplicate key: {key}")
        result[key] = value
    return result

with tempfile.TemporaryDirectory(ignore_cleanup_errors=True) as tmp:
    with AppServerHarness(Path(tmp)) as harness:
        added = {"type": "response.output_item.added", "item": {
            "type": "web_search_call", "id": "ws-1", "status": "in_progress"}}
        done = {"type": "response.output_item.done", "item": {
            "type": "web_search_call", "id": "ws-1", "status": "completed",
            "action": {"type": "search", "query": "example"}}}
        harness.responses.enqueue_sse(sse([
            ev_response_created("r1"), added, done,
            ev_assistant_message("m1", "Finished."), ev_completed("r1"),
        ]))
        env = dict(os.environ, CODEX_HOME=str(harness.codex_home),
                   CODEX_APP_SERVER_DISABLE_MANAGED_CONFIG="1")
        proc = subprocess.run([
            shutil.which("codex"), "exec", "--json", "--skip-git-repo-check",
            "-c", 'web_search="cached"', "-c", "features.plugins=false",
            "-c", "features.plugin_discovery_prefetch=false", "Example",
        ], cwd=harness.workspace, env=env, capture_output=True, text=True,
           check=True, timeout=15)
        for line in proc.stdout.splitlines():
            event = json.loads(line)
            if event.get("item", {}).get("type") == "web_search":
                print(line)
                try:
                    json.loads(line, object_pairs_hook=reject_duplicates)
                except ValueError as error:
                    print(error)

Observed for the started item (the completed item has the same duplication):

{"type":"item.started","item":{"id":"item_1","type":"web_search","id":"ws-1","query":"","action":{"type":"other"}}}
duplicate key: id

Python's default decoder retains ws-1; a first-wins decoder retains item_1. A separate structurally equivalent Serde deserialization test returned duplicate field id.

Expected behavior

Emit one unambiguous id per item. The outer item flattens a web-search payload that also has an id. Remove the duplicate or give the raw search identifier a distinct field name if both IDs are needed. Add a raw-JSON serialization test that rejects duplicate keys.

Tested with Codex CLI 0.167.0-alpha.4.1, Python 3.14.0, and Windows; source checked at 6bfdc75f0d9e6fae313234f694839866d7c63c39.

Ngôn ngữ chính
Rust
Star
135k
Fork
21.4k
Merge trung bình
1 phút
Pull request đã merge (30 ngày)
995

Chuẩn bị môi trường

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của openai/codex

Tất cả issue của openai/codex

Issue tương tự

Thêm issue về Rust

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.