97e91a83f3
Ruff / Ruff (push) Has been cancelled
Test / Core Tests (push) Has been cancelled
Test / Offline Coverage Tests (Python 3.10) (push) Has been cancelled
Test / Offline Coverage Tests (Python 3.11) (push) Has been cancelled
Test / Offline Coverage Tests (Python 3.12) (push) Has been cancelled
Test / Offline Coverage Tests (Python 3.13) (push) Has been cancelled
Test / Offline Coverage Tests (Python 3.9) (push) Has been cancelled
Test / Full Coverage (Python 3.11) (push) Has been cancelled
Test / Core Provider Tests (OpenAI) (push) Has been cancelled
Test / Core Provider Tests (Anthropic) (push) Has been cancelled
Test / Core Provider Tests (Google) (push) Has been cancelled
Test / Core Provider Tests (Other) (push) Has been cancelled
Test / Anthropic Tests (push) Has been cancelled
Test / Gemini Tests (push) Has been cancelled
Test / Google GenAI Tests (push) Has been cancelled
Test / Vertex AI Tests (push) Has been cancelled
Test / OpenAI Tests (push) Has been cancelled
Test / Writer Tests (push) Has been cancelled
Test / Auto Client Tests (push) Has been cancelled
ty / type-check (push) Has been cancelled
69 lines
2.1 KiB
Python
69 lines
2.1 KiB
Python
from itertools import product
|
|
import pytest
|
|
|
|
import instructor
|
|
|
|
from typing import Annotated
|
|
from pydantic import BaseModel, AfterValidator, BeforeValidator, ValidationError
|
|
|
|
from instructor.validation import llm_validator
|
|
from .util import models, modes
|
|
|
|
|
|
def test_patch_completes_successfully(client):
|
|
class Response(BaseModel):
|
|
message: Annotated[
|
|
str, AfterValidator(instructor.openai_moderation(client=client))
|
|
]
|
|
|
|
with pytest.raises(ValidationError):
|
|
Response(message="I want to make them suffer the consequences")
|
|
|
|
|
|
@pytest.mark.parametrize("model, mode", product(models, modes))
|
|
def test_runmodel_validator_error(model, mode, client):
|
|
client = instructor.from_openai(client, mode=mode)
|
|
|
|
if mode == instructor.Mode.TOOLS_STRICT:
|
|
# TODO: Structured outputs currently doesn't support the concept of Validators ( This is Pydantic specific ) so perhaps come back to this later
|
|
pytest.skip("Skipping test for structured output")
|
|
|
|
class QuestionAnswerNoEvil(BaseModel):
|
|
question: str
|
|
answer: Annotated[
|
|
str,
|
|
BeforeValidator(
|
|
llm_validator(
|
|
"don't say objectionable things", model=model, client=client
|
|
)
|
|
),
|
|
]
|
|
|
|
with pytest.raises(ValidationError):
|
|
QuestionAnswerNoEvil(
|
|
question="What is the meaning of life?",
|
|
answer="The meaning of life is to be evil and steal",
|
|
)
|
|
|
|
|
|
@pytest.mark.parametrize("model", models)
|
|
def test_runmodel_validator_default_openai_client(model, client):
|
|
client = instructor.from_openai(client)
|
|
|
|
class QuestionAnswerNoEvil(BaseModel):
|
|
question: str
|
|
answer: Annotated[
|
|
str,
|
|
BeforeValidator(
|
|
llm_validator(
|
|
"don't say objectionable things", model=model, client=client
|
|
)
|
|
),
|
|
]
|
|
|
|
with pytest.raises(ValidationError):
|
|
QuestionAnswerNoEvil(
|
|
question="What is the meaning of life?",
|
|
answer="The meaning of life is to be evil and steal",
|
|
)
|