@sudobility/shapeshyft_engine 1.0.0

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.
Files changed (83) hide show
  1. package/CLAUDE.md +27 -0
  2. package/README.md +11 -0
  3. package/dist/config/providers.d.ts +111 -0
  4. package/dist/config/providers.d.ts.map +1 -0
  5. package/dist/config/providers.js +1535 -0
  6. package/dist/config/providers.js.map +1 -0
  7. package/dist/index.d.ts +27 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +27 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/lib/api-helper.d.ts +35 -0
  12. package/dist/lib/api-helper.d.ts.map +1 -0
  13. package/dist/lib/api-helper.js +123 -0
  14. package/dist/lib/api-helper.js.map +1 -0
  15. package/dist/lib/capability-validator.d.ts +36 -0
  16. package/dist/lib/capability-validator.d.ts.map +1 -0
  17. package/dist/lib/capability-validator.js +140 -0
  18. package/dist/lib/capability-validator.js.map +1 -0
  19. package/dist/lib/media-constants.d.ts +55 -0
  20. package/dist/lib/media-constants.d.ts.map +1 -0
  21. package/dist/lib/media-constants.js +166 -0
  22. package/dist/lib/media-constants.js.map +1 -0
  23. package/dist/lib/media-conversion.d.ts +36 -0
  24. package/dist/lib/media-conversion.d.ts.map +1 -0
  25. package/dist/lib/media-conversion.js +87 -0
  26. package/dist/lib/media-conversion.js.map +1 -0
  27. package/dist/lib/media-utils.d.ts +35 -0
  28. package/dist/lib/media-utils.d.ts.map +1 -0
  29. package/dist/lib/media-utils.js +173 -0
  30. package/dist/lib/media-utils.js.map +1 -0
  31. package/dist/lib/output-limit.d.ts +38 -0
  32. package/dist/lib/output-limit.d.ts.map +1 -0
  33. package/dist/lib/output-limit.js +54 -0
  34. package/dist/lib/output-limit.js.map +1 -0
  35. package/dist/lib/prompt-builder.d.ts +94 -0
  36. package/dist/lib/prompt-builder.d.ts.map +1 -0
  37. package/dist/lib/prompt-builder.js +408 -0
  38. package/dist/lib/prompt-builder.js.map +1 -0
  39. package/dist/lib/reserved-fields.d.ts +41 -0
  40. package/dist/lib/reserved-fields.d.ts.map +1 -0
  41. package/dist/lib/reserved-fields.js +47 -0
  42. package/dist/lib/reserved-fields.js.map +1 -0
  43. package/dist/services/llm/anthropic.d.ts +16 -0
  44. package/dist/services/llm/anthropic.d.ts.map +1 -0
  45. package/dist/services/llm/anthropic.js +154 -0
  46. package/dist/services/llm/anthropic.js.map +1 -0
  47. package/dist/services/llm/custom.d.ts +51 -0
  48. package/dist/services/llm/custom.d.ts.map +1 -0
  49. package/dist/services/llm/custom.js +419 -0
  50. package/dist/services/llm/custom.js.map +1 -0
  51. package/dist/services/llm/extract-json.d.ts +17 -0
  52. package/dist/services/llm/extract-json.d.ts.map +1 -0
  53. package/dist/services/llm/extract-json.js +60 -0
  54. package/dist/services/llm/extract-json.js.map +1 -0
  55. package/dist/services/llm/finish-reason.d.ts +21 -0
  56. package/dist/services/llm/finish-reason.d.ts.map +1 -0
  57. package/dist/services/llm/finish-reason.js +55 -0
  58. package/dist/services/llm/finish-reason.js.map +1 -0
  59. package/dist/services/llm/gemini.d.ts +26 -0
  60. package/dist/services/llm/gemini.d.ts.map +1 -0
  61. package/dist/services/llm/gemini.js +178 -0
  62. package/dist/services/llm/gemini.js.map +1 -0
  63. package/dist/services/llm/groq.d.ts +28 -0
  64. package/dist/services/llm/groq.d.ts.map +1 -0
  65. package/dist/services/llm/groq.js +237 -0
  66. package/dist/services/llm/groq.js.map +1 -0
  67. package/dist/services/llm/index.d.ts +19 -0
  68. package/dist/services/llm/index.d.ts.map +1 -0
  69. package/dist/services/llm/index.js +88 -0
  70. package/dist/services/llm/index.js.map +1 -0
  71. package/dist/services/llm/openai.d.ts +101 -0
  72. package/dist/services/llm/openai.d.ts.map +1 -0
  73. package/dist/services/llm/openai.js +561 -0
  74. package/dist/services/llm/openai.js.map +1 -0
  75. package/dist/services/llm/types.d.ts +110 -0
  76. package/dist/services/llm/types.d.ts.map +1 -0
  77. package/dist/services/llm/types.js +16 -0
  78. package/dist/services/llm/types.js.map +1 -0
  79. package/dist/types/index.d.ts +812 -0
  80. package/dist/types/index.d.ts.map +1 -0
  81. package/dist/types/index.js +366 -0
  82. package/dist/types/index.js.map +1 -0
  83. package/package.json +93 -0
@@ -0,0 +1,94 @@
1
+ /**
2
+ * @fileoverview Schema-to-prompt conversion and provider-specific prompt building
3
+ * @description Converts JSON Schema definitions into human-readable prompt instructions,
4
+ * generates example output, and builds provider-optimized system/user prompts.
5
+ */
6
+ import type { JsonSchema, LlmProvider } from "../types/index.js";
7
+ /**
8
+ * Convert JSON Schema to human-readable prompt instructions
9
+ */
10
+ export declare function schemaToPromptInstructions(schema: JsonSchema, depth?: number): string;
11
+ /**
12
+ * Generate an example object from schema
13
+ */
14
+ export declare function generateSchemaExample(schema: JsonSchema): unknown;
15
+ /**
16
+ * Check if schema is complex enough to need an example
17
+ */
18
+ export declare function isComplexSchema(schema: JsonSchema): boolean;
19
+ /**
20
+ * Build the system prompt with schema instructions
21
+ */
22
+ /**
23
+ * Build the base instruction section.
24
+ */
25
+ export declare function buildBaseInstruction(): string;
26
+ /**
27
+ * Build the task description section from the user's endpoint instructions.
28
+ */
29
+ export declare function buildTaskDescriptionSection(userDescription: string | null): string;
30
+ /**
31
+ * Build the output structure section from a JSON schema.
32
+ */
33
+ export declare function buildOutputStructureSection(outputSchema: JsonSchema | null): string;
34
+ /**
35
+ * Build the response format section.
36
+ */
37
+ export declare function buildResponseFormatSection(): string;
38
+ /**
39
+ * Build the web search routing section. Inserted between the task description
40
+ * and the output structure when the endpoint supports web search.
41
+ * Clarifies the wrapper object and overrides any conflicting rules.
42
+ */
43
+ export declare function buildWebSearchRoutingSection(): string;
44
+ /**
45
+ * Build the system prompt with schema instructions.
46
+ * Composes all sections: base → task description → output structure → response format.
47
+ */
48
+ export declare function buildSystemPrompt(userDescription: string | null, outputSchema: JsonSchema | null, context?: string | null): string;
49
+ /**
50
+ * Build the user prompt from input data
51
+ */
52
+ export declare function buildUserPrompt(inputData: unknown, isStructured: boolean): string;
53
+ /**
54
+ * Format structured input data for the prompt
55
+ */
56
+ export declare function formatStructuredInput(data: Record<string, unknown>): string;
57
+ /**
58
+ * Build complete prompts for an LLM request
59
+ */
60
+ export declare function buildPrompts(inputData: unknown, outputSchema: JsonSchema | null, userDescription: string | null, isStructuredInput: boolean): {
61
+ system: string;
62
+ user: string;
63
+ };
64
+ /**
65
+ * Provider-specific prompt configuration
66
+ */
67
+ export interface ProviderPromptConfig {
68
+ /** Base instruction for the assistant role */
69
+ baseInstruction: string;
70
+ /** How to format JSON output requirement */
71
+ jsonInstruction: string;
72
+ /** Whether to include example output */
73
+ includeExample: boolean;
74
+ /** Whether to be more verbose in schema descriptions */
75
+ verboseSchema: boolean;
76
+ /** Additional provider-specific instructions */
77
+ additionalInstructions?: string;
78
+ }
79
+ /**
80
+ * Get provider-specific prompt configuration
81
+ */
82
+ export declare function getProviderPromptConfig(provider: LlmProvider): ProviderPromptConfig;
83
+ /**
84
+ * Build system prompt optimized for a specific provider
85
+ */
86
+ export declare function buildSystemPromptForProvider(userDescription: string | null, outputSchema: JsonSchema | null, provider: LlmProvider): string;
87
+ /**
88
+ * Build complete prompts optimized for a specific provider
89
+ */
90
+ export declare function buildPromptsForProvider(inputData: unknown, outputSchema: JsonSchema | null, userDescription: string | null, isStructuredInput: boolean, provider: LlmProvider): {
91
+ system: string;
92
+ user: string;
93
+ };
94
+ //# sourceMappingURL=prompt-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-builder.d.ts","sourceRoot":"","sources":["../../src/lib/prompt-builder.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEjE;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,UAAU,EAClB,KAAK,GAAE,MAAU,GAChB,MAAM,CAkFR;AAoBD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAsDjE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAY3D;AAED;;GAEG;AACH;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,eAAe,EAAE,MAAM,GAAG,IAAI,GAC7B,MAAM,CAGR;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,YAAY,EAAE,UAAU,GAAG,IAAI,GAC9B,MAAM,CAiBR;AAED;;GAEG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,CAMnD;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,IAAI,MAAM,CAkBrD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,eAAe,EAAE,MAAM,GAAG,IAAI,EAC9B,YAAY,EAAE,UAAU,GAAG,IAAI,EAC/B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,GACtB,MAAM,CAUR;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,OAAO,EAClB,YAAY,EAAE,OAAO,GACpB,MAAM,CAWR;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAe3E;AAiBD;;GAEG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,OAAO,EAClB,YAAY,EAAE,UAAU,GAAG,IAAI,EAC/B,eAAe,EAAE,MAAM,GAAG,IAAI,EAC9B,iBAAiB,EAAE,OAAO,GACzB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAKlC;AAMD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,8CAA8C;IAC9C,eAAe,EAAE,MAAM,CAAC;IACxB,4CAA4C;IAC5C,eAAe,EAAE,MAAM,CAAC;IACxB,wCAAwC;IACxC,cAAc,EAAE,OAAO,CAAC;IACxB,wDAAwD;IACxD,aAAa,EAAE,OAAO,CAAC;IACvB,gDAAgD;IAChD,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,WAAW,GACpB,oBAAoB,CAqHtB;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAC1C,eAAe,EAAE,MAAM,GAAG,IAAI,EAC9B,YAAY,EAAE,UAAU,GAAG,IAAI,EAC/B,QAAQ,EAAE,WAAW,GACpB,MAAM,CAqCR;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,OAAO,EAClB,YAAY,EAAE,UAAU,GAAG,IAAI,EAC/B,eAAe,EAAE,MAAM,GAAG,IAAI,EAC9B,iBAAiB,EAAE,OAAO,EAC1B,QAAQ,EAAE,WAAW,GACpB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CASlC"}
@@ -0,0 +1,408 @@
1
+ /**
2
+ * @fileoverview Schema-to-prompt conversion and provider-specific prompt building
3
+ * @description Converts JSON Schema definitions into human-readable prompt instructions,
4
+ * generates example output, and builds provider-optimized system/user prompts.
5
+ */
6
+ /**
7
+ * Convert JSON Schema to human-readable prompt instructions
8
+ */
9
+ export function schemaToPromptInstructions(schema, depth = 0) {
10
+ const indent = " ".repeat(depth);
11
+ const lines = [];
12
+ const schemaType = schema.type ?? "object";
13
+ if (schemaType === "object" && schema.properties) {
14
+ const required = schema.required ?? [];
15
+ for (const [propName, propSchema] of Object.entries(schema.properties)) {
16
+ const prop = propSchema;
17
+ const isRequired = required.includes(propName);
18
+ const reqMarker = isRequired ? "(required)" : "(optional)";
19
+ // Handle map type (x-map with additionalProperties)
20
+ if (prop["x-map"] &&
21
+ prop.additionalProperties &&
22
+ typeof prop.additionalProperties === "object") {
23
+ const valueProp = prop.additionalProperties;
24
+ const keyDesc = prop["x-key-description"];
25
+ const valueType = valueProp.type ?? "any";
26
+ const valueDesc = valueProp.description ?? "";
27
+ const propDesc = prop.description ?? "";
28
+ lines.push(`${indent}- \`${propName}\` (map) ${reqMarker}: ${propDesc}`);
29
+ lines.push(`${indent} Key: string${keyDesc ? ` — ${keyDesc}` : ""}`);
30
+ lines.push(`${indent} Value: ${valueType}${valueDesc ? ` — ${valueDesc}` : ""}`);
31
+ // Handle complex value types
32
+ if (valueType === "object" && valueProp.properties) {
33
+ lines.push(`${indent} Value properties:`);
34
+ lines.push(schemaToPromptInstructions(valueProp, depth + 2));
35
+ }
36
+ else if (valueType === "array" && valueProp.items) {
37
+ lines.push(`${indent} (each value is an array of items:)`);
38
+ lines.push(schemaToPromptInstructions(valueProp.items, depth + 2));
39
+ }
40
+ continue;
41
+ }
42
+ const propType = prop.type ?? "any";
43
+ const propDesc = prop.description ?? "";
44
+ lines.push(`${indent}- \`${propName}\` (${propType}) ${reqMarker}: ${propDesc}`);
45
+ // Handle enums
46
+ if (prop.enum) {
47
+ const enumValues = prop.enum.map(v => `"${v}"`).join(", ");
48
+ lines.push(`${indent} Allowed values: ${enumValues}`);
49
+ }
50
+ // Handle constraints
51
+ const constraints = extractConstraints(prop);
52
+ if (constraints) {
53
+ lines.push(`${indent} Constraints: ${constraints}`);
54
+ }
55
+ // Handle nested objects/arrays
56
+ if (propType === "object" && prop.properties) {
57
+ lines.push(`${indent} Properties:`);
58
+ lines.push(schemaToPromptInstructions(prop, depth + 2));
59
+ }
60
+ else if (propType === "array" && prop.items) {
61
+ lines.push(`${indent} (array of items, each item should have:)`);
62
+ lines.push(schemaToPromptInstructions(prop.items, depth + 2));
63
+ }
64
+ }
65
+ }
66
+ return lines.join("\n");
67
+ }
68
+ /**
69
+ * Extract validation constraints from schema property
70
+ */
71
+ function extractConstraints(schema) {
72
+ const constraints = [];
73
+ if (schema.minimum !== undefined)
74
+ constraints.push(`min: ${schema.minimum}`);
75
+ if (schema.maximum !== undefined)
76
+ constraints.push(`max: ${schema.maximum}`);
77
+ if (schema.minLength !== undefined)
78
+ constraints.push(`min length: ${schema.minLength}`);
79
+ if (schema.maxLength !== undefined)
80
+ constraints.push(`max length: ${schema.maxLength}`);
81
+ if (schema.pattern)
82
+ constraints.push(`pattern: ${schema.pattern}`);
83
+ if (schema.format)
84
+ constraints.push(`format: ${schema.format}`);
85
+ return constraints.join(", ");
86
+ }
87
+ /**
88
+ * Generate an example object from schema
89
+ */
90
+ export function generateSchemaExample(schema) {
91
+ const schemaType = schema.type ?? "object";
92
+ if (schema.default !== undefined)
93
+ return schema.default;
94
+ if (schema.enum && schema.enum.length > 0)
95
+ return schema.enum[0];
96
+ // Map type: object with x-map and additionalProperties
97
+ if (schemaType === "object" &&
98
+ schema["x-map"] &&
99
+ schema.additionalProperties &&
100
+ typeof schema.additionalProperties === "object") {
101
+ const keyDesc = schema["x-key-description"];
102
+ const sampleKey = keyDesc
103
+ ? `<${keyDesc.split(/[\s(,]/)[0].toLowerCase()}>`
104
+ : "<key>";
105
+ return {
106
+ [sampleKey]: generateSchemaExample(schema.additionalProperties),
107
+ };
108
+ }
109
+ if (schemaType === "object" && schema.properties) {
110
+ const example = {};
111
+ for (const [propName, propSchema] of Object.entries(schema.properties)) {
112
+ example[propName] = generateSchemaExample(propSchema);
113
+ }
114
+ return example;
115
+ }
116
+ if (schemaType === "array") {
117
+ if (schema.items) {
118
+ return [generateSchemaExample(schema.items)];
119
+ }
120
+ return [];
121
+ }
122
+ // Primitive types
123
+ switch (schemaType) {
124
+ case "string":
125
+ return "<string>";
126
+ case "number":
127
+ return 0.0;
128
+ case "integer":
129
+ return 0;
130
+ case "boolean":
131
+ return true;
132
+ default:
133
+ return null;
134
+ }
135
+ }
136
+ /**
137
+ * Check if schema is complex enough to need an example
138
+ */
139
+ export function isComplexSchema(schema) {
140
+ if (!schema.properties)
141
+ return false;
142
+ const properties = Object.values(schema.properties);
143
+ if (properties.length > 3)
144
+ return true;
145
+ return properties.some(p => {
146
+ const prop = p;
147
+ return (prop.type === "object" ||
148
+ prop.type === "array" ||
149
+ prop["x-map"]);
150
+ });
151
+ }
152
+ /**
153
+ * Build the system prompt with schema instructions
154
+ */
155
+ /**
156
+ * Build the base instruction section.
157
+ */
158
+ export function buildBaseInstruction() {
159
+ return "You are a helpful assistant that produces structured data output.";
160
+ }
161
+ /**
162
+ * Build the task description section from the user's endpoint instructions.
163
+ */
164
+ export function buildTaskDescriptionSection(userDescription) {
165
+ if (!userDescription)
166
+ return "";
167
+ return `\n## Task Description\n${userDescription}`;
168
+ }
169
+ /**
170
+ * Build the output structure section from a JSON schema.
171
+ */
172
+ export function buildOutputStructureSection(outputSchema) {
173
+ if (!outputSchema)
174
+ return "";
175
+ const parts = [];
176
+ const schemaInstructions = schemaToPromptInstructions(outputSchema);
177
+ parts.push(`\n## Output Structure\nYour response must include the following fields:\n${schemaInstructions}`);
178
+ if (isComplexSchema(outputSchema)) {
179
+ const example = generateSchemaExample(outputSchema);
180
+ parts.push(`\n## Example Output Structure\n\`\`\`json\n${JSON.stringify(example, null, 2)}\n\`\`\``);
181
+ }
182
+ return parts.join("\n");
183
+ }
184
+ /**
185
+ * Build the response format section.
186
+ */
187
+ export function buildResponseFormatSection() {
188
+ return ("\n## Response Format\nRespond with valid JSON only. Do not include any text outside the JSON object. " +
189
+ 'IMPORTANT: All string values must use proper JSON escaping — use \\" for double quotes, \\n for newlines, \\\\ for backslashes. ' +
190
+ "Do NOT escape single quotes — \\' is invalid JSON. Write apostrophes and single quotes literally.");
191
+ }
192
+ /**
193
+ * Build the web search routing section. Inserted between the task description
194
+ * and the output structure when the endpoint supports web search.
195
+ * Clarifies the wrapper object and overrides any conflicting rules.
196
+ */
197
+ export function buildWebSearchRoutingSection() {
198
+ return ("\n## Response Wrapper (OVERRIDES conflicting rules above)\n" +
199
+ "Your JSON response is a wrapper object. You MUST always provide `user_data`.\n\n" +
200
+ "- `user_data` (object, REQUIRED) — your IRenderable response goes here. " +
201
+ "Always fill this with either a clarification form or a complete answer.\n" +
202
+ "- `web_search_needed` (boolean, optional, defaults to false) — " +
203
+ "set to true when you would otherwise say 'I don't have real-time data' " +
204
+ "or 'I cannot access current listings'. The system WILL perform a web " +
205
+ "search for you and call you again with the results.\n\n" +
206
+ "When previous rules say 'return one root IRenderable', they mean inside `user_data`.\n\n" +
207
+ "`web_search_needed` = false:\n" +
208
+ "- Asking user for location/preferences/details (clarification)\n" +
209
+ "- Answering from training data (recipes, coding, general knowledge)\n\n" +
210
+ "`web_search_needed` = true:\n" +
211
+ "- You have the user's location/date but need live data (listings, prices, events, weather)\n" +
212
+ "- You would otherwise respond with 'I don't have access to real-time data'");
213
+ }
214
+ /**
215
+ * Build the system prompt with schema instructions.
216
+ * Composes all sections: base → task description → output structure → response format.
217
+ */
218
+ export function buildSystemPrompt(userDescription, outputSchema, context) {
219
+ return [
220
+ buildBaseInstruction(),
221
+ buildTaskDescriptionSection(userDescription),
222
+ context ? `\n## Context\n${context}` : "",
223
+ buildOutputStructureSection(outputSchema),
224
+ buildResponseFormatSection(),
225
+ ]
226
+ .filter(Boolean)
227
+ .join("\n");
228
+ }
229
+ /**
230
+ * Build the user prompt from input data
231
+ */
232
+ export function buildUserPrompt(inputData, isStructured) {
233
+ if (isStructured && typeof inputData === "object" && inputData !== null) {
234
+ // Format structured input as readable key-value pairs
235
+ const formatted = formatStructuredInput(inputData);
236
+ return `Process the following data and generate the structured response:\n\n${formatted}`;
237
+ }
238
+ else {
239
+ // Free text input
240
+ return `Process the following text and generate the structured response:\n\n${String(inputData)}`;
241
+ }
242
+ }
243
+ /**
244
+ * Format structured input data for the prompt
245
+ */
246
+ export function formatStructuredInput(data) {
247
+ const lines = [];
248
+ for (const [key, value] of Object.entries(data)) {
249
+ if (typeof value === "object" && value !== null && !Array.isArray(value)) {
250
+ lines.push(`- ${key}:`);
251
+ for (const [k, v] of Object.entries(value)) {
252
+ lines.push(formatStructuredLine(k, v, " "));
253
+ }
254
+ }
255
+ else {
256
+ lines.push(formatStructuredLine(key, value, ""));
257
+ }
258
+ }
259
+ return lines.join("\n");
260
+ }
261
+ function formatStructuredLine(key, value, indent) {
262
+ if (typeof value === "string" && value.includes("\n")) {
263
+ const block = value
264
+ .split(/\r?\n/)
265
+ .map(line => `${indent} ${line}`)
266
+ .join("\n");
267
+ return `${indent}- ${key}: |\n${block}`;
268
+ }
269
+ return `${indent}- ${key}: ${JSON.stringify(value)}`;
270
+ }
271
+ /**
272
+ * Build complete prompts for an LLM request
273
+ */
274
+ export function buildPrompts(inputData, outputSchema, userDescription, isStructuredInput) {
275
+ return {
276
+ system: buildSystemPrompt(userDescription, outputSchema),
277
+ user: buildUserPrompt(inputData, isStructuredInput),
278
+ };
279
+ }
280
+ /**
281
+ * Get provider-specific prompt configuration
282
+ */
283
+ export function getProviderPromptConfig(provider) {
284
+ switch (provider) {
285
+ case "openai":
286
+ return {
287
+ baseInstruction: "You are a helpful assistant that produces structured data output.",
288
+ jsonInstruction: "Respond with valid JSON only. Do not include any text outside the JSON object.",
289
+ includeExample: true,
290
+ verboseSchema: false,
291
+ };
292
+ case "anthropic":
293
+ return {
294
+ baseInstruction: "You are Claude, an AI assistant. Your task is to analyze the input and produce structured data output.",
295
+ jsonInstruction: "Output valid JSON only. Do not include markdown code blocks, explanations, or any text outside the JSON object.",
296
+ includeExample: true,
297
+ verboseSchema: true,
298
+ additionalInstructions: "Think step by step about the data structure before generating output.",
299
+ };
300
+ case "gemini":
301
+ return {
302
+ baseInstruction: "You are a helpful assistant that produces structured JSON data.",
303
+ jsonInstruction: "Return only valid JSON matching the specified schema.",
304
+ includeExample: false, // Gemini uses responseSchema natively
305
+ verboseSchema: false,
306
+ };
307
+ case "mistral":
308
+ return {
309
+ baseInstruction: "You are a helpful assistant specialized in producing structured data output.",
310
+ jsonInstruction: 'Respond with valid JSON only. No markdown, no explanations, just the JSON object. Use proper JSON escaping in strings — \\" for double quotes, \\n for newlines.',
311
+ includeExample: true,
312
+ verboseSchema: false,
313
+ };
314
+ case "cohere":
315
+ return {
316
+ baseInstruction: "You are a helpful assistant that generates structured data responses.",
317
+ jsonInstruction: 'Output valid JSON only. Do not include any text, markdown, or explanations outside the JSON. Use proper JSON escaping in strings — \\" for double quotes, \\n for newlines.',
318
+ includeExample: true,
319
+ verboseSchema: true,
320
+ };
321
+ case "groq":
322
+ return {
323
+ baseInstruction: "You are a fast, efficient assistant that produces structured data.",
324
+ jsonInstruction: 'Respond with valid JSON only. Use proper JSON escaping in strings — \\" for double quotes, \\n for newlines.',
325
+ includeExample: true,
326
+ verboseSchema: false,
327
+ };
328
+ case "xai":
329
+ return {
330
+ baseInstruction: "You are Grok, an AI assistant. Generate structured data output based on the given input.",
331
+ jsonInstruction: 'Return valid JSON only. No additional text or formatting. Use proper JSON escaping in strings — \\" for double quotes, \\n for newlines.',
332
+ includeExample: true,
333
+ verboseSchema: true,
334
+ };
335
+ case "deepseek":
336
+ return {
337
+ baseInstruction: "You are a helpful assistant that produces structured JSON output.",
338
+ jsonInstruction: 'Respond with valid JSON only. Do not include markdown code blocks or any text outside the JSON. Use proper JSON escaping in strings — \\" for double quotes, \\n for newlines.',
339
+ includeExample: true,
340
+ verboseSchema: true,
341
+ additionalInstructions: "Analyze the input carefully before generating the structured response.",
342
+ };
343
+ case "perplexity":
344
+ return {
345
+ baseInstruction: "You are a helpful assistant that produces structured data output based on available information.",
346
+ jsonInstruction: 'Output valid JSON only. No citations, no explanations, just the JSON object. Use proper JSON escaping in strings — \\" for double quotes, \\n for newlines.',
347
+ includeExample: true,
348
+ verboseSchema: false,
349
+ additionalInstructions: "Focus on the specific data requested, not general information.",
350
+ };
351
+ case "lm_studio":
352
+ default:
353
+ return {
354
+ baseInstruction: "You are a precise assistant that produces structured data output. " +
355
+ "You MUST translate exactly what is given — do not add, remove, reword, or interpret the content. " +
356
+ "Do not add explanations, commentary, or extra fields. " +
357
+ "If the input has numbered steps, the output must have the same numbered steps. " +
358
+ "Preserve all technical terms, variable placeholders (like {{value1}}), and formatting exactly as they appear.",
359
+ jsonInstruction: "Respond with valid JSON only. Do not include any text, markdown code blocks, or thinking outside the JSON object. " +
360
+ "IMPORTANT: All string values in the JSON must use proper JSON escaping. " +
361
+ 'Use \\" for double quotes, \\n for newlines, \\t for tabs, and \\\\ for backslashes inside string values. ' +
362
+ 'Do NOT escape single quotes — \\\' is invalid JSON. Write apostrophes and single quotes literally (e.g. "it\'s" not "it\\\'s"). ' +
363
+ "Do not put literal newlines or unescaped special characters inside JSON strings.",
364
+ includeExample: true,
365
+ verboseSchema: false,
366
+ };
367
+ }
368
+ }
369
+ /**
370
+ * Build system prompt optimized for a specific provider
371
+ */
372
+ export function buildSystemPromptForProvider(userDescription, outputSchema, provider) {
373
+ const config = getProviderPromptConfig(provider);
374
+ const parts = [];
375
+ // Provider-specific base instruction
376
+ parts.push(config.baseInstruction);
377
+ // User's description
378
+ if (userDescription) {
379
+ parts.push(`\n## Task Description\n${userDescription}`);
380
+ }
381
+ // Schema instructions
382
+ if (outputSchema) {
383
+ const schemaInstructions = schemaToPromptInstructions(outputSchema);
384
+ parts.push(`\n## Output Structure\nYour response must include the following fields:\n${schemaInstructions}`);
385
+ // Add example if configured and schema is complex
386
+ if (config.includeExample && isComplexSchema(outputSchema)) {
387
+ const example = generateSchemaExample(outputSchema);
388
+ parts.push(`\n## Example Output Structure\n\`\`\`json\n${JSON.stringify(example, null, 2)}\n\`\`\``);
389
+ }
390
+ }
391
+ // Additional provider-specific instructions
392
+ if (config.additionalInstructions) {
393
+ parts.push(`\n## Additional Guidelines\n${config.additionalInstructions}`);
394
+ }
395
+ // JSON instruction
396
+ parts.push(`\n## Response Format\n${config.jsonInstruction}`);
397
+ return parts.join("\n");
398
+ }
399
+ /**
400
+ * Build complete prompts optimized for a specific provider
401
+ */
402
+ export function buildPromptsForProvider(inputData, outputSchema, userDescription, isStructuredInput, provider) {
403
+ return {
404
+ system: buildSystemPromptForProvider(userDescription, outputSchema, provider),
405
+ user: buildUserPrompt(inputData, isStructuredInput),
406
+ };
407
+ }
408
+ //# sourceMappingURL=prompt-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-builder.js","sourceRoot":"","sources":["../../src/lib/prompt-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * @fileoverview Reserved input field extraction for AI invocations
3
+ * @description A handful of input keys are consumed by ShapeShyft rather than
4
+ * passed to the model: `context`, `web_search`, and `max_output_tokens`.
5
+ *
6
+ * They are pulled out in one pass, before the prompt is built, so a reserved key
7
+ * can never leak into the text the model sees. Doing this per-field at different
8
+ * points in the request is what previously let `web_search` reach the prompt.
9
+ */
10
+ /** Input keys ShapeShyft consumes instead of forwarding to the model. */
11
+ export declare const RESERVED_INPUT_FIELDS: readonly ["context", "web_search", "max_output_tokens"];
12
+ /** Reserved values pulled from an invocation's input. */
13
+ export interface ReservedFields {
14
+ /**
15
+ * Per-call override of the endpoint's configured context. Only a non-empty
16
+ * string counts; anything else is discarded so a malformed value cannot blank
17
+ * out the endpoint's own context.
18
+ */
19
+ context?: string;
20
+ /**
21
+ * The caller's `web_search` preference: `false` only for an explicit `false`,
22
+ * `true` for any other present value, `undefined` when absent. Whether search
23
+ * actually runs is still gated by the endpoint -- this can only turn it off.
24
+ */
25
+ webSearch?: boolean;
26
+ /**
27
+ * Raw `max_output_tokens` as supplied. Left unvalidated here so the caller
28
+ * sees one validation error from `resolveMaxOutputTokens`, which owns the rule.
29
+ */
30
+ maxOutputTokens?: unknown;
31
+ /** The input with every reserved key removed. */
32
+ cleanedInput: unknown;
33
+ }
34
+ /**
35
+ * Split an invocation's input into reserved values and the payload for the model.
36
+ *
37
+ * @param inputData - Raw input: a JSON body, or parsed query parameters
38
+ * @returns The reserved values plus a copy of the input without them
39
+ */
40
+ export declare function extractReservedFields(inputData: unknown): ReservedFields;
41
+ //# sourceMappingURL=reserved-fields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reserved-fields.d.ts","sourceRoot":"","sources":["../../src/lib/reserved-fields.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,yEAAyE;AACzE,eAAO,MAAM,qBAAqB,yDAIxB,CAAC;AAEX,yDAAyD;AACzD,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,iDAAiD;IACjD,YAAY,EAAE,OAAO,CAAC;CACvB;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,OAAO,GAAG,cAAc,CAoCxE"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * @fileoverview Reserved input field extraction for AI invocations
3
+ * @description A handful of input keys are consumed by ShapeShyft rather than
4
+ * passed to the model: `context`, `web_search`, and `max_output_tokens`.
5
+ *
6
+ * They are pulled out in one pass, before the prompt is built, so a reserved key
7
+ * can never leak into the text the model sees. Doing this per-field at different
8
+ * points in the request is what previously let `web_search` reach the prompt.
9
+ */
10
+ /** Input keys ShapeShyft consumes instead of forwarding to the model. */
11
+ export const RESERVED_INPUT_FIELDS = [
12
+ "context",
13
+ "web_search",
14
+ "max_output_tokens",
15
+ ];
16
+ /**
17
+ * Split an invocation's input into reserved values and the payload for the model.
18
+ *
19
+ * @param inputData - Raw input: a JSON body, or parsed query parameters
20
+ * @returns The reserved values plus a copy of the input without them
21
+ */
22
+ export function extractReservedFields(inputData) {
23
+ if (typeof inputData !== "object" ||
24
+ inputData === null ||
25
+ Array.isArray(inputData)) {
26
+ return { cleanedInput: inputData };
27
+ }
28
+ const { context, web_search: webSearchRaw, max_output_tokens: maxOutputTokens, ...cleanedInput } = inputData;
29
+ const result = { cleanedInput };
30
+ if (typeof context === "string" && context.trim().length > 0) {
31
+ result.context = context;
32
+ }
33
+ if (webSearchRaw !== undefined) {
34
+ // A GET invocation's params are strings, so an explicit `web_search=false`
35
+ // arrives as the string "false". Treating that as truthy would silently
36
+ // ignore the caller's only way to turn search off on that path.
37
+ const isFalse = webSearchRaw === false ||
38
+ (typeof webSearchRaw === "string" &&
39
+ webSearchRaw.toLowerCase() === "false");
40
+ result.webSearch = !isFalse;
41
+ }
42
+ if (maxOutputTokens !== undefined) {
43
+ result.maxOutputTokens = maxOutputTokens;
44
+ }
45
+ return result;
46
+ }
47
+ //# sourceMappingURL=reserved-fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reserved-fields.js","sourceRoot":"","sources":["../../src/lib/reserved-fields.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,yEAAyE;AACzE,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,SAAS;IACT,YAAY;IACZ,mBAAmB;CACX,CAAC;AAyBX;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,SAAkB;IACtD,IACE,OAAO,SAAS,KAAK,QAAQ;QAC7B,SAAS,KAAK,IAAI;QAClB,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EACxB,CAAC;QACD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;IACrC,CAAC;IAED,MAAM,EACJ,OAAO,EACP,UAAU,EAAE,YAAY,EACxB,iBAAiB,EAAE,eAAe,EAClC,GAAG,YAAY,EAChB,GAAG,SAAoC,CAAC;IAEzC,MAAM,MAAM,GAAmB,EAAE,YAAY,EAAE,CAAC;IAEhD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7D,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC;IACD,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,2EAA2E;QAC3E,wEAAwE;QACxE,gEAAgE;QAChE,MAAM,OAAO,GACX,YAAY,KAAK,KAAK;YACtB,CAAC,OAAO,YAAY,KAAK,QAAQ;gBAC/B,YAAY,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,CAAC;QAC5C,MAAM,CAAC,SAAS,GAAG,CAAC,OAAO,CAAC;IAC9B,CAAC;IACD,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,CAAC,eAAe,GAAG,eAAe,CAAC;IAC3C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @fileoverview Anthropic LLM provider
3
+ * @description Implements the ILLMProvider interface for Anthropic Claude models.
4
+ * Uses tool_use for structured output extraction. Supports image input
5
+ * via base64 and URL formats.
6
+ */
7
+ import type { ILLMProvider, LLMRequest, LLMResponse, ProviderConfig } from "./types.js";
8
+ export declare class AnthropicProvider implements ILLMProvider {
9
+ readonly providerName: "anthropic";
10
+ private client;
11
+ private defaultModel;
12
+ constructor(config: ProviderConfig);
13
+ generate(request: LLMRequest): Promise<LLMResponse>;
14
+ buildApiPayload(request: LLMRequest): Record<string, unknown>;
15
+ }
16
+ //# sourceMappingURL=anthropic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/services/llm/anthropic.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EACV,YAAY,EACZ,UAAU,EACV,WAAW,EACX,cAAc,EACf,MAAM,YAAY,CAAC;AAQpB,qBAAa,iBAAkB,YAAW,YAAY;IACpD,QAAQ,CAAC,YAAY,EAAG,WAAW,CAAU;IAC7C,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,YAAY,CAAS;gBAEjB,MAAM,EAAE,cAAc;IAQ5B,QAAQ,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IA8FzD,eAAe,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CA0D9D"}