in prompt/prompt-structure/src/commonTest/kotlin/ai/koog/prompt/structure/json/generator/JsonSchemaGeneratorTest.kt [726:815]
fun testStandardSchemaOpenPolymorphic() {
val descriptions = mapOf(
"OpenSubclass1.id" to "ID for subclass 1",
"OpenSubclass1.property1" to "Property 1 for subclass 1",
"OpenSubclass2.id" to "ID for subclass 2",
"OpenSubclass2.property2" to "Property 2 for subclass 2",
)
val result = standardGenerator.generate(
json,
"TestOpenPolymorphism",
serializer<TestOpenPolymorphism>(),
descriptions
)
val schema = json.encodeToString(result.schema)
val expectedSchema = """
{
"${"$"}id": "TestOpenPolymorphism",
"${"$"}defs": {
"OpenSubclass1": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "ID for subclass 1"
},
"property1": {
"type": "string",
"description": "Property 1 for subclass 1"
},
"kind": {
"const": "OpenSubclass1"
}
},
"required": [
"id",
"property1",
"kind"
],
"additionalProperties": false
},
"OpenSubclass2": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "ID for subclass 2"
},
"property2": {
"type": "integer",
"description": "Property 2 for subclass 2"
},
"recursiveTypeProperty": {
"oneOf": [
{
"${"$"}ref": "#/${"$"}defs/OpenSubclass1"
},
{
"${"$"}ref": "#/${"$"}defs/OpenSubclass2"
}
]
},
"kind": {
"const": "OpenSubclass2"
}
},
"required": [
"id",
"property2",
"recursiveTypeProperty",
"kind"
],
"additionalProperties": false
}
},
"oneOf": [
{
"${"$"}ref": "#/${"$"}defs/OpenSubclass1"
},
{
"${"$"}ref": "#/${"$"}defs/OpenSubclass2"
}
]
}
""".trimIndent()
assertEquals(expectedSchema, schema)
}