@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,241 @@
1
+ import { Ollama } from "ollama";
2
+ import { createProviderCapabilities } from "../internal/capabilities.js";
3
+ import { ProviderError, ProviderAuthenticationError, ProviderModelNotFoundError, ProviderContextLengthError, } from "../types.js";
4
+ import { withRetry } from "../internal/withRetry.js";
5
+ import { createProviderRetryOptions, expandToolResultMessages, } from "../internal/shared.js";
6
+ const OLLAMA_ERROR_PATTERNS = [
7
+ {
8
+ test: (_errorMessage, lower) => lower.includes("context length") ||
9
+ lower.includes("too many tokens") ||
10
+ lower.includes("input is too long"),
11
+ make: (errorMessage, originalError) => new ProviderContextLengthError(`Context length exceeded: ${errorMessage}`, originalError),
12
+ },
13
+ {
14
+ test: (errorMessage) => errorMessage.includes("ECONNREFUSED") ||
15
+ errorMessage.includes("ECONNRESET") ||
16
+ errorMessage.includes("connect"),
17
+ make: (errorMessage, originalError) => new ProviderAuthenticationError(`Failed to connect to Ollama: ${errorMessage}`, originalError),
18
+ },
19
+ {
20
+ test: (_errorMessage, lower) => lower.includes("model not found") || lower.includes("pull"),
21
+ make: (errorMessage, originalError, model) => new ProviderModelNotFoundError(model, `Model ${model} not found: ${errorMessage}`, originalError),
22
+ },
23
+ ];
24
+ /**
25
+ * Ollama implementation of LLMProvider
26
+ */
27
+ export class OllamaProvider {
28
+ constructor(options) {
29
+ this.name = "ollama";
30
+ const isSandbox = process.env.IS_SANDBOX === "true";
31
+ // Priority: OLLAMA_HOST (no conversion) > options.host (with conversion) > default (mode-specific)
32
+ const host = process.env.OLLAMA_HOST || this.resolveHost(options.host, isSandbox);
33
+ this.ollama = new Ollama({ host });
34
+ this.model = options.model;
35
+ this.capabilities = createProviderCapabilities(options.contextWindowTokens);
36
+ this.retryConfig = options.retryConfig;
37
+ this.onDiagnosticEvent = options.onDiagnosticEvent;
38
+ }
39
+ getCapabilities() {
40
+ return this.capabilities;
41
+ }
42
+ /**
43
+ * Resolve host with smart localhost→host.docker.internal conversion for sandbox mode
44
+ */
45
+ resolveHost(configuredHost, isSandbox) {
46
+ // If no host configured, use mode-specific default
47
+ if (!configuredHost) {
48
+ return isSandbox
49
+ ? "http://host.docker.internal:11434"
50
+ : "http://localhost:11434";
51
+ }
52
+ // If host contains localhost and we're in sandbox, convert to host.docker.internal
53
+ if (isSandbox && configuredHost.includes("localhost")) {
54
+ return configuredHost.replace("localhost", "host.docker.internal");
55
+ }
56
+ // Otherwise use as-is
57
+ return configuredHost;
58
+ }
59
+ isRetryableError(err) {
60
+ if (err instanceof ProviderContextLengthError)
61
+ return false;
62
+ if (err instanceof ProviderModelNotFoundError)
63
+ return false;
64
+ return err instanceof ProviderError;
65
+ }
66
+ mapOllamaDoneReason(doneReason) {
67
+ const reasonMap = {
68
+ length: "max_tokens",
69
+ stop: "end_turn",
70
+ };
71
+ return reasonMap[doneReason] ?? "end_turn";
72
+ }
73
+ createOllamaMessages(request) {
74
+ return this.expandToolResults(request.messages).map((msg) => this.chatMessageToOllamaMessage(msg));
75
+ }
76
+ createOllamaTools(request) {
77
+ return request.tools?.map((tool) => this.chatToolToOllamaTool(tool));
78
+ }
79
+ async createOllamaStream(request) {
80
+ const messages = this.createOllamaMessages(request);
81
+ const tools = this.createOllamaTools(request);
82
+ return await withRetry(() => this.ollama.chat({
83
+ model: request.model || this.model,
84
+ messages,
85
+ stream: true,
86
+ ...(tools && { tools }),
87
+ }), createProviderRetryOptions({
88
+ request,
89
+ model: this.model,
90
+ provider: this.name,
91
+ retryConfig: this.retryConfig,
92
+ isRetryable: (err) => this.isRetryableError(err),
93
+ onDiagnosticEvent: this.onDiagnosticEvent,
94
+ }));
95
+ }
96
+ processOllamaChunk(chunk, request, state) {
97
+ if (request.signal?.aborted) {
98
+ throw new ProviderError("Request cancelled");
99
+ }
100
+ const events = [];
101
+ if (chunk.message.thinking) {
102
+ events.push({ type: "thinking_delta", delta: chunk.message.thinking });
103
+ }
104
+ if (chunk.message.content) {
105
+ events.push({ type: "assistant_text", delta: chunk.message.content });
106
+ }
107
+ if (chunk.message.tool_calls) {
108
+ state.lastToolCalls = chunk.message.tool_calls.map((toolCall) => this.ollamaToolCallToChatToolCall(toolCall));
109
+ }
110
+ if (chunk.done_reason) {
111
+ state.stopReason = this.mapOllamaDoneReason(chunk.done_reason);
112
+ }
113
+ return events;
114
+ }
115
+ buildOllamaToolCallsEvent(toolCalls) {
116
+ return toolCalls && toolCalls.length > 0
117
+ ? {
118
+ type: "tool_calls",
119
+ toolCalls,
120
+ }
121
+ : null;
122
+ }
123
+ async *streamChat(request) {
124
+ try {
125
+ if (request.signal?.aborted) {
126
+ throw new ProviderError("Request cancelled");
127
+ }
128
+ const response = await this.createOllamaStream(request);
129
+ const state = { stopReason: "end_turn" };
130
+ for await (const chunk of response) {
131
+ yield* this.processOllamaChunk(chunk, request, state);
132
+ }
133
+ const toolCallsEvent = this.buildOllamaToolCallsEvent(state.lastToolCalls);
134
+ if (toolCallsEvent) {
135
+ yield toolCallsEvent;
136
+ }
137
+ yield { type: "terminal", stopReason: state.stopReason };
138
+ }
139
+ catch (error) {
140
+ throw this.translateError(error);
141
+ }
142
+ }
143
+ /**
144
+ * Expand batched tool results into separate messages for Ollama.
145
+ * Ollama expects each tool result as a separate message, not batched like Bedrock.
146
+ */
147
+ expandToolResults(messages) {
148
+ return expandToolResultMessages(messages, (toolResult) => toolResult.toolName);
149
+ }
150
+ /**
151
+ * Translate ChatMessage to Ollama Message format
152
+ */
153
+ chatMessageToOllamaMessage(msg) {
154
+ const ollamaMsg = {
155
+ role: msg.role,
156
+ content: msg.content,
157
+ };
158
+ if (msg.toolCalls) {
159
+ ollamaMsg.tool_calls = msg.toolCalls.map((toolCall) => ({
160
+ function: {
161
+ name: toolCall.function.name,
162
+ arguments: toolCall.function.arguments,
163
+ },
164
+ }));
165
+ }
166
+ // For tool role messages, Ollama expects tool_name field
167
+ if (msg.role === "tool" && msg.toolCallId) {
168
+ ollamaMsg.tool_name = msg.toolCallId;
169
+ }
170
+ if (msg.images) {
171
+ // Handle images as mixed type array - needs casting for type compatibility
172
+ ollamaMsg.images = msg.images;
173
+ }
174
+ return ollamaMsg;
175
+ }
176
+ /**
177
+ * Translate Ollama Message to ChatMessage
178
+ */
179
+ ollamaMessageToChatMessage(msg) {
180
+ const chatMsg = {
181
+ role: msg.role,
182
+ content: msg.content,
183
+ };
184
+ if (msg.tool_calls && msg.tool_calls.length > 0) {
185
+ chatMsg.toolCalls = msg.tool_calls.map((toolCall) => this.ollamaToolCallToChatToolCall(toolCall));
186
+ }
187
+ if (msg.images) {
188
+ // Handle mixed array of strings and Uint8Array
189
+ chatMsg.images = msg.images;
190
+ }
191
+ return chatMsg;
192
+ }
193
+ /**
194
+ * Translate Ollama ToolCall to ChatToolCall
195
+ */
196
+ ollamaToolCallToChatToolCall(toolCall) {
197
+ return {
198
+ function: {
199
+ name: toolCall.function.name,
200
+ arguments: toolCall.function.arguments,
201
+ },
202
+ };
203
+ }
204
+ /**
205
+ * Translate ChatTool to Ollama Tool format
206
+ */
207
+ chatToolToOllamaTool(chatTool) {
208
+ return {
209
+ type: chatTool.type,
210
+ function: {
211
+ name: chatTool.function.name,
212
+ description: chatTool.function.description,
213
+ parameters: chatTool.function.parameters,
214
+ },
215
+ };
216
+ }
217
+ /**
218
+ * Determine stop reason from Ollama response
219
+ */
220
+ getStopReason(message) {
221
+ if (message.tool_calls && message.tool_calls.length > 0) {
222
+ return "tool_use";
223
+ }
224
+ return "end_turn";
225
+ }
226
+ /**
227
+ * Translate errors to ProviderError types
228
+ */
229
+ translateError(error) {
230
+ const originalError = error instanceof Error ? error : undefined;
231
+ const errorMessage = originalError?.message ?? String(error);
232
+ const lower = errorMessage.toLowerCase();
233
+ for (const pattern of OLLAMA_ERROR_PATTERNS) {
234
+ if (pattern.test(errorMessage, lower)) {
235
+ return pattern.make(errorMessage, originalError, this.model);
236
+ }
237
+ }
238
+ return new ProviderError(errorMessage, originalError);
239
+ }
240
+ }
241
+ //# sourceMappingURL=ollama.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/providers/ollama.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ import { ChatRequest, ChatStreamEvent, ProviderError } from "../types.js";
2
+ import type { ProviderDiagnosticListener } from "../diagnostics.js";
3
+ import type { OpenRouterRoutingConfig } from "../config.js";
4
+ import { OpenAiCompatibleProvider } from "../internal/openAiCompatibleProvider.js";
5
+ /**
6
+ * OpenRouter implementation of LLMProvider using native fetch and OpenAI-compatible API.
7
+ */
8
+ export declare class OpenRouterProvider extends OpenAiCompatibleProvider {
9
+ readonly name = "openrouter";
10
+ private readonly model;
11
+ private readonly apiKey;
12
+ private readonly httpReferer?;
13
+ private readonly xTitle?;
14
+ private readonly providerRouting?;
15
+ private readonly fallbackModels?;
16
+ private readonly debugEchoUpstreamBody?;
17
+ private readonly debugLoggingEnabled;
18
+ private readonly onDiagnosticEvent?;
19
+ private readonly retryConfig?;
20
+ constructor(options: {
21
+ model: string;
22
+ contextWindowTokens: number;
23
+ apiKey?: string;
24
+ httpReferer?: string;
25
+ xTitle?: string;
26
+ provider?: OpenRouterRoutingConfig;
27
+ fallbackModels?: string[];
28
+ debugEchoUpstreamBody?: boolean;
29
+ debugLoggingEnabled?: boolean;
30
+ onDiagnosticEvent?: ProviderDiagnosticListener;
31
+ retryConfig?: {
32
+ maxRetries: number;
33
+ consecutive529Limit: number;
34
+ baseDelayMs?: number;
35
+ };
36
+ });
37
+ private emitDiagnostic;
38
+ private buildProviderRoutingBody;
39
+ private applyRequestBodyExtras;
40
+ private buildRequestBody;
41
+ private buildHeaders;
42
+ private fetchCompletion;
43
+ private readResponseText;
44
+ private longestSuffixOverlap;
45
+ private findDsmlStartTokenIndex;
46
+ private parseDsmlParameters;
47
+ private parseDsmlToolCalls;
48
+ private emitBufferedText;
49
+ private emitBufferPrefix;
50
+ private emitNonDsmlTail;
51
+ private consumeDsmlBuffer;
52
+ private buildStructuredToolCallsEvent;
53
+ private mapOpenRouterFinishReason;
54
+ private flushDsmlBuffer;
55
+ private processContentDelta;
56
+ private processToolCallsDelta;
57
+ private flushStreamTail;
58
+ private processStreamChunk;
59
+ private extractReasoningDetailsText;
60
+ private streamResponse;
61
+ private fetchAndValidate;
62
+ private fetchStreamResponseWithRetry;
63
+ private buildStreamResponseOptions;
64
+ streamChat(request: ChatRequest): AsyncIterable<ChatStreamEvent>;
65
+ private extractEnvelopeFields;
66
+ private parseRawMetadataFields;
67
+ private parseOpenRouterErrorBody;
68
+ private buildUpstreamDetail;
69
+ private buildRateLimitError;
70
+ private buildUpstreamServiceError;
71
+ private translateBasicHttpStatusError;
72
+ private translateHttpStatusError;
73
+ private classifyByErrorMessage;
74
+ protected translateError(error: unknown, response?: Response, responseBody?: string): ProviderError;
75
+ }
76
+ //# sourceMappingURL=openrouter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openrouter.d.ts","sourceRoot":"","sources":["../../src/providers/openrouter.ts"],"names":[],"mappings":"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"}