diff --git a/examples/validators/citations.py b/examples/validators/citations.py new file mode 100644 index 0000000..073cd94 --- /dev/null +++ b/examples/validators/citations.py @@ -0,0 +1,46 @@ +from typing_extensions import Annotated +from pydantic import BaseModel, ValidationError, ValidationInfo, AfterValidator +from openai import OpenAI +import instructor + +client = instructor.patch(OpenAI()) + + +def citation_exists(v: str, info: ValidationInfo): + context = info.context + if context: + context = context.get("text_chunk") + if v not in context: + raise ValueError(f"Citation `{v}` not found in text") + return v + + +Citation = Annotated[str, AfterValidator(citation_exists)] + + +class AnswerWithCitation(BaseModel): + answer: str + citation: Citation + + +try: + q = "Are blue berries high in protein?" + text_chunk = """ + Blueberries are a good source of vitamin K. + They also contain vitamin C, fibre, manganese and other antioxidants (notably anthocyanins). + """ + + resp = client.chat.completions.create( + model="gpt-3.5-turbo", + response_model=AnswerWithCitation, + messages=[ + { + "role": "user", + "content": f"Answer the question `{q}` using the text chunk\n`{text_chunk}`", + }, + ], + validation_context={"text_chunk": text_chunk}, + ) # type: ignore + print(resp.model_dump_json(indent=2)) +except ValidationError as e: + print(e) diff --git a/examples/validators/competitors.py b/examples/validators/competitors.py new file mode 100644 index 0000000..ed26b97 --- /dev/null +++ b/examples/validators/competitors.py @@ -0,0 +1,40 @@ +from typing_extensions import Annotated +from pydantic import BaseModel, ValidationError, AfterValidator +from openai import OpenAI + +import instructor + +client = instructor.patch(OpenAI()) + + +def no_competitors(v: str) -> str: + # does not allow the competitors of mcdonalds + competitors = ["burger king", "wendy's", "carl's jr", "jack in the box"] + for competitor in competitors: + if competitor in v.lower(): + raise ValueError( + f"""Let them know that you are work for and are only allowed to talk about mcdonalds. + Do not apologize. Do not even mention `{competitor}` since they are a a competitor of McDonalds""" + ) + return v + + +class Response(BaseModel): + message: Annotated[str, AfterValidator(no_competitors)] + + +try: + resp = client.chat.completions.create( + model="gpt-3.5-turbo", + response_model=Response, + max_retries=1, + messages=[ + { + "role": "user", + "content": "What is your favourite order at burger king?", + }, + ], + ) # type: ignore + print(resp.model_dump_json(indent=2)) +except ValidationError as e: + print(e)