Summary
When using guided generation with session.respond(to: generating:), schemas containing Array may produce invalid JSON Schema for OpenAI-compatible backends.
The emitted schema contains $ref (e.g. #/$defs/MyModule.PromptRefineEdit) inside array items, but the corresponding $defs entry is missing, causing HTTP 400 invalid_json_schema.
Minimal Repro
import AnyLanguageModel
@Generable
struct Edit {
let old: String
let new: String
}
@Generable
struct Result {
let analysis: String
let edits: [Edit]
}
let session = LanguageModelSession(model: model)
let _ = try await session.respond(
to: "Return a valid object",
generating: Result.self
)
Actual Result
Server rejects request schema:
code: invalid_json_schema
param: text.format.schema
message includes:
reference to component '#/$defs/.Edit' which was not found in the schema
Expected Result
Schema should include all referenced definitions in $defs, including element types referenced by arrays.
Suspected Cause
Array: Generable schema path appears to keep items as $ref but drops element schema defs, so refs become dangling.
Additional Context
Locally patched behavior by preserving elementSchema.defs in Array.generationSchema, which fixed the issue in my app.
Summary
When using guided generation with session.respond(to: generating:), schemas containing Array may produce invalid JSON Schema for OpenAI-compatible backends.
The emitted schema contains $ref (e.g. #/$defs/MyModule.PromptRefineEdit) inside array items, but the corresponding $defs entry is missing, causing HTTP 400 invalid_json_schema.
Minimal Repro
Actual Result
Server rejects request schema:
code: invalid_json_schema
param: text.format.schema
message includes:
reference to component '#/$defs/.Edit' which was not found in the schema
Expected Result
Schema should include all referenced definitions in $defs, including element types referenced by arrays.
Suspected Cause
Array: Generable schema path appears to keep items as $ref but drops element schema defs, so refs become dangling.
Additional Context
Locally patched behavior by preserving elementSchema.defs in Array.generationSchema, which fixed the issue in my app.