| |
|
|
| import json |
|
|
| from pydantic import BaseModel |
|
|
| STRUCTURED_OUTPUT_FORMAT_INSTRUCTIONS = """The output should be formatted as a JSON instance that conforms to the JSON schema below. |
| |
| As an example, for the schema {{"properties": {{"foo": {{"title": "Foo", "description": "a list of strings", "type": "array", "items": {{"type": "string"}}}}}}, "required": ["foo"]}} |
| the object {{"foo": ["bar", "baz"]}} is a well-formatted instance of the schema. The object {{"properties": {{"foo": ["bar", "baz"]}}}} is not well-formatted. |
| |
| Here is the output schema: |
| ``` |
| {schema} |
| ```""" |
|
|
|
|
| class StructuredOutputParser(BaseModel): |
| pydantic_class: type[BaseModel] |
|
|
| def get_schema(self, indent: int = 2) -> str: |
| |
| schema = self.pydantic_class.model_json_schema() |
| |
| for field_name in ["title", "type"]: |
| if field_name in schema: |
| schema.pop(field_name) |
| return json.dumps(schema, indent=indent, ensure_ascii=False) |
|
|
| def get_format_instructions(self) -> str: |
| schema_str = self.get_schema() |
| |
| return STRUCTURED_OUTPUT_FORMAT_INSTRUCTIONS.format(schema=schema_str) |
|
|
| def parse(self, json_string: str) -> BaseModel: |
| return self.pydantic_class.model_validate_json(json_string) |
|
|