97e91a83f3
Ruff / Ruff (push) Waiting to run
Test / Core Tests (push) Waiting to run
Test / Offline Coverage Tests (Python 3.10) (push) Waiting to run
Test / Offline Coverage Tests (Python 3.11) (push) Waiting to run
Test / Offline Coverage Tests (Python 3.12) (push) Waiting to run
Test / Offline Coverage Tests (Python 3.13) (push) Waiting to run
Test / Offline Coverage Tests (Python 3.9) (push) Waiting to run
Test / Full Coverage (Python 3.11) (push) Waiting to run
Test / Core Provider Tests (OpenAI) (push) Blocked by required conditions
Test / Core Provider Tests (Anthropic) (push) Blocked by required conditions
Test / Core Provider Tests (Google) (push) Blocked by required conditions
Test / Core Provider Tests (Other) (push) Blocked by required conditions
Test / Anthropic Tests (push) Blocked by required conditions
Test / Gemini Tests (push) Blocked by required conditions
Test / Google GenAI Tests (push) Blocked by required conditions
Test / Vertex AI Tests (push) Blocked by required conditions
Test / OpenAI Tests (push) Blocked by required conditions
Test / Writer Tests (push) Blocked by required conditions
Test / Auto Client Tests (push) Blocked by required conditions
ty / type-check (push) Waiting to run
67 lines
1.7 KiB
Python
67 lines
1.7 KiB
Python
"""Isolated tests for Anthropic JSON parsing helpers."""
|
|
|
|
from anthropic.types import Message, TextBlock, Usage
|
|
import pytest
|
|
from pydantic import BaseModel, ValidationError
|
|
from typing import cast
|
|
|
|
from instructor.mode import Mode
|
|
from instructor.processing.response import process_response
|
|
from instructor.utils.providers import Provider
|
|
|
|
|
|
CONTROL_CHAR_JSON = """{
|
|
"data": "Claude likes
|
|
control
|
|
characters"
|
|
}"""
|
|
|
|
|
|
class _AnthropicTestModel(BaseModel):
|
|
data: str
|
|
|
|
|
|
def _build_message(data_content: str) -> Message:
|
|
return Message(
|
|
id="test_id",
|
|
content=[TextBlock(type="text", text=data_content)],
|
|
model="claude-3-5-haiku-20241022",
|
|
role="assistant",
|
|
stop_reason="end_turn",
|
|
stop_sequence=None,
|
|
type="message",
|
|
usage=Usage(input_tokens=10, output_tokens=10),
|
|
)
|
|
|
|
|
|
def test_parse_anthropic_json_strict_control_characters() -> None:
|
|
message = _build_message(CONTROL_CHAR_JSON)
|
|
|
|
with pytest.raises(ValidationError):
|
|
process_response(
|
|
response=message,
|
|
response_model=_AnthropicTestModel,
|
|
stream=False,
|
|
strict=True,
|
|
mode=Mode.JSON,
|
|
provider=Provider.ANTHROPIC,
|
|
)
|
|
|
|
|
|
def test_parse_anthropic_json_non_strict_preserves_control_characters() -> None:
|
|
message = _build_message(CONTROL_CHAR_JSON)
|
|
|
|
model = cast(
|
|
_AnthropicTestModel,
|
|
process_response(
|
|
response=message,
|
|
response_model=_AnthropicTestModel,
|
|
stream=False,
|
|
strict=False,
|
|
mode=Mode.JSON,
|
|
provider=Provider.ANTHROPIC,
|
|
),
|
|
)
|
|
|
|
assert model.data == "Claude likes\ncontrol\ncharacters"
|