Skip to content

Commit d267020

Browse files
authored
Merge pull request #146 from Yif-Yang/fix/codex-token-tracker-isolation
fix(model): prevent Codex token double counting
2 parents 3e3df88 + 74ff263 commit d267020

2 files changed

Lines changed: 32 additions & 2 deletions

File tree

‎skillopt/model/codex_backend.py‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@
1212
from typing import Any
1313
from urllib.parse import unquote, urlparse
1414

15+
from skillopt.model.backend_config import get_codex_exec_config
1516
from skillopt.model.common import (
1617
CompatAssistantMessage,
1718
CompatToolCall,
1819
CompatToolFunction,
19-
tracker,
20+
TokenTracker,
2021
)
21-
from skillopt.model.backend_config import get_codex_exec_config
2222

2323

2424
CODEX_BIN = os.environ.get("CODEX_CLI_BIN", "codex")
@@ -29,6 +29,7 @@
2929
TARGET_DEPLOYMENT = os.environ.get("TARGET_DEPLOYMENT", "gpt-4o")
3030

3131
REASONING_EFFORT: str | None = None
32+
tracker = TokenTracker()
3233

3334

3435
def _default_working_directory() -> str:

‎tests/test_codex_optimizer_backend.py‎

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,35 @@ def test_token_summary_merges_codex_once_with_existing_backends(
251251
assert summary["_total"]["total_tokens"] == 36
252252

253253

254+
def test_codex_usage_is_not_double_counted_by_shared_tracker(
255+
isolate_backend_state: tuple[Any, Any, Any, Any],
256+
) -> None:
257+
model_module, _backend_config, codex_backend, _azure_openai = isolate_backend_state
258+
from skillopt.model import claude_backend
259+
260+
model_module.reset_token_tracker()
261+
try:
262+
assert codex_backend.tracker is not claude_backend.tracker
263+
264+
codex_backend.tracker.record("optimizer", 11, 13)
265+
summary = model_module.get_token_summary()
266+
267+
assert summary["optimizer"] == {
268+
"calls": 1,
269+
"prompt_tokens": 11,
270+
"completion_tokens": 13,
271+
"total_tokens": 24,
272+
}
273+
assert summary["_total"] == {
274+
"calls": 1,
275+
"prompt_tokens": 11,
276+
"completion_tokens": 13,
277+
"total_tokens": 24,
278+
}
279+
finally:
280+
model_module.reset_token_tracker()
281+
282+
254283
def test_reset_token_tracker_resets_codex_and_existing_backends(
255284
monkeypatch: pytest.MonkeyPatch,
256285
isolate_backend_state: tuple[Any, Any, Any, Any],

0 commit comments

Comments
 (0)