@omnicross/core 0.1.0 → 0.1.2
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/dist/ApiConverter.cjs +24 -0
- package/dist/ApiConverter.d.cts +82 -0
- package/dist/ApiConverter.d.ts +82 -0
- package/dist/ApiConverter.js +24 -0
- package/dist/BuiltinToolExecutor-BluWyeob.d.ts +81 -0
- package/dist/BuiltinToolExecutor-CS2WpXhM.d.cts +81 -0
- package/dist/CompletionService-D3a47vdU.d.cts +213 -0
- package/dist/CompletionService-DdWaAxq0.d.ts +213 -0
- package/dist/{ProviderProxy-f_8ziIhW.d.cts → ProviderProxy-C-xqrkKi.d.ts} +7 -2
- package/dist/{ProviderProxy-vjt8sQQk.d.ts → ProviderProxy-CnMQYN59.d.cts} +7 -2
- package/dist/auth/GeminiCodeAssistProjectResolver.cjs +27 -60
- package/dist/auth/GeminiCodeAssistProjectResolver.js +5 -9
- package/dist/builtin-web-fetch-77JZUZGM.cjs +100 -0
- package/dist/builtin-web-fetch-IGLBX2XY.js +100 -0
- package/dist/chunk-2DCNB7DF.cjs +514 -0
- package/dist/chunk-2FEVTJWG.js +4400 -0
- package/dist/chunk-3MEACFK3.js +193 -0
- package/dist/chunk-3OPYJG76.cjs +266 -0
- package/dist/chunk-46RLHI7D.js +0 -0
- package/dist/chunk-46ZIFWYG.cjs +277 -0
- package/dist/chunk-4NBS6KPV.cjs +43 -0
- package/dist/chunk-4VAVYUZS.cjs +991 -0
- package/dist/chunk-5ERIZW3D.js +44 -0
- package/dist/chunk-5HTVET6E.js +514 -0
- package/dist/chunk-5ZQBEOMD.js +764 -0
- package/dist/chunk-6VIXXLMX.cjs +14 -0
- package/dist/chunk-745DV5FL.js +147 -0
- package/dist/chunk-74TMJA7Z.js +53 -0
- package/dist/chunk-7VU7V2E4.js +0 -0
- package/dist/chunk-7YN22L2H.cjs +87 -0
- package/dist/chunk-A2YMUCBT.cjs +105 -0
- package/dist/chunk-AQ5TNQB7.js +13 -0
- package/dist/chunk-AVYJ4YBN.js +58 -0
- package/dist/chunk-C72S6TTV.cjs +49 -0
- package/dist/chunk-C7PSERMH.js +87 -0
- package/dist/chunk-CDHS2QDC.js +179 -0
- package/dist/chunk-DK4A7DLE.js +266 -0
- package/dist/chunk-DRWHTIIZ.js +13 -0
- package/dist/chunk-DWKQZ2SK.cjs +254 -0
- package/dist/chunk-E3WHL7CO.js +14 -0
- package/dist/chunk-EYZYXJTJ.cjs +1 -0
- package/dist/chunk-FMOBD2OQ.js +39 -0
- package/dist/chunk-FTQ7IQUC.js +991 -0
- package/dist/chunk-FZ46M34D.cjs +1 -0
- package/dist/chunk-G2FUJNA2.cjs +193 -0
- package/dist/chunk-G2UTNSGU.js +277 -0
- package/dist/chunk-GBHYAGX3.cjs +26 -0
- package/dist/chunk-GMMT7RVN.cjs +39 -0
- package/dist/chunk-H5JUT3KV.js +105 -0
- package/dist/chunk-HQP3K7PU.cjs +431 -0
- package/dist/chunk-JO5NLTLY.js +46 -0
- package/dist/chunk-JWC6APFQ.js +23 -0
- package/dist/chunk-KUU2RNG6.cjs +46 -0
- package/dist/chunk-LKZJEL6E.cjs +124 -0
- package/dist/chunk-MNYKI4CI.js +94 -0
- package/dist/chunk-MZNPGW5Q.js +26 -0
- package/dist/chunk-N3V2J5ZO.cjs +53 -0
- package/dist/chunk-NYUNU75A.cjs +44 -0
- package/dist/chunk-NZYN7C3P.cjs +179 -0
- package/dist/chunk-O466Y272.js +235 -0
- package/dist/chunk-PXUJF5HS.js +124 -0
- package/dist/chunk-QBZJ7P2T.cjs +13 -0
- package/dist/chunk-QOCNX236.js +46 -0
- package/dist/chunk-QXD4MV2X.cjs +23 -0
- package/dist/chunk-R3HK6R4B.cjs +13 -0
- package/dist/chunk-RSJ3TWJQ.cjs +186 -0
- package/dist/chunk-S4WBV25P.js +913 -0
- package/dist/chunk-SN3YWBX7.cjs +4400 -0
- package/dist/chunk-SPVWWUHX.cjs +46 -0
- package/dist/chunk-SUEGJ75D.cjs +764 -0
- package/dist/chunk-SVNDB62D.cjs +58 -0
- package/dist/chunk-UYPEN5XE.cjs +235 -0
- package/dist/chunk-V5KPWNYX.cjs +147 -0
- package/dist/chunk-VVEHS2LI.js +431 -0
- package/dist/chunk-XBSYYZIY.cjs +94 -0
- package/dist/chunk-YGXJGRFI.cjs +913 -0
- package/dist/chunk-YMFAJFQT.cjs +173 -0
- package/dist/chunk-Z7LUNECE.js +49 -0
- package/dist/chunk-Z7Y2NPHY.js +186 -0
- package/dist/chunk-ZJZAOKI7.js +254 -0
- package/dist/chunk-ZLX3KGXX.js +173 -0
- package/dist/chunk-ZSVQT3PW.js +43 -0
- package/dist/completion/ApiKeyPoolService.cjs +23 -48
- package/dist/completion/ApiKeyPoolService.d.cts +150 -2
- package/dist/completion/ApiKeyPoolService.d.ts +150 -2
- package/dist/completion/BuiltinToolExecutor.cjs +12 -0
- package/dist/completion/BuiltinToolExecutor.d.cts +4 -0
- package/dist/completion/BuiltinToolExecutor.d.ts +4 -0
- package/dist/completion/BuiltinToolExecutor.js +12 -0
- package/dist/completion/CompletionService.cjs +38 -0
- package/dist/completion/CompletionService.d.cts +22 -0
- package/dist/completion/CompletionService.d.ts +22 -0
- package/dist/completion/CompletionService.js +38 -0
- package/dist/completion/NativeSearchInjector.cjs +12 -0
- package/dist/completion/NativeSearchInjector.d.cts +42 -0
- package/dist/completion/NativeSearchInjector.d.ts +42 -0
- package/dist/completion/NativeSearchInjector.js +12 -0
- package/dist/completion/ProviderSearchInjector.cjs +60 -0
- package/dist/completion/ProviderSearchInjector.d.cts +47 -0
- package/dist/completion/ProviderSearchInjector.d.ts +47 -0
- package/dist/completion/ProviderSearchInjector.js +60 -0
- package/dist/completion/native-search-types.cjs +14 -0
- package/dist/completion/native-search-types.d.cts +3 -0
- package/dist/completion/native-search-types.d.ts +3 -0
- package/dist/completion/native-search-types.js +14 -0
- package/dist/completion/openrouter-headers.cjs +16 -0
- package/dist/completion/openrouter-headers.d.cts +44 -0
- package/dist/completion/openrouter-headers.d.ts +44 -0
- package/dist/completion/openrouter-headers.js +16 -0
- package/dist/completion/openrouter-models.cjs +29 -0
- package/dist/completion/openrouter-models.d.cts +27 -0
- package/dist/completion/openrouter-models.d.ts +27 -0
- package/dist/completion/openrouter-models.js +29 -0
- package/dist/completion/types.cjs +1 -0
- package/dist/completion/types.d.cts +3 -0
- package/dist/completion/types.d.ts +3 -0
- package/dist/completion/types.js +0 -0
- package/dist/completion/url-builder.cjs +24 -0
- package/dist/completion/url-builder.d.cts +87 -0
- package/dist/completion/url-builder.d.ts +87 -0
- package/dist/completion/url-builder.js +24 -0
- package/dist/completion.cjs +55 -3989
- package/dist/completion.d.cts +150 -8
- package/dist/completion.d.ts +150 -8
- package/dist/completion.js +63 -3953
- package/dist/index.cjs +197 -10428
- package/dist/index.d.cts +35 -91
- package/dist/index.d.ts +35 -91
- package/dist/index.js +125 -10267
- package/dist/logger-4GvQNzhE.d.cts +22 -0
- package/dist/logger-4GvQNzhE.d.ts +22 -0
- package/dist/outbound-api/routeResolver.cjs +11 -0
- package/dist/outbound-api/routeResolver.d.cts +19 -0
- package/dist/outbound-api/routeResolver.d.ts +19 -0
- package/dist/outbound-api/routeResolver.js +11 -0
- package/dist/outbound-api/subscriptionRegistryPort.cjs +7 -37
- package/dist/outbound-api/subscriptionRegistryPort.d.cts +7 -3
- package/dist/outbound-api/subscriptionRegistryPort.d.ts +7 -3
- package/dist/outbound-api/subscriptionRegistryPort.js +4 -8
- package/dist/outbound-api/types.cjs +1 -0
- package/dist/{types-CbCN2NQP.d.ts → outbound-api/types.d.cts} +18 -3
- package/dist/{types-CGGrKqC_.d.cts → outbound-api/types.d.ts} +18 -3
- package/dist/outbound-api/types.js +0 -0
- package/dist/outbound-api.cjs +35 -5220
- package/dist/outbound-api.d.cts +16 -88
- package/dist/outbound-api.d.ts +16 -88
- package/dist/outbound-api.js +54 -5193
- package/dist/pipeline/AuthSource.cjs +1 -0
- package/dist/pipeline/AuthSource.d.cts +101 -0
- package/dist/pipeline/AuthSource.d.ts +101 -0
- package/dist/pipeline/AuthSource.js +0 -0
- package/dist/pipeline/LlmConfigProviderAuth.cjs +8 -0
- package/dist/pipeline/LlmConfigProviderAuth.d.cts +87 -0
- package/dist/pipeline/LlmConfigProviderAuth.d.ts +87 -0
- package/dist/pipeline/LlmConfigProviderAuth.js +8 -0
- package/dist/pipeline/SubscriptionAuthSource.cjs +6 -128
- package/dist/pipeline/SubscriptionAuthSource.d.cts +165 -3
- package/dist/pipeline/SubscriptionAuthSource.d.ts +165 -3
- package/dist/pipeline/SubscriptionAuthSource.js +5 -99
- package/dist/pipeline/SubscriptionAuthStrategy.cjs +1 -18
- package/dist/pipeline/executeProviderCall.cjs +6 -0
- package/dist/pipeline/executeProviderCall.d.cts +149 -0
- package/dist/pipeline/executeProviderCall.d.ts +149 -0
- package/dist/pipeline/executeProviderCall.js +6 -0
- package/dist/pipeline/resolveProviderChain.cjs +6 -0
- package/dist/pipeline/resolveProviderChain.d.cts +58 -0
- package/dist/pipeline/resolveProviderChain.d.ts +58 -0
- package/dist/pipeline/resolveProviderChain.js +6 -0
- package/dist/pipeline/resolveSubscriptionChain.cjs +6 -0
- package/dist/pipeline/resolveSubscriptionChain.d.cts +68 -0
- package/dist/pipeline/resolveSubscriptionChain.d.ts +68 -0
- package/dist/pipeline/resolveSubscriptionChain.js +6 -0
- package/dist/ports/gemini-code-assist-resolver.cjs +7 -37
- package/dist/ports/gemini-code-assist-resolver.js +4 -8
- package/dist/ports/pricing-store.cjs +1 -0
- package/dist/ports/pricing-store.d.cts +50 -0
- package/dist/ports/pricing-store.d.ts +50 -0
- package/dist/ports/pricing-store.js +0 -0
- package/dist/ports/provider-config-source.cjs +1 -0
- package/dist/ports/provider-config-source.d.cts +51 -0
- package/dist/ports/provider-config-source.d.ts +51 -0
- package/dist/ports/provider-config-source.js +0 -0
- package/dist/ports/usage-event-store.cjs +1 -0
- package/dist/ports/usage-event-store.d.cts +29 -0
- package/dist/ports/usage-event-store.d.ts +29 -0
- package/dist/ports/usage-event-store.js +0 -0
- package/dist/ports/web-search-backend.cjs +1 -0
- package/dist/ports/web-search-backend.d.cts +29 -0
- package/dist/ports/web-search-backend.d.ts +29 -0
- package/dist/ports/web-search-backend.js +0 -0
- package/dist/ports.cjs +1 -18
- package/dist/ports.d.cts +16 -8
- package/dist/ports.d.ts +16 -8
- package/dist/provider-proxy/ProviderProxy.cjs +40 -0
- package/dist/provider-proxy/ProviderProxy.d.cts +17 -0
- package/dist/provider-proxy/ProviderProxy.d.ts +17 -0
- package/dist/provider-proxy/ProviderProxy.js +40 -0
- package/dist/provider-proxy/ingress/providerProxyShared.cjs +35 -2941
- package/dist/provider-proxy/ingress/providerProxyShared.d.cts +7 -3
- package/dist/provider-proxy/ingress/providerProxyShared.d.ts +7 -3
- package/dist/provider-proxy/ingress/providerProxyShared.js +41 -2914
- package/dist/provider-proxy/matchText.cjs +11 -72
- package/dist/provider-proxy/matchText.js +6 -39
- package/dist/provider-proxy/types.cjs +1 -18
- package/dist/provider-proxy/types.d.cts +407 -8
- package/dist/provider-proxy/types.d.ts +407 -8
- package/dist/provider-proxy.cjs +35 -4654
- package/dist/provider-proxy.d.cts +10 -6
- package/dist/provider-proxy.d.ts +10 -6
- package/dist/provider-proxy.js +39 -4627
- package/dist/routeResolver-BrbK6ja9.d.cts +88 -0
- package/dist/routeResolver-HE-ZO0fO.d.ts +88 -0
- package/dist/serializeError.cjs +5 -81
- package/dist/serializeError.js +3 -54
- package/dist/sse-parser.cjs +7 -455
- package/dist/sse-parser.js +4 -426
- package/dist/transformer/TransformerChainExecutor.cjs +4 -318
- package/dist/transformer/TransformerChainExecutor.js +4 -291
- package/dist/transformer/TransformerService.cjs +5 -289
- package/dist/transformer/TransformerService.js +3 -262
- package/dist/transformer/anthropicBetaInject.cjs +8 -0
- package/dist/transformer/anthropicBetaInject.d.cts +20 -0
- package/dist/transformer/anthropicBetaInject.d.ts +20 -0
- package/dist/transformer/anthropicBetaInject.js +8 -0
- package/dist/transformer/transformers/AnthropicTransformer.cjs +6 -0
- package/dist/transformer/transformers/AnthropicTransformer.d.cts +148 -0
- package/dist/transformer/transformers/AnthropicTransformer.d.ts +148 -0
- package/dist/transformer/transformers/AnthropicTransformer.js +6 -0
- package/dist/transformer/transformers/GeminiCodeAssistTransformer.cjs +4 -1106
- package/dist/transformer/transformers/GeminiCodeAssistTransformer.js +7 -1079
- package/dist/transformer/transformers/GeminiTransformer.cjs +4 -1010
- package/dist/transformer/transformers/GeminiTransformer.js +4 -983
- package/dist/transformer/transformers/OpenAIResponseTransformer.cjs +3 -535
- package/dist/transformer/transformers/OpenAIResponseTransformer.js +3 -510
- package/dist/transformer/transformers/OpenCodeGoTransformer.cjs +5 -72
- package/dist/transformer/transformers/OpenCodeGoTransformer.js +3 -45
- package/dist/transformer/transformers/ReasoningTransformer.cjs +6 -0
- package/dist/transformer/transformers/ReasoningTransformer.d.cts +47 -0
- package/dist/transformer/transformers/ReasoningTransformer.d.ts +47 -0
- package/dist/transformer/transformers/ReasoningTransformer.js +6 -0
- package/dist/transformer/transformers.cjs +39 -0
- package/dist/transformer/transformers.d.cts +100 -0
- package/dist/transformer/transformers.d.ts +100 -0
- package/dist/transformer/transformers.js +39 -0
- package/dist/transformer/types.cjs +1 -18
- package/dist/transformer.cjs +13 -3726
- package/dist/transformer.d.cts +8 -31
- package/dist/transformer.d.ts +8 -31
- package/dist/transformer.js +17 -3706
- package/dist/types-BScIHmPr.d.cts +153 -0
- package/dist/types-BScIHmPr.d.ts +153 -0
- package/dist/usage/pricing-engine.cjs +6 -0
- package/dist/usage/pricing-engine.d.cts +83 -0
- package/dist/usage/pricing-engine.d.ts +83 -0
- package/dist/usage/pricing-engine.js +6 -0
- package/dist/usage/usage-recorder.cjs +6 -0
- package/dist/usage/usage-recorder.d.cts +73 -0
- package/dist/usage/usage-recorder.d.ts +73 -0
- package/dist/usage/usage-recorder.js +6 -0
- package/dist/usage.cjs +11 -0
- package/dist/usage.d.cts +8 -0
- package/dist/usage.d.ts +8 -0
- package/dist/usage.js +11 -0
- package/package.json +3 -3
- package/dist/ApiKeyPoolService-BmMkau07.d.cts +0 -170
- package/dist/ApiKeyPoolService-BmMkau07.d.ts +0 -170
- package/dist/SubscriptionAuthSource-Cr4fVEYY.d.cts +0 -264
- package/dist/SubscriptionAuthSource-D89zmiSS.d.ts +0 -264
- package/dist/index-BTSmc9Sm.d.ts +0 -645
- package/dist/index-DXazdTzZ.d.cts +0 -645
- package/dist/types-DCzHkhJt.d.ts +0 -467
- package/dist/types-DZIQbgp0.d.cts +0 -467
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { MessageBlock } from '@omnicross/contracts/message-blocks';
|
|
2
|
+
import { SimpleChatMessage, ThinkLevel, SimpleChatAudio, SimpleChatVideo } from '@omnicross/contracts/completion-types';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Native Search Types
|
|
6
|
+
*
|
|
7
|
+
* Type definitions for provider-native web search capabilities.
|
|
8
|
+
* Used by NativeSearchInjector to detect and configure built-in
|
|
9
|
+
* search for OpenAI, Anthropic, Google, xAI, and OpenRouter.
|
|
10
|
+
*
|
|
11
|
+
* @module completion/native-search-types
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/** Providers that support native/built-in web search */
|
|
15
|
+
type NativeSearchProvider = 'openai' | 'anthropic' | 'google' | 'xai' | 'openrouter';
|
|
16
|
+
/** Result of detecting native search support for a model */
|
|
17
|
+
interface NativeSearchDetectionResult {
|
|
18
|
+
/** Whether the model supports native search */
|
|
19
|
+
supported: boolean;
|
|
20
|
+
/** Which native provider to use, if supported */
|
|
21
|
+
nativeProvider: NativeSearchProvider | null;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Model ID patterns for detecting native search support.
|
|
25
|
+
* OpenRouter is detected via provider metadata, not model ID.
|
|
26
|
+
*/
|
|
27
|
+
declare const NATIVE_SEARCH_MODEL_PATTERNS: Record<NativeSearchProvider, RegExp[]>;
|
|
28
|
+
/**
|
|
29
|
+
* OpenAI models that use Chat Completion endpoint (not Response API).
|
|
30
|
+
* These models use `web_search_options` instead of a `web_search` tool.
|
|
31
|
+
*/
|
|
32
|
+
declare const OPENAI_CHAT_COMPLETION_SEARCH_MODELS: string[];
|
|
33
|
+
/**
|
|
34
|
+
* Models that match a native search pattern but do NOT support web search.
|
|
35
|
+
* These are excluded from auto-detection (but can still be user-overridden).
|
|
36
|
+
*
|
|
37
|
+
* - `gpt-4.1-nano`: Matches `/^gpt-4/` but OpenAI explicitly excludes it
|
|
38
|
+
* from web search support in the Responses API.
|
|
39
|
+
*/
|
|
40
|
+
declare const NATIVE_SEARCH_EXCLUDED_MODELS: string[];
|
|
41
|
+
/** Native search tool names that should NOT be executed locally */
|
|
42
|
+
declare const NATIVE_SEARCH_TOOL_NAMES: string[];
|
|
43
|
+
/** User-facing configuration for native search */
|
|
44
|
+
interface NativeSearchUserConfig {
|
|
45
|
+
/** Whether native search is enabled */
|
|
46
|
+
enabled: boolean;
|
|
47
|
+
/** Max search results / uses (maps to provider-specific settings) */
|
|
48
|
+
maxResults?: number;
|
|
49
|
+
/** Domains to block (Anthropic) */
|
|
50
|
+
blockedDomains?: string[];
|
|
51
|
+
/** xAI search mode override */
|
|
52
|
+
searchMode?: 'on' | 'off' | 'auto';
|
|
53
|
+
/** xAI search sources */
|
|
54
|
+
sources?: Array<{
|
|
55
|
+
type: 'web' | 'x' | 'news';
|
|
56
|
+
}>;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Request body augmentation produced by NativeSearchInjector.
|
|
60
|
+
*
|
|
61
|
+
* - `additionalTools`: Appended to the tools array in the request body.
|
|
62
|
+
* - `bodyFields`: Merged into the top-level request body.
|
|
63
|
+
*/
|
|
64
|
+
interface NativeSearchAugmentation {
|
|
65
|
+
/** Extra tools to append (OpenAI web_search, Anthropic web_search_20250305, Gemini grounding) */
|
|
66
|
+
additionalTools?: unknown[];
|
|
67
|
+
/** Top-level body fields (xAI search_parameters, OpenRouter plugins, OpenAI web_search_options) */
|
|
68
|
+
bodyFields?: Record<string, unknown>;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Map from API format to potential native search providers.
|
|
72
|
+
*
|
|
73
|
+
* Note: `openai` (Chat Completions) is NOT mapped here because regular models
|
|
74
|
+
* (gpt-4o, o1, etc.) don't support native search via Chat Completions API.
|
|
75
|
+
* Only `gpt-4o-search-preview` models support it (via `web_search_options` body
|
|
76
|
+
* field), and those are handled by a special case in `detectNativeSearch()`.
|
|
77
|
+
*
|
|
78
|
+
* `openai-response` (Responses API) DOES support native `web_search` tool
|
|
79
|
+
* for gpt-4o, o1, o3, o4-mini, etc.
|
|
80
|
+
*/
|
|
81
|
+
declare const API_FORMAT_PROVIDER_MAP: Partial<Record<ApiFormat, NativeSearchProvider>>;
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Completion Service Types
|
|
85
|
+
*
|
|
86
|
+
* Type definitions for completion options, results, and callbacks.
|
|
87
|
+
*/
|
|
88
|
+
|
|
89
|
+
interface CompletionOptions {
|
|
90
|
+
providerId: string;
|
|
91
|
+
model: string;
|
|
92
|
+
messages: SimpleChatMessage[];
|
|
93
|
+
maxTokens?: number;
|
|
94
|
+
temperature?: number;
|
|
95
|
+
stream?: boolean;
|
|
96
|
+
/** Thinking effort level for reasoning models */
|
|
97
|
+
thinkLevel?: ThinkLevel;
|
|
98
|
+
/** Native search augmentation to apply to the request body */
|
|
99
|
+
nativeSearchAugmentation?: NativeSearchAugmentation;
|
|
100
|
+
/** Session ID for API key pool affinity (preserves prompt cache) and usage attribution. */
|
|
101
|
+
sessionId?: string;
|
|
102
|
+
/**
|
|
103
|
+
* Assistant-message id this request is producing — used to attribute
|
|
104
|
+
* recorded usage rows back to host messages. Optional; if absent the row is
|
|
105
|
+
* still recorded but won't be linked.
|
|
106
|
+
*/
|
|
107
|
+
messageId?: string;
|
|
108
|
+
/**
|
|
109
|
+
* Parent message id (for subagent-style nested calls). Best-effort: callers
|
|
110
|
+
* that know the parent should fill this; otherwise leave unset.
|
|
111
|
+
*/
|
|
112
|
+
parentMessageId?: string;
|
|
113
|
+
/**
|
|
114
|
+
* Opt into the Anthropic 1M-context tier for this request. The transformer
|
|
115
|
+
* pipeline (and any direct Anthropic-format paths) inject the
|
|
116
|
+
* `'context-1m-2025-08-07'` beta into the outbound request body when this
|
|
117
|
+
* is true AND the resolved model is in the 1M-capable allowlist.
|
|
118
|
+
*/
|
|
119
|
+
useExtendedContext?: boolean;
|
|
120
|
+
}
|
|
121
|
+
interface CompletionResult {
|
|
122
|
+
success: boolean;
|
|
123
|
+
message?: SimpleChatMessage;
|
|
124
|
+
error?: string;
|
|
125
|
+
usage?: {
|
|
126
|
+
promptTokens: number;
|
|
127
|
+
completionTokens: number;
|
|
128
|
+
totalTokens: number;
|
|
129
|
+
};
|
|
130
|
+
/** Provider finish reason (e.g. 'stop', 'tool_use', 'max_tokens') */
|
|
131
|
+
finishReason?: string;
|
|
132
|
+
}
|
|
133
|
+
interface StreamCallbacks {
|
|
134
|
+
onStart?: (messageId: string) => void;
|
|
135
|
+
onDelta?: (content: string) => void;
|
|
136
|
+
onReasoning?: (reasoning: string) => void;
|
|
137
|
+
onAudio?: (audio: SimpleChatAudio) => void;
|
|
138
|
+
onVideo?: (video: SimpleChatVideo) => void;
|
|
139
|
+
/** Called when a new content block is created (thinking, text, tool_use, tool_result) */
|
|
140
|
+
onBlock?: (block: MessageBlock) => void;
|
|
141
|
+
onDone?: (message: SimpleChatMessage, usage?: CompletionResult['usage'], metrics?: {
|
|
142
|
+
completionTokens: number;
|
|
143
|
+
timeCompletionMs: number;
|
|
144
|
+
timeFirstTokenMs?: number;
|
|
145
|
+
}) => void;
|
|
146
|
+
onError?: (error: string) => void;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* API format type for determining endpoint structure
|
|
150
|
+
*/
|
|
151
|
+
type ApiFormat = 'openai' | 'anthropic' | 'google' | 'azure-openai' | 'openai-response';
|
|
152
|
+
|
|
153
|
+
export { type ApiFormat as A, type CompletionOptions as C, NATIVE_SEARCH_TOOL_NAMES as N, OPENAI_CHAT_COMPLETION_SEARCH_MODELS as O, type StreamCallbacks as S, type CompletionResult as a, type NativeSearchAugmentation as b, type NativeSearchDetectionResult as c, type NativeSearchProvider as d, type NativeSearchUserConfig as e, API_FORMAT_PROVIDER_MAP as f, NATIVE_SEARCH_EXCLUDED_MODELS as g, NATIVE_SEARCH_MODEL_PATTERNS as h };
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { MessageBlock } from '@omnicross/contracts/message-blocks';
|
|
2
|
+
import { SimpleChatMessage, ThinkLevel, SimpleChatAudio, SimpleChatVideo } from '@omnicross/contracts/completion-types';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Native Search Types
|
|
6
|
+
*
|
|
7
|
+
* Type definitions for provider-native web search capabilities.
|
|
8
|
+
* Used by NativeSearchInjector to detect and configure built-in
|
|
9
|
+
* search for OpenAI, Anthropic, Google, xAI, and OpenRouter.
|
|
10
|
+
*
|
|
11
|
+
* @module completion/native-search-types
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/** Providers that support native/built-in web search */
|
|
15
|
+
type NativeSearchProvider = 'openai' | 'anthropic' | 'google' | 'xai' | 'openrouter';
|
|
16
|
+
/** Result of detecting native search support for a model */
|
|
17
|
+
interface NativeSearchDetectionResult {
|
|
18
|
+
/** Whether the model supports native search */
|
|
19
|
+
supported: boolean;
|
|
20
|
+
/** Which native provider to use, if supported */
|
|
21
|
+
nativeProvider: NativeSearchProvider | null;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Model ID patterns for detecting native search support.
|
|
25
|
+
* OpenRouter is detected via provider metadata, not model ID.
|
|
26
|
+
*/
|
|
27
|
+
declare const NATIVE_SEARCH_MODEL_PATTERNS: Record<NativeSearchProvider, RegExp[]>;
|
|
28
|
+
/**
|
|
29
|
+
* OpenAI models that use Chat Completion endpoint (not Response API).
|
|
30
|
+
* These models use `web_search_options` instead of a `web_search` tool.
|
|
31
|
+
*/
|
|
32
|
+
declare const OPENAI_CHAT_COMPLETION_SEARCH_MODELS: string[];
|
|
33
|
+
/**
|
|
34
|
+
* Models that match a native search pattern but do NOT support web search.
|
|
35
|
+
* These are excluded from auto-detection (but can still be user-overridden).
|
|
36
|
+
*
|
|
37
|
+
* - `gpt-4.1-nano`: Matches `/^gpt-4/` but OpenAI explicitly excludes it
|
|
38
|
+
* from web search support in the Responses API.
|
|
39
|
+
*/
|
|
40
|
+
declare const NATIVE_SEARCH_EXCLUDED_MODELS: string[];
|
|
41
|
+
/** Native search tool names that should NOT be executed locally */
|
|
42
|
+
declare const NATIVE_SEARCH_TOOL_NAMES: string[];
|
|
43
|
+
/** User-facing configuration for native search */
|
|
44
|
+
interface NativeSearchUserConfig {
|
|
45
|
+
/** Whether native search is enabled */
|
|
46
|
+
enabled: boolean;
|
|
47
|
+
/** Max search results / uses (maps to provider-specific settings) */
|
|
48
|
+
maxResults?: number;
|
|
49
|
+
/** Domains to block (Anthropic) */
|
|
50
|
+
blockedDomains?: string[];
|
|
51
|
+
/** xAI search mode override */
|
|
52
|
+
searchMode?: 'on' | 'off' | 'auto';
|
|
53
|
+
/** xAI search sources */
|
|
54
|
+
sources?: Array<{
|
|
55
|
+
type: 'web' | 'x' | 'news';
|
|
56
|
+
}>;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Request body augmentation produced by NativeSearchInjector.
|
|
60
|
+
*
|
|
61
|
+
* - `additionalTools`: Appended to the tools array in the request body.
|
|
62
|
+
* - `bodyFields`: Merged into the top-level request body.
|
|
63
|
+
*/
|
|
64
|
+
interface NativeSearchAugmentation {
|
|
65
|
+
/** Extra tools to append (OpenAI web_search, Anthropic web_search_20250305, Gemini grounding) */
|
|
66
|
+
additionalTools?: unknown[];
|
|
67
|
+
/** Top-level body fields (xAI search_parameters, OpenRouter plugins, OpenAI web_search_options) */
|
|
68
|
+
bodyFields?: Record<string, unknown>;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Map from API format to potential native search providers.
|
|
72
|
+
*
|
|
73
|
+
* Note: `openai` (Chat Completions) is NOT mapped here because regular models
|
|
74
|
+
* (gpt-4o, o1, etc.) don't support native search via Chat Completions API.
|
|
75
|
+
* Only `gpt-4o-search-preview` models support it (via `web_search_options` body
|
|
76
|
+
* field), and those are handled by a special case in `detectNativeSearch()`.
|
|
77
|
+
*
|
|
78
|
+
* `openai-response` (Responses API) DOES support native `web_search` tool
|
|
79
|
+
* for gpt-4o, o1, o3, o4-mini, etc.
|
|
80
|
+
*/
|
|
81
|
+
declare const API_FORMAT_PROVIDER_MAP: Partial<Record<ApiFormat, NativeSearchProvider>>;
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Completion Service Types
|
|
85
|
+
*
|
|
86
|
+
* Type definitions for completion options, results, and callbacks.
|
|
87
|
+
*/
|
|
88
|
+
|
|
89
|
+
interface CompletionOptions {
|
|
90
|
+
providerId: string;
|
|
91
|
+
model: string;
|
|
92
|
+
messages: SimpleChatMessage[];
|
|
93
|
+
maxTokens?: number;
|
|
94
|
+
temperature?: number;
|
|
95
|
+
stream?: boolean;
|
|
96
|
+
/** Thinking effort level for reasoning models */
|
|
97
|
+
thinkLevel?: ThinkLevel;
|
|
98
|
+
/** Native search augmentation to apply to the request body */
|
|
99
|
+
nativeSearchAugmentation?: NativeSearchAugmentation;
|
|
100
|
+
/** Session ID for API key pool affinity (preserves prompt cache) and usage attribution. */
|
|
101
|
+
sessionId?: string;
|
|
102
|
+
/**
|
|
103
|
+
* Assistant-message id this request is producing — used to attribute
|
|
104
|
+
* recorded usage rows back to host messages. Optional; if absent the row is
|
|
105
|
+
* still recorded but won't be linked.
|
|
106
|
+
*/
|
|
107
|
+
messageId?: string;
|
|
108
|
+
/**
|
|
109
|
+
* Parent message id (for subagent-style nested calls). Best-effort: callers
|
|
110
|
+
* that know the parent should fill this; otherwise leave unset.
|
|
111
|
+
*/
|
|
112
|
+
parentMessageId?: string;
|
|
113
|
+
/**
|
|
114
|
+
* Opt into the Anthropic 1M-context tier for this request. The transformer
|
|
115
|
+
* pipeline (and any direct Anthropic-format paths) inject the
|
|
116
|
+
* `'context-1m-2025-08-07'` beta into the outbound request body when this
|
|
117
|
+
* is true AND the resolved model is in the 1M-capable allowlist.
|
|
118
|
+
*/
|
|
119
|
+
useExtendedContext?: boolean;
|
|
120
|
+
}
|
|
121
|
+
interface CompletionResult {
|
|
122
|
+
success: boolean;
|
|
123
|
+
message?: SimpleChatMessage;
|
|
124
|
+
error?: string;
|
|
125
|
+
usage?: {
|
|
126
|
+
promptTokens: number;
|
|
127
|
+
completionTokens: number;
|
|
128
|
+
totalTokens: number;
|
|
129
|
+
};
|
|
130
|
+
/** Provider finish reason (e.g. 'stop', 'tool_use', 'max_tokens') */
|
|
131
|
+
finishReason?: string;
|
|
132
|
+
}
|
|
133
|
+
interface StreamCallbacks {
|
|
134
|
+
onStart?: (messageId: string) => void;
|
|
135
|
+
onDelta?: (content: string) => void;
|
|
136
|
+
onReasoning?: (reasoning: string) => void;
|
|
137
|
+
onAudio?: (audio: SimpleChatAudio) => void;
|
|
138
|
+
onVideo?: (video: SimpleChatVideo) => void;
|
|
139
|
+
/** Called when a new content block is created (thinking, text, tool_use, tool_result) */
|
|
140
|
+
onBlock?: (block: MessageBlock) => void;
|
|
141
|
+
onDone?: (message: SimpleChatMessage, usage?: CompletionResult['usage'], metrics?: {
|
|
142
|
+
completionTokens: number;
|
|
143
|
+
timeCompletionMs: number;
|
|
144
|
+
timeFirstTokenMs?: number;
|
|
145
|
+
}) => void;
|
|
146
|
+
onError?: (error: string) => void;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* API format type for determining endpoint structure
|
|
150
|
+
*/
|
|
151
|
+
type ApiFormat = 'openai' | 'anthropic' | 'google' | 'azure-openai' | 'openai-response';
|
|
152
|
+
|
|
153
|
+
export { type ApiFormat as A, type CompletionOptions as C, NATIVE_SEARCH_TOOL_NAMES as N, OPENAI_CHAT_COMPLETION_SEARCH_MODELS as O, type StreamCallbacks as S, type CompletionResult as a, type NativeSearchAugmentation as b, type NativeSearchDetectionResult as c, type NativeSearchProvider as d, type NativeSearchUserConfig as e, API_FORMAT_PROVIDER_MAP as f, NATIVE_SEARCH_EXCLUDED_MODELS as g, NATIVE_SEARCH_MODEL_PATTERNS as h };
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { PricingEntry, PricingEntryInput, PricingFetchResult, PricingConflictDecision, PricingResolution } from '@omnicross/contracts/pricing-types';
|
|
2
|
+
import { UsageTokens } from '@omnicross/contracts/usage-types';
|
|
3
|
+
import { L as Logger } from '../logger-4GvQNzhE.cjs';
|
|
4
|
+
import { PricingStore } from '../ports/pricing-store.cjs';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* PricingEngine — manages model pricing and computes per-event cost.
|
|
8
|
+
*
|
|
9
|
+
* Persistence goes through the injected `PricingStore` port. Sources of
|
|
10
|
+
* pricing rows:
|
|
11
|
+
* - 'builtin' — bundled fallback prices, seeded by the host
|
|
12
|
+
* - 'litellm' — refreshed on user demand from LiteLLM's public JSON
|
|
13
|
+
* - 'user' — hand-edited; protected from auto-overwrite
|
|
14
|
+
*
|
|
15
|
+
* @module usage/pricing-engine
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
/** Output of `calculateCost`. */
|
|
19
|
+
interface CostCalculation {
|
|
20
|
+
costUsd: number;
|
|
21
|
+
/**
|
|
22
|
+
* Difference between hypothetical-no-cache cost (charging cacheReadTokens at
|
|
23
|
+
* the full input price) and the actual cost (charging at the cache_read price).
|
|
24
|
+
* Always ≥ 0.
|
|
25
|
+
*/
|
|
26
|
+
costSavedByCacheUsd: number;
|
|
27
|
+
}
|
|
28
|
+
/** Optional knobs (mostly for tests). */
|
|
29
|
+
interface PricingEngineOptions {
|
|
30
|
+
/** Override the pricing-source JSON URL — useful for testing. */
|
|
31
|
+
sourceUrl?: string;
|
|
32
|
+
/** Override `fetch` — useful for testing. */
|
|
33
|
+
fetchImpl?: typeof fetch;
|
|
34
|
+
}
|
|
35
|
+
declare class PricingEngine {
|
|
36
|
+
private store;
|
|
37
|
+
private logger;
|
|
38
|
+
private options;
|
|
39
|
+
private cache;
|
|
40
|
+
/**
|
|
41
|
+
* Secondary index keyed by modelId alone. Used as a fallback when no exact
|
|
42
|
+
* (providerId, modelId) match exists — usage may be recorded under a
|
|
43
|
+
* runtime provider alias while pricing rows use the canonical provider id,
|
|
44
|
+
* so matching by model name lets the price still resolve. First
|
|
45
|
+
* non-wildcard entry per model wins.
|
|
46
|
+
*/
|
|
47
|
+
private cacheByModel;
|
|
48
|
+
private cacheLoaded;
|
|
49
|
+
constructor(store: PricingStore, logger: Logger, options?: PricingEngineOptions);
|
|
50
|
+
/** Lazy-load and cache the full pricing table. */
|
|
51
|
+
private ensureCache;
|
|
52
|
+
/** Force a cache refresh — call after any write. */
|
|
53
|
+
invalidateCache(): Promise<void>;
|
|
54
|
+
getAll(): Promise<PricingEntry[]>;
|
|
55
|
+
/**
|
|
56
|
+
* Look up a price for (provider, model). Resolution order:
|
|
57
|
+
* 1. exact (providerId, modelId)
|
|
58
|
+
* 2. wildcard provider ('*', modelId)
|
|
59
|
+
* 3. model name alone (any provider) — tolerates a runtime-alias vs
|
|
60
|
+
* canonical provider-id mismatch for the same model.
|
|
61
|
+
*/
|
|
62
|
+
getEntry(providerId: string, modelId: string): Promise<PricingEntry | null>;
|
|
63
|
+
/**
|
|
64
|
+
* Compute the cost (and cache savings) for a single response.
|
|
65
|
+
*
|
|
66
|
+
* Cost formula (USD):
|
|
67
|
+
* cost = (input * inputPrice
|
|
68
|
+
* + output * outputPrice
|
|
69
|
+
* + cacheRead * (cacheReadPrice ?? inputPrice)
|
|
70
|
+
* + cacheWrite * (cacheWritePrice ?? inputPrice)
|
|
71
|
+
* ) / 1e6
|
|
72
|
+
*
|
|
73
|
+
* Cache savings:
|
|
74
|
+
* savings = cacheRead * (inputPrice - cacheReadPrice) / 1e6
|
|
75
|
+
* — clamped at 0 if cacheReadPrice is null or ≥ inputPrice.
|
|
76
|
+
*/
|
|
77
|
+
calculateCost(providerId: string, modelId: string, usage: UsageTokens): Promise<CostCalculation>;
|
|
78
|
+
upsertManual(input: PricingEntryInput): Promise<PricingEntry>;
|
|
79
|
+
fetchLatestFromSource(): Promise<PricingFetchResult>;
|
|
80
|
+
resolveConflicts(decisions: PricingConflictDecision[], pendingIncoming: Map<string, PricingEntryInput>): Promise<PricingResolution>;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export { type CostCalculation, PricingEngine, type PricingEngineOptions };
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { PricingEntry, PricingEntryInput, PricingFetchResult, PricingConflictDecision, PricingResolution } from '@omnicross/contracts/pricing-types';
|
|
2
|
+
import { UsageTokens } from '@omnicross/contracts/usage-types';
|
|
3
|
+
import { L as Logger } from '../logger-4GvQNzhE.js';
|
|
4
|
+
import { PricingStore } from '../ports/pricing-store.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* PricingEngine — manages model pricing and computes per-event cost.
|
|
8
|
+
*
|
|
9
|
+
* Persistence goes through the injected `PricingStore` port. Sources of
|
|
10
|
+
* pricing rows:
|
|
11
|
+
* - 'builtin' — bundled fallback prices, seeded by the host
|
|
12
|
+
* - 'litellm' — refreshed on user demand from LiteLLM's public JSON
|
|
13
|
+
* - 'user' — hand-edited; protected from auto-overwrite
|
|
14
|
+
*
|
|
15
|
+
* @module usage/pricing-engine
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
/** Output of `calculateCost`. */
|
|
19
|
+
interface CostCalculation {
|
|
20
|
+
costUsd: number;
|
|
21
|
+
/**
|
|
22
|
+
* Difference between hypothetical-no-cache cost (charging cacheReadTokens at
|
|
23
|
+
* the full input price) and the actual cost (charging at the cache_read price).
|
|
24
|
+
* Always ≥ 0.
|
|
25
|
+
*/
|
|
26
|
+
costSavedByCacheUsd: number;
|
|
27
|
+
}
|
|
28
|
+
/** Optional knobs (mostly for tests). */
|
|
29
|
+
interface PricingEngineOptions {
|
|
30
|
+
/** Override the pricing-source JSON URL — useful for testing. */
|
|
31
|
+
sourceUrl?: string;
|
|
32
|
+
/** Override `fetch` — useful for testing. */
|
|
33
|
+
fetchImpl?: typeof fetch;
|
|
34
|
+
}
|
|
35
|
+
declare class PricingEngine {
|
|
36
|
+
private store;
|
|
37
|
+
private logger;
|
|
38
|
+
private options;
|
|
39
|
+
private cache;
|
|
40
|
+
/**
|
|
41
|
+
* Secondary index keyed by modelId alone. Used as a fallback when no exact
|
|
42
|
+
* (providerId, modelId) match exists — usage may be recorded under a
|
|
43
|
+
* runtime provider alias while pricing rows use the canonical provider id,
|
|
44
|
+
* so matching by model name lets the price still resolve. First
|
|
45
|
+
* non-wildcard entry per model wins.
|
|
46
|
+
*/
|
|
47
|
+
private cacheByModel;
|
|
48
|
+
private cacheLoaded;
|
|
49
|
+
constructor(store: PricingStore, logger: Logger, options?: PricingEngineOptions);
|
|
50
|
+
/** Lazy-load and cache the full pricing table. */
|
|
51
|
+
private ensureCache;
|
|
52
|
+
/** Force a cache refresh — call after any write. */
|
|
53
|
+
invalidateCache(): Promise<void>;
|
|
54
|
+
getAll(): Promise<PricingEntry[]>;
|
|
55
|
+
/**
|
|
56
|
+
* Look up a price for (provider, model). Resolution order:
|
|
57
|
+
* 1. exact (providerId, modelId)
|
|
58
|
+
* 2. wildcard provider ('*', modelId)
|
|
59
|
+
* 3. model name alone (any provider) — tolerates a runtime-alias vs
|
|
60
|
+
* canonical provider-id mismatch for the same model.
|
|
61
|
+
*/
|
|
62
|
+
getEntry(providerId: string, modelId: string): Promise<PricingEntry | null>;
|
|
63
|
+
/**
|
|
64
|
+
* Compute the cost (and cache savings) for a single response.
|
|
65
|
+
*
|
|
66
|
+
* Cost formula (USD):
|
|
67
|
+
* cost = (input * inputPrice
|
|
68
|
+
* + output * outputPrice
|
|
69
|
+
* + cacheRead * (cacheReadPrice ?? inputPrice)
|
|
70
|
+
* + cacheWrite * (cacheWritePrice ?? inputPrice)
|
|
71
|
+
* ) / 1e6
|
|
72
|
+
*
|
|
73
|
+
* Cache savings:
|
|
74
|
+
* savings = cacheRead * (inputPrice - cacheReadPrice) / 1e6
|
|
75
|
+
* — clamped at 0 if cacheReadPrice is null or ≥ inputPrice.
|
|
76
|
+
*/
|
|
77
|
+
calculateCost(providerId: string, modelId: string, usage: UsageTokens): Promise<CostCalculation>;
|
|
78
|
+
upsertManual(input: PricingEntryInput): Promise<PricingEntry>;
|
|
79
|
+
fetchLatestFromSource(): Promise<PricingFetchResult>;
|
|
80
|
+
resolveConflicts(decisions: PricingConflictDecision[], pendingIncoming: Map<string, PricingEntryInput>): Promise<PricingResolution>;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export { type CostCalculation, PricingEngine, type PricingEngineOptions };
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { PricingEngine } from './pricing-engine.cjs';
|
|
2
|
+
import { UsageDateRange, UsageTotals, ModelUsageRow, ApiKeyUsageRow, MessageUsageRow, SessionCacheStats } from '@omnicross/contracts/usage-stats-types';
|
|
3
|
+
import { UsageEngineOrigin, UsageTokens } from '@omnicross/contracts/usage-types';
|
|
4
|
+
import { L as Logger } from '../logger-4GvQNzhE.cjs';
|
|
5
|
+
import { UsageEventStore } from '../ports/usage-event-store.cjs';
|
|
6
|
+
import '@omnicross/contracts/pricing-types';
|
|
7
|
+
import '../ports/pricing-store.cjs';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* UsageRecorder — funnels every captured LLM-request event through cost
|
|
11
|
+
* calculation and persists it via the injected `UsageEventStore`.
|
|
12
|
+
*
|
|
13
|
+
* Capture taps call `record()` synchronously with the parsed usage data. The
|
|
14
|
+
* store insert is enqueued via an injectable deferral function (default: a
|
|
15
|
+
* zero-delay timer; Node hosts may inject `setImmediate`) so the response path
|
|
16
|
+
* is never blocked on disk I/O.
|
|
17
|
+
*
|
|
18
|
+
* @module usage/usage-recorder
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
/** Subset of fields the caller MUST provide. Recorder fills cost (store fills ts). */
|
|
22
|
+
interface UsageRecordInput {
|
|
23
|
+
messageId?: string | null;
|
|
24
|
+
parentMessageId?: string | null;
|
|
25
|
+
sessionId?: string | null;
|
|
26
|
+
providerId: string;
|
|
27
|
+
model: string;
|
|
28
|
+
apiKeyId?: string | null;
|
|
29
|
+
engineOrigin: UsageEngineOrigin;
|
|
30
|
+
usage: UsageTokens;
|
|
31
|
+
/** Optional raw provider usage block — kept verbatim for forensics. */
|
|
32
|
+
rawUsage?: unknown;
|
|
33
|
+
/** Host run-correlation id. Optional / additive. */
|
|
34
|
+
runId?: string | null;
|
|
35
|
+
/** Host event-correlation id for this call. Optional / additive. */
|
|
36
|
+
eventId?: string | null;
|
|
37
|
+
}
|
|
38
|
+
/** Optional knobs (mostly for hosts/tests). */
|
|
39
|
+
interface UsageRecorderOptions {
|
|
40
|
+
/**
|
|
41
|
+
* Deferral function used by `record()` to schedule the async persist off
|
|
42
|
+
* the caller's path. Defaults to a zero-delay timer; Node hosts may inject
|
|
43
|
+
* `setImmediate` to preserve their exact scheduling.
|
|
44
|
+
*/
|
|
45
|
+
defer?: (fn: () => void) => void;
|
|
46
|
+
}
|
|
47
|
+
declare class UsageRecorder {
|
|
48
|
+
private store;
|
|
49
|
+
private pricing;
|
|
50
|
+
private logger;
|
|
51
|
+
private defer;
|
|
52
|
+
constructor(store: UsageEventStore, pricing: PricingEngine, logger: Logger, options?: UsageRecorderOptions);
|
|
53
|
+
/**
|
|
54
|
+
* Record one LLM request. Returns immediately — the actual store insert is
|
|
55
|
+
* deferred so the caller's response path is unblocked.
|
|
56
|
+
*
|
|
57
|
+
* Errors during the insert are logged but never thrown.
|
|
58
|
+
*/
|
|
59
|
+
record(input: UsageRecordInput): void;
|
|
60
|
+
/**
|
|
61
|
+
* Same as `record()` but awaitable — preferred in tests so they can assert
|
|
62
|
+
* after the row exists.
|
|
63
|
+
*/
|
|
64
|
+
recordAsync(input: UsageRecordInput): Promise<string | null>;
|
|
65
|
+
getTotals(range: UsageDateRange): Promise<UsageTotals>;
|
|
66
|
+
getByModel(range: UsageDateRange): Promise<ModelUsageRow[]>;
|
|
67
|
+
getByApiKey(range: UsageDateRange): Promise<ApiKeyUsageRow[]>;
|
|
68
|
+
getMessagesForSession(sessionId: string): Promise<MessageUsageRow[]>;
|
|
69
|
+
/** Cumulative cache hit/miss stats for one session. */
|
|
70
|
+
getSessionCacheStats(sessionId: string): Promise<SessionCacheStats>;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export { type UsageRecordInput, UsageRecorder, type UsageRecorderOptions };
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { PricingEngine } from './pricing-engine.js';
|
|
2
|
+
import { UsageDateRange, UsageTotals, ModelUsageRow, ApiKeyUsageRow, MessageUsageRow, SessionCacheStats } from '@omnicross/contracts/usage-stats-types';
|
|
3
|
+
import { UsageEngineOrigin, UsageTokens } from '@omnicross/contracts/usage-types';
|
|
4
|
+
import { L as Logger } from '../logger-4GvQNzhE.js';
|
|
5
|
+
import { UsageEventStore } from '../ports/usage-event-store.js';
|
|
6
|
+
import '@omnicross/contracts/pricing-types';
|
|
7
|
+
import '../ports/pricing-store.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* UsageRecorder — funnels every captured LLM-request event through cost
|
|
11
|
+
* calculation and persists it via the injected `UsageEventStore`.
|
|
12
|
+
*
|
|
13
|
+
* Capture taps call `record()` synchronously with the parsed usage data. The
|
|
14
|
+
* store insert is enqueued via an injectable deferral function (default: a
|
|
15
|
+
* zero-delay timer; Node hosts may inject `setImmediate`) so the response path
|
|
16
|
+
* is never blocked on disk I/O.
|
|
17
|
+
*
|
|
18
|
+
* @module usage/usage-recorder
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
/** Subset of fields the caller MUST provide. Recorder fills cost (store fills ts). */
|
|
22
|
+
interface UsageRecordInput {
|
|
23
|
+
messageId?: string | null;
|
|
24
|
+
parentMessageId?: string | null;
|
|
25
|
+
sessionId?: string | null;
|
|
26
|
+
providerId: string;
|
|
27
|
+
model: string;
|
|
28
|
+
apiKeyId?: string | null;
|
|
29
|
+
engineOrigin: UsageEngineOrigin;
|
|
30
|
+
usage: UsageTokens;
|
|
31
|
+
/** Optional raw provider usage block — kept verbatim for forensics. */
|
|
32
|
+
rawUsage?: unknown;
|
|
33
|
+
/** Host run-correlation id. Optional / additive. */
|
|
34
|
+
runId?: string | null;
|
|
35
|
+
/** Host event-correlation id for this call. Optional / additive. */
|
|
36
|
+
eventId?: string | null;
|
|
37
|
+
}
|
|
38
|
+
/** Optional knobs (mostly for hosts/tests). */
|
|
39
|
+
interface UsageRecorderOptions {
|
|
40
|
+
/**
|
|
41
|
+
* Deferral function used by `record()` to schedule the async persist off
|
|
42
|
+
* the caller's path. Defaults to a zero-delay timer; Node hosts may inject
|
|
43
|
+
* `setImmediate` to preserve their exact scheduling.
|
|
44
|
+
*/
|
|
45
|
+
defer?: (fn: () => void) => void;
|
|
46
|
+
}
|
|
47
|
+
declare class UsageRecorder {
|
|
48
|
+
private store;
|
|
49
|
+
private pricing;
|
|
50
|
+
private logger;
|
|
51
|
+
private defer;
|
|
52
|
+
constructor(store: UsageEventStore, pricing: PricingEngine, logger: Logger, options?: UsageRecorderOptions);
|
|
53
|
+
/**
|
|
54
|
+
* Record one LLM request. Returns immediately — the actual store insert is
|
|
55
|
+
* deferred so the caller's response path is unblocked.
|
|
56
|
+
*
|
|
57
|
+
* Errors during the insert are logged but never thrown.
|
|
58
|
+
*/
|
|
59
|
+
record(input: UsageRecordInput): void;
|
|
60
|
+
/**
|
|
61
|
+
* Same as `record()` but awaitable — preferred in tests so they can assert
|
|
62
|
+
* after the row exists.
|
|
63
|
+
*/
|
|
64
|
+
recordAsync(input: UsageRecordInput): Promise<string | null>;
|
|
65
|
+
getTotals(range: UsageDateRange): Promise<UsageTotals>;
|
|
66
|
+
getByModel(range: UsageDateRange): Promise<ModelUsageRow[]>;
|
|
67
|
+
getByApiKey(range: UsageDateRange): Promise<ApiKeyUsageRow[]>;
|
|
68
|
+
getMessagesForSession(sessionId: string): Promise<MessageUsageRow[]>;
|
|
69
|
+
/** Cumulative cache hit/miss stats for one session. */
|
|
70
|
+
getSessionCacheStats(sessionId: string): Promise<SessionCacheStats>;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export { type UsageRecordInput, UsageRecorder, type UsageRecorderOptions };
|
package/dist/usage.cjs
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});require('./chunk-EYZYXJTJ.cjs');
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
var _chunkYMFAJFQTcjs = require('./chunk-YMFAJFQT.cjs');
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
var _chunkXBSYYZIYcjs = require('./chunk-XBSYYZIY.cjs');
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
exports.PricingEngine = _chunkYMFAJFQTcjs.PricingEngine; exports.UsageRecorder = _chunkXBSYYZIYcjs.UsageRecorder;
|
package/dist/usage.d.cts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { CostCalculation, PricingEngine, PricingEngineOptions } from './usage/pricing-engine.cjs';
|
|
2
|
+
export { UsageRecordInput, UsageRecorder, UsageRecorderOptions } from './usage/usage-recorder.cjs';
|
|
3
|
+
import '@omnicross/contracts/pricing-types';
|
|
4
|
+
import '@omnicross/contracts/usage-types';
|
|
5
|
+
import './logger-4GvQNzhE.cjs';
|
|
6
|
+
import './ports/pricing-store.cjs';
|
|
7
|
+
import '@omnicross/contracts/usage-stats-types';
|
|
8
|
+
import './ports/usage-event-store.cjs';
|