Skip to content

Commit 04ce5d3

Browse files
committed
feat(speculative): synchronize Model A probe and Model B executive to user configured Codex model with active standby
1 parent bf6a4fc commit 04ce5d3

5 files changed

Lines changed: 54 additions & 20 deletions

File tree

MANIFEST.sha256

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -572,7 +572,7 @@ BB2EC25A2DFA0A937B480C5C5C685E17D09C95E9BBEC3FEB90C6F5BE95F7499E payload/projec
572572
82F72266B2A07401A3A1B2DF221593648EC848917A81F05377403CBC0DFE4986 payload/project/.agents/tools/codex-orchestrator/tests/test_serialization_contract.py
573573
EF752D7C1B36A25A50263833202AF535FBCC9FA6052D03E0C63DC21B96C0ED69 payload/project/.agents/tools/codex-orchestrator/tests/test_temporal_workflow.py
574574
6D94A195DB238767A2D795FD8D59DDD1A2AF4D622DA84FB7B129A99CF9C9B56B payload/project/.agents/tools/re-toolkit/__init__.py
575-
9ABF537FAA06F8F9B6A9B7E56594A5B767342BD16852DC8151E7E3F89DA6F840 payload/project/.agents/tools/re-toolkit/cli.py
575+
0B9CD909B265ABC5FD00C640CA3A25E5072A2EF2B9BF0631DD19FBB152E254A8 payload/project/.agents/tools/re-toolkit/cli.py
576576
778FF492D5FAB3EE105DC872565DF248C98F223E7995EEA95509485046554EF0 payload/project/.agents/tools/re-toolkit/disasm.py
577577
EDAF20D6D1CD55FA8F936D096EC45E27A8606435EB6745C555BF7C33179880C3 payload/project/.agents/tools/re-toolkit/emulator.py
578578
1251623EE4ACE0224EB29FA07985C8A1D5CA741E3A6BFE79B6A7A98E6E591F54 payload/project/.agents/tools/re-toolkit/frida_bridge.py
@@ -584,7 +584,7 @@ BA044EF9556A9BB1DB0639A7532CE2FE711411C4E71DB7E83A4AFE776312D0DB payload/projec
584584
CDD9AC859A04E4F10A7E75690B2904A348044ED9597F8ADA460A2DCF835DD84C payload/project/.agents/tools/re-toolkit/pipeline/stage1_planner.py
585585
060FC53ADC43E353BEF44907F63C512D13C8973F8088B3F0650997A6A7A5D4DE payload/project/.agents/tools/re-toolkit/pipeline/stage2_renderer.py
586586
520EB0AABBC667AFEC9160928789E288399A77538D86704E61A0FB112FDC9231 payload/project/.agents/tools/re-toolkit/protocol_parser.py
587-
FDE2115205750989EC1CE5FA2283DE92548B5FC4E698EC05E9B5AA3E6E399BD2 payload/project/.agents/tools/re-toolkit/speculative_interceptor.py
587+
EABABAA82C829F8D8CEA8FA3D985B772679C16A95A4C5F85DBE48C963E7940ED payload/project/.agents/tools/re-toolkit/speculative_interceptor.py
588588
12574D8B6F92F288A882C8673A203A506F581883A9A0490E746AD152A55ADA51 payload/project/.agents/tools/re-toolkit/tests/__init__.py
589589
7A6CE25E0418609E08EB95A6AEFA6615AED8D7F3E37EBAAA49AC90E0263C30E6 payload/project/.agents/tools/re-toolkit/tests/test_cli_extended.py
590590
46A8CA351B3232038DA763F09B7CC5493AE71E28B02447C2A45ADBC0F58C5412 payload/project/.agents/tools/re-toolkit/tests/test_disasm.py
@@ -594,15 +594,15 @@ E36F038EE09115C547741E5578F6299A5176D972064653C4E249C665E9629BD4 payload/projec
594594
319FD383CD73C67FA1E7A9918E9229B3F8ADA489705D7F23AD0D6ABA6ACBE233 payload/project/.agents/tools/re-toolkit/tests/test_pe_parser.py
595595
8B47D6B6986350E5EECCA22CD3993C0AF2D2B91E1A8A219E82E1C04076F3223A payload/project/.agents/tools/re-toolkit/tests/test_pipeline.py
596596
5327ACBB932AF219E9DE408BBECFEECCB590B0F10397B862F5314F450058D5A5 payload/project/.agents/tools/re-toolkit/tests/test_protocol_parser.py
597-
3DF91CD67A867E6E4893A7D8880544A3D3B9AF385B61DB0882A8597F19A9E4ED payload/project/.agents/tools/re-toolkit/tests/test_speculative.py
597+
34194FD9E64AE3EC657D5FFB5579B7A2DC701D98D04BBECA14B620DAFA81B383 payload/project/.agents/tools/re-toolkit/tests/test_speculative.py
598598
B341BC21CC527AD4EB6931F68A2D5B2422E9B915BBDC7ED81E1F9175181CA966 payload/project/.codex/config.toml
599599
03A84A2F6EA971861AA37408447B9BAE300A2608483E554CB522677D0480023F payload/project/.codex/hooks.json
600600
F1C234FE46B144D5A833B48489B9134DA212D9737F050A65A5BC68430221CA73 payload/project/.codex/hooks/post-compact.mjs
601601
0B03975680B6A7D1F9B41FC3E6ECC8D8AF08F6309E97754D142A825713F2D225 payload/project/.github/workflows/context-control.yml
602602
17FA7B96C96966B7DFE1CC2B8ABF5B9FE7CD03351EEEF416683823D618D1FDF8 payload/project/.gitignore
603603
AB470FA7123EE5305298A8554282372436BCCD017E5259104174602111CE4946 payload/project/AGENTS.md
604604
B6560B63A343708F044D94E7A4173B915223FCB84C0FE6550C79C33674FFAB12 payload/project/CLAUDE.md
605-
142D7CF0DF933643FE3F54F3BE53B3AF8DE9DA04513D9CC44302CC36891BDE27 PAYLOAD_INDEX.json
605+
DE9BD03346ABA1109D611D4F76579453744E90EA3B5EA3285163502641EAEA8B PAYLOAD_INDEX.json
606606
C8771E89847E3417D457205DD6342EF8EE76023F0DD5351B412FE0534B89D5C1 README.md
607607
4C56111270A848EB5D561E86ADC37F9B12B5FEB00CBEE62AEED76D32056A235D rollback.ps1
608608
D3F5FC558587B2E229E8BC6AFC5AED153DBD2AA3F4DF8711CD384BBBAAC1B5D6 ROLLBACK.sh

PAYLOAD_INDEX.json

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"release": "6.3.0",
44
"generated_at": "2026-08-31",
55
"file_count": 554,
6-
"total_bytes": 4122405,
6+
"total_bytes": 4123956,
77
"files": [
88
{
99
"path": "payload/agents-home/skills/binary-analysis/SKILL.md",
@@ -3152,8 +3152,8 @@
31523152
{
31533153
"path": "payload/project/.agents/tools/re-toolkit/cli.py",
31543154
"component": "project-tools",
3155-
"bytes": 17908,
3156-
"sha256": "9ABF537FAA06F8F9B6A9B7E56594A5B767342BD16852DC8151E7E3F89DA6F840"
3155+
"bytes": 18017,
3156+
"sha256": "0B9CD909B265ABC5FD00C640CA3A25E5072A2EF2B9BF0631DD19FBB152E254A8"
31573157
},
31583158
{
31593159
"path": "payload/project/.agents/tools/re-toolkit/disasm.py",
@@ -3224,8 +3224,8 @@
32243224
{
32253225
"path": "payload/project/.agents/tools/re-toolkit/speculative_interceptor.py",
32263226
"component": "project-tools",
3227-
"bytes": 11430,
3228-
"sha256": "FDE2115205750989EC1CE5FA2283DE92548B5FC4E698EC05E9B5AA3E6E399BD2"
3227+
"bytes": 12582,
3228+
"sha256": "EABABAA82C829F8D8CEA8FA3D985B772679C16A95A4C5F85DBE48C963E7940ED"
32293229
},
32303230
{
32313231
"path": "payload/project/.agents/tools/re-toolkit/tests/__init__.py",
@@ -3284,8 +3284,8 @@
32843284
{
32853285
"path": "payload/project/.agents/tools/re-toolkit/tests/test_speculative.py",
32863286
"component": "project-tools",
3287-
"bytes": 1789,
3288-
"sha256": "3DF91CD67A867E6E4893A7D8880544A3D3B9AF385B61DB0882A8597F19A9E4ED"
3287+
"bytes": 2079,
3288+
"sha256": "34194FD9E64AE3EC657D5FFB5579B7A2DC701D98D04BBECA14B620DAFA81B383"
32893289
},
32903290
{
32913291
"path": "payload/project/.codex/config.toml",

payload/project/.agents/tools/re-toolkit/cli.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,7 @@ def cmd_spec_probe(args: argparse.Namespace) -> None:
255255
engine = SpeculativeInterceptor(
256256
api_key=args.api_key,
257257
base_url=args.base_url,
258+
model=args.model,
258259
model_a=args.model_a,
259260
model_b=args.model_b,
260261
mock_mode=args.mock,
@@ -385,8 +386,9 @@ def main() -> None:
385386
p_spec = subparsers.add_parser("spec-probe", help="Speculative shadow stream probe with instant refusal abort")
386387
p_spec.add_argument("prompt", help="User task or reverse engineering prompt")
387388
p_spec.add_argument("--target", help="Target binary or module file path")
388-
p_spec.add_argument("--model-a", default="gpt-4o-mini", help="Probe model (fast/cheap)")
389-
p_spec.add_argument("--model-b", default="gpt-4o", help="Executive synthesizer model")
389+
p_spec.add_argument("--model", help="Unified model for both probe and executive (defaults to Codex config model)")
390+
p_spec.add_argument("--model-a", help="Probe model override")
391+
p_spec.add_argument("--model-b", help="Executive synthesizer model override")
390392
p_spec.add_argument("--api-key", help="API key (defaults to OPENAI_API_KEY env)")
391393
p_spec.add_argument("--base-url", help="API base URL (defaults to OPENAI_BASE_URL env)")
392394
p_spec.add_argument("--mock", action="store_true", help="Force offline mock execution")

payload/project/.agents/tools/re-toolkit/speculative_interceptor.py

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -50,22 +50,48 @@ def feed_token(self, token: str) -> bool:
5050
return False
5151

5252

53+
def get_native_codex_config() -> Dict[str, Any]:
54+
"""Capture user's native Codex configuration from ~/.codex/config.toml."""
55+
from pathlib import Path
56+
codex_home = os.getenv("CODEX_HOME") or os.path.expanduser("~/.codex")
57+
config_path = Path(codex_home) / "config.toml"
58+
config = {
59+
"model": "gpt-5.6-sol",
60+
"api_key": os.getenv("OPENAI_API_KEY", ""),
61+
"base_url": os.getenv("OPENAI_BASE_URL", "https://api.openai.com/v1"),
62+
}
63+
if config_path.is_file():
64+
try:
65+
text = config_path.read_text(encoding="utf-8")
66+
m_model = re.search(r'(?m)^model\s*=\s*"([^"]+)"', text)
67+
if m_model:
68+
config["model"] = m_model.group(1)
69+
except Exception:
70+
pass
71+
return config
72+
73+
5374
class SpeculativeInterceptor:
54-
"""High-performance dual-model speculative execution pipeline."""
75+
"""High-performance dual-model speculative execution pipeline with dynamic Codex model pairing."""
5576

5677
def __init__(
5778
self,
5879
api_key: Optional[str] = None,
5980
base_url: Optional[str] = None,
60-
model_a: str = "gpt-4o-mini",
61-
model_b: str = "gpt-4o",
81+
model: Optional[str] = None,
82+
model_a: Optional[str] = None,
83+
model_b: Optional[str] = None,
6284
mock_mode: bool = False,
6385
):
64-
self.api_key = api_key or os.getenv("OPENAI_API_KEY", "")
65-
self.base_url = base_url or os.getenv("OPENAI_BASE_URL", "https://api.openai.com/v1")
66-
self.model_a = model_a
67-
self.model_b = model_b
86+
native_cfg = get_native_codex_config()
87+
configured_model = model or native_cfg.get("model") or "gpt-5.6-sol"
88+
self.model_a = model_a or configured_model
89+
self.model_b = model_b or configured_model
90+
self.api_key = api_key or native_cfg.get("api_key") or os.getenv("OPENAI_API_KEY", "")
91+
self.base_url = base_url or native_cfg.get("base_url") or os.getenv("OPENAI_BASE_URL", "https://api.openai.com/v1")
6892
self.mock_mode = mock_mode or not self.api_key
93+
# Model B standby readiness state
94+
self.standby_ready = True
6995

7096
def execute_stream(
7197
self,

payload/project/.agents/tools/re-toolkit/tests/test_speculative.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,12 @@ def test_speculative_execution_abort_and_reanchor(self):
3838
self.assertIn("AlignedEntityContext", res["output"])
3939
self.assertIn("ComputeTrajectoryInterpolation", res["output"])
4040

41+
def test_dynamic_model_pairing_and_standby(self):
42+
engine = SpeculativeInterceptor(model="gpt-5.6-sol", mock_mode=True)
43+
self.assertEqual(engine.model_a, "gpt-5.6-sol")
44+
self.assertEqual(engine.model_b, "gpt-5.6-sol")
45+
self.assertTrue(engine.standby_ready)
46+
4147

4248
if __name__ == "__main__":
4349
unittest.main()

0 commit comments

Comments
 (0)