Bump version to 0.1.3; enhance logging with correlation_id for better error tracing and add request lifecycle middleware

This commit is contained in:
Guangfei.Zhao
2026-07-23 22:50:52 +08:00
parent ac79dd0618
commit bba1cc2f56
10 changed files with 220 additions and 4 deletions
+84
View File
@@ -230,3 +230,87 @@ def test_count_tokens() -> None:
assert response.status_code == 200
assert response.json()["input_tokens"] > 0
def test_validation_error_is_logged(caplog) -> None:
caplog.set_level(logging.WARNING, logger="nexus_claude_api.routes.messages")
response = client().post(
"/v1/messages",
json={"model": "claude-opus-4.6", "max_tokens": -1},
)
assert response.status_code == 400
assert any("validation_error" in r.message for r in caplog.records)
def test_nexus_error_non_stream_is_logged(caplog) -> None:
caplog.set_level(logging.WARNING, logger="nexus_claude_api.routes.messages")
response = client(AccessDeniedNexusClient()).post(
"/v1/messages",
json={
"model": "claude-opus-4.6",
"messages": [{"role": "user", "content": "Hello"}],
"max_tokens": 32,
},
)
assert response.status_code == 403
assert any("nexus_error" in r.message for r in caplog.records)
def test_stream_nexus_error_is_logged(caplog) -> None:
caplog.set_level(logging.WARNING, logger="nexus_claude_api.routes.messages")
with client(StreamErrorNexusClient()).stream(
"POST",
"/v1/messages",
json={
"model": "claude-opus-4.6",
"messages": [{"role": "user", "content": "Hello"}],
"max_tokens": 32,
"stream": True,
},
) as response:
response.read()
assert any("stream_nexus_error" in r.message for r in caplog.records)
def test_request_complete_is_logged(caplog) -> None:
caplog.set_level(logging.INFO, logger="nexus_claude_api.server")
client().post(
"/v1/messages",
json={
"model": "claude-opus-4.6",
"messages": [{"role": "user", "content": "Hello"}],
"max_tokens": 32,
},
)
assert any("request_complete" in r.message and "duration_ms" in r.message for r in caplog.records)
class ExplodingNexusClient:
def converse(self, request: dict, *, correlation_id: str | None = None) -> dict:
raise RuntimeError("unexpected kaboom")
def test_unexpected_exception_returns_500_and_is_logged(caplog) -> None:
caplog.set_level(logging.ERROR, logger="nexus_claude_api.server")
response = client(ExplodingNexusClient()).post(
"/v1/messages",
json={
"model": "claude-opus-4.6",
"messages": [{"role": "user", "content": "Hello"}],
"max_tokens": 32,
},
)
assert response.status_code == 500
body = response.json()
assert body["error"]["type"] == "api_error"
assert any("unhandled_exception" in r.message for r in caplog.records)