promptopskit 0.4.0 → 0.5.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 +98 -57
- package/SKILL.md +360 -6
- package/dist/chunk-6BOUQVSX.js +130 -0
- package/dist/chunk-6BOUQVSX.js.map +1 -0
- package/dist/{chunk-F6UJ73Y6.js → chunk-6VLKZCNS.js} +6 -4
- package/dist/chunk-6VLKZCNS.js.map +1 -0
- package/dist/{chunk-HWEVRBKZ.js → chunk-AGTGIZMR.js} +6 -2
- package/dist/chunk-AGTGIZMR.js.map +1 -0
- package/dist/{chunk-L2V7LDKD.js → chunk-D75HKF64.js} +6 -4
- package/dist/chunk-D75HKF64.js.map +1 -0
- package/dist/{chunk-UPTCSWK3.js → chunk-IN4KT5EU.js} +4 -3
- package/dist/chunk-IN4KT5EU.js.map +1 -0
- package/dist/{chunk-JBLUPKY4.js → chunk-K6ZU3CGV.js} +54 -6
- package/dist/chunk-K6ZU3CGV.js.map +1 -0
- package/dist/{chunk-XNNDGDPI.js → chunk-KN7H4JRK.js} +61 -4
- package/dist/chunk-KN7H4JRK.js.map +1 -0
- package/dist/{chunk-HLNVKKMS.js → chunk-LNGHGGJN.js} +6 -4
- package/dist/chunk-LNGHGGJN.js.map +1 -0
- package/dist/{chunk-RY5DVTLV.js → chunk-QK3WKE3K.js} +6 -4
- package/dist/chunk-QK3WKE3K.js.map +1 -0
- package/dist/cli/index.js +114 -55
- package/dist/cli/index.js.map +1 -1
- package/dist/index.cjs +265 -22
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -9
- package/dist/index.d.ts +9 -9
- package/dist/index.js +32 -10
- package/dist/index.js.map +1 -1
- package/dist/providers/anthropic.cjs +114 -9
- 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 +114 -9
- 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/llmasaservice.cjs +1467 -0
- package/dist/providers/llmasaservice.cjs.map +1 -0
- package/dist/providers/llmasaservice.d.cts +28 -0
- package/dist/providers/llmasaservice.d.ts +28 -0
- package/dist/providers/llmasaservice.js +20 -0
- package/dist/providers/llmasaservice.js.map +1 -0
- package/dist/providers/openai-responses.cjs +114 -9
- package/dist/providers/openai-responses.cjs.map +1 -1
- package/dist/providers/openai-responses.d.cts +2 -2
- package/dist/providers/openai-responses.d.ts +2 -2
- package/dist/providers/openai-responses.js +3 -3
- package/dist/providers/openai.cjs +114 -9
- 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 +115 -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 → schema-D-RI4w-k.d.cts} +695 -183
- package/dist/{schema-B9A1zLRk.d.ts → schema-D-RI4w-k.d.ts} +695 -183
- package/dist/testing.cjs +21 -4
- package/dist/testing.cjs.map +1 -1
- package/dist/testing.d.cts +1 -1
- package/dist/testing.d.ts +1 -1
- package/dist/testing.js +1 -1
- package/dist/{types-DjGAwJxC.d.ts → types-B3dxBGu6.d.ts} +18 -6
- package/dist/{types-DpbzzZO2.d.cts → types-DbTAjlTN.d.cts} +18 -6
- package/dist/usagetap/index.cjs +6 -1
- package/dist/usagetap/index.cjs.map +1 -1
- package/dist/usagetap/index.d.cts +4 -3
- package/dist/usagetap/index.d.ts +4 -3
- package/dist/usagetap/index.js +3 -1
- package/package.json +11 -1
- package/dist/chunk-F6UJ73Y6.js.map +0 -1
- package/dist/chunk-HLNVKKMS.js.map +0 -1
- package/dist/chunk-HWEVRBKZ.js.map +0 -1
- package/dist/chunk-JBLUPKY4.js.map +0 -1
- package/dist/chunk-L2V7LDKD.js.map +0 -1
- package/dist/chunk-RY5DVTLV.js.map +0 -1
- package/dist/chunk-UPTCSWK3.js.map +0 -1
- package/dist/chunk-XNNDGDPI.js.map +0 -1
package/dist/testing.cjs
CHANGED
|
@@ -102,10 +102,26 @@ var OpenRouterProviderOptionsSchema = import_zod.z.object({
|
|
|
102
102
|
plugins: import_zod.z.array(import_zod.z.record(import_zod.z.unknown())).optional(),
|
|
103
103
|
models: import_zod.z.array(import_zod.z.string()).optional()
|
|
104
104
|
});
|
|
105
|
+
var LLMAsAServiceCustomerSchema = import_zod.z.object({
|
|
106
|
+
customer_id: import_zod.z.string(),
|
|
107
|
+
customer_name: import_zod.z.string().optional(),
|
|
108
|
+
customer_user_id: import_zod.z.string().optional(),
|
|
109
|
+
customer_user_name: import_zod.z.string().optional(),
|
|
110
|
+
customer_user_email: import_zod.z.string().optional()
|
|
111
|
+
});
|
|
112
|
+
var LLMAsAServiceProviderOptionsSchema = import_zod.z.object({
|
|
113
|
+
base_url: import_zod.z.string().url().optional(),
|
|
114
|
+
project_id: import_zod.z.string().optional(),
|
|
115
|
+
customer: LLMAsAServiceCustomerSchema.optional(),
|
|
116
|
+
conversationId: import_zod.z.string().optional(),
|
|
117
|
+
conversationTitle: import_zod.z.string().optional(),
|
|
118
|
+
projectId: import_zod.z.string().optional()
|
|
119
|
+
});
|
|
105
120
|
var ProviderOptionsSchema = import_zod.z.object({
|
|
106
121
|
anthropic: AnthropicProviderOptionsSchema.optional(),
|
|
107
122
|
gemini: GeminiProviderOptionsSchema.optional(),
|
|
108
|
-
openrouter: OpenRouterProviderOptionsSchema.optional()
|
|
123
|
+
openrouter: OpenRouterProviderOptionsSchema.optional(),
|
|
124
|
+
llmasaservice: LLMAsAServiceProviderOptionsSchema.optional()
|
|
109
125
|
});
|
|
110
126
|
var RawProviderBodySchema = import_zod.z.object({
|
|
111
127
|
openai: import_zod.z.record(import_zod.z.unknown()).optional(),
|
|
@@ -114,7 +130,8 @@ var RawProviderBodySchema = import_zod.z.object({
|
|
|
114
130
|
anthropic: import_zod.z.record(import_zod.z.unknown()).optional(),
|
|
115
131
|
gemini: import_zod.z.record(import_zod.z.unknown()).optional(),
|
|
116
132
|
google: import_zod.z.record(import_zod.z.unknown()).optional(),
|
|
117
|
-
openrouter: import_zod.z.record(import_zod.z.unknown()).optional()
|
|
133
|
+
openrouter: import_zod.z.record(import_zod.z.unknown()).optional(),
|
|
134
|
+
llmasaservice: import_zod.z.record(import_zod.z.unknown()).optional()
|
|
118
135
|
});
|
|
119
136
|
var OpenAICacheSchema = import_zod.z.object({
|
|
120
137
|
prompt_cache_key: import_zod.z.string().min(1).optional(),
|
|
@@ -201,7 +218,7 @@ var SectionsSchema = import_zod.z.object({
|
|
|
201
218
|
notes: import_zod.z.string().optional()
|
|
202
219
|
});
|
|
203
220
|
var PromptDefaultsSchema = import_zod.z.object({
|
|
204
|
-
provider: import_zod.z.enum(["openai", "openai-responses", "anthropic", "google", "gemini", "openrouter", "any"]).optional(),
|
|
221
|
+
provider: import_zod.z.enum(["openai", "openai-responses", "anthropic", "google", "gemini", "openrouter", "llmasaservice", "any"]).optional(),
|
|
205
222
|
model: import_zod.z.string().optional(),
|
|
206
223
|
cache: CacheSchema.optional(),
|
|
207
224
|
metadata: MetadataSchema.optional(),
|
|
@@ -213,7 +230,7 @@ var PromptAssetSchema = import_zod.z.object({
|
|
|
213
230
|
id: import_zod.z.string(),
|
|
214
231
|
schema_version: import_zod.z.number().int().positive().default(1),
|
|
215
232
|
description: import_zod.z.string().optional(),
|
|
216
|
-
provider: import_zod.z.enum(["openai", "openai-responses", "anthropic", "google", "gemini", "openrouter", "any"]).optional(),
|
|
233
|
+
provider: import_zod.z.enum(["openai", "openai-responses", "anthropic", "google", "gemini", "openrouter", "llmasaservice", "any"]).optional(),
|
|
217
234
|
model: import_zod.z.string().optional(),
|
|
218
235
|
fallback_models: import_zod.z.array(import_zod.z.string()).optional(),
|
|
219
236
|
reasoning: ReasoningSchema.optional(),
|
package/dist/testing.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/testing.ts","../src/parser/parser.ts","../src/schema/schema.ts","../src/parser/frontmatter-guard.ts","../src/parser/sections.ts","../src/parser/loader.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises';\n\nimport matter from 'gray-matter';\n\nimport { parsePrompt } from './parser/index.js';\nimport type { PromptAsset, ResolvedPromptAsset } from './schema/index.js';\n\nexport interface PromptTestCase<TResponse = unknown> {\n name: string;\n variables?: Record<string, string>;\n response?: TResponse;\n expected_response?: TResponse;\n}\n\nexport interface PromptTestSidecar<TResponse = unknown> {\n cases: Array<PromptTestCase<TResponse>>;\n}\n\nexport interface PromptTestRenderer {\n renderPrompt(options: {\n path?: string;\n source?: string;\n provider: string;\n environment?: string;\n tier?: string;\n variables?: Record<string, string>;\n strict?: boolean;\n }): Promise<unknown>;\n}\n\n/**\n * Create a mock PromptAsset for testing.\n */\nexport function createMockAsset(overrides: Partial<PromptAsset> = {}): PromptAsset {\n return {\n id: 'test.prompt',\n schema_version: 1,\n provider: 'openai',\n model: 'gpt-5.4',\n sections: {\n system_instructions: 'You are a test assistant.',\n prompt_template: 'Hello {{ name }}',\n },\n ...overrides,\n };\n}\n\n/**\n * Create a mock ResolvedPromptAsset for testing.\n */\nexport function createMockResolvedAsset(\n overrides: Partial<ResolvedPromptAsset> = {},\n): ResolvedPromptAsset {\n return {\n id: 'test.prompt',\n schema_version: 1,\n provider: 'openai',\n model: 'gpt-5.4',\n sections: {\n system_instructions: 'You are a test assistant.',\n prompt_template: 'Hello {{ name }}',\n },\n source: {\n file_path: 'test.md',\n },\n ...overrides,\n } as ResolvedPromptAsset;\n}\n\n/**\n * Parse an inline prompt string for testing.\n */\nexport function parseTestPrompt(source: string): PromptAsset {\n const { asset } = parsePrompt(source);\n return asset;\n}\n\n/**\n * Parse a .test.yaml sidecar file.\n */\nexport function parsePromptTestSidecar<TResponse = unknown>(source: string): PromptTestSidecar<TResponse> {\n const parsed = matter(`---\\n${source.trim()}\\n---\\n`);\n const data = parsed.data as Partial<PromptTestSidecar<TResponse>>;\n\n if (!Array.isArray(data.cases)) {\n throw new Error('Prompt test sidecar must include a \"cases\" array.');\n }\n\n return {\n cases: data.cases.map((testCase, index) => {\n if (!testCase || typeof testCase !== 'object') {\n throw new Error(`Prompt test case at index ${index} must be an object.`);\n }\n\n if (typeof testCase.name !== 'string' || testCase.name.length === 0) {\n throw new Error(`Prompt test case at index ${index} must include a non-empty \"name\".`);\n }\n\n return testCase;\n }),\n };\n}\n\n/**\n * Load a .test.yaml sidecar file from disk.\n */\nexport async function loadPromptTestSidecar<TResponse = unknown>(\n filePath: string | URL,\n): Promise<PromptTestSidecar<TResponse>> {\n return parsePromptTestSidecar<TResponse>(await readFile(filePath, 'utf-8'));\n}\n\n/**\n * Find a named test case in a sidecar.\n */\nexport function getPromptTestCase<TResponse = unknown>(\n sidecar: PromptTestSidecar<TResponse> | Array<PromptTestCase<TResponse>>,\n name: string,\n): PromptTestCase<TResponse> {\n const cases = Array.isArray(sidecar) ? sidecar : sidecar.cases;\n const testCase = cases.find((candidate) => candidate.name === name);\n\n if (!testCase) {\n throw new Error(`Prompt test case \"${name}\" was not found.`);\n }\n\n return testCase;\n}\n\n/**\n * Read the canned response for a named case.\n */\nexport function getHardcodedPromptResponse<TResponse = unknown>(\n sidecar: PromptTestSidecar<TResponse> | Array<PromptTestCase<TResponse>>,\n name: string,\n): TResponse {\n const testCase = getPromptTestCase(sidecar, name);\n const response = testCase.response ?? testCase.expected_response;\n\n if (response === undefined) {\n throw new Error(`Prompt test case \"${name}\" does not define a \"response\".`);\n }\n\n return response;\n}\n\n/**\n * Create a small responder for unit tests and local development flows.\n */\nexport function createHardcodedPromptResponder<TResponse = unknown>(\n sidecar: PromptTestSidecar<TResponse> | Array<PromptTestCase<TResponse>>,\n): (name: string) => TResponse {\n return (name) => getHardcodedPromptResponse(sidecar, name);\n}\n\n/**\n * Render a prompt using variables from a named sidecar case.\n */\nexport async function renderPromptTestCase<TResponse = unknown>(\n kit: PromptTestRenderer,\n options: {\n sidecar: PromptTestSidecar<TResponse> | Array<PromptTestCase<TResponse>>;\n caseName: string;\n path?: string;\n source?: string;\n provider: string;\n environment?: string;\n tier?: string;\n strict?: boolean;\n },\n): Promise<{\n testCase: PromptTestCase<TResponse>;\n rendered: unknown;\n response?: TResponse;\n}> {\n const testCase = getPromptTestCase(options.sidecar, options.caseName);\n const rendered = await kit.renderPrompt({\n path: options.path,\n source: options.source,\n provider: options.provider,\n environment: options.environment,\n tier: options.tier,\n variables: testCase.variables,\n strict: options.strict,\n });\n\n return {\n testCase,\n rendered,\n response: testCase.response ?? testCase.expected_response,\n };\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","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","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","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 { 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":["import_promises","import_gray_matter","indent","matter","import_gray_matter","matter"]}
|
|
1
|
+
{"version":3,"sources":["../src/testing.ts","../src/parser/parser.ts","../src/schema/schema.ts","../src/parser/frontmatter-guard.ts","../src/parser/sections.ts","../src/parser/loader.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises';\n\nimport matter from 'gray-matter';\n\nimport { parsePrompt } from './parser/index.js';\nimport type { PromptAsset, ResolvedPromptAsset } from './schema/index.js';\n\nexport interface PromptTestCase<TResponse = unknown> {\n name: string;\n variables?: Record<string, string>;\n response?: TResponse;\n expected_response?: TResponse;\n}\n\nexport interface PromptTestSidecar<TResponse = unknown> {\n cases: Array<PromptTestCase<TResponse>>;\n}\n\nexport interface PromptTestRenderer {\n renderPrompt(options: {\n path?: string;\n source?: string;\n provider: string;\n environment?: string;\n tier?: string;\n variables?: Record<string, string>;\n strict?: boolean;\n }): Promise<unknown>;\n}\n\n/**\n * Create a mock PromptAsset for testing.\n */\nexport function createMockAsset(overrides: Partial<PromptAsset> = {}): PromptAsset {\n return {\n id: 'test.prompt',\n schema_version: 1,\n provider: 'openai',\n model: 'gpt-5.4',\n sections: {\n system_instructions: 'You are a test assistant.',\n prompt_template: 'Hello {{ name }}',\n },\n ...overrides,\n };\n}\n\n/**\n * Create a mock ResolvedPromptAsset for testing.\n */\nexport function createMockResolvedAsset(\n overrides: Partial<ResolvedPromptAsset> = {},\n): ResolvedPromptAsset {\n return {\n id: 'test.prompt',\n schema_version: 1,\n provider: 'openai',\n model: 'gpt-5.4',\n sections: {\n system_instructions: 'You are a test assistant.',\n prompt_template: 'Hello {{ name }}',\n },\n source: {\n file_path: 'test.md',\n },\n ...overrides,\n } as ResolvedPromptAsset;\n}\n\n/**\n * Parse an inline prompt string for testing.\n */\nexport function parseTestPrompt(source: string): PromptAsset {\n const { asset } = parsePrompt(source);\n return asset;\n}\n\n/**\n * Parse a .test.yaml sidecar file.\n */\nexport function parsePromptTestSidecar<TResponse = unknown>(source: string): PromptTestSidecar<TResponse> {\n const parsed = matter(`---\\n${source.trim()}\\n---\\n`);\n const data = parsed.data as Partial<PromptTestSidecar<TResponse>>;\n\n if (!Array.isArray(data.cases)) {\n throw new Error('Prompt test sidecar must include a \"cases\" array.');\n }\n\n return {\n cases: data.cases.map((testCase, index) => {\n if (!testCase || typeof testCase !== 'object') {\n throw new Error(`Prompt test case at index ${index} must be an object.`);\n }\n\n if (typeof testCase.name !== 'string' || testCase.name.length === 0) {\n throw new Error(`Prompt test case at index ${index} must include a non-empty \"name\".`);\n }\n\n return testCase;\n }),\n };\n}\n\n/**\n * Load a .test.yaml sidecar file from disk.\n */\nexport async function loadPromptTestSidecar<TResponse = unknown>(\n filePath: string | URL,\n): Promise<PromptTestSidecar<TResponse>> {\n return parsePromptTestSidecar<TResponse>(await readFile(filePath, 'utf-8'));\n}\n\n/**\n * Find a named test case in a sidecar.\n */\nexport function getPromptTestCase<TResponse = unknown>(\n sidecar: PromptTestSidecar<TResponse> | Array<PromptTestCase<TResponse>>,\n name: string,\n): PromptTestCase<TResponse> {\n const cases = Array.isArray(sidecar) ? sidecar : sidecar.cases;\n const testCase = cases.find((candidate) => candidate.name === name);\n\n if (!testCase) {\n throw new Error(`Prompt test case \"${name}\" was not found.`);\n }\n\n return testCase;\n}\n\n/**\n * Read the canned response for a named case.\n */\nexport function getHardcodedPromptResponse<TResponse = unknown>(\n sidecar: PromptTestSidecar<TResponse> | Array<PromptTestCase<TResponse>>,\n name: string,\n): TResponse {\n const testCase = getPromptTestCase(sidecar, name);\n const response = testCase.response ?? testCase.expected_response;\n\n if (response === undefined) {\n throw new Error(`Prompt test case \"${name}\" does not define a \"response\".`);\n }\n\n return response;\n}\n\n/**\n * Create a small responder for unit tests and local development flows.\n */\nexport function createHardcodedPromptResponder<TResponse = unknown>(\n sidecar: PromptTestSidecar<TResponse> | Array<PromptTestCase<TResponse>>,\n): (name: string) => TResponse {\n return (name) => getHardcodedPromptResponse(sidecar, name);\n}\n\n/**\n * Render a prompt using variables from a named sidecar case.\n */\nexport async function renderPromptTestCase<TResponse = unknown>(\n kit: PromptTestRenderer,\n options: {\n sidecar: PromptTestSidecar<TResponse> | Array<PromptTestCase<TResponse>>;\n caseName: string;\n path?: string;\n source?: string;\n provider: string;\n environment?: string;\n tier?: string;\n strict?: boolean;\n },\n): Promise<{\n testCase: PromptTestCase<TResponse>;\n rendered: unknown;\n response?: TResponse;\n}> {\n const testCase = getPromptTestCase(options.sidecar, options.caseName);\n const rendered = await kit.renderPrompt({\n path: options.path,\n source: options.source,\n provider: options.provider,\n environment: options.environment,\n tier: options.tier,\n variables: testCase.variables,\n strict: options.strict,\n });\n\n return {\n testCase,\n rendered,\n response: testCase.response ?? testCase.expected_response,\n };\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","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 LLMAsAServiceCustomerSchema = z.object({\n customer_id: z.string(),\n customer_name: z.string().optional(),\n customer_user_id: z.string().optional(),\n customer_user_name: z.string().optional(),\n customer_user_email: z.string().optional(),\n});\n\nexport const LLMAsAServiceProviderOptionsSchema = z.object({\n base_url: z.string().url().optional(),\n project_id: z.string().optional(),\n customer: LLMAsAServiceCustomerSchema.optional(),\n conversationId: z.string().optional(),\n conversationTitle: z.string().optional(),\n projectId: z.string().optional(),\n});\n\nexport const ProviderOptionsSchema = z.object({\n anthropic: AnthropicProviderOptionsSchema.optional(),\n gemini: GeminiProviderOptionsSchema.optional(),\n openrouter: OpenRouterProviderOptionsSchema.optional(),\n llmasaservice: LLMAsAServiceProviderOptionsSchema.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 llmasaservice: 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', 'llmasaservice', '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', 'llmasaservice', '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","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","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 { 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 cache: mergeCache(base.cache, local.cache),\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 cache = mergeCache(defaults.cache, asset.cache);\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 const hasDefaultCache = cache !== undefined;\n\n // Short-circuit: nothing to merge\n if (!hasDefaultMetadata && !hasDefaultSystem && !hasDefaultScalars && !hasDefaultCache) {\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 cache,\n metadata,\n sections,\n };\n}\n\nfunction mergeCache(base: PromptDefaults['cache'], local: PromptDefaults['cache']): PromptDefaults['cache'] {\n const merged: NonNullable<PromptDefaults['cache']> = {\n ...(base ?? {}),\n ...(local ?? {}),\n openai: {\n ...(base?.openai ?? {}),\n ...(local?.openai ?? {}),\n },\n anthropic: {\n ...(base?.anthropic ?? {}),\n ...(local?.anthropic ?? {}),\n },\n gemini: {\n ...(base?.gemini ?? {}),\n ...(local?.gemini ?? {}),\n },\n google: {\n ...(base?.google ?? {}),\n ...(local?.google ?? {}),\n },\n };\n\n if (merged.openai && Object.keys(merged.openai).length === 0) delete merged.openai;\n if (merged.anthropic && Object.keys(merged.anthropic).length === 0) delete merged.anthropic;\n if (merged.gemini && Object.keys(merged.gemini).length === 0) delete merged.gemini;\n if (merged.google && Object.keys(merged.google).length === 0) delete merged.google;\n\n return Object.keys(merged).length > 0 ? merged : undefined;\n}\n"],"mappings":"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","names":["import_promises","import_gray_matter","indent","matter","import_gray_matter","matter"]}
|
package/dist/testing.d.cts
CHANGED
package/dist/testing.d.ts
CHANGED
package/dist/testing.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as PromptAssetOverrides, R as ResolvedPromptAsset } from './schema-
|
|
1
|
+
import { a as PromptAssetOverrides, R as ResolvedPromptAsset } from './schema-D-RI4w-k.js';
|
|
2
2
|
|
|
3
3
|
type PromptResolutionMode = 'auto' | 'compiled-only' | 'source-only';
|
|
4
4
|
|
|
@@ -9,6 +9,8 @@ interface ProviderRequest {
|
|
|
9
9
|
body: Record<string, unknown>;
|
|
10
10
|
provider: string;
|
|
11
11
|
model: string;
|
|
12
|
+
baseURL?: string;
|
|
13
|
+
headers?: Record<string, string>;
|
|
12
14
|
}
|
|
13
15
|
interface ProviderPromptReturnMessageResult {
|
|
14
16
|
provider: string;
|
|
@@ -36,6 +38,18 @@ interface OpenAIResponsesRuntimeOptions {
|
|
|
36
38
|
store?: boolean;
|
|
37
39
|
background?: boolean;
|
|
38
40
|
}
|
|
41
|
+
interface RuntimeHistoryMessage {
|
|
42
|
+
role: string;
|
|
43
|
+
content: string;
|
|
44
|
+
}
|
|
45
|
+
interface RuntimeHistoryCompactionInfo {
|
|
46
|
+
promptId: string;
|
|
47
|
+
maxItems: number;
|
|
48
|
+
overflow: RuntimeHistoryMessage[];
|
|
49
|
+
preserved: RuntimeHistoryMessage[];
|
|
50
|
+
history: RuntimeHistoryMessage[];
|
|
51
|
+
}
|
|
52
|
+
type RuntimeHistoryCompactionResult = string | RuntimeHistoryMessage;
|
|
39
53
|
/**
|
|
40
54
|
* Options passed at render time.
|
|
41
55
|
*/
|
|
@@ -51,10 +65,8 @@ interface RuntimeRenderOptions {
|
|
|
51
65
|
maxSize: number;
|
|
52
66
|
actualSize: number;
|
|
53
67
|
}) => string;
|
|
54
|
-
history?:
|
|
55
|
-
|
|
56
|
-
content: string;
|
|
57
|
-
}>;
|
|
68
|
+
history?: RuntimeHistoryMessage[];
|
|
69
|
+
onHistoryCompaction?: (info: RuntimeHistoryCompactionInfo) => RuntimeHistoryCompactionResult;
|
|
58
70
|
toolRegistry?: Record<string, unknown>;
|
|
59
71
|
strict?: boolean;
|
|
60
72
|
openaiResponses?: OpenAIResponsesRuntimeOptions;
|
|
@@ -91,4 +103,4 @@ interface ProviderAdapter {
|
|
|
91
103
|
renderPrompt: RenderPromptMethod;
|
|
92
104
|
}
|
|
93
105
|
|
|
94
|
-
export type { ProviderAdapter as P, RuntimeRenderOptions as R, ValidationResult as V, ProviderRequest as a, ProviderInlinePromptSource as b, ProviderPromptInput as c, ProviderPromptLookup as d, ProviderPromptRenderResult as e };
|
|
106
|
+
export type { ProviderAdapter as P, RuntimeRenderOptions as R, ValidationResult as V, ProviderRequest as a, ProviderInlinePromptSource as b, ProviderPromptInput as c, ProviderPromptLookup as d, ProviderPromptRenderResult as e, RuntimeHistoryCompactionInfo as f, RuntimeHistoryCompactionResult as g, RuntimeHistoryMessage as h };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as PromptAssetOverrides, R as ResolvedPromptAsset } from './schema-
|
|
1
|
+
import { a as PromptAssetOverrides, R as ResolvedPromptAsset } from './schema-D-RI4w-k.cjs';
|
|
2
2
|
|
|
3
3
|
type PromptResolutionMode = 'auto' | 'compiled-only' | 'source-only';
|
|
4
4
|
|
|
@@ -9,6 +9,8 @@ interface ProviderRequest {
|
|
|
9
9
|
body: Record<string, unknown>;
|
|
10
10
|
provider: string;
|
|
11
11
|
model: string;
|
|
12
|
+
baseURL?: string;
|
|
13
|
+
headers?: Record<string, string>;
|
|
12
14
|
}
|
|
13
15
|
interface ProviderPromptReturnMessageResult {
|
|
14
16
|
provider: string;
|
|
@@ -36,6 +38,18 @@ interface OpenAIResponsesRuntimeOptions {
|
|
|
36
38
|
store?: boolean;
|
|
37
39
|
background?: boolean;
|
|
38
40
|
}
|
|
41
|
+
interface RuntimeHistoryMessage {
|
|
42
|
+
role: string;
|
|
43
|
+
content: string;
|
|
44
|
+
}
|
|
45
|
+
interface RuntimeHistoryCompactionInfo {
|
|
46
|
+
promptId: string;
|
|
47
|
+
maxItems: number;
|
|
48
|
+
overflow: RuntimeHistoryMessage[];
|
|
49
|
+
preserved: RuntimeHistoryMessage[];
|
|
50
|
+
history: RuntimeHistoryMessage[];
|
|
51
|
+
}
|
|
52
|
+
type RuntimeHistoryCompactionResult = string | RuntimeHistoryMessage;
|
|
39
53
|
/**
|
|
40
54
|
* Options passed at render time.
|
|
41
55
|
*/
|
|
@@ -51,10 +65,8 @@ interface RuntimeRenderOptions {
|
|
|
51
65
|
maxSize: number;
|
|
52
66
|
actualSize: number;
|
|
53
67
|
}) => string;
|
|
54
|
-
history?:
|
|
55
|
-
|
|
56
|
-
content: string;
|
|
57
|
-
}>;
|
|
68
|
+
history?: RuntimeHistoryMessage[];
|
|
69
|
+
onHistoryCompaction?: (info: RuntimeHistoryCompactionInfo) => RuntimeHistoryCompactionResult;
|
|
58
70
|
toolRegistry?: Record<string, unknown>;
|
|
59
71
|
strict?: boolean;
|
|
60
72
|
openaiResponses?: OpenAIResponsesRuntimeOptions;
|
|
@@ -91,4 +103,4 @@ interface ProviderAdapter {
|
|
|
91
103
|
renderPrompt: RenderPromptMethod;
|
|
92
104
|
}
|
|
93
105
|
|
|
94
|
-
export type { ProviderAdapter as P, RuntimeRenderOptions as R, ValidationResult as V, ProviderRequest as a, ProviderInlinePromptSource as b, ProviderPromptInput as c, ProviderPromptLookup as d, ProviderPromptRenderResult as e };
|
|
106
|
+
export type { ProviderAdapter as P, RuntimeRenderOptions as R, ValidationResult as V, ProviderRequest as a, ProviderInlinePromptSource as b, ProviderPromptInput as c, ProviderPromptLookup as d, ProviderPromptRenderResult as e, RuntimeHistoryCompactionInfo as f, RuntimeHistoryCompactionResult as g, RuntimeHistoryMessage as h };
|
package/dist/usagetap/index.cjs
CHANGED
|
@@ -30,6 +30,7 @@ __export(usagetap_exports, {
|
|
|
30
30
|
extractOpenAIUsage: () => extractOpenAIUsage,
|
|
31
31
|
runAnthropicWithUsageTap: () => runAnthropicWithUsageTap,
|
|
32
32
|
runGeminiWithUsageTap: () => runGeminiWithUsageTap,
|
|
33
|
+
runLLMAsAServiceWithUsageTap: () => runLLMAsAServiceWithUsageTap,
|
|
33
34
|
runOpenAIWithUsageTap: () => runOpenAIWithUsageTap,
|
|
34
35
|
runOpenRouterWithUsageTap: () => runOpenRouterWithUsageTap,
|
|
35
36
|
withUsageTapCall: () => withUsageTapCall
|
|
@@ -311,7 +312,7 @@ function applyUsageTapEntitlements(request, begin, options = {}) {
|
|
|
311
312
|
if (!isObject2(nextRequest.body)) {
|
|
312
313
|
return nextRequest;
|
|
313
314
|
}
|
|
314
|
-
if (nextRequest.provider === "openai" || nextRequest.provider === "openrouter") {
|
|
315
|
+
if (nextRequest.provider === "openai" || nextRequest.provider === "openrouter" || nextRequest.provider === "llmasaservice") {
|
|
315
316
|
capOpenAIReasoning(nextRequest.body, allowed);
|
|
316
317
|
if (isRecordArray(nextRequest.body.tools)) {
|
|
317
318
|
nextRequest.body.tools = filterOpenAITools(nextRequest.body.tools, allowed, options);
|
|
@@ -400,6 +401,9 @@ function runOpenAIWithUsageTap(client, options) {
|
|
|
400
401
|
function runOpenRouterWithUsageTap(client, options) {
|
|
401
402
|
return runProviderWithUsageTap(client, options, extractOpenAIUsage);
|
|
402
403
|
}
|
|
404
|
+
function runLLMAsAServiceWithUsageTap(client, options) {
|
|
405
|
+
return runProviderWithUsageTap(client, options, extractOpenAIUsage);
|
|
406
|
+
}
|
|
403
407
|
function runAnthropicWithUsageTap(client, options) {
|
|
404
408
|
return runProviderWithUsageTap(client, options, extractAnthropicUsage);
|
|
405
409
|
}
|
|
@@ -418,6 +422,7 @@ function runGeminiWithUsageTap(client, options) {
|
|
|
418
422
|
extractOpenAIUsage,
|
|
419
423
|
runAnthropicWithUsageTap,
|
|
420
424
|
runGeminiWithUsageTap,
|
|
425
|
+
runLLMAsAServiceWithUsageTap,
|
|
421
426
|
runOpenAIWithUsageTap,
|
|
422
427
|
runOpenRouterWithUsageTap,
|
|
423
428
|
withUsageTapCall
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/usagetap/index.ts","../../src/usagetap/client.ts","../../src/usagetap/lifecycle.ts","../../src/usagetap/providers.ts"],"sourcesContent":["export type {\n UsageTapAllowed,\n UsageTapAllowedCapability,\n UsageTapBeginRequest,\n UsageTapBeginResponse,\n UsageTapCallOptions,\n UsageTapCallResult,\n UsageTapClient,\n UsageTapClientConfig,\n UsageTapEndRequest,\n UsageTapEndResponse,\n UsageTapEndUsage,\n UsageTapEntitlementMode,\n UsageTapEntitlementOptions,\n UsageTapErrorPayload,\n UsageTapInvokeContext,\n UsageTapInvokeResult,\n UsageTapProviderRunOptions,\n UsageTapProviderRunResult,\n UsageTapReasoningLevel,\n} from './types.js';\nexport { createUsageTapClient } from './client.js';\nexport { beginUsageTapCall, defaultUsageTapErrorMapper, endUsageTapCall, withUsageTapCall } from './lifecycle.js';\nexport {\n applyUsageTapEntitlements,\n extractAnthropicUsage,\n extractGeminiUsage,\n extractOpenAIUsage,\n runAnthropicWithUsageTap,\n runGeminiWithUsageTap,\n runOpenAIWithUsageTap,\n runOpenRouterWithUsageTap,\n} from './providers.js';\n","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
|
+
{"version":3,"sources":["../../src/usagetap/index.ts","../../src/usagetap/client.ts","../../src/usagetap/lifecycle.ts","../../src/usagetap/providers.ts"],"sourcesContent":["export type {\n UsageTapAllowed,\n UsageTapAllowedCapability,\n UsageTapBeginRequest,\n UsageTapBeginResponse,\n UsageTapCallOptions,\n UsageTapCallResult,\n UsageTapClient,\n UsageTapClientConfig,\n UsageTapEndRequest,\n UsageTapEndResponse,\n UsageTapEndUsage,\n UsageTapEntitlementMode,\n UsageTapEntitlementOptions,\n UsageTapErrorPayload,\n UsageTapInvokeContext,\n UsageTapInvokeResult,\n UsageTapProviderRunOptions,\n UsageTapProviderRunResult,\n UsageTapReasoningLevel,\n} from './types.js';\nexport { createUsageTapClient } from './client.js';\nexport { beginUsageTapCall, defaultUsageTapErrorMapper, endUsageTapCall, withUsageTapCall } from './lifecycle.js';\nexport {\n applyUsageTapEntitlements,\n extractAnthropicUsage,\n extractGeminiUsage,\n extractOpenAIUsage,\n runAnthropicWithUsageTap,\n runGeminiWithUsageTap,\n runLLMAsAServiceWithUsageTap,\n runOpenAIWithUsageTap,\n runOpenRouterWithUsageTap,\n} from './providers.js';\n","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' || nextRequest.provider === 'llmasaservice') {\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 runLLMAsAServiceWithUsageTap<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,5 +1,5 @@
|
|
|
1
|
-
import { a as ProviderRequest } from '../types-
|
|
2
|
-
import '../schema-
|
|
1
|
+
import { a as ProviderRequest } from '../types-DbTAjlTN.cjs';
|
|
2
|
+
import '../schema-D-RI4w-k.cjs';
|
|
3
3
|
import 'zod';
|
|
4
4
|
|
|
5
5
|
type UsageTapReasoningLevel = 'NONE' | 'LOW' | 'MEDIUM' | 'HIGH';
|
|
@@ -141,7 +141,8 @@ declare function extractAnthropicUsage(response: unknown, meta?: UsageMeta): Usa
|
|
|
141
141
|
declare function extractGeminiUsage(response: unknown, meta?: UsageMeta): UsageTapEndUsage;
|
|
142
142
|
declare function runOpenAIWithUsageTap<TResult>(client: UsageTapClient, options: UsageTapProviderRunOptions<TResult>): Promise<UsageTapProviderRunResult<TResult>>;
|
|
143
143
|
declare function runOpenRouterWithUsageTap<TResult>(client: UsageTapClient, options: UsageTapProviderRunOptions<TResult>): Promise<UsageTapProviderRunResult<TResult>>;
|
|
144
|
+
declare function runLLMAsAServiceWithUsageTap<TResult>(client: UsageTapClient, options: UsageTapProviderRunOptions<TResult>): Promise<UsageTapProviderRunResult<TResult>>;
|
|
144
145
|
declare function runAnthropicWithUsageTap<TResult>(client: UsageTapClient, options: UsageTapProviderRunOptions<TResult>): Promise<UsageTapProviderRunResult<TResult>>;
|
|
145
146
|
declare function runGeminiWithUsageTap<TResult>(client: UsageTapClient, options: UsageTapProviderRunOptions<TResult>): Promise<UsageTapProviderRunResult<TResult>>;
|
|
146
147
|
|
|
147
|
-
export { type UsageTapAllowed, type UsageTapAllowedCapability, type UsageTapBeginRequest, type UsageTapBeginResponse, type UsageTapCallOptions, type UsageTapCallResult, type UsageTapClient, type UsageTapClientConfig, type UsageTapEndRequest, type UsageTapEndResponse, type UsageTapEndUsage, type UsageTapEntitlementMode, type UsageTapEntitlementOptions, type UsageTapErrorPayload, type UsageTapInvokeContext, type UsageTapInvokeResult, type UsageTapProviderRunOptions, type UsageTapProviderRunResult, type UsageTapReasoningLevel, applyUsageTapEntitlements, beginUsageTapCall, createUsageTapClient, defaultUsageTapErrorMapper, endUsageTapCall, extractAnthropicUsage, extractGeminiUsage, extractOpenAIUsage, runAnthropicWithUsageTap, runGeminiWithUsageTap, runOpenAIWithUsageTap, runOpenRouterWithUsageTap, withUsageTapCall };
|
|
148
|
+
export { type UsageTapAllowed, type UsageTapAllowedCapability, type UsageTapBeginRequest, type UsageTapBeginResponse, type UsageTapCallOptions, type UsageTapCallResult, type UsageTapClient, type UsageTapClientConfig, type UsageTapEndRequest, type UsageTapEndResponse, type UsageTapEndUsage, type UsageTapEntitlementMode, type UsageTapEntitlementOptions, type UsageTapErrorPayload, type UsageTapInvokeContext, type UsageTapInvokeResult, type UsageTapProviderRunOptions, type UsageTapProviderRunResult, type UsageTapReasoningLevel, applyUsageTapEntitlements, beginUsageTapCall, createUsageTapClient, defaultUsageTapErrorMapper, endUsageTapCall, extractAnthropicUsage, extractGeminiUsage, extractOpenAIUsage, runAnthropicWithUsageTap, runGeminiWithUsageTap, runLLMAsAServiceWithUsageTap, runOpenAIWithUsageTap, runOpenRouterWithUsageTap, withUsageTapCall };
|
package/dist/usagetap/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { a as ProviderRequest } from '../types-
|
|
2
|
-
import '../schema-
|
|
1
|
+
import { a as ProviderRequest } from '../types-B3dxBGu6.js';
|
|
2
|
+
import '../schema-D-RI4w-k.js';
|
|
3
3
|
import 'zod';
|
|
4
4
|
|
|
5
5
|
type UsageTapReasoningLevel = 'NONE' | 'LOW' | 'MEDIUM' | 'HIGH';
|
|
@@ -141,7 +141,8 @@ declare function extractAnthropicUsage(response: unknown, meta?: UsageMeta): Usa
|
|
|
141
141
|
declare function extractGeminiUsage(response: unknown, meta?: UsageMeta): UsageTapEndUsage;
|
|
142
142
|
declare function runOpenAIWithUsageTap<TResult>(client: UsageTapClient, options: UsageTapProviderRunOptions<TResult>): Promise<UsageTapProviderRunResult<TResult>>;
|
|
143
143
|
declare function runOpenRouterWithUsageTap<TResult>(client: UsageTapClient, options: UsageTapProviderRunOptions<TResult>): Promise<UsageTapProviderRunResult<TResult>>;
|
|
144
|
+
declare function runLLMAsAServiceWithUsageTap<TResult>(client: UsageTapClient, options: UsageTapProviderRunOptions<TResult>): Promise<UsageTapProviderRunResult<TResult>>;
|
|
144
145
|
declare function runAnthropicWithUsageTap<TResult>(client: UsageTapClient, options: UsageTapProviderRunOptions<TResult>): Promise<UsageTapProviderRunResult<TResult>>;
|
|
145
146
|
declare function runGeminiWithUsageTap<TResult>(client: UsageTapClient, options: UsageTapProviderRunOptions<TResult>): Promise<UsageTapProviderRunResult<TResult>>;
|
|
146
147
|
|
|
147
|
-
export { type UsageTapAllowed, type UsageTapAllowedCapability, type UsageTapBeginRequest, type UsageTapBeginResponse, type UsageTapCallOptions, type UsageTapCallResult, type UsageTapClient, type UsageTapClientConfig, type UsageTapEndRequest, type UsageTapEndResponse, type UsageTapEndUsage, type UsageTapEntitlementMode, type UsageTapEntitlementOptions, type UsageTapErrorPayload, type UsageTapInvokeContext, type UsageTapInvokeResult, type UsageTapProviderRunOptions, type UsageTapProviderRunResult, type UsageTapReasoningLevel, applyUsageTapEntitlements, beginUsageTapCall, createUsageTapClient, defaultUsageTapErrorMapper, endUsageTapCall, extractAnthropicUsage, extractGeminiUsage, extractOpenAIUsage, runAnthropicWithUsageTap, runGeminiWithUsageTap, runOpenAIWithUsageTap, runOpenRouterWithUsageTap, withUsageTapCall };
|
|
148
|
+
export { type UsageTapAllowed, type UsageTapAllowedCapability, type UsageTapBeginRequest, type UsageTapBeginResponse, type UsageTapCallOptions, type UsageTapCallResult, type UsageTapClient, type UsageTapClientConfig, type UsageTapEndRequest, type UsageTapEndResponse, type UsageTapEndUsage, type UsageTapEntitlementMode, type UsageTapEntitlementOptions, type UsageTapErrorPayload, type UsageTapInvokeContext, type UsageTapInvokeResult, type UsageTapProviderRunOptions, type UsageTapProviderRunResult, type UsageTapReasoningLevel, applyUsageTapEntitlements, beginUsageTapCall, createUsageTapClient, defaultUsageTapErrorMapper, endUsageTapCall, extractAnthropicUsage, extractGeminiUsage, extractOpenAIUsage, runAnthropicWithUsageTap, runGeminiWithUsageTap, runLLMAsAServiceWithUsageTap, runOpenAIWithUsageTap, runOpenRouterWithUsageTap, withUsageTapCall };
|
package/dist/usagetap/index.js
CHANGED
|
@@ -9,10 +9,11 @@ import {
|
|
|
9
9
|
extractOpenAIUsage,
|
|
10
10
|
runAnthropicWithUsageTap,
|
|
11
11
|
runGeminiWithUsageTap,
|
|
12
|
+
runLLMAsAServiceWithUsageTap,
|
|
12
13
|
runOpenAIWithUsageTap,
|
|
13
14
|
runOpenRouterWithUsageTap,
|
|
14
15
|
withUsageTapCall
|
|
15
|
-
} from "../chunk-
|
|
16
|
+
} from "../chunk-AGTGIZMR.js";
|
|
16
17
|
export {
|
|
17
18
|
applyUsageTapEntitlements,
|
|
18
19
|
beginUsageTapCall,
|
|
@@ -24,6 +25,7 @@ export {
|
|
|
24
25
|
extractOpenAIUsage,
|
|
25
26
|
runAnthropicWithUsageTap,
|
|
26
27
|
runGeminiWithUsageTap,
|
|
28
|
+
runLLMAsAServiceWithUsageTap,
|
|
27
29
|
runOpenAIWithUsageTap,
|
|
28
30
|
runOpenRouterWithUsageTap,
|
|
29
31
|
withUsageTapCall
|