Open sahewat opened 8 months ago
Thank you for opening an issue! It looks like something we should be able to support. Do you mind pasting the JSON schema for these 3 models here?
In all cases, the schema is available through TaskWrapperxxx.model_json_schema()
. I'll post an example of each here as well.
TaskWrapperOptional
{
"$defs": {
"Task": {
"properties": {
"name": {
"title": "Name",
"type": "string"
},
"subtasks": {
"default": [],
"items": {
"$ref": "#/$defs/Task"
},
"title": "Subtasks",
"type": "array"
}
},
"required": [
"name"
],
"title": "Task",
"type": "object"
},
"TaskOptional": {
"properties": {
"subtask": {
"anyOf": [
{
"$ref": "#/$defs/Task"
},
{
"type": "null"
}
]
}
},
"required": [
"subtask"
],
"title": "TaskOptional",
"type": "object"
}
},
"properties": {
"task": {
"$ref": "#/$defs/TaskOptional"
}
},
"required": [
"task"
],
"title": "TaskWrapperOptional",
"type": "object"
}
TaskWrapperUnion
{
"$defs": {
"TaskUnion": {
"properties": {
"subtask": {
"anyOf": [
{
"$ref": "#/$defs/TaskUnion"
},
{
"type": "null"
}
]
}
},
"required": [
"subtask"
],
"title": "TaskUnion",
"type": "object"
}
},
"properties": {
"task": {
"$ref": "#/$defs/TaskUnion"
}
},
"required": [
"task"
],
"title": "TaskWrapperUnion",
"type": "object"
}
TaskWrapperList
{
"$defs": {
"TaskList": {
"properties": {
"subtask": {
"items": {
"$ref": "#/$defs/TaskList"
},
"title": "Subtask",
"type": "array"
}
},
"required": [
"subtask"
],
"title": "TaskList",
"type": "object"
}
},
"properties": {
"task": {
"$ref": "#/$defs/TaskList"
}
},
"required": [
"task"
],
"title": "TaskWrapperList",
"type": "object"
}
Anyone who is interested in this feature should know that CFG-structured generation is required to truly support it.
Recursive Pydantic definitions seem unsupported for lists, unions, and optionals. My understanding is these are the basic use cases.
A reproducible example is provided below:
I'd be interested in adding this functionality but I'm unsure as to what an "unrolled" recursive definition would look like in terms of the generated regex.