promptopskit 0.3.7 → 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.
- package/README.md +37 -11
- package/SKILL.md +26 -3
- package/dist/{chunk-IXPIBZXT.js → chunk-4LEPCCSA.js} +60 -8
- package/dist/chunk-4LEPCCSA.js.map +1 -0
- package/dist/{chunk-5TLHYSP7.js → chunk-AN3OR7YC.js} +26 -3
- package/dist/chunk-AN3OR7YC.js.map +1 -0
- package/dist/{chunk-QPOHKVY5.js → chunk-LMURMZUA.js} +22 -3
- package/dist/chunk-LMURMZUA.js.map +1 -0
- package/dist/{chunk-KFSP5KN4.js → chunk-O6RQZYS4.js} +49 -7
- package/dist/chunk-O6RQZYS4.js.map +1 -0
- package/dist/{chunk-6XKV4YVK.js → chunk-V7QY7MRM.js} +85 -8
- package/dist/chunk-V7QY7MRM.js.map +1 -0
- package/dist/{chunk-DGLLQ3FR.js → chunk-YAD6COQX.js} +3 -3
- package/dist/chunk-YNIAA4ZJ.js +111 -0
- package/dist/chunk-YNIAA4ZJ.js.map +1 -0
- package/dist/cli/index.js +95 -11
- package/dist/cli/index.js.map +1 -1
- package/dist/index.cjs +354 -26
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -5
- package/dist/index.d.ts +9 -5
- package/dist/index.js +28 -12
- package/dist/index.js.map +1 -1
- package/dist/providers/anthropic.cjs +189 -18
- package/dist/providers/anthropic.cjs.map +1 -1
- package/dist/providers/anthropic.d.cts +2 -2
- package/dist/providers/anthropic.d.ts +2 -2
- package/dist/providers/anthropic.js +3 -3
- package/dist/providers/gemini.cjs +166 -14
- package/dist/providers/gemini.cjs.map +1 -1
- package/dist/providers/gemini.d.cts +2 -2
- package/dist/providers/gemini.d.ts +2 -2
- package/dist/providers/gemini.js +3 -3
- package/dist/providers/openai-responses.cjs +1059 -0
- package/dist/providers/openai-responses.cjs.map +1 -0
- package/dist/providers/openai-responses.d.cts +11 -0
- package/dist/providers/openai-responses.d.ts +11 -0
- package/dist/providers/openai-responses.js +9 -0
- package/dist/providers/openai-responses.js.map +1 -0
- package/dist/providers/openai.cjs +162 -14
- package/dist/providers/openai.cjs.map +1 -1
- package/dist/providers/openai.d.cts +2 -2
- package/dist/providers/openai.d.ts +2 -2
- package/dist/providers/openai.js +3 -3
- package/dist/providers/openrouter.cjs +162 -14
- package/dist/providers/openrouter.cjs.map +1 -1
- package/dist/providers/openrouter.d.cts +2 -2
- package/dist/providers/openrouter.d.ts +2 -2
- package/dist/providers/openrouter.js +4 -4
- package/dist/schema-BKkg93rL.d.cts +1923 -0
- package/dist/schema-BKkg93rL.d.ts +1923 -0
- package/dist/testing.cjs +59 -7
- package/dist/testing.cjs.map +1 -1
- package/dist/testing.d.cts +1 -1
- package/dist/testing.d.ts +1 -1
- package/dist/testing.js +1 -1
- package/dist/{types-7U58bgVW.d.cts → types-7cC17GWp.d.cts} +24 -5
- package/dist/{types-HnZ46u5Q.d.ts → types-CsQ8tON_.d.ts} +24 -5
- package/dist/usagetap/index.d.cts +2 -2
- package/dist/usagetap/index.d.ts +2 -2
- package/package.json +11 -1
- package/dist/chunk-5TLHYSP7.js.map +0 -1
- package/dist/chunk-6XKV4YVK.js.map +0 -1
- package/dist/chunk-IXPIBZXT.js.map +0 -1
- package/dist/chunk-KFSP5KN4.js.map +0 -1
- package/dist/chunk-QPOHKVY5.js.map +0 -1
- package/dist/schema-Bgoff-CN.d.cts +0 -805
- package/dist/schema-Bgoff-CN.d.ts +0 -805
- /package/dist/{chunk-DGLLQ3FR.js.map → chunk-YAD6COQX.js.map} +0 -0
package/README.md
CHANGED
|
@@ -64,7 +64,8 @@ sampling:
|
|
|
64
64
|
context:
|
|
65
65
|
inputs:
|
|
66
66
|
- name: user_message
|
|
67
|
-
non_empty:
|
|
67
|
+
non_empty:
|
|
68
|
+
return_message: "Please enter a message before continuing."
|
|
68
69
|
reject_secrets: true
|
|
69
70
|
- name: app_context
|
|
70
71
|
max_size: 2000
|
|
@@ -100,6 +101,10 @@ const result = await kit.renderPrompt({
|
|
|
100
101
|
},
|
|
101
102
|
});
|
|
102
103
|
|
|
104
|
+
if (result.returnMessage) {
|
|
105
|
+
return result.returnMessage;
|
|
106
|
+
}
|
|
107
|
+
|
|
103
108
|
// result.request.body is ready for fetch()
|
|
104
109
|
const response = await fetch('https://api.openai.com/v1/chat/completions', {
|
|
105
110
|
method: 'POST',
|
|
@@ -130,9 +135,11 @@ Supported values for `warnings.contextSize` are `auto`, `off`, `result-only`, `c
|
|
|
130
135
|
- **Composition** — `includes` to share system instructions across prompts, with circular detection
|
|
131
136
|
- **Folder defaults** — `defaults.md` inheritance for shared provider, model, metadata, and system instructions
|
|
132
137
|
- **Overrides** — Environment and tier-based overrides (base → env → tier → runtime)
|
|
133
|
-
- **
|
|
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`
|
|
134
140
|
- **Validation** — Zod schema validation, Levenshtein-based "did you mean?" for typos, variable usage checks
|
|
135
141
|
- **Context hardening** — structured regexes with flags, `/pattern/i` convenience syntax, and built-in `non_empty` / `reject_secrets` validators
|
|
142
|
+
- **Optional short-circuit messages** — validators can return a structured `returnMessage` instead of throwing when configured
|
|
136
143
|
- **Context size guardrails** — optional per-input `max_size` metadata with non-blocking render-time warnings
|
|
137
144
|
- **Warning controls** — top-level config can suppress or emit context size warnings differently in dev and prod
|
|
138
145
|
- **Caching** — LRU cache with mtime-based invalidation
|
|
@@ -147,41 +154,47 @@ Each adapter produces a `{ body, provider, model }` object shaped for the target
|
|
|
147
154
|
// OpenAI
|
|
148
155
|
import { createPromptOpsKit } from 'promptopskit';
|
|
149
156
|
const kit = createPromptOpsKit();
|
|
150
|
-
|
|
157
|
+
let result = await kit.renderPrompt({
|
|
151
158
|
path: 'hello',
|
|
152
159
|
provider: 'openai',
|
|
153
160
|
variables: { name: 'World', app_context: 'Welcome screen' },
|
|
154
161
|
});
|
|
162
|
+
if (!result.request) throw new Error(result.returnMessage ?? 'Prompt rendering failed.');
|
|
163
|
+
const { request } = result;
|
|
155
164
|
// request.body → { model, messages, temperature, reasoning_effort, ... }
|
|
156
165
|
|
|
157
166
|
// Anthropic — system is a top-level field, max_tokens defaults to 4096
|
|
158
|
-
|
|
167
|
+
result = await kit.renderPrompt({
|
|
159
168
|
path: 'hello',
|
|
160
169
|
provider: 'anthropic',
|
|
161
170
|
variables: { name: 'World', app_context: 'Welcome screen' },
|
|
162
171
|
});
|
|
172
|
+
if (!result.request) throw new Error(result.returnMessage ?? 'Prompt rendering failed.');
|
|
163
173
|
// request.body → { model, messages, system, max_tokens, ... }
|
|
164
174
|
|
|
165
175
|
// Gemini — contents/systemInstruction/generationConfig structure
|
|
166
|
-
|
|
176
|
+
result = await kit.renderPrompt({
|
|
167
177
|
path: 'hello',
|
|
168
178
|
provider: 'gemini',
|
|
169
179
|
variables: { name: 'World', app_context: 'Welcome screen' },
|
|
170
180
|
});
|
|
181
|
+
if (!result.request) throw new Error(result.returnMessage ?? 'Prompt rendering failed.');
|
|
171
182
|
// request.body → { contents, systemInstruction, generationConfig, ... }
|
|
172
183
|
|
|
173
184
|
// OpenRouter — same shape as OpenAI, different provider label
|
|
174
|
-
|
|
185
|
+
result = await kit.renderPrompt({
|
|
175
186
|
path: 'hello',
|
|
176
187
|
provider: 'openrouter',
|
|
177
188
|
variables: { name: 'World', app_context: 'Welcome screen' },
|
|
178
189
|
});
|
|
190
|
+
if (!result.request) throw new Error(result.returnMessage ?? 'Prompt rendering failed.');
|
|
179
191
|
```
|
|
180
192
|
|
|
181
193
|
Provider adapters are also available as direct imports:
|
|
182
194
|
|
|
183
195
|
```typescript
|
|
184
196
|
import { openaiAdapter } from 'promptopskit/openai';
|
|
197
|
+
import { openaiResponsesAdapter } from 'promptopskit/openai-responses';
|
|
185
198
|
import { anthropicAdapter } from 'promptopskit/anthropic';
|
|
186
199
|
import { geminiAdapter } from 'promptopskit/gemini';
|
|
187
200
|
import { openrouterAdapter } from 'promptopskit/openrouter';
|
|
@@ -217,7 +230,7 @@ On the server, adapters also provide async prompt-aware helpers so you can use t
|
|
|
217
230
|
```typescript
|
|
218
231
|
import { openaiAdapter } from 'promptopskit/openai';
|
|
219
232
|
|
|
220
|
-
const
|
|
233
|
+
const result = await openaiAdapter.renderPrompt(
|
|
221
234
|
{
|
|
222
235
|
path: 'summarizePullRequest',
|
|
223
236
|
},
|
|
@@ -229,6 +242,12 @@ const request = await openaiAdapter.renderPrompt(
|
|
|
229
242
|
strict: true,
|
|
230
243
|
},
|
|
231
244
|
);
|
|
245
|
+
|
|
246
|
+
if (!('body' in result)) {
|
|
247
|
+
throw new Error(result.returnMessage ?? 'Prompt rendering failed.');
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
const request = result;
|
|
232
251
|
```
|
|
233
252
|
|
|
234
253
|
If you need a different layout, keep passing `sourceDir` and `compiledDir` explicitly.
|
|
@@ -246,7 +265,7 @@ import { createUsageTapClient, runOpenAIWithUsageTap } from 'promptopskit/usaget
|
|
|
246
265
|
const kit = createPromptOpsKit({ sourceDir: './prompts' });
|
|
247
266
|
const usageTap = createUsageTapClient({ apiKey: process.env.USAGETAP_API_KEY! });
|
|
248
267
|
|
|
249
|
-
const
|
|
268
|
+
const result = await kit.renderPrompt({
|
|
250
269
|
path: 'support/reply',
|
|
251
270
|
provider: 'openai',
|
|
252
271
|
variables: {
|
|
@@ -255,6 +274,12 @@ const { request } = await kit.renderPrompt({
|
|
|
255
274
|
},
|
|
256
275
|
});
|
|
257
276
|
|
|
277
|
+
if (!result.request) {
|
|
278
|
+
throw new Error(result.returnMessage ?? 'Prompt rendering failed.');
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
const { request } = result;
|
|
282
|
+
|
|
258
283
|
const tracked = await runOpenAIWithUsageTap(usageTap, {
|
|
259
284
|
begin: {
|
|
260
285
|
customerId: 'user_123',
|
|
@@ -472,13 +497,13 @@ Creates a `PromptOpsKit` instance.
|
|
|
472
497
|
|
|
473
498
|
### `kit.renderPrompt(options)`
|
|
474
499
|
|
|
475
|
-
Renders a prompt for a specific provider. Returns `{ resolved, request
|
|
500
|
+
Renders a prompt for a specific provider. Returns `{ resolved, request?, returnMessage?, warnings }`.
|
|
476
501
|
|
|
477
502
|
| Option | Type | Description |
|
|
478
503
|
|--------|------|-------------|
|
|
479
504
|
| `path` | `string` | Prompt path (no extension), e.g. `'support/reply'` |
|
|
480
505
|
| `source` | `string` | Inline prompt source (alternative to path) |
|
|
481
|
-
| `provider` | `string` | `'openai'`, `'anthropic'`, `'gemini'`, `'openrouter'` |
|
|
506
|
+
| `provider` | `string` | `'openai'`, `'openai-responses'`, `'anthropic'`, `'gemini'`, `'openrouter'` |
|
|
482
507
|
| `variables` | `Record<string, string>` | Template variables |
|
|
483
508
|
| `onContextOverflow` | `(info) => string` | Optional callback to transform oversized context values before rendering |
|
|
484
509
|
| `environment` | `string` | Environment override name |
|
|
@@ -486,6 +511,7 @@ Renders a prompt for a specific provider. Returns `{ resolved, request, warnings
|
|
|
486
511
|
| `history` | `Array<{ role, content }>` | Conversation history |
|
|
487
512
|
| `toolRegistry` | `Record<string, unknown>` | Tool definitions for resolving string tool references |
|
|
488
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`) |
|
|
489
515
|
|
|
490
516
|
### `kit.loadPrompt(path)` / `kit.resolvePrompt(path, options)` / `kit.validatePrompt(path)`
|
|
491
517
|
|
|
@@ -505,7 +531,7 @@ Prompt files use YAML front matter with these fields:
|
|
|
505
531
|
|-------|------|-------------|
|
|
506
532
|
| `id` | `string` | Unique prompt identifier (required) |
|
|
507
533
|
| `schema_version` | `number` | Schema version, currently `1` |
|
|
508
|
-
| `provider` | `string` | `openai`, `anthropic`, `gemini` (or `google`), `openrouter`, `any` |
|
|
534
|
+
| `provider` | `string` | `openai`, `openai-responses`, `anthropic`, `gemini` (or `google`), `openrouter`, `any` |
|
|
509
535
|
| `model` | `string` | Model name |
|
|
510
536
|
| `fallback_models` | `string[]` | Fallback model list |
|
|
511
537
|
| `reasoning` | `object` | `{ effort, budget_tokens }` |
|
package/SKILL.md
CHANGED
|
@@ -104,6 +104,7 @@ Rules:
|
|
|
104
104
|
- Use `allow_regex` for allowlist checks and `deny_regex` for blocklist checks on risky inputs
|
|
105
105
|
- Prefer structured regexes like `{ pattern, flags }`; `/pattern/i` strings are also accepted and normalized internally
|
|
106
106
|
- Use `non_empty: true` for required user text and `reject_secrets: true` for common secret redaction checks
|
|
107
|
+
- When the caller should receive a structured fallback message instead of an exception, use object form with `return_message` on `allow_regex`, `deny_regex`, `non_empty`, or `reject_secrets`
|
|
107
108
|
- Escape literal braces with `\{{` and `\}}`
|
|
108
109
|
- In strict mode, missing variables throw an error
|
|
109
110
|
- In permissive mode, unresolved placeholders are left intact
|
|
@@ -121,6 +122,8 @@ context:
|
|
|
121
122
|
If a rendered value exceeds `max_size`, `renderPrompt()` emits a non-blocking `POK030` warning.
|
|
122
123
|
At render time, callers can also pass `onContextOverflow` to transform oversized values before warnings/rendering.
|
|
123
124
|
|
|
125
|
+
If a validator declares `return_message`, `renderPrompt()` returns that message in a structured result and omits the provider request instead of throwing for that validation failure. Invalid regex definitions still fail during `validate` and `compile` as `POK013` prompt-authoring errors.
|
|
126
|
+
|
|
124
127
|
Malformed `allow_regex` and `deny_regex` values fail during `validate` and `compile`, not just at render time. When regex compilation fails, the error includes the prompt id, variable name, field name, and raw configured value.
|
|
125
128
|
|
|
126
129
|
Example: this is the minimal valid shape for a prompt that references
|
|
@@ -271,7 +274,7 @@ const kit = createPromptOpsKit({
|
|
|
271
274
|
},
|
|
272
275
|
});
|
|
273
276
|
|
|
274
|
-
const
|
|
277
|
+
const result = await kit.renderPrompt({
|
|
275
278
|
path: 'support/reply',
|
|
276
279
|
provider: 'openai',
|
|
277
280
|
environment: 'production',
|
|
@@ -280,6 +283,16 @@ const { request } = await kit.renderPrompt({
|
|
|
280
283
|
app_context: 'Account settings',
|
|
281
284
|
},
|
|
282
285
|
});
|
|
286
|
+
|
|
287
|
+
if (result.returnMessage) {
|
|
288
|
+
return result.returnMessage;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
if (!result.request) {
|
|
292
|
+
throw new Error('Prompt rendering did not produce a provider request.');
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
const { request } = result;
|
|
283
296
|
```
|
|
284
297
|
|
|
285
298
|
### Use `adapter.renderPrompt()` when:
|
|
@@ -292,7 +305,7 @@ const { request } = await kit.renderPrompt({
|
|
|
292
305
|
import path from 'node:path';
|
|
293
306
|
import { openaiAdapter } from 'promptopskit/openai';
|
|
294
307
|
|
|
295
|
-
const
|
|
308
|
+
const result = await openaiAdapter.renderPrompt(
|
|
296
309
|
{
|
|
297
310
|
path: 'support/reply',
|
|
298
311
|
sourceDir: path.join(process.cwd(), 'prompts'),
|
|
@@ -307,6 +320,16 @@ const request = await openaiAdapter.renderPrompt(
|
|
|
307
320
|
strict: true,
|
|
308
321
|
},
|
|
309
322
|
);
|
|
323
|
+
|
|
324
|
+
if (result.returnMessage) {
|
|
325
|
+
return result.returnMessage;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
if (!('body' in result)) {
|
|
329
|
+
throw new Error('Prompt rendering did not produce a provider request.');
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
const request = result;
|
|
310
333
|
```
|
|
311
334
|
|
|
312
335
|
### Use `adapter.render()` when:
|
|
@@ -438,7 +461,7 @@ Hello {{ name }}
|
|
|
438
461
|
| Command | Description |
|
|
439
462
|
|---------|-------------|
|
|
440
463
|
| `promptopskit init [dir]` | Scaffold a prompts directory with starter files (including `defaults.md`) |
|
|
441
|
-
| `promptopskit validate
|
|
464
|
+
| `promptopskit validate [sourceDir] [options]` | Validate all prompt files in a directory, defaulting to `./prompts` |
|
|
442
465
|
| `promptopskit compile [src] [out]` | Compile `.md` prompts to JSON or ESM artifacts |
|
|
443
466
|
| `promptopskit render <file>` | Render a prompt preview |
|
|
444
467
|
| `promptopskit inspect <file>` | Print the normalized prompt asset |
|
|
@@ -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()
|
|
@@ -36,7 +76,14 @@ var ContextRegexSchema = z.union([
|
|
|
36
76
|
z.string(),
|
|
37
77
|
z.object({
|
|
38
78
|
pattern: z.string(),
|
|
39
|
-
flags: z.string().optional()
|
|
79
|
+
flags: z.string().optional(),
|
|
80
|
+
return_message: z.string().optional()
|
|
81
|
+
})
|
|
82
|
+
]);
|
|
83
|
+
var ContextBuiltInValidatorSchema = z.union([
|
|
84
|
+
z.boolean(),
|
|
85
|
+
z.object({
|
|
86
|
+
return_message: z.string().optional()
|
|
40
87
|
})
|
|
41
88
|
]);
|
|
42
89
|
var ContextInputDefinitionObjectSchema = z.object({
|
|
@@ -45,8 +92,8 @@ var ContextInputDefinitionObjectSchema = z.object({
|
|
|
45
92
|
trim: z.union([z.boolean(), z.enum(["start", "end", "both"])]).optional(),
|
|
46
93
|
allow_regex: ContextRegexSchema.optional(),
|
|
47
94
|
deny_regex: ContextRegexSchema.optional(),
|
|
48
|
-
non_empty:
|
|
49
|
-
reject_secrets:
|
|
95
|
+
non_empty: ContextBuiltInValidatorSchema.optional(),
|
|
96
|
+
reject_secrets: ContextBuiltInValidatorSchema.optional()
|
|
50
97
|
});
|
|
51
98
|
var ContextInputDefinitionSchema = z.union([
|
|
52
99
|
z.string(),
|
|
@@ -71,7 +118,9 @@ var PromptAssetOverridesSchema = z.object({
|
|
|
71
118
|
reasoning: ReasoningSchema.optional(),
|
|
72
119
|
sampling: SamplingSchema.optional(),
|
|
73
120
|
response: ResponseSchema.optional(),
|
|
74
|
-
|
|
121
|
+
cache: CacheSchema.optional(),
|
|
122
|
+
tools: z.array(ToolRefSchema).optional(),
|
|
123
|
+
provider_options: ProviderOptionsSchema.optional()
|
|
75
124
|
});
|
|
76
125
|
var SourceSchema = z.object({
|
|
77
126
|
file_path: z.string().optional(),
|
|
@@ -83,8 +132,9 @@ var SectionsSchema = z.object({
|
|
|
83
132
|
notes: z.string().optional()
|
|
84
133
|
});
|
|
85
134
|
var PromptDefaultsSchema = z.object({
|
|
86
|
-
provider: z.enum(["openai", "anthropic", "google", "gemini", "openrouter", "any"]).optional(),
|
|
135
|
+
provider: z.enum(["openai", "openai-responses", "anthropic", "google", "gemini", "openrouter", "any"]).optional(),
|
|
87
136
|
model: z.string().optional(),
|
|
137
|
+
cache: CacheSchema.optional(),
|
|
88
138
|
metadata: MetadataSchema.optional(),
|
|
89
139
|
sections: z.object({
|
|
90
140
|
system_instructions: z.string().optional()
|
|
@@ -94,13 +144,15 @@ var PromptAssetSchema = z.object({
|
|
|
94
144
|
id: z.string(),
|
|
95
145
|
schema_version: z.number().int().positive().default(1),
|
|
96
146
|
description: z.string().optional(),
|
|
97
|
-
provider: z.enum(["openai", "anthropic", "google", "gemini", "openrouter", "any"]).optional(),
|
|
147
|
+
provider: z.enum(["openai", "openai-responses", "anthropic", "google", "gemini", "openrouter", "any"]).optional(),
|
|
98
148
|
model: z.string().optional(),
|
|
99
149
|
fallback_models: z.array(z.string()).optional(),
|
|
100
150
|
reasoning: ReasoningSchema.optional(),
|
|
101
151
|
sampling: SamplingSchema.optional(),
|
|
102
152
|
response: ResponseSchema.optional(),
|
|
153
|
+
cache: CacheSchema.optional(),
|
|
103
154
|
tools: z.array(ToolRefSchema).optional(),
|
|
155
|
+
provider_options: ProviderOptionsSchema.optional(),
|
|
104
156
|
mcp: MCPSchema.optional(),
|
|
105
157
|
context: ContextSchema.optional(),
|
|
106
158
|
includes: z.array(z.string()).optional(),
|
|
@@ -270,4 +322,4 @@ export {
|
|
|
270
322
|
parsePrompt,
|
|
271
323
|
loadPromptFile
|
|
272
324
|
};
|
|
273
|
-
//# sourceMappingURL=chunk-
|
|
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":";AAAA,SAAS,SAAS;AAIX,IAAM,sBAAsB,EAAE,OAAO;AAAA,EAC1C,MAAM,EAAE,OAAO;AAAA,EACf,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,cAAc,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS;AAC/C,CAAC;AAIM,IAAM,gBAAgB,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,mBAAmB,CAAC;AAI/D,IAAM,qBAAqB,EAAE,MAAM;AAAA,EACxC,EAAE,OAAO;AAAA,EACT,EAAE,OAAO;AAAA,IACP,MAAM,EAAE,OAAO;AAAA,IACf,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EACzC,CAAC;AACH,CAAC;AAMM,IAAM,kBAAkB,EAAE,OAAO;AAAA,EACtC,QAAQ,EAAE,KAAK,CAAC,OAAO,UAAU,MAAM,CAAC,EAAE,SAAS;AAAA,EACnD,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AACtD,CAAC;AAIM,IAAM,iBAAiB,EAAE,OAAO;AAAA,EACrC,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAC/C,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACzC,mBAAmB,EAAE,OAAO,EAAE,SAAS;AAAA,EACvC,kBAAkB,EAAE,OAAO,EAAE,SAAS;AAAA,EACtC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACnC,mBAAmB,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAC1D,CAAC;AAIM,IAAM,iBAAiB,EAAE,OAAO;AAAA,EACrC,QAAQ,EAAE,KAAK,CAAC,QAAQ,QAAQ,UAAU,CAAC,EAAE,SAAS;AAAA,EACtD,QAAQ,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC7B,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EACvC,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,eAAe,EAAE,QAAQ,EAAE,SAAS;AACtC,CAAC;AAKM,IAAM,iCAAiC,EAAE,OAAO;AAAA,EACrD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACxC,aAAa,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS;AAC9C,CAAC;AAEM,IAAM,8BAA8B,EAAE,OAAO;AAAA,EAClD,iBAAiB,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EACtD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACxC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EAChC,iBAAiB,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EAChD,qBAAqB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAClD,wBAAwB,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAC/D,CAAC;AAEM,IAAM,wBAAwB,EAAE,OAAO;AAAA,EAC5C,WAAW,+BAA+B,SAAS;AAAA,EACnD,QAAQ,4BAA4B,SAAS;AAC/C,CAAC;AAIM,IAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,kBAAkB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAC7C,WAAW,EAAE,KAAK,CAAC,aAAa,KAAK,CAAC,EAAE,SAAS;AACnD,CAAC;AAEM,IAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,MAAM,EAAE,KAAK,CAAC,aAAa,UAAU,CAAC,EAAE,SAAS;AAAA,EACjD,MAAM,EAAE,QAAQ,WAAW,EAAE,SAAS;AAAA,EACtC,KAAK,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,SAAS;AAAA,EACnC,2BAA2B,EAAE,QAAQ,EAAE,SAAS;AAAA,EAChD,aAAa,EAAE,QAAQ,EAAE,SAAS;AAAA,EAClC,uBAAuB,EAAE,QAAQ,EAAE,SAAS;AAC9C,CAAC;AAEM,IAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,gBAAgB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAC7C,CAAC;AAEM,IAAM,cAAc,EAAE,OAAO;AAAA,EAClC,QAAQ,kBAAkB,SAAS;AAAA,EACnC,WAAW,qBAAqB,SAAS;AAAA,EACzC,QAAQ,kBAAkB,SAAS;AAAA,EACnC,QAAQ,kBAAkB,SAAS;AACrC,CAAC;AAIM,IAAM,gBAAgB,EAAE,OAAO;AAAA,EACpC,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAClD,CAAC;AAEM,IAAM,qBAAqB,EAAE,MAAM;AAAA,EACxC,EAAE,OAAO;AAAA,EACT,EAAE,OAAO;AAAA,IACP,SAAS,EAAE,OAAO;AAAA,IAClB,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,IAC3B,gBAAgB,EAAE,OAAO,EAAE,SAAS;AAAA,EACtC,CAAC;AACH,CAAC;AAEM,IAAM,gCAAgC,EAAE,MAAM;AAAA,EACnD,EAAE,QAAQ;AAAA,EACV,EAAE,OAAO;AAAA,IACP,gBAAgB,EAAE,OAAO,EAAE,SAAS;AAAA,EACtC,CAAC;AACH,CAAC;AAEM,IAAM,qCAAqC,EAAE,OAAO;AAAA,EACzD,MAAM,EAAE,OAAO;AAAA,EACf,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EAC/C,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,GAAG,EAAE,KAAK,CAAC,SAAS,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS;AAAA,EACxE,aAAa,mBAAmB,SAAS;AAAA,EACzC,YAAY,mBAAmB,SAAS;AAAA,EACxC,WAAW,8BAA8B,SAAS;AAAA,EAClD,gBAAgB,8BAA8B,SAAS;AACzD,CAAC;AAEM,IAAM,+BAA+B,EAAE,MAAM;AAAA,EAClD,EAAE,OAAO;AAAA,EACT;AACF,CAAC;AAMM,IAAM,gBAAgB,EAAE,OAAO;AAAA,EACpC,QAAQ,EAAE,MAAM,4BAA4B,EAAE,SAAS;AAAA,EACvD,SAAS,cAAc,SAAS;AAClC,CAAC;AAIM,IAAM,iBAAiB,EAAE,OAAO;AAAA,EACrC,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACnC,iBAAiB,EAAE,QAAQ,EAAE,SAAS;AAAA,EACtC,QAAQ,EAAE,QAAQ,EAAE,SAAS;AAC/B,CAAC;AAIM,IAAM,YAAY,EAAE,OAAO;AAAA,EAChC,SAAS,EAAE,MAAM,kBAAkB,EAAE,SAAS;AAChD,CAAC;AAIM,IAAM,6BAA6B,EAAE,OAAO;AAAA,EACjD,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,iBAAiB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAC9C,WAAW,gBAAgB,SAAS;AAAA,EACpC,UAAU,eAAe,SAAS;AAAA,EAClC,UAAU,eAAe,SAAS;AAAA,EAClC,OAAO,YAAY,SAAS;AAAA,EAC5B,OAAO,EAAE,MAAM,aAAa,EAAE,SAAS;AAAA,EACvC,kBAAkB,sBAAsB,SAAS;AACnD,CAAC;AAMM,IAAM,eAAe,EAAE,OAAO;AAAA,EACnC,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,UAAU,EAAE,OAAO,EAAE,SAAS;AAChC,CAAC;AAIM,IAAM,iBAAiB,EAAE,OAAO;AAAA,EACrC,qBAAqB,EAAE,OAAO,EAAE,SAAS;AAAA,EACzC,iBAAiB,EAAE,OAAO,EAAE,SAAS;AAAA,EACrC,OAAO,EAAE,OAAO,EAAE,SAAS;AAC7B,CAAC;AAIM,IAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,UAAU,EAAE,KAAK,CAAC,UAAU,oBAAoB,aAAa,UAAU,UAAU,cAAc,KAAK,CAAC,EAAE,SAAS;AAAA,EAChH,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,OAAO,YAAY,SAAS;AAAA,EAC5B,UAAU,eAAe,SAAS;AAAA,EAClC,UAAU,EAAE,OAAO;AAAA,IACjB,qBAAqB,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3C,CAAC,EAAE,SAAS;AACd,CAAC;AAMM,IAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,IAAI,EAAE,OAAO;AAAA,EACb,gBAAgB,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC;AAAA,EACrD,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EAEjC,UAAU,EAAE,KAAK,CAAC,UAAU,oBAAoB,aAAa,UAAU,UAAU,cAAc,KAAK,CAAC,EAAE,SAAS;AAAA,EAChH,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,iBAAiB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAE9C,WAAW,gBAAgB,SAAS;AAAA,EACpC,UAAU,eAAe,SAAS;AAAA,EAClC,UAAU,eAAe,SAAS;AAAA,EAClC,OAAO,YAAY,SAAS;AAAA,EAE5B,OAAO,EAAE,MAAM,aAAa,EAAE,SAAS;AAAA,EACvC,kBAAkB,sBAAsB,SAAS;AAAA,EACjD,KAAK,UAAU,SAAS;AAAA,EAExB,SAAS,cAAc,SAAS;AAAA,EAEhC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAEvC,cAAc,EAAE,OAAO,0BAA0B,EAAE,SAAS;AAAA,EAC5D,OAAO,EAAE,OAAO,0BAA0B,EAAE,SAAS;AAAA,EAErD,UAAU,eAAe,SAAS;AAAA;AAAA,EAGlC,UAAU,eAAe,SAAS;AAAA,EAClC,QAAQ,aAAa,SAAS;AAChC,CAAC;;;AC1OD,IAAM,cAA8C;AAAA,EAClD,uBAAuB;AAAA,EACvB,mBAAmB;AAAA,EACnB,SAAS;AACX;AAOO,SAAS,gBAAgB,MAAwB;AACtD,QAAM,QAAQ,KAAK,MAAM,OAAO;AAChC,QAAM,WAAqB,CAAC;AAE5B,MAAI,aAAoC;AACxC,MAAI,eAAyB,CAAC;AAC9B,MAAI,aAAa;AAEjB,aAAW,QAAQ,OAAO;AACxB,UAAM,UAAU,KAAK,MAAM,YAAY;AACvC,QAAI,SAAS;AAEX,UAAI,YAAY;AACd,iBAAS,UAAU,IAAI,aAAa,KAAK,IAAI,EAAE,KAAK;AAAA,MACtD;AAEA,mBAAa;AACb,YAAM,UAAU,QAAQ,CAAC,EAAE,KAAK,EAAE,YAAY;AAC9C,mBAAa,YAAY,OAAO,KAAK;AACrC,qBAAe,CAAC;AAAA,IAClB,OAAO;AACL,mBAAa,KAAK,IAAI;AAAA,IACxB;AAAA,EACF;AAGA,MAAI,YAAY;AACd,aAAS,UAAU,IAAI,aAAa,KAAK,IAAI,EAAE,KAAK;AAAA,EACtD;AAGA,MAAI,CAAC,YAAY;AACf,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,SAAS;AACX,eAAS,kBAAkB;AAAA,IAC7B;AAAA,EACF;AAEA,SAAO;AACT;;;ACxDA,OAAO,YAAY;AAiBZ,SAAS,YAAY,SAAiB,UAAgC;AAC3E,QAAM,EAAE,MAAM,aAAa,SAAS,KAAK,IAAI,OAAO,OAAO;AAE3D,QAAM,WAAW,gBAAgB,IAAI;AAErC,QAAM,MAAM;AAAA,IACV,GAAG;AAAA,IACH;AAAA,IACA,QAAQ,WAAW,EAAE,WAAW,SAAS,IAAI;AAAA,EAC/C;AAEA,QAAM,QAAQ,kBAAkB,MAAM,GAAG;AAEzC,SAAO;AAAA,IACL;AAAA,IACA,KAAK;AAAA,MACH;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;;;ACrCA,SAAS,gBAAgB;AACzB,SAAS,SAAS,MAAM,eAAe;AACvC,OAAOA,aAAY;AAOnB,IAAM,qBAAqB;AAa3B,eAAsB,eAAe,UAAkB,UAA6B,CAAC,GAAyB;AAC5G,QAAM,UAAU,MAAM,SAAS,UAAU,OAAO;AAChD,QAAM,SAAS,YAAY,SAAS,QAAQ;AAG5C,QAAM,OAAO,QAAQ,gBAAgB,QAAQ,QAAQ;AACrD,QAAM,WAAW,MAAM,oBAAoB,UAAU,IAAI;AACzD,QAAM,QAAQ,cAAc,OAAO,OAAO,QAAQ;AAElD,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,EACF;AACF;AAEA,eAAe,oBAAoB,UAAkB,cAAgD;AACnG,QAAM,cAAc,sBAAsB,UAAU,YAAY;AAChE,MAAI,SAAyB,CAAC;AAE9B,aAAW,OAAO,aAAa;AAC7B,UAAM,eAAe,KAAK,KAAK,kBAAkB;AACjD,QAAI;AACF,YAAM,kBAAkB,MAAM,SAAS,cAAc,OAAO;AAC5D,YAAM,WAAW,cAAc,eAAe;AAC9C,eAAS,cAAc,QAAQ,QAAQ;AAAA,IACzC,SAAS,OAAO;AACd,UAAK,MAAgC,SAAS,UAAU;AACtD,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,sBAAsB,UAAkB,cAAiC;AAChF,QAAM,OAAiB,CAAC;AACxB,MAAI,UAAU,QAAQ,QAAQ,QAAQ,CAAC;AACvC,QAAM,WAAW,eAAe,QAAQ,YAAY,IAAI;AAExD,SAAO,MAAM;AACX,SAAK,QAAQ,OAAO;AACpB,QAAK,YAAY,YAAY,YAAa,YAAY,QAAQ,OAAO,GAAG;AACtE;AAAA,IACF;AACA,cAAU,QAAQ,OAAO;AAAA,EAC3B;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,SAAiC;AACtD,QAAM,EAAE,MAAM,aAAa,SAAS,KAAK,IAAIC,QAAO,OAAO;AAC3D,QAAM,WAAW,gBAAgB,IAAI;AAErC,SAAO,qBAAqB,MAAM;AAAA,IAChC,GAAG;AAAA,IACH,UAAU;AAAA,MACR,qBAAqB,SAAS;AAAA,IAChC;AAAA,EACF,CAAC;AACH;AAEA,SAAS,cAAc,MAAsB,OAAuC;AAClF,SAAO;AAAA,IACL,UAAU,MAAM,YAAY,KAAK;AAAA,IACjC,OAAO,MAAM,SAAS,KAAK;AAAA,IAC3B,UAAU;AAAA,MACR,GAAI,KAAK,YAAY,CAAC;AAAA,MACtB,GAAI,MAAM,YAAY,CAAC;AAAA,IACzB;AAAA,IACA,UAAU;AAAA,MACR,GAAI,KAAK,YAAY,CAAC;AAAA,MACtB,GAAI,MAAM,YAAY,CAAC;AAAA,IACzB;AAAA,EACF;AACF;AAEA,SAAS,cAAc,OAA6B,UAAgD;AAClG,QAAM,qBAAqB,SAAS,YAAY,OAAO,KAAK,SAAS,QAAQ,EAAE,SAAS;AACxF,QAAM,mBAAmB,CAAC,CAAC,SAAS,UAAU;AAC9C,QAAM,oBAAoB,SAAS,aAAa,UAC3C,SAAS,UAAU;AAGxB,MAAI,CAAC,sBAAsB,CAAC,oBAAoB,CAAC,mBAAmB;AAClE,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiB;AAAA,IACrB,GAAI,SAAS,YAAY,CAAC;AAAA,IAC1B,GAAI,MAAM,YAAY,CAAC;AAAA,EACzB;AACA,QAAM,WAAW,OAAO,KAAK,cAAc,EAAE,SAAS,IAAI,iBAAiB;AAE3E,QAAM,qBAAqB,MAAM,UAAU,uBAAuB,SAAS,UAAU;AAErF,QAAM,WAAW,MAAM,WACnB,EAAE,GAAG,MAAM,UAAU,qBAAqB,mBAAmB,IAC7D,qBACE,EAAE,qBAAqB,mBAAmB,IAC1C;AAEN,SAAO;AAAA,IACL,GAAG;AAAA,IACH,UAAU,MAAM,YAAY,SAAS;AAAA,IACrC,OAAO,MAAM,SAAS,SAAS;AAAA,IAC/B;AAAA,IACA;AAAA,EACF;AACF;","names":["matter","matter"]}
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
renderSections,
|
|
3
3
|
resolveAssetForProvider,
|
|
4
4
|
withPromptInputSupport
|
|
5
|
-
} from "./chunk-
|
|
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 (
|
|
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-
|
|
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-
|
|
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?.
|
|
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-
|
|
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":[]}
|