@propio-ai/providers 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +85 -0
  3. package/dist/config.d.ts +91 -0
  4. package/dist/config.d.ts.map +1 -0
  5. package/dist/config.js +2 -0
  6. package/dist/config.js.map +1 -0
  7. package/dist/configFile.d.ts +22 -0
  8. package/dist/configFile.d.ts.map +1 -0
  9. package/dist/configFile.js +33 -0
  10. package/dist/configFile.js.map +1 -0
  11. package/dist/configValidation.d.ts +34 -0
  12. package/dist/configValidation.d.ts.map +1 -0
  13. package/dist/configValidation.js +185 -0
  14. package/dist/configValidation.js.map +1 -0
  15. package/dist/diagnostics.d.ts +29 -0
  16. package/dist/diagnostics.d.ts.map +1 -0
  17. package/dist/diagnostics.js +9 -0
  18. package/dist/diagnostics.js.map +1 -0
  19. package/dist/factory.d.ts +56 -0
  20. package/dist/factory.d.ts.map +1 -0
  21. package/dist/factory.js +162 -0
  22. package/dist/factory.js.map +1 -0
  23. package/dist/index.d.ts +11 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +9 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/interface.d.ts +36 -0
  28. package/dist/interface.d.ts.map +1 -0
  29. package/dist/interface.js +2 -0
  30. package/dist/interface.js.map +1 -0
  31. package/dist/internal/baseProvider.d.ts +20 -0
  32. package/dist/internal/baseProvider.d.ts.map +1 -0
  33. package/dist/internal/baseProvider.js +13 -0
  34. package/dist/internal/baseProvider.js.map +1 -0
  35. package/dist/internal/capabilities.d.ts +4 -0
  36. package/dist/internal/capabilities.d.ts.map +1 -0
  37. package/dist/internal/capabilities.js +12 -0
  38. package/dist/internal/capabilities.js.map +1 -0
  39. package/dist/internal/jsonFile.d.ts +11 -0
  40. package/dist/internal/jsonFile.d.ts.map +1 -0
  41. package/dist/internal/jsonFile.js +78 -0
  42. package/dist/internal/jsonFile.js.map +1 -0
  43. package/dist/internal/openAiCompatibleProvider.d.ts +44 -0
  44. package/dist/internal/openAiCompatibleProvider.d.ts.map +1 -0
  45. package/dist/internal/openAiCompatibleProvider.js +93 -0
  46. package/dist/internal/openAiCompatibleProvider.js.map +1 -0
  47. package/dist/internal/openAiStream.d.ts +13 -0
  48. package/dist/internal/openAiStream.d.ts.map +1 -0
  49. package/dist/internal/openAiStream.js +85 -0
  50. package/dist/internal/openAiStream.js.map +1 -0
  51. package/dist/internal/shared.d.ts +79 -0
  52. package/dist/internal/shared.d.ts.map +1 -0
  53. package/dist/internal/shared.js +250 -0
  54. package/dist/internal/shared.js.map +1 -0
  55. package/dist/internal/withRetry.d.ts +25 -0
  56. package/dist/internal/withRetry.d.ts.map +1 -0
  57. package/dist/internal/withRetry.js +46 -0
  58. package/dist/internal/withRetry.js.map +1 -0
  59. package/dist/providers/anthropic.d.ts +32 -0
  60. package/dist/providers/anthropic.d.ts.map +1 -0
  61. package/dist/providers/anthropic.js +435 -0
  62. package/dist/providers/anthropic.js.map +1 -0
  63. package/dist/providers/bedrock.d.ts +67 -0
  64. package/dist/providers/bedrock.d.ts.map +1 -0
  65. package/dist/providers/bedrock.js +442 -0
  66. package/dist/providers/bedrock.js.map +1 -0
  67. package/dist/providers/cloudflare.d.ts +40 -0
  68. package/dist/providers/cloudflare.d.ts.map +1 -0
  69. package/dist/providers/cloudflare.js +115 -0
  70. package/dist/providers/cloudflare.js.map +1 -0
  71. package/dist/providers/gemini.d.ts +57 -0
  72. package/dist/providers/gemini.d.ts.map +1 -0
  73. package/dist/providers/gemini.js +359 -0
  74. package/dist/providers/gemini.js.map +1 -0
  75. package/dist/providers/ollama.d.ts +67 -0
  76. package/dist/providers/ollama.d.ts.map +1 -0
  77. package/dist/providers/ollama.js +241 -0
  78. package/dist/providers/ollama.js.map +1 -0
  79. package/dist/providers/openrouter.d.ts +76 -0
  80. package/dist/providers/openrouter.d.ts.map +1 -0
  81. package/dist/providers/openrouter.js +571 -0
  82. package/dist/providers/openrouter.js.map +1 -0
  83. package/dist/providers/xai.d.ts +45 -0
  84. package/dist/providers/xai.d.ts.map +1 -0
  85. package/dist/providers/xai.js +371 -0
  86. package/dist/providers/xai.js.map +1 -0
  87. package/dist/types.d.ts +166 -0
  88. package/dist/types.d.ts.map +1 -0
  89. package/dist/types.js +60 -0
  90. package/dist/types.js.map +1 -0
  91. package/package.json +70 -0
@@ -0,0 +1,162 @@
1
+ import { OllamaProvider } from "./providers/ollama.js";
2
+ import { BedrockProvider } from "./providers/bedrock.js";
3
+ import { OpenRouterProvider } from "./providers/openrouter.js";
4
+ import { GeminiProvider } from "./providers/gemini.js";
5
+ import { XaiProvider } from "./providers/xai.js";
6
+ import { CloudflareProvider } from "./providers/cloudflare.js";
7
+ import { AnthropicProvider } from "./providers/anthropic.js";
8
+ /**
9
+ * Factory function to create LLM provider instances from configuration.
10
+ *
11
+ * This factory encapsulates provider instantiation logic, allowing new providers to be added
12
+ * without modifying the Agent class. The factory uses a switch statement on type field
13
+ * to determine which provider class to instantiate.
14
+ *
15
+ * @param config - Provider configuration containing type field and provider-specific settings
16
+ * @param modelKey - Optional model key override. If provided, uses this instead of config.defaultModel
17
+ * @returns An LLMProvider interface instance configured according to the provided config
18
+ * @throws Error if the provider type is unknown or unsupported
19
+ *
20
+ * @example
21
+ * // Create an Ollama provider
22
+ * const ollamaProvider = createProvider({
23
+ * name: 'local-ollama',
24
+ * type: 'ollama',
25
+ * models: [{ name: 'Llama', key: 'llama3.2', contextWindowTokens: 8192 }],
26
+ * defaultModel: 'llama3.2',
27
+ * host: 'http://localhost:11434'
28
+ * });
29
+ *
30
+ * @example
31
+ * // Create a Bedrock provider with specific model
32
+ * const bedrockProvider = createProvider({
33
+ * name: 'bedrock',
34
+ * type: 'bedrock',
35
+ * models: [{ name: 'Claude 3.5', key: 'anthropic.claude-3-5-sonnet-20241022-v2:0', contextWindowTokens: 200000 }],
36
+ * defaultModel: 'anthropic.claude-3-5-sonnet-20241022-v2:0',
37
+ * region: 'us-west-2'
38
+ * }, 'anthropic.claude-3-5-sonnet-20241022-v2:0');
39
+ */
40
+ export function createProvider(config, modelKey, onDiagnosticEvent, debugLoggingEnabled = false, retryConfig) {
41
+ const model = modelKey || config.defaultModel;
42
+ const resolveModelConfig = () => {
43
+ const modelConfig = config.models.find((entry) => entry.key === model);
44
+ if (!modelConfig) {
45
+ const availableModels = config.models
46
+ .map((entry) => entry.key)
47
+ .join(", ");
48
+ throw new Error(`Model "${model}" not found in provider "${config.name}". Available: ${availableModels}`);
49
+ }
50
+ return modelConfig;
51
+ };
52
+ // Switch statement pattern for mapping provider type to implementation.
53
+ // Each case instantiates the appropriate provider class with extracted config.
54
+ switch (config.type) {
55
+ case "ollama": {
56
+ const modelConfig = resolveModelConfig();
57
+ return new OllamaProvider({
58
+ model: model,
59
+ contextWindowTokens: modelConfig.contextWindowTokens,
60
+ host: config.host,
61
+ retryConfig,
62
+ onDiagnosticEvent,
63
+ });
64
+ }
65
+ case "bedrock": {
66
+ const modelConfig = resolveModelConfig();
67
+ return new BedrockProvider({
68
+ model: model,
69
+ contextWindowTokens: modelConfig.contextWindowTokens,
70
+ region: config.region,
71
+ retryConfig,
72
+ onDiagnosticEvent,
73
+ });
74
+ }
75
+ case "openrouter": {
76
+ const openRouterConfig = config;
77
+ const modelConfig = resolveModelConfig();
78
+ return new OpenRouterProvider({
79
+ model,
80
+ contextWindowTokens: modelConfig.contextWindowTokens,
81
+ apiKey: openRouterConfig.apiKey,
82
+ httpReferer: openRouterConfig.httpReferer,
83
+ xTitle: openRouterConfig.xTitle,
84
+ provider: openRouterConfig.provider,
85
+ fallbackModels: openRouterConfig.fallbackModels,
86
+ debugEchoUpstreamBody: openRouterConfig.debugEchoUpstreamBody,
87
+ debugLoggingEnabled,
88
+ onDiagnosticEvent,
89
+ retryConfig,
90
+ });
91
+ }
92
+ case "gemini": {
93
+ const geminiConfig = config;
94
+ const modelConfig = resolveModelConfig();
95
+ return new GeminiProvider({
96
+ model,
97
+ contextWindowTokens: modelConfig.contextWindowTokens,
98
+ apiKey: geminiConfig.apiKey,
99
+ retryConfig,
100
+ onDiagnosticEvent,
101
+ });
102
+ }
103
+ case "xai": {
104
+ const xaiConfig = config;
105
+ const modelConfig = resolveModelConfig();
106
+ return new XaiProvider({
107
+ model,
108
+ contextWindowTokens: modelConfig.contextWindowTokens,
109
+ apiKey: xaiConfig.apiKey,
110
+ retryConfig,
111
+ onDiagnosticEvent,
112
+ });
113
+ }
114
+ case "cloudflare": {
115
+ const cloudflareConfig = config;
116
+ const modelConfig = resolveModelConfig();
117
+ return new CloudflareProvider({
118
+ model,
119
+ contextWindowTokens: modelConfig.contextWindowTokens,
120
+ apiKey: cloudflareConfig.apiKey,
121
+ accountId: cloudflareConfig.accountId,
122
+ retryConfig,
123
+ onDiagnosticEvent,
124
+ });
125
+ }
126
+ case "anthropic": {
127
+ const anthropicConfig = config;
128
+ const modelConfig = resolveModelConfig();
129
+ return new AnthropicProvider({
130
+ model,
131
+ contextWindowTokens: modelConfig.contextWindowTokens,
132
+ apiKey: anthropicConfig.apiKey,
133
+ retryConfig,
134
+ onDiagnosticEvent,
135
+ });
136
+ }
137
+ default:
138
+ throw new Error(`Unknown provider type: "${config.type}". Valid providers: ollama, bedrock, openrouter, gemini, xai, cloudflare, anthropic`);
139
+ }
140
+ }
141
+ /**
142
+ * Extract the default model name from a provider configuration.
143
+ *
144
+ * This utility function provides a centralized way to extract the default model name from any
145
+ * provider configuration type. All provider configs now have a top-level defaultModel field.
146
+ *
147
+ * @param config - The provider configuration object
148
+ * @returns The default model key string
149
+ *
150
+ * @example
151
+ * const model = extractModelFromConfig({
152
+ * name: 'ollama',
153
+ * type: 'ollama',
154
+ * models: [{ name: 'Llama', key: 'llama3.2', contextWindowTokens: 8192 }],
155
+ * defaultModel: 'llama3.2'
156
+ * });
157
+ * console.log(model); // 'llama3.2'
158
+ */
159
+ export function extractModelFromConfig(config) {
160
+ return config.defaultModel;
161
+ }
162
+ //# sourceMappingURL=factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export { createProvider, extractModelFromConfig } from "./factory.js";
2
+ export type { LLMProvider, ProviderCapabilities } from "./interface.js";
3
+ export { ProviderError, ProviderAuthenticationError, ProviderRateLimitError, ProviderCapacityError, ProviderModelNotFoundError, ProviderContextLengthError, } from "./types.js";
4
+ export type { ToolResult, ChatMessage, ChatToolCall, ChatTool, ChatRequest, ChatResponse, ChatChunk, ChatStreamEvent, StopReason, ProviderReasoningSummarySource, AssistantTextStreamEvent, ThinkingDeltaStreamEvent, ToolCallsStreamEvent, StatusStreamEvent, ReasoningSummaryStreamEvent, StreamTerminalEvent, } from "./types.js";
5
+ export type { Model, BaseProviderConfig, OllamaProviderConfig, BedrockProviderConfig, OpenRouterRoutingConfig, OpenRouterProviderConfig, XaiProviderConfig, CloudflareProviderConfig, GeminiProviderConfig, AnthropicProviderConfig, ProviderConfig, ProvidersConfig, } from "./config.js";
6
+ export { validateProvidersConfig, resolveProvider, resolveModelKey, getDefaultProviderModelSelection, updateDefaultProviderModelSelection, } from "./configValidation.js";
7
+ export type { ProviderModelSelection } from "./configValidation.js";
8
+ export { loadProvidersConfig, loadProvidersConfigAsync, writeProvidersConfig, updateDefaultProviderModelSelectionInFile, } from "./configFile.js";
9
+ export type { LoadProvidersConfigOptions } from "./configFile.js";
10
+ export type { ProviderDiagnosticEvent, ProviderRetryDiagnosticEvent, ProviderDiagnosticListener, ProviderRetryConfig, } from "./diagnostics.js";
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAGtE,YAAY,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAGxE,OAAO,EACL,aAAa,EACb,2BAA2B,EAC3B,sBAAsB,EACtB,qBAAqB,EACrB,0BAA0B,EAC1B,0BAA0B,GAC3B,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,UAAU,EACV,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,SAAS,EACT,eAAe,EACf,UAAU,EACV,8BAA8B,EAC9B,wBAAwB,EACxB,wBAAwB,EACxB,oBAAoB,EACpB,iBAAiB,EACjB,2BAA2B,EAC3B,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAGpB,YAAY,EACV,KAAK,EACL,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,wBAAwB,EACxB,iBAAiB,EACjB,wBAAwB,EACxB,oBAAoB,EACpB,uBAAuB,EACvB,cAAc,EACd,eAAe,GAChB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,uBAAuB,EACvB,eAAe,EACf,eAAe,EACf,gCAAgC,EAChC,mCAAmC,GACpC,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAGpE,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,oBAAoB,EACpB,yCAAyC,GAC1C,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAGlE,YAAY,EACV,uBAAuB,EACvB,4BAA4B,EAC5B,0BAA0B,EAC1B,mBAAmB,GACpB,MAAM,kBAAkB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ // Provider factory
2
+ export { createProvider, extractModelFromConfig } from "./factory.js";
3
+ // Wire types and error classes
4
+ export { ProviderError, ProviderAuthenticationError, ProviderRateLimitError, ProviderCapacityError, ProviderModelNotFoundError, ProviderContextLengthError, } from "./types.js";
5
+ // Config validation (pure)
6
+ export { validateProvidersConfig, resolveProvider, resolveModelKey, getDefaultProviderModelSelection, updateDefaultProviderModelSelection, } from "./configValidation.js";
7
+ // Config file helpers (explicit paths)
8
+ export { loadProvidersConfig, loadProvidersConfigAsync, writeProvidersConfig, updateDefaultProviderModelSelectionInFile, } from "./configFile.js";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mBAAmB;AACnB,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAKtE,+BAA+B;AAC/B,OAAO,EACL,aAAa,EACb,2BAA2B,EAC3B,sBAAsB,EACtB,qBAAqB,EACrB,0BAA0B,EAC1B,0BAA0B,GAC3B,MAAM,YAAY,CAAC;AAoCpB,2BAA2B;AAC3B,OAAO,EACL,uBAAuB,EACvB,eAAe,EACf,eAAe,EACf,gCAAgC,EAChC,mCAAmC,GACpC,MAAM,uBAAuB,CAAC;AAG/B,uCAAuC;AACvC,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,oBAAoB,EACpB,yCAAyC,GAC1C,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { ChatRequest, ChatStreamEvent } from "./types.js";
2
+ /**
3
+ * Provider capability information for the currently configured model.
4
+ */
5
+ export interface ProviderCapabilities {
6
+ readonly contextWindowTokens: number;
7
+ /**
8
+ * Whether the provider accepts synthetic (caller-fabricated) assistant
9
+ * tool-call history that was never produced by the model. Providers that
10
+ * verify tool-call provenance (e.g. Gemini's thought signatures) reject
11
+ * such history; callers should inline that content into a user message
12
+ * instead. undefined/true = supported.
13
+ */
14
+ readonly supportsSyntheticToolCallHistory?: boolean;
15
+ }
16
+ /**
17
+ * LLMProvider interface defining the contract for all LLM provider implementations
18
+ */
19
+ export interface LLMProvider {
20
+ /**
21
+ * Provider identifier
22
+ */
23
+ readonly name: string;
24
+ /**
25
+ * Return capability info for the active model. Implementations may use
26
+ * internal lookup tables; callers can override via per-model config.
27
+ */
28
+ getCapabilities(): ProviderCapabilities;
29
+ /**
30
+ * Streaming chat completion
31
+ * @param request - The chat request with messages, model, and optional tools
32
+ * @returns AsyncIterable yielding ChatStreamEvent objects for assistant text/tool calls/status updates
33
+ */
34
+ streamChat(request: ChatRequest): AsyncIterable<ChatStreamEvent>;
35
+ }
36
+ //# sourceMappingURL=interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../src/interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC;;;;;;OAMG;IACH,QAAQ,CAAC,gCAAgC,CAAC,EAAE,OAAO,CAAC;CACrD;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,eAAe,IAAI,oBAAoB,CAAC;IAExC;;;;OAIG;IACH,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,aAAa,CAAC,eAAe,CAAC,CAAC;CAClE"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interface.js","sourceRoot":"","sources":["../src/interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,20 @@
1
+ import { LLMProvider, ProviderCapabilities } from "../interface.js";
2
+ import { ChatRequest, ChatStreamEvent } from "../types.js";
3
+ import type { ProviderDiagnosticListener, ProviderRetryConfig } from "../diagnostics.js";
4
+ export interface BaseProviderOptions {
5
+ model: string;
6
+ contextWindowTokens: number;
7
+ retryConfig?: ProviderRetryConfig;
8
+ onDiagnosticEvent?: ProviderDiagnosticListener;
9
+ }
10
+ export declare abstract class BaseProvider implements LLMProvider {
11
+ abstract readonly name: string;
12
+ protected model: string;
13
+ protected capabilities: ProviderCapabilities;
14
+ protected retryConfig?: ProviderRetryConfig;
15
+ protected onDiagnosticEvent?: ProviderDiagnosticListener;
16
+ constructor(options: BaseProviderOptions);
17
+ getCapabilities(): ProviderCapabilities;
18
+ abstract streamChat(request: ChatRequest): AsyncIterable<ChatStreamEvent>;
19
+ }
20
+ //# sourceMappingURL=baseProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseProvider.d.ts","sourceRoot":"","sources":["../../src/internal/baseProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEpE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,KAAK,EACV,0BAA0B,EAC1B,mBAAmB,EACpB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAClC,iBAAiB,CAAC,EAAE,0BAA0B,CAAC;CAChD;AAED,8BAAsB,YAAa,YAAW,WAAW;IACvD,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAC/B,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,YAAY,EAAE,oBAAoB,CAAC;IAC7C,SAAS,CAAC,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAC5C,SAAS,CAAC,iBAAiB,CAAC,EAAE,0BAA0B,CAAC;gBAE7C,OAAO,EAAE,mBAAmB;IAOxC,eAAe,IAAI,oBAAoB;IAIvC,QAAQ,CAAC,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,aAAa,CAAC,eAAe,CAAC;CAC1E"}
@@ -0,0 +1,13 @@
1
+ import { createProviderCapabilities } from "./capabilities.js";
2
+ export class BaseProvider {
3
+ constructor(options) {
4
+ this.model = options.model;
5
+ this.capabilities = createProviderCapabilities(options.contextWindowTokens);
6
+ this.retryConfig = options.retryConfig;
7
+ this.onDiagnosticEvent = options.onDiagnosticEvent;
8
+ }
9
+ getCapabilities() {
10
+ return this.capabilities;
11
+ }
12
+ }
13
+ //# sourceMappingURL=baseProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseProvider.js","sourceRoot":"","sources":["../../src/internal/baseProvider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAc/D,MAAM,OAAgB,YAAY;IAOhC,YAAY,OAA4B;QACtC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,YAAY,GAAG,0BAA0B,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QAC5E,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QACvC,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IACrD,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;CAGF"}
@@ -0,0 +1,4 @@
1
+ import type { ProviderCapabilities } from "../interface.js";
2
+ export declare function validateContextWindowTokens(value: unknown, label: string): number;
3
+ export declare function createProviderCapabilities(contextWindowTokens: number): ProviderCapabilities;
4
+ //# sourceMappingURL=capabilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../src/internal/capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAE5D,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,GACZ,MAAM,CAMR;AAED,wBAAgB,0BAA0B,CACxC,mBAAmB,EAAE,MAAM,GAC1B,oBAAoB,CAOtB"}
@@ -0,0 +1,12 @@
1
+ export function validateContextWindowTokens(value, label) {
2
+ if (!Number.isInteger(value) || value <= 0) {
3
+ throw new Error(`${label} must be a positive integer`);
4
+ }
5
+ return value;
6
+ }
7
+ export function createProviderCapabilities(contextWindowTokens) {
8
+ return {
9
+ contextWindowTokens: validateContextWindowTokens(contextWindowTokens, "contextWindowTokens"),
10
+ };
11
+ }
12
+ //# sourceMappingURL=capabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/internal/capabilities.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,2BAA2B,CACzC,KAAc,EACd,KAAa;IAEb,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAK,KAAgB,IAAI,CAAC,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,6BAA6B,CAAC,CAAC;IACzD,CAAC;IAED,OAAO,KAAe,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,mBAA2B;IAE3B,OAAO;QACL,mBAAmB,EAAE,2BAA2B,CAC9C,mBAAmB,EACnB,qBAAqB,CACtB;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ interface ReadJsonFileOptions {
2
+ readonly invalidJsonPrefix: string;
3
+ readonly missingMessage?: string;
4
+ readonly onMissing?: () => unknown;
5
+ readonly readErrorPrefix: string;
6
+ }
7
+ export declare function readJsonFile(filePath: string, options: ReadJsonFileOptions): unknown;
8
+ export declare function readJsonFileAsync(filePath: string, options: ReadJsonFileOptions): Promise<unknown>;
9
+ export declare function writeJsonFileAtomic(filePath: string, tempFilePrefix: string, config: unknown): void;
10
+ export {};
11
+ //# sourceMappingURL=jsonFile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonFile.d.ts","sourceRoot":"","sources":["../../src/internal/jsonFile.ts"],"names":[],"mappings":"AAGA,UAAU,mBAAmB;IAC3B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC;IACnC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AAeD,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAuBT;AAED,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,OAAO,CAAC,CAuBlB;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,OAAO,GACd,IAAI,CAsBN"}
@@ -0,0 +1,78 @@
1
+ import * as fs from "fs";
2
+ import * as path from "path";
3
+ function getErrorMessage(error) {
4
+ return error instanceof Error ? error.message : String(error);
5
+ }
6
+ function isFileNotFound(error) {
7
+ return (typeof error === "object" &&
8
+ error !== null &&
9
+ "code" in error &&
10
+ error.code === "ENOENT");
11
+ }
12
+ export function readJsonFile(filePath, options) {
13
+ let fileContent;
14
+ try {
15
+ fileContent = fs.readFileSync(filePath, "utf8");
16
+ }
17
+ catch (error) {
18
+ if (isFileNotFound(error)) {
19
+ if (options.onMissing) {
20
+ return options.onMissing();
21
+ }
22
+ if (options.missingMessage) {
23
+ throw new Error(options.missingMessage);
24
+ }
25
+ }
26
+ throw new Error(`${options.readErrorPrefix}: ${getErrorMessage(error)}`);
27
+ }
28
+ try {
29
+ return JSON.parse(fileContent);
30
+ }
31
+ catch (error) {
32
+ throw new Error(`${options.invalidJsonPrefix}: ${getErrorMessage(error)}`);
33
+ }
34
+ }
35
+ export async function readJsonFileAsync(filePath, options) {
36
+ let fileContent;
37
+ try {
38
+ fileContent = await fs.promises.readFile(filePath, "utf8");
39
+ }
40
+ catch (error) {
41
+ if (isFileNotFound(error)) {
42
+ if (options.onMissing) {
43
+ return options.onMissing();
44
+ }
45
+ if (options.missingMessage) {
46
+ throw new Error(options.missingMessage);
47
+ }
48
+ }
49
+ throw new Error(`${options.readErrorPrefix}: ${getErrorMessage(error)}`);
50
+ }
51
+ try {
52
+ return JSON.parse(fileContent);
53
+ }
54
+ catch (error) {
55
+ throw new Error(`${options.invalidJsonPrefix}: ${getErrorMessage(error)}`);
56
+ }
57
+ }
58
+ export function writeJsonFileAtomic(filePath, tempFilePrefix, config) {
59
+ const directory = path.dirname(filePath);
60
+ fs.mkdirSync(directory, { recursive: true });
61
+ const tempFilePath = path.join(directory, `.${tempFilePrefix}.${process.pid}.${Date.now()}.tmp`);
62
+ try {
63
+ fs.writeFileSync(tempFilePath, `${JSON.stringify(config, null, 2)}\n`, {
64
+ encoding: "utf8",
65
+ });
66
+ fs.renameSync(tempFilePath, filePath);
67
+ }
68
+ catch (error) {
69
+ try {
70
+ fs.rmSync(tempFilePath, { force: true });
71
+ }
72
+ catch {
73
+ // Best-effort cleanup only.
74
+ }
75
+ throw error;
76
+ }
77
+ }
78
+ //# sourceMappingURL=jsonFile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonFile.js","sourceRoot":"","sources":["../../src/internal/jsonFile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { ProviderDiagnosticListener } from "../diagnostics.js";
2
+ import type { LLMProvider, ProviderCapabilities } from "../interface.js";
3
+ import type { ChatMessage, ChatRequest, ChatStreamEvent, ChatTool } from "../types.js";
4
+ import type { WithRetryOptions } from "./withRetry.js";
5
+ import { ProviderError } from "../types.js";
6
+ import { OpenAIMessageCore, OpenAIToolDefinition } from "./shared.js";
7
+ export interface OpenAiCompatibleRetryConfig {
8
+ readonly maxRetries: number;
9
+ readonly consecutive529Limit: number;
10
+ readonly baseDelayMs?: number;
11
+ }
12
+ export interface OpenAiCompatibleProviderOptions {
13
+ readonly model: string;
14
+ readonly contextWindowTokens: number;
15
+ readonly apiKey?: string;
16
+ readonly retryConfig?: OpenAiCompatibleRetryConfig;
17
+ readonly onDiagnosticEvent?: ProviderDiagnosticListener;
18
+ }
19
+ interface StandardOpenAiErrorOptions {
20
+ readonly model: string;
21
+ readonly authenticationMessage: string;
22
+ readonly rateLimitMessage: string;
23
+ readonly serviceErrorMessage: string;
24
+ readonly connectionErrorMessage: string;
25
+ readonly requestFailedMessage: string;
26
+ }
27
+ export declare abstract class OpenAiCompatibleProvider implements LLMProvider {
28
+ abstract readonly name: string;
29
+ private capabilities?;
30
+ abstract streamChat(request: ChatRequest): AsyncIterable<ChatStreamEvent>;
31
+ protected abstract translateError(error: unknown, response?: Response, responseBody?: string): ProviderError;
32
+ protected chatMessageToOpenAIMessage(msg: ChatMessage): OpenAIMessageCore;
33
+ protected chatToolToOpenAITool(tool: ChatTool): OpenAIToolDefinition;
34
+ getCapabilities(): ProviderCapabilities;
35
+ protected configureCapabilities(contextWindowTokens: number): void;
36
+ protected createOriginalError(error: unknown): Error;
37
+ protected buildRetryOptions(request: ChatRequest, model: string, retryConfig: OpenAiCompatibleRetryConfig | undefined, onDiagnosticEvent?: ProviderDiagnosticListener): WithRetryOptions;
38
+ protected translateCommonMessageError(msg: string | undefined, originalError: Error, connectionErrorMessage: string): ProviderError | null;
39
+ protected translateStandardOpenAiError(error: unknown, response: Response | undefined, options: StandardOpenAiErrorOptions): ProviderError;
40
+ private translateStandardOpenAiResponseError;
41
+ protected isRetryableError(err: unknown): boolean;
42
+ }
43
+ export {};
44
+ //# sourceMappingURL=openAiCompatibleProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openAiCompatibleProvider.d.ts","sourceRoot":"","sources":["../../src/internal/openAiCompatibleProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,eAAe,EACf,QAAQ,EACT,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EACL,aAAa,EAKd,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EAQrB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,2BAA2B,CAAC;IACnD,QAAQ,CAAC,iBAAiB,CAAC,EAAE,0BAA0B,CAAC;CACzD;AAED,UAAU,0BAA0B;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;CACvC;AAED,8BAAsB,wBAAyB,YAAW,WAAW;IACnE,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAC/B,OAAO,CAAC,YAAY,CAAC,CAAuB;IAE5C,QAAQ,CAAC,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,aAAa,CAAC,eAAe,CAAC;IACzE,SAAS,CAAC,QAAQ,CAAC,cAAc,CAC/B,KAAK,EAAE,OAAO,EACd,QAAQ,CAAC,EAAE,QAAQ,EACnB,YAAY,CAAC,EAAE,MAAM,GACpB,aAAa;IAEhB,SAAS,CAAC,0BAA0B,CAAC,GAAG,EAAE,WAAW,GAAG,iBAAiB;IAMzE,SAAS,CAAC,oBAAoB,CAAC,IAAI,EAAE,QAAQ,GAAG,oBAAoB;IAIpE,eAAe,IAAI,oBAAoB;IAOvC,SAAS,CAAC,qBAAqB,CAAC,mBAAmB,EAAE,MAAM,GAAG,IAAI;IAIlE,SAAS,CAAC,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK;IAIpD,SAAS,CAAC,iBAAiB,CACzB,OAAO,EAAE,WAAW,EACpB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,2BAA2B,GAAG,SAAS,EACpD,iBAAiB,CAAC,EAAE,0BAA0B,GAC7C,gBAAgB;IAWnB,SAAS,CAAC,2BAA2B,CACnC,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,aAAa,EAAE,KAAK,EACpB,sBAAsB,EAAE,MAAM,GAC7B,aAAa,GAAG,IAAI;IAuBvB,SAAS,CAAC,4BAA4B,CACpC,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAC9B,OAAO,EAAE,0BAA0B,GAClC,aAAa;IA6BhB,OAAO,CAAC,oCAAoC;IAmD5C,SAAS,CAAC,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO;CAMlD"}
@@ -0,0 +1,93 @@
1
+ import { createProviderCapabilities } from "./capabilities.js";
2
+ import { ProviderError, ProviderAuthenticationError, ProviderContextLengthError, ProviderModelNotFoundError, ProviderRateLimitError, } from "../types.js";
3
+ import { applyOpenAIMessageCore, createOpenAIToolDefinition, createProviderRetryOptions, isAbortOrTransportError, isContextLengthError, normalizeErrorMessage, parseRetryAfterSeconds, } from "./shared.js";
4
+ export class OpenAiCompatibleProvider {
5
+ chatMessageToOpenAIMessage(msg) {
6
+ const role = msg.role;
7
+ const out = { role, content: msg.content ?? "" };
8
+ return applyOpenAIMessageCore(out, msg);
9
+ }
10
+ chatToolToOpenAITool(tool) {
11
+ return createOpenAIToolDefinition(tool);
12
+ }
13
+ getCapabilities() {
14
+ if (!this.capabilities) {
15
+ throw new ProviderError("Provider capabilities were not configured");
16
+ }
17
+ return this.capabilities;
18
+ }
19
+ configureCapabilities(contextWindowTokens) {
20
+ this.capabilities = createProviderCapabilities(contextWindowTokens);
21
+ }
22
+ createOriginalError(error) {
23
+ return error instanceof Error ? error : new Error(String(error));
24
+ }
25
+ buildRetryOptions(request, model, retryConfig, onDiagnosticEvent) {
26
+ return createProviderRetryOptions({
27
+ request,
28
+ model,
29
+ provider: this.name,
30
+ retryConfig,
31
+ isRetryable: (err) => this.isRetryableError(err),
32
+ onDiagnosticEvent,
33
+ });
34
+ }
35
+ translateCommonMessageError(msg, originalError, connectionErrorMessage) {
36
+ if (!msg) {
37
+ return null;
38
+ }
39
+ if (isContextLengthError(msg)) {
40
+ return new ProviderContextLengthError(`Context length exceeded: ${msg}`, originalError);
41
+ }
42
+ if (msg.includes("AbortError") || msg.includes("aborted")) {
43
+ return new ProviderError("Request cancelled", originalError);
44
+ }
45
+ if (isAbortOrTransportError(msg)) {
46
+ return new ProviderError(connectionErrorMessage, originalError);
47
+ }
48
+ return null;
49
+ }
50
+ translateStandardOpenAiError(error, response, options) {
51
+ const originalError = this.createOriginalError(error);
52
+ const normalizedMessage = normalizeErrorMessage(originalError.message);
53
+ if (response) {
54
+ const responseError = this.translateStandardOpenAiResponseError(response, normalizedMessage, originalError, options);
55
+ if (responseError) {
56
+ return responseError;
57
+ }
58
+ }
59
+ return (this.translateCommonMessageError(normalizedMessage || originalError.message, originalError, options.connectionErrorMessage) ??
60
+ new ProviderError(originalError.message || options.requestFailedMessage, originalError));
61
+ }
62
+ translateStandardOpenAiResponseError(response, normalizedMessage, originalError, options) {
63
+ if (response.status === 400 && isContextLengthError(normalizedMessage)) {
64
+ return new ProviderContextLengthError(`Context length exceeded: ${normalizedMessage}`, originalError);
65
+ }
66
+ if (response.status === 401) {
67
+ return new ProviderAuthenticationError(options.authenticationMessage, originalError);
68
+ }
69
+ if (response.status === 429) {
70
+ const retryAfterSeconds = parseRetryAfterSeconds(response.headers.get("retry-after"));
71
+ return new ProviderRateLimitError(options.rateLimitMessage, retryAfterSeconds, originalError);
72
+ }
73
+ if (response.status === 404) {
74
+ return new ProviderModelNotFoundError(options.model, `Model not found: ${options.model}`, originalError);
75
+ }
76
+ if (response.status >= 500 && response.status < 600) {
77
+ return new ProviderError(normalizedMessage
78
+ ? `${options.serviceErrorMessage}: ${normalizedMessage}`
79
+ : options.serviceErrorMessage, originalError);
80
+ }
81
+ return null;
82
+ }
83
+ isRetryableError(err) {
84
+ if (err instanceof ProviderAuthenticationError)
85
+ return false;
86
+ if (err instanceof ProviderContextLengthError)
87
+ return false;
88
+ if (err instanceof ProviderModelNotFoundError)
89
+ return false;
90
+ return err instanceof ProviderError;
91
+ }
92
+ }
93
+ //# sourceMappingURL=openAiCompatibleProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openAiCompatibleProvider.js","sourceRoot":"","sources":["../../src/internal/openAiCompatibleProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { WithRetryOptions } from "./withRetry.js";
2
+ import type { ProviderError } from "../types.js";
3
+ import { type OpenAIStreamToolCallAccumulator } from "./shared.js";
4
+ import type { ChatStreamEvent } from "../types.js";
5
+ export declare function consumeOpenAiChatCompletionsStream(reader: ReadableStreamDefaultReader<Uint8Array>, toolCallsByIndex: Map<number, OpenAIStreamToolCallAccumulator>): AsyncIterable<ChatStreamEvent>;
6
+ export declare function fetchOpenAiCompatibleStreamReader(options: {
7
+ body: Record<string, unknown>;
8
+ signal: AbortSignal | undefined;
9
+ fetchStream: (body: Record<string, unknown>, signal: AbortSignal | undefined) => Promise<Response>;
10
+ retryOptions: WithRetryOptions;
11
+ translateError: (error: unknown) => ProviderError;
12
+ }): Promise<ReadableStreamDefaultReader<Uint8Array>>;
13
+ //# sourceMappingURL=openAiStream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openAiStream.d.ts","sourceRoot":"","sources":["../../src/internal/openAiStream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAML,KAAK,+BAA+B,EACrC,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,eAAe,EAAc,MAAM,aAAa,CAAC;AAyG/D,wBAAuB,kCAAkC,CACvD,MAAM,EAAE,2BAA2B,CAAC,UAAU,CAAC,EAC/C,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,+BAA+B,CAAC,GAC7D,aAAa,CAAC,eAAe,CAAC,CAchC;AAED,wBAAsB,iCAAiC,CAAC,OAAO,EAAE;IAC/D,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC;IAChC,WAAW,EAAE,CACX,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,WAAW,GAAG,SAAS,KAC5B,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvB,YAAY,EAAE,gBAAgB,CAAC;IAC/B,cAAc,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,aAAa,CAAC;CACnD,GAAG,OAAO,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAC,CAUnD"}