@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.
- package/LICENSE +21 -0
- package/README.md +85 -0
- package/dist/config.d.ts +91 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +2 -0
- package/dist/config.js.map +1 -0
- package/dist/configFile.d.ts +22 -0
- package/dist/configFile.d.ts.map +1 -0
- package/dist/configFile.js +33 -0
- package/dist/configFile.js.map +1 -0
- package/dist/configValidation.d.ts +34 -0
- package/dist/configValidation.d.ts.map +1 -0
- package/dist/configValidation.js +185 -0
- package/dist/configValidation.js.map +1 -0
- package/dist/diagnostics.d.ts +29 -0
- package/dist/diagnostics.d.ts.map +1 -0
- package/dist/diagnostics.js +9 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/factory.d.ts +56 -0
- package/dist/factory.d.ts.map +1 -0
- package/dist/factory.js +162 -0
- package/dist/factory.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/interface.d.ts +36 -0
- package/dist/interface.d.ts.map +1 -0
- package/dist/interface.js +2 -0
- package/dist/interface.js.map +1 -0
- package/dist/internal/baseProvider.d.ts +20 -0
- package/dist/internal/baseProvider.d.ts.map +1 -0
- package/dist/internal/baseProvider.js +13 -0
- package/dist/internal/baseProvider.js.map +1 -0
- package/dist/internal/capabilities.d.ts +4 -0
- package/dist/internal/capabilities.d.ts.map +1 -0
- package/dist/internal/capabilities.js +12 -0
- package/dist/internal/capabilities.js.map +1 -0
- package/dist/internal/jsonFile.d.ts +11 -0
- package/dist/internal/jsonFile.d.ts.map +1 -0
- package/dist/internal/jsonFile.js +78 -0
- package/dist/internal/jsonFile.js.map +1 -0
- package/dist/internal/openAiCompatibleProvider.d.ts +44 -0
- package/dist/internal/openAiCompatibleProvider.d.ts.map +1 -0
- package/dist/internal/openAiCompatibleProvider.js +93 -0
- package/dist/internal/openAiCompatibleProvider.js.map +1 -0
- package/dist/internal/openAiStream.d.ts +13 -0
- package/dist/internal/openAiStream.d.ts.map +1 -0
- package/dist/internal/openAiStream.js +85 -0
- package/dist/internal/openAiStream.js.map +1 -0
- package/dist/internal/shared.d.ts +79 -0
- package/dist/internal/shared.d.ts.map +1 -0
- package/dist/internal/shared.js +250 -0
- package/dist/internal/shared.js.map +1 -0
- package/dist/internal/withRetry.d.ts +25 -0
- package/dist/internal/withRetry.d.ts.map +1 -0
- package/dist/internal/withRetry.js +46 -0
- package/dist/internal/withRetry.js.map +1 -0
- package/dist/providers/anthropic.d.ts +32 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +435 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/bedrock.d.ts +67 -0
- package/dist/providers/bedrock.d.ts.map +1 -0
- package/dist/providers/bedrock.js +442 -0
- package/dist/providers/bedrock.js.map +1 -0
- package/dist/providers/cloudflare.d.ts +40 -0
- package/dist/providers/cloudflare.d.ts.map +1 -0
- package/dist/providers/cloudflare.js +115 -0
- package/dist/providers/cloudflare.js.map +1 -0
- package/dist/providers/gemini.d.ts +57 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +359 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/ollama.d.ts +67 -0
- package/dist/providers/ollama.d.ts.map +1 -0
- package/dist/providers/ollama.js +241 -0
- package/dist/providers/ollama.js.map +1 -0
- package/dist/providers/openrouter.d.ts +76 -0
- package/dist/providers/openrouter.d.ts.map +1 -0
- package/dist/providers/openrouter.js +571 -0
- package/dist/providers/openrouter.js.map +1 -0
- package/dist/providers/xai.d.ts +45 -0
- package/dist/providers/xai.d.ts.map +1 -0
- package/dist/providers/xai.js +371 -0
- package/dist/providers/xai.js.map +1 -0
- package/dist/types.d.ts +166 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +60 -0
- package/dist/types.js.map +1 -0
- 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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"}
|