@x12i/ai-tools 2.0.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/ami/Documents/prometheus/x12i/ai-tools/dist/chunk-WOHMHXRZ.cjs","../src/cost/constants.ts","../src/cost/enrichCostResult.ts","../src/cost/extractUsageInput.ts","../src/cost/resolveUsageModel.ts","../src/cost/aiProfilesMatch.ts","../src/cost/costModelResolution.ts","../src/cost/profilePricing.ts","../src/cost/CostCalculator.ts"],"names":["require","routedViaOpenRouter","pricing","cost","breakdown"],"mappings":"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","file":"/Users/ami/Documents/prometheus/x12i/ai-tools/dist/chunk-WOHMHXRZ.cjs","sourcesContent":[null,"/** Default OpenRouter platform surcharge when catalog markup fields are absent (5%). */\nexport const DEFAULT_OPENROUTER_MARKUP_RATE = 0.05;\n\n/** ai-profiles tiered pricing threshold (tokens). */\nexport const PROFILE_TIERED_CONTEXT_THRESHOLD = 200_000;\n","import type { ExtractUsageInputResult } from \"./extractUsageInput.js\";\nimport type { AiCostExtraction, AiCostResult, AiUsageInput } from \"./types.js\";\n\nexport function toCostExtraction(\n provenance: ExtractUsageInputResult[\"provenance\"],\n): AiCostExtraction {\n return {\n model: { field: provenance.model.field, path: provenance.model.path },\n tokens: {\n source: provenance.tokens.source,\n path: provenance.tokens.path,\n estimated: provenance.tokens.estimated,\n },\n ...(provenance.modelUsed\n ? {\n modelUsed: {\n field: provenance.modelUsed.field,\n path: provenance.modelUsed.path,\n },\n }\n : {}),\n ...(provenance.provider\n ? {\n provider: {\n field: provenance.provider.field,\n path: provenance.provider.path,\n },\n }\n : {}),\n };\n}\n\n/** Attach usage, provider, and model fields callers expect on every cost response. */\nexport function enrichCostResult(\n result: Omit<\n AiCostResult,\n \"usage\" | \"provider\" | \"usedModel\" | \"model\" | \"extraction\"\n >,\n input: AiUsageInput,\n extraction?: AiCostExtraction,\n): AiCostResult {\n /** Original model id from the caller — never replaced by catalog resolution. */\n const receivedModelId = input.usedModel ?? input.modelUsed ?? input.model;\n\n return {\n ...result,\n provider: input.provider,\n usage: { ...input.tokens },\n ...(receivedModelId ? { usedModel: receivedModelId } : {}),\n ...(input.model && input.model !== receivedModelId ? { model: input.model } : {}),\n ...(extraction ? { extraction } : {}),\n };\n}\n","import type { AiUsageInput } from \"./types.js\";\n\n/** Model id field priority (higher wins). Runtime ids beat request/config aliases. */\nexport const MODEL_FIELD_PRIORITY: readonly { key: string; score: number }[] = [\n { key: \"usedModel\", score: 1000 },\n { key: \"modelUsed\", score: 990 },\n { key: \"resolvedModel\", score: 980 },\n { key: \"model\", score: 500 },\n { key: \"xynthesisModel\", score: 120 },\n { key: \"skillModel\", score: 110 },\n] as const;\n\n/** Path segments that boost or penalize a model candidate. */\nconst MODEL_PATH_BONUS: readonly { pattern: RegExp; bonus: number }[] = [\n { pattern: /(^|\\.)response(\\.|$)/i, bonus: 40 },\n { pattern: /(^|\\.)outer\\.input(\\.|$)/i, bonus: 35 },\n { pattern: /(^|\\.)config(?!\\.rawConfig)(\\.|$)/i, bonus: 30 },\n { pattern: /(^|\\.)outer\\.input\\.config(\\.|$)/i, bonus: 28 },\n { pattern: /(^|\\.)usage(\\.|$)/i, bonus: 15 },\n { pattern: /(^|\\.)rawConfig(\\.|$)/i, bonus: -40 },\n { pattern: /workingMemory/i, bonus: -50 },\n { pattern: /requestExample/i, bonus: -80 },\n { pattern: /graphsStudio/i, bonus: -80 },\n];\n\nconst PROVIDER_FIELD_PRIORITY: readonly { key: string; score: number }[] = [\n { key: \"provider\", score: 500 },\n { key: \"providerId\", score: 480 },\n] as const;\n\nconst PROVIDER_PATH_BONUS: readonly { pattern: RegExp; bonus: number }[] = [\n { pattern: /(^|\\.)config(?!\\.rawConfig)(\\.|$)/i, bonus: 30 },\n { pattern: /(^|\\.)outer\\.input(\\.|$)/i, bonus: 20 },\n { pattern: /(^|\\.)rawConfig(\\.|$)/i, bonus: -20 },\n];\n\nconst PROMPT_TOKEN_KEYS = new Set([\n \"prompt\",\n \"prompt_tokens\",\n \"promptTokens\",\n \"input_tokens\",\n \"inputTokens\",\n \"estimatedInputTokens\",\n \"input\",\n]);\n\nconst COMPLETION_TOKEN_KEYS = new Set([\n \"completion\",\n \"completion_tokens\",\n \"completionTokens\",\n \"output_tokens\",\n \"outputTokens\",\n \"estimatedOutputTokens\",\n \"output\",\n]);\n\nconst OPTIONAL_TOKEN_KEYS: Record<string, keyof AiUsageInput[\"tokens\"]> = {\n total: \"total\",\n total_tokens: \"total\",\n totalTokens: \"total\",\n cached: \"cached\",\n cached_tokens: \"cached\",\n cache_read_tokens: \"cached\",\n cacheReadTokens: \"cached\",\n cacheWrite: \"cacheWrite\",\n cache_write_tokens: \"cacheWrite\",\n cacheWriteTokens: \"cacheWrite\",\n reasoning: \"reasoning\",\n reasoning_tokens: \"reasoning\",\n reasoningTokens: \"reasoning\",\n audio: \"audio\",\n audio_tokens: \"audio\",\n image: \"image\",\n image_tokens: \"image\",\n};\n\nexport type FieldProvenance = {\n field: string;\n path: string;\n score: number;\n};\n\nexport type TokenExtractionProvenance = {\n source: \"usage\" | \"tokens\" | \"diagnostics\" | \"estimated\";\n path: string;\n estimated?: boolean;\n};\n\nexport type ExtractUsageInputResult = {\n input: AiUsageInput;\n provenance: {\n model: FieldProvenance;\n modelUsed?: FieldProvenance;\n provider?: FieldProvenance;\n tokens: TokenExtractionProvenance;\n };\n};\n\nexport type ExtractUsageInputOptions = {\n /** Default when no provider field is found (default: `openrouter`). */\n defaultProvider?: string;\n};\n\ntype ModelCandidate = FieldProvenance & { value: string };\ntype ProviderCandidate = FieldProvenance & { value: string };\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n return v !== null && typeof v === \"object\" && !Array.isArray(v);\n}\n\nfunction modelKeyScore(key: string): number {\n return MODEL_FIELD_PRIORITY.find((e) => e.key === key)?.score ?? 0;\n}\n\nfunction providerKeyScore(key: string): number {\n return PROVIDER_FIELD_PRIORITY.find((e) => e.key === key)?.score ?? 0;\n}\n\nfunction pathBonus(path: string, rules: readonly { pattern: RegExp; bonus: number }[]): number {\n let bonus = 0;\n for (const { pattern, bonus: b } of rules) {\n if (pattern.test(path)) bonus += b;\n }\n return bonus;\n}\n\nfunction normalizeModelValue(v: unknown): string | undefined {\n if (typeof v !== \"string\") return undefined;\n const t = v.trim();\n return t.length > 0 ? t : undefined;\n}\n\nfunction normalizeProviderValue(v: unknown): string | undefined {\n if (typeof v !== \"string\") return undefined;\n const t = v.trim().toLowerCase();\n if (!t || t === \"null\") return undefined;\n return t;\n}\n\nfunction collectModelCandidates(\n node: unknown,\n path: string,\n out: ModelCandidate[],\n depth: number,\n maxDepth: number,\n): void {\n if (depth > maxDepth || node === null || node === undefined) return;\n\n if (isPlainObject(node)) {\n for (const [key, value] of Object.entries(node)) {\n const childPath = path ? `${path}.${key}` : key;\n const base = modelKeyScore(key);\n if (base > 0) {\n const model = normalizeModelValue(value);\n if (model) {\n out.push({\n field: key,\n path: childPath,\n value: model,\n score: base + pathBonus(childPath, MODEL_PATH_BONUS),\n });\n }\n }\n collectModelCandidates(value, childPath, out, depth + 1, maxDepth);\n }\n return;\n }\n\n if (Array.isArray(node)) {\n for (let i = 0; i < node.length; i++) {\n collectModelCandidates(node[i], `${path}[${i}]`, out, depth + 1, maxDepth);\n }\n }\n}\n\nfunction collectProviderCandidates(\n node: unknown,\n path: string,\n out: ProviderCandidate[],\n depth: number,\n maxDepth: number,\n): void {\n if (depth > maxDepth || node === null || node === undefined) return;\n\n if (isPlainObject(node)) {\n for (const [key, value] of Object.entries(node)) {\n const childPath = path ? `${path}.${key}` : key;\n const base = providerKeyScore(key);\n if (base > 0) {\n const provider = normalizeProviderValue(value);\n if (provider) {\n out.push({\n field: key,\n path: childPath,\n value: provider,\n score: base + pathBonus(childPath, PROVIDER_PATH_BONUS),\n });\n }\n }\n collectProviderCandidates(value, childPath, out, depth + 1, maxDepth);\n }\n return;\n }\n\n if (Array.isArray(node)) {\n for (let i = 0; i < node.length; i++) {\n collectProviderCandidates(node[i], `${path}[${i}]`, out, depth + 1, maxDepth);\n }\n }\n}\n\nfunction readNumber(obj: Record<string, unknown>, keys: Set<string>): number | undefined {\n for (const [k, v] of Object.entries(obj)) {\n if (!keys.has(k)) continue;\n if (typeof v === \"number\" && Number.isFinite(v) && v >= 0) return v;\n }\n return undefined;\n}\n\nfunction readOptionalNumbers(\n obj: Record<string, unknown>,\n): Partial<AiUsageInput[\"tokens\"]> {\n const extra: Partial<AiUsageInput[\"tokens\"]> = {};\n for (const [k, v] of Object.entries(obj)) {\n const target = OPTIONAL_TOKEN_KEYS[k];\n if (!target || typeof v !== \"number\" || !Number.isFinite(v) || v < 0) continue;\n extra[target] = v;\n }\n return extra;\n}\n\nfunction looksLikeUsageObject(obj: Record<string, unknown>): boolean {\n const hasPrompt = readNumber(obj, PROMPT_TOKEN_KEYS) !== undefined;\n const hasCompletion = readNumber(obj, COMPLETION_TOKEN_KEYS) !== undefined;\n return hasPrompt && hasCompletion;\n}\n\nfunction looksLikeDiagnosticsObject(obj: Record<string, unknown>): boolean {\n return (\n typeof obj.estimatedInputTokens === \"number\" &&\n typeof obj.estimatedOutputTokens === \"number\"\n );\n}\n\ntype TokenCandidate = {\n tokens: AiUsageInput[\"tokens\"];\n provenance: TokenExtractionProvenance;\n score: number;\n};\n\nfunction tokensFromObject(\n obj: Record<string, unknown>,\n source: TokenExtractionProvenance[\"source\"],\n path: string,\n estimated: boolean,\n score: number,\n): TokenCandidate | null {\n const prompt = readNumber(obj, PROMPT_TOKEN_KEYS);\n const completion = readNumber(obj, COMPLETION_TOKEN_KEYS);\n if (prompt === undefined || completion === undefined) return null;\n\n const extra = readOptionalNumbers(obj);\n const total =\n typeof extra.total === \"number\" ? extra.total : prompt + completion;\n\n return {\n tokens: {\n prompt,\n completion,\n total,\n ...extra,\n },\n provenance: { source, path, estimated },\n score,\n };\n}\n\nfunction collectTokenCandidates(\n node: unknown,\n path: string,\n out: TokenCandidate[],\n depth: number,\n maxDepth: number,\n): void {\n if (depth > maxDepth || node === null || node === undefined) return;\n\n if (isPlainObject(node)) {\n if (path.endsWith(\"diagnostics\") || looksLikeDiagnosticsObject(node)) {\n const cand = tokensFromObject(node, \"diagnostics\", path, true, 200);\n if (cand) out.push(cand);\n } else if (path.endsWith(\"usage\") || path.endsWith(\"tokens\") || looksLikeUsageObject(node)) {\n const source = path.endsWith(\"tokens\") ? \"tokens\" : \"usage\";\n const estimated = false;\n const score = path.endsWith(\"usage\") ? 500 : 450;\n const cand = tokensFromObject(node, source, path, estimated, score);\n if (cand) out.push(cand);\n }\n\n for (const [key, value] of Object.entries(node)) {\n const childPath = path ? `${path}.${key}` : key;\n if (key === \"usage\" || key === \"tokens\" || key === \"diagnostics\") {\n if (isPlainObject(value)) {\n collectTokenCandidates(value, childPath, out, depth + 1, maxDepth);\n }\n } else {\n collectTokenCandidates(value, childPath, out, depth + 1, maxDepth);\n }\n }\n return;\n }\n\n if (Array.isArray(node)) {\n for (let i = 0; i < node.length; i++) {\n collectTokenCandidates(node[i], `${path}[${i}]`, out, depth + 1, maxDepth);\n }\n }\n}\n\nfunction pickBestModel(candidates: ModelCandidate[]): ModelCandidate | null {\n if (candidates.length === 0) return null;\n return [...candidates].sort((a, b) => b.score - a.score)[0]!;\n}\n\nfunction pickBestProvider(candidates: ProviderCandidate[]): ProviderCandidate | null {\n if (candidates.length === 0) return null;\n return [...candidates].sort((a, b) => b.score - a.score)[0]!;\n}\n\nfunction pickBestTokens(candidates: TokenCandidate[]): TokenCandidate | null {\n if (candidates.length === 0) return null;\n return [...candidates].sort((a, b) => b.score - a.score)[0]!;\n}\n\nfunction inferProviderFromModel(model: string, fallback: string): string {\n const slash = model.indexOf(\"/\");\n if (slash > 0) {\n const prefix = model.slice(0, slash).toLowerCase();\n if (prefix !== \"openrouter\") return prefix;\n }\n return fallback;\n}\n\n/**\n * Extract {@link AiUsageInput} from activity logs, gateway records, MongoDB exports,\n * or any nested JSON shape (e.g. `outer.input`, `config`, `metadata.diagnostics`).\n */\nexport function extractUsageInput(\n record: unknown,\n options: ExtractUsageInputOptions = {},\n): ExtractUsageInputResult {\n const defaultProvider = options.defaultProvider ?? \"openrouter\";\n const maxDepth = 24;\n\n const modelCandidates: ModelCandidate[] = [];\n const providerCandidates: ProviderCandidate[] = [];\n const tokenCandidates: TokenCandidate[] = [];\n\n collectModelCandidates(record, \"\", modelCandidates, 0, maxDepth);\n collectProviderCandidates(record, \"\", providerCandidates, 0, maxDepth);\n collectTokenCandidates(record, \"\", tokenCandidates, 0, maxDepth);\n\n const bestModel = pickBestModel(modelCandidates);\n if (!bestModel) {\n throw new Error(\n \"[ai-tools] Could not extract a model from the record (looked for usedModel, modelUsed, model, …).\",\n );\n }\n\n const runtimeFields = new Set([\"usedModel\", \"modelUsed\", \"resolvedModel\"]);\n const isRuntimeModel = runtimeFields.has(bestModel.field);\n const requestModel = modelCandidates.find(\n (c) => c.field === \"model\" && c.path !== bestModel.path,\n );\n\n const bestProvider = pickBestProvider(providerCandidates);\n const provider =\n bestProvider?.value ??\n inferProviderFromModel(bestModel.value, defaultProvider);\n\n const bestTokens = pickBestTokens(tokenCandidates);\n if (!bestTokens) {\n throw new Error(\n \"[ai-tools] Could not extract token usage from the record (usage, tokens, or metadata.diagnostics).\",\n );\n }\n\n const input: AiUsageInput = {\n tokens: bestTokens.tokens,\n provider,\n ...(isRuntimeModel\n ? { modelUsed: bestModel.value, model: requestModel?.value }\n : { model: bestModel.value }),\n };\n\n const provenance: ExtractUsageInputResult[\"provenance\"] = {\n model: {\n field: bestModel.field,\n path: bestModel.path,\n score: bestModel.score,\n },\n tokens: bestTokens.provenance,\n };\n\n if (bestProvider) {\n provenance.provider = {\n field: bestProvider.field,\n path: bestProvider.path,\n score: bestProvider.score,\n };\n }\n\n if (isRuntimeModel && requestModel) {\n provenance.modelUsed = {\n field: bestModel.field,\n path: bestModel.path,\n score: bestModel.score,\n };\n } else if (input.modelUsed) {\n provenance.modelUsed = provenance.model;\n }\n\n return { input, provenance };\n}\n","import type { AiUsageInput } from \"./types.js\";\n\n/** Prefer runtime id (`usedModel` / `modelUsed`); fall back to `model`. */\nexport function resolveUsageModel(input: AiUsageInput): string {\n const value = input.usedModel ?? input.modelUsed ?? input.model;\n if (!value?.trim()) {\n throw new Error(\n \"[ai-tools] Cost calculation requires `usedModel`, `modelUsed`, or `model` on usage input.\",\n );\n }\n return value.trim();\n}\n","import { createRequire } from \"node:module\";\nimport { dirname, join } from \"node:path\";\nimport { AIProfilesError, resolveAIProfile } from \"@x12i/ai-profiles\";\nimport type {\n AIProfileBackend,\n AIProfileChoice,\n AIModelPricing,\n AIProfilesRegistry,\n InstructionTier,\n ResolvedAIProfile,\n} from \"@x12i/ai-profiles\";\nimport { providerHintForProfiles } from \"./costModelResolution.js\";\nimport { normalizeProvider, normalizeString } from \"../sync/modelNameResolver/normalize.js\";\nimport { stripModelVersionSuffix } from \"../sync/modelNameResolver/stripVersionSuffix.js\";\n\nconst require = createRequire(import.meta.url);\n\ntype LoadRegistryFn = (options?: {\n source?: \"auto\" | \"remote\" | \"bundled\";\n refresh?: boolean;\n}) => Promise<AIProfilesRegistry>;\n\nfunction loadProfilesRegistry(): Promise<AIProfilesRegistry> {\n const entry = dirname(require.resolve(\"@x12i/ai-profiles\"));\n const loader = require(join(entry, \"loader/loadAIProfilesRegistry.js\")) as {\n loadAIProfilesRegistry: LoadRegistryFn;\n };\n return loader.loadAIProfilesRegistry({ source: \"auto\" });\n}\n\nexport type AiProfilesModelMatch = {\n provider: string;\n modelId: string;\n canonicalModelId: string;\n pricing?: AIModelPricing;\n instructionTier: InstructionTier;\n backend: AIProfileBackend;\n matchedVia: \"profile\" | \"shortcut\" | \"profile-alias\" | \"model-id\";\n profile?: string;\n choice?: string;\n};\n\nfunction profileKey(value: string): string {\n return value.trim().toLowerCase();\n}\n\nfunction canonicalModelId(provider: string, modelId: string): string {\n const normalized = normalizeString(modelId);\n if (normalized.includes(\"/\")) return normalized;\n const p = normalizeProvider(provider) ?? normalizeString(provider);\n return `${p}/${normalized}`;\n}\n\ntype IndexedChoice = {\n provider: string;\n modelId: string;\n canonicalModelId: string;\n pricing?: AIModelPricing;\n profile: string;\n choice: string;\n};\n\nlet cachedIndex: {\n cacheKey: string;\n byKey: Map<string, IndexedChoice[]>;\n} | null = null;\n\n/** Index bare model ids only — profile/shortcut names resolve via {@link resolveAIProfile}. */\nfunction indexRegistry(registry: AIProfilesRegistry): Map<string, IndexedChoice[]> {\n const byKey = new Map<string, IndexedChoice[]>();\n\n const add = (key: string, entry: IndexedChoice) => {\n const k = profileKey(key);\n if (!k) return;\n const list = byKey.get(k) ?? [];\n if (\n list.some(\n (e) =>\n e.canonicalModelId === entry.canonicalModelId &&\n e.choice === entry.choice &&\n e.profile === entry.profile,\n )\n ) {\n return;\n }\n list.push(entry);\n byKey.set(k, list);\n };\n\n for (const profile of Object.values(registry.profiles)) {\n for (const [choiceKey, choice] of Object.entries(profile.choices)) {\n const entry = choiceEntry(choice, profile.profile, choiceKey);\n add(choice.modelId, entry);\n add(canonicalModelId(choice.provider, choice.modelId), entry);\n }\n }\n\n return byKey;\n}\n\nfunction choiceEntry(\n choice: AIProfileChoice,\n profile: string,\n choiceKey: string,\n): IndexedChoice {\n const canonical = canonicalModelId(choice.provider, choice.modelId);\n return {\n provider: normalizeProvider(choice.provider) ?? choice.provider,\n modelId: normalizeString(choice.modelId),\n canonicalModelId: canonical,\n pricing: choice.pricing,\n profile,\n choice: choiceKey,\n };\n}\n\nasync function getProfileIndex(): Promise<Map<string, IndexedChoice[]>> {\n const registry = await loadProfilesRegistry();\n const cacheKey = `${registry.version}:${registry.generatedAt ?? \"\"}:${registry.source}`;\n if (cachedIndex?.cacheKey === cacheKey) {\n return cachedIndex.byKey;\n }\n const byKey = indexRegistry(registry);\n cachedIndex = { cacheKey, byKey };\n return byKey;\n}\n\nfunction scoreCandidate(\n entry: IndexedChoice,\n model: string,\n providerHint?: string,\n): number {\n const normalized = normalizeString(model);\n let score = 0;\n\n if (normalized === entry.canonicalModelId) score += 100;\n if (normalized === entry.modelId) score += 80;\n if (providerHint && entry.provider === providerHint) score += 50;\n if (entry.pricing) score += 2;\n\n return score;\n}\n\nfunction pickBest(\n candidates: IndexedChoice[],\n model: string,\n providerHint?: string,\n): IndexedChoice | null {\n if (candidates.length === 0) return null;\n if (candidates.length === 1) return candidates[0]!;\n\n let best = candidates[0]!;\n let bestScore = scoreCandidate(best, model, providerHint);\n for (let i = 1; i < candidates.length; i++) {\n const c = candidates[i]!;\n const s = scoreCandidate(c, model, providerHint);\n if (s > bestScore) {\n best = c;\n bestScore = s;\n }\n }\n return best;\n}\n\nfunction resolvedToMatch(resolved: ResolvedAIProfile): AiProfilesModelMatch {\n return {\n provider: normalizeProvider(resolved.provider) ?? resolved.provider,\n modelId: normalizeString(resolved.modelId),\n canonicalModelId: canonicalModelId(resolved.provider, resolved.modelId),\n pricing: resolved.pricing,\n instructionTier: resolved.instructionTier,\n backend: resolved.backend,\n matchedVia: resolved.shortcut ? \"shortcut\" : \"profile\",\n profile: resolved.profile,\n choice: resolved.choice,\n };\n}\n\nasync function fromIndexed(entry: IndexedChoice): Promise<AiProfilesModelMatch> {\n const resolved = await resolveAIProfile(entry.profile, { choice: entry.choice });\n return {\n provider: normalizeProvider(resolved.provider) ?? resolved.provider,\n modelId: normalizeString(resolved.modelId),\n canonicalModelId: canonicalModelId(resolved.provider, resolved.modelId),\n pricing: resolved.pricing ?? entry.pricing,\n instructionTier: resolved.instructionTier,\n backend: resolved.backend,\n matchedVia: \"model-id\",\n profile: resolved.profile,\n choice: resolved.choice,\n };\n}\n\nasync function lookupInIndex(\n index: Map<string, IndexedChoice[]>,\n model: string,\n provider?: string,\n): Promise<AiProfilesModelMatch | null> {\n const providerHint = provider ? normalizeProvider(provider) : undefined;\n const keys = [\n profileKey(model),\n profileKey(normalizeString(model)),\n ];\n if (providerHint) {\n keys.push(profileKey(canonicalModelId(providerHint, model)));\n }\n\n const pooled: IndexedChoice[] = [];\n for (const key of keys) {\n const hits = index.get(key);\n if (hits) pooled.push(...hits);\n }\n\n const bare = normalizeString(model);\n if (!bare.includes(\"/\")) {\n for (const list of index.values()) {\n for (const entry of list) {\n if (entry.modelId === bare) pooled.push(entry);\n }\n }\n }\n\n const unique = new Map<string, IndexedChoice>();\n for (const e of pooled) {\n unique.set(`${e.profile}:${e.choice}:${e.canonicalModelId}`, e);\n }\n\n const best = pickBest([...unique.values()], model, providerHint);\n return best ? fromIndexed(best) : null;\n}\n\n/**\n * Resolve a model string via @x12i/ai-profiles — profile/shortcut names, aliases,\n * or a concrete model id that appears on a profile choice.\n */\nexport async function matchModelInAiProfiles(\n model: string,\n provider?: string,\n): Promise<AiProfilesModelMatch | null> {\n try {\n const resolved = await resolveAIProfile(model);\n return resolvedToMatch(resolved);\n } catch (err) {\n if (!(err instanceof AIProfilesError) || err.code !== \"UNKNOWN_PROFILE\") {\n throw err;\n }\n }\n\n const index = await getProfileIndex();\n const hint = providerHintForProfiles(model, provider);\n const direct = await lookupInIndex(index, model, hint);\n if (direct) return direct;\n\n const stripped = stripModelVersionSuffix(model);\n if (stripped && stripped !== normalizeString(model)) {\n return lookupInIndex(\n index,\n stripped,\n providerHintForProfiles(stripped, provider),\n );\n }\n\n return null;\n}\n\n/** @internal Test-only — reset module cache between tests. */\nexport function resetAiProfilesMatchCacheForTests(): void {\n cachedIndex = null;\n}\n","import type { AiModelsCatalogClient } from \"../catalog/AiModelsCatalogClient.js\";\nimport { LOCAL_PROVIDERS } from \"../sync/modelNameResolver/constants.js\";\nimport {\n loadOpenRouterRoutingEnv,\n shouldDefaultRouteViaOpenRouter,\n} from \"../sync/openRouterRoutingEnv.js\";\nimport { normalizeProvider, normalizeString } from \"../sync/modelNameResolver/normalize.js\";\nimport type {\n ModelResolutionInput,\n ModelResolutionResult,\n ModelResolverOptions,\n} from \"../sync/modelNameResolver/types.js\";\nimport type { OpenRouterRoutingConfig } from \"../sync/openRouterRoutingEnv.js\";\n\nexport function isOpenRouterProvider(provider?: string): boolean {\n return normalizeProvider(provider) === \"openrouter\";\n}\n\nexport function isLocalProvider(provider?: string): boolean {\n const p = normalizeProvider(provider) ?? normalizeString(provider ?? \"\");\n return LOCAL_PROVIDERS.has(p);\n}\n\n/** Catalog resolver returned success without a priced record (Ollama, LM Studio, …). */\nexport function isLocalProviderResolution(\n resolved: ModelResolutionResult | null,\n inputProvider?: string,\n): boolean {\n if (!resolved?.found || resolved.record) return false;\n if (resolved.resolvedVia.includes(\"local-provider-passthrough\")) return true;\n return isLocalProvider(inputProvider);\n}\n\n/**\n * Vendor id for a model slug (`openai/gpt-4o` → `openai`).\n * Ignores `openrouter` as a provider hint — it is a routing layer, not the model owner.\n */\nexport function underlyingProviderFromModel(\n model: string,\n providerHint?: string,\n): string | undefined {\n const normalized = normalizeString(model);\n if (normalized.includes(\"/\")) {\n const prefix = normalized.split(\"/\")[0]!;\n if (!isOpenRouterProvider(prefix)) return prefix;\n }\n if (providerHint && !isOpenRouterProvider(providerHint)) {\n return normalizeProvider(providerHint);\n }\n return undefined;\n}\n\n/** Provider hint for ai-profiles index lookup (openrouter → underlying vendor). */\nexport function providerHintForProfiles(\n model: string,\n provider?: string,\n): string | undefined {\n if (isOpenRouterProvider(provider)) {\n return underlyingProviderFromModel(model, provider);\n }\n return normalizeProvider(provider);\n}\n\n/**\n * Catalog resolve attempts for direct API and OpenRouter usage.\n * Tries the caller hint, inferred vendor, no hint, and openrouter routing.\n */\nexport function buildCatalogResolveAttempts(\n model: string,\n provider?: string,\n): ModelResolutionInput[] {\n const attempts: ModelResolutionInput[] = [];\n const seen = new Set<string>();\n const add = (m: string, p?: string) => {\n const key = `${p ?? \"\"}\\0${normalizeString(m)}`;\n if (seen.has(key)) return;\n seen.add(key);\n attempts.push({ model: m, provider: p });\n };\n\n add(model, provider);\n\n const underlying = underlyingProviderFromModel(model, provider);\n if (provider) add(model, undefined);\n if (underlying) add(model, underlying);\n if (!isOpenRouterProvider(provider)) {\n add(model, \"openrouter\");\n }\n\n return attempts;\n}\n\nexport async function resolveFromCatalogAttempts(\n catalog: AiModelsCatalogClient,\n attempts: ModelResolutionInput[],\n options?: ModelResolverOptions,\n): Promise<ModelResolutionResult | null> {\n let last: ModelResolutionResult | null = null;\n let localPassthrough: ModelResolutionResult | null = null;\n\n for (const attempt of attempts) {\n const result = await catalog.resolveModel(attempt, options);\n last = result;\n if (result.found && result.record) return result;\n if (\n result.found &&\n !result.record &&\n isLocalProviderResolution(result, attempt.provider)\n ) {\n localPassthrough = result;\n }\n }\n\n return localPassthrough ?? last;\n}\n\nexport function resolveRoutedViaOpenRouter(\n inputProvider: string | undefined,\n resolved: ModelResolutionResult | null,\n modelId?: string,\n routingEnv?: OpenRouterRoutingConfig,\n): boolean {\n const env = routingEnv ?? loadOpenRouterRoutingEnv();\n\n if (isOpenRouterProvider(inputProvider)) return true;\n\n if (resolved?.found) {\n return resolved.routedViaOpenRouter;\n }\n\n const vendor = underlyingProviderFromModel(\n modelId ?? (resolved?.found ? resolved.modelId : \"\") ?? \"\",\n inputProvider,\n );\n if (vendor && shouldDefaultRouteViaOpenRouter(vendor, env)) {\n return true;\n }\n\n return false;\n}\n","import type { AIModelPricing } from \"@x12i/ai-profiles\";\nimport {\n DEFAULT_OPENROUTER_MARKUP_RATE,\n PROFILE_TIERED_CONTEXT_THRESHOLD,\n} from \"./constants.js\";\nimport type { AiModelPricing, AiUsageInput } from \"./types.js\";\n\nconst TOKENS_PER_UNIT = 1_000_000;\n\nfunction usdPerToken(perMillion?: number): number {\n return (perMillion ?? 0) / TOKENS_PER_UNIT;\n}\n\nfunction pickInputRatePerMillion(\n pricing: AIModelPricing,\n promptTokens: number,\n): number | undefined {\n if (\n pricing.inputBelow200k !== undefined &&\n pricing.inputAbove200k !== undefined\n ) {\n return promptTokens <= PROFILE_TIERED_CONTEXT_THRESHOLD\n ? pricing.inputBelow200k\n : pricing.inputAbove200k;\n }\n return pricing.input ?? pricing.inputBelow200k ?? pricing.inputAbove200k;\n}\n\nfunction pickOutputRatePerMillion(\n pricing: AIModelPricing,\n promptTokens: number,\n): number | undefined {\n if (\n pricing.outputBelow200k !== undefined &&\n pricing.outputAbove200k !== undefined\n ) {\n return promptTokens <= PROFILE_TIERED_CONTEXT_THRESHOLD\n ? pricing.outputBelow200k\n : pricing.outputAbove200k;\n }\n return pricing.output ?? pricing.outputBelow200k ?? pricing.outputAbove200k;\n}\n\nexport type AiProfilesPricingOptions = {\n promptTokens?: number;\n routedViaOpenRouter?: boolean;\n};\n\nexport function aiProfilesPricingToCatalogPricing(\n pricing: AIModelPricing,\n pricedAt: string,\n options: AiProfilesPricingOptions = {},\n): AiModelPricing {\n const promptTokens = options.promptTokens ?? 0;\n const promptUsdPerToken = usdPerToken(pickInputRatePerMillion(pricing, promptTokens));\n const completionUsdPerToken = usdPerToken(\n pickOutputRatePerMillion(pricing, promptTokens),\n );\n\n const snapshot: AiModelPricing = {\n promptUsdPerToken,\n completionUsdPerToken,\n cacheReadUsdPerToken: usdPerToken(pricing.cachedInput ?? pricing.cacheHit),\n cacheWriteUsdPerToken: usdPerToken(pricing.cacheWrite5m ?? pricing.cacheWrite1h),\n imageUsdPerUnit: 0,\n requestUsdPerRequest: 0,\n pricedAt,\n source: \"manual\",\n };\n\n if (options.routedViaOpenRouter) {\n snapshot.openRouterMarkupUsdPerInputToken =\n promptUsdPerToken * DEFAULT_OPENROUTER_MARKUP_RATE;\n snapshot.openRouterMarkupUsdPerOutputToken =\n completionUsdPerToken * DEFAULT_OPENROUTER_MARKUP_RATE;\n }\n\n return snapshot;\n}\n\nexport function computeCostFromPricing(\n input: AiUsageInput,\n pricing: AiModelPricing,\n routedViaOpenRouter: boolean,\n includeBreakdown: boolean,\n): { cost: number; breakdown?: import(\"./types.js\").AiCostResult[\"breakdown\"] } {\n const { tokens } = input;\n\n let promptCost = tokens.prompt * pricing.promptUsdPerToken;\n let completionCost = tokens.completion * pricing.completionUsdPerToken;\n\n const cachingCost =\n (tokens.cacheWrite ?? 0) * (pricing.cacheWriteUsdPerToken ?? 0) +\n (tokens.cached ?? 0) * (pricing.cacheReadUsdPerToken ?? 0);\n\n const reasoningCost =\n (tokens.reasoning ?? 0) *\n (pricing.reasoningUsdPerToken ?? pricing.promptUsdPerToken);\n\n const audioCost = (tokens.audio ?? 0) * pricing.promptUsdPerToken;\n const imageCost = (tokens.image ?? 0) * (pricing.imageUsdPerUnit ?? 0);\n const requestFlat = pricing.requestUsdPerRequest;\n\n if (routedViaOpenRouter) {\n promptCost +=\n tokens.prompt * (pricing.openRouterMarkupUsdPerInputToken ?? 0);\n completionCost +=\n tokens.completion * (pricing.openRouterMarkupUsdPerOutputToken ?? 0);\n }\n\n const cost =\n promptCost +\n completionCost +\n cachingCost +\n reasoningCost +\n audioCost +\n imageCost +\n requestFlat;\n\n if (!includeBreakdown) {\n return { cost };\n }\n\n return {\n cost,\n breakdown: {\n promptCostUsd: promptCost,\n completionCostUsd: completionCost,\n cachingCostUsd: cachingCost || undefined,\n reasoningCostUsd: reasoningCost || undefined,\n audioCostUsd: audioCost || undefined,\n imageCostUsd: imageCost || undefined,\n requestFlatCostUsd: requestFlat || undefined,\n },\n };\n}\n","import type { AliasRegistry } from \"../aliases/AliasRegistry.js\";\nimport type { AiModelsCatalogClient } from \"../catalog/AiModelsCatalogClient.js\";\nimport { UnknownModelCostError } from \"../errors.js\";\nimport { normalizeString } from \"../sync/modelNameResolver/normalize.js\";\nimport { stripModelVersionSuffix } from \"../sync/modelNameResolver/stripVersionSuffix.js\";\nimport type {\n ModelResolutionResult,\n ModelResolverOptions,\n} from \"../sync/modelNameResolver/types.js\";\nimport { matchModelInAiProfiles } from \"./aiProfilesMatch.js\";\nimport {\n buildCatalogResolveAttempts,\n isLocalProvider,\n isLocalProviderResolution,\n resolveFromCatalogAttempts,\n resolveRoutedViaOpenRouter,\n} from \"./costModelResolution.js\";\nimport {\n aiProfilesPricingToCatalogPricing,\n computeCostFromPricing,\n} from \"./profilePricing.js\";\nimport { enrichCostResult, toCostExtraction } from \"./enrichCostResult.js\";\nimport {\n extractUsageInput,\n type ExtractUsageInputOptions,\n} from \"./extractUsageInput.js\";\nimport { resolveUsageModel } from \"./resolveUsageModel.js\";\nimport type { AiCostResult, AiCostWarning, AiModelPricing, AiUsageInput } from \"./types.js\";\n\nexport type CostCalculatorOptions = {\n aliasRegistry?: AliasRegistry;\n includeBreakdown?: boolean;\n resolverOptions?: ModelResolverOptions;\n /** When true, throw {@link UnknownModelCostError} instead of zero-cost fallback. */\n throwOnUnknownModel?: boolean;\n};\n\nfunction emptyPricing(): AiModelPricing {\n return {\n promptUsdPerToken: 0,\n completionUsdPerToken: 0,\n imageUsdPerUnit: 0,\n requestUsdPerRequest: 0,\n pricedAt: new Date().toISOString(),\n source: \"manual\",\n };\n}\n\nfunction mergeAttempts(\n ...groups: ReturnType<typeof buildCatalogResolveAttempts>[]\n): ReturnType<typeof buildCatalogResolveAttempts> {\n const seen = new Set<string>();\n const out: ReturnType<typeof buildCatalogResolveAttempts> = [];\n for (const group of groups) {\n for (const a of group) {\n const key = `${a.provider ?? \"\"}\\0${a.model}`;\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(a);\n }\n }\n return out;\n}\n\nexport class CostCalculator {\n private readonly aliasRegistry?: AliasRegistry;\n private readonly includeBreakdown: boolean;\n private readonly resolverOptions?: ModelResolverOptions;\n private readonly throwOnUnknownModel: boolean;\n\n constructor(\n private readonly catalog: AiModelsCatalogClient,\n options: CostCalculatorOptions = {},\n ) {\n this.aliasRegistry = options.aliasRegistry;\n this.includeBreakdown = options.includeBreakdown ?? true;\n this.resolverOptions = options.resolverOptions;\n this.throwOnUnknownModel = options.throwOnUnknownModel ?? false;\n }\n\n /**\n * Extract model, provider, and token usage from an activity / gateway record\n * (MongoDB export, nested `outer`, `config`, `metadata.diagnostics`, etc.)\n * then run {@link calculate}.\n */\n async calculateFromRecord(\n record: unknown,\n extractOptions?: ExtractUsageInputOptions,\n ): Promise<AiCostResult> {\n const { input, provenance } = extractUsageInput(record, extractOptions);\n const warnings: AiCostWarning[] = [];\n if (provenance.tokens.estimated) {\n warnings.push({\n code: \"ESTIMATED_TOKEN_USAGE\",\n message: `Token counts are estimates from ${provenance.tokens.path} (not billed usage).`,\n });\n }\n const result = await this.calculate(input);\n const enriched = enrichCostResult(result, input, toCostExtraction(provenance));\n if (warnings.length > 0) {\n enriched.warnings = [...(enriched.warnings ?? []), ...warnings];\n }\n return enriched;\n }\n\n async calculate(input: AiUsageInput): Promise<AiCostResult> {\n const modelInput = resolveUsageModel(input);\n const resolverOpts = {\n ...this.resolverOptions,\n aliasRegistry: this.aliasRegistry ?? this.resolverOptions?.aliasRegistry,\n };\n\n let resolved = await resolveFromCatalogAttempts(\n this.catalog,\n buildCatalogResolveAttempts(modelInput, input.provider),\n resolverOpts,\n );\n\n if (isLocalProviderResolution(resolved, input.provider)) {\n return this.localProviderResult(modelInput, input, resolved);\n }\n\n let profileMatch = null as Awaited<ReturnType<typeof matchModelInAiProfiles>>;\n const warnings: AiCostWarning[] = [];\n\n if (!resolved?.found || !resolved.record) {\n if (!isLocalProvider(input.provider)) {\n profileMatch = await matchModelInAiProfiles(modelInput, input.provider);\n }\n if (profileMatch) {\n resolved = await resolveFromCatalogAttempts(\n this.catalog,\n mergeAttempts(\n buildCatalogResolveAttempts(\n profileMatch.canonicalModelId,\n input.provider ?? profileMatch.provider,\n ),\n buildCatalogResolveAttempts(\n profileMatch.canonicalModelId,\n profileMatch.provider,\n ),\n ),\n resolverOpts,\n );\n }\n\n if (isLocalProviderResolution(resolved, input.provider)) {\n return this.localProviderResult(modelInput, input, resolved);\n }\n\n if ((!resolved?.found || !resolved.record) && profileMatch?.pricing) {\n const routedViaOpenRouter = resolveRoutedViaOpenRouter(\n input.provider,\n resolved,\n profileMatch.canonicalModelId,\n resolverOpts?.routingEnv,\n );\n const pricing = aiProfilesPricingToCatalogPricing(\n profileMatch.pricing,\n new Date().toISOString(),\n {\n promptTokens: input.tokens.prompt,\n routedViaOpenRouter,\n },\n );\n const { cost, breakdown } = computeCostFromPricing(\n input,\n pricing,\n routedViaOpenRouter,\n this.includeBreakdown,\n );\n\n warnings.push({\n code: \"AI_PROFILES_ESTIMATE\",\n message: `Catalog has no pricing for \"${modelInput}\"; estimated from ai-profiles (${profileMatch.matchedVia} → ${profileMatch.canonicalModelId}).`,\n });\n if (\n routedViaOpenRouter &&\n pricing.openRouterMarkupUsdPerInputToken !== undefined\n ) {\n warnings.push({\n code: \"OPENROUTER_MARKUP_ESTIMATED\",\n message:\n \"OpenRouter markup estimated at 5% of base token rates (catalog markup fields absent).\",\n });\n }\n\n console.warn(`[ai-tools] ${warnings.map((w) => w.message).join(\" \")}`);\n\n return this.finish(\n {\n cost,\n breakdown,\n resolvedModelId: profileMatch.canonicalModelId,\n routedViaOpenRouter,\n isAuthoritative: false,\n pricingSnapshot: pricing,\n source: \"ai-profiles\",\n warnings,\n },\n input,\n resolved,\n );\n }\n }\n\n if (!resolved?.found || !resolved.record) {\n return this.unknownModelResult(modelInput, input, resolved);\n }\n\n const { record, modelId } = resolved;\n const routedViaOpenRouter = resolveRoutedViaOpenRouter(\n input.provider,\n resolved,\n modelId,\n resolverOpts?.routingEnv,\n );\n const pricing = record.pricing;\n const { cost, breakdown } = computeCostFromPricing(\n input,\n pricing,\n routedViaOpenRouter,\n this.includeBreakdown,\n );\n\n return this.finish(\n {\n cost,\n breakdown,\n resolvedModelId: modelId,\n routedViaOpenRouter,\n isAuthoritative: true,\n pricingSnapshot: pricing,\n source: \"catalog\",\n },\n input,\n resolved,\n );\n }\n\n private versionSuffixWarnings(\n input: AiUsageInput,\n pricedModelId: string,\n resolved?: ModelResolutionResult | null,\n ): AiCostWarning[] {\n const received = input.usedModel ?? input.modelUsed ?? input.model;\n if (!received) return [];\n\n const normalizedReceived = normalizeString(received);\n const normalizedPriced = normalizeString(pricedModelId);\n if (normalizedReceived === normalizedPriced) return [];\n\n const stripped = stripModelVersionSuffix(received);\n const viaResolver =\n resolved?.found === true &&\n resolved.resolvedVia.some(\n (s) => s === \"version-suffix-strip\" || s === \"date-suffix-strip\",\n );\n const pricedViaStrip =\n stripped !== null && normalizeString(stripped) === normalizedPriced;\n\n if (!viaResolver && !pricedViaStrip) return [];\n\n return [\n {\n code: \"VERSION_SUFFIX_PRICING\",\n message: `Priced using catalog model \"${pricedModelId}\" (no exact pricing for \"${received}\").`,\n },\n ];\n }\n\n private finish(\n partial: Omit<\n AiCostResult,\n \"usage\" | \"provider\" | \"usedModel\" | \"model\" | \"extraction\"\n >,\n input: AiUsageInput,\n resolved?: ModelResolutionResult | null,\n ): AiCostResult {\n const enriched = enrichCostResult(partial, input);\n const suffixWarnings = this.versionSuffixWarnings(\n input,\n partial.resolvedModelId,\n resolved,\n );\n if (suffixWarnings.length > 0) {\n enriched.warnings = [...(enriched.warnings ?? []), ...suffixWarnings];\n }\n return enriched;\n }\n\n private localProviderResult(\n modelInput: string,\n input: AiUsageInput,\n resolved: Awaited<ReturnType<typeof resolveFromCatalogAttempts>>,\n ): AiCostResult {\n const warnings: AiCostWarning[] = [\n {\n code: \"LOCAL_PROVIDER_NO_PRICING\",\n message: `Local provider \"${input.provider}\" has no catalog pricing for \"${modelInput}\".`,\n },\n ];\n console.warn(`[ai-tools] ${warnings[0]!.message}`);\n return this.finish(\n {\n cost: 0,\n resolvedModelId: resolved?.found ? resolved.modelId : modelInput,\n routedViaOpenRouter: false,\n isAuthoritative: false,\n pricingSnapshot: emptyPricing(),\n source: \"local\",\n warnings,\n },\n input,\n );\n }\n\n private unknownModelResult(\n modelInput: string,\n input: AiUsageInput,\n resolved: Awaited<ReturnType<typeof resolveFromCatalogAttempts>>,\n ): AiCostResult {\n if (this.throwOnUnknownModel) {\n throw new UnknownModelCostError(modelInput, input.provider);\n }\n\n const warnings: AiCostWarning[] = [\n {\n code: \"UNKNOWN_MODEL\",\n message: `Unknown model \"${modelInput}\" (provider: \"${input.provider}\") — returning zero-cost fallback.`,\n },\n ];\n console.warn(`[ai-tools] ${warnings[0]!.message}`);\n\n return this.finish(\n {\n cost: 0,\n resolvedModelId: modelInput,\n routedViaOpenRouter: resolveRoutedViaOpenRouter(\n input.provider,\n resolved,\n modelInput,\n this.resolverOptions?.routingEnv,\n ),\n isAuthoritative: false,\n pricingSnapshot: emptyPricing(),\n source: \"estimate-fallback\",\n unknownModel: true,\n warnings,\n },\n input,\n );\n }\n}\n"]}
@@ -0,0 +1,51 @@
1
+ // src/profiles/resolveProfileForAsk.ts
2
+ import { resolveAIProfile } from "@x12i/ai-profiles";
3
+ function profileConfigFromResolved(resolved) {
4
+ return {
5
+ provider: resolved.provider,
6
+ model: resolved.modelId,
7
+ instructionTier: resolved.instructionTier,
8
+ backend: resolved.backend,
9
+ profile: resolved.profile,
10
+ choice: resolved.choice,
11
+ temperature: resolved.runtime.temperature,
12
+ outputMode: resolved.runtime.outputMode,
13
+ toolPolicy: resolved.runtime.toolPolicy,
14
+ reasoningEffort: resolved.runtime.reasoningEffort,
15
+ executionMode: resolved.runtime.executionMode,
16
+ requireCitations: resolved.runtime.requireCitations,
17
+ allowWeb: resolved.runtime.allowWeb,
18
+ allowFileSearch: resolved.runtime.allowFileSearch,
19
+ allowCodeExecution: resolved.runtime.allowCodeExecution,
20
+ humanReview: resolved.runtime.humanReview,
21
+ ...resolved.metadata !== void 0 ? { metadata: resolved.metadata } : {},
22
+ ...resolved.pricing !== void 0 ? { pricing: resolved.pricing } : {},
23
+ resolved
24
+ };
25
+ }
26
+ async function resolveProfileForAsk(input) {
27
+ const resolved = await resolveAIProfile(input.profile, {
28
+ choice: input.choice,
29
+ source: input.source,
30
+ refresh: input.refresh
31
+ });
32
+ return profileConfigFromResolved(resolved);
33
+ }
34
+
35
+ // src/profiles/index.ts
36
+ import {
37
+ resolveAIProfile as resolveAIProfile2,
38
+ listAIProfiles,
39
+ listAIShortcuts,
40
+ isKnownProfileOrShortcut
41
+ } from "@x12i/ai-profiles";
42
+
43
+ export {
44
+ profileConfigFromResolved,
45
+ resolveProfileForAsk,
46
+ resolveAIProfile2 as resolveAIProfile,
47
+ listAIProfiles,
48
+ listAIShortcuts,
49
+ isKnownProfileOrShortcut
50
+ };
51
+ //# sourceMappingURL=chunk-YQVY7CWT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/profiles/resolveProfileForAsk.ts","../src/profiles/index.ts"],"sourcesContent":["import { resolveAIProfile } from \"@x12i/ai-profiles\";\nimport type {\n AIProfileBackend,\n InstructionTier,\n RegistrySourceMode,\n ResolvedAIProfile,\n} from \"@x12i/ai-profiles\";\n\nexport type ResolveProfileForAskInput = {\n profile: string;\n choice?: string;\n source?: RegistrySourceMode;\n refresh?: boolean;\n};\n\n/** FuncX / ask-node model config derived from {@link ResolvedAIProfile}. */\nexport type AskProfileModelConfig = {\n provider: ResolvedAIProfile[\"provider\"];\n model: string;\n instructionTier: InstructionTier;\n backend: AIProfileBackend;\n profile: string;\n choice: string;\n temperature: number;\n outputMode: ResolvedAIProfile[\"runtime\"][\"outputMode\"];\n toolPolicy: ResolvedAIProfile[\"runtime\"][\"toolPolicy\"];\n reasoningEffort: ResolvedAIProfile[\"runtime\"][\"reasoningEffort\"];\n executionMode: ResolvedAIProfile[\"runtime\"][\"executionMode\"];\n requireCitations: boolean;\n allowWeb: boolean;\n allowFileSearch: boolean;\n allowCodeExecution: boolean;\n humanReview: ResolvedAIProfile[\"runtime\"][\"humanReview\"];\n metadata?: Record<string, unknown>;\n pricing?: ResolvedAIProfile[\"pricing\"];\n resolved: ResolvedAIProfile;\n};\n\nexport function profileConfigFromResolved(\n resolved: ResolvedAIProfile,\n): AskProfileModelConfig {\n return {\n provider: resolved.provider,\n model: resolved.modelId,\n instructionTier: resolved.instructionTier,\n backend: resolved.backend,\n profile: resolved.profile,\n choice: resolved.choice,\n temperature: resolved.runtime.temperature,\n outputMode: resolved.runtime.outputMode,\n toolPolicy: resolved.runtime.toolPolicy,\n reasoningEffort: resolved.runtime.reasoningEffort,\n executionMode: resolved.runtime.executionMode,\n requireCitations: resolved.runtime.requireCitations,\n allowWeb: resolved.runtime.allowWeb,\n allowFileSearch: resolved.runtime.allowFileSearch,\n allowCodeExecution: resolved.runtime.allowCodeExecution,\n humanReview: resolved.runtime.humanReview,\n ...(resolved.metadata !== undefined ? { metadata: resolved.metadata } : {}),\n ...(resolved.pricing !== undefined ? { pricing: resolved.pricing } : {}),\n resolved,\n };\n}\n\n/**\n * Resolve a profile (+ optional choice) into ask-node / FuncX model configuration.\n * Uses {@link ResolvedAIProfile.instructionTier} and {@link ResolvedAIProfile.backend}\n * from `@x12i/ai-profiles` — do not duplicate preset tables locally.\n */\nexport async function resolveProfileForAsk(\n input: ResolveProfileForAskInput,\n): Promise<AskProfileModelConfig> {\n const resolved = await resolveAIProfile(input.profile, {\n choice: input.choice,\n source: input.source,\n refresh: input.refresh,\n });\n return profileConfigFromResolved(resolved);\n}\n","export {\n resolveProfileForAsk,\n profileConfigFromResolved,\n} from \"./resolveProfileForAsk.js\";\nexport type {\n AskProfileModelConfig,\n ResolveProfileForAskInput,\n} from \"./resolveProfileForAsk.js\";\n\nexport type {\n ResolvedAIProfile,\n InstructionTier,\n AIProfileBackend,\n AIProfileSummary,\n AIShortcutSummary,\n ResolveAIProfileOptions,\n RegistrySourceMode,\n} from \"@x12i/ai-profiles\";\n\nexport {\n resolveAIProfile,\n listAIProfiles,\n listAIShortcuts,\n isKnownProfileOrShortcut,\n} from \"@x12i/ai-profiles\";\n"],"mappings":";AAAA,SAAS,wBAAwB;AAsC1B,SAAS,0BACd,UACuB;AACvB,SAAO;AAAA,IACL,UAAU,SAAS;AAAA,IACnB,OAAO,SAAS;AAAA,IAChB,iBAAiB,SAAS;AAAA,IAC1B,SAAS,SAAS;AAAA,IAClB,SAAS,SAAS;AAAA,IAClB,QAAQ,SAAS;AAAA,IACjB,aAAa,SAAS,QAAQ;AAAA,IAC9B,YAAY,SAAS,QAAQ;AAAA,IAC7B,YAAY,SAAS,QAAQ;AAAA,IAC7B,iBAAiB,SAAS,QAAQ;AAAA,IAClC,eAAe,SAAS,QAAQ;AAAA,IAChC,kBAAkB,SAAS,QAAQ;AAAA,IACnC,UAAU,SAAS,QAAQ;AAAA,IAC3B,iBAAiB,SAAS,QAAQ;AAAA,IAClC,oBAAoB,SAAS,QAAQ;AAAA,IACrC,aAAa,SAAS,QAAQ;AAAA,IAC9B,GAAI,SAAS,aAAa,SAAY,EAAE,UAAU,SAAS,SAAS,IAAI,CAAC;AAAA,IACzE,GAAI,SAAS,YAAY,SAAY,EAAE,SAAS,SAAS,QAAQ,IAAI,CAAC;AAAA,IACtE;AAAA,EACF;AACF;AAOA,eAAsB,qBACpB,OACgC;AAChC,QAAM,WAAW,MAAM,iBAAiB,MAAM,SAAS;AAAA,IACrD,QAAQ,MAAM;AAAA,IACd,QAAQ,MAAM;AAAA,IACd,SAAS,MAAM;AAAA,EACjB,CAAC;AACD,SAAO,0BAA0B,QAAQ;AAC3C;;;AC3DA;AAAA,EACE,oBAAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;","names":["resolveAIProfile"]}
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  "use strict"; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
3
3
 
4
- var _chunkNF2SKQR7cjs = require('../chunk-NF2SKQR7.cjs');
4
+ var _chunkWOHMHXRZcjs = require('../chunk-WOHMHXRZ.cjs');
5
5
 
6
6
 
7
7
 
@@ -205,7 +205,7 @@ function registerCostCommand(program2) {
205
205
  cacheTtlMs: _chunk5XAAMBDOcjs.resolveCatalogCacheTtlMs.call(void 0, ),
206
206
  bundledOnly: opts.bundledOnly
207
207
  });
208
- const calculator = new (0, _chunkNF2SKQR7cjs.CostCalculator)(catalogClient, {
208
+ const calculator = new (0, _chunkWOHMHXRZcjs.CostCalculator)(catalogClient, {
209
209
  aliasRegistry: new (0, _chunkBAHBDADJcjs.AliasRegistry)()
210
210
  });
211
211
  const result = await calculator.calculate({
package/dist/cli/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  CostCalculator
4
- } from "../chunk-U2YDDUVP.js";
4
+ } from "../chunk-CTM35DMA.js";
5
5
  import {
6
6
  AliasRegistry,
7
7
  AliasResolver
@@ -7,7 +7,7 @@
7
7
 
8
8
 
9
9
 
10
- var _chunkNF2SKQR7cjs = require('../chunk-NF2SKQR7.cjs');
10
+ var _chunkWOHMHXRZcjs = require('../chunk-WOHMHXRZ.cjs');
11
11
  require('../chunk-EDMCKHO6.cjs');
12
12
  require('../chunk-PADNCGZB.cjs');
13
13
  require('../chunk-GS7T56RP.cjs');
@@ -19,5 +19,5 @@ require('../chunk-GS7T56RP.cjs');
19
19
 
20
20
 
21
21
 
22
- exports.CostCalculator = _chunkNF2SKQR7cjs.CostCalculator; exports.DEFAULT_OPENROUTER_MARKUP_RATE = _chunkNF2SKQR7cjs.DEFAULT_OPENROUTER_MARKUP_RATE; exports.MODEL_FIELD_PRIORITY = _chunkNF2SKQR7cjs.MODEL_FIELD_PRIORITY; exports.enrichCostResult = _chunkNF2SKQR7cjs.enrichCostResult; exports.extractUsageInput = _chunkNF2SKQR7cjs.extractUsageInput; exports.resolveUsageModel = _chunkNF2SKQR7cjs.resolveUsageModel; exports.toCostExtraction = _chunkNF2SKQR7cjs.toCostExtraction;
22
+ exports.CostCalculator = _chunkWOHMHXRZcjs.CostCalculator; exports.DEFAULT_OPENROUTER_MARKUP_RATE = _chunkWOHMHXRZcjs.DEFAULT_OPENROUTER_MARKUP_RATE; exports.MODEL_FIELD_PRIORITY = _chunkWOHMHXRZcjs.MODEL_FIELD_PRIORITY; exports.enrichCostResult = _chunkWOHMHXRZcjs.enrichCostResult; exports.extractUsageInput = _chunkWOHMHXRZcjs.extractUsageInput; exports.resolveUsageModel = _chunkWOHMHXRZcjs.resolveUsageModel; exports.toCostExtraction = _chunkWOHMHXRZcjs.toCostExtraction;
23
23
  //# sourceMappingURL=index.cjs.map
@@ -7,7 +7,7 @@ import {
7
7
  extractUsageInput,
8
8
  resolveUsageModel,
9
9
  toCostExtraction
10
- } from "../chunk-U2YDDUVP.js";
10
+ } from "../chunk-CTM35DMA.js";
11
11
  import "../chunk-B3V2EHRY.js";
12
12
  import "../chunk-2PTCWPHV.js";
13
13
  export {
package/dist/index.cjs CHANGED
@@ -1,28 +1,25 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});require('./chunk-5GUKLOEK.cjs');
2
2
 
3
3
 
4
- var _chunk5HNFAYTOcjs = require('./chunk-5HNFAYTO.cjs');
5
4
 
6
5
 
7
6
 
7
+ var _chunkWOHMHXRZcjs = require('./chunk-WOHMHXRZ.cjs');
8
8
 
9
9
 
10
- var _chunkPRCICORGcjs = require('./chunk-PRCICORG.cjs');
11
- require('./chunk-3E67S427.cjs');
12
- require('./chunk-2PYACSZ5.cjs');
13
-
14
-
15
- var _chunkXOKUDUUIcjs = require('./chunk-XOKUDUUI.cjs');
10
+ var _chunk5HNFAYTOcjs = require('./chunk-5HNFAYTO.cjs');
16
11
 
17
12
 
18
13
 
19
14
 
20
15
 
21
- var _chunkNF2SKQR7cjs = require('./chunk-NF2SKQR7.cjs');
16
+ var _chunkPRCICORGcjs = require('./chunk-PRCICORG.cjs');
17
+ require('./chunk-3E67S427.cjs');
22
18
 
23
19
 
24
20
 
25
21
  var _chunkBAHBDADJcjs = require('./chunk-BAHBDADJ.cjs');
22
+ require('./chunk-2PYACSZ5.cjs');
26
23
 
27
24
 
28
25
 
@@ -31,6 +28,9 @@ var _chunkBAHBDADJcjs = require('./chunk-BAHBDADJ.cjs');
31
28
  var _chunkYQDSN6R6cjs = require('./chunk-YQDSN6R6.cjs');
32
29
 
33
30
 
31
+ var _chunkXOKUDUUIcjs = require('./chunk-XOKUDUUI.cjs');
32
+
33
+
34
34
 
35
35
  var _chunkXAWBTX3Ncjs = require('./chunk-XAWBTX3N.cjs');
36
36
 
@@ -70,6 +70,14 @@ var _chunkEDMCKHO6cjs = require('./chunk-EDMCKHO6.cjs');
70
70
 
71
71
 
72
72
  var _chunkPADNCGZBcjs = require('./chunk-PADNCGZB.cjs');
73
+
74
+
75
+
76
+
77
+
78
+
79
+
80
+ var _chunk5IZ7PLY2cjs = require('./chunk-5IZ7PLY2.cjs');
73
81
  require('./chunk-GS7T56RP.cjs');
74
82
 
75
83
 
@@ -119,5 +127,11 @@ require('./chunk-GS7T56RP.cjs');
119
127
 
120
128
 
121
129
 
122
- exports.AIToolbox = _chunk5HNFAYTOcjs.AIToolbox; exports.AiModelsCatalogClient = _chunk5XAAMBDOcjs.AiModelsCatalogClient; exports.AiModelsService = _chunkYQDSN6R6cjs.AiModelsService; exports.AiToolsError = _chunkPADNCGZBcjs.AiToolsError; exports.AliasConflictError = _chunkPADNCGZBcjs.AliasConflictError; exports.AliasFileParseError = _chunkPADNCGZBcjs.AliasFileParseError; exports.AliasFileWriteError = _chunkPADNCGZBcjs.AliasFileWriteError; exports.AliasInvalidNameError = _chunkPADNCGZBcjs.AliasInvalidNameError; exports.AliasNotFoundError = _chunkPADNCGZBcjs.AliasNotFoundError; exports.AliasRegistry = _chunkBAHBDADJcjs.AliasRegistry; exports.AliasResolver = _chunkBAHBDADJcjs.AliasResolver; exports.CostCalculationError = _chunkPADNCGZBcjs.CostCalculationError; exports.CostCalculator = _chunkNF2SKQR7cjs.CostCalculator; exports.DEFAULT_CATALOG_CACHE_TTL_MS = _chunk5XAAMBDOcjs.DEFAULT_CATALOG_CACHE_TTL_MS; exports.DEFAULT_DIRECT_CATALOG_URL = _chunk5XAAMBDOcjs.DEFAULT_DIRECT_CATALOG_URL; exports.DEFAULT_OPENROUTER_CATALOG_URL = _chunk5XAAMBDOcjs.DEFAULT_OPENROUTER_CATALOG_URL; exports.MODEL_FIELD_PRIORITY = _chunkNF2SKQR7cjs.MODEL_FIELD_PRIORITY; exports.ModelNameResolver = _chunkDXZOL3VNcjs.ModelNameResolver; exports.ModelNotFoundError = _chunkPADNCGZBcjs.ModelNotFoundError; exports.ModelResolutionError = _chunkPADNCGZBcjs.ModelResolutionError; exports.OpenRouterSyncProvider = _chunkPRCICORGcjs.OpenRouterSyncProvider; exports.REASONING_SUPPORTED_PARAMETERS = _chunkDXZOL3VNcjs.REASONING_SUPPORTED_PARAMETERS; exports.SyncError = _chunkPADNCGZBcjs.SyncError; exports.UnknownModelCostError = _chunkPADNCGZBcjs.UnknownModelCostError; exports.computeSupportsReasoning = _chunkDXZOL3VNcjs.computeSupportsReasoning; exports.countModels = _chunkYQDSN6R6cjs.countModels; exports.createModelNameResolver = _chunkPRCICORGcjs.createModelNameResolver; exports.extractUsageInput = _chunkNF2SKQR7cjs.extractUsageInput; exports.filterModels = _chunkYQDSN6R6cjs.filterModels; exports.getModelInfo = _chunkYQDSN6R6cjs.getModelInfo; exports.hasReasoningPricing = _chunkDXZOL3VNcjs.hasReasoningPricing; exports.invalidateCatalogLoadCache = _chunk5XAAMBDOcjs.invalidateCatalogLoadCache; exports.isReasoningModel = _chunkDXZOL3VNcjs.isReasoningModel; exports.isRoutedViaOpenRouter = _chunkPRCICORGcjs.isRoutedViaOpenRouter; exports.loadCatalogSources = _chunk5XAAMBDOcjs.loadCatalogSources; exports.loadCatalogSourcesCached = _chunk5XAAMBDOcjs.loadCatalogSourcesCached; exports.loadOpenRouterRoutingEnv = _chunkEDMCKHO6cjs.loadOpenRouterRoutingEnv; exports.normalizeOpenRouterModel = _chunkXOKUDUUIcjs.normalizeOpenRouterModel; exports.providerIdToEnvKeyPrefix = _chunkEDMCKHO6cjs.providerIdToEnvKeyPrefix; exports.refreshAiModelsCatalog = _chunkXAWBTX3Ncjs.refreshAiModelsCatalog; exports.resolveCatalogCacheTtlMs = _chunk5XAAMBDOcjs.resolveCatalogCacheTtlMs; exports.resolveModel = _chunkPRCICORGcjs.resolveModel; exports.resolveUsageModel = _chunkNF2SKQR7cjs.resolveUsageModel; exports.shouldDefaultRouteViaOpenRouter = _chunkEDMCKHO6cjs.shouldDefaultRouteViaOpenRouter; exports.supportsReasoningParameter = _chunkDXZOL3VNcjs.supportsReasoningParameter; exports.vendorApiKeyEnvName = _chunkEDMCKHO6cjs.vendorApiKeyEnvName; exports.verifyAiModelsCatalog = _chunkXAWBTX3Ncjs.verifyAiModelsCatalog;
130
+
131
+
132
+
133
+
134
+
135
+
136
+ exports.AIToolbox = _chunk5HNFAYTOcjs.AIToolbox; exports.AiModelsCatalogClient = _chunk5XAAMBDOcjs.AiModelsCatalogClient; exports.AiModelsService = _chunkYQDSN6R6cjs.AiModelsService; exports.AiToolsError = _chunkPADNCGZBcjs.AiToolsError; exports.AliasConflictError = _chunkPADNCGZBcjs.AliasConflictError; exports.AliasFileParseError = _chunkPADNCGZBcjs.AliasFileParseError; exports.AliasFileWriteError = _chunkPADNCGZBcjs.AliasFileWriteError; exports.AliasInvalidNameError = _chunkPADNCGZBcjs.AliasInvalidNameError; exports.AliasNotFoundError = _chunkPADNCGZBcjs.AliasNotFoundError; exports.AliasRegistry = _chunkBAHBDADJcjs.AliasRegistry; exports.AliasResolver = _chunkBAHBDADJcjs.AliasResolver; exports.CostCalculationError = _chunkPADNCGZBcjs.CostCalculationError; exports.CostCalculator = _chunkWOHMHXRZcjs.CostCalculator; exports.DEFAULT_CATALOG_CACHE_TTL_MS = _chunk5XAAMBDOcjs.DEFAULT_CATALOG_CACHE_TTL_MS; exports.DEFAULT_DIRECT_CATALOG_URL = _chunk5XAAMBDOcjs.DEFAULT_DIRECT_CATALOG_URL; exports.DEFAULT_OPENROUTER_CATALOG_URL = _chunk5XAAMBDOcjs.DEFAULT_OPENROUTER_CATALOG_URL; exports.MODEL_FIELD_PRIORITY = _chunkWOHMHXRZcjs.MODEL_FIELD_PRIORITY; exports.ModelNameResolver = _chunkDXZOL3VNcjs.ModelNameResolver; exports.ModelNotFoundError = _chunkPADNCGZBcjs.ModelNotFoundError; exports.ModelResolutionError = _chunkPADNCGZBcjs.ModelResolutionError; exports.OpenRouterSyncProvider = _chunkPRCICORGcjs.OpenRouterSyncProvider; exports.REASONING_SUPPORTED_PARAMETERS = _chunkDXZOL3VNcjs.REASONING_SUPPORTED_PARAMETERS; exports.SyncError = _chunkPADNCGZBcjs.SyncError; exports.UnknownModelCostError = _chunkPADNCGZBcjs.UnknownModelCostError; exports.computeSupportsReasoning = _chunkDXZOL3VNcjs.computeSupportsReasoning; exports.countModels = _chunkYQDSN6R6cjs.countModels; exports.createModelNameResolver = _chunkPRCICORGcjs.createModelNameResolver; exports.extractUsageInput = _chunkWOHMHXRZcjs.extractUsageInput; exports.filterModels = _chunkYQDSN6R6cjs.filterModels; exports.getModelInfo = _chunkYQDSN6R6cjs.getModelInfo; exports.hasReasoningPricing = _chunkDXZOL3VNcjs.hasReasoningPricing; exports.invalidateCatalogLoadCache = _chunk5XAAMBDOcjs.invalidateCatalogLoadCache; exports.isKnownProfileOrShortcut = _chunk5IZ7PLY2cjs.isKnownProfileOrShortcut; exports.isReasoningModel = _chunkDXZOL3VNcjs.isReasoningModel; exports.isRoutedViaOpenRouter = _chunkPRCICORGcjs.isRoutedViaOpenRouter; exports.listAIProfiles = _chunk5IZ7PLY2cjs.listAIProfiles; exports.listAIShortcuts = _chunk5IZ7PLY2cjs.listAIShortcuts; exports.loadCatalogSources = _chunk5XAAMBDOcjs.loadCatalogSources; exports.loadCatalogSourcesCached = _chunk5XAAMBDOcjs.loadCatalogSourcesCached; exports.loadOpenRouterRoutingEnv = _chunkEDMCKHO6cjs.loadOpenRouterRoutingEnv; exports.normalizeOpenRouterModel = _chunkXOKUDUUIcjs.normalizeOpenRouterModel; exports.profileConfigFromResolved = _chunk5IZ7PLY2cjs.profileConfigFromResolved; exports.providerIdToEnvKeyPrefix = _chunkEDMCKHO6cjs.providerIdToEnvKeyPrefix; exports.refreshAiModelsCatalog = _chunkXAWBTX3Ncjs.refreshAiModelsCatalog; exports.resolveAIProfile = _chunk5IZ7PLY2cjs.resolveAIProfile; exports.resolveCatalogCacheTtlMs = _chunk5XAAMBDOcjs.resolveCatalogCacheTtlMs; exports.resolveModel = _chunkPRCICORGcjs.resolveModel; exports.resolveProfileForAsk = _chunk5IZ7PLY2cjs.resolveProfileForAsk; exports.resolveUsageModel = _chunkWOHMHXRZcjs.resolveUsageModel; exports.shouldDefaultRouteViaOpenRouter = _chunkEDMCKHO6cjs.shouldDefaultRouteViaOpenRouter; exports.supportsReasoningParameter = _chunkDXZOL3VNcjs.supportsReasoningParameter; exports.vendorApiKeyEnvName = _chunkEDMCKHO6cjs.vendorApiKeyEnvName; exports.verifyAiModelsCatalog = _chunkXAWBTX3Ncjs.verifyAiModelsCatalog;
123
137
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/ami/Documents/prometheus/x12i/ai-tools/dist/index.cjs"],"names":[],"mappings":"AAAA,yGAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,guGAAC","file":"/Users/ami/Documents/prometheus/x12i/ai-tools/dist/index.cjs"}
1
+ {"version":3,"sources":["/Users/ami/Documents/prometheus/x12i/ai-tools/dist/index.cjs"],"names":[],"mappings":"AAAA,yGAA6B;AAC7B;AACE;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,8nHAAC","file":"/Users/ami/Documents/prometheus/x12i/ai-tools/dist/index.cjs"}
package/dist/index.d.cts CHANGED
@@ -6,6 +6,8 @@ export { C as CatalogRefreshOptions, a as CatalogRefreshResult, c as CatalogVeri
6
6
  export { AiModelsService, AiModelsServiceOptions, REASONING_SUPPORTED_PARAMETERS, ReasoningModelInput, computeSupportsReasoning, countModels, filterModels, getModelInfo, hasReasoningPricing, isReasoningModel, normalizeOpenRouterModel, supportsReasoningParameter } from './models/index.cjs';
7
7
  export { M as ModelNameResolver, O as OpenRouterSyncProvider, a as OpenRouterSyncProviderOptions, c as createModelNameResolver, i as isRoutedViaOpenRouter, r as resolveModel } from './modelNameResolver-C5CSTGFF.cjs';
8
8
  export { AIToolbox, AiToolboxOptions, Fallback, FallbackChain, Guard, GuardConfig, RouteRule, Router, TrackResult, Tracker } from './toolbox/index.cjs';
9
+ export { AskProfileModelConfig, ResolveProfileForAskInput, profileConfigFromResolved, resolveProfileForAsk } from './profiles/index.cjs';
10
+ export { AIProfileBackend, InstructionTier, ResolvedAIProfile, isKnownProfileOrShortcut, listAIProfiles, listAIShortcuts, resolveAIProfile } from '@x12i/ai-profiles';
9
11
  export { AliasResolver, AliasResolverOptions } from './aliases/index.cjs';
10
12
 
11
13
  type AiToolsErrorCode = "MODEL_NOT_FOUND" | "SYNC_FETCH_FAILED" | "SYNC_UPSERT_FAILED" | "COST_CALCULATION_FAILED" | "COST_UNKNOWN_MODEL" | "INVALID_USAGE_INPUT" | "OPENROUTER_AUTH_FAILED" | "OPENROUTER_MODELS_FETCH_FAILED" | "CACHE_READ_ERROR" | "ALIAS_NOT_FOUND" | "ALIAS_INVALID_NAME" | "ALIAS_CONFLICT" | "ALIAS_FILE_PARSE_ERROR" | "ALIAS_FILE_WRITE_ERROR";
package/dist/index.d.ts CHANGED
@@ -6,6 +6,8 @@ export { C as CatalogRefreshOptions, a as CatalogRefreshResult, c as CatalogVeri
6
6
  export { AiModelsService, AiModelsServiceOptions, REASONING_SUPPORTED_PARAMETERS, ReasoningModelInput, computeSupportsReasoning, countModels, filterModels, getModelInfo, hasReasoningPricing, isReasoningModel, normalizeOpenRouterModel, supportsReasoningParameter } from './models/index.js';
7
7
  export { M as ModelNameResolver, O as OpenRouterSyncProvider, a as OpenRouterSyncProviderOptions, c as createModelNameResolver, i as isRoutedViaOpenRouter, r as resolveModel } from './modelNameResolver-5XkBMctP.js';
8
8
  export { AIToolbox, AiToolboxOptions, Fallback, FallbackChain, Guard, GuardConfig, RouteRule, Router, TrackResult, Tracker } from './toolbox/index.js';
9
+ export { AskProfileModelConfig, ResolveProfileForAskInput, profileConfigFromResolved, resolveProfileForAsk } from './profiles/index.js';
10
+ export { AIProfileBackend, InstructionTier, ResolvedAIProfile, isKnownProfileOrShortcut, listAIProfiles, listAIShortcuts, resolveAIProfile } from '@x12i/ai-profiles';
9
11
  export { AliasResolver, AliasResolverOptions } from './aliases/index.js';
10
12
 
11
13
  type AiToolsErrorCode = "MODEL_NOT_FOUND" | "SYNC_FETCH_FAILED" | "SYNC_UPSERT_FAILED" | "COST_CALCULATION_FAILED" | "COST_UNKNOWN_MODEL" | "INVALID_USAGE_INPUT" | "OPENROUTER_AUTH_FAILED" | "OPENROUTER_MODELS_FETCH_FAILED" | "CACHE_READ_ERROR" | "ALIAS_NOT_FOUND" | "ALIAS_INVALID_NAME" | "ALIAS_CONFLICT" | "ALIAS_FILE_PARSE_ERROR" | "ALIAS_FILE_WRITE_ERROR";
package/dist/index.js CHANGED
@@ -1,4 +1,10 @@
1
1
  import "./chunk-56R4XA2S.js";
2
+ import {
3
+ CostCalculator,
4
+ MODEL_FIELD_PRIORITY,
5
+ extractUsageInput,
6
+ resolveUsageModel
7
+ } from "./chunk-CTM35DMA.js";
2
8
  import {
3
9
  AIToolbox
4
10
  } from "./chunk-XRBZQQQU.js";
@@ -9,26 +15,20 @@ import {
9
15
  resolveModel
10
16
  } from "./chunk-6BQBKROR.js";
11
17
  import "./chunk-KHODXGPV.js";
12
- import "./chunk-COK34C6P.js";
13
- import {
14
- normalizeOpenRouterModel
15
- } from "./chunk-SIH4GPV4.js";
16
- import {
17
- CostCalculator,
18
- MODEL_FIELD_PRIORITY,
19
- extractUsageInput,
20
- resolveUsageModel
21
- } from "./chunk-U2YDDUVP.js";
22
18
  import {
23
19
  AliasRegistry,
24
20
  AliasResolver
25
21
  } from "./chunk-ANVONYJF.js";
22
+ import "./chunk-COK34C6P.js";
26
23
  import {
27
24
  AiModelsService,
28
25
  countModels,
29
26
  filterModels,
30
27
  getModelInfo
31
28
  } from "./chunk-VJHLO2R3.js";
29
+ import {
30
+ normalizeOpenRouterModel
31
+ } from "./chunk-SIH4GPV4.js";
32
32
  import {
33
33
  refreshAiModelsCatalog,
34
34
  verifyAiModelsCatalog
@@ -70,6 +70,14 @@ import {
70
70
  SyncError,
71
71
  UnknownModelCostError
72
72
  } from "./chunk-2PTCWPHV.js";
73
+ import {
74
+ isKnownProfileOrShortcut,
75
+ listAIProfiles,
76
+ listAIShortcuts,
77
+ profileConfigFromResolved,
78
+ resolveAIProfile,
79
+ resolveProfileForAsk
80
+ } from "./chunk-YQVY7CWT.js";
73
81
  export {
74
82
  AIToolbox,
75
83
  AiModelsCatalogClient,
@@ -103,16 +111,22 @@ export {
103
111
  getModelInfo,
104
112
  hasReasoningPricing,
105
113
  invalidateCatalogLoadCache,
114
+ isKnownProfileOrShortcut,
106
115
  isReasoningModel,
107
116
  isRoutedViaOpenRouter,
117
+ listAIProfiles,
118
+ listAIShortcuts,
108
119
  loadCatalogSources,
109
120
  loadCatalogSourcesCached,
110
121
  loadOpenRouterRoutingEnv,
111
122
  normalizeOpenRouterModel,
123
+ profileConfigFromResolved,
112
124
  providerIdToEnvKeyPrefix,
113
125
  refreshAiModelsCatalog,
126
+ resolveAIProfile,
114
127
  resolveCatalogCacheTtlMs,
115
128
  resolveModel,
129
+ resolveProfileForAsk,
116
130
  resolveUsageModel,
117
131
  shouldDefaultRouteViaOpenRouter,
118
132
  supportsReasoningParameter,
@@ -2,13 +2,13 @@
2
2
 
3
3
 
4
4
 
5
- var _chunkXOKUDUUIcjs = require('../chunk-XOKUDUUI.cjs');
6
5
 
7
6
 
7
+ var _chunkYQDSN6R6cjs = require('../chunk-YQDSN6R6.cjs');
8
8
 
9
9
 
10
10
 
11
- var _chunkYQDSN6R6cjs = require('../chunk-YQDSN6R6.cjs');
11
+ var _chunkXOKUDUUIcjs = require('../chunk-XOKUDUUI.cjs');
12
12
  require('../chunk-5XAAMBDO.cjs');
13
13
 
14
14
 
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/ami/Documents/prometheus/x12i/ai-tools/dist/models/index.cjs"],"names":[],"mappings":"AAAA,0GAA8B;AAC9B;AACE;AACA;AACF,yDAA8B;AAC9B;AACE;AACA;AACA;AACA;AACF,yDAA8B;AAC9B,iCAA8B;AAC9B;AACE;AACA;AACA;AACA;AACA;AACF,yDAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,gvBAAC","file":"/Users/ami/Documents/prometheus/x12i/ai-tools/dist/models/index.cjs"}
1
+ {"version":3,"sources":["/Users/ami/Documents/prometheus/x12i/ai-tools/dist/models/index.cjs"],"names":[],"mappings":"AAAA,0GAA8B;AAC9B;AACE;AACA;AACA;AACA;AACF,yDAA8B;AAC9B;AACE;AACA;AACF,yDAA8B;AAC9B,iCAA8B;AAC9B;AACE;AACA;AACA;AACA;AACA;AACF,yDAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,gvBAAC","file":"/Users/ami/Documents/prometheus/x12i/ai-tools/dist/models/index.cjs"}
@@ -1,14 +1,14 @@
1
1
  import "../chunk-COK34C6P.js";
2
- import {
3
- extractProviderId,
4
- normalizeOpenRouterModel
5
- } from "../chunk-SIH4GPV4.js";
6
2
  import {
7
3
  AiModelsService,
8
4
  countModels,
9
5
  filterModels,
10
6
  getModelInfo
11
7
  } from "../chunk-VJHLO2R3.js";
8
+ import {
9
+ extractProviderId,
10
+ normalizeOpenRouterModel
11
+ } from "../chunk-SIH4GPV4.js";
12
12
  import "../chunk-OPN6BGNH.js";
13
13
  import {
14
14
  REASONING_SUPPORTED_PARAMETERS,
@@ -0,0 +1,18 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
+
3
+
4
+
5
+
6
+
7
+
8
+ var _chunk5IZ7PLY2cjs = require('../chunk-5IZ7PLY2.cjs');
9
+ require('../chunk-GS7T56RP.cjs');
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+ exports.isKnownProfileOrShortcut = _chunk5IZ7PLY2cjs.isKnownProfileOrShortcut; exports.listAIProfiles = _chunk5IZ7PLY2cjs.listAIProfiles; exports.listAIShortcuts = _chunk5IZ7PLY2cjs.listAIShortcuts; exports.profileConfigFromResolved = _chunk5IZ7PLY2cjs.profileConfigFromResolved; exports.resolveAIProfile = _chunk5IZ7PLY2cjs.resolveAIProfile; exports.resolveProfileForAsk = _chunk5IZ7PLY2cjs.resolveProfileForAsk;
18
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/ami/Documents/prometheus/x12i/ai-tools/dist/profiles/index.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACF,yDAA8B;AAC9B,iCAA8B;AAC9B;AACE;AACA;AACA;AACA;AACA;AACA;AACF,6ZAAC","file":"/Users/ami/Documents/prometheus/x12i/ai-tools/dist/profiles/index.cjs"}
@@ -0,0 +1,40 @@
1
+ import { ResolvedAIProfile, InstructionTier, AIProfileBackend, RegistrySourceMode } from '@x12i/ai-profiles';
2
+ export { AIProfileBackend, AIProfileSummary, AIShortcutSummary, InstructionTier, RegistrySourceMode, ResolveAIProfileOptions, ResolvedAIProfile, isKnownProfileOrShortcut, listAIProfiles, listAIShortcuts, resolveAIProfile } from '@x12i/ai-profiles';
3
+
4
+ type ResolveProfileForAskInput = {
5
+ profile: string;
6
+ choice?: string;
7
+ source?: RegistrySourceMode;
8
+ refresh?: boolean;
9
+ };
10
+ /** FuncX / ask-node model config derived from {@link ResolvedAIProfile}. */
11
+ type AskProfileModelConfig = {
12
+ provider: ResolvedAIProfile["provider"];
13
+ model: string;
14
+ instructionTier: InstructionTier;
15
+ backend: AIProfileBackend;
16
+ profile: string;
17
+ choice: string;
18
+ temperature: number;
19
+ outputMode: ResolvedAIProfile["runtime"]["outputMode"];
20
+ toolPolicy: ResolvedAIProfile["runtime"]["toolPolicy"];
21
+ reasoningEffort: ResolvedAIProfile["runtime"]["reasoningEffort"];
22
+ executionMode: ResolvedAIProfile["runtime"]["executionMode"];
23
+ requireCitations: boolean;
24
+ allowWeb: boolean;
25
+ allowFileSearch: boolean;
26
+ allowCodeExecution: boolean;
27
+ humanReview: ResolvedAIProfile["runtime"]["humanReview"];
28
+ metadata?: Record<string, unknown>;
29
+ pricing?: ResolvedAIProfile["pricing"];
30
+ resolved: ResolvedAIProfile;
31
+ };
32
+ declare function profileConfigFromResolved(resolved: ResolvedAIProfile): AskProfileModelConfig;
33
+ /**
34
+ * Resolve a profile (+ optional choice) into ask-node / FuncX model configuration.
35
+ * Uses {@link ResolvedAIProfile.instructionTier} and {@link ResolvedAIProfile.backend}
36
+ * from `@x12i/ai-profiles` — do not duplicate preset tables locally.
37
+ */
38
+ declare function resolveProfileForAsk(input: ResolveProfileForAskInput): Promise<AskProfileModelConfig>;
39
+
40
+ export { type AskProfileModelConfig, type ResolveProfileForAskInput, profileConfigFromResolved, resolveProfileForAsk };
@@ -0,0 +1,40 @@
1
+ import { ResolvedAIProfile, InstructionTier, AIProfileBackend, RegistrySourceMode } from '@x12i/ai-profiles';
2
+ export { AIProfileBackend, AIProfileSummary, AIShortcutSummary, InstructionTier, RegistrySourceMode, ResolveAIProfileOptions, ResolvedAIProfile, isKnownProfileOrShortcut, listAIProfiles, listAIShortcuts, resolveAIProfile } from '@x12i/ai-profiles';
3
+
4
+ type ResolveProfileForAskInput = {
5
+ profile: string;
6
+ choice?: string;
7
+ source?: RegistrySourceMode;
8
+ refresh?: boolean;
9
+ };
10
+ /** FuncX / ask-node model config derived from {@link ResolvedAIProfile}. */
11
+ type AskProfileModelConfig = {
12
+ provider: ResolvedAIProfile["provider"];
13
+ model: string;
14
+ instructionTier: InstructionTier;
15
+ backend: AIProfileBackend;
16
+ profile: string;
17
+ choice: string;
18
+ temperature: number;
19
+ outputMode: ResolvedAIProfile["runtime"]["outputMode"];
20
+ toolPolicy: ResolvedAIProfile["runtime"]["toolPolicy"];
21
+ reasoningEffort: ResolvedAIProfile["runtime"]["reasoningEffort"];
22
+ executionMode: ResolvedAIProfile["runtime"]["executionMode"];
23
+ requireCitations: boolean;
24
+ allowWeb: boolean;
25
+ allowFileSearch: boolean;
26
+ allowCodeExecution: boolean;
27
+ humanReview: ResolvedAIProfile["runtime"]["humanReview"];
28
+ metadata?: Record<string, unknown>;
29
+ pricing?: ResolvedAIProfile["pricing"];
30
+ resolved: ResolvedAIProfile;
31
+ };
32
+ declare function profileConfigFromResolved(resolved: ResolvedAIProfile): AskProfileModelConfig;
33
+ /**
34
+ * Resolve a profile (+ optional choice) into ask-node / FuncX model configuration.
35
+ * Uses {@link ResolvedAIProfile.instructionTier} and {@link ResolvedAIProfile.backend}
36
+ * from `@x12i/ai-profiles` — do not duplicate preset tables locally.
37
+ */
38
+ declare function resolveProfileForAsk(input: ResolveProfileForAskInput): Promise<AskProfileModelConfig>;
39
+
40
+ export { type AskProfileModelConfig, type ResolveProfileForAskInput, profileConfigFromResolved, resolveProfileForAsk };
@@ -0,0 +1,17 @@
1
+ import {
2
+ isKnownProfileOrShortcut,
3
+ listAIProfiles,
4
+ listAIShortcuts,
5
+ profileConfigFromResolved,
6
+ resolveAIProfile,
7
+ resolveProfileForAsk
8
+ } from "../chunk-YQVY7CWT.js";
9
+ export {
10
+ isKnownProfileOrShortcut,
11
+ listAIProfiles,
12
+ listAIShortcuts,
13
+ profileConfigFromResolved,
14
+ resolveAIProfile,
15
+ resolveProfileForAsk
16
+ };
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}