promptopskit 0.3.8 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +97 -10
- package/SKILL.md +69 -6
- package/dist/chunk-F6UJ73Y6.js +113 -0
- package/dist/chunk-F6UJ73Y6.js.map +1 -0
- package/dist/chunk-HLNVKKMS.js +145 -0
- package/dist/chunk-HLNVKKMS.js.map +1 -0
- package/dist/{chunk-5OYWNRNC.js → chunk-JBLUPKY4.js} +191 -5
- package/dist/chunk-JBLUPKY4.js.map +1 -0
- package/dist/{chunk-UJU5XERR.js → chunk-L2V7LDKD.js} +25 -4
- package/dist/chunk-L2V7LDKD.js.map +1 -0
- package/dist/{chunk-E6NPZOJL.js → chunk-RY5DVTLV.js} +29 -4
- package/dist/chunk-RY5DVTLV.js.map +1 -0
- package/dist/chunk-UPTCSWK3.js +60 -0
- package/dist/chunk-UPTCSWK3.js.map +1 -0
- package/dist/{chunk-X73VG645.js → chunk-XNNDGDPI.js} +64 -3
- package/dist/chunk-XNNDGDPI.js.map +1 -0
- package/dist/cli/index.js +423 -7
- package/dist/cli/index.js.map +1 -1
- package/dist/index.cjs +655 -22
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -4
- package/dist/index.d.ts +7 -4
- package/dist/index.js +172 -11
- package/dist/index.js.map +1 -1
- package/dist/providers/anthropic.cjs +306 -10
- 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 +274 -6
- 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 +1245 -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 +270 -6
- 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 +305 -9
- 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-B9A1zLRk.d.cts +2403 -0
- package/dist/schema-B9A1zLRk.d.ts +2403 -0
- package/dist/testing.cjs +264 -6
- package/dist/testing.cjs.map +1 -1
- package/dist/testing.d.cts +59 -2
- package/dist/testing.d.ts +59 -2
- package/dist/testing.js +70 -2
- package/dist/testing.js.map +1 -1
- package/dist/{types-fBvo_d4k.d.ts → types-DjGAwJxC.d.ts} +13 -1
- package/dist/{types-C6RG0Si0.d.cts → types-DpbzzZO2.d.cts} +13 -1
- package/dist/usagetap/index.d.cts +2 -2
- package/dist/usagetap/index.d.ts +2 -2
- package/package.json +12 -2
- package/dist/chunk-5OYWNRNC.js.map +0 -1
- package/dist/chunk-BBVVA27J.js +0 -92
- package/dist/chunk-BBVVA27J.js.map +0 -1
- package/dist/chunk-E2NXJLS6.js +0 -26
- package/dist/chunk-E2NXJLS6.js.map +0 -1
- package/dist/chunk-E6NPZOJL.js.map +0 -1
- package/dist/chunk-UJU5XERR.js.map +0 -1
- package/dist/chunk-X73VG645.js.map +0 -1
- package/dist/schema-DwzYbZba.d.cts +0 -859
- package/dist/schema-DwzYbZba.d.ts +0 -859
|
@@ -27,7 +27,66 @@ 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_description: z.string().optional(),
|
|
34
|
+
schema_strict: z.boolean().optional()
|
|
35
|
+
});
|
|
36
|
+
var AnthropicProviderOptionsSchema = z.object({
|
|
37
|
+
top_k: z.number().int().min(0).optional(),
|
|
38
|
+
tool_choice: z.record(z.unknown()).optional(),
|
|
39
|
+
output_config: z.record(z.unknown()).optional()
|
|
40
|
+
});
|
|
41
|
+
var GeminiProviderOptionsSchema = z.object({
|
|
42
|
+
candidate_count: z.number().int().positive().optional(),
|
|
43
|
+
top_k: z.number().int().min(0).optional(),
|
|
44
|
+
seed: z.number().int().optional(),
|
|
45
|
+
response_schema: z.record(z.unknown()).optional(),
|
|
46
|
+
response_json_schema: z.record(z.unknown()).optional(),
|
|
47
|
+
response_modalities: z.array(z.string()).optional(),
|
|
48
|
+
thinking_budget_tokens: z.number().int().positive().optional()
|
|
49
|
+
});
|
|
50
|
+
var OpenRouterProviderOptionsSchema = z.object({
|
|
51
|
+
provider: z.record(z.unknown()).optional(),
|
|
52
|
+
transforms: z.array(z.string()).optional(),
|
|
53
|
+
plugins: z.array(z.record(z.unknown())).optional(),
|
|
54
|
+
models: z.array(z.string()).optional()
|
|
55
|
+
});
|
|
56
|
+
var ProviderOptionsSchema = z.object({
|
|
57
|
+
anthropic: AnthropicProviderOptionsSchema.optional(),
|
|
58
|
+
gemini: GeminiProviderOptionsSchema.optional(),
|
|
59
|
+
openrouter: OpenRouterProviderOptionsSchema.optional()
|
|
60
|
+
});
|
|
61
|
+
var RawProviderBodySchema = z.object({
|
|
62
|
+
openai: z.record(z.unknown()).optional(),
|
|
63
|
+
"openai-responses": z.record(z.unknown()).optional(),
|
|
64
|
+
openai_responses: z.record(z.unknown()).optional(),
|
|
65
|
+
anthropic: z.record(z.unknown()).optional(),
|
|
66
|
+
gemini: z.record(z.unknown()).optional(),
|
|
67
|
+
google: z.record(z.unknown()).optional(),
|
|
68
|
+
openrouter: z.record(z.unknown()).optional()
|
|
69
|
+
});
|
|
70
|
+
var OpenAICacheSchema = z.object({
|
|
71
|
+
prompt_cache_key: z.string().min(1).optional(),
|
|
72
|
+
retention: z.enum(["in_memory", "24h"]).optional()
|
|
73
|
+
});
|
|
74
|
+
var AnthropicCacheSchema = z.object({
|
|
75
|
+
mode: z.enum(["automatic", "explicit"]).optional(),
|
|
76
|
+
type: z.literal("ephemeral").optional(),
|
|
77
|
+
ttl: z.enum(["5m", "1h"]).optional(),
|
|
78
|
+
cache_system_instructions: z.boolean().optional(),
|
|
79
|
+
cache_tools: z.boolean().optional(),
|
|
80
|
+
cache_prompt_template: z.boolean().optional()
|
|
81
|
+
});
|
|
82
|
+
var GeminiCacheSchema = z.object({
|
|
83
|
+
cached_content: z.string().min(1).optional()
|
|
84
|
+
});
|
|
85
|
+
var CacheSchema = z.object({
|
|
86
|
+
openai: OpenAICacheSchema.optional(),
|
|
87
|
+
anthropic: AnthropicCacheSchema.optional(),
|
|
88
|
+
gemini: GeminiCacheSchema.optional(),
|
|
89
|
+
google: GeminiCacheSchema.optional()
|
|
31
90
|
});
|
|
32
91
|
var HistorySchema = z.object({
|
|
33
92
|
max_items: z.number().int().positive().optional()
|
|
@@ -78,7 +137,10 @@ var PromptAssetOverridesSchema = z.object({
|
|
|
78
137
|
reasoning: ReasoningSchema.optional(),
|
|
79
138
|
sampling: SamplingSchema.optional(),
|
|
80
139
|
response: ResponseSchema.optional(),
|
|
81
|
-
|
|
140
|
+
cache: CacheSchema.optional(),
|
|
141
|
+
raw: RawProviderBodySchema.optional(),
|
|
142
|
+
tools: z.array(ToolRefSchema).optional(),
|
|
143
|
+
provider_options: ProviderOptionsSchema.optional()
|
|
82
144
|
});
|
|
83
145
|
var SourceSchema = z.object({
|
|
84
146
|
file_path: z.string().optional(),
|
|
@@ -90,8 +152,9 @@ var SectionsSchema = z.object({
|
|
|
90
152
|
notes: z.string().optional()
|
|
91
153
|
});
|
|
92
154
|
var PromptDefaultsSchema = z.object({
|
|
93
|
-
provider: z.enum(["openai", "anthropic", "google", "gemini", "openrouter", "any"]).optional(),
|
|
155
|
+
provider: z.enum(["openai", "openai-responses", "anthropic", "google", "gemini", "openrouter", "any"]).optional(),
|
|
94
156
|
model: z.string().optional(),
|
|
157
|
+
cache: CacheSchema.optional(),
|
|
95
158
|
metadata: MetadataSchema.optional(),
|
|
96
159
|
sections: z.object({
|
|
97
160
|
system_instructions: z.string().optional()
|
|
@@ -101,13 +164,16 @@ var PromptAssetSchema = z.object({
|
|
|
101
164
|
id: z.string(),
|
|
102
165
|
schema_version: z.number().int().positive().default(1),
|
|
103
166
|
description: z.string().optional(),
|
|
104
|
-
provider: z.enum(["openai", "anthropic", "google", "gemini", "openrouter", "any"]).optional(),
|
|
167
|
+
provider: z.enum(["openai", "openai-responses", "anthropic", "google", "gemini", "openrouter", "any"]).optional(),
|
|
105
168
|
model: z.string().optional(),
|
|
106
169
|
fallback_models: z.array(z.string()).optional(),
|
|
107
170
|
reasoning: ReasoningSchema.optional(),
|
|
108
171
|
sampling: SamplingSchema.optional(),
|
|
109
172
|
response: ResponseSchema.optional(),
|
|
173
|
+
cache: CacheSchema.optional(),
|
|
174
|
+
raw: RawProviderBodySchema.optional(),
|
|
110
175
|
tools: z.array(ToolRefSchema).optional(),
|
|
176
|
+
provider_options: ProviderOptionsSchema.optional(),
|
|
111
177
|
mcp: MCPSchema.optional(),
|
|
112
178
|
context: ContextSchema.optional(),
|
|
113
179
|
includes: z.array(z.string()).optional(),
|
|
@@ -159,7 +225,127 @@ function extractSections(body) {
|
|
|
159
225
|
|
|
160
226
|
// src/parser/parser.ts
|
|
161
227
|
import matter from "gray-matter";
|
|
228
|
+
|
|
229
|
+
// src/parser/frontmatter-guard.ts
|
|
230
|
+
var FRONT_MATTER_DELIMITER = /^---[ \t]*$/;
|
|
231
|
+
var REGEX_FIELD = /^(?<indent>\s*)(?<field>allow_regex|deny_regex)\s*:\s*(?<value>.*)$/;
|
|
232
|
+
var PATTERN_FIELD = /^(?<indent>\s*)pattern\s*:\s*(?<value>.*)$/;
|
|
233
|
+
var INLINE_PATTERN_FIELD = /(?:^|[{,]\s*)pattern\s*:\s*(?<value>"(?:\\.|[^"\\])*")/;
|
|
234
|
+
function assertRegexFrontMatterQuoting(content, filePath) {
|
|
235
|
+
const frontMatter = extractFrontMatter(content);
|
|
236
|
+
if (!frontMatter) {
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
let pendingRegex;
|
|
240
|
+
for (const [index, line] of frontMatter.lines.entries()) {
|
|
241
|
+
const lineNumber = frontMatter.startLine + index;
|
|
242
|
+
const regexMatch = line.match(REGEX_FIELD);
|
|
243
|
+
if (regexMatch?.groups) {
|
|
244
|
+
const field = regexMatch.groups.field;
|
|
245
|
+
const indent2 = regexMatch.groups.indent.length;
|
|
246
|
+
const value = regexMatch.groups.value.trim();
|
|
247
|
+
pendingRegex = value === "" ? { field, indent: indent2 } : void 0;
|
|
248
|
+
assertNoUnescapedBackslashInDoubleQuotedRegex(value, field, filePath, lineNumber);
|
|
249
|
+
assertNoUnescapedBackslashInInlinePattern(value, field, filePath, lineNumber);
|
|
250
|
+
continue;
|
|
251
|
+
}
|
|
252
|
+
if (!pendingRegex) {
|
|
253
|
+
continue;
|
|
254
|
+
}
|
|
255
|
+
if (line.trim() === "" || line.trimStart().startsWith("#")) {
|
|
256
|
+
continue;
|
|
257
|
+
}
|
|
258
|
+
const indent = line.match(/^\s*/)?.[0].length ?? 0;
|
|
259
|
+
if (indent <= pendingRegex.indent) {
|
|
260
|
+
pendingRegex = void 0;
|
|
261
|
+
continue;
|
|
262
|
+
}
|
|
263
|
+
const patternMatch = line.match(PATTERN_FIELD);
|
|
264
|
+
if (!patternMatch?.groups) {
|
|
265
|
+
continue;
|
|
266
|
+
}
|
|
267
|
+
assertNoUnescapedBackslashInDoubleQuotedRegex(
|
|
268
|
+
patternMatch.groups.value.trim(),
|
|
269
|
+
`${pendingRegex.field}.pattern`,
|
|
270
|
+
filePath,
|
|
271
|
+
lineNumber
|
|
272
|
+
);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
function assertNoUnescapedBackslashInInlinePattern(value, field, filePath, lineNumber) {
|
|
276
|
+
const match = value.match(INLINE_PATTERN_FIELD);
|
|
277
|
+
const pattern = match?.groups?.value;
|
|
278
|
+
if (!pattern) {
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
assertNoUnescapedBackslashInDoubleQuotedRegex(pattern, `${field}.pattern`, filePath, lineNumber);
|
|
282
|
+
}
|
|
283
|
+
function extractFrontMatter(content) {
|
|
284
|
+
const lines = content.split(/\r?\n/);
|
|
285
|
+
if (!FRONT_MATTER_DELIMITER.test(lines[0] ?? "")) {
|
|
286
|
+
return void 0;
|
|
287
|
+
}
|
|
288
|
+
for (let index = 1; index < lines.length; index += 1) {
|
|
289
|
+
if (FRONT_MATTER_DELIMITER.test(lines[index] ?? "")) {
|
|
290
|
+
return {
|
|
291
|
+
lines: lines.slice(1, index),
|
|
292
|
+
startLine: 2
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
return void 0;
|
|
297
|
+
}
|
|
298
|
+
function assertNoUnescapedBackslashInDoubleQuotedRegex(value, field, filePath, lineNumber) {
|
|
299
|
+
if (!value.startsWith('"')) {
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
const quoted = readDoubleQuotedScalar(value);
|
|
303
|
+
if (!quoted) {
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
if (!hasUnescapedBackslash(quoted)) {
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
const location = filePath ? `${filePath}:${lineNumber}` : `line ${lineNumber}`;
|
|
310
|
+
throw new Error(
|
|
311
|
+
`POK013: Invalid context regex YAML at ${location}, field "${field}": double-quoted regex strings treat backslashes as YAML escapes. Use unquoted /pattern/i literal form, single quotes, or double each backslash.`
|
|
312
|
+
);
|
|
313
|
+
}
|
|
314
|
+
function readDoubleQuotedScalar(value) {
|
|
315
|
+
let result = "";
|
|
316
|
+
for (let index = 1; index < value.length; index += 1) {
|
|
317
|
+
const char = value[index];
|
|
318
|
+
if (char === '"') {
|
|
319
|
+
return result;
|
|
320
|
+
}
|
|
321
|
+
result += char;
|
|
322
|
+
if (char === "\\" && index + 1 < value.length) {
|
|
323
|
+
index += 1;
|
|
324
|
+
result += value[index];
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
return void 0;
|
|
328
|
+
}
|
|
329
|
+
function hasUnescapedBackslash(value) {
|
|
330
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
331
|
+
if (value[index] !== "\\") {
|
|
332
|
+
continue;
|
|
333
|
+
}
|
|
334
|
+
let count = 1;
|
|
335
|
+
while (value[index + count] === "\\") {
|
|
336
|
+
count += 1;
|
|
337
|
+
}
|
|
338
|
+
if (count % 2 === 1) {
|
|
339
|
+
return true;
|
|
340
|
+
}
|
|
341
|
+
index += count - 1;
|
|
342
|
+
}
|
|
343
|
+
return false;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
// src/parser/parser.ts
|
|
162
347
|
function parsePrompt(content, filePath) {
|
|
348
|
+
assertRegexFrontMatterQuoting(content, filePath);
|
|
163
349
|
const { data: frontMatter, content: body } = matter(content);
|
|
164
350
|
const sections = extractSections(body);
|
|
165
351
|
const raw = {
|
|
@@ -277,4 +463,4 @@ export {
|
|
|
277
463
|
parsePrompt,
|
|
278
464
|
loadPromptFile
|
|
279
465
|
};
|
|
280
|
-
//# sourceMappingURL=chunk-
|
|
466
|
+
//# sourceMappingURL=chunk-JBLUPKY4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/schema/schema.ts","../src/parser/sections.ts","../src/parser/parser.ts","../src/parser/frontmatter-guard.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_description: 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 output_config: 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_json_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 OpenRouterProviderOptionsSchema = z.object({\n provider: z.record(z.unknown()).optional(),\n transforms: z.array(z.string()).optional(),\n plugins: z.array(z.record(z.unknown())).optional(),\n models: z.array(z.string()).optional(),\n});\n\nexport const ProviderOptionsSchema = z.object({\n anthropic: AnthropicProviderOptionsSchema.optional(),\n gemini: GeminiProviderOptionsSchema.optional(),\n openrouter: OpenRouterProviderOptionsSchema.optional(),\n});\n\nexport type ProviderOptions = z.infer<typeof ProviderOptionsSchema>;\n\n// --- Raw provider body passthrough ---\n\nexport const RawProviderBodySchema = z.object({\n openai: z.record(z.unknown()).optional(),\n 'openai-responses': z.record(z.unknown()).optional(),\n openai_responses: z.record(z.unknown()).optional(),\n anthropic: z.record(z.unknown()).optional(),\n gemini: z.record(z.unknown()).optional(),\n google: z.record(z.unknown()).optional(),\n openrouter: z.record(z.unknown()).optional(),\n});\n\nexport type RawProviderBody = z.infer<typeof RawProviderBodySchema>;\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 raw: RawProviderBodySchema.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 raw: RawProviderBodySchema.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 { assertRegexFrontMatterQuoting } from './frontmatter-guard.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 assertRegexFrontMatterQuoting(content, filePath);\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","const FRONT_MATTER_DELIMITER = /^---[ \\t]*$/;\nconst REGEX_FIELD = /^(?<indent>\\s*)(?<field>allow_regex|deny_regex)\\s*:\\s*(?<value>.*)$/;\nconst PATTERN_FIELD = /^(?<indent>\\s*)pattern\\s*:\\s*(?<value>.*)$/;\nconst INLINE_PATTERN_FIELD = /(?:^|[{,]\\s*)pattern\\s*:\\s*(?<value>\"(?:\\\\.|[^\"\\\\])*\")/;\n\ninterface PendingRegexField {\n field: string;\n indent: number;\n}\n\nexport function assertRegexFrontMatterQuoting(content: string, filePath?: string): void {\n const frontMatter = extractFrontMatter(content);\n if (!frontMatter) {\n return;\n }\n\n let pendingRegex: PendingRegexField | undefined;\n\n for (const [index, line] of frontMatter.lines.entries()) {\n const lineNumber = frontMatter.startLine + index;\n const regexMatch = line.match(REGEX_FIELD);\n\n if (regexMatch?.groups) {\n const field = regexMatch.groups.field;\n const indent = regexMatch.groups.indent.length;\n const value = regexMatch.groups.value.trim();\n pendingRegex = value === '' ? { field, indent } : undefined;\n\n assertNoUnescapedBackslashInDoubleQuotedRegex(value, field, filePath, lineNumber);\n assertNoUnescapedBackslashInInlinePattern(value, field, filePath, lineNumber);\n continue;\n }\n\n if (!pendingRegex) {\n continue;\n }\n\n if (line.trim() === '' || line.trimStart().startsWith('#')) {\n continue;\n }\n\n const indent = line.match(/^\\s*/)?.[0].length ?? 0;\n if (indent <= pendingRegex.indent) {\n pendingRegex = undefined;\n continue;\n }\n\n const patternMatch = line.match(PATTERN_FIELD);\n if (!patternMatch?.groups) {\n continue;\n }\n\n assertNoUnescapedBackslashInDoubleQuotedRegex(\n patternMatch.groups.value.trim(),\n `${pendingRegex.field}.pattern`,\n filePath,\n lineNumber,\n );\n }\n}\n\nfunction assertNoUnescapedBackslashInInlinePattern(\n value: string,\n field: string,\n filePath: string | undefined,\n lineNumber: number,\n): void {\n const match = value.match(INLINE_PATTERN_FIELD);\n const pattern = match?.groups?.value;\n if (!pattern) {\n return;\n }\n\n assertNoUnescapedBackslashInDoubleQuotedRegex(pattern, `${field}.pattern`, filePath, lineNumber);\n}\n\nfunction extractFrontMatter(content: string): { lines: string[]; startLine: number } | undefined {\n const lines = content.split(/\\r?\\n/);\n if (!FRONT_MATTER_DELIMITER.test(lines[0] ?? '')) {\n return undefined;\n }\n\n for (let index = 1; index < lines.length; index += 1) {\n if (FRONT_MATTER_DELIMITER.test(lines[index] ?? '')) {\n return {\n lines: lines.slice(1, index),\n startLine: 2,\n };\n }\n }\n\n return undefined;\n}\n\nfunction assertNoUnescapedBackslashInDoubleQuotedRegex(\n value: string,\n field: string,\n filePath: string | undefined,\n lineNumber: number,\n): void {\n if (!value.startsWith('\"')) {\n return;\n }\n\n const quoted = readDoubleQuotedScalar(value);\n if (!quoted) {\n return;\n }\n\n if (!hasUnescapedBackslash(quoted)) {\n return;\n }\n\n const location = filePath ? `${filePath}:${lineNumber}` : `line ${lineNumber}`;\n throw new Error(\n `POK013: Invalid context regex YAML at ${location}, field \"${field}\": `\n + 'double-quoted regex strings treat backslashes as YAML escapes. '\n + 'Use unquoted /pattern/i literal form, single quotes, or double each backslash.',\n );\n}\n\nfunction readDoubleQuotedScalar(value: string): string | undefined {\n let result = '';\n\n for (let index = 1; index < value.length; index += 1) {\n const char = value[index];\n\n if (char === '\"') {\n return result;\n }\n\n result += char;\n\n if (char === '\\\\' && index + 1 < value.length) {\n index += 1;\n result += value[index];\n }\n }\n\n return undefined;\n}\n\nfunction hasUnescapedBackslash(value: string): boolean {\n for (let index = 0; index < value.length; index += 1) {\n if (value[index] !== '\\\\') {\n continue;\n }\n\n let count = 1;\n while (value[index + count] === '\\\\') {\n count += 1;\n }\n\n if (count % 2 === 1) {\n return true;\n }\n\n index += count - 1;\n }\n\n return false;\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":["indent","matter","matter"]}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
|
+
applyRawProviderBody,
|
|
2
3
|
renderSections,
|
|
3
4
|
resolveAssetForProvider,
|
|
4
5
|
withPromptInputSupport
|
|
5
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-XNNDGDPI.js";
|
|
6
7
|
|
|
7
8
|
// src/providers/openai.ts
|
|
8
9
|
var openaiAdapter = withPromptInputSupport({
|
|
@@ -17,6 +18,9 @@ var openaiAdapter = withPromptInputSupport({
|
|
|
17
18
|
if (resolvedAsset.reasoning?.budget_tokens !== void 0) {
|
|
18
19
|
warnings.push("OpenAI uses reasoning_effort, not budget_tokens. budget_tokens will be ignored.");
|
|
19
20
|
}
|
|
21
|
+
if (resolvedAsset.response?.schema !== void 0 && resolvedAsset.response?.format !== "json") {
|
|
22
|
+
warnings.push("OpenAI response.schema requires response.format: json. schema will still be applied as JSON schema output.");
|
|
23
|
+
}
|
|
20
24
|
return { valid: errors.length === 0, errors, warnings };
|
|
21
25
|
},
|
|
22
26
|
render(asset, runtime) {
|
|
@@ -41,6 +45,7 @@ var openaiAdapter = withPromptInputSupport({
|
|
|
41
45
|
model: resolvedAsset.model,
|
|
42
46
|
messages
|
|
43
47
|
};
|
|
48
|
+
const openaiCacheConfig = resolvedAsset.cache?.openai;
|
|
44
49
|
if (resolvedAsset.sampling?.temperature !== void 0) body.temperature = resolvedAsset.sampling.temperature;
|
|
45
50
|
if (resolvedAsset.sampling?.top_p !== void 0) body.top_p = resolvedAsset.sampling.top_p;
|
|
46
51
|
if (resolvedAsset.sampling?.frequency_penalty !== void 0) body.frequency_penalty = resolvedAsset.sampling.frequency_penalty;
|
|
@@ -50,12 +55,28 @@ var openaiAdapter = withPromptInputSupport({
|
|
|
50
55
|
if (resolvedAsset.reasoning?.effort) {
|
|
51
56
|
body.reasoning_effort = resolvedAsset.reasoning.effort;
|
|
52
57
|
}
|
|
53
|
-
if (resolvedAsset.response?.
|
|
58
|
+
if (resolvedAsset.response?.schema) {
|
|
59
|
+
body.response_format = {
|
|
60
|
+
type: "json_schema",
|
|
61
|
+
json_schema: {
|
|
62
|
+
name: resolvedAsset.response.schema_name ?? `${resolvedAsset.id}_response`,
|
|
63
|
+
...resolvedAsset.response.schema_description ? { description: resolvedAsset.response.schema_description } : {},
|
|
64
|
+
schema: resolvedAsset.response.schema,
|
|
65
|
+
strict: resolvedAsset.response.schema_strict ?? true
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
} else if (resolvedAsset.response?.format === "json") {
|
|
54
69
|
body.response_format = { type: "json_object" };
|
|
55
70
|
}
|
|
56
71
|
if (resolvedAsset.response?.stream !== void 0) {
|
|
57
72
|
body.stream = resolvedAsset.response.stream;
|
|
58
73
|
}
|
|
74
|
+
if (openaiCacheConfig?.prompt_cache_key) {
|
|
75
|
+
body.prompt_cache_key = openaiCacheConfig.prompt_cache_key;
|
|
76
|
+
}
|
|
77
|
+
if (openaiCacheConfig?.retention) {
|
|
78
|
+
body.prompt_cache_retention = openaiCacheConfig.retention;
|
|
79
|
+
}
|
|
59
80
|
if (resolvedAsset.tools && resolvedAsset.tools.length > 0) {
|
|
60
81
|
body.tools = resolvedAsset.tools.map((tool) => {
|
|
61
82
|
if (typeof tool === "string") {
|
|
@@ -74,7 +95,7 @@ var openaiAdapter = withPromptInputSupport({
|
|
|
74
95
|
});
|
|
75
96
|
}
|
|
76
97
|
return {
|
|
77
|
-
body,
|
|
98
|
+
body: applyRawProviderBody(body, resolvedAsset, "openai"),
|
|
78
99
|
provider: "openai",
|
|
79
100
|
model: resolvedAsset.model ?? "unknown"
|
|
80
101
|
};
|
|
@@ -84,4 +105,4 @@ var openaiAdapter = withPromptInputSupport({
|
|
|
84
105
|
export {
|
|
85
106
|
openaiAdapter
|
|
86
107
|
};
|
|
87
|
-
//# sourceMappingURL=chunk-
|
|
108
|
+
//# sourceMappingURL=chunk-L2V7LDKD.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';\nimport { applyRawProviderBody } from './raw.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 ...(resolvedAsset.response.schema_description ? { description: resolvedAsset.response.schema_description } : {}),\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: applyRawProviderBody(body, resolvedAsset, 'openai'),\n provider: 'openai',\n model: resolvedAsset.model ?? 'unknown',\n };\n },\n});\n"],"mappings":"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","names":[]}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
|
+
applyRawProviderBody,
|
|
2
3
|
renderSections,
|
|
3
4
|
resolveAssetForProvider,
|
|
4
5
|
withPromptInputSupport
|
|
5
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-XNNDGDPI.js";
|
|
6
7
|
|
|
7
8
|
// src/providers/gemini.ts
|
|
8
9
|
var geminiAdapter = withPromptInputSupport({
|
|
@@ -11,6 +12,8 @@ var geminiAdapter = withPromptInputSupport({
|
|
|
11
12
|
const resolvedAsset = resolveAssetForProvider(asset, runtime);
|
|
12
13
|
const errors = [];
|
|
13
14
|
const warnings = [];
|
|
15
|
+
const geminiCache = resolvedAsset.cache?.gemini?.cached_content;
|
|
16
|
+
const googleCache = resolvedAsset.cache?.google?.cached_content;
|
|
14
17
|
if (!resolvedAsset.model) {
|
|
15
18
|
errors.push("Gemini adapter requires a model to be specified.");
|
|
16
19
|
}
|
|
@@ -20,6 +23,12 @@ var geminiAdapter = withPromptInputSupport({
|
|
|
20
23
|
if (resolvedAsset.sampling?.presence_penalty !== void 0) {
|
|
21
24
|
warnings.push("Gemini does not support presence_penalty. It will be ignored.");
|
|
22
25
|
}
|
|
26
|
+
if (geminiCache && googleCache && geminiCache !== googleCache) {
|
|
27
|
+
warnings.push("Both cache.gemini.cached_content and cache.google.cached_content are set. Gemini uses cache.gemini.cached_content.");
|
|
28
|
+
}
|
|
29
|
+
if (resolvedAsset.response?.stream !== void 0) {
|
|
30
|
+
warnings.push("Gemini streaming is endpoint-based (streamGenerateContent), not body-based. response.stream will be ignored.");
|
|
31
|
+
}
|
|
23
32
|
return { valid: errors.length === 0, errors, warnings };
|
|
24
33
|
},
|
|
25
34
|
render(asset, runtime) {
|
|
@@ -46,20 +55,33 @@ var geminiAdapter = withPromptInputSupport({
|
|
|
46
55
|
const body = {
|
|
47
56
|
contents
|
|
48
57
|
};
|
|
58
|
+
const geminiCacheConfig = resolvedAsset.cache?.gemini ?? resolvedAsset.cache?.google;
|
|
49
59
|
if (sections.system_instructions) {
|
|
50
60
|
body.systemInstruction = {
|
|
51
61
|
parts: [{ text: sections.system_instructions }]
|
|
52
62
|
};
|
|
53
63
|
}
|
|
54
64
|
const generationConfig = {};
|
|
65
|
+
const geminiOptions = resolvedAsset.provider_options?.gemini;
|
|
55
66
|
if (resolvedAsset.sampling?.temperature !== void 0) generationConfig.temperature = resolvedAsset.sampling.temperature;
|
|
56
67
|
if (resolvedAsset.sampling?.top_p !== void 0) generationConfig.topP = resolvedAsset.sampling.top_p;
|
|
57
68
|
if (resolvedAsset.sampling?.max_output_tokens !== void 0) generationConfig.maxOutputTokens = resolvedAsset.sampling.max_output_tokens;
|
|
58
69
|
if (resolvedAsset.sampling?.stop !== void 0) generationConfig.stopSequences = resolvedAsset.sampling.stop;
|
|
70
|
+
if (geminiOptions?.candidate_count !== void 0) generationConfig.candidateCount = geminiOptions.candidate_count;
|
|
71
|
+
if (geminiOptions?.top_k !== void 0) generationConfig.topK = geminiOptions.top_k;
|
|
72
|
+
if (geminiOptions?.seed !== void 0) generationConfig.seed = geminiOptions.seed;
|
|
73
|
+
if (geminiOptions?.response_modalities !== void 0) generationConfig.responseModalities = geminiOptions.response_modalities;
|
|
74
|
+
if (resolvedAsset.response?.schema !== void 0) generationConfig.responseJsonSchema = resolvedAsset.response.schema;
|
|
75
|
+
if (geminiOptions?.response_schema !== void 0) generationConfig.responseSchema = geminiOptions.response_schema;
|
|
76
|
+
if (geminiOptions?.response_json_schema !== void 0) generationConfig.responseJsonSchema = geminiOptions.response_json_schema;
|
|
59
77
|
if (resolvedAsset.response?.format === "json") {
|
|
60
78
|
generationConfig.responseMimeType = "application/json";
|
|
61
79
|
}
|
|
62
|
-
if (
|
|
80
|
+
if (geminiOptions?.thinking_budget_tokens !== void 0) {
|
|
81
|
+
body.thinkingConfig = {
|
|
82
|
+
thinkingBudget: geminiOptions.thinking_budget_tokens
|
|
83
|
+
};
|
|
84
|
+
} else if (resolvedAsset.reasoning?.effort) {
|
|
63
85
|
body.thinkingConfig = {
|
|
64
86
|
thinkingBudget: resolvedAsset.reasoning.effort === "high" ? 8192 : resolvedAsset.reasoning.effort === "medium" ? 4096 : 1024
|
|
65
87
|
};
|
|
@@ -67,6 +89,9 @@ var geminiAdapter = withPromptInputSupport({
|
|
|
67
89
|
if (Object.keys(generationConfig).length > 0) {
|
|
68
90
|
body.generationConfig = generationConfig;
|
|
69
91
|
}
|
|
92
|
+
if (geminiCacheConfig?.cached_content) {
|
|
93
|
+
body.cachedContent = geminiCacheConfig.cached_content;
|
|
94
|
+
}
|
|
70
95
|
if (resolvedAsset.tools && resolvedAsset.tools.length > 0) {
|
|
71
96
|
const functionDeclarations = resolvedAsset.tools.map((tool) => {
|
|
72
97
|
if (typeof tool === "string") {
|
|
@@ -83,7 +108,7 @@ var geminiAdapter = withPromptInputSupport({
|
|
|
83
108
|
body.tools = [{ functionDeclarations }];
|
|
84
109
|
}
|
|
85
110
|
return {
|
|
86
|
-
body,
|
|
111
|
+
body: applyRawProviderBody(body, resolvedAsset, "gemini"),
|
|
87
112
|
provider: "gemini",
|
|
88
113
|
model: resolvedAsset.model ?? "unknown"
|
|
89
114
|
};
|
|
@@ -93,4 +118,4 @@ var geminiAdapter = withPromptInputSupport({
|
|
|
93
118
|
export {
|
|
94
119
|
geminiAdapter
|
|
95
120
|
};
|
|
96
|
-
//# sourceMappingURL=chunk-
|
|
121
|
+
//# sourceMappingURL=chunk-RY5DVTLV.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';\nimport { applyRawProviderBody } from './raw.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_modalities !== undefined) generationConfig.responseModalities = geminiOptions.response_modalities;\n\n if (resolvedAsset.response?.schema !== undefined) generationConfig.responseJsonSchema = resolvedAsset.response.schema;\n if (geminiOptions?.response_schema !== undefined) generationConfig.responseSchema = geminiOptions.response_schema;\n if (geminiOptions?.response_json_schema !== undefined) generationConfig.responseJsonSchema = geminiOptions.response_json_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: applyRawProviderBody(body, resolvedAsset, 'gemini'),\n provider: 'gemini',\n model: resolvedAsset.model ?? 'unknown',\n };\n },\n});\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import {
|
|
2
|
+
openaiAdapter
|
|
3
|
+
} from "./chunk-L2V7LDKD.js";
|
|
4
|
+
import {
|
|
5
|
+
applyRawProviderBody,
|
|
6
|
+
resolveAssetForProvider,
|
|
7
|
+
withPromptInputSupport
|
|
8
|
+
} from "./chunk-XNNDGDPI.js";
|
|
9
|
+
|
|
10
|
+
// src/providers/openrouter.ts
|
|
11
|
+
var openrouterAdapter = withPromptInputSupport({
|
|
12
|
+
name: "openrouter",
|
|
13
|
+
validate(asset, runtime) {
|
|
14
|
+
const resolvedAsset = resolveAssetForProvider(asset, runtime);
|
|
15
|
+
const validation = openaiAdapter.validate(asset, runtime);
|
|
16
|
+
const hasOpenRouterModels = (resolvedAsset.provider_options?.openrouter?.models?.length ?? 0) > 0;
|
|
17
|
+
if (!hasOpenRouterModels) {
|
|
18
|
+
return validation;
|
|
19
|
+
}
|
|
20
|
+
const modelRequiredError = "OpenAI adapter requires a model to be specified.";
|
|
21
|
+
const errors = validation.errors.filter((error) => error !== modelRequiredError);
|
|
22
|
+
const warnings = validation.warnings.filter((warning) => warning !== modelRequiredError);
|
|
23
|
+
return {
|
|
24
|
+
valid: errors.length === 0,
|
|
25
|
+
errors,
|
|
26
|
+
warnings
|
|
27
|
+
};
|
|
28
|
+
},
|
|
29
|
+
render(asset, runtime) {
|
|
30
|
+
const resolvedAsset = resolveAssetForProvider(asset, runtime);
|
|
31
|
+
const result = openaiAdapter.render(
|
|
32
|
+
{ ...resolvedAsset, raw: void 0 },
|
|
33
|
+
{
|
|
34
|
+
variables: runtime.variables,
|
|
35
|
+
history: runtime.history,
|
|
36
|
+
toolRegistry: runtime.toolRegistry,
|
|
37
|
+
strict: runtime.strict
|
|
38
|
+
}
|
|
39
|
+
);
|
|
40
|
+
const openrouterOptions = resolvedAsset.provider_options?.openrouter;
|
|
41
|
+
let body = { ...result.body };
|
|
42
|
+
if (openrouterOptions?.provider !== void 0) body.provider = openrouterOptions.provider;
|
|
43
|
+
if (openrouterOptions?.transforms !== void 0) body.transforms = openrouterOptions.transforms;
|
|
44
|
+
if (openrouterOptions?.plugins !== void 0) body.plugins = openrouterOptions.plugins;
|
|
45
|
+
if (openrouterOptions?.models !== void 0) body.models = openrouterOptions.models;
|
|
46
|
+
if (body.model === void 0) delete body.model;
|
|
47
|
+
body = applyRawProviderBody(body, resolvedAsset, "openrouter");
|
|
48
|
+
return {
|
|
49
|
+
...result,
|
|
50
|
+
body,
|
|
51
|
+
provider: "openrouter",
|
|
52
|
+
model: resolvedAsset.model ?? openrouterOptions?.models?.[0] ?? "unknown"
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
export {
|
|
58
|
+
openrouterAdapter
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=chunk-UPTCSWK3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/providers/openrouter.ts"],"sourcesContent":["import { openaiAdapter } from './openai.js';\nimport type { ResolvedPromptAsset } from '../schema/index.js';\nimport type {\n ProviderAdapter,\n ProviderRequest,\n ValidationResult,\n RuntimeRenderOptions,\n} from './types.js';\nimport { withPromptInputSupport } from './prompt-input.js';\nimport { applyRawProviderBody } from './raw.js';\nimport { resolveAssetForProvider } from './resolve-asset.js';\n\n/**\n * OpenRouter provider adapter.\n * Thin preset over the OpenAI adapter — body format is identical,\n * only the provider label differs. The app handles the different\n * base URL and extra headers (HTTP-Referer, X-Title).\n */\nexport const openrouterAdapter: ProviderAdapter = withPromptInputSupport({\n name: 'openrouter',\n\n validate(asset: ResolvedPromptAsset, runtime?: RuntimeRenderOptions): ValidationResult {\n const resolvedAsset = resolveAssetForProvider(asset, runtime);\n const validation = openaiAdapter.validate(asset, runtime);\n const hasOpenRouterModels = (resolvedAsset.provider_options?.openrouter?.models?.length ?? 0) > 0;\n\n if (!hasOpenRouterModels) {\n return validation;\n }\n\n const modelRequiredError = 'OpenAI adapter requires a model to be specified.';\n const errors = validation.errors.filter((error) => error !== modelRequiredError);\n const warnings = validation.warnings.filter((warning) => warning !== modelRequiredError);\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n },\n\n render(asset: ResolvedPromptAsset, runtime: RuntimeRenderOptions): ProviderRequest {\n const resolvedAsset = resolveAssetForProvider(asset, runtime);\n const result = openaiAdapter.render(\n { ...resolvedAsset, raw: undefined },\n {\n variables: runtime.variables,\n history: runtime.history,\n toolRegistry: runtime.toolRegistry,\n strict: runtime.strict,\n },\n );\n const openrouterOptions = resolvedAsset.provider_options?.openrouter;\n let body = { ...result.body };\n\n if (openrouterOptions?.provider !== undefined) body.provider = openrouterOptions.provider;\n if (openrouterOptions?.transforms !== undefined) body.transforms = openrouterOptions.transforms;\n if (openrouterOptions?.plugins !== undefined) body.plugins = openrouterOptions.plugins;\n if (openrouterOptions?.models !== undefined) body.models = openrouterOptions.models;\n if (body.model === undefined) delete body.model;\n\n body = applyRawProviderBody(body, resolvedAsset, 'openrouter');\n\n return {\n ...result,\n body,\n provider: 'openrouter',\n model: resolvedAsset.model ?? openrouterOptions?.models?.[0] ?? 'unknown',\n };\n },\n});\n"],"mappings":";;;;;;;;;;AAkBO,IAAM,oBAAqC,uBAAuB;AAAA,EACvE,MAAM;AAAA,EAEN,SAAS,OAA4B,SAAkD;AACrF,UAAM,gBAAgB,wBAAwB,OAAO,OAAO;AAC5D,UAAM,aAAa,cAAc,SAAS,OAAO,OAAO;AACxD,UAAM,uBAAuB,cAAc,kBAAkB,YAAY,QAAQ,UAAU,KAAK;AAEhG,QAAI,CAAC,qBAAqB;AACxB,aAAO;AAAA,IACT;AAEA,UAAM,qBAAqB;AAC3B,UAAM,SAAS,WAAW,OAAO,OAAO,CAAC,UAAU,UAAU,kBAAkB;AAC/E,UAAM,WAAW,WAAW,SAAS,OAAO,CAAC,YAAY,YAAY,kBAAkB;AAEvF,WAAO;AAAA,MACL,OAAO,OAAO,WAAW;AAAA,MACzB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,OAA4B,SAAgD;AACjF,UAAM,gBAAgB,wBAAwB,OAAO,OAAO;AAC5D,UAAM,SAAS,cAAc;AAAA,MAC3B,EAAE,GAAG,eAAe,KAAK,OAAU;AAAA,MACnC;AAAA,QACE,WAAW,QAAQ;AAAA,QACnB,SAAS,QAAQ;AAAA,QACjB,cAAc,QAAQ;AAAA,QACtB,QAAQ,QAAQ;AAAA,MAClB;AAAA,IACF;AACA,UAAM,oBAAoB,cAAc,kBAAkB;AAC1D,QAAI,OAAO,EAAE,GAAG,OAAO,KAAK;AAE5B,QAAI,mBAAmB,aAAa,OAAW,MAAK,WAAW,kBAAkB;AACjF,QAAI,mBAAmB,eAAe,OAAW,MAAK,aAAa,kBAAkB;AACrF,QAAI,mBAAmB,YAAY,OAAW,MAAK,UAAU,kBAAkB;AAC/E,QAAI,mBAAmB,WAAW,OAAW,MAAK,SAAS,kBAAkB;AAC7E,QAAI,KAAK,UAAU,OAAW,QAAO,KAAK;AAE1C,WAAO,qBAAqB,MAAM,eAAe,YAAY;AAE7D,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,MACA,UAAU;AAAA,MACV,OAAO,cAAc,SAAS,mBAAmB,SAAS,CAAC,KAAK;AAAA,IAClE;AAAA,EACF;AACF,CAAC;","names":[]}
|