Skip to content

Commit 24fbfae

Browse files
committed
fix: address CodeRabbit round 3 feedback (7 items)
- Baseline record logging promoted to INFO (state transition convention) - MemoryError/RecursionError guards added to _dispatch_retry_rate_alert - MemoryError/RecursionError guards added to _poll_loop and _check_snapshot - CompletionResponse docstring documents provider_metadata field - Test model values use test-small-001 (vendor-agnostic convention)
1 parent e35a792 commit 24fbfae

5 files changed

Lines changed: 35 additions & 20 deletions

File tree

src/synthorg/budget/baseline_store.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ def record(self, baseline: BaselineRecord) -> None:
8181
baseline: Baseline record to store.
8282
"""
8383
self._records.append(baseline)
84-
logger.debug(
84+
logger.info(
8585
COORD_METRICS_BASELINE_RECORDED,
8686
agent_id=baseline.agent_id,
8787
task_id=baseline.task_id,

src/synthorg/budget/call_analytics.py

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -221,12 +221,21 @@ async def _dispatch_retry_rate_alert(
221221
)
222222

223223
body = f"Retry rate {retry_rate:.1%} exceeds warning threshold {warn_rate:.1%}."
224-
await dispatcher.dispatch(
225-
Notification(
226-
category=NotificationCategory.BUDGET,
227-
severity=NotificationSeverity.WARNING,
228-
title="High retry rate alert",
229-
body=body,
230-
source="budget.call_analytics",
231-
),
232-
)
224+
try:
225+
await dispatcher.dispatch(
226+
Notification(
227+
category=NotificationCategory.BUDGET,
228+
severity=NotificationSeverity.WARNING,
229+
title="High retry rate alert",
230+
body=body,
231+
source="budget.call_analytics",
232+
),
233+
)
234+
except MemoryError, RecursionError:
235+
raise
236+
except Exception:
237+
logger.warning(
238+
ANALYTICS_RETRY_RATE_ALERT,
239+
error="retry_rate_alert_dispatch_failed",
240+
exc_info=True,
241+
)

src/synthorg/budget/quota_poller.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,8 @@ async def _poll_loop(self) -> None:
123123
await self.poll_once()
124124
except asyncio.CancelledError:
125125
raise
126+
except MemoryError, RecursionError:
127+
raise
126128
except Exception as exc:
127129
logger.exception(
128130
QUOTA_POLL_FAILED,
@@ -176,6 +178,8 @@ async def _check_snapshot(self, snap: QuotaSnapshot) -> None:
176178
level=level,
177179
usage_pct=usage_pct,
178180
)
181+
except MemoryError, RecursionError:
182+
raise
179183
except Exception:
180184
logger.exception(
181185
QUOTA_POLL_FAILED,

src/synthorg/providers/models.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,8 @@ class CompletionResponse(BaseModel):
264264
usage: Token usage and cost breakdown.
265265
model: Model identifier that served the request.
266266
provider_request_id: Provider-assigned request ID for debugging.
267+
provider_metadata: Provider metadata injected by the base class
268+
(``_synthorg_*`` keys for latency, retry count, retry reason).
267269
"""
268270

269271
model_config = ConfigDict(frozen=True, allow_inf_nan=False)

tests/unit/providers/test_models.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ def test_content_can_be_none(self, sample_token_usage: TokenUsage) -> None:
380380
tool_calls=(ToolCall(id="c1", name="ping", arguments={}),),
381381
finish_reason=FinishReason.TOOL_USE,
382382
usage=sample_token_usage,
383-
model="test",
383+
model="test-small-001",
384384
)
385385
assert resp.content is None
386386
assert len(resp.tool_calls) == 1
@@ -403,7 +403,7 @@ def test_empty_response_rejected_for_stop(
403403
content=None,
404404
finish_reason=FinishReason.STOP,
405405
usage=sample_token_usage,
406-
model="test",
406+
model="test-small-001",
407407
)
408408

409409
def test_empty_response_rejected_for_max_tokens(
@@ -415,7 +415,7 @@ def test_empty_response_rejected_for_max_tokens(
415415
content=None,
416416
finish_reason=FinishReason.MAX_TOKENS,
417417
usage=sample_token_usage,
418-
model="test",
418+
model="test-small-001",
419419
)
420420

421421
def test_empty_response_rejected_for_tool_use(
@@ -427,7 +427,7 @@ def test_empty_response_rejected_for_tool_use(
427427
content=None,
428428
finish_reason=FinishReason.TOOL_USE,
429429
usage=sample_token_usage,
430-
model="test",
430+
model="test-small-001",
431431
)
432432

433433
def test_empty_response_allowed_for_content_filter(
@@ -438,7 +438,7 @@ def test_empty_response_allowed_for_content_filter(
438438
content=None,
439439
finish_reason=FinishReason.CONTENT_FILTER,
440440
usage=sample_token_usage,
441-
model="test",
441+
model="test-small-001",
442442
)
443443
assert resp.content is None
444444

@@ -450,7 +450,7 @@ def test_empty_response_allowed_for_error(
450450
content=None,
451451
finish_reason=FinishReason.ERROR,
452452
usage=sample_token_usage,
453-
model="test",
453+
model="test-small-001",
454454
)
455455
assert resp.finish_reason == FinishReason.ERROR
456456

@@ -471,7 +471,7 @@ def test_provider_metadata_default_empty(
471471
content="hi",
472472
finish_reason=FinishReason.STOP,
473473
usage=sample_token_usage,
474-
model="test",
474+
model="test-small-001",
475475
)
476476
assert resp.provider_metadata == {}
477477

@@ -484,7 +484,7 @@ def test_provider_metadata_accepts_arbitrary_keys(
484484
content="hi",
485485
finish_reason=FinishReason.STOP,
486486
usage=sample_token_usage,
487-
model="test",
487+
model="test-small-001",
488488
provider_metadata={
489489
"_synthorg_latency_ms": 123.4,
490490
"_synthorg_retry_count": 2,
@@ -502,13 +502,13 @@ def test_provider_metadata_independent_between_instances(
502502
content="a",
503503
finish_reason=FinishReason.STOP,
504504
usage=sample_token_usage,
505-
model="test",
505+
model="test-small-001",
506506
)
507507
resp2 = CompletionResponse(
508508
content="b",
509509
finish_reason=FinishReason.STOP,
510510
usage=sample_token_usage,
511-
model="test",
511+
model="test-small-001",
512512
)
513513
assert resp1.provider_metadata is not resp2.provider_metadata
514514

0 commit comments

Comments
 (0)