Skip to content

Commit fec4318

Browse files
committed
Refactor ShieldModerationBlocked.refusal_response to a computed property
Eliminates redundant stored state by deriving refusal_response from message at access time, removing the now-unnecessary create_refusal_response helper and all constructor-site arguments.
1 parent e3e821b commit fec4318

6 files changed

Lines changed: 11 additions & 48 deletions

File tree

src/models/common/moderation.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,14 @@ class ShieldModerationBlocked(BaseModel):
2020
decision: Literal["blocked"] = "blocked"
2121
message: str
2222
moderation_id: str
23-
refusal_response: ResponseMessage
23+
24+
@property
25+
def refusal_response(self) -> ResponseMessage:
26+
27+
return ResponseMessage(
28+
role="assistant",
29+
content=self.message,
30+
)
2431

2532

2633
ShieldModerationResult = Annotated[

src/utils/shields.py

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
from typing import Optional
44

55
from fastapi import HTTPException
6-
from ogx_api import OpenAIResponseMessage
76
from ogx_client import (
87
APIConnectionError,
98
AsyncOgxClient,
@@ -130,21 +129,6 @@ async def append_turn_to_conversation(
130129
raise HTTPException(**error_response.model_dump()) from e
131130

132131

133-
def create_refusal_response(refusal_message: str) -> OpenAIResponseMessage:
134-
"""Create a refusal response message object.
135-
136-
Args:
137-
refusal_message: The refusal message text.
138-
139-
Returns:
140-
OpenAIResponseMessage with refusal message.
141-
"""
142-
return OpenAIResponseMessage(
143-
role="assistant",
144-
content=refusal_message,
145-
)
146-
147-
148132
def get_shields_for_request(
149133
shields: list[ShieldConfiguration],
150134
shield_ids: Optional[list[str]] = None,

tests/unit/app/endpoints/test_responses.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -189,11 +189,6 @@ def _patch_moderation(mocker: MockerFixture, decision: str = "passed") -> Any:
189189
moderation_result = ShieldModerationBlocked(
190190
message="Content blocked",
191191
moderation_id="mod_blocked",
192-
refusal_response=OpenAIResponseMessage(
193-
role="assistant",
194-
content="Content blocked",
195-
type="message",
196-
),
197192
)
198193
else:
199194
moderation_result = ShieldModerationPassed()

tests/unit/app/endpoints/test_rlsapi_v1.py

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313

1414
import pytest
1515
from fastapi import HTTPException, status
16-
from ogx_api import OpenAIResponseMessage
1716
from ogx_client import APIConnectionError, APIStatusError
1817
from ogx_client.types import ListModelsResponse
1918
from ogx_client.types.model import Model
@@ -1254,10 +1253,6 @@ async def test_infer_quota_shield_blocked_does_not_consume_tokens(
12541253
blocked = ShieldModerationBlocked(
12551254
message="Blocked by moderation",
12561255
moderation_id="modr-test",
1257-
refusal_response=OpenAIResponseMessage(
1258-
role="assistant",
1259-
content="Blocked by moderation",
1260-
),
12611256
)
12621257
mocker.patch(
12631258
"app.endpoints.rlsapi_v1.run_shield_moderation",
@@ -1287,10 +1282,6 @@ def _create_blocked_moderation_result() -> ShieldModerationBlocked:
12871282
return ShieldModerationBlocked(
12881283
message="I can't answer that. Can I help with something else?",
12891284
moderation_id="modr-test-123",
1290-
refusal_response=OpenAIResponseMessage(
1291-
role="assistant",
1292-
content="I can't answer that. Can I help with something else?",
1293-
),
12941285
)
12951286

12961287

tests/unit/utils/agents/test_query.py

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,6 @@
55

66
import pytest
77
from fastapi import HTTPException
8-
from ogx_api.openai_responses import (
9-
OpenAIResponseMessage as ResponseMessage,
10-
)
118
from ogx_client import APIConnectionError, APIStatusError
129
from pydantic_ai.messages import (
1310
FinishReason,
@@ -109,10 +106,6 @@ def blocked_moderation_fixture() -> ShieldModerationBlocked:
109106
return ShieldModerationBlocked(
110107
message="Content blocked by shield.",
111108
moderation_id="modr-test-456",
112-
refusal_response=ResponseMessage(
113-
role="assistant",
114-
content="Content blocked by shield.",
115-
),
116109
)
117110

118111

tests/unit/utils/agents/test_streaming.py

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,6 @@
99

1010
import pytest
1111
from fastapi import HTTPException
12-
from ogx_api.openai_responses import (
13-
OpenAIResponseMessage as ResponseMessage,
14-
)
1512
from ogx_client import APIStatusError
1613
from pydantic_ai import AgentRunResultEvent
1714
from pydantic_ai.exceptions import AgentRunError
@@ -118,10 +115,6 @@ def blocked_moderation_fixture() -> ShieldModerationBlocked:
118115
return ShieldModerationBlocked(
119116
message="Content blocked by shield.",
120117
moderation_id="modr-test-456",
121-
refusal_response=ResponseMessage(
122-
role="assistant",
123-
content="Content blocked by shield.",
124-
),
125118
)
126119

127120

@@ -1055,9 +1048,9 @@ async def __aexit__(self, *_args: object) -> None:
10551048
num_chunks = len(chunk_ids)
10561049
assert chunk_ids == sorted(chunk_ids), "chunk_ids must be monotonically ordered"
10571050
assert all(cid >= 0 for cid in chunk_ids), "all chunk_ids must be non-negative"
1058-
assert num_chunks == len(
1059-
set(chunk_ids)
1060-
), "chunk_ids must not contain duplicates"
1051+
assert num_chunks == len(set(chunk_ids)), (
1052+
"chunk_ids must not contain duplicates"
1053+
)
10611054
assert chunk_ids[-1] == num_chunks - 1
10621055

10631056
@pytest.mark.asyncio

0 commit comments

Comments
 (0)