promptopskit 0.2.6 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/README.md +89 -0
  2. package/SKILL.md +49 -0
  3. package/dist/{chunk-PU3UPUND.js → chunk-DDXFDVA6.js} +4 -4
  4. package/dist/{chunk-PU3UPUND.js.map → chunk-DDXFDVA6.js.map} +1 -1
  5. package/dist/chunk-DGFBS7YW.js +101 -0
  6. package/dist/chunk-DGFBS7YW.js.map +1 -0
  7. package/dist/chunk-HWEVRBKZ.js +387 -0
  8. package/dist/chunk-HWEVRBKZ.js.map +1 -0
  9. package/dist/{chunk-5BI5FP5L.js → chunk-LNZS3TIJ.js} +21 -18
  10. package/dist/chunk-LNZS3TIJ.js.map +1 -0
  11. package/dist/{chunk-VYVEVJC3.js → chunk-LRRSI4ON.js} +25 -22
  12. package/dist/chunk-LRRSI4ON.js.map +1 -0
  13. package/dist/chunk-Y2YYEGOY.js +86 -0
  14. package/dist/chunk-Y2YYEGOY.js.map +1 -0
  15. package/dist/cli/index.js +66 -40
  16. package/dist/cli/index.js.map +1 -1
  17. package/dist/index.cjs +479 -61
  18. package/dist/index.cjs.map +1 -1
  19. package/dist/index.d.cts +8 -4
  20. package/dist/index.d.ts +8 -4
  21. package/dist/index.js +41 -40
  22. package/dist/index.js.map +1 -1
  23. package/dist/providers/anthropic.cjs +64 -19
  24. package/dist/providers/anthropic.cjs.map +1 -1
  25. package/dist/providers/anthropic.d.cts +2 -2
  26. package/dist/providers/anthropic.d.ts +2 -2
  27. package/dist/providers/anthropic.js +2 -2
  28. package/dist/providers/gemini.cjs +60 -15
  29. package/dist/providers/gemini.cjs.map +1 -1
  30. package/dist/providers/gemini.d.cts +2 -2
  31. package/dist/providers/gemini.d.ts +2 -2
  32. package/dist/providers/gemini.js +2 -2
  33. package/dist/providers/openai.cjs +64 -19
  34. package/dist/providers/openai.cjs.map +1 -1
  35. package/dist/providers/openai.d.cts +2 -2
  36. package/dist/providers/openai.d.ts +2 -2
  37. package/dist/providers/openai.js +2 -2
  38. package/dist/providers/openrouter.cjs +66 -21
  39. package/dist/providers/openrouter.cjs.map +1 -1
  40. package/dist/providers/openrouter.d.cts +2 -2
  41. package/dist/providers/openrouter.d.ts +2 -2
  42. package/dist/providers/openrouter.js +3 -3
  43. package/dist/testing.d.cts +1 -1
  44. package/dist/testing.d.ts +1 -1
  45. package/dist/{types-BUzJB5p_.d.cts → types-BsYdPHTU.d.ts} +5 -2
  46. package/dist/{types-DM0-tThJ.d.ts → types-DC-jI6iV.d.cts} +5 -2
  47. package/dist/usagetap/index.cjs +425 -0
  48. package/dist/usagetap/index.cjs.map +1 -0
  49. package/dist/usagetap/index.d.cts +147 -0
  50. package/dist/usagetap/index.d.ts +147 -0
  51. package/dist/usagetap/index.js +31 -0
  52. package/dist/usagetap/index.js.map +1 -0
  53. package/package.json +11 -1
  54. package/dist/chunk-5BI5FP5L.js.map +0 -1
  55. package/dist/chunk-6KGBPHSY.js +0 -56
  56. package/dist/chunk-6KGBPHSY.js.map +0 -1
  57. package/dist/chunk-UYTUGV7Z.js +0 -83
  58. package/dist/chunk-UYTUGV7Z.js.map +0 -1
  59. package/dist/chunk-VYVEVJC3.js.map +0 -1
  60. package/dist/{schema-DJ7C8Q6y.d.cts → schema-Dq0jKest.d.cts} +13 -13
  61. package/dist/{schema-DJ7C8Q6y.d.ts → schema-Dq0jKest.d.ts} +13 -13
@@ -0,0 +1,387 @@
1
+ // src/usagetap/client.ts
2
+ var DEFAULT_BASE_URL = "https://api.usagetap.com";
3
+ var ACCEPT_HEADER = "application/vnd.usagetap.v1+json";
4
+ function createUsageTapHttpError(status, body) {
5
+ const error = new Error(`UsageTap request failed with status ${status}`);
6
+ error.statusCode = status;
7
+ error.body = body;
8
+ return error;
9
+ }
10
+ function createUsageTapClient(config) {
11
+ const fetchImpl = config.fetch ?? globalThis.fetch;
12
+ if (!fetchImpl) {
13
+ throw new Error("Fetch API is not available. Provide config.fetch when creating the UsageTap client.");
14
+ }
15
+ const baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\/$/, "");
16
+ async function request(path, body, init = {}) {
17
+ const response = await fetchImpl(`${baseUrl}${path}`, {
18
+ method: "POST",
19
+ headers: {
20
+ Authorization: `Bearer ${config.apiKey}`,
21
+ Accept: ACCEPT_HEADER,
22
+ "Content-Type": "application/json"
23
+ },
24
+ body: JSON.stringify(body),
25
+ signal: init.signal
26
+ });
27
+ const text = await response.text();
28
+ const parsed = text ? JSON.parse(text) : {};
29
+ if (!response.ok) {
30
+ throw createUsageTapHttpError(response.status, parsed);
31
+ }
32
+ return parsed;
33
+ }
34
+ return {
35
+ request,
36
+ beginCall(begin, init) {
37
+ return request("/call_begin", begin, init);
38
+ },
39
+ endCall(end, init) {
40
+ return request("/call_end", end, init);
41
+ }
42
+ };
43
+ }
44
+
45
+ // src/usagetap/lifecycle.ts
46
+ function isObject(value) {
47
+ return typeof value === "object" && value !== null;
48
+ }
49
+ function isInvokeResult(value) {
50
+ return isObject(value) && "result" in value && "usage" in value;
51
+ }
52
+ function getErrorStatusCode(error) {
53
+ if (!isObject(error)) {
54
+ return void 0;
55
+ }
56
+ if (typeof error.statusCode === "number") {
57
+ return error.statusCode;
58
+ }
59
+ if (typeof error.status === "number") {
60
+ return error.status;
61
+ }
62
+ if (isObject(error.response) && typeof error.response.status === "number") {
63
+ return error.response.status;
64
+ }
65
+ return void 0;
66
+ }
67
+ function attachEndErrorCause(thrownError, endError) {
68
+ if (thrownError instanceof Error) {
69
+ if (thrownError.cause === void 0) {
70
+ Object.defineProperty(thrownError, "cause", {
71
+ value: endError,
72
+ configurable: true,
73
+ writable: true
74
+ });
75
+ }
76
+ throw thrownError;
77
+ }
78
+ throw new AggregateError([thrownError, endError], "Vendor call failed and UsageTap call_end also failed.");
79
+ }
80
+ function defaultUsageTapErrorMapper(error) {
81
+ return {
82
+ code: "VENDOR_ERROR",
83
+ message: String(error)
84
+ };
85
+ }
86
+ function beginUsageTapCall(client, begin, init) {
87
+ return client.beginCall(begin, init);
88
+ }
89
+ function endUsageTapCall(client, end, init) {
90
+ return client.endCall(end, init);
91
+ }
92
+ async function withUsageTapCall(client, options) {
93
+ const begin = await beginUsageTapCall(client, options.begin, { signal: options.signal });
94
+ const onError = options.onError ?? defaultUsageTapErrorMapper;
95
+ let result;
96
+ let usage;
97
+ let thrownError;
98
+ const setUsage = (nextUsage) => {
99
+ usage = { ...usage, ...nextUsage };
100
+ };
101
+ try {
102
+ const invoked = await options.invoke({
103
+ begin,
104
+ setUsage,
105
+ signal: options.signal
106
+ });
107
+ if (isInvokeResult(invoked)) {
108
+ result = invoked.result;
109
+ setUsage(invoked.usage);
110
+ } else {
111
+ result = invoked;
112
+ }
113
+ } catch (error) {
114
+ thrownError = error;
115
+ }
116
+ const effectiveUsage = {
117
+ ...usage
118
+ };
119
+ if (thrownError) {
120
+ effectiveUsage.error = effectiveUsage.error ?? onError(thrownError);
121
+ effectiveUsage.responseStatusCode = effectiveUsage.responseStatusCode ?? getErrorStatusCode(thrownError);
122
+ } else {
123
+ effectiveUsage.responseStatusCode = effectiveUsage.responseStatusCode ?? 200;
124
+ }
125
+ let end;
126
+ try {
127
+ end = await endUsageTapCall(client, {
128
+ callId: begin.data.callId,
129
+ ...effectiveUsage
130
+ }, { signal: options.signal });
131
+ } catch (endError) {
132
+ if (thrownError) {
133
+ attachEndErrorCause(thrownError, endError);
134
+ }
135
+ throw endError;
136
+ }
137
+ if (thrownError) {
138
+ throw thrownError;
139
+ }
140
+ return {
141
+ result,
142
+ begin,
143
+ end,
144
+ effectiveUsage
145
+ };
146
+ }
147
+
148
+ // src/usagetap/providers.ts
149
+ function cloneRequest(request) {
150
+ return structuredClone(request);
151
+ }
152
+ function isObject2(value) {
153
+ return typeof value === "object" && value !== null;
154
+ }
155
+ function isRecordArray(value) {
156
+ return Array.isArray(value) && value.every((item) => isObject2(item));
157
+ }
158
+ function isInvokeResult2(value) {
159
+ return isObject2(value) && "result" in value && "usage" in value;
160
+ }
161
+ function capabilityAllowed(allowed, capability) {
162
+ return allowed[capability] !== false;
163
+ }
164
+ function reasoningLevelOrder(level) {
165
+ switch (level) {
166
+ case "HIGH":
167
+ return 3;
168
+ case "MEDIUM":
169
+ return 2;
170
+ case "LOW":
171
+ return 1;
172
+ default:
173
+ return 0;
174
+ }
175
+ }
176
+ function capOpenAIReasoning(body, allowed) {
177
+ if (typeof body.reasoning_effort !== "string") {
178
+ return;
179
+ }
180
+ const current = String(body.reasoning_effort).toUpperCase();
181
+ const allowedLevel = allowed.reasoningLevel ?? "HIGH";
182
+ if (allowedLevel === "NONE") {
183
+ delete body.reasoning_effort;
184
+ return;
185
+ }
186
+ if (reasoningLevelOrder(current) > reasoningLevelOrder(allowedLevel)) {
187
+ body.reasoning_effort = allowedLevel.toLowerCase();
188
+ }
189
+ }
190
+ function capGeminiReasoning(body, allowed) {
191
+ if (allowed.reasoningLevel === "NONE") {
192
+ delete body.thinkingConfig;
193
+ return;
194
+ }
195
+ const budgets = {
196
+ LOW: 1024,
197
+ MEDIUM: 4096,
198
+ HIGH: 8192
199
+ };
200
+ const allowedBudget = allowed.reasoningLevel ? budgets[allowed.reasoningLevel] : void 0;
201
+ if (allowedBudget === void 0) {
202
+ return;
203
+ }
204
+ if (!isObject2(body.thinkingConfig)) {
205
+ body.thinkingConfig = { thinkingBudget: allowedBudget };
206
+ return;
207
+ }
208
+ const thinkingConfig = body.thinkingConfig;
209
+ if (typeof thinkingConfig.thinkingBudget === "number") {
210
+ thinkingConfig.thinkingBudget = Math.min(thinkingConfig.thinkingBudget, allowedBudget);
211
+ return;
212
+ }
213
+ thinkingConfig.thinkingBudget = allowedBudget;
214
+ }
215
+ function applyModelTier(request, allowed, options) {
216
+ const nextModel = allowed.premium && options.modelTiers?.premium ? options.modelTiers.premium : allowed.standard && options.modelTiers?.standard ? options.modelTiers.standard : void 0;
217
+ if (!nextModel) {
218
+ return;
219
+ }
220
+ request.model = nextModel;
221
+ if (isObject2(request.body) && "model" in request.body) {
222
+ request.body.model = nextModel;
223
+ }
224
+ }
225
+ function filterOpenAITools(tools, allowed, options) {
226
+ return tools.filter((tool) => {
227
+ if (tool.type === "web_search" && allowed.search === false) {
228
+ return false;
229
+ }
230
+ const functionDef = isObject2(tool.function) ? tool.function : void 0;
231
+ const name = typeof functionDef?.name === "string" ? functionDef.name : typeof tool.name === "string" ? tool.name : typeof tool.type === "string" ? tool.type : void 0;
232
+ if (!name) {
233
+ return true;
234
+ }
235
+ const capability = options.toolEntitlements?.[name];
236
+ return capability ? capabilityAllowed(allowed, capability) : true;
237
+ });
238
+ }
239
+ function filterAnthropicTools(tools, allowed, options) {
240
+ return tools.filter((tool) => {
241
+ const name = typeof tool.name === "string" ? tool.name : void 0;
242
+ if (!name) {
243
+ return true;
244
+ }
245
+ const capability = options.toolEntitlements?.[name];
246
+ return capability ? capabilityAllowed(allowed, capability) : true;
247
+ });
248
+ }
249
+ function filterGeminiTools(tools, allowed, options) {
250
+ return tools.map((tool) => {
251
+ const declarations = Array.isArray(tool.functionDeclarations) ? tool.functionDeclarations.filter((declaration) => {
252
+ if (!isObject2(declaration) || typeof declaration.name !== "string") {
253
+ return true;
254
+ }
255
+ const capability = options.toolEntitlements?.[declaration.name];
256
+ return capability ? capabilityAllowed(allowed, capability) : true;
257
+ }) : tool.functionDeclarations;
258
+ return {
259
+ ...tool,
260
+ functionDeclarations: declarations
261
+ };
262
+ }).filter((tool) => {
263
+ if (!Array.isArray(tool.functionDeclarations)) {
264
+ return true;
265
+ }
266
+ return tool.functionDeclarations.length > 0;
267
+ });
268
+ }
269
+ function applyUsageTapEntitlements(request, begin, options = {}) {
270
+ const nextRequest = cloneRequest(request);
271
+ const allowed = begin.data.allowed ?? {};
272
+ applyModelTier(nextRequest, allowed, options);
273
+ if (!isObject2(nextRequest.body)) {
274
+ return nextRequest;
275
+ }
276
+ if (nextRequest.provider === "openai" || nextRequest.provider === "openrouter") {
277
+ capOpenAIReasoning(nextRequest.body, allowed);
278
+ if (isRecordArray(nextRequest.body.tools)) {
279
+ nextRequest.body.tools = filterOpenAITools(nextRequest.body.tools, allowed, options);
280
+ }
281
+ return nextRequest;
282
+ }
283
+ if (nextRequest.provider === "gemini") {
284
+ capGeminiReasoning(nextRequest.body, allowed);
285
+ if (isRecordArray(nextRequest.body.tools)) {
286
+ nextRequest.body.tools = filterGeminiTools(nextRequest.body.tools, allowed, options);
287
+ }
288
+ return nextRequest;
289
+ }
290
+ if (nextRequest.provider === "anthropic" && isRecordArray(nextRequest.body.tools)) {
291
+ nextRequest.body.tools = filterAnthropicTools(nextRequest.body.tools, allowed, options);
292
+ }
293
+ return nextRequest;
294
+ }
295
+ function extractOpenAIUsage(response, meta = {}) {
296
+ const usage = isObject2(response) && isObject2(response.usage) ? response.usage : {};
297
+ const promptDetails = isObject2(usage.prompt_tokens_details) ? usage.prompt_tokens_details : {};
298
+ const completionDetails = isObject2(usage.completion_tokens_details) ? usage.completion_tokens_details : {};
299
+ return {
300
+ modelUsed: meta.modelUsed,
301
+ inputTokens: typeof usage.prompt_tokens === "number" ? usage.prompt_tokens : 0,
302
+ responseTokens: typeof usage.completion_tokens === "number" ? usage.completion_tokens : 0,
303
+ cachedInputTokens: typeof promptDetails.cached_tokens === "number" ? promptDetails.cached_tokens : void 0,
304
+ reasoningTokens: typeof completionDetails.reasoning_tokens === "number" ? completionDetails.reasoning_tokens : void 0,
305
+ responseStatusCode: meta.responseStatusCode ?? 200
306
+ };
307
+ }
308
+ function extractAnthropicUsage(response, meta = {}) {
309
+ const usage = isObject2(response) && isObject2(response.usage) ? response.usage : {};
310
+ return {
311
+ modelUsed: meta.modelUsed,
312
+ inputTokens: typeof usage.input_tokens === "number" ? usage.input_tokens : 0,
313
+ responseTokens: typeof usage.output_tokens === "number" ? usage.output_tokens : 0,
314
+ cachedInputTokens: typeof usage.cache_read_input_tokens === "number" ? usage.cache_read_input_tokens : void 0,
315
+ responseStatusCode: meta.responseStatusCode ?? 200
316
+ };
317
+ }
318
+ function extractGeminiUsage(response, meta = {}) {
319
+ const usage = isObject2(response) && isObject2(response.usageMetadata) ? response.usageMetadata : {};
320
+ return {
321
+ modelUsed: meta.modelUsed,
322
+ inputTokens: typeof usage.promptTokenCount === "number" ? usage.promptTokenCount : 0,
323
+ responseTokens: typeof usage.candidatesTokenCount === "number" ? usage.candidatesTokenCount : 0,
324
+ cachedInputTokens: typeof usage.cachedContentTokenCount === "number" ? usage.cachedContentTokenCount : void 0,
325
+ reasoningTokens: typeof usage.thoughtsTokenCount === "number" ? usage.thoughtsTokenCount : void 0,
326
+ responseStatusCode: meta.responseStatusCode ?? 200
327
+ };
328
+ }
329
+ async function runProviderWithUsageTap(client, options, defaultExtractor) {
330
+ let requestUsed = cloneRequest(options.request);
331
+ const lifecycle = await withUsageTapCall(client, {
332
+ begin: options.begin,
333
+ signal: options.signal,
334
+ onError: options.onError ?? defaultUsageTapErrorMapper,
335
+ invoke: async ({ begin, setUsage }) => {
336
+ requestUsed = options.entitlementMode === "apply" ? applyUsageTapEntitlements(options.request, begin, options) : cloneRequest(options.request);
337
+ const invoked = await options.invoke(requestUsed);
338
+ if (isInvokeResult2(invoked)) {
339
+ return invoked;
340
+ }
341
+ const response = invoked;
342
+ const usage = (options.extractUsage ?? defaultExtractor)(response, {
343
+ modelUsed: requestUsed.model,
344
+ responseStatusCode: 200
345
+ });
346
+ setUsage(usage);
347
+ return response;
348
+ }
349
+ });
350
+ return {
351
+ response: lifecycle.result,
352
+ begin: lifecycle.begin,
353
+ end: lifecycle.end,
354
+ requestUsed,
355
+ effectiveUsage: lifecycle.effectiveUsage,
356
+ allowed: lifecycle.begin.data.allowed ?? {}
357
+ };
358
+ }
359
+ function runOpenAIWithUsageTap(client, options) {
360
+ return runProviderWithUsageTap(client, options, extractOpenAIUsage);
361
+ }
362
+ function runOpenRouterWithUsageTap(client, options) {
363
+ return runProviderWithUsageTap(client, options, extractOpenAIUsage);
364
+ }
365
+ function runAnthropicWithUsageTap(client, options) {
366
+ return runProviderWithUsageTap(client, options, extractAnthropicUsage);
367
+ }
368
+ function runGeminiWithUsageTap(client, options) {
369
+ return runProviderWithUsageTap(client, options, extractGeminiUsage);
370
+ }
371
+
372
+ export {
373
+ createUsageTapClient,
374
+ defaultUsageTapErrorMapper,
375
+ beginUsageTapCall,
376
+ endUsageTapCall,
377
+ withUsageTapCall,
378
+ applyUsageTapEntitlements,
379
+ extractOpenAIUsage,
380
+ extractAnthropicUsage,
381
+ extractGeminiUsage,
382
+ runOpenAIWithUsageTap,
383
+ runOpenRouterWithUsageTap,
384
+ runAnthropicWithUsageTap,
385
+ runGeminiWithUsageTap
386
+ };
387
+ //# sourceMappingURL=chunk-HWEVRBKZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/usagetap/client.ts","../src/usagetap/lifecycle.ts","../src/usagetap/providers.ts"],"sourcesContent":["import type {\n UsageTapBeginRequest,\n UsageTapBeginResponse,\n UsageTapClient,\n UsageTapClientConfig,\n UsageTapEndRequest,\n UsageTapEndResponse,\n UsageTapRequestInit,\n} from './types.js';\n\nconst DEFAULT_BASE_URL = 'https://api.usagetap.com';\nconst ACCEPT_HEADER = 'application/vnd.usagetap.v1+json';\n\nfunction createUsageTapHttpError(status: number, body: unknown): Error & { statusCode: number; body: unknown } {\n const error = new Error(`UsageTap request failed with status ${status}`) as Error & {\n statusCode: number;\n body: unknown;\n };\n error.statusCode = status;\n error.body = body;\n return error;\n}\n\nexport function createUsageTapClient(config: UsageTapClientConfig): UsageTapClient {\n const fetchImpl = config.fetch ?? globalThis.fetch;\n\n if (!fetchImpl) {\n throw new Error('Fetch API is not available. Provide config.fetch when creating the UsageTap client.');\n }\n\n const baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, '');\n\n async function request<T>(path: string, body: unknown, init: UsageTapRequestInit = {}): Promise<T> {\n const response = await fetchImpl(`${baseUrl}${path}`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${config.apiKey}`,\n Accept: ACCEPT_HEADER,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n signal: init.signal,\n });\n\n const text = await response.text();\n const parsed = text ? JSON.parse(text) as unknown : {};\n\n if (!response.ok) {\n throw createUsageTapHttpError(response.status, parsed);\n }\n\n return parsed as T;\n }\n\n return {\n request,\n beginCall(begin: UsageTapBeginRequest, init?: UsageTapRequestInit): Promise<UsageTapBeginResponse> {\n return request<UsageTapBeginResponse>('/call_begin', begin, init);\n },\n endCall(end: UsageTapEndRequest, init?: UsageTapRequestInit): Promise<UsageTapEndResponse> {\n return request<UsageTapEndResponse>('/call_end', end, init);\n },\n };\n}\n","import type {\n UsageTapCallOptions,\n UsageTapCallResult,\n UsageTapClient,\n UsageTapEndRequest,\n UsageTapEndUsage,\n UsageTapErrorPayload,\n UsageTapInvokeResult,\n UsageTapRequestInit,\n} from './types.js';\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction isInvokeResult<TResult>(value: TResult | UsageTapInvokeResult<TResult>): value is UsageTapInvokeResult<TResult> {\n return isObject(value) && 'result' in value && 'usage' in value;\n}\n\nfunction getErrorStatusCode(error: unknown): number | undefined {\n if (!isObject(error)) {\n return undefined;\n }\n\n if (typeof error.statusCode === 'number') {\n return error.statusCode;\n }\n\n if (typeof error.status === 'number') {\n return error.status;\n }\n\n if (isObject(error.response) && typeof error.response.status === 'number') {\n return error.response.status;\n }\n\n return undefined;\n}\n\nfunction attachEndErrorCause(thrownError: unknown, endError: unknown): never {\n if (thrownError instanceof Error) {\n if (thrownError.cause === undefined) {\n Object.defineProperty(thrownError, 'cause', {\n value: endError,\n configurable: true,\n writable: true,\n });\n }\n\n throw thrownError;\n }\n\n throw new AggregateError([thrownError, endError], 'Vendor call failed and UsageTap call_end also failed.');\n}\n\nexport function defaultUsageTapErrorMapper(error: unknown): UsageTapErrorPayload {\n return {\n code: 'VENDOR_ERROR',\n message: String(error),\n };\n}\n\nexport function beginUsageTapCall(client: UsageTapClient, begin: Parameters<UsageTapClient['beginCall']>[0], init?: UsageTapRequestInit) {\n return client.beginCall(begin, init);\n}\n\nexport function endUsageTapCall(client: UsageTapClient, end: UsageTapEndRequest, init?: UsageTapRequestInit) {\n return client.endCall(end, init);\n}\n\nexport async function withUsageTapCall<TResult>(\n client: UsageTapClient,\n options: UsageTapCallOptions<TResult>,\n): Promise<UsageTapCallResult<TResult>> {\n const begin = await beginUsageTapCall(client, options.begin, { signal: options.signal });\n const onError = options.onError ?? defaultUsageTapErrorMapper;\n\n let result: TResult | undefined;\n let usage: UsageTapEndUsage | undefined;\n let thrownError: unknown;\n\n const setUsage = (nextUsage: UsageTapEndUsage): void => {\n usage = { ...usage, ...nextUsage };\n };\n\n try {\n const invoked = await options.invoke({\n begin,\n setUsage,\n signal: options.signal,\n });\n\n if (isInvokeResult(invoked)) {\n result = invoked.result;\n setUsage(invoked.usage);\n } else {\n result = invoked;\n }\n } catch (error) {\n thrownError = error;\n }\n\n const effectiveUsage: UsageTapEndUsage = {\n ...usage,\n };\n\n if (thrownError) {\n effectiveUsage.error = effectiveUsage.error ?? onError(thrownError);\n effectiveUsage.responseStatusCode = effectiveUsage.responseStatusCode ?? getErrorStatusCode(thrownError);\n } else {\n effectiveUsage.responseStatusCode = effectiveUsage.responseStatusCode ?? 200;\n }\n\n let end;\n try {\n end = await endUsageTapCall(client, {\n callId: begin.data.callId,\n ...effectiveUsage,\n }, { signal: options.signal });\n } catch (endError) {\n if (thrownError) {\n attachEndErrorCause(thrownError, endError);\n }\n throw endError;\n }\n\n if (thrownError) {\n throw thrownError;\n }\n\n return {\n result: result as TResult,\n begin,\n end,\n effectiveUsage,\n };\n}\n","import type { ProviderRequest } from '../providers/types.js';\nimport { defaultUsageTapErrorMapper, withUsageTapCall } from './lifecycle.js';\nimport type {\n UsageTapAllowed,\n UsageTapAllowedCapability,\n UsageTapBeginResponse,\n UsageTapClient,\n UsageTapEndUsage,\n UsageTapEntitlementOptions,\n UsageTapProviderRunOptions,\n UsageTapProviderRunResult,\n UsageTapReasoningLevel,\n} from './types.js';\n\nfunction cloneRequest(request: ProviderRequest): ProviderRequest {\n return structuredClone(request);\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction isRecordArray(value: unknown): value is Array<Record<string, unknown>> {\n return Array.isArray(value) && value.every((item) => isObject(item));\n}\n\nfunction isInvokeResult<TResult>(value: unknown): value is { result: TResult; usage: UsageTapEndUsage } {\n return isObject(value) && 'result' in value && 'usage' in value;\n}\n\nfunction capabilityAllowed(allowed: UsageTapAllowed, capability: UsageTapAllowedCapability): boolean {\n return allowed[capability] !== false;\n}\n\nfunction reasoningLevelOrder(level: UsageTapReasoningLevel | undefined): number {\n switch (level) {\n case 'HIGH':\n return 3;\n case 'MEDIUM':\n return 2;\n case 'LOW':\n return 1;\n default:\n return 0;\n }\n}\n\nfunction capOpenAIReasoning(body: Record<string, unknown>, allowed: UsageTapAllowed): void {\n if (typeof body.reasoning_effort !== 'string') {\n return;\n }\n\n const current = String(body.reasoning_effort).toUpperCase() as UsageTapReasoningLevel;\n const allowedLevel = allowed.reasoningLevel ?? 'HIGH';\n\n if (allowedLevel === 'NONE') {\n delete body.reasoning_effort;\n return;\n }\n\n if (reasoningLevelOrder(current) > reasoningLevelOrder(allowedLevel)) {\n body.reasoning_effort = allowedLevel.toLowerCase();\n }\n}\n\nfunction capGeminiReasoning(body: Record<string, unknown>, allowed: UsageTapAllowed): void {\n if (allowed.reasoningLevel === 'NONE') {\n delete body.thinkingConfig;\n return;\n }\n\n const budgets: Record<Exclude<UsageTapReasoningLevel, 'NONE'>, number> = {\n LOW: 1024,\n MEDIUM: 4096,\n HIGH: 8192,\n };\n\n const allowedBudget = allowed.reasoningLevel ? budgets[allowed.reasoningLevel as Exclude<UsageTapReasoningLevel, 'NONE'>] : undefined;\n\n if (allowedBudget === undefined) {\n return;\n }\n\n if (!isObject(body.thinkingConfig)) {\n body.thinkingConfig = { thinkingBudget: allowedBudget };\n return;\n }\n\n const thinkingConfig = body.thinkingConfig;\n\n if (typeof thinkingConfig.thinkingBudget === 'number') {\n thinkingConfig.thinkingBudget = Math.min(thinkingConfig.thinkingBudget, allowedBudget);\n return;\n }\n\n thinkingConfig.thinkingBudget = allowedBudget;\n}\n\nfunction applyModelTier(request: ProviderRequest, allowed: UsageTapAllowed, options: UsageTapEntitlementOptions): void {\n const nextModel = allowed.premium && options.modelTiers?.premium\n ? options.modelTiers.premium\n : allowed.standard && options.modelTiers?.standard\n ? options.modelTiers.standard\n : undefined;\n\n if (!nextModel) {\n return;\n }\n\n request.model = nextModel;\n if (isObject(request.body) && 'model' in request.body) {\n request.body.model = nextModel;\n }\n}\n\nfunction filterOpenAITools(tools: Array<Record<string, unknown>>, allowed: UsageTapAllowed, options: UsageTapEntitlementOptions): Array<Record<string, unknown>> {\n return tools.filter((tool) => {\n if (tool.type === 'web_search' && allowed.search === false) {\n return false;\n }\n\n const functionDef = isObject(tool.function) ? tool.function : undefined;\n const name = typeof functionDef?.name === 'string'\n ? functionDef.name\n : typeof tool.name === 'string'\n ? tool.name\n : typeof tool.type === 'string'\n ? tool.type\n : undefined;\n\n if (!name) {\n return true;\n }\n\n const capability = options.toolEntitlements?.[name];\n return capability ? capabilityAllowed(allowed, capability) : true;\n });\n}\n\nfunction filterAnthropicTools(tools: Array<Record<string, unknown>>, allowed: UsageTapAllowed, options: UsageTapEntitlementOptions): Array<Record<string, unknown>> {\n return tools.filter((tool) => {\n const name = typeof tool.name === 'string' ? tool.name : undefined;\n if (!name) {\n return true;\n }\n const capability = options.toolEntitlements?.[name];\n return capability ? capabilityAllowed(allowed, capability) : true;\n });\n}\n\nfunction filterGeminiTools(tools: Array<Record<string, unknown>>, allowed: UsageTapAllowed, options: UsageTapEntitlementOptions): Array<Record<string, unknown>> {\n return tools\n .map((tool) => {\n const declarations = Array.isArray(tool.functionDeclarations)\n ? tool.functionDeclarations.filter((declaration) => {\n if (!isObject(declaration) || typeof declaration.name !== 'string') {\n return true;\n }\n const capability = options.toolEntitlements?.[declaration.name];\n return capability ? capabilityAllowed(allowed, capability) : true;\n })\n : tool.functionDeclarations;\n\n return {\n ...tool,\n functionDeclarations: declarations,\n };\n })\n .filter((tool) => {\n if (!Array.isArray(tool.functionDeclarations)) {\n return true;\n }\n return tool.functionDeclarations.length > 0;\n });\n}\n\nexport function applyUsageTapEntitlements(\n request: ProviderRequest,\n begin: UsageTapBeginResponse,\n options: UsageTapEntitlementOptions = {},\n): ProviderRequest {\n const nextRequest = cloneRequest(request);\n const allowed = begin.data.allowed ?? {};\n\n applyModelTier(nextRequest, allowed, options);\n\n if (!isObject(nextRequest.body)) {\n return nextRequest;\n }\n\n if (nextRequest.provider === 'openai' || nextRequest.provider === 'openrouter') {\n capOpenAIReasoning(nextRequest.body, allowed);\n if (isRecordArray(nextRequest.body.tools)) {\n nextRequest.body.tools = filterOpenAITools(nextRequest.body.tools, allowed, options);\n }\n return nextRequest;\n }\n\n if (nextRequest.provider === 'gemini') {\n capGeminiReasoning(nextRequest.body, allowed);\n if (isRecordArray(nextRequest.body.tools)) {\n nextRequest.body.tools = filterGeminiTools(nextRequest.body.tools, allowed, options);\n }\n return nextRequest;\n }\n\n if (nextRequest.provider === 'anthropic' && isRecordArray(nextRequest.body.tools)) {\n nextRequest.body.tools = filterAnthropicTools(nextRequest.body.tools, allowed, options);\n }\n\n return nextRequest;\n}\n\ninterface UsageMeta {\n modelUsed?: string;\n responseStatusCode?: number;\n}\n\nexport function extractOpenAIUsage(response: unknown, meta: UsageMeta = {}): UsageTapEndUsage {\n const usage = isObject(response) && isObject(response.usage) ? response.usage : {};\n const promptDetails = isObject(usage.prompt_tokens_details) ? usage.prompt_tokens_details : {};\n const completionDetails = isObject(usage.completion_tokens_details) ? usage.completion_tokens_details : {};\n\n return {\n modelUsed: meta.modelUsed,\n inputTokens: typeof usage.prompt_tokens === 'number' ? usage.prompt_tokens : 0,\n responseTokens: typeof usage.completion_tokens === 'number' ? usage.completion_tokens : 0,\n cachedInputTokens: typeof promptDetails.cached_tokens === 'number' ? promptDetails.cached_tokens : undefined,\n reasoningTokens: typeof completionDetails.reasoning_tokens === 'number' ? completionDetails.reasoning_tokens : undefined,\n responseStatusCode: meta.responseStatusCode ?? 200,\n };\n}\n\nexport function extractAnthropicUsage(response: unknown, meta: UsageMeta = {}): UsageTapEndUsage {\n const usage = isObject(response) && isObject(response.usage) ? response.usage : {};\n\n return {\n modelUsed: meta.modelUsed,\n inputTokens: typeof usage.input_tokens === 'number' ? usage.input_tokens : 0,\n responseTokens: typeof usage.output_tokens === 'number' ? usage.output_tokens : 0,\n cachedInputTokens: typeof usage.cache_read_input_tokens === 'number' ? usage.cache_read_input_tokens : undefined,\n responseStatusCode: meta.responseStatusCode ?? 200,\n };\n}\n\nexport function extractGeminiUsage(response: unknown, meta: UsageMeta = {}): UsageTapEndUsage {\n const usage = isObject(response) && isObject(response.usageMetadata) ? response.usageMetadata : {};\n\n return {\n modelUsed: meta.modelUsed,\n inputTokens: typeof usage.promptTokenCount === 'number' ? usage.promptTokenCount : 0,\n responseTokens: typeof usage.candidatesTokenCount === 'number' ? usage.candidatesTokenCount : 0,\n cachedInputTokens: typeof usage.cachedContentTokenCount === 'number' ? usage.cachedContentTokenCount : undefined,\n reasoningTokens: typeof usage.thoughtsTokenCount === 'number' ? usage.thoughtsTokenCount : undefined,\n responseStatusCode: meta.responseStatusCode ?? 200,\n };\n}\n\nasync function runProviderWithUsageTap<TResult>(\n client: UsageTapClient,\n options: UsageTapProviderRunOptions<TResult>,\n defaultExtractor: (response: TResult, meta: UsageMeta) => UsageTapEndUsage,\n): Promise<UsageTapProviderRunResult<TResult>> {\n let requestUsed = cloneRequest(options.request);\n\n const lifecycle = await withUsageTapCall(client, {\n begin: options.begin,\n signal: options.signal,\n onError: options.onError ?? defaultUsageTapErrorMapper,\n invoke: async ({ begin, setUsage }) => {\n requestUsed = options.entitlementMode === 'apply'\n ? applyUsageTapEntitlements(options.request, begin, options)\n : cloneRequest(options.request);\n\n const invoked = await options.invoke(requestUsed);\n\n if (isInvokeResult<TResult>(invoked)) {\n return invoked;\n }\n\n const response = invoked as TResult;\n const usage = (options.extractUsage ?? defaultExtractor)(response, {\n modelUsed: requestUsed.model,\n responseStatusCode: 200,\n });\n setUsage(usage);\n return response;\n },\n });\n\n return {\n response: lifecycle.result,\n begin: lifecycle.begin,\n end: lifecycle.end,\n requestUsed,\n effectiveUsage: lifecycle.effectiveUsage,\n allowed: lifecycle.begin.data.allowed ?? {},\n };\n}\n\nexport function runOpenAIWithUsageTap<TResult>(client: UsageTapClient, options: UsageTapProviderRunOptions<TResult>) {\n return runProviderWithUsageTap(client, options, extractOpenAIUsage);\n}\n\nexport function runOpenRouterWithUsageTap<TResult>(client: UsageTapClient, options: UsageTapProviderRunOptions<TResult>) {\n return runProviderWithUsageTap(client, options, extractOpenAIUsage);\n}\n\nexport function runAnthropicWithUsageTap<TResult>(client: UsageTapClient, options: UsageTapProviderRunOptions<TResult>) {\n return runProviderWithUsageTap(client, options, extractAnthropicUsage);\n}\n\nexport function runGeminiWithUsageTap<TResult>(client: UsageTapClient, options: UsageTapProviderRunOptions<TResult>) {\n return runProviderWithUsageTap(client, options, extractGeminiUsage);\n}\n"],"mappings":"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","names":["isObject","isInvokeResult"]}
@@ -1,26 +1,29 @@
1
1
  import {
2
- renderSections
3
- } from "./chunk-6KGBPHSY.js";
2
+ renderSections,
3
+ resolveAssetForProvider
4
+ } from "./chunk-DGFBS7YW.js";
4
5
 
5
6
  // src/providers/gemini.ts
6
7
  var geminiAdapter = {
7
8
  name: "gemini",
8
- validate(asset) {
9
+ validate(asset, runtime) {
10
+ const resolvedAsset = resolveAssetForProvider(asset, runtime);
9
11
  const errors = [];
10
12
  const warnings = [];
11
- if (!asset.model) {
13
+ if (!resolvedAsset.model) {
12
14
  errors.push("Gemini adapter requires a model to be specified.");
13
15
  }
14
- if (asset.sampling?.frequency_penalty !== void 0) {
16
+ if (resolvedAsset.sampling?.frequency_penalty !== void 0) {
15
17
  warnings.push("Gemini does not support frequency_penalty. It will be ignored.");
16
18
  }
17
- if (asset.sampling?.presence_penalty !== void 0) {
19
+ if (resolvedAsset.sampling?.presence_penalty !== void 0) {
18
20
  warnings.push("Gemini does not support presence_penalty. It will be ignored.");
19
21
  }
20
22
  return { valid: errors.length === 0, errors, warnings };
21
23
  },
22
24
  render(asset, runtime) {
23
- const sections = renderSections(asset, {
25
+ const resolvedAsset = resolveAssetForProvider(asset, runtime);
26
+ const sections = renderSections(resolvedAsset, {
24
27
  variables: runtime.variables,
25
28
  strict: runtime.strict
26
29
  });
@@ -48,23 +51,23 @@ var geminiAdapter = {
48
51
  };
49
52
  }
50
53
  const generationConfig = {};
51
- if (asset.sampling?.temperature !== void 0) generationConfig.temperature = asset.sampling.temperature;
52
- if (asset.sampling?.top_p !== void 0) generationConfig.topP = asset.sampling.top_p;
53
- if (asset.sampling?.max_output_tokens !== void 0) generationConfig.maxOutputTokens = asset.sampling.max_output_tokens;
54
- if (asset.sampling?.stop !== void 0) generationConfig.stopSequences = asset.sampling.stop;
55
- if (asset.response?.format === "json") {
54
+ if (resolvedAsset.sampling?.temperature !== void 0) generationConfig.temperature = resolvedAsset.sampling.temperature;
55
+ if (resolvedAsset.sampling?.top_p !== void 0) generationConfig.topP = resolvedAsset.sampling.top_p;
56
+ if (resolvedAsset.sampling?.max_output_tokens !== void 0) generationConfig.maxOutputTokens = resolvedAsset.sampling.max_output_tokens;
57
+ if (resolvedAsset.sampling?.stop !== void 0) generationConfig.stopSequences = resolvedAsset.sampling.stop;
58
+ if (resolvedAsset.response?.format === "json") {
56
59
  generationConfig.responseMimeType = "application/json";
57
60
  }
58
- if (asset.reasoning?.effort) {
61
+ if (resolvedAsset.reasoning?.effort) {
59
62
  body.thinkingConfig = {
60
- thinkingBudget: asset.reasoning.effort === "high" ? 8192 : asset.reasoning.effort === "medium" ? 4096 : 1024
63
+ thinkingBudget: resolvedAsset.reasoning.effort === "high" ? 8192 : resolvedAsset.reasoning.effort === "medium" ? 4096 : 1024
61
64
  };
62
65
  }
63
66
  if (Object.keys(generationConfig).length > 0) {
64
67
  body.generationConfig = generationConfig;
65
68
  }
66
- if (asset.tools && asset.tools.length > 0) {
67
- const functionDeclarations = asset.tools.map((tool) => {
69
+ if (resolvedAsset.tools && resolvedAsset.tools.length > 0) {
70
+ const functionDeclarations = resolvedAsset.tools.map((tool) => {
68
71
  if (typeof tool === "string") {
69
72
  const def = runtime.toolRegistry?.[tool];
70
73
  if (def) return def;
@@ -81,7 +84,7 @@ var geminiAdapter = {
81
84
  return {
82
85
  body,
83
86
  provider: "gemini",
84
- model: asset.model ?? "unknown"
87
+ model: resolvedAsset.model ?? "unknown"
85
88
  };
86
89
  }
87
90
  };
@@ -89,4 +92,4 @@ var geminiAdapter = {
89
92
  export {
90
93
  geminiAdapter
91
94
  };
92
- //# sourceMappingURL=chunk-5BI5FP5L.js.map
95
+ //# sourceMappingURL=chunk-LNZS3TIJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/providers/gemini.ts"],"sourcesContent":["import type { ResolvedPromptAsset } from '../schema/index.js';\nimport type {\n ProviderAdapter,\n ProviderRequest,\n ValidationResult,\n RuntimeRenderOptions,\n} from './types.js';\nimport { renderSections } from '../renderer/index.js';\nimport { resolveAssetForProvider } from './resolve-asset.js';\n\n/**\n * Google Gemini provider adapter.\n * Produces request bodies compatible with the Gemini generateContent API.\n */\nexport const geminiAdapter: ProviderAdapter = {\n name: 'gemini',\n\n validate(asset: ResolvedPromptAsset, runtime?: RuntimeRenderOptions): ValidationResult {\n const resolvedAsset = resolveAssetForProvider(asset, runtime);\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (!resolvedAsset.model) {\n errors.push('Gemini adapter requires a model to be specified.');\n }\n\n if (resolvedAsset.sampling?.frequency_penalty !== undefined) {\n warnings.push('Gemini does not support frequency_penalty. It will be ignored.');\n }\n if (resolvedAsset.sampling?.presence_penalty !== undefined) {\n warnings.push('Gemini does not support presence_penalty. It will be ignored.');\n }\n\n return { valid: errors.length === 0, errors, warnings };\n },\n\n render(asset: ResolvedPromptAsset, runtime: RuntimeRenderOptions): ProviderRequest {\n const resolvedAsset = resolveAssetForProvider(asset, runtime);\n const sections = renderSections(resolvedAsset, {\n variables: runtime.variables,\n strict: runtime.strict,\n });\n\n const contents: Array<Record<string, unknown>> = [];\n\n // History\n if (runtime.history) {\n for (const msg of runtime.history) {\n contents.push({\n role: msg.role === 'assistant' ? 'model' : 'user',\n parts: [{ text: msg.content }],\n });\n }\n }\n\n // User message (prompt template)\n if (sections.prompt_template) {\n contents.push({\n role: 'user',\n parts: [{ text: sections.prompt_template }],\n });\n }\n\n const body: Record<string, unknown> = {\n contents,\n };\n\n // System instruction\n if (sections.system_instructions) {\n body.systemInstruction = {\n parts: [{ text: sections.system_instructions }],\n };\n }\n\n // Generation config\n const generationConfig: Record<string, unknown> = {};\n\n if (resolvedAsset.sampling?.temperature !== undefined) generationConfig.temperature = resolvedAsset.sampling.temperature;\n if (resolvedAsset.sampling?.top_p !== undefined) generationConfig.topP = resolvedAsset.sampling.top_p;\n if (resolvedAsset.sampling?.max_output_tokens !== undefined) generationConfig.maxOutputTokens = resolvedAsset.sampling.max_output_tokens;\n if (resolvedAsset.sampling?.stop !== undefined) generationConfig.stopSequences = resolvedAsset.sampling.stop;\n\n if (resolvedAsset.response?.format === 'json') {\n generationConfig.responseMimeType = 'application/json';\n }\n\n // Thinking config\n if (resolvedAsset.reasoning?.effort) {\n body.thinkingConfig = {\n thinkingBudget: resolvedAsset.reasoning.effort === 'high' ? 8192 : resolvedAsset.reasoning.effort === 'medium' ? 4096 : 1024,\n };\n }\n\n if (Object.keys(generationConfig).length > 0) {\n body.generationConfig = generationConfig;\n }\n\n // Tools\n if (resolvedAsset.tools && resolvedAsset.tools.length > 0) {\n const functionDeclarations = resolvedAsset.tools.map((tool) => {\n if (typeof tool === 'string') {\n const def = runtime.toolRegistry?.[tool];\n if (def) return def;\n return { name: tool };\n }\n return {\n name: tool.name,\n description: tool.description,\n parameters: tool.input_schema,\n };\n });\n body.tools = [{ functionDeclarations }];\n }\n\n return {\n body,\n provider: 'gemini',\n model: resolvedAsset.model ?? 'unknown',\n };\n },\n};\n"],"mappings":";;;;;;AAcO,IAAM,gBAAiC;AAAA,EAC5C,MAAM;AAAA,EAEN,SAAS,OAA4B,SAAkD;AACrF,UAAM,gBAAgB,wBAAwB,OAAO,OAAO;AAC5D,UAAM,SAAmB,CAAC;AAC1B,UAAM,WAAqB,CAAC;AAE5B,QAAI,CAAC,cAAc,OAAO;AACxB,aAAO,KAAK,kDAAkD;AAAA,IAChE;AAEA,QAAI,cAAc,UAAU,sBAAsB,QAAW;AAC3D,eAAS,KAAK,gEAAgE;AAAA,IAChF;AACA,QAAI,cAAc,UAAU,qBAAqB,QAAW;AAC1D,eAAS,KAAK,+DAA+D;AAAA,IAC/E;AAEA,WAAO,EAAE,OAAO,OAAO,WAAW,GAAG,QAAQ,SAAS;AAAA,EACxD;AAAA,EAEA,OAAO,OAA4B,SAAgD;AACjF,UAAM,gBAAgB,wBAAwB,OAAO,OAAO;AAC5D,UAAM,WAAW,eAAe,eAAe;AAAA,MAC7C,WAAW,QAAQ;AAAA,MACnB,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAED,UAAM,WAA2C,CAAC;AAGlD,QAAI,QAAQ,SAAS;AACnB,iBAAW,OAAO,QAAQ,SAAS;AACjC,iBAAS,KAAK;AAAA,UACZ,MAAM,IAAI,SAAS,cAAc,UAAU;AAAA,UAC3C,OAAO,CAAC,EAAE,MAAM,IAAI,QAAQ,CAAC;AAAA,QAC/B,CAAC;AAAA,MACH;AAAA,IACF;AAGA,QAAI,SAAS,iBAAiB;AAC5B,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,OAAO,CAAC,EAAE,MAAM,SAAS,gBAAgB,CAAC;AAAA,MAC5C,CAAC;AAAA,IACH;AAEA,UAAM,OAAgC;AAAA,MACpC;AAAA,IACF;AAGA,QAAI,SAAS,qBAAqB;AAChC,WAAK,oBAAoB;AAAA,QACvB,OAAO,CAAC,EAAE,MAAM,SAAS,oBAAoB,CAAC;AAAA,MAChD;AAAA,IACF;AAGA,UAAM,mBAA4C,CAAC;AAEnD,QAAI,cAAc,UAAU,gBAAgB,OAAW,kBAAiB,cAAc,cAAc,SAAS;AAC7G,QAAI,cAAc,UAAU,UAAU,OAAW,kBAAiB,OAAO,cAAc,SAAS;AAChG,QAAI,cAAc,UAAU,sBAAsB,OAAW,kBAAiB,kBAAkB,cAAc,SAAS;AACvH,QAAI,cAAc,UAAU,SAAS,OAAW,kBAAiB,gBAAgB,cAAc,SAAS;AAExG,QAAI,cAAc,UAAU,WAAW,QAAQ;AAC7C,uBAAiB,mBAAmB;AAAA,IACtC;AAGA,QAAI,cAAc,WAAW,QAAQ;AACnC,WAAK,iBAAiB;AAAA,QACpB,gBAAgB,cAAc,UAAU,WAAW,SAAS,OAAO,cAAc,UAAU,WAAW,WAAW,OAAO;AAAA,MAC1H;AAAA,IACF;AAEA,QAAI,OAAO,KAAK,gBAAgB,EAAE,SAAS,GAAG;AAC5C,WAAK,mBAAmB;AAAA,IAC1B;AAGA,QAAI,cAAc,SAAS,cAAc,MAAM,SAAS,GAAG;AACzD,YAAM,uBAAuB,cAAc,MAAM,IAAI,CAAC,SAAS;AAC7D,YAAI,OAAO,SAAS,UAAU;AAC5B,gBAAM,MAAM,QAAQ,eAAe,IAAI;AACvC,cAAI,IAAK,QAAO;AAChB,iBAAO,EAAE,MAAM,KAAK;AAAA,QACtB;AACA,eAAO;AAAA,UACL,MAAM,KAAK;AAAA,UACX,aAAa,KAAK;AAAA,UAClB,YAAY,KAAK;AAAA,QACnB;AAAA,MACF,CAAC;AACD,WAAK,QAAQ,CAAC,EAAE,qBAAqB,CAAC;AAAA,IACxC;AAEA,WAAO;AAAA,MACL;AAAA,MACA,UAAU;AAAA,MACV,OAAO,cAAc,SAAS;AAAA,IAChC;AAAA,EACF;AACF;","names":[]}
@@ -1,29 +1,32 @@
1
1
  import {
2
- renderSections
3
- } from "./chunk-6KGBPHSY.js";
2
+ renderSections,
3
+ resolveAssetForProvider
4
+ } from "./chunk-DGFBS7YW.js";
4
5
 
5
6
  // src/providers/anthropic.ts
6
7
  var anthropicAdapter = {
7
8
  name: "anthropic",
8
- validate(asset) {
9
+ validate(asset, runtime) {
10
+ const resolvedAsset = resolveAssetForProvider(asset, runtime);
9
11
  const errors = [];
10
12
  const warnings = [];
11
- if (!asset.model) {
13
+ if (!resolvedAsset.model) {
12
14
  errors.push("Anthropic adapter requires a model to be specified.");
13
15
  }
14
- if (asset.sampling?.frequency_penalty !== void 0) {
16
+ if (resolvedAsset.sampling?.frequency_penalty !== void 0) {
15
17
  warnings.push("Anthropic does not support frequency_penalty. It will be ignored.");
16
18
  }
17
- if (asset.sampling?.presence_penalty !== void 0) {
19
+ if (resolvedAsset.sampling?.presence_penalty !== void 0) {
18
20
  warnings.push("Anthropic does not support presence_penalty. It will be ignored.");
19
21
  }
20
- if (asset.reasoning?.effort !== void 0) {
22
+ if (resolvedAsset.reasoning?.effort !== void 0) {
21
23
  warnings.push("Anthropic uses budget_tokens for thinking, not effort. effort will be mapped approximately.");
22
24
  }
23
25
  return { valid: errors.length === 0, errors, warnings };
24
26
  },
25
27
  render(asset, runtime) {
26
- const sections = renderSections(asset, {
28
+ const resolvedAsset = resolveAssetForProvider(asset, runtime);
29
+ const sections = renderSections(resolvedAsset, {
27
30
  variables: runtime.variables,
28
31
  strict: runtime.strict
29
32
  });
@@ -37,31 +40,31 @@ var anthropicAdapter = {
37
40
  messages.push({ role: "user", content: sections.prompt_template });
38
41
  }
39
42
  const body = {
40
- model: asset.model,
43
+ model: resolvedAsset.model,
41
44
  messages
42
45
  };
43
46
  if (sections.system_instructions) {
44
47
  body.system = sections.system_instructions;
45
48
  }
46
- if (asset.sampling?.temperature !== void 0) body.temperature = asset.sampling.temperature;
47
- if (asset.sampling?.top_p !== void 0) body.top_p = asset.sampling.top_p;
48
- if (asset.sampling?.stop !== void 0) body.stop_sequences = asset.sampling.stop;
49
- if (asset.sampling?.max_output_tokens !== void 0) {
50
- body.max_tokens = asset.sampling.max_output_tokens;
49
+ if (resolvedAsset.sampling?.temperature !== void 0) body.temperature = resolvedAsset.sampling.temperature;
50
+ if (resolvedAsset.sampling?.top_p !== void 0) body.top_p = resolvedAsset.sampling.top_p;
51
+ if (resolvedAsset.sampling?.stop !== void 0) body.stop_sequences = resolvedAsset.sampling.stop;
52
+ if (resolvedAsset.sampling?.max_output_tokens !== void 0) {
53
+ body.max_tokens = resolvedAsset.sampling.max_output_tokens;
51
54
  } else {
52
55
  body.max_tokens = 4096;
53
56
  }
54
- if (asset.reasoning?.budget_tokens) {
57
+ if (resolvedAsset.reasoning?.budget_tokens) {
55
58
  body.thinking = {
56
59
  type: "enabled",
57
- budget_tokens: asset.reasoning.budget_tokens
60
+ budget_tokens: resolvedAsset.reasoning.budget_tokens
58
61
  };
59
62
  }
60
- if (asset.response?.stream !== void 0) {
61
- body.stream = asset.response.stream;
63
+ if (resolvedAsset.response?.stream !== void 0) {
64
+ body.stream = resolvedAsset.response.stream;
62
65
  }
63
- if (asset.tools && asset.tools.length > 0) {
64
- body.tools = asset.tools.map((tool) => {
66
+ if (resolvedAsset.tools && resolvedAsset.tools.length > 0) {
67
+ body.tools = resolvedAsset.tools.map((tool) => {
65
68
  if (typeof tool === "string") {
66
69
  const def = runtime.toolRegistry?.[tool];
67
70
  if (def) return def;
@@ -77,7 +80,7 @@ var anthropicAdapter = {
77
80
  return {
78
81
  body,
79
82
  provider: "anthropic",
80
- model: asset.model ?? "unknown"
83
+ model: resolvedAsset.model ?? "unknown"
81
84
  };
82
85
  }
83
86
  };
@@ -85,4 +88,4 @@ var anthropicAdapter = {
85
88
  export {
86
89
  anthropicAdapter
87
90
  };
88
- //# sourceMappingURL=chunk-VYVEVJC3.js.map
91
+ //# sourceMappingURL=chunk-LRRSI4ON.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/providers/anthropic.ts"],"sourcesContent":["import type { ResolvedPromptAsset } from '../schema/index.js';\nimport type {\n ProviderAdapter,\n ProviderRequest,\n ValidationResult,\n RuntimeRenderOptions,\n} from './types.js';\nimport { renderSections } from '../renderer/index.js';\nimport { resolveAssetForProvider } from './resolve-asset.js';\n\n/**\n * Anthropic provider adapter.\n * Produces request bodies compatible with the Anthropic Messages API.\n */\nexport const anthropicAdapter: ProviderAdapter = {\n name: 'anthropic',\n\n validate(asset: ResolvedPromptAsset, runtime?: RuntimeRenderOptions): ValidationResult {\n const resolvedAsset = resolveAssetForProvider(asset, runtime);\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (!resolvedAsset.model) {\n errors.push('Anthropic adapter requires a model to be specified.');\n }\n\n if (resolvedAsset.sampling?.frequency_penalty !== undefined) {\n warnings.push('Anthropic does not support frequency_penalty. It will be ignored.');\n }\n if (resolvedAsset.sampling?.presence_penalty !== undefined) {\n warnings.push('Anthropic does not support presence_penalty. It will be ignored.');\n }\n if (resolvedAsset.reasoning?.effort !== undefined) {\n warnings.push('Anthropic uses budget_tokens for thinking, not effort. effort will be mapped approximately.');\n }\n\n return { valid: errors.length === 0, errors, warnings };\n },\n\n render(asset: ResolvedPromptAsset, runtime: RuntimeRenderOptions): ProviderRequest {\n const resolvedAsset = resolveAssetForProvider(asset, runtime);\n const sections = renderSections(resolvedAsset, {\n variables: runtime.variables,\n strict: runtime.strict,\n });\n\n const messages: Array<Record<string, unknown>> = [];\n\n // History\n if (runtime.history) {\n for (const msg of runtime.history) {\n messages.push({ role: msg.role, content: msg.content });\n }\n }\n\n // User message (prompt template)\n if (sections.prompt_template) {\n messages.push({ role: 'user', content: sections.prompt_template });\n }\n\n const body: Record<string, unknown> = {\n model: resolvedAsset.model,\n messages,\n };\n\n // System goes as top-level field in Anthropic\n if (sections.system_instructions) {\n body.system = sections.system_instructions;\n }\n\n // Sampling params\n if (resolvedAsset.sampling?.temperature !== undefined) body.temperature = resolvedAsset.sampling.temperature;\n if (resolvedAsset.sampling?.top_p !== undefined) body.top_p = resolvedAsset.sampling.top_p;\n if (resolvedAsset.sampling?.stop !== undefined) body.stop_sequences = resolvedAsset.sampling.stop;\n if (resolvedAsset.sampling?.max_output_tokens !== undefined) {\n body.max_tokens = resolvedAsset.sampling.max_output_tokens;\n } else {\n // Anthropic requires max_tokens\n body.max_tokens = 4096;\n }\n\n // Thinking/reasoning\n if (resolvedAsset.reasoning?.budget_tokens) {\n body.thinking = {\n type: 'enabled',\n budget_tokens: resolvedAsset.reasoning.budget_tokens,\n };\n }\n\n // Streaming\n if (resolvedAsset.response?.stream !== undefined) {\n body.stream = resolvedAsset.response.stream;\n }\n\n // Tools\n if (resolvedAsset.tools && resolvedAsset.tools.length > 0) {\n body.tools = resolvedAsset.tools.map((tool) => {\n if (typeof tool === 'string') {\n const def = runtime.toolRegistry?.[tool];\n if (def) return def;\n return { name: tool };\n }\n return {\n name: tool.name,\n description: tool.description,\n input_schema: tool.input_schema ?? { type: 'object', properties: {} },\n };\n });\n }\n\n return {\n body,\n provider: 'anthropic',\n model: resolvedAsset.model ?? 'unknown',\n };\n },\n};\n"],"mappings":";;;;;;AAcO,IAAM,mBAAoC;AAAA,EAC/C,MAAM;AAAA,EAEN,SAAS,OAA4B,SAAkD;AACrF,UAAM,gBAAgB,wBAAwB,OAAO,OAAO;AAC5D,UAAM,SAAmB,CAAC;AAC1B,UAAM,WAAqB,CAAC;AAE5B,QAAI,CAAC,cAAc,OAAO;AACxB,aAAO,KAAK,qDAAqD;AAAA,IACnE;AAEA,QAAI,cAAc,UAAU,sBAAsB,QAAW;AAC3D,eAAS,KAAK,mEAAmE;AAAA,IACnF;AACA,QAAI,cAAc,UAAU,qBAAqB,QAAW;AAC1D,eAAS,KAAK,kEAAkE;AAAA,IAClF;AACA,QAAI,cAAc,WAAW,WAAW,QAAW;AACjD,eAAS,KAAK,6FAA6F;AAAA,IAC7G;AAEA,WAAO,EAAE,OAAO,OAAO,WAAW,GAAG,QAAQ,SAAS;AAAA,EACxD;AAAA,EAEA,OAAO,OAA4B,SAAgD;AACjF,UAAM,gBAAgB,wBAAwB,OAAO,OAAO;AAC5D,UAAM,WAAW,eAAe,eAAe;AAAA,MAC7C,WAAW,QAAQ;AAAA,MACnB,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAED,UAAM,WAA2C,CAAC;AAGlD,QAAI,QAAQ,SAAS;AACnB,iBAAW,OAAO,QAAQ,SAAS;AACjC,iBAAS,KAAK,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,QAAQ,CAAC;AAAA,MACxD;AAAA,IACF;AAGA,QAAI,SAAS,iBAAiB;AAC5B,eAAS,KAAK,EAAE,MAAM,QAAQ,SAAS,SAAS,gBAAgB,CAAC;AAAA,IACnE;AAEA,UAAM,OAAgC;AAAA,MACpC,OAAO,cAAc;AAAA,MACrB;AAAA,IACF;AAGA,QAAI,SAAS,qBAAqB;AAChC,WAAK,SAAS,SAAS;AAAA,IACzB;AAGA,QAAI,cAAc,UAAU,gBAAgB,OAAW,MAAK,cAAc,cAAc,SAAS;AACjG,QAAI,cAAc,UAAU,UAAU,OAAW,MAAK,QAAQ,cAAc,SAAS;AACrF,QAAI,cAAc,UAAU,SAAS,OAAW,MAAK,iBAAiB,cAAc,SAAS;AAC7F,QAAI,cAAc,UAAU,sBAAsB,QAAW;AAC3D,WAAK,aAAa,cAAc,SAAS;AAAA,IAC3C,OAAO;AAEL,WAAK,aAAa;AAAA,IACpB;AAGA,QAAI,cAAc,WAAW,eAAe;AAC1C,WAAK,WAAW;AAAA,QACd,MAAM;AAAA,QACN,eAAe,cAAc,UAAU;AAAA,MACzC;AAAA,IACF;AAGA,QAAI,cAAc,UAAU,WAAW,QAAW;AAChD,WAAK,SAAS,cAAc,SAAS;AAAA,IACvC;AAGA,QAAI,cAAc,SAAS,cAAc,MAAM,SAAS,GAAG;AACzD,WAAK,QAAQ,cAAc,MAAM,IAAI,CAAC,SAAS;AAC7C,YAAI,OAAO,SAAS,UAAU;AAC5B,gBAAM,MAAM,QAAQ,eAAe,IAAI;AACvC,cAAI,IAAK,QAAO;AAChB,iBAAO,EAAE,MAAM,KAAK;AAAA,QACtB;AACA,eAAO;AAAA,UACL,MAAM,KAAK;AAAA,UACX,aAAa,KAAK;AAAA,UAClB,cAAc,KAAK,gBAAgB,EAAE,MAAM,UAAU,YAAY,CAAC,EAAE;AAAA,QACtE;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,MACL;AAAA,MACA,UAAU;AAAA,MACV,OAAO,cAAc,SAAS;AAAA,IAChC;AAAA,EACF;AACF;","names":[]}