promptopskit 0.3.8 → 0.3.9

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 (68) hide show
  1. package/README.md +6 -3
  2. package/dist/{chunk-5OYWNRNC.js → chunk-4LEPCCSA.js} +50 -5
  3. package/dist/chunk-4LEPCCSA.js.map +1 -0
  4. package/dist/{chunk-E6NPZOJL.js → chunk-AN3OR7YC.js} +26 -3
  5. package/dist/chunk-AN3OR7YC.js.map +1 -0
  6. package/dist/{chunk-UJU5XERR.js → chunk-LMURMZUA.js} +22 -3
  7. package/dist/chunk-LMURMZUA.js.map +1 -0
  8. package/dist/{chunk-BBVVA27J.js → chunk-O6RQZYS4.js} +49 -7
  9. package/dist/chunk-O6RQZYS4.js.map +1 -0
  10. package/dist/{chunk-X73VG645.js → chunk-V7QY7MRM.js} +16 -2
  11. package/dist/chunk-V7QY7MRM.js.map +1 -0
  12. package/dist/{chunk-E2NXJLS6.js → chunk-YAD6COQX.js} +3 -3
  13. package/dist/chunk-YNIAA4ZJ.js +111 -0
  14. package/dist/chunk-YNIAA4ZJ.js.map +1 -0
  15. package/dist/cli/index.js +70 -5
  16. package/dist/cli/index.js.map +1 -1
  17. package/dist/index.cjs +265 -14
  18. package/dist/index.cjs.map +1 -1
  19. package/dist/index.d.cts +7 -4
  20. package/dist/index.d.ts +7 -4
  21. package/dist/index.js +18 -9
  22. package/dist/index.js.map +1 -1
  23. package/dist/providers/anthropic.cjs +110 -9
  24. package/dist/providers/anthropic.cjs.map +1 -1
  25. package/dist/providers/anthropic.d.cts +2 -2
  26. package/dist/providers/anthropic.d.ts +2 -2
  27. package/dist/providers/anthropic.js +3 -3
  28. package/dist/providers/gemini.cjs +87 -5
  29. package/dist/providers/gemini.cjs.map +1 -1
  30. package/dist/providers/gemini.d.cts +2 -2
  31. package/dist/providers/gemini.d.ts +2 -2
  32. package/dist/providers/gemini.js +3 -3
  33. package/dist/providers/openai-responses.cjs +1059 -0
  34. package/dist/providers/openai-responses.cjs.map +1 -0
  35. package/dist/providers/openai-responses.d.cts +11 -0
  36. package/dist/providers/openai-responses.d.ts +11 -0
  37. package/dist/providers/openai-responses.js +9 -0
  38. package/dist/providers/openai-responses.js.map +1 -0
  39. package/dist/providers/openai.cjs +83 -5
  40. package/dist/providers/openai.cjs.map +1 -1
  41. package/dist/providers/openai.d.cts +2 -2
  42. package/dist/providers/openai.d.ts +2 -2
  43. package/dist/providers/openai.js +3 -3
  44. package/dist/providers/openrouter.cjs +83 -5
  45. package/dist/providers/openrouter.cjs.map +1 -1
  46. package/dist/providers/openrouter.d.cts +2 -2
  47. package/dist/providers/openrouter.d.ts +2 -2
  48. package/dist/providers/openrouter.js +4 -4
  49. package/dist/schema-BKkg93rL.d.cts +1923 -0
  50. package/dist/schema-BKkg93rL.d.ts +1923 -0
  51. package/dist/testing.cjs +49 -4
  52. package/dist/testing.cjs.map +1 -1
  53. package/dist/testing.d.cts +1 -1
  54. package/dist/testing.d.ts +1 -1
  55. package/dist/testing.js +1 -1
  56. package/dist/{types-C6RG0Si0.d.cts → types-7cC17GWp.d.cts} +13 -1
  57. package/dist/{types-fBvo_d4k.d.ts → types-CsQ8tON_.d.ts} +13 -1
  58. package/dist/usagetap/index.d.cts +2 -2
  59. package/dist/usagetap/index.d.ts +2 -2
  60. package/package.json +11 -1
  61. package/dist/chunk-5OYWNRNC.js.map +0 -1
  62. package/dist/chunk-BBVVA27J.js.map +0 -1
  63. package/dist/chunk-E6NPZOJL.js.map +0 -1
  64. package/dist/chunk-UJU5XERR.js.map +0 -1
  65. package/dist/chunk-X73VG645.js.map +0 -1
  66. package/dist/schema-DwzYbZba.d.cts +0 -859
  67. package/dist/schema-DwzYbZba.d.ts +0 -859
  68. /package/dist/{chunk-E2NXJLS6.js.map → chunk-YAD6COQX.js.map} +0 -0
package/README.md CHANGED
@@ -135,7 +135,8 @@ Supported values for `warnings.contextSize` are `auto`, `off`, `result-only`, `c
135
135
  - **Composition** — `includes` to share system instructions across prompts, with circular detection
136
136
  - **Folder defaults** — `defaults.md` inheritance for shared provider, model, metadata, and system instructions
137
137
  - **Overrides** — Environment and tier-based overrides (base → env → tier → runtime)
138
- - **4 provider adapters** — OpenAI, Anthropic, Gemini, OpenRouter — body-only output
138
+ - **5 provider adapters** — OpenAI (Chat), OpenAI (Responses), Anthropic, Gemini, OpenRouter — body-only output
139
+ - **Provider-aware input caching controls** — optional `cache` front matter maps to OpenAI prompt cache hints, Anthropic `cache_control`, and Gemini `cachedContent`
139
140
  - **Validation** — Zod schema validation, Levenshtein-based "did you mean?" for typos, variable usage checks
140
141
  - **Context hardening** — structured regexes with flags, `/pattern/i` convenience syntax, and built-in `non_empty` / `reject_secrets` validators
141
142
  - **Optional short-circuit messages** — validators can return a structured `returnMessage` instead of throwing when configured
@@ -193,6 +194,7 @@ Provider adapters are also available as direct imports:
193
194
 
194
195
  ```typescript
195
196
  import { openaiAdapter } from 'promptopskit/openai';
197
+ import { openaiResponsesAdapter } from 'promptopskit/openai-responses';
196
198
  import { anthropicAdapter } from 'promptopskit/anthropic';
197
199
  import { geminiAdapter } from 'promptopskit/gemini';
198
200
  import { openrouterAdapter } from 'promptopskit/openrouter';
@@ -501,7 +503,7 @@ Renders a prompt for a specific provider. Returns `{ resolved, request?, returnM
501
503
  |--------|------|-------------|
502
504
  | `path` | `string` | Prompt path (no extension), e.g. `'support/reply'` |
503
505
  | `source` | `string` | Inline prompt source (alternative to path) |
504
- | `provider` | `string` | `'openai'`, `'anthropic'`, `'gemini'`, `'openrouter'` |
506
+ | `provider` | `string` | `'openai'`, `'openai-responses'`, `'anthropic'`, `'gemini'`, `'openrouter'` |
505
507
  | `variables` | `Record<string, string>` | Template variables |
506
508
  | `onContextOverflow` | `(info) => string` | Optional callback to transform oversized context values before rendering |
507
509
  | `environment` | `string` | Environment override name |
@@ -509,6 +511,7 @@ Renders a prompt for a specific provider. Returns `{ resolved, request?, returnM
509
511
  | `history` | `Array<{ role, content }>` | Conversation history |
510
512
  | `toolRegistry` | `Record<string, unknown>` | Tool definitions for resolving string tool references |
511
513
  | `strict` | `boolean` | Fail on missing variables |
514
+ | `openaiResponses` | `object` | Optional Responses API extras (`previous_response_id`, `conversation`, `instructions`, `parallel_tool_calls`, `max_tool_calls`, `store`, `metadata`, `include`, `background`) |
512
515
 
513
516
  ### `kit.loadPrompt(path)` / `kit.resolvePrompt(path, options)` / `kit.validatePrompt(path)`
514
517
 
@@ -528,7 +531,7 @@ Prompt files use YAML front matter with these fields:
528
531
  |-------|------|-------------|
529
532
  | `id` | `string` | Unique prompt identifier (required) |
530
533
  | `schema_version` | `number` | Schema version, currently `1` |
531
- | `provider` | `string` | `openai`, `anthropic`, `gemini` (or `google`), `openrouter`, `any` |
534
+ | `provider` | `string` | `openai`, `openai-responses`, `anthropic`, `gemini` (or `google`), `openrouter`, `any` |
532
535
  | `model` | `string` | Model name |
533
536
  | `fallback_models` | `string[]` | Fallback model list |
534
537
  | `reasoning` | `object` | `{ effort, budget_tokens }` |
@@ -27,7 +27,47 @@ var SamplingSchema = z.object({
27
27
  });
28
28
  var ResponseSchema = z.object({
29
29
  format: z.enum(["text", "json", "markdown"]).optional(),
30
- stream: z.boolean().optional()
30
+ stream: z.boolean().optional(),
31
+ schema: z.record(z.unknown()).optional(),
32
+ schema_name: z.string().optional(),
33
+ schema_strict: z.boolean().optional()
34
+ });
35
+ var AnthropicProviderOptionsSchema = z.object({
36
+ top_k: z.number().int().min(0).optional(),
37
+ tool_choice: z.record(z.unknown()).optional()
38
+ });
39
+ var GeminiProviderOptionsSchema = z.object({
40
+ candidate_count: z.number().int().positive().optional(),
41
+ top_k: z.number().int().min(0).optional(),
42
+ seed: z.number().int().optional(),
43
+ response_schema: z.record(z.unknown()).optional(),
44
+ response_modalities: z.array(z.string()).optional(),
45
+ thinking_budget_tokens: z.number().int().positive().optional()
46
+ });
47
+ var ProviderOptionsSchema = z.object({
48
+ anthropic: AnthropicProviderOptionsSchema.optional(),
49
+ gemini: GeminiProviderOptionsSchema.optional()
50
+ });
51
+ var OpenAICacheSchema = z.object({
52
+ prompt_cache_key: z.string().min(1).optional(),
53
+ retention: z.enum(["in_memory", "24h"]).optional()
54
+ });
55
+ var AnthropicCacheSchema = z.object({
56
+ mode: z.enum(["automatic", "explicit"]).optional(),
57
+ type: z.literal("ephemeral").optional(),
58
+ ttl: z.enum(["5m", "1h"]).optional(),
59
+ cache_system_instructions: z.boolean().optional(),
60
+ cache_tools: z.boolean().optional(),
61
+ cache_prompt_template: z.boolean().optional()
62
+ });
63
+ var GeminiCacheSchema = z.object({
64
+ cached_content: z.string().min(1).optional()
65
+ });
66
+ var CacheSchema = z.object({
67
+ openai: OpenAICacheSchema.optional(),
68
+ anthropic: AnthropicCacheSchema.optional(),
69
+ gemini: GeminiCacheSchema.optional(),
70
+ google: GeminiCacheSchema.optional()
31
71
  });
32
72
  var HistorySchema = z.object({
33
73
  max_items: z.number().int().positive().optional()
@@ -78,7 +118,9 @@ var PromptAssetOverridesSchema = z.object({
78
118
  reasoning: ReasoningSchema.optional(),
79
119
  sampling: SamplingSchema.optional(),
80
120
  response: ResponseSchema.optional(),
81
- tools: z.array(ToolRefSchema).optional()
121
+ cache: CacheSchema.optional(),
122
+ tools: z.array(ToolRefSchema).optional(),
123
+ provider_options: ProviderOptionsSchema.optional()
82
124
  });
83
125
  var SourceSchema = z.object({
84
126
  file_path: z.string().optional(),
@@ -90,8 +132,9 @@ var SectionsSchema = z.object({
90
132
  notes: z.string().optional()
91
133
  });
92
134
  var PromptDefaultsSchema = z.object({
93
- provider: z.enum(["openai", "anthropic", "google", "gemini", "openrouter", "any"]).optional(),
135
+ provider: z.enum(["openai", "openai-responses", "anthropic", "google", "gemini", "openrouter", "any"]).optional(),
94
136
  model: z.string().optional(),
137
+ cache: CacheSchema.optional(),
95
138
  metadata: MetadataSchema.optional(),
96
139
  sections: z.object({
97
140
  system_instructions: z.string().optional()
@@ -101,13 +144,15 @@ var PromptAssetSchema = z.object({
101
144
  id: z.string(),
102
145
  schema_version: z.number().int().positive().default(1),
103
146
  description: z.string().optional(),
104
- provider: z.enum(["openai", "anthropic", "google", "gemini", "openrouter", "any"]).optional(),
147
+ provider: z.enum(["openai", "openai-responses", "anthropic", "google", "gemini", "openrouter", "any"]).optional(),
105
148
  model: z.string().optional(),
106
149
  fallback_models: z.array(z.string()).optional(),
107
150
  reasoning: ReasoningSchema.optional(),
108
151
  sampling: SamplingSchema.optional(),
109
152
  response: ResponseSchema.optional(),
153
+ cache: CacheSchema.optional(),
110
154
  tools: z.array(ToolRefSchema).optional(),
155
+ provider_options: ProviderOptionsSchema.optional(),
111
156
  mcp: MCPSchema.optional(),
112
157
  context: ContextSchema.optional(),
113
158
  includes: z.array(z.string()).optional(),
@@ -277,4 +322,4 @@ export {
277
322
  parsePrompt,
278
323
  loadPromptFile
279
324
  };
280
- //# sourceMappingURL=chunk-5OYWNRNC.js.map
325
+ //# sourceMappingURL=chunk-4LEPCCSA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/schema/schema.ts","../src/parser/sections.ts","../src/parser/parser.ts","../src/parser/loader.ts"],"sourcesContent":["import { z } from 'zod';\n\n// --- Tool definitions ---\n\nexport const InlineToolDefSchema = z.object({\n name: z.string(),\n description: z.string().optional(),\n input_schema: z.record(z.unknown()).optional(),\n});\n\nexport type InlineToolDef = z.infer<typeof InlineToolDefSchema>;\n\nexport const ToolRefSchema = z.union([z.string(), InlineToolDefSchema]);\n\n// --- MCP ---\n\nexport const MCPServerRefSchema = z.union([\n z.string(),\n z.object({\n name: z.string(),\n config: z.record(z.unknown()).optional(),\n }),\n]);\n\nexport type MCPServerRef = z.infer<typeof MCPServerRefSchema>;\n\n// --- Reasoning ---\n\nexport const ReasoningSchema = z.object({\n effort: z.enum(['low', 'medium', 'high']).optional(),\n budget_tokens: z.number().int().positive().optional(),\n});\n\n// --- Sampling ---\n\nexport const SamplingSchema = z.object({\n temperature: z.number().min(0).max(2).optional(),\n top_p: z.number().min(0).max(1).optional(),\n frequency_penalty: z.number().optional(),\n presence_penalty: z.number().optional(),\n stop: z.array(z.string()).optional(),\n max_output_tokens: z.number().int().positive().optional(),\n});\n\n// --- Response ---\n\nexport const ResponseSchema = z.object({\n format: z.enum(['text', 'json', 'markdown']).optional(),\n stream: z.boolean().optional(),\n schema: z.record(z.unknown()).optional(),\n schema_name: z.string().optional(),\n schema_strict: z.boolean().optional(),\n});\n\n\n// --- Provider-specific options ---\n\nexport const AnthropicProviderOptionsSchema = z.object({\n top_k: z.number().int().min(0).optional(),\n tool_choice: z.record(z.unknown()).optional(),\n});\n\nexport const GeminiProviderOptionsSchema = z.object({\n candidate_count: z.number().int().positive().optional(),\n top_k: z.number().int().min(0).optional(),\n seed: z.number().int().optional(),\n response_schema: z.record(z.unknown()).optional(),\n response_modalities: z.array(z.string()).optional(),\n thinking_budget_tokens: z.number().int().positive().optional(),\n});\n\nexport const ProviderOptionsSchema = z.object({\n anthropic: AnthropicProviderOptionsSchema.optional(),\n gemini: GeminiProviderOptionsSchema.optional(),\n});\n\n// --- Cache controls ---\n\nexport const OpenAICacheSchema = z.object({\n prompt_cache_key: z.string().min(1).optional(),\n retention: z.enum(['in_memory', '24h']).optional(),\n});\n\nexport const AnthropicCacheSchema = z.object({\n mode: z.enum(['automatic', 'explicit']).optional(),\n type: z.literal('ephemeral').optional(),\n ttl: z.enum(['5m', '1h']).optional(),\n cache_system_instructions: z.boolean().optional(),\n cache_tools: z.boolean().optional(),\n cache_prompt_template: z.boolean().optional(),\n});\n\nexport const GeminiCacheSchema = z.object({\n cached_content: z.string().min(1).optional(),\n});\n\nexport const CacheSchema = z.object({\n openai: OpenAICacheSchema.optional(),\n anthropic: AnthropicCacheSchema.optional(),\n gemini: GeminiCacheSchema.optional(),\n google: GeminiCacheSchema.optional(),\n});\n\n// --- Context ---\n\nexport const HistorySchema = z.object({\n max_items: z.number().int().positive().optional(),\n});\n\nexport const ContextRegexSchema = z.union([\n z.string(),\n z.object({\n pattern: z.string(),\n flags: z.string().optional(),\n return_message: z.string().optional(),\n }),\n]);\n\nexport const ContextBuiltInValidatorSchema = z.union([\n z.boolean(),\n z.object({\n return_message: z.string().optional(),\n }),\n]);\n\nexport const ContextInputDefinitionObjectSchema = z.object({\n name: z.string(),\n max_size: z.number().int().positive().optional(),\n trim: z.union([z.boolean(), z.enum(['start', 'end', 'both'])]).optional(),\n allow_regex: ContextRegexSchema.optional(),\n deny_regex: ContextRegexSchema.optional(),\n non_empty: ContextBuiltInValidatorSchema.optional(),\n reject_secrets: ContextBuiltInValidatorSchema.optional(),\n});\n\nexport const ContextInputDefinitionSchema = z.union([\n z.string(),\n ContextInputDefinitionObjectSchema,\n]);\n\nexport type ContextInputDefinition = z.infer<typeof ContextInputDefinitionSchema>;\nexport type ContextRegexDefinition = z.infer<typeof ContextRegexSchema>;\nexport type ContextBuiltInValidatorDefinition = z.infer<typeof ContextBuiltInValidatorSchema>;\n\nexport const ContextSchema = z.object({\n inputs: z.array(ContextInputDefinitionSchema).optional(),\n history: HistorySchema.optional(),\n});\n\n// --- Metadata ---\n\nexport const MetadataSchema = z.object({\n owner: z.string().optional(),\n tags: z.array(z.string()).optional(),\n review_required: z.boolean().optional(),\n stable: z.boolean().optional(),\n});\n\n// --- MCP block ---\n\nexport const MCPSchema = z.object({\n servers: z.array(MCPServerRefSchema).optional(),\n});\n\n// --- Overrides (subset allowed in environments/tiers) ---\n\nexport const PromptAssetOverridesSchema = z.object({\n model: z.string().optional(),\n fallback_models: z.array(z.string()).optional(),\n reasoning: ReasoningSchema.optional(),\n sampling: SamplingSchema.optional(),\n response: ResponseSchema.optional(),\n cache: CacheSchema.optional(),\n tools: z.array(ToolRefSchema).optional(),\n provider_options: ProviderOptionsSchema.optional(),\n});\n\nexport type PromptAssetOverrides = z.infer<typeof PromptAssetOverridesSchema>;\n\n// --- Source tracking ---\n\nexport const SourceSchema = z.object({\n file_path: z.string().optional(),\n checksum: z.string().optional(),\n});\n\n// --- Sections (populated by parser) ---\n\nexport const SectionsSchema = z.object({\n system_instructions: z.string().optional(),\n prompt_template: z.string().optional(),\n notes: z.string().optional(),\n});\n\n// --- Defaults files (folder-level inheritance) ---\n\nexport const PromptDefaultsSchema = z.object({\n provider: z.enum(['openai', 'openai-responses', 'anthropic', 'google', 'gemini', 'openrouter', 'any']).optional(),\n model: z.string().optional(),\n cache: CacheSchema.optional(),\n metadata: MetadataSchema.optional(),\n sections: z.object({\n system_instructions: z.string().optional(),\n }).optional(),\n});\n\nexport type PromptDefaults = z.infer<typeof PromptDefaultsSchema>;\n\n// --- Top-level PromptAsset ---\n\nexport const PromptAssetSchema = z.object({\n id: z.string(),\n schema_version: z.number().int().positive().default(1),\n description: z.string().optional(),\n\n provider: z.enum(['openai', 'openai-responses', 'anthropic', 'google', 'gemini', 'openrouter', 'any']).optional(),\n model: z.string().optional(),\n fallback_models: z.array(z.string()).optional(),\n\n reasoning: ReasoningSchema.optional(),\n sampling: SamplingSchema.optional(),\n response: ResponseSchema.optional(),\n cache: CacheSchema.optional(),\n\n tools: z.array(ToolRefSchema).optional(),\n provider_options: ProviderOptionsSchema.optional(),\n mcp: MCPSchema.optional(),\n\n context: ContextSchema.optional(),\n\n includes: z.array(z.string()).optional(),\n\n environments: z.record(PromptAssetOverridesSchema).optional(),\n tiers: z.record(PromptAssetOverridesSchema).optional(),\n\n metadata: MetadataSchema.optional(),\n\n // Populated by parser, not authored in YAML\n sections: SectionsSchema.optional(),\n source: SourceSchema.optional(),\n});\n\nexport type PromptAsset = z.infer<typeof PromptAssetSchema>;\n\n// --- Resolved asset (after includes, overrides applied) ---\n\nexport interface ResolvedPromptAsset extends PromptAsset {\n sections: {\n system_instructions?: string;\n prompt_template?: string;\n notes?: string;\n };\n source: {\n file_path?: string;\n checksum?: string;\n };\n}\n","export interface Sections {\n system_instructions?: string;\n prompt_template?: string;\n notes?: string;\n}\n\nconst SECTION_MAP: Record<string, keyof Sections> = {\n 'system instructions': 'system_instructions',\n 'prompt template': 'prompt_template',\n 'notes': 'notes',\n};\n\n/**\n * Extract named sections from the markdown body using H1 headings.\n * Case-insensitive. H2+ within a section is treated as content.\n * If no H1 headings are found, the entire body is treated as prompt_template.\n */\nexport function extractSections(body: string): Sections {\n const lines = body.split(/\\r?\\n/);\n const sections: Sections = {};\n\n let currentKey: keyof Sections | null = null;\n let currentLines: string[] = [];\n let foundAnyH1 = false;\n\n for (const line of lines) {\n const h1Match = line.match(/^#\\s+(.+)$/);\n if (h1Match) {\n // Flush previous section\n if (currentKey) {\n sections[currentKey] = currentLines.join('\\n').trim();\n }\n\n foundAnyH1 = true;\n const heading = h1Match[1].trim().toLowerCase();\n currentKey = SECTION_MAP[heading] ?? null;\n currentLines = [];\n } else {\n currentLines.push(line);\n }\n }\n\n // Flush last section\n if (currentKey) {\n sections[currentKey] = currentLines.join('\\n').trim();\n }\n\n // If no H1 headings found, treat entire body as prompt_template\n if (!foundAnyH1) {\n const trimmed = body.trim();\n if (trimmed) {\n sections.prompt_template = trimmed;\n }\n }\n\n return sections;\n}\n","import matter from 'gray-matter';\nimport { PromptAssetSchema } from '../schema/index.js';\nimport type { PromptAsset } from '../schema/index.js';\nimport { extractSections } from './sections.js';\n\nexport interface ParseResult {\n asset: PromptAsset;\n raw: {\n frontMatter: Record<string, unknown>;\n body: string;\n };\n}\n\n/**\n * Parse a prompt markdown string (YAML front matter + markdown body)\n * into a validated PromptAsset.\n */\nexport function parsePrompt(content: string, filePath?: string): ParseResult {\n const { data: frontMatter, content: body } = matter(content);\n\n const sections = extractSections(body);\n\n const raw = {\n ...frontMatter,\n sections,\n source: filePath ? { file_path: filePath } : undefined,\n };\n\n const asset = PromptAssetSchema.parse(raw);\n\n return {\n asset,\n raw: {\n frontMatter: frontMatter as Record<string, unknown>,\n body,\n },\n };\n}\n","import { readFile } from 'node:fs/promises';\nimport { dirname, join, resolve } from 'node:path';\nimport matter from 'gray-matter';\nimport { parsePrompt } from './parser.js';\nimport type { ParseResult } from './parser.js';\nimport { extractSections } from './sections.js';\nimport { PromptDefaultsSchema } from '../schema/index.js';\nimport type { PromptDefaults } from '../schema/index.js';\n\nconst DEFAULTS_FILE_NAME = 'defaults.md';\n\nexport interface LoadPromptOptions {\n /**\n * Optional boundary directory for defaults discovery.\n * If provided, defaults are loaded from this directory down to the prompt directory.\n */\n defaultsRoot?: string;\n}\n\n/**\n * Load and parse a prompt file from disk.\n */\nexport async function loadPromptFile(filePath: string, options: LoadPromptOptions = {}): Promise<ParseResult> {\n const content = await readFile(filePath, 'utf-8');\n const parsed = parsePrompt(content, filePath);\n // Default the boundary to the file's own directory so traversal never\n // walks above the prompt tree when no explicit root is provided.\n const root = options.defaultsRoot ?? dirname(filePath);\n const defaults = await loadDefaultsForPath(filePath, root);\n const asset = applyDefaults(parsed.asset, defaults);\n\n return {\n ...parsed,\n asset,\n };\n}\n\nasync function loadDefaultsForPath(filePath: string, defaultsRoot?: string): Promise<PromptDefaults> {\n const directories = getDirectoriesToCheck(filePath, defaultsRoot);\n let merged: PromptDefaults = {};\n\n for (const dir of directories) {\n const defaultsPath = join(dir, DEFAULTS_FILE_NAME);\n try {\n const defaultsContent = await readFile(defaultsPath, 'utf-8');\n const defaults = parseDefaults(defaultsContent);\n merged = mergeDefaults(merged, defaults);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error;\n }\n }\n }\n\n return merged;\n}\n\nfunction getDirectoriesToCheck(filePath: string, defaultsRoot?: string): string[] {\n const dirs: string[] = [];\n let current = resolve(dirname(filePath));\n const boundary = defaultsRoot ? resolve(defaultsRoot) : undefined;\n\n while (true) {\n dirs.unshift(current);\n if ((boundary && current === boundary) || current === dirname(current)) {\n break;\n }\n current = dirname(current);\n }\n\n return dirs;\n}\n\nfunction parseDefaults(content: string): PromptDefaults {\n const { data: frontMatter, content: body } = matter(content);\n const sections = extractSections(body);\n\n return PromptDefaultsSchema.parse({\n ...frontMatter,\n sections: {\n system_instructions: sections.system_instructions,\n },\n });\n}\n\nfunction mergeDefaults(base: PromptDefaults, local: PromptDefaults): PromptDefaults {\n return {\n provider: local.provider ?? base.provider,\n model: local.model ?? base.model,\n metadata: {\n ...(base.metadata ?? {}),\n ...(local.metadata ?? {}),\n },\n sections: {\n ...(base.sections ?? {}),\n ...(local.sections ?? {}),\n },\n };\n}\n\nfunction applyDefaults(asset: ParseResult['asset'], defaults: PromptDefaults): ParseResult['asset'] {\n const hasDefaultMetadata = defaults.metadata && Object.keys(defaults.metadata).length > 0;\n const hasDefaultSystem = !!defaults.sections?.system_instructions;\n const hasDefaultScalars = defaults.provider !== undefined\n || defaults.model !== undefined;\n\n // Short-circuit: nothing to merge\n if (!hasDefaultMetadata && !hasDefaultSystem && !hasDefaultScalars) {\n return asset;\n }\n\n const mergedMetadata = {\n ...(defaults.metadata ?? {}),\n ...(asset.metadata ?? {}),\n };\n const metadata = Object.keys(mergedMetadata).length > 0 ? mergedMetadata : undefined;\n\n const systemInstructions = asset.sections?.system_instructions ?? defaults.sections?.system_instructions;\n\n const sections = asset.sections\n ? { ...asset.sections, system_instructions: systemInstructions }\n : systemInstructions\n ? { system_instructions: systemInstructions }\n : undefined;\n\n return {\n ...asset,\n provider: asset.provider ?? defaults.provider,\n model: asset.model ?? defaults.model,\n metadata,\n sections,\n };\n}\n"],"mappings":"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","names":["matter","matter"]}
@@ -2,7 +2,7 @@ import {
2
2
  renderSections,
3
3
  resolveAssetForProvider,
4
4
  withPromptInputSupport
5
- } from "./chunk-X73VG645.js";
5
+ } from "./chunk-V7QY7MRM.js";
6
6
 
7
7
  // src/providers/gemini.ts
8
8
  var geminiAdapter = withPromptInputSupport({
@@ -11,6 +11,8 @@ var geminiAdapter = withPromptInputSupport({
11
11
  const resolvedAsset = resolveAssetForProvider(asset, runtime);
12
12
  const errors = [];
13
13
  const warnings = [];
14
+ const geminiCache = resolvedAsset.cache?.gemini?.cached_content;
15
+ const googleCache = resolvedAsset.cache?.google?.cached_content;
14
16
  if (!resolvedAsset.model) {
15
17
  errors.push("Gemini adapter requires a model to be specified.");
16
18
  }
@@ -20,6 +22,12 @@ var geminiAdapter = withPromptInputSupport({
20
22
  if (resolvedAsset.sampling?.presence_penalty !== void 0) {
21
23
  warnings.push("Gemini does not support presence_penalty. It will be ignored.");
22
24
  }
25
+ if (geminiCache && googleCache && geminiCache !== googleCache) {
26
+ warnings.push("Both cache.gemini.cached_content and cache.google.cached_content are set. Gemini uses cache.gemini.cached_content.");
27
+ }
28
+ if (resolvedAsset.response?.stream !== void 0) {
29
+ warnings.push("Gemini streaming is endpoint-based (streamGenerateContent), not body-based. response.stream will be ignored.");
30
+ }
23
31
  return { valid: errors.length === 0, errors, warnings };
24
32
  },
25
33
  render(asset, runtime) {
@@ -46,20 +54,32 @@ var geminiAdapter = withPromptInputSupport({
46
54
  const body = {
47
55
  contents
48
56
  };
57
+ const geminiCacheConfig = resolvedAsset.cache?.gemini ?? resolvedAsset.cache?.google;
49
58
  if (sections.system_instructions) {
50
59
  body.systemInstruction = {
51
60
  parts: [{ text: sections.system_instructions }]
52
61
  };
53
62
  }
54
63
  const generationConfig = {};
64
+ const geminiOptions = resolvedAsset.provider_options?.gemini;
55
65
  if (resolvedAsset.sampling?.temperature !== void 0) generationConfig.temperature = resolvedAsset.sampling.temperature;
56
66
  if (resolvedAsset.sampling?.top_p !== void 0) generationConfig.topP = resolvedAsset.sampling.top_p;
57
67
  if (resolvedAsset.sampling?.max_output_tokens !== void 0) generationConfig.maxOutputTokens = resolvedAsset.sampling.max_output_tokens;
58
68
  if (resolvedAsset.sampling?.stop !== void 0) generationConfig.stopSequences = resolvedAsset.sampling.stop;
69
+ if (geminiOptions?.candidate_count !== void 0) generationConfig.candidateCount = geminiOptions.candidate_count;
70
+ if (geminiOptions?.top_k !== void 0) generationConfig.topK = geminiOptions.top_k;
71
+ if (geminiOptions?.seed !== void 0) generationConfig.seed = geminiOptions.seed;
72
+ if (geminiOptions?.response_schema !== void 0) generationConfig.responseSchema = geminiOptions.response_schema;
73
+ if (geminiOptions?.response_modalities !== void 0) generationConfig.responseModalities = geminiOptions.response_modalities;
74
+ if (resolvedAsset.response?.schema !== void 0) generationConfig.responseSchema = resolvedAsset.response.schema;
59
75
  if (resolvedAsset.response?.format === "json") {
60
76
  generationConfig.responseMimeType = "application/json";
61
77
  }
62
- if (resolvedAsset.reasoning?.effort) {
78
+ if (geminiOptions?.thinking_budget_tokens !== void 0) {
79
+ body.thinkingConfig = {
80
+ thinkingBudget: geminiOptions.thinking_budget_tokens
81
+ };
82
+ } else if (resolvedAsset.reasoning?.effort) {
63
83
  body.thinkingConfig = {
64
84
  thinkingBudget: resolvedAsset.reasoning.effort === "high" ? 8192 : resolvedAsset.reasoning.effort === "medium" ? 4096 : 1024
65
85
  };
@@ -67,6 +87,9 @@ var geminiAdapter = withPromptInputSupport({
67
87
  if (Object.keys(generationConfig).length > 0) {
68
88
  body.generationConfig = generationConfig;
69
89
  }
90
+ if (geminiCacheConfig?.cached_content) {
91
+ body.cachedContent = geminiCacheConfig.cached_content;
92
+ }
70
93
  if (resolvedAsset.tools && resolvedAsset.tools.length > 0) {
71
94
  const functionDeclarations = resolvedAsset.tools.map((tool) => {
72
95
  if (typeof tool === "string") {
@@ -93,4 +116,4 @@ var geminiAdapter = withPromptInputSupport({
93
116
  export {
94
117
  geminiAdapter
95
118
  };
96
- //# sourceMappingURL=chunk-E6NPZOJL.js.map
119
+ //# sourceMappingURL=chunk-AN3OR7YC.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';\nimport { withPromptInputSupport } from './prompt-input.js';\n\n/**\n * Google Gemini provider adapter.\n * Produces request bodies compatible with the Gemini generateContent API.\n */\nexport const geminiAdapter: ProviderAdapter = withPromptInputSupport({\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 const geminiCache = resolvedAsset.cache?.gemini?.cached_content;\n const googleCache = resolvedAsset.cache?.google?.cached_content;\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 if (geminiCache && googleCache && geminiCache !== googleCache) {\n warnings.push('Both cache.gemini.cached_content and cache.google.cached_content are set. Gemini uses cache.gemini.cached_content.');\n }\n if (resolvedAsset.response?.stream !== undefined) {\n warnings.push('Gemini streaming is endpoint-based (streamGenerateContent), not body-based. response.stream 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 const geminiCacheConfig = resolvedAsset.cache?.gemini ?? resolvedAsset.cache?.google;\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 const geminiOptions = resolvedAsset.provider_options?.gemini;\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 (geminiOptions?.candidate_count !== undefined) generationConfig.candidateCount = geminiOptions.candidate_count;\n if (geminiOptions?.top_k !== undefined) generationConfig.topK = geminiOptions.top_k;\n if (geminiOptions?.seed !== undefined) generationConfig.seed = geminiOptions.seed;\n if (geminiOptions?.response_schema !== undefined) generationConfig.responseSchema = geminiOptions.response_schema;\n if (geminiOptions?.response_modalities !== undefined) generationConfig.responseModalities = geminiOptions.response_modalities;\n\n if (resolvedAsset.response?.schema !== undefined) generationConfig.responseSchema = resolvedAsset.response.schema;\n\n if (resolvedAsset.response?.format === 'json') {\n generationConfig.responseMimeType = 'application/json';\n }\n\n // Thinking config\n if (geminiOptions?.thinking_budget_tokens !== undefined) {\n body.thinkingConfig = {\n thinkingBudget: geminiOptions.thinking_budget_tokens,\n };\n } else 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 if (geminiCacheConfig?.cached_content) {\n body.cachedContent = geminiCacheConfig.cached_content;\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":"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","names":[]}
@@ -2,7 +2,7 @@ import {
2
2
  renderSections,
3
3
  resolveAssetForProvider,
4
4
  withPromptInputSupport
5
- } from "./chunk-X73VG645.js";
5
+ } from "./chunk-V7QY7MRM.js";
6
6
 
7
7
  // src/providers/openai.ts
8
8
  var openaiAdapter = withPromptInputSupport({
@@ -17,6 +17,9 @@ var openaiAdapter = withPromptInputSupport({
17
17
  if (resolvedAsset.reasoning?.budget_tokens !== void 0) {
18
18
  warnings.push("OpenAI uses reasoning_effort, not budget_tokens. budget_tokens will be ignored.");
19
19
  }
20
+ if (resolvedAsset.response?.schema !== void 0 && resolvedAsset.response?.format !== "json") {
21
+ warnings.push("OpenAI response.schema requires response.format: json. schema will still be applied as JSON schema output.");
22
+ }
20
23
  return { valid: errors.length === 0, errors, warnings };
21
24
  },
22
25
  render(asset, runtime) {
@@ -41,6 +44,7 @@ var openaiAdapter = withPromptInputSupport({
41
44
  model: resolvedAsset.model,
42
45
  messages
43
46
  };
47
+ const openaiCacheConfig = resolvedAsset.cache?.openai;
44
48
  if (resolvedAsset.sampling?.temperature !== void 0) body.temperature = resolvedAsset.sampling.temperature;
45
49
  if (resolvedAsset.sampling?.top_p !== void 0) body.top_p = resolvedAsset.sampling.top_p;
46
50
  if (resolvedAsset.sampling?.frequency_penalty !== void 0) body.frequency_penalty = resolvedAsset.sampling.frequency_penalty;
@@ -50,12 +54,27 @@ var openaiAdapter = withPromptInputSupport({
50
54
  if (resolvedAsset.reasoning?.effort) {
51
55
  body.reasoning_effort = resolvedAsset.reasoning.effort;
52
56
  }
53
- if (resolvedAsset.response?.format === "json") {
57
+ if (resolvedAsset.response?.schema) {
58
+ body.response_format = {
59
+ type: "json_schema",
60
+ json_schema: {
61
+ name: resolvedAsset.response.schema_name ?? `${resolvedAsset.id}_response`,
62
+ schema: resolvedAsset.response.schema,
63
+ strict: resolvedAsset.response.schema_strict ?? true
64
+ }
65
+ };
66
+ } else if (resolvedAsset.response?.format === "json") {
54
67
  body.response_format = { type: "json_object" };
55
68
  }
56
69
  if (resolvedAsset.response?.stream !== void 0) {
57
70
  body.stream = resolvedAsset.response.stream;
58
71
  }
72
+ if (openaiCacheConfig?.prompt_cache_key) {
73
+ body.prompt_cache_key = openaiCacheConfig.prompt_cache_key;
74
+ }
75
+ if (openaiCacheConfig?.retention) {
76
+ body.prompt_cache_retention = openaiCacheConfig.retention;
77
+ }
59
78
  if (resolvedAsset.tools && resolvedAsset.tools.length > 0) {
60
79
  body.tools = resolvedAsset.tools.map((tool) => {
61
80
  if (typeof tool === "string") {
@@ -84,4 +103,4 @@ var openaiAdapter = withPromptInputSupport({
84
103
  export {
85
104
  openaiAdapter
86
105
  };
87
- //# sourceMappingURL=chunk-UJU5XERR.js.map
106
+ //# sourceMappingURL=chunk-LMURMZUA.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';\nimport { withPromptInputSupport } from './prompt-input.js';\n\n/**\n * OpenAI provider adapter.\n * Produces request bodies compatible with the OpenAI Chat Completions API.\n */\nexport const openaiAdapter: ProviderAdapter = withPromptInputSupport({\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 if (resolvedAsset.response?.schema !== undefined && resolvedAsset.response?.format !== 'json') {\n warnings.push('OpenAI response.schema requires response.format: json. schema will still be applied as JSON schema output.');\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 const openaiCacheConfig = resolvedAsset.cache?.openai;\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?.schema) {\n body.response_format = {\n type: 'json_schema',\n json_schema: {\n name: resolvedAsset.response.schema_name ?? `${resolvedAsset.id}_response`,\n schema: resolvedAsset.response.schema,\n strict: resolvedAsset.response.schema_strict ?? true,\n },\n };\n } else 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 if (openaiCacheConfig?.prompt_cache_key) {\n body.prompt_cache_key = openaiCacheConfig.prompt_cache_key;\n }\n if (openaiCacheConfig?.retention) {\n body.prompt_cache_retention = openaiCacheConfig.retention;\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":"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","names":[]}
@@ -2,7 +2,7 @@ import {
2
2
  renderSections,
3
3
  resolveAssetForProvider,
4
4
  withPromptInputSupport
5
- } from "./chunk-X73VG645.js";
5
+ } from "./chunk-V7QY7MRM.js";
6
6
 
7
7
  // src/providers/anthropic.ts
8
8
  var anthropicAdapter = withPromptInputSupport({
@@ -23,6 +23,12 @@ var anthropicAdapter = withPromptInputSupport({
23
23
  if (resolvedAsset.reasoning?.effort !== void 0) {
24
24
  warnings.push("Anthropic uses budget_tokens for thinking, not effort. effort will be mapped approximately.");
25
25
  }
26
+ if (resolvedAsset.response?.schema !== void 0) {
27
+ warnings.push("Anthropic does not support response.schema structured output in this adapter. It will be ignored.");
28
+ }
29
+ if (resolvedAsset.provider_options?.anthropic?.top_k !== void 0 && resolvedAsset.provider_options.anthropic.top_k < 0) {
30
+ errors.push("Anthropic provider_options.top_k must be >= 0.");
31
+ }
26
32
  return { valid: errors.length === 0, errors, warnings };
27
33
  },
28
34
  render(asset, runtime) {
@@ -32,20 +38,38 @@ var anthropicAdapter = withPromptInputSupport({
32
38
  strict: runtime.strict
33
39
  });
34
40
  const messages = [];
41
+ const anthropicCacheConfig = resolvedAsset.cache?.anthropic;
42
+ const cacheType = anthropicCacheConfig?.type ?? "ephemeral";
43
+ const cacheControl = anthropicCacheConfig ? {
44
+ type: cacheType,
45
+ ...anthropicCacheConfig.ttl ? { ttl: anthropicCacheConfig.ttl } : {}
46
+ } : void 0;
47
+ const cacheMode = anthropicCacheConfig?.mode ?? "automatic";
35
48
  if (runtime.history) {
36
49
  for (const msg of runtime.history) {
37
50
  messages.push({ role: msg.role, content: msg.content });
38
51
  }
39
52
  }
40
53
  if (sections.prompt_template) {
41
- messages.push({ role: "user", content: sections.prompt_template });
54
+ if (cacheControl && cacheMode === "explicit" && anthropicCacheConfig?.cache_prompt_template) {
55
+ messages.push({
56
+ role: "user",
57
+ content: [{ type: "text", text: sections.prompt_template, cache_control: cacheControl }]
58
+ });
59
+ } else {
60
+ messages.push({ role: "user", content: sections.prompt_template });
61
+ }
42
62
  }
43
63
  const body = {
44
64
  model: resolvedAsset.model,
45
65
  messages
46
66
  };
47
67
  if (sections.system_instructions) {
48
- body.system = sections.system_instructions;
68
+ if (cacheControl && cacheMode === "explicit" && anthropicCacheConfig?.cache_system_instructions !== false) {
69
+ body.system = [{ type: "text", text: sections.system_instructions, cache_control: cacheControl }];
70
+ } else {
71
+ body.system = sections.system_instructions;
72
+ }
49
73
  }
50
74
  if (resolvedAsset.sampling?.temperature !== void 0) body.temperature = resolvedAsset.sampling.temperature;
51
75
  if (resolvedAsset.sampling?.top_p !== void 0) body.top_p = resolvedAsset.sampling.top_p;
@@ -61,23 +85,41 @@ var anthropicAdapter = withPromptInputSupport({
61
85
  budget_tokens: resolvedAsset.reasoning.budget_tokens
62
86
  };
63
87
  }
88
+ if (resolvedAsset.provider_options?.anthropic?.top_k !== void 0) {
89
+ body.top_k = resolvedAsset.provider_options.anthropic.top_k;
90
+ }
64
91
  if (resolvedAsset.response?.stream !== void 0) {
65
92
  body.stream = resolvedAsset.response.stream;
66
93
  }
94
+ if (cacheControl && cacheMode === "automatic") {
95
+ body.cache_control = cacheControl;
96
+ }
67
97
  if (resolvedAsset.tools && resolvedAsset.tools.length > 0) {
68
98
  body.tools = resolvedAsset.tools.map((tool) => {
69
99
  if (typeof tool === "string") {
70
100
  const def = runtime.toolRegistry?.[tool];
71
- if (def) return def;
72
- return { name: tool };
101
+ if (def) {
102
+ if (cacheControl && cacheMode === "explicit" && anthropicCacheConfig?.cache_tools) {
103
+ return { ...def, cache_control: cacheControl };
104
+ }
105
+ return def;
106
+ }
107
+ return {
108
+ name: tool,
109
+ ...cacheControl && cacheMode === "explicit" && anthropicCacheConfig?.cache_tools ? { cache_control: cacheControl } : {}
110
+ };
73
111
  }
74
112
  return {
75
113
  name: tool.name,
76
114
  description: tool.description,
77
- input_schema: tool.input_schema ?? { type: "object", properties: {} }
115
+ input_schema: tool.input_schema ?? { type: "object", properties: {} },
116
+ ...cacheControl && cacheMode === "explicit" && anthropicCacheConfig?.cache_tools ? { cache_control: cacheControl } : {}
78
117
  };
79
118
  });
80
119
  }
120
+ if (resolvedAsset.provider_options?.anthropic?.tool_choice !== void 0) {
121
+ body.tool_choice = resolvedAsset.provider_options.anthropic.tool_choice;
122
+ }
81
123
  return {
82
124
  body,
83
125
  provider: "anthropic",
@@ -89,4 +131,4 @@ var anthropicAdapter = withPromptInputSupport({
89
131
  export {
90
132
  anthropicAdapter
91
133
  };
92
- //# sourceMappingURL=chunk-BBVVA27J.js.map
134
+ //# sourceMappingURL=chunk-O6RQZYS4.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';\nimport { withPromptInputSupport } from './prompt-input.js';\n\n/**\n * Anthropic provider adapter.\n * Produces request bodies compatible with the Anthropic Messages API.\n */\nexport const anthropicAdapter: ProviderAdapter = withPromptInputSupport({\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 if (resolvedAsset.response?.schema !== undefined) {\n warnings.push('Anthropic does not support response.schema structured output in this adapter. It will be ignored.');\n }\n\n if (resolvedAsset.provider_options?.anthropic?.top_k !== undefined && resolvedAsset.provider_options.anthropic.top_k < 0) {\n errors.push('Anthropic provider_options.top_k must be >= 0.');\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 const anthropicCacheConfig = resolvedAsset.cache?.anthropic;\n const cacheType = anthropicCacheConfig?.type ?? 'ephemeral';\n const cacheControl = anthropicCacheConfig\n ? {\n type: cacheType,\n ...(anthropicCacheConfig.ttl ? { ttl: anthropicCacheConfig.ttl } : {}),\n }\n : undefined;\n const cacheMode = anthropicCacheConfig?.mode ?? 'automatic';\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 if (cacheControl && cacheMode === 'explicit' && anthropicCacheConfig?.cache_prompt_template) {\n messages.push({\n role: 'user',\n content: [{ type: 'text', text: sections.prompt_template, cache_control: cacheControl }],\n });\n } else {\n messages.push({ role: 'user', content: sections.prompt_template });\n }\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 if (cacheControl && cacheMode === 'explicit' && anthropicCacheConfig?.cache_system_instructions !== false) {\n body.system = [{ type: 'text', text: sections.system_instructions, cache_control: cacheControl }];\n } else {\n body.system = sections.system_instructions;\n }\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 // Provider-specific options\n if (resolvedAsset.provider_options?.anthropic?.top_k !== undefined) {\n body.top_k = resolvedAsset.provider_options.anthropic.top_k;\n }\n\n // Streaming\n if (resolvedAsset.response?.stream !== undefined) {\n body.stream = resolvedAsset.response.stream;\n }\n\n if (cacheControl && cacheMode === 'automatic') {\n body.cache_control = cacheControl;\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) {\n if (cacheControl && cacheMode === 'explicit' && anthropicCacheConfig?.cache_tools) {\n return { ...(def as Record<string, unknown>), cache_control: cacheControl };\n }\n return def;\n }\n return {\n name: tool,\n ...(cacheControl && cacheMode === 'explicit' && anthropicCacheConfig?.cache_tools\n ? { cache_control: cacheControl }\n : {}),\n };\n }\n return {\n name: tool.name,\n description: tool.description,\n input_schema: tool.input_schema ?? { type: 'object', properties: {} },\n ...(cacheControl && cacheMode === 'explicit' && anthropicCacheConfig?.cache_tools\n ? { cache_control: cacheControl }\n : {}),\n };\n });\n }\n\n if (resolvedAsset.provider_options?.anthropic?.tool_choice !== undefined) {\n body.tool_choice = resolvedAsset.provider_options.anthropic.tool_choice;\n }\n\n return {\n body,\n provider: 'anthropic',\n model: resolvedAsset.model ?? 'unknown',\n };\n },\n});\n"],"mappings":"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","names":[]}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  loadPromptFile,
3
3
  parsePrompt
4
- } from "./chunk-5OYWNRNC.js";
4
+ } from "./chunk-4LEPCCSA.js";
5
5
 
6
6
  // src/renderer/interpolate.ts
7
7
  var VARIABLE_RE = /\{\{\s*([a-zA-Z_][a-zA-Z0-9_]*)\s*\}\}/g;
@@ -81,6 +81,20 @@ function mergeOverride(base, override) {
81
81
  if (override.response !== void 0) {
82
82
  result.response = { ...result.response, ...override.response };
83
83
  }
84
+ if (override.provider_options !== void 0) {
85
+ result.provider_options = {
86
+ ...result.provider_options,
87
+ ...override.provider_options,
88
+ anthropic: {
89
+ ...result.provider_options?.anthropic,
90
+ ...override.provider_options.anthropic
91
+ },
92
+ gemini: {
93
+ ...result.provider_options?.gemini,
94
+ ...override.provider_options.gemini
95
+ }
96
+ };
97
+ }
84
98
  return result;
85
99
  }
86
100
 
@@ -637,4 +651,4 @@ export {
637
651
  collectContextSizeWarnings,
638
652
  withPromptInputSupport
639
653
  };
640
- //# sourceMappingURL=chunk-X73VG645.js.map
654
+ //# sourceMappingURL=chunk-V7QY7MRM.js.map