@aviasole/shapecraft 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,6 +1,10 @@
1
1
  # @aviasole/shapecraft
2
2
 
3
- Structured output generation for LLMs in Node.js. Token-level constraints for local models, native JSON modes for cloud APIs — one unified Zod API.
3
+ Structured output generation for LLMs in Node.js. Token-level constraints for local models, native JSON modes for cloud APIs — one unified API.
4
+
5
+ [![npm](https://img.shields.io/npm/v/@aviasole/shapecraft)](https://www.npmjs.com/package/@aviasole/shapecraft)
6
+ [![CI](https://github.com/aviasoletechnologies/shapecraft/actions/workflows/ci.yml/badge.svg)](https://github.com/aviasoletechnologies/shapecraft/actions/workflows/ci.yml)
7
+ [![License](https://img.shields.io/badge/license-Apache--2.0-blue)](LICENSE)
4
8
 
5
9
  ## Install
6
10
 
@@ -11,17 +15,17 @@ npm install @aviasole/shapecraft zod
11
15
  Install backend SDK as needed:
12
16
 
13
17
  ```bash
14
- npm install openai # OpenAI
15
- npm install groq-sdk # Groq
16
- npm install @anthropic-ai/sdk # Anthropic
17
- # Ollama: no extra SDK, uses fetch
18
+ npm install openai # OpenAI
19
+ npm install groq-sdk # Groq
20
+ npm install @anthropic-ai/sdk # Anthropic
21
+ # Ollama: no extra SDK needed
18
22
  ```
19
23
 
20
- ## Usage
24
+ ## Quick Start
21
25
 
22
26
  ```typescript
23
27
  import { z } from "zod";
24
- import { generate, openai, ollama, anthropic, groq } from "@aviasole/shapecraft";
28
+ import { generate, openai } from "@aviasole/shapecraft";
25
29
 
26
30
  const PersonSchema = z.object({
27
31
  name: z.string(),
@@ -29,34 +33,86 @@ const PersonSchema = z.object({
29
33
  email: z.string().email(),
30
34
  });
31
35
 
32
- // OpenAI — native constrained (server-side)
33
36
  const model = openai({ model: "gpt-4o-mini" });
34
37
 
35
- const result = await generate(model, PersonSchema, "Extract person info: John Doe, 32, john@example.com");
38
+ const result = await generate(model, PersonSchema, "Extract: John Doe, 32, john@example.com");
36
39
 
37
- console.log(result.data); // { name: "John Doe", age: 32, email: "john@example.com" }
40
+ console.log(result.data); // { name: "John Doe", age: 32, email: "john@example.com" }
38
41
  console.log(result.guaranteeLevel); // "native"
39
42
  console.log(result.attempts); // 1
40
43
  ```
41
44
 
45
+ ## Schema Inputs
46
+
47
+ Shapecraft accepts four schema types — not just Zod.
48
+
49
+ ### Zod Schema
50
+
51
+ ```typescript
52
+ import { z } from "zod";
53
+
54
+ const schema = z.object({ name: z.string(), score: z.number() });
55
+ const result = await generate(model, schema, prompt);
56
+ ```
57
+
58
+ ### Raw JSON Schema
59
+
60
+ ```typescript
61
+ const result = await generate(model, {
62
+ jsonSchema: {
63
+ type: "object",
64
+ properties: { name: { type: "string" }, score: { type: "number" } },
65
+ required: ["name", "score"],
66
+ },
67
+ }, prompt);
68
+ ```
69
+
70
+ ### Regex Pattern
71
+
72
+ ```typescript
73
+ // Model must return a string matching the pattern
74
+ const result = await generate(model, {
75
+ pattern: /^\d{4}-\d{2}-\d{2}$/,
76
+ }, "What is today's date?");
77
+
78
+ console.log(result.data); // "2025-01-15"
79
+ ```
80
+
81
+ ### Custom Validator
82
+
83
+ ```typescript
84
+ const result = await generate(model, {
85
+ validate: (output) => typeof output === "object" && output !== null && "id" in output,
86
+ hint: { type: "object", properties: { id: { type: "string" } } },
87
+ }, prompt);
88
+ ```
89
+
42
90
  ## Backends & Guarantee Levels
43
91
 
44
- | Backend | Guarantee | Notes |
92
+ | Backend | Guarantee | Mechanism |
45
93
  |---|---|---|
46
- | `ollama()` | `constrained` | Token-level via GBNF grammar |
47
94
  | `openai()` | `native` | Server-side strict JSON schema |
48
95
  | `groq()` | `native` | JSON mode |
96
+ | `ollama()` | `constrained` | Token-level GBNF grammar |
49
97
  | `anthropic()` | `best-effort` | Prompt + parse + retry |
50
98
 
51
99
  ```typescript
52
- // Ollama true token-level constraint (local model)
53
- const local = ollama({ model: "llama3.2" });
100
+ import { openai, groq, ollama, anthropic } from "@aviasole/shapecraft";
101
+
102
+ const gpt = openai({ model: "gpt-4o-mini" });
103
+ const fast = groq({ model: "llama-3.3-70b-versatile" });
104
+ const local = ollama({ model: "llama3.2" });
105
+ const claude = anthropic({ model: "claude-haiku-4-5-20251001", maxRetries: 3 });
106
+ ```
54
107
 
55
- // Anthropic — best-effort with auto-retry
56
- const claude = anthropic({ model: "claude-sonnet-4-6", maxRetries: 3 });
108
+ ## Options
57
109
 
58
- // Groq — fast native JSON mode
59
- const fast = groq({ model: "llama-3.3-70b-versatile" });
110
+ ```typescript
111
+ const result = await generate(model, schema, prompt, {
112
+ maxRetries: 3, // default: 2
113
+ temperature: 0.2,
114
+ systemPrompt: "You are a data extraction assistant.",
115
+ });
60
116
  ```
61
117
 
62
118
  ## Error Handling
@@ -72,6 +128,7 @@ try {
72
128
  }
73
129
  if (err instanceof SchemaViolationError) {
74
130
  console.error("Raw output:", err.raw);
131
+ console.error("Errors:", err.validationErrors);
75
132
  }
76
133
  }
77
134
  ```
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/core/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,wBAAgB,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAG5E;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,WAAW,EACnB,YAAY,CAAC,EAAE,MAAM,GACpB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAkBlC"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/core/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,aAAa,CAAC;AAG/D,wBAAgB,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAG5E;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,WAAW,EACnB,YAAY,CAAC,EAAE,MAAM,GACpB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAoBlC"}
package/dist/index.cjs CHANGED
@@ -127,8 +127,12 @@ ${JSON.stringify(toJsonSchema(schema), null, 2)}`;
127
127
  ${JSON.stringify(schema.jsonSchema, null, 2)}`;
128
128
  } else if ("pattern" in schema) {
129
129
  schemaInfo = `Respond with a plain string matching this pattern: ${schema.pattern}`;
130
+ } else if ("validate" in schema && schema.hint) {
131
+ schemaInfo = `Respond with valid JSON matching this schema exactly:
132
+
133
+ ${JSON.stringify(schema.hint, null, 2)}`;
130
134
  } else {
131
- schemaInfo = "Respond with valid output as required.";
135
+ schemaInfo = "Respond with valid JSON. No extra text, no markdown.";
132
136
  }
133
137
  const system = systemPrompt ? `${systemPrompt}
134
138
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts","../src/core/validate.ts","../src/core/generate.ts","../src/core/schema.ts","../src/core/parse.ts","../src/backends/openai.ts","../src/backends/ollama.ts","../src/backends/anthropic.ts","../src/backends/groq.ts"],"names":["z","zodToJsonSchema"],"mappings":"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","file":"index.cjs","sourcesContent":["import { z } from \"zod\";\n\nexport type GuaranteeLevel = \"constrained\" | \"native\" | \"best-effort\";\n\nexport type JsonSchemaInput = { jsonSchema: Record<string, unknown> };\nexport type PatternInput = { pattern: RegExp };\nexport type ValidatorInput = { validate: (output: unknown) => boolean };\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type SchemaInput<T = unknown> = z.ZodType<T> | JsonSchemaInput | PatternInput | ValidatorInput;\n\nexport interface ShapecraftModel {\n id: string;\n guaranteeLevel: GuaranteeLevel;\n generate<T>(prompt: string, schema: SchemaInput<T>, systemPrompt?: string): Promise<T>;\n}\n\nexport interface GenerateOptions {\n maxRetries?: number;\n systemPrompt?: string;\n temperature?: number;\n}\n\nexport interface GenerateResult<T> {\n data: T;\n guaranteeLevel: GuaranteeLevel;\n attempts: number;\n}\n\nexport class SchemaViolationError extends Error {\n constructor(\n public readonly raw: string,\n public readonly validationErrors: unknown\n ) {\n super(\"Model output failed schema validation\");\n this.name = \"SchemaViolationError\";\n }\n}\n\nexport class MaxRetriesExceededError extends Error {\n constructor(public readonly attempts: number) {\n super(`Schema validation failed after ${attempts} attempts`);\n this.name = \"MaxRetriesExceededError\";\n }\n}\n","import { z } from \"zod\";\nimport type { SchemaInput } from \"../types.js\";\nimport { SchemaViolationError } from \"../types.js\";\n\nexport function isZodSchema(schema: SchemaInput): schema is z.ZodType<any> {\n return schema instanceof z.ZodType;\n}\n\nfunction nullToUndefined(value: unknown): unknown {\n if (value === null) return undefined;\n if (Array.isArray(value)) return value.map(nullToUndefined);\n if (typeof value === \"object\" && value !== null) {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>).map(([k, v]) => [k, nullToUndefined(v)])\n );\n }\n return value;\n}\n\nfunction checkJsonSchema(value: unknown, schema: Record<string, unknown>): void {\n const type = schema.type as string | undefined;\n\n if (type) {\n const actual = Array.isArray(value) ? \"array\" : value === null ? \"null\" : typeof value;\n if (actual !== type) {\n throw new Error(`Expected type \"${type}\", got \"${actual}\"`);\n }\n }\n\n if (schema.enum) {\n if (!(schema.enum as unknown[]).includes(value)) {\n throw new Error(`Value not in enum: ${JSON.stringify(value)}`);\n }\n }\n\n if (typeof value === \"object\" && value !== null && !Array.isArray(value) && schema.properties) {\n const obj = value as Record<string, unknown>;\n const required = (schema.required as string[]) ?? [];\n const properties = schema.properties as Record<string, Record<string, unknown>>;\n\n for (const key of required) {\n if (!(key in obj)) throw new Error(`Missing required property: \"${key}\"`);\n }\n\n for (const [key, propSchema] of Object.entries(properties)) {\n if (key in obj) checkJsonSchema(obj[key], propSchema);\n }\n }\n\n if (Array.isArray(value) && schema.items) {\n for (const item of value) {\n checkJsonSchema(item, schema.items as Record<string, unknown>);\n }\n }\n}\n\nexport function validateOutput<T>(output: unknown, schema: SchemaInput<T>): T {\n if (isZodSchema(schema)) {\n const result = schema.safeParse(nullToUndefined(output));\n if (!result.success) throw new SchemaViolationError(JSON.stringify(output), result.error);\n return result.data;\n }\n\n if (\"jsonSchema\" in schema) {\n try {\n checkJsonSchema(output, schema.jsonSchema);\n } catch (err) {\n throw new SchemaViolationError(JSON.stringify(output), err);\n }\n return output as T;\n }\n\n if (\"pattern\" in schema) {\n const str = typeof output === \"string\" ? output : JSON.stringify(output);\n if (!schema.pattern.test(str)) {\n throw new SchemaViolationError(str, `Output does not match pattern ${schema.pattern}`);\n }\n return output as T;\n }\n\n if (\"validate\" in schema) {\n if (!schema.validate(output)) {\n throw new SchemaViolationError(JSON.stringify(output), \"Custom validator returned false\");\n }\n return output as T;\n }\n\n throw new Error(\"Unknown schema type\");\n}\n","import type { GenerateOptions, GenerateResult, SchemaInput, ShapecraftModel } from \"../types.js\";\nimport { MaxRetriesExceededError, SchemaViolationError } from \"../types.js\";\nimport { validateOutput } from \"./validate.js\";\n\nexport async function generate<T>(\n model: ShapecraftModel,\n schema: SchemaInput<T>,\n prompt: string,\n options: GenerateOptions = {}\n): Promise<GenerateResult<T>> {\n const maxRetries = options.maxRetries ?? 3;\n const { systemPrompt } = options;\n\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n const raw = await model.generate<T>(prompt, schema, systemPrompt);\n const data = validateOutput<T>(raw, schema);\n return {\n data,\n guaranteeLevel: model.guaranteeLevel,\n attempts: attempt,\n };\n } catch (err) {\n if (!(err instanceof SchemaViolationError)) throw err;\n if (attempt === maxRetries) break;\n }\n }\n\n throw new MaxRetriesExceededError(maxRetries);\n}\n","import { z } from \"zod\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\nimport type { SchemaInput } from \"../types.js\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function toJsonSchema(schema: z.ZodType<any>): Record<string, unknown> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return zodToJsonSchema(schema as any, { target: \"openApi3\" }) as Record<string, unknown>;\n}\n\nexport function buildStructuredPrompt(\n prompt: string,\n schema: SchemaInput,\n systemPrompt?: string\n): { system: string; user: string } {\n let schemaInfo: string;\n\n if (schema instanceof z.ZodType) {\n schemaInfo = `Respond with valid JSON matching this schema exactly:\\n\\n${JSON.stringify(toJsonSchema(schema), null, 2)}`;\n } else if (\"jsonSchema\" in schema) {\n schemaInfo = `Respond with valid JSON matching this schema exactly:\\n\\n${JSON.stringify(schema.jsonSchema, null, 2)}`;\n } else if (\"pattern\" in schema) {\n schemaInfo = `Respond with a plain string matching this pattern: ${schema.pattern}`;\n } else {\n schemaInfo = \"Respond with valid output as required.\";\n }\n\n const system = systemPrompt\n ? `${systemPrompt}\\n\\n${schemaInfo} No extra text, no markdown, no explanation.`\n : `You are a precise assistant. ${schemaInfo} No extra text, no markdown, no explanation.`;\n\n return { system, user: prompt };\n}\n","import type { SchemaInput } from \"../types.js\";\nimport { SchemaViolationError } from \"../types.js\";\nimport { isZodSchema } from \"./validate.js\";\n\nexport function parseAndValidate<T>(\n raw: string,\n schema: SchemaInput<T>,\n opts: { extractJson?: boolean } = {}\n): T {\n // Pattern schemas return the raw string directly — no JSON parsing\n if (\"pattern\" in (schema as object)) return raw as T;\n\n try {\n const text = opts.extractJson\n ? (raw.match(/\\{[\\s\\S]*\\}|\\[[\\s\\S]*\\]/)?.[0] ?? raw)\n : raw;\n const parsed = JSON.parse(text);\n\n if (isZodSchema(schema)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result = (schema as any).safeParse(parsed);\n if (!result.success) throw new SchemaViolationError(raw, result.error);\n return result.data as T;\n }\n\n return parsed as T;\n } catch (err) {\n if (err instanceof SchemaViolationError) throw err;\n throw new SchemaViolationError(raw, err);\n }\n}\n","import { z } from \"zod\";\nimport type { SchemaInput, ShapecraftModel } from \"../types.js\";\nimport { toJsonSchema, buildStructuredPrompt } from \"../core/schema.js\";\nimport { isZodSchema } from \"../core/validate.js\";\nimport { parseAndValidate } from \"../core/parse.js\";\n\nexport interface OpenAIBackendOptions {\n model?: string;\n apiKey?: string;\n baseURL?: string;\n}\n\nexport function openai(options: OpenAIBackendOptions = {}): ShapecraftModel {\n const modelId = options.model ?? \"gpt-4o-mini\";\n\n return {\n id: `openai:${modelId}`,\n guaranteeLevel: \"native\",\n\n async generate<T>(prompt: string, schema: SchemaInput<T>, systemPrompt?: string): Promise<T> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const mod: any = await import(\"openai\").catch(() => {\n throw new Error(\"Install openai: npm install openai\");\n });\n\n const OpenAI = mod.default ?? mod;\n const client = new OpenAI({\n apiKey: options.apiKey ?? process.env.OPENAI_API_KEY,\n baseURL: options.baseURL,\n });\n\n const { system, user } = buildStructuredPrompt(prompt, schema, systemPrompt);\n\n // Use strict json_schema mode for Zod, non-strict for raw jsonSchema, json_object otherwise\n const responseFormat = isZodSchema(schema)\n ? {\n type: \"json_schema\" as const,\n json_schema: { name: \"output\", strict: true, schema: toJsonSchema(schema as z.ZodType<any>) },\n }\n : \"jsonSchema\" in (schema as object)\n ? {\n type: \"json_schema\" as const,\n json_schema: { name: \"output\", strict: false, schema: (schema as { jsonSchema: Record<string, unknown> }).jsonSchema },\n }\n : { type: \"json_object\" as const };\n\n const response = await client.chat.completions.create({\n model: modelId,\n messages: [\n { role: \"system\", content: system },\n { role: \"user\", content: user },\n ],\n response_format: responseFormat,\n });\n\n const raw: string = response.choices[0]?.message?.content ?? \"\";\n\n return parseAndValidate<T>(raw, schema);\n },\n };\n}\n","import { z } from \"zod\";\nimport type { SchemaInput, ShapecraftModel } from \"../types.js\";\nimport { toJsonSchema, buildStructuredPrompt } from \"../core/schema.js\";\nimport { isZodSchema } from \"../core/validate.js\";\nimport { parseAndValidate } from \"../core/parse.js\";\n\nexport interface OllamaBackendOptions {\n model: string;\n host?: string;\n}\n\nexport function ollama(options: OllamaBackendOptions): ShapecraftModel {\n const host = options.host ?? \"http://localhost:11434\";\n\n return {\n id: `ollama:${options.model}`,\n guaranteeLevel: \"constrained\",\n\n async generate<T>(prompt: string, schema: SchemaInput<T>, systemPrompt?: string): Promise<T> {\n const { system, user } = buildStructuredPrompt(prompt, schema, systemPrompt);\n\n // Pass JSON schema to Ollama's format param for constrained decoding when possible\n let format: unknown = undefined;\n if (isZodSchema(schema)) {\n format = toJsonSchema(schema as z.ZodType<any>);\n } else if (\"jsonSchema\" in (schema as object)) {\n format = (schema as { jsonSchema: Record<string, unknown> }).jsonSchema;\n }\n\n const response = await fetch(`${host}/api/chat`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n model: options.model,\n messages: [\n { role: \"system\", content: system },\n { role: \"user\", content: user },\n ],\n ...(format ? { format } : {}),\n stream: false,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Ollama error: ${response.status} ${response.statusText}`);\n }\n\n const json = await response.json() as { message?: { content?: string } };\n const raw = json.message?.content ?? \"\";\n\n return parseAndValidate<T>(raw, schema);\n },\n };\n}\n","import type { SchemaInput, ShapecraftModel } from \"../types.js\";\nimport { buildStructuredPrompt } from \"../core/schema.js\";\nimport { parseAndValidate } from \"../core/parse.js\";\n\nexport interface AnthropicBackendOptions {\n model?: string;\n apiKey?: string;\n}\n\nexport function anthropic(options: AnthropicBackendOptions = {}): ShapecraftModel {\n const modelId = options.model ?? \"claude-sonnet-4-6\";\n\n return {\n id: `anthropic:${modelId}`,\n guaranteeLevel: \"best-effort\",\n\n async generate<T>(prompt: string, schema: SchemaInput<T>, systemPrompt?: string): Promise<T> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const mod: any = await import(\"@anthropic-ai/sdk\").catch(() => {\n throw new Error(\"Install sdk: npm install @anthropic-ai/sdk\");\n });\n\n const AnthropicClass = mod.default ?? mod;\n const client = new AnthropicClass({\n apiKey: options.apiKey ?? process.env.ANTHROPIC_API_KEY,\n });\n\n const { system, user } = buildStructuredPrompt(prompt, schema, systemPrompt);\n\n const response = await client.messages.create({\n model: modelId,\n max_tokens: 4096,\n system,\n messages: [{ role: \"user\", content: user }],\n });\n\n const raw: string =\n response.content[0]?.type === \"text\" ? response.content[0].text : \"\";\n\n return parseAndValidate<T>(raw, schema, { extractJson: true });\n },\n };\n}\n","import type { SchemaInput, ShapecraftModel } from \"../types.js\";\nimport { buildStructuredPrompt } from \"../core/schema.js\";\nimport { parseAndValidate } from \"../core/parse.js\";\n\nexport interface GroqBackendOptions {\n model?: string;\n apiKey?: string;\n}\n\nexport function groq(options: GroqBackendOptions = {}): ShapecraftModel {\n const modelId = options.model ?? \"llama-3.3-70b-versatile\";\n\n return {\n id: `groq:${modelId}`,\n guaranteeLevel: \"native\",\n\n async generate<T>(prompt: string, schema: SchemaInput<T>, systemPrompt?: string): Promise<T> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const mod: any = await import(\"groq-sdk\").catch(() => {\n throw new Error(\"Install groq: npm install groq-sdk\");\n });\n\n const Groq = mod.default ?? mod;\n const client = new Groq({\n apiKey: options.apiKey ?? process.env.GROQ_API_KEY,\n });\n\n const { system, user } = buildStructuredPrompt(prompt, schema, systemPrompt);\n\n const response = await client.chat.completions.create({\n model: modelId,\n messages: [\n { role: \"system\", content: system },\n { role: \"user\", content: user },\n ],\n response_format: { type: \"json_object\" },\n });\n\n const raw: string = response.choices[0]?.message?.content ?? \"\";\n\n return parseAndValidate<T>(raw, schema);\n },\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/types.ts","../src/core/validate.ts","../src/core/generate.ts","../src/core/schema.ts","../src/core/parse.ts","../src/backends/openai.ts","../src/backends/ollama.ts","../src/backends/anthropic.ts","../src/backends/groq.ts"],"names":["z","zodToJsonSchema"],"mappings":"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","file":"index.cjs","sourcesContent":["import { z } from \"zod\";\n\nexport type GuaranteeLevel = \"constrained\" | \"native\" | \"best-effort\";\n\nexport type JsonSchemaInput = { jsonSchema: Record<string, unknown> };\nexport type PatternInput = { pattern: RegExp };\nexport type ValidatorInput = { validate: (output: unknown) => boolean; hint?: Record<string, unknown> };\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type SchemaInput<T = unknown> = z.ZodType<T> | JsonSchemaInput | PatternInput | ValidatorInput;\n\nexport interface ShapecraftModel {\n id: string;\n guaranteeLevel: GuaranteeLevel;\n generate<T>(prompt: string, schema: SchemaInput<T>, systemPrompt?: string): Promise<T>;\n}\n\nexport interface GenerateOptions {\n maxRetries?: number;\n systemPrompt?: string;\n temperature?: number;\n}\n\nexport interface GenerateResult<T> {\n data: T;\n guaranteeLevel: GuaranteeLevel;\n attempts: number;\n}\n\nexport class SchemaViolationError extends Error {\n constructor(\n public readonly raw: string,\n public readonly validationErrors: unknown\n ) {\n super(\"Model output failed schema validation\");\n this.name = \"SchemaViolationError\";\n }\n}\n\nexport class MaxRetriesExceededError extends Error {\n constructor(public readonly attempts: number) {\n super(`Schema validation failed after ${attempts} attempts`);\n this.name = \"MaxRetriesExceededError\";\n }\n}\n","import { z } from \"zod\";\nimport type { SchemaInput } from \"../types.js\";\nimport { SchemaViolationError } from \"../types.js\";\n\nexport function isZodSchema(schema: SchemaInput): schema is z.ZodType<any> {\n return schema instanceof z.ZodType;\n}\n\nfunction nullToUndefined(value: unknown): unknown {\n if (value === null) return undefined;\n if (Array.isArray(value)) return value.map(nullToUndefined);\n if (typeof value === \"object\" && value !== null) {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>).map(([k, v]) => [k, nullToUndefined(v)])\n );\n }\n return value;\n}\n\nfunction checkJsonSchema(value: unknown, schema: Record<string, unknown>): void {\n const type = schema.type as string | undefined;\n\n if (type) {\n const actual = Array.isArray(value) ? \"array\" : value === null ? \"null\" : typeof value;\n if (actual !== type) {\n throw new Error(`Expected type \"${type}\", got \"${actual}\"`);\n }\n }\n\n if (schema.enum) {\n if (!(schema.enum as unknown[]).includes(value)) {\n throw new Error(`Value not in enum: ${JSON.stringify(value)}`);\n }\n }\n\n if (typeof value === \"object\" && value !== null && !Array.isArray(value) && schema.properties) {\n const obj = value as Record<string, unknown>;\n const required = (schema.required as string[]) ?? [];\n const properties = schema.properties as Record<string, Record<string, unknown>>;\n\n for (const key of required) {\n if (!(key in obj)) throw new Error(`Missing required property: \"${key}\"`);\n }\n\n for (const [key, propSchema] of Object.entries(properties)) {\n if (key in obj) checkJsonSchema(obj[key], propSchema);\n }\n }\n\n if (Array.isArray(value) && schema.items) {\n for (const item of value) {\n checkJsonSchema(item, schema.items as Record<string, unknown>);\n }\n }\n}\n\nexport function validateOutput<T>(output: unknown, schema: SchemaInput<T>): T {\n if (isZodSchema(schema)) {\n const result = schema.safeParse(nullToUndefined(output));\n if (!result.success) throw new SchemaViolationError(JSON.stringify(output), result.error);\n return result.data;\n }\n\n if (\"jsonSchema\" in schema) {\n try {\n checkJsonSchema(output, schema.jsonSchema);\n } catch (err) {\n throw new SchemaViolationError(JSON.stringify(output), err);\n }\n return output as T;\n }\n\n if (\"pattern\" in schema) {\n const str = typeof output === \"string\" ? output : JSON.stringify(output);\n if (!schema.pattern.test(str)) {\n throw new SchemaViolationError(str, `Output does not match pattern ${schema.pattern}`);\n }\n return output as T;\n }\n\n if (\"validate\" in schema) {\n if (!schema.validate(output)) {\n throw new SchemaViolationError(JSON.stringify(output), \"Custom validator returned false\");\n }\n return output as T;\n }\n\n throw new Error(\"Unknown schema type\");\n}\n","import type { GenerateOptions, GenerateResult, SchemaInput, ShapecraftModel } from \"../types.js\";\nimport { MaxRetriesExceededError, SchemaViolationError } from \"../types.js\";\nimport { validateOutput } from \"./validate.js\";\n\nexport async function generate<T>(\n model: ShapecraftModel,\n schema: SchemaInput<T>,\n prompt: string,\n options: GenerateOptions = {}\n): Promise<GenerateResult<T>> {\n const maxRetries = options.maxRetries ?? 3;\n const { systemPrompt } = options;\n\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n const raw = await model.generate<T>(prompt, schema, systemPrompt);\n const data = validateOutput<T>(raw, schema);\n return {\n data,\n guaranteeLevel: model.guaranteeLevel,\n attempts: attempt,\n };\n } catch (err) {\n if (!(err instanceof SchemaViolationError)) throw err;\n if (attempt === maxRetries) break;\n }\n }\n\n throw new MaxRetriesExceededError(maxRetries);\n}\n","import { z } from \"zod\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\nimport type { SchemaInput, ValidatorInput } from \"../types.js\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function toJsonSchema(schema: z.ZodType<any>): Record<string, unknown> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return zodToJsonSchema(schema as any, { target: \"openApi3\" }) as Record<string, unknown>;\n}\n\nexport function buildStructuredPrompt(\n prompt: string,\n schema: SchemaInput,\n systemPrompt?: string\n): { system: string; user: string } {\n let schemaInfo: string;\n\n if (schema instanceof z.ZodType) {\n schemaInfo = `Respond with valid JSON matching this schema exactly:\\n\\n${JSON.stringify(toJsonSchema(schema), null, 2)}`;\n } else if (\"jsonSchema\" in schema) {\n schemaInfo = `Respond with valid JSON matching this schema exactly:\\n\\n${JSON.stringify(schema.jsonSchema, null, 2)}`;\n } else if (\"pattern\" in schema) {\n schemaInfo = `Respond with a plain string matching this pattern: ${schema.pattern}`;\n } else if (\"validate\" in schema && (schema as ValidatorInput).hint) {\n schemaInfo = `Respond with valid JSON matching this schema exactly:\\n\\n${JSON.stringify((schema as ValidatorInput).hint, null, 2)}`;\n } else {\n schemaInfo = \"Respond with valid JSON. No extra text, no markdown.\";\n }\n\n const system = systemPrompt\n ? `${systemPrompt}\\n\\n${schemaInfo} No extra text, no markdown, no explanation.`\n : `You are a precise assistant. ${schemaInfo} No extra text, no markdown, no explanation.`;\n\n return { system, user: prompt };\n}\n","import type { SchemaInput } from \"../types.js\";\nimport { SchemaViolationError } from \"../types.js\";\nimport { isZodSchema } from \"./validate.js\";\n\nexport function parseAndValidate<T>(\n raw: string,\n schema: SchemaInput<T>,\n opts: { extractJson?: boolean } = {}\n): T {\n // Pattern schemas return the raw string directly — no JSON parsing\n if (\"pattern\" in (schema as object)) return raw as T;\n\n try {\n const text = opts.extractJson\n ? (raw.match(/\\{[\\s\\S]*\\}|\\[[\\s\\S]*\\]/)?.[0] ?? raw)\n : raw;\n const parsed = JSON.parse(text);\n\n if (isZodSchema(schema)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result = (schema as any).safeParse(parsed);\n if (!result.success) throw new SchemaViolationError(raw, result.error);\n return result.data as T;\n }\n\n return parsed as T;\n } catch (err) {\n if (err instanceof SchemaViolationError) throw err;\n throw new SchemaViolationError(raw, err);\n }\n}\n","import { z } from \"zod\";\nimport type { SchemaInput, ShapecraftModel } from \"../types.js\";\nimport { toJsonSchema, buildStructuredPrompt } from \"../core/schema.js\";\nimport { isZodSchema } from \"../core/validate.js\";\nimport { parseAndValidate } from \"../core/parse.js\";\n\nexport interface OpenAIBackendOptions {\n model?: string;\n apiKey?: string;\n baseURL?: string;\n}\n\nexport function openai(options: OpenAIBackendOptions = {}): ShapecraftModel {\n const modelId = options.model ?? \"gpt-4o-mini\";\n\n return {\n id: `openai:${modelId}`,\n guaranteeLevel: \"native\",\n\n async generate<T>(prompt: string, schema: SchemaInput<T>, systemPrompt?: string): Promise<T> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const mod: any = await import(\"openai\").catch(() => {\n throw new Error(\"Install openai: npm install openai\");\n });\n\n const OpenAI = mod.default ?? mod;\n const client = new OpenAI({\n apiKey: options.apiKey ?? process.env.OPENAI_API_KEY,\n baseURL: options.baseURL,\n });\n\n const { system, user } = buildStructuredPrompt(prompt, schema, systemPrompt);\n\n // Use strict json_schema mode for Zod, non-strict for raw jsonSchema, json_object otherwise\n const responseFormat = isZodSchema(schema)\n ? {\n type: \"json_schema\" as const,\n json_schema: { name: \"output\", strict: true, schema: toJsonSchema(schema as z.ZodType<any>) },\n }\n : \"jsonSchema\" in (schema as object)\n ? {\n type: \"json_schema\" as const,\n json_schema: { name: \"output\", strict: false, schema: (schema as { jsonSchema: Record<string, unknown> }).jsonSchema },\n }\n : { type: \"json_object\" as const };\n\n const response = await client.chat.completions.create({\n model: modelId,\n messages: [\n { role: \"system\", content: system },\n { role: \"user\", content: user },\n ],\n response_format: responseFormat,\n });\n\n const raw: string = response.choices[0]?.message?.content ?? \"\";\n\n return parseAndValidate<T>(raw, schema);\n },\n };\n}\n","import { z } from \"zod\";\nimport type { SchemaInput, ShapecraftModel } from \"../types.js\";\nimport { toJsonSchema, buildStructuredPrompt } from \"../core/schema.js\";\nimport { isZodSchema } from \"../core/validate.js\";\nimport { parseAndValidate } from \"../core/parse.js\";\n\nexport interface OllamaBackendOptions {\n model: string;\n host?: string;\n}\n\nexport function ollama(options: OllamaBackendOptions): ShapecraftModel {\n const host = options.host ?? \"http://localhost:11434\";\n\n return {\n id: `ollama:${options.model}`,\n guaranteeLevel: \"constrained\",\n\n async generate<T>(prompt: string, schema: SchemaInput<T>, systemPrompt?: string): Promise<T> {\n const { system, user } = buildStructuredPrompt(prompt, schema, systemPrompt);\n\n // Pass JSON schema to Ollama's format param for constrained decoding when possible\n let format: unknown = undefined;\n if (isZodSchema(schema)) {\n format = toJsonSchema(schema as z.ZodType<any>);\n } else if (\"jsonSchema\" in (schema as object)) {\n format = (schema as { jsonSchema: Record<string, unknown> }).jsonSchema;\n }\n\n const response = await fetch(`${host}/api/chat`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n model: options.model,\n messages: [\n { role: \"system\", content: system },\n { role: \"user\", content: user },\n ],\n ...(format ? { format } : {}),\n stream: false,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Ollama error: ${response.status} ${response.statusText}`);\n }\n\n const json = await response.json() as { message?: { content?: string } };\n const raw = json.message?.content ?? \"\";\n\n return parseAndValidate<T>(raw, schema);\n },\n };\n}\n","import type { SchemaInput, ShapecraftModel } from \"../types.js\";\nimport { buildStructuredPrompt } from \"../core/schema.js\";\nimport { parseAndValidate } from \"../core/parse.js\";\n\nexport interface AnthropicBackendOptions {\n model?: string;\n apiKey?: string;\n}\n\nexport function anthropic(options: AnthropicBackendOptions = {}): ShapecraftModel {\n const modelId = options.model ?? \"claude-sonnet-4-6\";\n\n return {\n id: `anthropic:${modelId}`,\n guaranteeLevel: \"best-effort\",\n\n async generate<T>(prompt: string, schema: SchemaInput<T>, systemPrompt?: string): Promise<T> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const mod: any = await import(\"@anthropic-ai/sdk\").catch(() => {\n throw new Error(\"Install sdk: npm install @anthropic-ai/sdk\");\n });\n\n const AnthropicClass = mod.default ?? mod;\n const client = new AnthropicClass({\n apiKey: options.apiKey ?? process.env.ANTHROPIC_API_KEY,\n });\n\n const { system, user } = buildStructuredPrompt(prompt, schema, systemPrompt);\n\n const response = await client.messages.create({\n model: modelId,\n max_tokens: 4096,\n system,\n messages: [{ role: \"user\", content: user }],\n });\n\n const raw: string =\n response.content[0]?.type === \"text\" ? response.content[0].text : \"\";\n\n return parseAndValidate<T>(raw, schema, { extractJson: true });\n },\n };\n}\n","import type { SchemaInput, ShapecraftModel } from \"../types.js\";\nimport { buildStructuredPrompt } from \"../core/schema.js\";\nimport { parseAndValidate } from \"../core/parse.js\";\n\nexport interface GroqBackendOptions {\n model?: string;\n apiKey?: string;\n}\n\nexport function groq(options: GroqBackendOptions = {}): ShapecraftModel {\n const modelId = options.model ?? \"llama-3.3-70b-versatile\";\n\n return {\n id: `groq:${modelId}`,\n guaranteeLevel: \"native\",\n\n async generate<T>(prompt: string, schema: SchemaInput<T>, systemPrompt?: string): Promise<T> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const mod: any = await import(\"groq-sdk\").catch(() => {\n throw new Error(\"Install groq: npm install groq-sdk\");\n });\n\n const Groq = mod.default ?? mod;\n const client = new Groq({\n apiKey: options.apiKey ?? process.env.GROQ_API_KEY,\n });\n\n const { system, user } = buildStructuredPrompt(prompt, schema, systemPrompt);\n\n const response = await client.chat.completions.create({\n model: modelId,\n messages: [\n { role: \"system\", content: system },\n { role: \"user\", content: user },\n ],\n response_format: { type: \"json_object\" },\n });\n\n const raw: string = response.choices[0]?.message?.content ?? \"\";\n\n return parseAndValidate<T>(raw, schema);\n },\n };\n}\n"]}
package/dist/index.js CHANGED
@@ -125,8 +125,12 @@ ${JSON.stringify(toJsonSchema(schema), null, 2)}`;
125
125
  ${JSON.stringify(schema.jsonSchema, null, 2)}`;
126
126
  } else if ("pattern" in schema) {
127
127
  schemaInfo = `Respond with a plain string matching this pattern: ${schema.pattern}`;
128
+ } else if ("validate" in schema && schema.hint) {
129
+ schemaInfo = `Respond with valid JSON matching this schema exactly:
130
+
131
+ ${JSON.stringify(schema.hint, null, 2)}`;
128
132
  } else {
129
- schemaInfo = "Respond with valid output as required.";
133
+ schemaInfo = "Respond with valid JSON. No extra text, no markdown.";
130
134
  }
131
135
  const system = systemPrompt ? `${systemPrompt}
132
136
 
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts","../src/core/validate.ts","../src/core/generate.ts","../src/core/schema.ts","../src/core/parse.ts","../src/backends/openai.ts","../src/backends/ollama.ts","../src/backends/anthropic.ts","../src/backends/groq.ts"],"names":["z"],"mappings":";;;;AA4BO,IAAM,oBAAA,GAAN,cAAmC,KAAA,CAAM;AAAA,EAC9C,WAAA,CACkB,KACA,gBAAA,EAChB;AACA,IAAA,KAAA,CAAM,uCAAuC,CAAA;AAH7B,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AACA,IAAA,IAAA,CAAA,gBAAA,GAAA,gBAAA;AAGhB,IAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AAAA,EACd;AACF;AAEO,IAAM,uBAAA,GAAN,cAAsC,KAAA,CAAM;AAAA,EACjD,YAA4B,QAAA,EAAkB;AAC5C,IAAA,KAAA,CAAM,CAAA,+BAAA,EAAkC,QAAQ,CAAA,SAAA,CAAW,CAAA;AADjC,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAE1B,IAAA,IAAA,CAAK,IAAA,GAAO,yBAAA;AAAA,EACd;AACF;ACvCO,SAAS,YAAY,MAAA,EAA+C;AACzE,EAAA,OAAO,kBAAkB,CAAA,CAAE,OAAA;AAC7B;AAEA,SAAS,gBAAgB,KAAA,EAAyB;AAChD,EAAA,IAAI,KAAA,KAAU,MAAM,OAAO,MAAA;AAC3B,EAAA,IAAI,MAAM,OAAA,CAAQ,KAAK,GAAG,OAAO,KAAA,CAAM,IAAI,eAAe,CAAA;AAC1D,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,EAAM;AAC/C,IAAA,OAAO,MAAA,CAAO,WAAA;AAAA,MACZ,MAAA,CAAO,OAAA,CAAQ,KAAgC,CAAA,CAAE,IAAI,CAAC,CAAC,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA,EAAG,eAAA,CAAgB,CAAC,CAAC,CAAC;AAAA,KAC1F;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,eAAA,CAAgB,OAAgB,MAAA,EAAuC;AAC9E,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AAEpB,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,KAAK,IAAI,OAAA,GAAU,KAAA,KAAU,IAAA,GAAO,MAAA,GAAS,OAAO,KAAA;AACjF,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,eAAA,EAAkB,IAAI,CAAA,QAAA,EAAW,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,IAC5D;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,IAAA,EAAM;AACf,IAAA,IAAI,CAAE,MAAA,CAAO,IAAA,CAAmB,QAAA,CAAS,KAAK,CAAA,EAAG;AAC/C,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,KAAK,SAAA,CAAU,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,IAC/D;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,IAAQ,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,IAAK,MAAA,CAAO,UAAA,EAAY;AAC7F,IAAA,MAAM,GAAA,GAAM,KAAA;AACZ,IAAA,MAAM,QAAA,GAAY,MAAA,CAAO,QAAA,IAAyB,EAAC;AACnD,IAAA,MAAM,aAAa,MAAA,CAAO,UAAA;AAE1B,IAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,MAAA,IAAI,EAAE,OAAO,GAAA,CAAA,EAAM,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,IAC1E;AAEA,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,UAAU,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AAC1D,MAAA,IAAI,OAAO,GAAA,EAAK,eAAA,CAAgB,GAAA,CAAI,GAAG,GAAG,UAAU,CAAA;AAAA,IACtD;AAAA,EACF;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,IAAK,OAAO,KAAA,EAAO;AACxC,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,eAAA,CAAgB,IAAA,EAAM,OAAO,KAAgC,CAAA;AAAA,IAC/D;AAAA,EACF;AACF;AAEO,SAAS,cAAA,CAAkB,QAAiB,MAAA,EAA2B;AAC5E,EAAA,IAAI,WAAA,CAAY,MAAM,CAAA,EAAG;AACvB,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,SAAA,CAAU,eAAA,CAAgB,MAAM,CAAC,CAAA;AACvD,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA,EAAS,MAAM,IAAI,oBAAA,CAAqB,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG,MAAA,CAAO,KAAK,CAAA;AACxF,IAAA,OAAO,MAAA,CAAO,IAAA;AAAA,EAChB;AAEA,EAAA,IAAI,gBAAgB,MAAA,EAAQ;AAC1B,IAAA,IAAI;AACF,MAAA,eAAA,CAAgB,MAAA,EAAQ,OAAO,UAAU,CAAA;AAAA,IAC3C,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,IAAI,oBAAA,CAAqB,IAAA,CAAK,SAAA,CAAU,MAAM,GAAG,GAAG,CAAA;AAAA,IAC5D;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,aAAa,MAAA,EAAQ;AACvB,IAAA,MAAM,MAAM,OAAO,MAAA,KAAW,WAAW,MAAA,GAAS,IAAA,CAAK,UAAU,MAAM,CAAA;AACvE,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA,EAAG;AAC7B,MAAA,MAAM,IAAI,oBAAA,CAAqB,GAAA,EAAK,CAAA,8BAAA,EAAiC,MAAA,CAAO,OAAO,CAAA,CAAE,CAAA;AAAA,IACvF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,cAAc,MAAA,EAAQ;AACxB,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,EAAG;AAC5B,MAAA,MAAM,IAAI,oBAAA,CAAqB,IAAA,CAAK,SAAA,CAAU,MAAM,GAAG,iCAAiC,CAAA;AAAA,IAC1F;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAI,MAAM,qBAAqB,CAAA;AACvC;;;ACpFA,eAAsB,SACpB,KAAA,EACA,MAAA,EACA,MAAA,EACA,OAAA,GAA2B,EAAC,EACA;AAC5B,EAAA,MAAM,UAAA,GAAa,QAAQ,UAAA,IAAc,CAAA;AACzC,EAAA,MAAM,EAAE,cAAa,GAAI,OAAA;AAEzB,EAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,UAAA,EAAY,OAAA,EAAA,EAAW;AACtD,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,MAAM,KAAA,CAAM,QAAA,CAAY,MAAA,EAAQ,QAAQ,YAAY,CAAA;AAChE,MAAA,MAAM,IAAA,GAAO,cAAA,CAAkB,GAAA,EAAK,MAAM,CAAA;AAC1C,MAAA,OAAO;AAAA,QACL,IAAA;AAAA,QACA,gBAAgB,KAAA,CAAM,cAAA;AAAA,QACtB,QAAA,EAAU;AAAA,OACZ;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,EAAE,GAAA,YAAe,oBAAA,CAAA,EAAuB,MAAM,GAAA;AAClD,MAAA,IAAI,YAAY,UAAA,EAAY;AAAA,IAC9B;AAAA,EACF;AAEA,EAAA,MAAM,IAAI,wBAAwB,UAAU,CAAA;AAC9C;ACxBO,SAAS,aAAa,MAAA,EAAiD;AAE5E,EAAA,OAAO,eAAA,CAAgB,MAAA,EAAe,EAAE,MAAA,EAAQ,YAAY,CAAA;AAC9D;AAEO,SAAS,qBAAA,CACd,MAAA,EACA,MAAA,EACA,YAAA,EACkC;AAClC,EAAA,IAAI,UAAA;AAEJ,EAAA,IAAI,MAAA,YAAkBA,EAAE,OAAA,EAAS;AAC/B,IAAA,UAAA,GAAa,CAAA;;AAAA,EAA4D,KAAK,SAAA,CAAU,YAAA,CAAa,MAAM,CAAA,EAAG,IAAA,EAAM,CAAC,CAAC,CAAA,CAAA;AAAA,EACxH,CAAA,MAAA,IAAW,gBAAgB,MAAA,EAAQ;AACjC,IAAA,UAAA,GAAa,CAAA;;AAAA,EAA4D,KAAK,SAAA,CAAU,MAAA,CAAO,UAAA,EAAY,IAAA,EAAM,CAAC,CAAC,CAAA,CAAA;AAAA,EACrH,CAAA,MAAA,IAAW,aAAa,MAAA,EAAQ;AAC9B,IAAA,UAAA,GAAa,CAAA,mDAAA,EAAsD,OAAO,OAAO,CAAA,CAAA;AAAA,EACnF,CAAA,MAAO;AACL,IAAA,UAAA,GAAa,wCAAA;AAAA,EACf;AAEA,EAAA,MAAM,MAAA,GAAS,YAAA,GACX,CAAA,EAAG,YAAY;;AAAA,EAAO,UAAU,CAAA,4CAAA,CAAA,GAChC,CAAA,6BAAA,EAAgC,UAAU,CAAA,4CAAA,CAAA;AAE9C,EAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAO;AAChC;;;AC5BO,SAAS,gBAAA,CACd,GAAA,EACA,MAAA,EACA,IAAA,GAAkC,EAAC,EAChC;AAEH,EAAA,IAAI,SAAA,IAAc,QAAmB,OAAO,GAAA;AAE5C,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,KAAK,WAAA,GACb,GAAA,CAAI,MAAM,yBAAyB,CAAA,GAAI,CAAC,CAAA,IAAK,GAAA,GAC9C,GAAA;AACJ,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAE9B,IAAA,IAAI,WAAA,CAAY,MAAM,CAAA,EAAG;AAEvB,MAAA,MAAM,MAAA,GAAU,MAAA,CAAe,SAAA,CAAU,MAAM,CAAA;AAC/C,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS,MAAM,IAAI,oBAAA,CAAqB,GAAA,EAAK,OAAO,KAAK,CAAA;AACrE,MAAA,OAAO,MAAA,CAAO,IAAA;AAAA,IAChB;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,GAAA,YAAe,sBAAsB,MAAM,GAAA;AAC/C,IAAA,MAAM,IAAI,oBAAA,CAAqB,GAAA,EAAK,GAAG,CAAA;AAAA,EACzC;AACF;;;AClBO,SAAS,MAAA,CAAO,OAAA,GAAgC,EAAC,EAAoB;AAC1E,EAAA,MAAM,OAAA,GAAU,QAAQ,KAAA,IAAS,aAAA;AAEjC,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,UAAU,OAAO,CAAA,CAAA;AAAA,IACrB,cAAA,EAAgB,QAAA;AAAA,IAEhB,MAAM,QAAA,CAAY,MAAA,EAAgB,MAAA,EAAwB,YAAA,EAAmC;AAE3F,MAAA,MAAM,MAAW,MAAM,OAAO,QAAQ,CAAA,CAAE,MAAM,MAAM;AAClD,QAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,MACtD,CAAC,CAAA;AAED,MAAA,MAAM,MAAA,GAAS,IAAI,OAAA,IAAW,GAAA;AAC9B,MAAA,MAAM,MAAA,GAAS,IAAI,MAAA,CAAO;AAAA,QACxB,MAAA,EAAQ,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,GAAA,CAAI,cAAA;AAAA,QACtC,SAAS,OAAA,CAAQ;AAAA,OAClB,CAAA;AAED,MAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,KAAS,qBAAA,CAAsB,MAAA,EAAQ,QAAQ,YAAY,CAAA;AAG3E,MAAA,MAAM,cAAA,GAAiB,WAAA,CAAY,MAAM,CAAA,GACrC;AAAA,QACE,IAAA,EAAM,aAAA;AAAA,QACN,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAU,QAAQ,IAAA,EAAM,MAAA,EAAQ,YAAA,CAAa,MAAwB,CAAA;AAAE,OAC9F,GACA,gBAAiB,MAAA,GACf;AAAA,QACE,IAAA,EAAM,aAAA;AAAA,QACN,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAU,QAAQ,KAAA,EAAO,MAAA,EAAS,OAAmD,UAAA;AAAW,OACvH,GACA,EAAE,IAAA,EAAM,aAAA,EAAuB;AAErC,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA,CAAK,YAAY,MAAA,CAAO;AAAA,QACpD,KAAA,EAAO,OAAA;AAAA,QACP,QAAA,EAAU;AAAA,UACR,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,MAAA,EAAO;AAAA,UAClC,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,IAAA;AAAK,SAChC;AAAA,QACA,eAAA,EAAiB;AAAA,OAClB,CAAA;AAED,MAAA,MAAM,MAAc,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,EAAG,SAAS,OAAA,IAAW,EAAA;AAE7D,MAAA,OAAO,gBAAA,CAAoB,KAAK,MAAM,CAAA;AAAA,IACxC;AAAA,GACF;AACF;;;ACjDO,SAAS,OAAO,OAAA,EAAgD;AACrE,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,wBAAA;AAE7B,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,CAAA,OAAA,EAAU,OAAA,CAAQ,KAAK,CAAA,CAAA;AAAA,IAC3B,cAAA,EAAgB,aAAA;AAAA,IAEhB,MAAM,QAAA,CAAY,MAAA,EAAgB,MAAA,EAAwB,YAAA,EAAmC;AAC3F,MAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,KAAS,qBAAA,CAAsB,MAAA,EAAQ,QAAQ,YAAY,CAAA;AAG3E,MAAA,IAAI,MAAA,GAAkB,MAAA;AACtB,MAAA,IAAI,WAAA,CAAY,MAAM,CAAA,EAAG;AACvB,QAAA,MAAA,GAAS,aAAa,MAAwB,CAAA;AAAA,MAChD,CAAA,MAAA,IAAW,gBAAiB,MAAA,EAAmB;AAC7C,QAAA,MAAA,GAAU,MAAA,CAAmD,UAAA;AAAA,MAC/D;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,SAAA,CAAA,EAAa;AAAA,QAC/C,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,QAC9C,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACnB,OAAO,OAAA,CAAQ,KAAA;AAAA,UACf,QAAA,EAAU;AAAA,YACR,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,MAAA,EAAO;AAAA,YAClC,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,IAAA;AAAK,WAChC;AAAA,UACA,GAAI,MAAA,GAAS,EAAE,MAAA,KAAW,EAAC;AAAA,UAC3B,MAAA,EAAQ;AAAA,SACT;AAAA,OACF,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAI,MAAM,CAAA,cAAA,EAAiB,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,MAC3E;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,EAAS,OAAA,IAAW,EAAA;AAErC,MAAA,OAAO,gBAAA,CAAoB,KAAK,MAAM,CAAA;AAAA,IACxC;AAAA,GACF;AACF;;;AC5CO,SAAS,SAAA,CAAU,OAAA,GAAmC,EAAC,EAAoB;AAChF,EAAA,MAAM,OAAA,GAAU,QAAQ,KAAA,IAAS,mBAAA;AAEjC,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,aAAa,OAAO,CAAA,CAAA;AAAA,IACxB,cAAA,EAAgB,aAAA;AAAA,IAEhB,MAAM,QAAA,CAAY,MAAA,EAAgB,MAAA,EAAwB,YAAA,EAAmC;AAE3F,MAAA,MAAM,MAAW,MAAM,OAAO,mBAAmB,CAAA,CAAE,MAAM,MAAM;AAC7D,QAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,MAC9D,CAAC,CAAA;AAED,MAAA,MAAM,cAAA,GAAiB,IAAI,OAAA,IAAW,GAAA;AACtC,MAAA,MAAM,MAAA,GAAS,IAAI,cAAA,CAAe;AAAA,QAChC,MAAA,EAAQ,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,GAAA,CAAI;AAAA,OACvC,CAAA;AAED,MAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,KAAS,qBAAA,CAAsB,MAAA,EAAQ,QAAQ,YAAY,CAAA;AAE3E,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO;AAAA,QAC5C,KAAA,EAAO,OAAA;AAAA,QACP,UAAA,EAAY,IAAA;AAAA,QACZ,MAAA;AAAA,QACA,UAAU,CAAC,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,MAAM;AAAA,OAC3C,CAAA;AAED,MAAA,MAAM,GAAA,GACJ,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,EAAG,IAAA,KAAS,MAAA,GAAS,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAA,GAAO,EAAA;AAEpE,MAAA,OAAO,iBAAoB,GAAA,EAAK,MAAA,EAAQ,EAAE,WAAA,EAAa,MAAM,CAAA;AAAA,IAC/D;AAAA,GACF;AACF;;;ACjCO,SAAS,IAAA,CAAK,OAAA,GAA8B,EAAC,EAAoB;AACtE,EAAA,MAAM,OAAA,GAAU,QAAQ,KAAA,IAAS,yBAAA;AAEjC,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,QAAQ,OAAO,CAAA,CAAA;AAAA,IACnB,cAAA,EAAgB,QAAA;AAAA,IAEhB,MAAM,QAAA,CAAY,MAAA,EAAgB,MAAA,EAAwB,YAAA,EAAmC;AAE3F,MAAA,MAAM,MAAW,MAAM,OAAO,UAAU,CAAA,CAAE,MAAM,MAAM;AACpD,QAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,MACtD,CAAC,CAAA;AAED,MAAA,MAAM,IAAA,GAAO,IAAI,OAAA,IAAW,GAAA;AAC5B,MAAA,MAAM,MAAA,GAAS,IAAI,IAAA,CAAK;AAAA,QACtB,MAAA,EAAQ,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,GAAA,CAAI;AAAA,OACvC,CAAA;AAED,MAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,KAAS,qBAAA,CAAsB,MAAA,EAAQ,QAAQ,YAAY,CAAA;AAE3E,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA,CAAK,YAAY,MAAA,CAAO;AAAA,QACpD,KAAA,EAAO,OAAA;AAAA,QACP,QAAA,EAAU;AAAA,UACR,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,MAAA,EAAO;AAAA,UAClC,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,IAAA;AAAK,SAChC;AAAA,QACA,eAAA,EAAiB,EAAE,IAAA,EAAM,aAAA;AAAc,OACxC,CAAA;AAED,MAAA,MAAM,MAAc,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,EAAG,SAAS,OAAA,IAAW,EAAA;AAE7D,MAAA,OAAO,gBAAA,CAAoB,KAAK,MAAM,CAAA;AAAA,IACxC;AAAA,GACF;AACF","file":"index.js","sourcesContent":["import { z } from \"zod\";\n\nexport type GuaranteeLevel = \"constrained\" | \"native\" | \"best-effort\";\n\nexport type JsonSchemaInput = { jsonSchema: Record<string, unknown> };\nexport type PatternInput = { pattern: RegExp };\nexport type ValidatorInput = { validate: (output: unknown) => boolean };\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type SchemaInput<T = unknown> = z.ZodType<T> | JsonSchemaInput | PatternInput | ValidatorInput;\n\nexport interface ShapecraftModel {\n id: string;\n guaranteeLevel: GuaranteeLevel;\n generate<T>(prompt: string, schema: SchemaInput<T>, systemPrompt?: string): Promise<T>;\n}\n\nexport interface GenerateOptions {\n maxRetries?: number;\n systemPrompt?: string;\n temperature?: number;\n}\n\nexport interface GenerateResult<T> {\n data: T;\n guaranteeLevel: GuaranteeLevel;\n attempts: number;\n}\n\nexport class SchemaViolationError extends Error {\n constructor(\n public readonly raw: string,\n public readonly validationErrors: unknown\n ) {\n super(\"Model output failed schema validation\");\n this.name = \"SchemaViolationError\";\n }\n}\n\nexport class MaxRetriesExceededError extends Error {\n constructor(public readonly attempts: number) {\n super(`Schema validation failed after ${attempts} attempts`);\n this.name = \"MaxRetriesExceededError\";\n }\n}\n","import { z } from \"zod\";\nimport type { SchemaInput } from \"../types.js\";\nimport { SchemaViolationError } from \"../types.js\";\n\nexport function isZodSchema(schema: SchemaInput): schema is z.ZodType<any> {\n return schema instanceof z.ZodType;\n}\n\nfunction nullToUndefined(value: unknown): unknown {\n if (value === null) return undefined;\n if (Array.isArray(value)) return value.map(nullToUndefined);\n if (typeof value === \"object\" && value !== null) {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>).map(([k, v]) => [k, nullToUndefined(v)])\n );\n }\n return value;\n}\n\nfunction checkJsonSchema(value: unknown, schema: Record<string, unknown>): void {\n const type = schema.type as string | undefined;\n\n if (type) {\n const actual = Array.isArray(value) ? \"array\" : value === null ? \"null\" : typeof value;\n if (actual !== type) {\n throw new Error(`Expected type \"${type}\", got \"${actual}\"`);\n }\n }\n\n if (schema.enum) {\n if (!(schema.enum as unknown[]).includes(value)) {\n throw new Error(`Value not in enum: ${JSON.stringify(value)}`);\n }\n }\n\n if (typeof value === \"object\" && value !== null && !Array.isArray(value) && schema.properties) {\n const obj = value as Record<string, unknown>;\n const required = (schema.required as string[]) ?? [];\n const properties = schema.properties as Record<string, Record<string, unknown>>;\n\n for (const key of required) {\n if (!(key in obj)) throw new Error(`Missing required property: \"${key}\"`);\n }\n\n for (const [key, propSchema] of Object.entries(properties)) {\n if (key in obj) checkJsonSchema(obj[key], propSchema);\n }\n }\n\n if (Array.isArray(value) && schema.items) {\n for (const item of value) {\n checkJsonSchema(item, schema.items as Record<string, unknown>);\n }\n }\n}\n\nexport function validateOutput<T>(output: unknown, schema: SchemaInput<T>): T {\n if (isZodSchema(schema)) {\n const result = schema.safeParse(nullToUndefined(output));\n if (!result.success) throw new SchemaViolationError(JSON.stringify(output), result.error);\n return result.data;\n }\n\n if (\"jsonSchema\" in schema) {\n try {\n checkJsonSchema(output, schema.jsonSchema);\n } catch (err) {\n throw new SchemaViolationError(JSON.stringify(output), err);\n }\n return output as T;\n }\n\n if (\"pattern\" in schema) {\n const str = typeof output === \"string\" ? output : JSON.stringify(output);\n if (!schema.pattern.test(str)) {\n throw new SchemaViolationError(str, `Output does not match pattern ${schema.pattern}`);\n }\n return output as T;\n }\n\n if (\"validate\" in schema) {\n if (!schema.validate(output)) {\n throw new SchemaViolationError(JSON.stringify(output), \"Custom validator returned false\");\n }\n return output as T;\n }\n\n throw new Error(\"Unknown schema type\");\n}\n","import type { GenerateOptions, GenerateResult, SchemaInput, ShapecraftModel } from \"../types.js\";\nimport { MaxRetriesExceededError, SchemaViolationError } from \"../types.js\";\nimport { validateOutput } from \"./validate.js\";\n\nexport async function generate<T>(\n model: ShapecraftModel,\n schema: SchemaInput<T>,\n prompt: string,\n options: GenerateOptions = {}\n): Promise<GenerateResult<T>> {\n const maxRetries = options.maxRetries ?? 3;\n const { systemPrompt } = options;\n\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n const raw = await model.generate<T>(prompt, schema, systemPrompt);\n const data = validateOutput<T>(raw, schema);\n return {\n data,\n guaranteeLevel: model.guaranteeLevel,\n attempts: attempt,\n };\n } catch (err) {\n if (!(err instanceof SchemaViolationError)) throw err;\n if (attempt === maxRetries) break;\n }\n }\n\n throw new MaxRetriesExceededError(maxRetries);\n}\n","import { z } from \"zod\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\nimport type { SchemaInput } from \"../types.js\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function toJsonSchema(schema: z.ZodType<any>): Record<string, unknown> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return zodToJsonSchema(schema as any, { target: \"openApi3\" }) as Record<string, unknown>;\n}\n\nexport function buildStructuredPrompt(\n prompt: string,\n schema: SchemaInput,\n systemPrompt?: string\n): { system: string; user: string } {\n let schemaInfo: string;\n\n if (schema instanceof z.ZodType) {\n schemaInfo = `Respond with valid JSON matching this schema exactly:\\n\\n${JSON.stringify(toJsonSchema(schema), null, 2)}`;\n } else if (\"jsonSchema\" in schema) {\n schemaInfo = `Respond with valid JSON matching this schema exactly:\\n\\n${JSON.stringify(schema.jsonSchema, null, 2)}`;\n } else if (\"pattern\" in schema) {\n schemaInfo = `Respond with a plain string matching this pattern: ${schema.pattern}`;\n } else {\n schemaInfo = \"Respond with valid output as required.\";\n }\n\n const system = systemPrompt\n ? `${systemPrompt}\\n\\n${schemaInfo} No extra text, no markdown, no explanation.`\n : `You are a precise assistant. ${schemaInfo} No extra text, no markdown, no explanation.`;\n\n return { system, user: prompt };\n}\n","import type { SchemaInput } from \"../types.js\";\nimport { SchemaViolationError } from \"../types.js\";\nimport { isZodSchema } from \"./validate.js\";\n\nexport function parseAndValidate<T>(\n raw: string,\n schema: SchemaInput<T>,\n opts: { extractJson?: boolean } = {}\n): T {\n // Pattern schemas return the raw string directly — no JSON parsing\n if (\"pattern\" in (schema as object)) return raw as T;\n\n try {\n const text = opts.extractJson\n ? (raw.match(/\\{[\\s\\S]*\\}|\\[[\\s\\S]*\\]/)?.[0] ?? raw)\n : raw;\n const parsed = JSON.parse(text);\n\n if (isZodSchema(schema)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result = (schema as any).safeParse(parsed);\n if (!result.success) throw new SchemaViolationError(raw, result.error);\n return result.data as T;\n }\n\n return parsed as T;\n } catch (err) {\n if (err instanceof SchemaViolationError) throw err;\n throw new SchemaViolationError(raw, err);\n }\n}\n","import { z } from \"zod\";\nimport type { SchemaInput, ShapecraftModel } from \"../types.js\";\nimport { toJsonSchema, buildStructuredPrompt } from \"../core/schema.js\";\nimport { isZodSchema } from \"../core/validate.js\";\nimport { parseAndValidate } from \"../core/parse.js\";\n\nexport interface OpenAIBackendOptions {\n model?: string;\n apiKey?: string;\n baseURL?: string;\n}\n\nexport function openai(options: OpenAIBackendOptions = {}): ShapecraftModel {\n const modelId = options.model ?? \"gpt-4o-mini\";\n\n return {\n id: `openai:${modelId}`,\n guaranteeLevel: \"native\",\n\n async generate<T>(prompt: string, schema: SchemaInput<T>, systemPrompt?: string): Promise<T> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const mod: any = await import(\"openai\").catch(() => {\n throw new Error(\"Install openai: npm install openai\");\n });\n\n const OpenAI = mod.default ?? mod;\n const client = new OpenAI({\n apiKey: options.apiKey ?? process.env.OPENAI_API_KEY,\n baseURL: options.baseURL,\n });\n\n const { system, user } = buildStructuredPrompt(prompt, schema, systemPrompt);\n\n // Use strict json_schema mode for Zod, non-strict for raw jsonSchema, json_object otherwise\n const responseFormat = isZodSchema(schema)\n ? {\n type: \"json_schema\" as const,\n json_schema: { name: \"output\", strict: true, schema: toJsonSchema(schema as z.ZodType<any>) },\n }\n : \"jsonSchema\" in (schema as object)\n ? {\n type: \"json_schema\" as const,\n json_schema: { name: \"output\", strict: false, schema: (schema as { jsonSchema: Record<string, unknown> }).jsonSchema },\n }\n : { type: \"json_object\" as const };\n\n const response = await client.chat.completions.create({\n model: modelId,\n messages: [\n { role: \"system\", content: system },\n { role: \"user\", content: user },\n ],\n response_format: responseFormat,\n });\n\n const raw: string = response.choices[0]?.message?.content ?? \"\";\n\n return parseAndValidate<T>(raw, schema);\n },\n };\n}\n","import { z } from \"zod\";\nimport type { SchemaInput, ShapecraftModel } from \"../types.js\";\nimport { toJsonSchema, buildStructuredPrompt } from \"../core/schema.js\";\nimport { isZodSchema } from \"../core/validate.js\";\nimport { parseAndValidate } from \"../core/parse.js\";\n\nexport interface OllamaBackendOptions {\n model: string;\n host?: string;\n}\n\nexport function ollama(options: OllamaBackendOptions): ShapecraftModel {\n const host = options.host ?? \"http://localhost:11434\";\n\n return {\n id: `ollama:${options.model}`,\n guaranteeLevel: \"constrained\",\n\n async generate<T>(prompt: string, schema: SchemaInput<T>, systemPrompt?: string): Promise<T> {\n const { system, user } = buildStructuredPrompt(prompt, schema, systemPrompt);\n\n // Pass JSON schema to Ollama's format param for constrained decoding when possible\n let format: unknown = undefined;\n if (isZodSchema(schema)) {\n format = toJsonSchema(schema as z.ZodType<any>);\n } else if (\"jsonSchema\" in (schema as object)) {\n format = (schema as { jsonSchema: Record<string, unknown> }).jsonSchema;\n }\n\n const response = await fetch(`${host}/api/chat`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n model: options.model,\n messages: [\n { role: \"system\", content: system },\n { role: \"user\", content: user },\n ],\n ...(format ? { format } : {}),\n stream: false,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Ollama error: ${response.status} ${response.statusText}`);\n }\n\n const json = await response.json() as { message?: { content?: string } };\n const raw = json.message?.content ?? \"\";\n\n return parseAndValidate<T>(raw, schema);\n },\n };\n}\n","import type { SchemaInput, ShapecraftModel } from \"../types.js\";\nimport { buildStructuredPrompt } from \"../core/schema.js\";\nimport { parseAndValidate } from \"../core/parse.js\";\n\nexport interface AnthropicBackendOptions {\n model?: string;\n apiKey?: string;\n}\n\nexport function anthropic(options: AnthropicBackendOptions = {}): ShapecraftModel {\n const modelId = options.model ?? \"claude-sonnet-4-6\";\n\n return {\n id: `anthropic:${modelId}`,\n guaranteeLevel: \"best-effort\",\n\n async generate<T>(prompt: string, schema: SchemaInput<T>, systemPrompt?: string): Promise<T> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const mod: any = await import(\"@anthropic-ai/sdk\").catch(() => {\n throw new Error(\"Install sdk: npm install @anthropic-ai/sdk\");\n });\n\n const AnthropicClass = mod.default ?? mod;\n const client = new AnthropicClass({\n apiKey: options.apiKey ?? process.env.ANTHROPIC_API_KEY,\n });\n\n const { system, user } = buildStructuredPrompt(prompt, schema, systemPrompt);\n\n const response = await client.messages.create({\n model: modelId,\n max_tokens: 4096,\n system,\n messages: [{ role: \"user\", content: user }],\n });\n\n const raw: string =\n response.content[0]?.type === \"text\" ? response.content[0].text : \"\";\n\n return parseAndValidate<T>(raw, schema, { extractJson: true });\n },\n };\n}\n","import type { SchemaInput, ShapecraftModel } from \"../types.js\";\nimport { buildStructuredPrompt } from \"../core/schema.js\";\nimport { parseAndValidate } from \"../core/parse.js\";\n\nexport interface GroqBackendOptions {\n model?: string;\n apiKey?: string;\n}\n\nexport function groq(options: GroqBackendOptions = {}): ShapecraftModel {\n const modelId = options.model ?? \"llama-3.3-70b-versatile\";\n\n return {\n id: `groq:${modelId}`,\n guaranteeLevel: \"native\",\n\n async generate<T>(prompt: string, schema: SchemaInput<T>, systemPrompt?: string): Promise<T> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const mod: any = await import(\"groq-sdk\").catch(() => {\n throw new Error(\"Install groq: npm install groq-sdk\");\n });\n\n const Groq = mod.default ?? mod;\n const client = new Groq({\n apiKey: options.apiKey ?? process.env.GROQ_API_KEY,\n });\n\n const { system, user } = buildStructuredPrompt(prompt, schema, systemPrompt);\n\n const response = await client.chat.completions.create({\n model: modelId,\n messages: [\n { role: \"system\", content: system },\n { role: \"user\", content: user },\n ],\n response_format: { type: \"json_object\" },\n });\n\n const raw: string = response.choices[0]?.message?.content ?? \"\";\n\n return parseAndValidate<T>(raw, schema);\n },\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/types.ts","../src/core/validate.ts","../src/core/generate.ts","../src/core/schema.ts","../src/core/parse.ts","../src/backends/openai.ts","../src/backends/ollama.ts","../src/backends/anthropic.ts","../src/backends/groq.ts"],"names":["z"],"mappings":"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","file":"index.js","sourcesContent":["import { z } from \"zod\";\n\nexport type GuaranteeLevel = \"constrained\" | \"native\" | \"best-effort\";\n\nexport type JsonSchemaInput = { jsonSchema: Record<string, unknown> };\nexport type PatternInput = { pattern: RegExp };\nexport type ValidatorInput = { validate: (output: unknown) => boolean; hint?: Record<string, unknown> };\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type SchemaInput<T = unknown> = z.ZodType<T> | JsonSchemaInput | PatternInput | ValidatorInput;\n\nexport interface ShapecraftModel {\n id: string;\n guaranteeLevel: GuaranteeLevel;\n generate<T>(prompt: string, schema: SchemaInput<T>, systemPrompt?: string): Promise<T>;\n}\n\nexport interface GenerateOptions {\n maxRetries?: number;\n systemPrompt?: string;\n temperature?: number;\n}\n\nexport interface GenerateResult<T> {\n data: T;\n guaranteeLevel: GuaranteeLevel;\n attempts: number;\n}\n\nexport class SchemaViolationError extends Error {\n constructor(\n public readonly raw: string,\n public readonly validationErrors: unknown\n ) {\n super(\"Model output failed schema validation\");\n this.name = \"SchemaViolationError\";\n }\n}\n\nexport class MaxRetriesExceededError extends Error {\n constructor(public readonly attempts: number) {\n super(`Schema validation failed after ${attempts} attempts`);\n this.name = \"MaxRetriesExceededError\";\n }\n}\n","import { z } from \"zod\";\nimport type { SchemaInput } from \"../types.js\";\nimport { SchemaViolationError } from \"../types.js\";\n\nexport function isZodSchema(schema: SchemaInput): schema is z.ZodType<any> {\n return schema instanceof z.ZodType;\n}\n\nfunction nullToUndefined(value: unknown): unknown {\n if (value === null) return undefined;\n if (Array.isArray(value)) return value.map(nullToUndefined);\n if (typeof value === \"object\" && value !== null) {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>).map(([k, v]) => [k, nullToUndefined(v)])\n );\n }\n return value;\n}\n\nfunction checkJsonSchema(value: unknown, schema: Record<string, unknown>): void {\n const type = schema.type as string | undefined;\n\n if (type) {\n const actual = Array.isArray(value) ? \"array\" : value === null ? \"null\" : typeof value;\n if (actual !== type) {\n throw new Error(`Expected type \"${type}\", got \"${actual}\"`);\n }\n }\n\n if (schema.enum) {\n if (!(schema.enum as unknown[]).includes(value)) {\n throw new Error(`Value not in enum: ${JSON.stringify(value)}`);\n }\n }\n\n if (typeof value === \"object\" && value !== null && !Array.isArray(value) && schema.properties) {\n const obj = value as Record<string, unknown>;\n const required = (schema.required as string[]) ?? [];\n const properties = schema.properties as Record<string, Record<string, unknown>>;\n\n for (const key of required) {\n if (!(key in obj)) throw new Error(`Missing required property: \"${key}\"`);\n }\n\n for (const [key, propSchema] of Object.entries(properties)) {\n if (key in obj) checkJsonSchema(obj[key], propSchema);\n }\n }\n\n if (Array.isArray(value) && schema.items) {\n for (const item of value) {\n checkJsonSchema(item, schema.items as Record<string, unknown>);\n }\n }\n}\n\nexport function validateOutput<T>(output: unknown, schema: SchemaInput<T>): T {\n if (isZodSchema(schema)) {\n const result = schema.safeParse(nullToUndefined(output));\n if (!result.success) throw new SchemaViolationError(JSON.stringify(output), result.error);\n return result.data;\n }\n\n if (\"jsonSchema\" in schema) {\n try {\n checkJsonSchema(output, schema.jsonSchema);\n } catch (err) {\n throw new SchemaViolationError(JSON.stringify(output), err);\n }\n return output as T;\n }\n\n if (\"pattern\" in schema) {\n const str = typeof output === \"string\" ? output : JSON.stringify(output);\n if (!schema.pattern.test(str)) {\n throw new SchemaViolationError(str, `Output does not match pattern ${schema.pattern}`);\n }\n return output as T;\n }\n\n if (\"validate\" in schema) {\n if (!schema.validate(output)) {\n throw new SchemaViolationError(JSON.stringify(output), \"Custom validator returned false\");\n }\n return output as T;\n }\n\n throw new Error(\"Unknown schema type\");\n}\n","import type { GenerateOptions, GenerateResult, SchemaInput, ShapecraftModel } from \"../types.js\";\nimport { MaxRetriesExceededError, SchemaViolationError } from \"../types.js\";\nimport { validateOutput } from \"./validate.js\";\n\nexport async function generate<T>(\n model: ShapecraftModel,\n schema: SchemaInput<T>,\n prompt: string,\n options: GenerateOptions = {}\n): Promise<GenerateResult<T>> {\n const maxRetries = options.maxRetries ?? 3;\n const { systemPrompt } = options;\n\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n const raw = await model.generate<T>(prompt, schema, systemPrompt);\n const data = validateOutput<T>(raw, schema);\n return {\n data,\n guaranteeLevel: model.guaranteeLevel,\n attempts: attempt,\n };\n } catch (err) {\n if (!(err instanceof SchemaViolationError)) throw err;\n if (attempt === maxRetries) break;\n }\n }\n\n throw new MaxRetriesExceededError(maxRetries);\n}\n","import { z } from \"zod\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\nimport type { SchemaInput, ValidatorInput } from \"../types.js\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function toJsonSchema(schema: z.ZodType<any>): Record<string, unknown> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return zodToJsonSchema(schema as any, { target: \"openApi3\" }) as Record<string, unknown>;\n}\n\nexport function buildStructuredPrompt(\n prompt: string,\n schema: SchemaInput,\n systemPrompt?: string\n): { system: string; user: string } {\n let schemaInfo: string;\n\n if (schema instanceof z.ZodType) {\n schemaInfo = `Respond with valid JSON matching this schema exactly:\\n\\n${JSON.stringify(toJsonSchema(schema), null, 2)}`;\n } else if (\"jsonSchema\" in schema) {\n schemaInfo = `Respond with valid JSON matching this schema exactly:\\n\\n${JSON.stringify(schema.jsonSchema, null, 2)}`;\n } else if (\"pattern\" in schema) {\n schemaInfo = `Respond with a plain string matching this pattern: ${schema.pattern}`;\n } else if (\"validate\" in schema && (schema as ValidatorInput).hint) {\n schemaInfo = `Respond with valid JSON matching this schema exactly:\\n\\n${JSON.stringify((schema as ValidatorInput).hint, null, 2)}`;\n } else {\n schemaInfo = \"Respond with valid JSON. No extra text, no markdown.\";\n }\n\n const system = systemPrompt\n ? `${systemPrompt}\\n\\n${schemaInfo} No extra text, no markdown, no explanation.`\n : `You are a precise assistant. ${schemaInfo} No extra text, no markdown, no explanation.`;\n\n return { system, user: prompt };\n}\n","import type { SchemaInput } from \"../types.js\";\nimport { SchemaViolationError } from \"../types.js\";\nimport { isZodSchema } from \"./validate.js\";\n\nexport function parseAndValidate<T>(\n raw: string,\n schema: SchemaInput<T>,\n opts: { extractJson?: boolean } = {}\n): T {\n // Pattern schemas return the raw string directly — no JSON parsing\n if (\"pattern\" in (schema as object)) return raw as T;\n\n try {\n const text = opts.extractJson\n ? (raw.match(/\\{[\\s\\S]*\\}|\\[[\\s\\S]*\\]/)?.[0] ?? raw)\n : raw;\n const parsed = JSON.parse(text);\n\n if (isZodSchema(schema)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result = (schema as any).safeParse(parsed);\n if (!result.success) throw new SchemaViolationError(raw, result.error);\n return result.data as T;\n }\n\n return parsed as T;\n } catch (err) {\n if (err instanceof SchemaViolationError) throw err;\n throw new SchemaViolationError(raw, err);\n }\n}\n","import { z } from \"zod\";\nimport type { SchemaInput, ShapecraftModel } from \"../types.js\";\nimport { toJsonSchema, buildStructuredPrompt } from \"../core/schema.js\";\nimport { isZodSchema } from \"../core/validate.js\";\nimport { parseAndValidate } from \"../core/parse.js\";\n\nexport interface OpenAIBackendOptions {\n model?: string;\n apiKey?: string;\n baseURL?: string;\n}\n\nexport function openai(options: OpenAIBackendOptions = {}): ShapecraftModel {\n const modelId = options.model ?? \"gpt-4o-mini\";\n\n return {\n id: `openai:${modelId}`,\n guaranteeLevel: \"native\",\n\n async generate<T>(prompt: string, schema: SchemaInput<T>, systemPrompt?: string): Promise<T> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const mod: any = await import(\"openai\").catch(() => {\n throw new Error(\"Install openai: npm install openai\");\n });\n\n const OpenAI = mod.default ?? mod;\n const client = new OpenAI({\n apiKey: options.apiKey ?? process.env.OPENAI_API_KEY,\n baseURL: options.baseURL,\n });\n\n const { system, user } = buildStructuredPrompt(prompt, schema, systemPrompt);\n\n // Use strict json_schema mode for Zod, non-strict for raw jsonSchema, json_object otherwise\n const responseFormat = isZodSchema(schema)\n ? {\n type: \"json_schema\" as const,\n json_schema: { name: \"output\", strict: true, schema: toJsonSchema(schema as z.ZodType<any>) },\n }\n : \"jsonSchema\" in (schema as object)\n ? {\n type: \"json_schema\" as const,\n json_schema: { name: \"output\", strict: false, schema: (schema as { jsonSchema: Record<string, unknown> }).jsonSchema },\n }\n : { type: \"json_object\" as const };\n\n const response = await client.chat.completions.create({\n model: modelId,\n messages: [\n { role: \"system\", content: system },\n { role: \"user\", content: user },\n ],\n response_format: responseFormat,\n });\n\n const raw: string = response.choices[0]?.message?.content ?? \"\";\n\n return parseAndValidate<T>(raw, schema);\n },\n };\n}\n","import { z } from \"zod\";\nimport type { SchemaInput, ShapecraftModel } from \"../types.js\";\nimport { toJsonSchema, buildStructuredPrompt } from \"../core/schema.js\";\nimport { isZodSchema } from \"../core/validate.js\";\nimport { parseAndValidate } from \"../core/parse.js\";\n\nexport interface OllamaBackendOptions {\n model: string;\n host?: string;\n}\n\nexport function ollama(options: OllamaBackendOptions): ShapecraftModel {\n const host = options.host ?? \"http://localhost:11434\";\n\n return {\n id: `ollama:${options.model}`,\n guaranteeLevel: \"constrained\",\n\n async generate<T>(prompt: string, schema: SchemaInput<T>, systemPrompt?: string): Promise<T> {\n const { system, user } = buildStructuredPrompt(prompt, schema, systemPrompt);\n\n // Pass JSON schema to Ollama's format param for constrained decoding when possible\n let format: unknown = undefined;\n if (isZodSchema(schema)) {\n format = toJsonSchema(schema as z.ZodType<any>);\n } else if (\"jsonSchema\" in (schema as object)) {\n format = (schema as { jsonSchema: Record<string, unknown> }).jsonSchema;\n }\n\n const response = await fetch(`${host}/api/chat`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n model: options.model,\n messages: [\n { role: \"system\", content: system },\n { role: \"user\", content: user },\n ],\n ...(format ? { format } : {}),\n stream: false,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Ollama error: ${response.status} ${response.statusText}`);\n }\n\n const json = await response.json() as { message?: { content?: string } };\n const raw = json.message?.content ?? \"\";\n\n return parseAndValidate<T>(raw, schema);\n },\n };\n}\n","import type { SchemaInput, ShapecraftModel } from \"../types.js\";\nimport { buildStructuredPrompt } from \"../core/schema.js\";\nimport { parseAndValidate } from \"../core/parse.js\";\n\nexport interface AnthropicBackendOptions {\n model?: string;\n apiKey?: string;\n}\n\nexport function anthropic(options: AnthropicBackendOptions = {}): ShapecraftModel {\n const modelId = options.model ?? \"claude-sonnet-4-6\";\n\n return {\n id: `anthropic:${modelId}`,\n guaranteeLevel: \"best-effort\",\n\n async generate<T>(prompt: string, schema: SchemaInput<T>, systemPrompt?: string): Promise<T> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const mod: any = await import(\"@anthropic-ai/sdk\").catch(() => {\n throw new Error(\"Install sdk: npm install @anthropic-ai/sdk\");\n });\n\n const AnthropicClass = mod.default ?? mod;\n const client = new AnthropicClass({\n apiKey: options.apiKey ?? process.env.ANTHROPIC_API_KEY,\n });\n\n const { system, user } = buildStructuredPrompt(prompt, schema, systemPrompt);\n\n const response = await client.messages.create({\n model: modelId,\n max_tokens: 4096,\n system,\n messages: [{ role: \"user\", content: user }],\n });\n\n const raw: string =\n response.content[0]?.type === \"text\" ? response.content[0].text : \"\";\n\n return parseAndValidate<T>(raw, schema, { extractJson: true });\n },\n };\n}\n","import type { SchemaInput, ShapecraftModel } from \"../types.js\";\nimport { buildStructuredPrompt } from \"../core/schema.js\";\nimport { parseAndValidate } from \"../core/parse.js\";\n\nexport interface GroqBackendOptions {\n model?: string;\n apiKey?: string;\n}\n\nexport function groq(options: GroqBackendOptions = {}): ShapecraftModel {\n const modelId = options.model ?? \"llama-3.3-70b-versatile\";\n\n return {\n id: `groq:${modelId}`,\n guaranteeLevel: \"native\",\n\n async generate<T>(prompt: string, schema: SchemaInput<T>, systemPrompt?: string): Promise<T> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const mod: any = await import(\"groq-sdk\").catch(() => {\n throw new Error(\"Install groq: npm install groq-sdk\");\n });\n\n const Groq = mod.default ?? mod;\n const client = new Groq({\n apiKey: options.apiKey ?? process.env.GROQ_API_KEY,\n });\n\n const { system, user } = buildStructuredPrompt(prompt, schema, systemPrompt);\n\n const response = await client.chat.completions.create({\n model: modelId,\n messages: [\n { role: \"system\", content: system },\n { role: \"user\", content: user },\n ],\n response_format: { type: \"json_object\" },\n });\n\n const raw: string = response.choices[0]?.message?.content ?? \"\";\n\n return parseAndValidate<T>(raw, schema);\n },\n };\n}\n"]}
package/dist/types.d.ts CHANGED
@@ -8,6 +8,7 @@ export type PatternInput = {
8
8
  };
9
9
  export type ValidatorInput = {
10
10
  validate: (output: unknown) => boolean;
11
+ hint?: Record<string, unknown>;
11
12
  };
12
13
  export type SchemaInput<T = unknown> = z.ZodType<T> | JsonSchemaInput | PatternInput | ValidatorInput;
13
14
  export interface ShapecraftModel {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,MAAM,cAAc,GAAG,aAAa,GAAG,QAAQ,GAAG,aAAa,CAAC;AAEtE,MAAM,MAAM,eAAe,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC;AACtE,MAAM,MAAM,YAAY,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAC/C,MAAM,MAAM,cAAc,GAAG;IAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAA;CAAE,CAAC;AAExE,MAAM,MAAM,WAAW,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,eAAe,GAAG,YAAY,GAAG,cAAc,CAAC;AAEtG,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CACxF;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,IAAI,EAAE,CAAC,CAAC;IACR,cAAc,EAAE,cAAc,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,oBAAqB,SAAQ,KAAK;aAE3B,GAAG,EAAE,MAAM;aACX,gBAAgB,EAAE,OAAO;gBADzB,GAAG,EAAE,MAAM,EACX,gBAAgB,EAAE,OAAO;CAK5C;AAED,qBAAa,uBAAwB,SAAQ,KAAK;aACpB,QAAQ,EAAE,MAAM;gBAAhB,QAAQ,EAAE,MAAM;CAI7C"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,MAAM,cAAc,GAAG,aAAa,GAAG,QAAQ,GAAG,aAAa,CAAC;AAEtE,MAAM,MAAM,eAAe,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC;AACtE,MAAM,MAAM,YAAY,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAC/C,MAAM,MAAM,cAAc,GAAG;IAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC;AAExG,MAAM,MAAM,WAAW,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,eAAe,GAAG,YAAY,GAAG,cAAc,CAAC;AAEtG,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CACxF;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,IAAI,EAAE,CAAC,CAAC;IACR,cAAc,EAAE,cAAc,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,oBAAqB,SAAQ,KAAK;aAE3B,GAAG,EAAE,MAAM;aACX,gBAAgB,EAAE,OAAO;gBADzB,GAAG,EAAE,MAAM,EACX,gBAAgB,EAAE,OAAO;CAK5C;AAED,qBAAa,uBAAwB,SAAQ,KAAK;aACpB,QAAQ,EAAE,MAAM;gBAAhB,QAAQ,EAAE,MAAM;CAI7C"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aviasole/shapecraft",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Structured output generation for LLMs in Node.js — token-level constraints for local models, native JSON modes for cloud APIs",
5
5
  "author": "Aviasole Technologies",
6
6
  "license": "Apache-2.0",
@@ -56,12 +56,14 @@
56
56
  "node-llama-cpp": ">=3.0.0",
57
57
  "openai": ">=4.0.0",
58
58
  "ollama": ">=0.5.0",
59
+ "groq-sdk": ">=0.5.0",
59
60
  "zod": ">=3.0.0"
60
61
  },
61
62
  "peerDependenciesMeta": {
62
63
  "node-llama-cpp": { "optional": true },
63
64
  "openai": { "optional": true },
64
- "ollama": { "optional": true }
65
+ "ollama": { "optional": true },
66
+ "groq-sdk": { "optional": true }
65
67
  },
66
68
  "dependencies": {
67
69
  "zod-to-json-schema": "^3.23.0"