feat: add profile editing and richer request ids
This commit is contained in:
+46
-2
@@ -35,12 +35,14 @@ class CodexRetryGatewayTUITests(unittest.TestCase):
|
||||
mod = load_module()
|
||||
payload = {
|
||||
"entries": [
|
||||
{"seq": 1, "request_id": "req_a", "path": "/responses"},
|
||||
{"seq": 2, "request_id": "req_b", "path": "/v1/responses"},
|
||||
{"seq": 1, "request_id": "req_a", "response_id": "resp_a", "thread_id": "thread_a", "path": "/responses"},
|
||||
{"seq": 2, "request_id": "req_b", "response_id": "resp_b", "thread_id": "thread_b", "path": "/v1/responses"},
|
||||
]
|
||||
}
|
||||
rows = mod.normalize_request_rows(payload)
|
||||
self.assertEqual([row["request_id"] for row in rows], ["req_b", "req_a"])
|
||||
self.assertEqual(rows[0]["response_id"], "resp_b")
|
||||
self.assertEqual(rows[0]["thread_id"], "thread_b")
|
||||
|
||||
def test_profile_rows_show_active_first(self) -> None:
|
||||
mod = load_module()
|
||||
@@ -75,6 +77,8 @@ class CodexRetryGatewayTUITests(unittest.TestCase):
|
||||
row = {
|
||||
"seq": 1,
|
||||
"request_id": "r",
|
||||
"response_id": "resp_1",
|
||||
"thread_id": "thread_1",
|
||||
"method": "POST",
|
||||
"path": "/responses",
|
||||
"status_code": 200,
|
||||
@@ -90,10 +94,50 @@ class CodexRetryGatewayTUITests(unittest.TestCase):
|
||||
"finished_at": "2026-06-30T00:00:01Z",
|
||||
"usage_last_updated_at": "2026-06-30T00:00:01Z",
|
||||
}
|
||||
self.assertEqual(mod.primary_request_id(row), "resp_1")
|
||||
self.assertIn("thread thread_1", mod.render_request_detail(row))
|
||||
self.assertIn("updated 1.0s", mod.render_request_detail(row))
|
||||
self.assertEqual(mod.request_updated_elapsed(row), "1.0s")
|
||||
self.assertEqual(mod.request_chunk_progress(row), "7 / 4.1KB")
|
||||
|
||||
def test_request_usage_summary_shows_cached_ratio(self) -> None:
|
||||
mod = load_module()
|
||||
row = {
|
||||
"input_tokens": 100,
|
||||
"output_tokens": 40,
|
||||
"cached_tokens": 25,
|
||||
}
|
||||
self.assertEqual(mod.request_usage_summary(row), "in 75 | out 40 | cached 25 (25%)")
|
||||
|
||||
def test_profile_editor_payload_round_trip(self) -> None:
|
||||
mod = load_module()
|
||||
row = {
|
||||
"name": "pc",
|
||||
"listen_host": "100.115.235.115",
|
||||
"listen_port": "4610",
|
||||
"upstream_base_url": "https://example.com/v1",
|
||||
"auth_mode": "passthrough",
|
||||
"auth_json_key": "OPENAI_API_KEY",
|
||||
"request_history_limit": 0,
|
||||
"model_remap": "a=b",
|
||||
"reasoning_equals": [516, 1034],
|
||||
"raw": {
|
||||
"form": {
|
||||
"retryable_error_messages": [
|
||||
"Selected model is at capacity. Please try a different model.",
|
||||
"stream disconnected before completion: Concurrency limit exceeded for account, please retry later",
|
||||
],
|
||||
}
|
||||
},
|
||||
}
|
||||
text = mod.profile_editor_document(row)
|
||||
payload = mod.profile_payload_from_editor_text(text)
|
||||
self.assertEqual(payload["name"], "pc")
|
||||
self.assertIn(
|
||||
"stream disconnected before completion: Concurrency limit exceeded for account, please retry later",
|
||||
payload["retryable_error_messages"],
|
||||
)
|
||||
|
||||
def test_default_api_url_discovers_gateway_state(self) -> None:
|
||||
mod = load_module()
|
||||
with tempfile.TemporaryDirectory() as tmpdir:
|
||||
|
||||
Reference in New Issue
Block a user