export interface StructuredOutputSpec { name: string; description?: string; parse?: (value: unknown) => T; } export interface StructuredOutputResult { spec: StructuredOutputSpec; value: T; } export function defineStructuredOutput( spec: StructuredOutputSpec ): StructuredOutputSpec { if (!spec.name.trim()) { throw new Error("Structured output specs require a name."); } return Object.freeze({ ...spec }); } export function parseStructuredJson( text: string, spec: StructuredOutputSpec = { name: "json" } ): StructuredOutputResult { const rawValue = JSON.parse(text) as unknown; const value = spec.parse ? spec.parse(rawValue) : (rawValue as T); return { spec, value }; }