mirror of
https://github.com/aphrody-labs/typesafe-sdk-python.git
synced 2026-10-14 04:19:06 +00:00
Co-authored-by: Allie Laabs <allie@typesafe.ai> Co-authored-by: Daniel Gafni <danielgafni16@gmail.com>
70 lines
3.2 KiB
Python
70 lines
3.2 KiB
Python
import pytest
|
|
|
|
from tests.conftest import Client
|
|
from tests.helpers import models, system_one
|
|
from typesafe_sdk import AsyncTypeSafeClient, Choice, ChoiceAnswer, NoulAnswer, Questions, Score, ScoreAnswer, SystemOneResponse
|
|
|
|
pytestmark = pytest.mark.integration
|
|
|
|
|
|
class PydanticQuestionsResponse(SystemOneResponse):
|
|
billing: NoulAnswer
|
|
tone: ChoiceAnswer
|
|
urgency: ScoreAnswer
|
|
|
|
|
|
async def test_live_models(live_client: Client) -> None:
|
|
available = await models(live_client)
|
|
assert available
|
|
for model in available:
|
|
assert isinstance(model.name, str)
|
|
assert isinstance(model.description, str)
|
|
assert isinstance(model.release_date, str)
|
|
|
|
|
|
async def test_live_questions(live_client: Client) -> None:
|
|
result = await system_one(
|
|
live_client,
|
|
state={"subject": "Charged twice this month", "body": "I see two charges of $49. I only have one account. Please fix this ASAP."},
|
|
questions={
|
|
"billing": {
|
|
"type": "noul",
|
|
"instructions": "Is this ticket about billing?",
|
|
"criteria": {"true": {"meaning": "Payments or invoices", "examples": ["charged twice"]}},
|
|
},
|
|
"tone": Choice(instructions="What is the customer's tone?", criteria={"calm": None, "frustrated": None, "angry": None}),
|
|
"urgency": Score(instructions="How urgent is this ticket?", criteria=["can wait", "this week", "today"]),
|
|
},
|
|
)
|
|
assert result.model
|
|
assert result.usage.input_tokens is None or result.usage.input_tokens > 0
|
|
assert result.usage.output_tokens is None or result.usage.output_tokens >= 0
|
|
assert 0 <= result.nouls["billing"].noul <= 1
|
|
assert result.choices["tone"].choice in {"calm", "frustrated", "angry"}
|
|
assert sum(result.choices["tone"].probabilities.values()) == pytest.approx(1, abs=0.1)
|
|
assert 0 <= result.scores["urgency"].score <= 2
|
|
assert result.scores["urgency"].legend == {0: "can wait", 1: "this week", 2: "today"}
|
|
assert set(result.scores["urgency"].probabilities) == {0, 1, 2}
|
|
assert sum(result.scores["urgency"].probabilities.values()) == pytest.approx(1, abs=0.1)
|
|
|
|
|
|
async def test_live_pydantic_response(live_client: Client) -> None:
|
|
state = {"subject": "Charged twice this month", "body": "I see two charges of $49. Please fix this ASAP."}
|
|
questions: Questions = {
|
|
"billing": {"type": "noul", "instructions": "Is this ticket about billing?"},
|
|
"tone": Choice(instructions="What is the customer's tone?", criteria={"calm": None, "frustrated": None, "angry": None}),
|
|
"urgency": Score(instructions="How urgent is this ticket?", criteria=["can wait", "this week", "today"]),
|
|
}
|
|
if isinstance(live_client, AsyncTypeSafeClient):
|
|
result = await live_client.system_one(state, questions, response_model=PydanticQuestionsResponse)
|
|
else:
|
|
result = live_client.system_one(state, questions, response_model=PydanticQuestionsResponse)
|
|
|
|
assert result.billing == result.nouls["billing"]
|
|
assert result.tone == result.choices["tone"]
|
|
assert result.urgency == result.scores["urgency"]
|
|
assert 0 <= result.billing.noul <= 1
|
|
assert result.tone.choice in {"calm", "frustrated", "angry"}
|
|
assert 0 <= result.urgency.score <= 2
|
|
assert result.request_id
|