promptopskit 0.3.0 → 0.3.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.
Files changed (55) hide show
  1. package/README.md +23 -0
  2. package/SKILL.md +49 -0
  3. package/dist/{chunk-PU3UPUND.js → chunk-DDXFDVA6.js} +4 -4
  4. package/dist/{chunk-PU3UPUND.js.map → chunk-DDXFDVA6.js.map} +1 -1
  5. package/dist/chunk-DGFBS7YW.js +101 -0
  6. package/dist/chunk-DGFBS7YW.js.map +1 -0
  7. package/dist/{chunk-5BI5FP5L.js → chunk-LNZS3TIJ.js} +21 -18
  8. package/dist/chunk-LNZS3TIJ.js.map +1 -0
  9. package/dist/{chunk-VYVEVJC3.js → chunk-LRRSI4ON.js} +25 -22
  10. package/dist/chunk-LRRSI4ON.js.map +1 -0
  11. package/dist/chunk-Y2YYEGOY.js +86 -0
  12. package/dist/chunk-Y2YYEGOY.js.map +1 -0
  13. package/dist/cli/index.js +44 -20
  14. package/dist/cli/index.js.map +1 -1
  15. package/dist/index.cjs +80 -59
  16. package/dist/index.cjs.map +1 -1
  17. package/dist/index.d.cts +7 -4
  18. package/dist/index.d.ts +7 -4
  19. package/dist/index.js +12 -39
  20. package/dist/index.js.map +1 -1
  21. package/dist/providers/anthropic.cjs +64 -19
  22. package/dist/providers/anthropic.cjs.map +1 -1
  23. package/dist/providers/anthropic.d.cts +2 -2
  24. package/dist/providers/anthropic.d.ts +2 -2
  25. package/dist/providers/anthropic.js +2 -2
  26. package/dist/providers/gemini.cjs +60 -15
  27. package/dist/providers/gemini.cjs.map +1 -1
  28. package/dist/providers/gemini.d.cts +2 -2
  29. package/dist/providers/gemini.d.ts +2 -2
  30. package/dist/providers/gemini.js +2 -2
  31. package/dist/providers/openai.cjs +64 -19
  32. package/dist/providers/openai.cjs.map +1 -1
  33. package/dist/providers/openai.d.cts +2 -2
  34. package/dist/providers/openai.d.ts +2 -2
  35. package/dist/providers/openai.js +2 -2
  36. package/dist/providers/openrouter.cjs +66 -21
  37. package/dist/providers/openrouter.cjs.map +1 -1
  38. package/dist/providers/openrouter.d.cts +2 -2
  39. package/dist/providers/openrouter.d.ts +2 -2
  40. package/dist/providers/openrouter.js +3 -3
  41. package/dist/testing.d.cts +1 -1
  42. package/dist/testing.d.ts +1 -1
  43. package/dist/{types-1zDDD-Ij.d.cts → types-BsYdPHTU.d.ts} +5 -2
  44. package/dist/{types-CQhlfAnR.d.ts → types-DC-jI6iV.d.cts} +5 -2
  45. package/dist/usagetap/index.d.cts +2 -2
  46. package/dist/usagetap/index.d.ts +2 -2
  47. package/package.json +1 -1
  48. package/dist/chunk-5BI5FP5L.js.map +0 -1
  49. package/dist/chunk-6KGBPHSY.js +0 -56
  50. package/dist/chunk-6KGBPHSY.js.map +0 -1
  51. package/dist/chunk-UYTUGV7Z.js +0 -83
  52. package/dist/chunk-UYTUGV7Z.js.map +0 -1
  53. package/dist/chunk-VYVEVJC3.js.map +0 -1
  54. package/dist/{schema-DIOA4OiO.d.cts → schema-Dq0jKest.d.cts} +42 -42
  55. package/dist/{schema-DIOA4OiO.d.ts → schema-Dq0jKest.d.ts} +42 -42
package/README.md CHANGED
@@ -182,6 +182,29 @@ import { geminiAdapter } from 'promptopskit/gemini';
182
182
  import { openrouterAdapter } from 'promptopskit/openrouter';
183
183
  ```
184
184
 
185
+ Direct adapter rendering also accepts `environment` and `tier` selectors. This is useful for compiled JSON/ESM assets in browser, edge, or worker code:
186
+
187
+ ```typescript
188
+ import type { ResolvedPromptAsset } from 'promptopskit';
189
+ import { openaiAdapter } from 'promptopskit/openai';
190
+ import compiledPrompt from './dist/prompts/summarizePullRequest.mjs';
191
+
192
+ const prompt = compiledPrompt as ResolvedPromptAsset;
193
+
194
+ const validation = openaiAdapter.validate(prompt, { environment: 'dev' });
195
+ if (!validation.valid) {
196
+ throw new Error(validation.errors.join(' '));
197
+ }
198
+
199
+ const request = openaiAdapter.render(prompt, {
200
+ environment: 'dev',
201
+ variables: {
202
+ pull_request_body: 'Implement theming and dark mode across the app.',
203
+ },
204
+ strict: true,
205
+ });
206
+ ```
207
+
185
208
  ## Optional UsageTap Tracking
186
209
 
187
210
  PromptOpsKit can also help you track provider calls with UsageTap.com while keeping the core render API body-only.
package/SKILL.md CHANGED
@@ -281,6 +281,55 @@ const kit = createPromptOpsKit({
281
281
  });
282
282
  ```
283
283
 
284
+ ### Browser / client-side demos
285
+
286
+ For browser code, client components, or frontend-only demos:
287
+
288
+ - Do not import `createPromptOpsKit`, `loadPromptFile`, or other top-level runtime helpers from `promptopskit` in client code. The top-level entry loads Node file-system/path modules for source and compiled prompt loading.
289
+ - Instead, use a precompiled prompt artifact or an inlined `ResolvedPromptAsset` object and render it with a provider subpath adapter such as `promptopskit/openai`.
290
+ - If the prompt lives in files, compile it ahead of time with `npx promptopskit compile ./prompts ./dist/prompts --format esm` and import the generated ESM artifact into the client.
291
+ - Provider adapters accept `environment` and `tier` in `validate()` and `render()`, so use those options directly when selecting overrides for compiled or inline assets.
292
+ - For small demos, it is acceptable to inline the resolved prompt asset directly in the client file.
293
+ - Keep transport and auth in the application layer. If a demo intentionally calls a provider from the browser, treat that key as demo-only and note the security tradeoff.
294
+
295
+ Example:
296
+
297
+ ```typescript
298
+ import type { ResolvedPromptAsset } from 'promptopskit';
299
+ import { openaiAdapter } from 'promptopskit/openai';
300
+
301
+ const prompt: ResolvedPromptAsset = {
302
+ id: 'summarizePullRequest',
303
+ schema_version: 1,
304
+ provider: 'openai',
305
+ model: 'gpt-5.4',
306
+ context: {
307
+ inputs: [{ name: 'pull_request_body', max_size: 8000 }],
308
+ },
309
+ sections: {
310
+ system_instructions: 'You summarize pull requests clearly and concisely.',
311
+ prompt_template: 'Summarize this pull request:\n\n{{ pull_request_body }}',
312
+ },
313
+ };
314
+
315
+ const validation = openaiAdapter.validate(prompt, {
316
+ environment: 'prod',
317
+ });
318
+ if (!validation.valid) {
319
+ throw new Error(validation.errors.join(' '));
320
+ }
321
+
322
+ const request = openaiAdapter.render(prompt, {
323
+ environment: 'prod',
324
+ variables: {
325
+ pull_request_body: 'Add theming and dark mode support to the application.',
326
+ },
327
+ strict: true,
328
+ });
329
+
330
+ // request.body is ready for the OpenAI SDK or fetch.
331
+ ```
332
+
284
333
  ### Step-by-step API
285
334
 
286
335
  ```typescript
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  openaiAdapter
3
- } from "./chunk-UYTUGV7Z.js";
3
+ } from "./chunk-Y2YYEGOY.js";
4
4
 
5
5
  // src/providers/openrouter.ts
6
6
  var openrouterAdapter = {
7
7
  name: "openrouter",
8
- validate(asset) {
9
- return openaiAdapter.validate(asset);
8
+ validate(asset, runtime) {
9
+ return openaiAdapter.validate(asset, runtime);
10
10
  },
11
11
  render(asset, runtime) {
12
12
  const result = openaiAdapter.render(asset, runtime);
@@ -20,4 +20,4 @@ var openrouterAdapter = {
20
20
  export {
21
21
  openrouterAdapter
22
22
  };
23
- //# sourceMappingURL=chunk-PU3UPUND.js.map
23
+ //# sourceMappingURL=chunk-DDXFDVA6.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/providers/openrouter.ts"],"sourcesContent":["import { openaiAdapter } from './openai.js';\nimport type { ResolvedPromptAsset } from '../schema/index.js';\nimport type {\n ProviderAdapter,\n ProviderRequest,\n ValidationResult,\n RuntimeRenderOptions,\n} from './types.js';\n\n/**\n * OpenRouter provider adapter.\n * Thin preset over the OpenAI adapter — body format is identical,\n * only the provider label differs. The app handles the different\n * base URL and extra headers (HTTP-Referer, X-Title).\n */\nexport const openrouterAdapter: ProviderAdapter = {\n name: 'openrouter',\n\n validate(asset: ResolvedPromptAsset): ValidationResult {\n return openaiAdapter.validate(asset);\n },\n\n render(asset: ResolvedPromptAsset, runtime: RuntimeRenderOptions): ProviderRequest {\n const result = openaiAdapter.render(asset, runtime);\n return {\n ...result,\n provider: 'openrouter',\n };\n },\n};\n"],"mappings":";;;;;AAeO,IAAM,oBAAqC;AAAA,EAChD,MAAM;AAAA,EAEN,SAAS,OAA8C;AACrD,WAAO,cAAc,SAAS,KAAK;AAAA,EACrC;AAAA,EAEA,OAAO,OAA4B,SAAgD;AACjF,UAAM,SAAS,cAAc,OAAO,OAAO,OAAO;AAClD,WAAO;AAAA,MACL,GAAG;AAAA,MACH,UAAU;AAAA,IACZ;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/providers/openrouter.ts"],"sourcesContent":["import { openaiAdapter } from './openai.js';\nimport type { ResolvedPromptAsset } from '../schema/index.js';\nimport type {\n ProviderAdapter,\n ProviderRequest,\n ValidationResult,\n RuntimeRenderOptions,\n} from './types.js';\n\n/**\n * OpenRouter provider adapter.\n * Thin preset over the OpenAI adapter — body format is identical,\n * only the provider label differs. The app handles the different\n * base URL and extra headers (HTTP-Referer, X-Title).\n */\nexport const openrouterAdapter: ProviderAdapter = {\n name: 'openrouter',\n\n validate(asset: ResolvedPromptAsset, runtime?: RuntimeRenderOptions): ValidationResult {\n return openaiAdapter.validate(asset, runtime);\n },\n\n render(asset: ResolvedPromptAsset, runtime: RuntimeRenderOptions): ProviderRequest {\n const result = openaiAdapter.render(asset, runtime);\n return {\n ...result,\n provider: 'openrouter',\n };\n },\n};\n"],"mappings":";;;;;AAeO,IAAM,oBAAqC;AAAA,EAChD,MAAM;AAAA,EAEN,SAAS,OAA4B,SAAkD;AACrF,WAAO,cAAc,SAAS,OAAO,OAAO;AAAA,EAC9C;AAAA,EAEA,OAAO,OAA4B,SAAgD;AACjF,UAAM,SAAS,cAAc,OAAO,OAAO,OAAO;AAClD,WAAO;AAAA,MACL,GAAG;AAAA,MACH,UAAU;AAAA,IACZ;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,101 @@
1
+ // src/overrides/apply-overrides.ts
2
+ function applyOverrides(asset, options = {}) {
3
+ let result = { ...asset };
4
+ if (options.environment && result.environments?.[options.environment]) {
5
+ result = mergeOverride(result, result.environments[options.environment]);
6
+ }
7
+ if (options.tier && result.tiers?.[options.tier]) {
8
+ result = mergeOverride(result, result.tiers[options.tier]);
9
+ }
10
+ if (options.runtime) {
11
+ result = mergeOverride(result, options.runtime);
12
+ }
13
+ return result;
14
+ }
15
+ function mergeOverride(base, override) {
16
+ const result = { ...base };
17
+ if (override.model !== void 0) result.model = override.model;
18
+ if (override.fallback_models !== void 0) result.fallback_models = override.fallback_models;
19
+ if (override.tools !== void 0) result.tools = override.tools;
20
+ if (override.reasoning !== void 0) {
21
+ result.reasoning = { ...result.reasoning, ...override.reasoning };
22
+ }
23
+ if (override.sampling !== void 0) {
24
+ result.sampling = { ...result.sampling, ...override.sampling };
25
+ }
26
+ if (override.response !== void 0) {
27
+ result.response = { ...result.response, ...override.response };
28
+ }
29
+ return result;
30
+ }
31
+
32
+ // src/renderer/interpolate.ts
33
+ var VARIABLE_RE = /\{\{\s*([a-zA-Z_][a-zA-Z0-9_]*)\s*\}\}/g;
34
+ var ESCAPED_OPEN = /\\\{\\\{/g;
35
+ var ESCAPE_PLACEHOLDER = "\0ESCAPED_OPEN\0";
36
+ function interpolate(template, variables, options = {}) {
37
+ const { strict = false } = options;
38
+ let result = template.replace(ESCAPED_OPEN, ESCAPE_PLACEHOLDER);
39
+ result = result.replace(VARIABLE_RE, (match, name) => {
40
+ if (name in variables) {
41
+ return variables[name];
42
+ }
43
+ if (strict) {
44
+ throw new Error(`Missing required variable: "${name}"`);
45
+ }
46
+ return match;
47
+ });
48
+ result = result.replaceAll(ESCAPE_PLACEHOLDER, "{{");
49
+ return result;
50
+ }
51
+ function extractVariables(template) {
52
+ const vars = /* @__PURE__ */ new Set();
53
+ let match;
54
+ const re = new RegExp(VARIABLE_RE.source, "g");
55
+ while ((match = re.exec(template)) !== null) {
56
+ vars.add(match[1]);
57
+ }
58
+ return [...vars];
59
+ }
60
+
61
+ // src/renderer/renderer.ts
62
+ function renderSections(asset, options = {}) {
63
+ const { variables = {}, strict = false } = options;
64
+ const result = {};
65
+ if (asset.sections.system_instructions) {
66
+ result.system_instructions = interpolate(
67
+ asset.sections.system_instructions,
68
+ variables,
69
+ { strict }
70
+ );
71
+ }
72
+ if (asset.sections.prompt_template) {
73
+ result.prompt_template = interpolate(
74
+ asset.sections.prompt_template,
75
+ variables,
76
+ { strict }
77
+ );
78
+ }
79
+ return result;
80
+ }
81
+
82
+ // src/providers/resolve-asset.ts
83
+ function resolveAssetForProvider(asset, runtime = {}) {
84
+ if (!runtime.environment && !runtime.tier && !runtime.runtime) {
85
+ return asset;
86
+ }
87
+ return applyOverrides(asset, {
88
+ environment: runtime.environment,
89
+ tier: runtime.tier,
90
+ runtime: runtime.runtime
91
+ });
92
+ }
93
+
94
+ export {
95
+ applyOverrides,
96
+ interpolate,
97
+ extractVariables,
98
+ renderSections,
99
+ resolveAssetForProvider
100
+ };
101
+ //# sourceMappingURL=chunk-DGFBS7YW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/overrides/apply-overrides.ts","../src/renderer/interpolate.ts","../src/renderer/renderer.ts","../src/providers/resolve-asset.ts"],"sourcesContent":["import type { PromptAsset, PromptAssetOverrides } from '../schema/index.js';\n\nexport interface OverrideOptions {\n environment?: string;\n tier?: string;\n runtime?: Partial<PromptAssetOverrides>;\n}\n\n/**\n * Apply environment, tier, and runtime overrides to a prompt asset.\n *\n * Precedence: base → environment → tier → runtime\n * Scalars are replaced. Arrays are replaced (not concatenated).\n */\nexport function applyOverrides(\n asset: PromptAsset,\n options: OverrideOptions = {},\n): PromptAsset {\n let result = { ...asset };\n\n // Apply environment override\n if (options.environment && result.environments?.[options.environment]) {\n result = mergeOverride(result, result.environments[options.environment]);\n }\n\n // Apply tier override\n if (options.tier && result.tiers?.[options.tier]) {\n result = mergeOverride(result, result.tiers[options.tier]);\n }\n\n // Apply runtime overrides\n if (options.runtime) {\n result = mergeOverride(result, options.runtime);\n }\n\n return result;\n}\n\nfunction mergeOverride(\n base: PromptAsset,\n override: Partial<PromptAssetOverrides>,\n): PromptAsset {\n const result = { ...base };\n\n if (override.model !== undefined) result.model = override.model;\n if (override.fallback_models !== undefined) result.fallback_models = override.fallback_models;\n if (override.tools !== undefined) result.tools = override.tools;\n\n if (override.reasoning !== undefined) {\n result.reasoning = { ...result.reasoning, ...override.reasoning };\n }\n if (override.sampling !== undefined) {\n result.sampling = { ...result.sampling, ...override.sampling };\n }\n if (override.response !== undefined) {\n result.response = { ...result.response, ...override.response };\n }\n\n return result;\n}\n","export interface InterpolateOptions {\n strict?: boolean;\n}\n\nconst VARIABLE_RE = /\\{\\{\\s*([a-zA-Z_][a-zA-Z0-9_]*)\\s*\\}\\}/g;\nconst ESCAPED_OPEN = /\\\\\\{\\\\\\{/g;\nconst ESCAPE_PLACEHOLDER = '\\x00ESCAPED_OPEN\\x00';\n\n/**\n * Interpolate variables into a template string.\n *\n * Syntax: {{ variable_name }}\n * Escape: \\{\\{ produces literal {{\n *\n * In strict mode, throws on missing variables.\n * In permissive mode, leaves {{ placeholder }} intact.\n */\nexport function interpolate(\n template: string,\n variables: Record<string, string>,\n options: InterpolateOptions = {},\n): string {\n const { strict = false } = options;\n\n // Replace escaped sequences with placeholder\n let result = template.replace(ESCAPED_OPEN, ESCAPE_PLACEHOLDER);\n\n result = result.replace(VARIABLE_RE, (match, name: string) => {\n if (name in variables) {\n return variables[name];\n }\n if (strict) {\n throw new Error(`Missing required variable: \"${name}\"`);\n }\n return match; // leave placeholder intact in permissive mode\n });\n\n // Restore escaped sequences\n result = result.replaceAll(ESCAPE_PLACEHOLDER, '{{');\n\n return result;\n}\n\n/**\n * Extract all variable names referenced in a template.\n */\nexport function extractVariables(template: string): string[] {\n const vars = new Set<string>();\n let match: RegExpExecArray | null;\n const re = new RegExp(VARIABLE_RE.source, 'g');\n while ((match = re.exec(template)) !== null) {\n vars.add(match[1]);\n }\n return [...vars];\n}\n","import type { ResolvedPromptAsset } from '../schema/index.js';\nimport { interpolate, extractVariables } from './interpolate.js';\n\nexport interface RenderOptions {\n variables?: Record<string, string>;\n strict?: boolean;\n}\n\nexport interface RenderedSections {\n system_instructions?: string;\n prompt_template?: string;\n}\n\n/**\n * Render the sections of a resolved prompt asset with variable interpolation.\n */\nexport function renderSections(\n asset: ResolvedPromptAsset,\n options: RenderOptions = {},\n): RenderedSections {\n const { variables = {}, strict = false } = options;\n\n const result: RenderedSections = {};\n\n if (asset.sections.system_instructions) {\n result.system_instructions = interpolate(\n asset.sections.system_instructions,\n variables,\n { strict },\n );\n }\n\n if (asset.sections.prompt_template) {\n result.prompt_template = interpolate(\n asset.sections.prompt_template,\n variables,\n { strict },\n );\n }\n\n return result;\n}\n\n/**\n * Get all variable names used across all sections.\n */\nexport function getRequiredVariables(asset: ResolvedPromptAsset): string[] {\n const vars = new Set<string>();\n\n if (asset.sections.system_instructions) {\n for (const v of extractVariables(asset.sections.system_instructions)) {\n vars.add(v);\n }\n }\n\n if (asset.sections.prompt_template) {\n for (const v of extractVariables(asset.sections.prompt_template)) {\n vars.add(v);\n }\n }\n\n return [...vars];\n}\n","import { applyOverrides } from '../overrides/index.js';\nimport type { ResolvedPromptAsset } from '../schema/index.js';\nimport type { RuntimeRenderOptions } from './types.js';\n\nexport function resolveAssetForProvider(\n asset: ResolvedPromptAsset,\n runtime: Pick<RuntimeRenderOptions, 'environment' | 'tier' | 'runtime'> = {},\n): ResolvedPromptAsset {\n if (!runtime.environment && !runtime.tier && !runtime.runtime) {\n return asset;\n }\n\n return applyOverrides(asset, {\n environment: runtime.environment,\n tier: runtime.tier,\n runtime: runtime.runtime,\n }) as ResolvedPromptAsset;\n}"],"mappings":";AAcO,SAAS,eACd,OACA,UAA2B,CAAC,GACf;AACb,MAAI,SAAS,EAAE,GAAG,MAAM;AAGxB,MAAI,QAAQ,eAAe,OAAO,eAAe,QAAQ,WAAW,GAAG;AACrE,aAAS,cAAc,QAAQ,OAAO,aAAa,QAAQ,WAAW,CAAC;AAAA,EACzE;AAGA,MAAI,QAAQ,QAAQ,OAAO,QAAQ,QAAQ,IAAI,GAAG;AAChD,aAAS,cAAc,QAAQ,OAAO,MAAM,QAAQ,IAAI,CAAC;AAAA,EAC3D;AAGA,MAAI,QAAQ,SAAS;AACnB,aAAS,cAAc,QAAQ,QAAQ,OAAO;AAAA,EAChD;AAEA,SAAO;AACT;AAEA,SAAS,cACP,MACA,UACa;AACb,QAAM,SAAS,EAAE,GAAG,KAAK;AAEzB,MAAI,SAAS,UAAU,OAAW,QAAO,QAAQ,SAAS;AAC1D,MAAI,SAAS,oBAAoB,OAAW,QAAO,kBAAkB,SAAS;AAC9E,MAAI,SAAS,UAAU,OAAW,QAAO,QAAQ,SAAS;AAE1D,MAAI,SAAS,cAAc,QAAW;AACpC,WAAO,YAAY,EAAE,GAAG,OAAO,WAAW,GAAG,SAAS,UAAU;AAAA,EAClE;AACA,MAAI,SAAS,aAAa,QAAW;AACnC,WAAO,WAAW,EAAE,GAAG,OAAO,UAAU,GAAG,SAAS,SAAS;AAAA,EAC/D;AACA,MAAI,SAAS,aAAa,QAAW;AACnC,WAAO,WAAW,EAAE,GAAG,OAAO,UAAU,GAAG,SAAS,SAAS;AAAA,EAC/D;AAEA,SAAO;AACT;;;ACvDA,IAAM,cAAc;AACpB,IAAM,eAAe;AACrB,IAAM,qBAAqB;AAWpB,SAAS,YACd,UACA,WACA,UAA8B,CAAC,GACvB;AACR,QAAM,EAAE,SAAS,MAAM,IAAI;AAG3B,MAAI,SAAS,SAAS,QAAQ,cAAc,kBAAkB;AAE9D,WAAS,OAAO,QAAQ,aAAa,CAAC,OAAO,SAAiB;AAC5D,QAAI,QAAQ,WAAW;AACrB,aAAO,UAAU,IAAI;AAAA,IACvB;AACA,QAAI,QAAQ;AACV,YAAM,IAAI,MAAM,+BAA+B,IAAI,GAAG;AAAA,IACxD;AACA,WAAO;AAAA,EACT,CAAC;AAGD,WAAS,OAAO,WAAW,oBAAoB,IAAI;AAEnD,SAAO;AACT;AAKO,SAAS,iBAAiB,UAA4B;AAC3D,QAAM,OAAO,oBAAI,IAAY;AAC7B,MAAI;AACJ,QAAM,KAAK,IAAI,OAAO,YAAY,QAAQ,GAAG;AAC7C,UAAQ,QAAQ,GAAG,KAAK,QAAQ,OAAO,MAAM;AAC3C,SAAK,IAAI,MAAM,CAAC,CAAC;AAAA,EACnB;AACA,SAAO,CAAC,GAAG,IAAI;AACjB;;;ACtCO,SAAS,eACd,OACA,UAAyB,CAAC,GACR;AAClB,QAAM,EAAE,YAAY,CAAC,GAAG,SAAS,MAAM,IAAI;AAE3C,QAAM,SAA2B,CAAC;AAElC,MAAI,MAAM,SAAS,qBAAqB;AACtC,WAAO,sBAAsB;AAAA,MAC3B,MAAM,SAAS;AAAA,MACf;AAAA,MACA,EAAE,OAAO;AAAA,IACX;AAAA,EACF;AAEA,MAAI,MAAM,SAAS,iBAAiB;AAClC,WAAO,kBAAkB;AAAA,MACvB,MAAM,SAAS;AAAA,MACf;AAAA,MACA,EAAE,OAAO;AAAA,IACX;AAAA,EACF;AAEA,SAAO;AACT;;;ACrCO,SAAS,wBACd,OACA,UAA0E,CAAC,GACtD;AACrB,MAAI,CAAC,QAAQ,eAAe,CAAC,QAAQ,QAAQ,CAAC,QAAQ,SAAS;AAC7D,WAAO;AAAA,EACT;AAEA,SAAO,eAAe,OAAO;AAAA,IAC3B,aAAa,QAAQ;AAAA,IACrB,MAAM,QAAQ;AAAA,IACd,SAAS,QAAQ;AAAA,EACnB,CAAC;AACH;","names":[]}
@@ -1,26 +1,29 @@
1
1
  import {
2
- renderSections
3
- } from "./chunk-6KGBPHSY.js";
2
+ renderSections,
3
+ resolveAssetForProvider
4
+ } from "./chunk-DGFBS7YW.js";
4
5
 
5
6
  // src/providers/gemini.ts
6
7
  var geminiAdapter = {
7
8
  name: "gemini",
8
- validate(asset) {
9
+ validate(asset, runtime) {
10
+ const resolvedAsset = resolveAssetForProvider(asset, runtime);
9
11
  const errors = [];
10
12
  const warnings = [];
11
- if (!asset.model) {
13
+ if (!resolvedAsset.model) {
12
14
  errors.push("Gemini adapter requires a model to be specified.");
13
15
  }
14
- if (asset.sampling?.frequency_penalty !== void 0) {
16
+ if (resolvedAsset.sampling?.frequency_penalty !== void 0) {
15
17
  warnings.push("Gemini does not support frequency_penalty. It will be ignored.");
16
18
  }
17
- if (asset.sampling?.presence_penalty !== void 0) {
19
+ if (resolvedAsset.sampling?.presence_penalty !== void 0) {
18
20
  warnings.push("Gemini does not support presence_penalty. It will be ignored.");
19
21
  }
20
22
  return { valid: errors.length === 0, errors, warnings };
21
23
  },
22
24
  render(asset, runtime) {
23
- const sections = renderSections(asset, {
25
+ const resolvedAsset = resolveAssetForProvider(asset, runtime);
26
+ const sections = renderSections(resolvedAsset, {
24
27
  variables: runtime.variables,
25
28
  strict: runtime.strict
26
29
  });
@@ -48,23 +51,23 @@ var geminiAdapter = {
48
51
  };
49
52
  }
50
53
  const generationConfig = {};
51
- if (asset.sampling?.temperature !== void 0) generationConfig.temperature = asset.sampling.temperature;
52
- if (asset.sampling?.top_p !== void 0) generationConfig.topP = asset.sampling.top_p;
53
- if (asset.sampling?.max_output_tokens !== void 0) generationConfig.maxOutputTokens = asset.sampling.max_output_tokens;
54
- if (asset.sampling?.stop !== void 0) generationConfig.stopSequences = asset.sampling.stop;
55
- if (asset.response?.format === "json") {
54
+ if (resolvedAsset.sampling?.temperature !== void 0) generationConfig.temperature = resolvedAsset.sampling.temperature;
55
+ if (resolvedAsset.sampling?.top_p !== void 0) generationConfig.topP = resolvedAsset.sampling.top_p;
56
+ if (resolvedAsset.sampling?.max_output_tokens !== void 0) generationConfig.maxOutputTokens = resolvedAsset.sampling.max_output_tokens;
57
+ if (resolvedAsset.sampling?.stop !== void 0) generationConfig.stopSequences = resolvedAsset.sampling.stop;
58
+ if (resolvedAsset.response?.format === "json") {
56
59
  generationConfig.responseMimeType = "application/json";
57
60
  }
58
- if (asset.reasoning?.effort) {
61
+ if (resolvedAsset.reasoning?.effort) {
59
62
  body.thinkingConfig = {
60
- thinkingBudget: asset.reasoning.effort === "high" ? 8192 : asset.reasoning.effort === "medium" ? 4096 : 1024
63
+ thinkingBudget: resolvedAsset.reasoning.effort === "high" ? 8192 : resolvedAsset.reasoning.effort === "medium" ? 4096 : 1024
61
64
  };
62
65
  }
63
66
  if (Object.keys(generationConfig).length > 0) {
64
67
  body.generationConfig = generationConfig;
65
68
  }
66
- if (asset.tools && asset.tools.length > 0) {
67
- const functionDeclarations = asset.tools.map((tool) => {
69
+ if (resolvedAsset.tools && resolvedAsset.tools.length > 0) {
70
+ const functionDeclarations = resolvedAsset.tools.map((tool) => {
68
71
  if (typeof tool === "string") {
69
72
  const def = runtime.toolRegistry?.[tool];
70
73
  if (def) return def;
@@ -81,7 +84,7 @@ var geminiAdapter = {
81
84
  return {
82
85
  body,
83
86
  provider: "gemini",
84
- model: asset.model ?? "unknown"
87
+ model: resolvedAsset.model ?? "unknown"
85
88
  };
86
89
  }
87
90
  };
@@ -89,4 +92,4 @@ var geminiAdapter = {
89
92
  export {
90
93
  geminiAdapter
91
94
  };
92
- //# sourceMappingURL=chunk-5BI5FP5L.js.map
95
+ //# sourceMappingURL=chunk-LNZS3TIJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/providers/gemini.ts"],"sourcesContent":["import type { ResolvedPromptAsset } from '../schema/index.js';\nimport type {\n ProviderAdapter,\n ProviderRequest,\n ValidationResult,\n RuntimeRenderOptions,\n} from './types.js';\nimport { renderSections } from '../renderer/index.js';\nimport { resolveAssetForProvider } from './resolve-asset.js';\n\n/**\n * Google Gemini provider adapter.\n * Produces request bodies compatible with the Gemini generateContent API.\n */\nexport const geminiAdapter: ProviderAdapter = {\n name: 'gemini',\n\n validate(asset: ResolvedPromptAsset, runtime?: RuntimeRenderOptions): ValidationResult {\n const resolvedAsset = resolveAssetForProvider(asset, runtime);\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (!resolvedAsset.model) {\n errors.push('Gemini adapter requires a model to be specified.');\n }\n\n if (resolvedAsset.sampling?.frequency_penalty !== undefined) {\n warnings.push('Gemini does not support frequency_penalty. It will be ignored.');\n }\n if (resolvedAsset.sampling?.presence_penalty !== undefined) {\n warnings.push('Gemini does not support presence_penalty. It will be ignored.');\n }\n\n return { valid: errors.length === 0, errors, warnings };\n },\n\n render(asset: ResolvedPromptAsset, runtime: RuntimeRenderOptions): ProviderRequest {\n const resolvedAsset = resolveAssetForProvider(asset, runtime);\n const sections = renderSections(resolvedAsset, {\n variables: runtime.variables,\n strict: runtime.strict,\n });\n\n const contents: Array<Record<string, unknown>> = [];\n\n // History\n if (runtime.history) {\n for (const msg of runtime.history) {\n contents.push({\n role: msg.role === 'assistant' ? 'model' : 'user',\n parts: [{ text: msg.content }],\n });\n }\n }\n\n // User message (prompt template)\n if (sections.prompt_template) {\n contents.push({\n role: 'user',\n parts: [{ text: sections.prompt_template }],\n });\n }\n\n const body: Record<string, unknown> = {\n contents,\n };\n\n // System instruction\n if (sections.system_instructions) {\n body.systemInstruction = {\n parts: [{ text: sections.system_instructions }],\n };\n }\n\n // Generation config\n const generationConfig: Record<string, unknown> = {};\n\n if (resolvedAsset.sampling?.temperature !== undefined) generationConfig.temperature = resolvedAsset.sampling.temperature;\n if (resolvedAsset.sampling?.top_p !== undefined) generationConfig.topP = resolvedAsset.sampling.top_p;\n if (resolvedAsset.sampling?.max_output_tokens !== undefined) generationConfig.maxOutputTokens = resolvedAsset.sampling.max_output_tokens;\n if (resolvedAsset.sampling?.stop !== undefined) generationConfig.stopSequences = resolvedAsset.sampling.stop;\n\n if (resolvedAsset.response?.format === 'json') {\n generationConfig.responseMimeType = 'application/json';\n }\n\n // Thinking config\n if (resolvedAsset.reasoning?.effort) {\n body.thinkingConfig = {\n thinkingBudget: resolvedAsset.reasoning.effort === 'high' ? 8192 : resolvedAsset.reasoning.effort === 'medium' ? 4096 : 1024,\n };\n }\n\n if (Object.keys(generationConfig).length > 0) {\n body.generationConfig = generationConfig;\n }\n\n // Tools\n if (resolvedAsset.tools && resolvedAsset.tools.length > 0) {\n const functionDeclarations = resolvedAsset.tools.map((tool) => {\n if (typeof tool === 'string') {\n const def = runtime.toolRegistry?.[tool];\n if (def) return def;\n return { name: tool };\n }\n return {\n name: tool.name,\n description: tool.description,\n parameters: tool.input_schema,\n };\n });\n body.tools = [{ functionDeclarations }];\n }\n\n return {\n body,\n provider: 'gemini',\n model: resolvedAsset.model ?? 'unknown',\n };\n },\n};\n"],"mappings":";;;;;;AAcO,IAAM,gBAAiC;AAAA,EAC5C,MAAM;AAAA,EAEN,SAAS,OAA4B,SAAkD;AACrF,UAAM,gBAAgB,wBAAwB,OAAO,OAAO;AAC5D,UAAM,SAAmB,CAAC;AAC1B,UAAM,WAAqB,CAAC;AAE5B,QAAI,CAAC,cAAc,OAAO;AACxB,aAAO,KAAK,kDAAkD;AAAA,IAChE;AAEA,QAAI,cAAc,UAAU,sBAAsB,QAAW;AAC3D,eAAS,KAAK,gEAAgE;AAAA,IAChF;AACA,QAAI,cAAc,UAAU,qBAAqB,QAAW;AAC1D,eAAS,KAAK,+DAA+D;AAAA,IAC/E;AAEA,WAAO,EAAE,OAAO,OAAO,WAAW,GAAG,QAAQ,SAAS;AAAA,EACxD;AAAA,EAEA,OAAO,OAA4B,SAAgD;AACjF,UAAM,gBAAgB,wBAAwB,OAAO,OAAO;AAC5D,UAAM,WAAW,eAAe,eAAe;AAAA,MAC7C,WAAW,QAAQ;AAAA,MACnB,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAED,UAAM,WAA2C,CAAC;AAGlD,QAAI,QAAQ,SAAS;AACnB,iBAAW,OAAO,QAAQ,SAAS;AACjC,iBAAS,KAAK;AAAA,UACZ,MAAM,IAAI,SAAS,cAAc,UAAU;AAAA,UAC3C,OAAO,CAAC,EAAE,MAAM,IAAI,QAAQ,CAAC;AAAA,QAC/B,CAAC;AAAA,MACH;AAAA,IACF;AAGA,QAAI,SAAS,iBAAiB;AAC5B,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,OAAO,CAAC,EAAE,MAAM,SAAS,gBAAgB,CAAC;AAAA,MAC5C,CAAC;AAAA,IACH;AAEA,UAAM,OAAgC;AAAA,MACpC;AAAA,IACF;AAGA,QAAI,SAAS,qBAAqB;AAChC,WAAK,oBAAoB;AAAA,QACvB,OAAO,CAAC,EAAE,MAAM,SAAS,oBAAoB,CAAC;AAAA,MAChD;AAAA,IACF;AAGA,UAAM,mBAA4C,CAAC;AAEnD,QAAI,cAAc,UAAU,gBAAgB,OAAW,kBAAiB,cAAc,cAAc,SAAS;AAC7G,QAAI,cAAc,UAAU,UAAU,OAAW,kBAAiB,OAAO,cAAc,SAAS;AAChG,QAAI,cAAc,UAAU,sBAAsB,OAAW,kBAAiB,kBAAkB,cAAc,SAAS;AACvH,QAAI,cAAc,UAAU,SAAS,OAAW,kBAAiB,gBAAgB,cAAc,SAAS;AAExG,QAAI,cAAc,UAAU,WAAW,QAAQ;AAC7C,uBAAiB,mBAAmB;AAAA,IACtC;AAGA,QAAI,cAAc,WAAW,QAAQ;AACnC,WAAK,iBAAiB;AAAA,QACpB,gBAAgB,cAAc,UAAU,WAAW,SAAS,OAAO,cAAc,UAAU,WAAW,WAAW,OAAO;AAAA,MAC1H;AAAA,IACF;AAEA,QAAI,OAAO,KAAK,gBAAgB,EAAE,SAAS,GAAG;AAC5C,WAAK,mBAAmB;AAAA,IAC1B;AAGA,QAAI,cAAc,SAAS,cAAc,MAAM,SAAS,GAAG;AACzD,YAAM,uBAAuB,cAAc,MAAM,IAAI,CAAC,SAAS;AAC7D,YAAI,OAAO,SAAS,UAAU;AAC5B,gBAAM,MAAM,QAAQ,eAAe,IAAI;AACvC,cAAI,IAAK,QAAO;AAChB,iBAAO,EAAE,MAAM,KAAK;AAAA,QACtB;AACA,eAAO;AAAA,UACL,MAAM,KAAK;AAAA,UACX,aAAa,KAAK;AAAA,UAClB,YAAY,KAAK;AAAA,QACnB;AAAA,MACF,CAAC;AACD,WAAK,QAAQ,CAAC,EAAE,qBAAqB,CAAC;AAAA,IACxC;AAEA,WAAO;AAAA,MACL;AAAA,MACA,UAAU;AAAA,MACV,OAAO,cAAc,SAAS;AAAA,IAChC;AAAA,EACF;AACF;","names":[]}
@@ -1,29 +1,32 @@
1
1
  import {
2
- renderSections
3
- } from "./chunk-6KGBPHSY.js";
2
+ renderSections,
3
+ resolveAssetForProvider
4
+ } from "./chunk-DGFBS7YW.js";
4
5
 
5
6
  // src/providers/anthropic.ts
6
7
  var anthropicAdapter = {
7
8
  name: "anthropic",
8
- validate(asset) {
9
+ validate(asset, runtime) {
10
+ const resolvedAsset = resolveAssetForProvider(asset, runtime);
9
11
  const errors = [];
10
12
  const warnings = [];
11
- if (!asset.model) {
13
+ if (!resolvedAsset.model) {
12
14
  errors.push("Anthropic adapter requires a model to be specified.");
13
15
  }
14
- if (asset.sampling?.frequency_penalty !== void 0) {
16
+ if (resolvedAsset.sampling?.frequency_penalty !== void 0) {
15
17
  warnings.push("Anthropic does not support frequency_penalty. It will be ignored.");
16
18
  }
17
- if (asset.sampling?.presence_penalty !== void 0) {
19
+ if (resolvedAsset.sampling?.presence_penalty !== void 0) {
18
20
  warnings.push("Anthropic does not support presence_penalty. It will be ignored.");
19
21
  }
20
- if (asset.reasoning?.effort !== void 0) {
22
+ if (resolvedAsset.reasoning?.effort !== void 0) {
21
23
  warnings.push("Anthropic uses budget_tokens for thinking, not effort. effort will be mapped approximately.");
22
24
  }
23
25
  return { valid: errors.length === 0, errors, warnings };
24
26
  },
25
27
  render(asset, runtime) {
26
- const sections = renderSections(asset, {
28
+ const resolvedAsset = resolveAssetForProvider(asset, runtime);
29
+ const sections = renderSections(resolvedAsset, {
27
30
  variables: runtime.variables,
28
31
  strict: runtime.strict
29
32
  });
@@ -37,31 +40,31 @@ var anthropicAdapter = {
37
40
  messages.push({ role: "user", content: sections.prompt_template });
38
41
  }
39
42
  const body = {
40
- model: asset.model,
43
+ model: resolvedAsset.model,
41
44
  messages
42
45
  };
43
46
  if (sections.system_instructions) {
44
47
  body.system = sections.system_instructions;
45
48
  }
46
- if (asset.sampling?.temperature !== void 0) body.temperature = asset.sampling.temperature;
47
- if (asset.sampling?.top_p !== void 0) body.top_p = asset.sampling.top_p;
48
- if (asset.sampling?.stop !== void 0) body.stop_sequences = asset.sampling.stop;
49
- if (asset.sampling?.max_output_tokens !== void 0) {
50
- body.max_tokens = asset.sampling.max_output_tokens;
49
+ if (resolvedAsset.sampling?.temperature !== void 0) body.temperature = resolvedAsset.sampling.temperature;
50
+ if (resolvedAsset.sampling?.top_p !== void 0) body.top_p = resolvedAsset.sampling.top_p;
51
+ if (resolvedAsset.sampling?.stop !== void 0) body.stop_sequences = resolvedAsset.sampling.stop;
52
+ if (resolvedAsset.sampling?.max_output_tokens !== void 0) {
53
+ body.max_tokens = resolvedAsset.sampling.max_output_tokens;
51
54
  } else {
52
55
  body.max_tokens = 4096;
53
56
  }
54
- if (asset.reasoning?.budget_tokens) {
57
+ if (resolvedAsset.reasoning?.budget_tokens) {
55
58
  body.thinking = {
56
59
  type: "enabled",
57
- budget_tokens: asset.reasoning.budget_tokens
60
+ budget_tokens: resolvedAsset.reasoning.budget_tokens
58
61
  };
59
62
  }
60
- if (asset.response?.stream !== void 0) {
61
- body.stream = asset.response.stream;
63
+ if (resolvedAsset.response?.stream !== void 0) {
64
+ body.stream = resolvedAsset.response.stream;
62
65
  }
63
- if (asset.tools && asset.tools.length > 0) {
64
- body.tools = asset.tools.map((tool) => {
66
+ if (resolvedAsset.tools && resolvedAsset.tools.length > 0) {
67
+ body.tools = resolvedAsset.tools.map((tool) => {
65
68
  if (typeof tool === "string") {
66
69
  const def = runtime.toolRegistry?.[tool];
67
70
  if (def) return def;
@@ -77,7 +80,7 @@ var anthropicAdapter = {
77
80
  return {
78
81
  body,
79
82
  provider: "anthropic",
80
- model: asset.model ?? "unknown"
83
+ model: resolvedAsset.model ?? "unknown"
81
84
  };
82
85
  }
83
86
  };
@@ -85,4 +88,4 @@ var anthropicAdapter = {
85
88
  export {
86
89
  anthropicAdapter
87
90
  };
88
- //# sourceMappingURL=chunk-VYVEVJC3.js.map
91
+ //# sourceMappingURL=chunk-LRRSI4ON.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/providers/anthropic.ts"],"sourcesContent":["import type { ResolvedPromptAsset } from '../schema/index.js';\nimport type {\n ProviderAdapter,\n ProviderRequest,\n ValidationResult,\n RuntimeRenderOptions,\n} from './types.js';\nimport { renderSections } from '../renderer/index.js';\nimport { resolveAssetForProvider } from './resolve-asset.js';\n\n/**\n * Anthropic provider adapter.\n * Produces request bodies compatible with the Anthropic Messages API.\n */\nexport const anthropicAdapter: ProviderAdapter = {\n name: 'anthropic',\n\n validate(asset: ResolvedPromptAsset, runtime?: RuntimeRenderOptions): ValidationResult {\n const resolvedAsset = resolveAssetForProvider(asset, runtime);\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (!resolvedAsset.model) {\n errors.push('Anthropic adapter requires a model to be specified.');\n }\n\n if (resolvedAsset.sampling?.frequency_penalty !== undefined) {\n warnings.push('Anthropic does not support frequency_penalty. It will be ignored.');\n }\n if (resolvedAsset.sampling?.presence_penalty !== undefined) {\n warnings.push('Anthropic does not support presence_penalty. It will be ignored.');\n }\n if (resolvedAsset.reasoning?.effort !== undefined) {\n warnings.push('Anthropic uses budget_tokens for thinking, not effort. effort will be mapped approximately.');\n }\n\n return { valid: errors.length === 0, errors, warnings };\n },\n\n render(asset: ResolvedPromptAsset, runtime: RuntimeRenderOptions): ProviderRequest {\n const resolvedAsset = resolveAssetForProvider(asset, runtime);\n const sections = renderSections(resolvedAsset, {\n variables: runtime.variables,\n strict: runtime.strict,\n });\n\n const messages: Array<Record<string, unknown>> = [];\n\n // History\n if (runtime.history) {\n for (const msg of runtime.history) {\n messages.push({ role: msg.role, content: msg.content });\n }\n }\n\n // User message (prompt template)\n if (sections.prompt_template) {\n messages.push({ role: 'user', content: sections.prompt_template });\n }\n\n const body: Record<string, unknown> = {\n model: resolvedAsset.model,\n messages,\n };\n\n // System goes as top-level field in Anthropic\n if (sections.system_instructions) {\n body.system = sections.system_instructions;\n }\n\n // Sampling params\n if (resolvedAsset.sampling?.temperature !== undefined) body.temperature = resolvedAsset.sampling.temperature;\n if (resolvedAsset.sampling?.top_p !== undefined) body.top_p = resolvedAsset.sampling.top_p;\n if (resolvedAsset.sampling?.stop !== undefined) body.stop_sequences = resolvedAsset.sampling.stop;\n if (resolvedAsset.sampling?.max_output_tokens !== undefined) {\n body.max_tokens = resolvedAsset.sampling.max_output_tokens;\n } else {\n // Anthropic requires max_tokens\n body.max_tokens = 4096;\n }\n\n // Thinking/reasoning\n if (resolvedAsset.reasoning?.budget_tokens) {\n body.thinking = {\n type: 'enabled',\n budget_tokens: resolvedAsset.reasoning.budget_tokens,\n };\n }\n\n // Streaming\n if (resolvedAsset.response?.stream !== undefined) {\n body.stream = resolvedAsset.response.stream;\n }\n\n // Tools\n if (resolvedAsset.tools && resolvedAsset.tools.length > 0) {\n body.tools = resolvedAsset.tools.map((tool) => {\n if (typeof tool === 'string') {\n const def = runtime.toolRegistry?.[tool];\n if (def) return def;\n return { name: tool };\n }\n return {\n name: tool.name,\n description: tool.description,\n input_schema: tool.input_schema ?? { type: 'object', properties: {} },\n };\n });\n }\n\n return {\n body,\n provider: 'anthropic',\n model: resolvedAsset.model ?? 'unknown',\n };\n },\n};\n"],"mappings":";;;;;;AAcO,IAAM,mBAAoC;AAAA,EAC/C,MAAM;AAAA,EAEN,SAAS,OAA4B,SAAkD;AACrF,UAAM,gBAAgB,wBAAwB,OAAO,OAAO;AAC5D,UAAM,SAAmB,CAAC;AAC1B,UAAM,WAAqB,CAAC;AAE5B,QAAI,CAAC,cAAc,OAAO;AACxB,aAAO,KAAK,qDAAqD;AAAA,IACnE;AAEA,QAAI,cAAc,UAAU,sBAAsB,QAAW;AAC3D,eAAS,KAAK,mEAAmE;AAAA,IACnF;AACA,QAAI,cAAc,UAAU,qBAAqB,QAAW;AAC1D,eAAS,KAAK,kEAAkE;AAAA,IAClF;AACA,QAAI,cAAc,WAAW,WAAW,QAAW;AACjD,eAAS,KAAK,6FAA6F;AAAA,IAC7G;AAEA,WAAO,EAAE,OAAO,OAAO,WAAW,GAAG,QAAQ,SAAS;AAAA,EACxD;AAAA,EAEA,OAAO,OAA4B,SAAgD;AACjF,UAAM,gBAAgB,wBAAwB,OAAO,OAAO;AAC5D,UAAM,WAAW,eAAe,eAAe;AAAA,MAC7C,WAAW,QAAQ;AAAA,MACnB,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAED,UAAM,WAA2C,CAAC;AAGlD,QAAI,QAAQ,SAAS;AACnB,iBAAW,OAAO,QAAQ,SAAS;AACjC,iBAAS,KAAK,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,QAAQ,CAAC;AAAA,MACxD;AAAA,IACF;AAGA,QAAI,SAAS,iBAAiB;AAC5B,eAAS,KAAK,EAAE,MAAM,QAAQ,SAAS,SAAS,gBAAgB,CAAC;AAAA,IACnE;AAEA,UAAM,OAAgC;AAAA,MACpC,OAAO,cAAc;AAAA,MACrB;AAAA,IACF;AAGA,QAAI,SAAS,qBAAqB;AAChC,WAAK,SAAS,SAAS;AAAA,IACzB;AAGA,QAAI,cAAc,UAAU,gBAAgB,OAAW,MAAK,cAAc,cAAc,SAAS;AACjG,QAAI,cAAc,UAAU,UAAU,OAAW,MAAK,QAAQ,cAAc,SAAS;AACrF,QAAI,cAAc,UAAU,SAAS,OAAW,MAAK,iBAAiB,cAAc,SAAS;AAC7F,QAAI,cAAc,UAAU,sBAAsB,QAAW;AAC3D,WAAK,aAAa,cAAc,SAAS;AAAA,IAC3C,OAAO;AAEL,WAAK,aAAa;AAAA,IACpB;AAGA,QAAI,cAAc,WAAW,eAAe;AAC1C,WAAK,WAAW;AAAA,QACd,MAAM;AAAA,QACN,eAAe,cAAc,UAAU;AAAA,MACzC;AAAA,IACF;AAGA,QAAI,cAAc,UAAU,WAAW,QAAW;AAChD,WAAK,SAAS,cAAc,SAAS;AAAA,IACvC;AAGA,QAAI,cAAc,SAAS,cAAc,MAAM,SAAS,GAAG;AACzD,WAAK,QAAQ,cAAc,MAAM,IAAI,CAAC,SAAS;AAC7C,YAAI,OAAO,SAAS,UAAU;AAC5B,gBAAM,MAAM,QAAQ,eAAe,IAAI;AACvC,cAAI,IAAK,QAAO;AAChB,iBAAO,EAAE,MAAM,KAAK;AAAA,QACtB;AACA,eAAO;AAAA,UACL,MAAM,KAAK;AAAA,UACX,aAAa,KAAK;AAAA,UAClB,cAAc,KAAK,gBAAgB,EAAE,MAAM,UAAU,YAAY,CAAC,EAAE;AAAA,QACtE;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,MACL;AAAA,MACA,UAAU;AAAA,MACV,OAAO,cAAc,SAAS;AAAA,IAChC;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,86 @@
1
+ import {
2
+ renderSections,
3
+ resolveAssetForProvider
4
+ } from "./chunk-DGFBS7YW.js";
5
+
6
+ // src/providers/openai.ts
7
+ var openaiAdapter = {
8
+ name: "openai",
9
+ validate(asset, runtime) {
10
+ const resolvedAsset = resolveAssetForProvider(asset, runtime);
11
+ const errors = [];
12
+ const warnings = [];
13
+ if (!resolvedAsset.model) {
14
+ errors.push("OpenAI adapter requires a model to be specified.");
15
+ }
16
+ if (resolvedAsset.reasoning?.budget_tokens !== void 0) {
17
+ warnings.push("OpenAI uses reasoning_effort, not budget_tokens. budget_tokens will be ignored.");
18
+ }
19
+ return { valid: errors.length === 0, errors, warnings };
20
+ },
21
+ render(asset, runtime) {
22
+ const resolvedAsset = resolveAssetForProvider(asset, runtime);
23
+ const sections = renderSections(resolvedAsset, {
24
+ variables: runtime.variables,
25
+ strict: runtime.strict
26
+ });
27
+ const messages = [];
28
+ if (sections.system_instructions) {
29
+ messages.push({ role: "system", content: sections.system_instructions });
30
+ }
31
+ if (runtime.history) {
32
+ for (const msg of runtime.history) {
33
+ messages.push({ role: msg.role, content: msg.content });
34
+ }
35
+ }
36
+ if (sections.prompt_template) {
37
+ messages.push({ role: "user", content: sections.prompt_template });
38
+ }
39
+ const body = {
40
+ model: resolvedAsset.model,
41
+ messages
42
+ };
43
+ if (resolvedAsset.sampling?.temperature !== void 0) body.temperature = resolvedAsset.sampling.temperature;
44
+ if (resolvedAsset.sampling?.top_p !== void 0) body.top_p = resolvedAsset.sampling.top_p;
45
+ if (resolvedAsset.sampling?.frequency_penalty !== void 0) body.frequency_penalty = resolvedAsset.sampling.frequency_penalty;
46
+ if (resolvedAsset.sampling?.presence_penalty !== void 0) body.presence_penalty = resolvedAsset.sampling.presence_penalty;
47
+ if (resolvedAsset.sampling?.stop !== void 0) body.stop = resolvedAsset.sampling.stop;
48
+ if (resolvedAsset.sampling?.max_output_tokens !== void 0) body.max_tokens = resolvedAsset.sampling.max_output_tokens;
49
+ if (resolvedAsset.reasoning?.effort) {
50
+ body.reasoning_effort = resolvedAsset.reasoning.effort;
51
+ }
52
+ if (resolvedAsset.response?.format === "json") {
53
+ body.response_format = { type: "json_object" };
54
+ }
55
+ if (resolvedAsset.response?.stream !== void 0) {
56
+ body.stream = resolvedAsset.response.stream;
57
+ }
58
+ if (resolvedAsset.tools && resolvedAsset.tools.length > 0) {
59
+ body.tools = resolvedAsset.tools.map((tool) => {
60
+ if (typeof tool === "string") {
61
+ const def = runtime.toolRegistry?.[tool];
62
+ if (def) return def;
63
+ return { type: "function", function: { name: tool } };
64
+ }
65
+ return {
66
+ type: "function",
67
+ function: {
68
+ name: tool.name,
69
+ description: tool.description,
70
+ parameters: tool.input_schema
71
+ }
72
+ };
73
+ });
74
+ }
75
+ return {
76
+ body,
77
+ provider: "openai",
78
+ model: resolvedAsset.model ?? "unknown"
79
+ };
80
+ }
81
+ };
82
+
83
+ export {
84
+ openaiAdapter
85
+ };
86
+ //# sourceMappingURL=chunk-Y2YYEGOY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/providers/openai.ts"],"sourcesContent":["import type { ResolvedPromptAsset } from '../schema/index.js';\nimport type {\n ProviderAdapter,\n ProviderRequest,\n ValidationResult,\n RuntimeRenderOptions,\n} from './types.js';\nimport { renderSections } from '../renderer/index.js';\nimport { resolveAssetForProvider } from './resolve-asset.js';\n\n/**\n * OpenAI provider adapter.\n * Produces request bodies compatible with the OpenAI Chat Completions API.\n */\nexport const openaiAdapter: ProviderAdapter = {\n name: 'openai',\n\n validate(asset: ResolvedPromptAsset, runtime?: RuntimeRenderOptions): ValidationResult {\n const resolvedAsset = resolveAssetForProvider(asset, runtime);\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (!resolvedAsset.model) {\n errors.push('OpenAI adapter requires a model to be specified.');\n }\n\n if (resolvedAsset.reasoning?.budget_tokens !== undefined) {\n warnings.push('OpenAI uses reasoning_effort, not budget_tokens. budget_tokens will be ignored.');\n }\n\n return { valid: errors.length === 0, errors, warnings };\n },\n\n render(asset: ResolvedPromptAsset, runtime: RuntimeRenderOptions): ProviderRequest {\n const resolvedAsset = resolveAssetForProvider(asset, runtime);\n const sections = renderSections(resolvedAsset, {\n variables: runtime.variables,\n strict: runtime.strict,\n });\n\n const messages: Array<Record<string, unknown>> = [];\n\n // System message\n if (sections.system_instructions) {\n messages.push({ role: 'system', content: sections.system_instructions });\n }\n\n // History\n if (runtime.history) {\n for (const msg of runtime.history) {\n messages.push({ role: msg.role, content: msg.content });\n }\n }\n\n // User message (prompt template)\n if (sections.prompt_template) {\n messages.push({ role: 'user', content: sections.prompt_template });\n }\n\n const body: Record<string, unknown> = {\n model: resolvedAsset.model,\n messages,\n };\n\n // Sampling params\n if (resolvedAsset.sampling?.temperature !== undefined) body.temperature = resolvedAsset.sampling.temperature;\n if (resolvedAsset.sampling?.top_p !== undefined) body.top_p = resolvedAsset.sampling.top_p;\n if (resolvedAsset.sampling?.frequency_penalty !== undefined) body.frequency_penalty = resolvedAsset.sampling.frequency_penalty;\n if (resolvedAsset.sampling?.presence_penalty !== undefined) body.presence_penalty = resolvedAsset.sampling.presence_penalty;\n if (resolvedAsset.sampling?.stop !== undefined) body.stop = resolvedAsset.sampling.stop;\n if (resolvedAsset.sampling?.max_output_tokens !== undefined) body.max_tokens = resolvedAsset.sampling.max_output_tokens;\n\n // Reasoning\n if (resolvedAsset.reasoning?.effort) {\n body.reasoning_effort = resolvedAsset.reasoning.effort;\n }\n\n // Response format\n if (resolvedAsset.response?.format === 'json') {\n body.response_format = { type: 'json_object' };\n }\n\n // Streaming\n if (resolvedAsset.response?.stream !== undefined) {\n body.stream = resolvedAsset.response.stream;\n }\n\n // Tools\n if (resolvedAsset.tools && resolvedAsset.tools.length > 0) {\n body.tools = resolvedAsset.tools.map((tool) => {\n if (typeof tool === 'string') {\n // Look up from registry\n const def = runtime.toolRegistry?.[tool];\n if (def) return def;\n return { type: 'function', function: { name: tool } };\n }\n return {\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.input_schema,\n },\n };\n });\n }\n\n return {\n body,\n provider: 'openai',\n model: resolvedAsset.model ?? 'unknown',\n };\n },\n};\n"],"mappings":";;;;;;AAcO,IAAM,gBAAiC;AAAA,EAC5C,MAAM;AAAA,EAEN,SAAS,OAA4B,SAAkD;AACrF,UAAM,gBAAgB,wBAAwB,OAAO,OAAO;AAC5D,UAAM,SAAmB,CAAC;AAC1B,UAAM,WAAqB,CAAC;AAE5B,QAAI,CAAC,cAAc,OAAO;AACxB,aAAO,KAAK,kDAAkD;AAAA,IAChE;AAEA,QAAI,cAAc,WAAW,kBAAkB,QAAW;AACxD,eAAS,KAAK,iFAAiF;AAAA,IACjG;AAEA,WAAO,EAAE,OAAO,OAAO,WAAW,GAAG,QAAQ,SAAS;AAAA,EACxD;AAAA,EAEA,OAAO,OAA4B,SAAgD;AACjF,UAAM,gBAAgB,wBAAwB,OAAO,OAAO;AAC5D,UAAM,WAAW,eAAe,eAAe;AAAA,MAC7C,WAAW,QAAQ;AAAA,MACnB,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAED,UAAM,WAA2C,CAAC;AAGlD,QAAI,SAAS,qBAAqB;AAChC,eAAS,KAAK,EAAE,MAAM,UAAU,SAAS,SAAS,oBAAoB,CAAC;AAAA,IACzE;AAGA,QAAI,QAAQ,SAAS;AACnB,iBAAW,OAAO,QAAQ,SAAS;AACjC,iBAAS,KAAK,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,QAAQ,CAAC;AAAA,MACxD;AAAA,IACF;AAGA,QAAI,SAAS,iBAAiB;AAC5B,eAAS,KAAK,EAAE,MAAM,QAAQ,SAAS,SAAS,gBAAgB,CAAC;AAAA,IACnE;AAEA,UAAM,OAAgC;AAAA,MACpC,OAAO,cAAc;AAAA,MACrB;AAAA,IACF;AAGA,QAAI,cAAc,UAAU,gBAAgB,OAAW,MAAK,cAAc,cAAc,SAAS;AACjG,QAAI,cAAc,UAAU,UAAU,OAAW,MAAK,QAAQ,cAAc,SAAS;AACrF,QAAI,cAAc,UAAU,sBAAsB,OAAW,MAAK,oBAAoB,cAAc,SAAS;AAC7G,QAAI,cAAc,UAAU,qBAAqB,OAAW,MAAK,mBAAmB,cAAc,SAAS;AAC3G,QAAI,cAAc,UAAU,SAAS,OAAW,MAAK,OAAO,cAAc,SAAS;AACnF,QAAI,cAAc,UAAU,sBAAsB,OAAW,MAAK,aAAa,cAAc,SAAS;AAGtG,QAAI,cAAc,WAAW,QAAQ;AACnC,WAAK,mBAAmB,cAAc,UAAU;AAAA,IAClD;AAGA,QAAI,cAAc,UAAU,WAAW,QAAQ;AAC7C,WAAK,kBAAkB,EAAE,MAAM,cAAc;AAAA,IAC/C;AAGA,QAAI,cAAc,UAAU,WAAW,QAAW;AAChD,WAAK,SAAS,cAAc,SAAS;AAAA,IACvC;AAGA,QAAI,cAAc,SAAS,cAAc,MAAM,SAAS,GAAG;AACzD,WAAK,QAAQ,cAAc,MAAM,IAAI,CAAC,SAAS;AAC7C,YAAI,OAAO,SAAS,UAAU;AAE5B,gBAAM,MAAM,QAAQ,eAAe,IAAI;AACvC,cAAI,IAAK,QAAO;AAChB,iBAAO,EAAE,MAAM,YAAY,UAAU,EAAE,MAAM,KAAK,EAAE;AAAA,QACtD;AACA,eAAO;AAAA,UACL,MAAM;AAAA,UACN,UAAU;AAAA,YACR,MAAM,KAAK;AAAA,YACX,aAAa,KAAK;AAAA,YAClB,YAAY,KAAK;AAAA,UACnB;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,MACL;AAAA,MACA,UAAU;AAAA,MACV,OAAO,cAAc,SAAS;AAAA,IAChC;AAAA,EACF;AACF;","names":[]}