Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -92,4 +92,4 @@ jobs:
AMIGO_USER_ID: ${{ secrets.AMIGO_USER_ID }}
AMIGO_BASE_URL: ${{ secrets.AMIGO_BASE_URL }}
AMIGO_TEST_SERVICE_ID: ${{ secrets.AMIGO_TEST_SERVICE_ID }}
run: pytest -m integration -v -s
run: pytest -m integration -v -s --no-cov
25 changes: 20 additions & 5 deletions src/amigo_sdk/resources/conversation.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
from amigo_sdk.generated.model import (
ConversationCreateConversationRequest,
ConversationCreateConversationResponse,
ConversationEvent,
ConversationGenerateConversationStarterRequest,
ConversationGenerateConversationStarterResponse,
ConversationGetConversationMessagesResponse,
Expand Down Expand Up @@ -182,10 +183,18 @@ async def _generator():
f"/v1/{self._organization_id}/conversation/{conversation_id}/interact",
**request_kwargs,
):
# Each line is a JSON object representing a discriminated union event
yield ConversationInteractWithConversationResponse.model_validate_json(
line
# Each line is a JSON object representing a discriminated union event.
# The response wraps events in ConversationEvent RootModel; unwrap
# so callers get concrete event types directly.
parsed = (
ConversationInteractWithConversationResponse.model_validate_json(
line
)
)
event = parsed.root
if isinstance(event, ConversationEvent):
parsed.root = event.root
yield parsed

return _generator()

Expand Down Expand Up @@ -401,9 +410,15 @@ def _iter():
f"/v1/{self._organization_id}/conversation/{conversation_id}/interact",
**request_kwargs,
):
yield ConversationInteractWithConversationResponse.model_validate_json(
line
parsed = (
ConversationInteractWithConversationResponse.model_validate_json(
line
)
)
event = parsed.root
if isinstance(event, ConversationEvent):
parsed.root = event.root
yield parsed

return _iter()

Expand Down
21 changes: 6 additions & 15 deletions tests/integration/test_conversation_integration.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
from amigo_sdk.generated.model import (
ConversationCreateConversationRequest,
ConversationCreatedEvent,
ConversationEvent,
CreateConversationParametersQuery,
ErrorEvent,
GetConversationMessagesParametersQuery,
Expand All @@ -23,14 +22,6 @@
)
from amigo_sdk.sdk_client import AmigoClient, AsyncAmigoClient


def _unwrap_event(e: object) -> object:
"""Unwrap nested RootModel events (ConversationEvent wraps InteractionCompleteEvent etc.)."""
if isinstance(e, ConversationEvent):
return e.root
return e


# Constants
SERVICE_ID = os.getenv("AMIGO_TEST_SERVICE_ID", "66e0da39f5a09fb3cf18ea75")

Expand Down Expand Up @@ -189,7 +180,7 @@ async def test_interact_with_conversation_text_streams(self):
event_count = 0

async for evt in events:
e = _unwrap_event(evt.root)
e = evt.root
event_count += 1
if isinstance(e, ErrorEvent):
pytest.fail(f"error event: {e.model_dump_json()}")
Expand Down Expand Up @@ -239,7 +230,7 @@ async def test_interact_with_conversation_external_event_streams(self):
event_count = 0

async for evt in events:
e = _unwrap_event(evt.root)
e = evt.root
event_count += 1
if isinstance(e, ErrorEvent):
pytest.fail(f"error event: {e.model_dump_json()}")
Expand Down Expand Up @@ -280,7 +271,7 @@ async def test_interact_with_conversation_voice_streams(self):
event_count = 0

async for evt in events:
e = _unwrap_event(evt.root)
e = evt.root
event_count += 1
if isinstance(e, ErrorEvent):
pytest.fail(f"error event: {e.model_dump_json()}")
Expand Down Expand Up @@ -455,7 +446,7 @@ def test_interact_with_conversation_text_streams(self):
event_count = 0

for evt in events:
e = _unwrap_event(evt.root)
e = evt.root
event_count += 1
if isinstance(e, ErrorEvent):
pytest.fail(f"error event: {e.model_dump_json()}")
Expand Down Expand Up @@ -505,7 +496,7 @@ def test_interact_with_conversation_external_event_streams(self):
event_count = 0

for evt in events:
e = _unwrap_event(evt.root)
e = evt.root
event_count += 1
if isinstance(e, ErrorEvent):
pytest.fail(f"error event: {e.model_dump_json()}")
Expand Down Expand Up @@ -546,7 +537,7 @@ def test_interact_with_conversation_voice_streams(self):
event_count = 0

for evt in events:
e = _unwrap_event(evt.root)
e = evt.root
event_count += 1
if isinstance(e, ErrorEvent):
pytest.fail(f"error event: {e.model_dump_json()}")
Expand Down
Loading