@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 +75 -18
- package/dist/core/schema.d.ts.map +1 -1
- package/dist/index.cjs +5 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +4 -2
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
|
|
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
|
+
[](https://www.npmjs.com/package/@aviasole/shapecraft)
|
|
6
|
+
[](https://github.com/aviasoletechnologies/shapecraft/actions/workflows/ci.yml)
|
|
7
|
+
[](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
|
|
15
|
-
npm install groq-sdk
|
|
16
|
-
npm install @anthropic-ai/sdk
|
|
17
|
-
# Ollama: no extra SDK
|
|
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
|
-
##
|
|
24
|
+
## Quick Start
|
|
21
25
|
|
|
22
26
|
```typescript
|
|
23
27
|
import { z } from "zod";
|
|
24
|
-
import { generate, openai
|
|
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
|
|
38
|
+
const result = await generate(model, PersonSchema, "Extract: John Doe, 32, john@example.com");
|
|
36
39
|
|
|
37
|
-
console.log(result.data);
|
|
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 |
|
|
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
|
-
|
|
53
|
-
|
|
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
|
-
|
|
56
|
-
const claude = anthropic({ model: "claude-sonnet-4-6", maxRetries: 3 });
|
|
108
|
+
## Options
|
|
57
109
|
|
|
58
|
-
|
|
59
|
-
const
|
|
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,
|
|
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
|
|
135
|
+
schemaInfo = "Respond with valid JSON. No extra text, no markdown.";
|
|
132
136
|
}
|
|
133
137
|
const system = systemPrompt ? `${systemPrompt}
|
|
134
138
|
|
package/dist/index.cjs.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","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
|
|
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 {
|
package/dist/types.d.ts.map
CHANGED
|
@@ -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;
|
|
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.
|
|
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"
|