@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,57 @@
|
|
|
1
|
+
import { ChatMessage, ChatRequest, ChatStreamEvent, ProviderError } from "../types.js";
|
|
2
|
+
import { type OpenAIMessageContentPart } from "../internal/shared.js";
|
|
3
|
+
import { OpenAiCompatibleProvider, type OpenAiCompatibleProviderOptions } from "../internal/openAiCompatibleProvider.js";
|
|
4
|
+
import type { ProviderCapabilities } from "../interface.js";
|
|
5
|
+
interface OpenAIMessage {
|
|
6
|
+
role: "user" | "assistant" | "system" | "tool";
|
|
7
|
+
content: string | OpenAIMessageContentPart[];
|
|
8
|
+
tool_calls?: Array<{
|
|
9
|
+
id: string;
|
|
10
|
+
type: "function";
|
|
11
|
+
function: {
|
|
12
|
+
name: string;
|
|
13
|
+
arguments: string;
|
|
14
|
+
};
|
|
15
|
+
extra_content?: {
|
|
16
|
+
google?: {
|
|
17
|
+
thought_signature?: string;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
}>;
|
|
21
|
+
tool_call_id?: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Gemini implementation of LLMProvider using Google's OpenAI-compatible API.
|
|
25
|
+
*/
|
|
26
|
+
export declare class GeminiProvider extends OpenAiCompatibleProvider {
|
|
27
|
+
readonly name = "gemini";
|
|
28
|
+
private readonly model;
|
|
29
|
+
private readonly apiKey;
|
|
30
|
+
private readonly retryConfig?;
|
|
31
|
+
private readonly onDiagnosticEvent?;
|
|
32
|
+
private streamContentBuffer;
|
|
33
|
+
constructor(options: OpenAiCompatibleProviderOptions);
|
|
34
|
+
getCapabilities(): ProviderCapabilities;
|
|
35
|
+
protected chatMessageToOpenAIMessage(msg: ChatMessage): OpenAIMessage;
|
|
36
|
+
protected translateError(error: unknown, response?: Response, _responseBody?: string): ProviderError;
|
|
37
|
+
private mapFinishReason;
|
|
38
|
+
private extractThoughtSignature;
|
|
39
|
+
private accumulateGeminiThoughtSignature;
|
|
40
|
+
private processGeminiToolCallsDelta;
|
|
41
|
+
private normalizeRepeatedGeminiToolName;
|
|
42
|
+
private buildGeminiToolCallsEvent;
|
|
43
|
+
private extractGeminiThinkingText;
|
|
44
|
+
private cleanGeminiThinkingText;
|
|
45
|
+
private resetGeminiStreamState;
|
|
46
|
+
private processGeminiStreamingContent;
|
|
47
|
+
private flushGeminiStreamContentBuffer;
|
|
48
|
+
private extractGeminiAssistantText;
|
|
49
|
+
private extractGeminiContentText;
|
|
50
|
+
private parseGeminiStreamChunk;
|
|
51
|
+
private createGeminiStreamReader;
|
|
52
|
+
private buildGeminiRequestBody;
|
|
53
|
+
private fetchGeminiStream;
|
|
54
|
+
streamChat(request: ChatRequest): AsyncIterable<ChatStreamEvent>;
|
|
55
|
+
}
|
|
56
|
+
export {};
|
|
57
|
+
//# sourceMappingURL=gemini.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/providers/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,WAAW,EACX,eAAe,EAGf,aAAa,EACd,MAAM,aAAa,CAAC;AAErB,OAAO,EAUL,KAAK,wBAAwB,EAC9B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,wBAAwB,EACxB,KAAK,+BAA+B,EACrC,MAAM,yCAAyC,CAAC;AACjD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAS5D,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC/C,OAAO,EAAE,MAAM,GAAG,wBAAwB,EAAE,CAAC;IAC7C,UAAU,CAAC,EAAE,KAAK,CAAC;QACjB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,UAAU,CAAC;QACjB,QAAQ,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,CAAC;QAC9C,aAAa,CAAC,EAAE;YACd,MAAM,CAAC,EAAE;gBACP,iBAAiB,CAAC,EAAE,MAAM,CAAC;aAC5B,CAAC;SACH,CAAC;KACH,CAAC,CAAC;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA+DD;;GAEG;AACH,qBAAa,cAAe,SAAQ,wBAAwB;IAC1D,QAAQ,CAAC,IAAI,YAAY;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAG3B;IACF,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAA6B;IAChE,OAAO,CAAC,mBAAmB,CAAM;gBAErB,OAAO,EAAE,+BAA+B;IAmBpD,eAAe,IAAI,oBAAoB;IASvC,SAAS,CAAC,0BAA0B,CAAC,GAAG,EAAE,WAAW,GAAG,aAAa;IAwBrE,SAAS,CAAC,cAAc,CACtB,KAAK,EAAE,OAAO,EACd,QAAQ,CAAC,EAAE,QAAQ,EACnB,aAAa,CAAC,EAAE,MAAM,GACrB,aAAa;IAWhB,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,uBAAuB;IAY/B,OAAO,CAAC,gCAAgC;IAYxC,OAAO,CAAC,2BAA2B;IAkBnC,OAAO,CAAC,+BAA+B;IAevC,OAAO,CAAC,yBAAyB;IAoBjC,OAAO,CAAC,yBAAyB;IAyCjC,OAAO,CAAC,uBAAuB;IAI/B,OAAO,CAAC,sBAAsB;IAI9B,OAAO,CAAC,6BAA6B;IA4CrC,OAAO,CAAC,8BAA8B;IAkBtC,OAAO,CAAC,0BAA0B;IAmBlC,OAAO,CAAC,wBAAwB;IAahC,OAAO,CAAC,sBAAsB;YAwChB,wBAAwB;IAmBtC,OAAO,CAAC,sBAAsB;YAuBhB,iBAAiB;IA4BxB,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,aAAa,CAAC,eAAe,CAAC;CA2CxE"}
|
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
import { ProviderAuthenticationError, ProviderError, } from "../types.js";
|
|
2
|
+
import { accumulateOpenAIStreamToolCall, applyOpenAIMessageCore, buildOpenAIChatCompletionRequestBody, buildOpenAIStreamToolCalls, createOpenAIMessageWithImages, createOpenAIToolCall, parseJsonMaybe, parseOpenAIStreamToolCallArguments, readSseDataLines, } from "../internal/shared.js";
|
|
3
|
+
import { fetchOpenAiCompatibleStreamReader } from "../internal/openAiStream.js";
|
|
4
|
+
import { OpenAiCompatibleProvider, } from "../internal/openAiCompatibleProvider.js";
|
|
5
|
+
const GEMINI_API_URL = "https://generativelanguage.googleapis.com/v1beta/openai/chat/completions";
|
|
6
|
+
const GEMINI_THOUGHT_TAG_PATTERN = /<\/?thought(?:\s[^>]*)?>/gi;
|
|
7
|
+
const GEMINI_THOUGHT_BLOCK_PATTERN = /<thought(?:\s[^>]*)?>([\s\S]*?)<\/thought>/gi;
|
|
8
|
+
const GEMINI_PARTIAL_THOUGHT_TAG_PATTERN = /<\/?(?:th(?:ought)?)?$/i;
|
|
9
|
+
/**
|
|
10
|
+
* Gemini implementation of LLMProvider using Google's OpenAI-compatible API.
|
|
11
|
+
*/
|
|
12
|
+
export class GeminiProvider extends OpenAiCompatibleProvider {
|
|
13
|
+
constructor(options) {
|
|
14
|
+
super();
|
|
15
|
+
this.name = "gemini";
|
|
16
|
+
this.streamContentBuffer = "";
|
|
17
|
+
const apiKey = options.apiKey ??
|
|
18
|
+
process.env.GEMINI_API_KEY ??
|
|
19
|
+
process.env.GOOGLE_API_KEY ??
|
|
20
|
+
"";
|
|
21
|
+
if (!apiKey || apiKey.trim() === "") {
|
|
22
|
+
throw new ProviderAuthenticationError("Gemini API key is required. Set GEMINI_API_KEY or GOOGLE_API_KEY, or pass apiKey in options.");
|
|
23
|
+
}
|
|
24
|
+
this.model = options.model;
|
|
25
|
+
this.configureCapabilities(options.contextWindowTokens);
|
|
26
|
+
this.apiKey = apiKey;
|
|
27
|
+
this.retryConfig = options.retryConfig;
|
|
28
|
+
this.onDiagnosticEvent = options.onDiagnosticEvent;
|
|
29
|
+
}
|
|
30
|
+
getCapabilities() {
|
|
31
|
+
// Gemini validates assistant tool-call history against thought
|
|
32
|
+
// signatures, so fabricated tool-call rounds are rejected upstream.
|
|
33
|
+
return {
|
|
34
|
+
...super.getCapabilities(),
|
|
35
|
+
supportsSyntheticToolCallHistory: false,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
chatMessageToOpenAIMessage(msg) {
|
|
39
|
+
const out = createOpenAIMessageWithImages(msg);
|
|
40
|
+
applyOpenAIMessageCore(out, msg);
|
|
41
|
+
if (msg.toolCalls && msg.toolCalls.length > 0) {
|
|
42
|
+
out.tool_calls = msg.toolCalls.map((tc) => createOpenAIToolCall(tc, tc.thoughtSignature
|
|
43
|
+
? {
|
|
44
|
+
extra_content: {
|
|
45
|
+
google: {
|
|
46
|
+
thought_signature: tc.thoughtSignature,
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
}
|
|
50
|
+
: undefined));
|
|
51
|
+
}
|
|
52
|
+
return out;
|
|
53
|
+
}
|
|
54
|
+
translateError(error, response, _responseBody) {
|
|
55
|
+
return this.translateStandardOpenAiError(error, response, {
|
|
56
|
+
model: this.model,
|
|
57
|
+
authenticationMessage: "Invalid Gemini API key",
|
|
58
|
+
rateLimitMessage: "Gemini rate limit exceeded",
|
|
59
|
+
serviceErrorMessage: "Gemini service error",
|
|
60
|
+
connectionErrorMessage: "Failed to connect to Gemini API",
|
|
61
|
+
requestFailedMessage: "Gemini request failed",
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
mapFinishReason(finishReason) {
|
|
65
|
+
if (finishReason === "MAX_TOKENS")
|
|
66
|
+
return "max_tokens";
|
|
67
|
+
if (finishReason === "STOP")
|
|
68
|
+
return "end_turn";
|
|
69
|
+
if (finishReason === "TOOL_CALLS")
|
|
70
|
+
return "tool_use";
|
|
71
|
+
if (finishReason === "SAFETY" ||
|
|
72
|
+
finishReason === "RECITATION" ||
|
|
73
|
+
finishReason === "OTHER")
|
|
74
|
+
return "error";
|
|
75
|
+
return "end_turn";
|
|
76
|
+
}
|
|
77
|
+
extractThoughtSignature(toolCall) {
|
|
78
|
+
return (toolCall.extra_content?.google?.thought_signature ??
|
|
79
|
+
toolCall.thought_signature ??
|
|
80
|
+
toolCall.thoughtSignature);
|
|
81
|
+
}
|
|
82
|
+
accumulateGeminiThoughtSignature(toolCall, toolCallsByIndex) {
|
|
83
|
+
const thoughtSignature = this.extractThoughtSignature(toolCall);
|
|
84
|
+
const index = toolCall.index ?? 0;
|
|
85
|
+
const accumulated = toolCallsByIndex.get(index);
|
|
86
|
+
if (accumulated && thoughtSignature && !accumulated.thoughtSignature) {
|
|
87
|
+
accumulated.thoughtSignature = thoughtSignature;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
processGeminiToolCallsDelta(toolCallsDelta, toolCallsByIndex) {
|
|
91
|
+
if (!toolCallsDelta || !Array.isArray(toolCallsDelta)) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
for (const toolCall of toolCallsDelta) {
|
|
95
|
+
accumulateOpenAIStreamToolCall(toolCall, toolCallsByIndex, () => ({
|
|
96
|
+
name: "",
|
|
97
|
+
argsString: "",
|
|
98
|
+
}));
|
|
99
|
+
this.normalizeRepeatedGeminiToolName(toolCall, toolCallsByIndex);
|
|
100
|
+
this.accumulateGeminiThoughtSignature(toolCall, toolCallsByIndex);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
normalizeRepeatedGeminiToolName(toolCall, toolCallsByIndex) {
|
|
104
|
+
const name = toolCall.function?.name;
|
|
105
|
+
if (!name) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
const accumulated = toolCallsByIndex.get(toolCall.index ?? 0);
|
|
109
|
+
if (accumulated?.name === `${name}${name}`) {
|
|
110
|
+
accumulated.name = name;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
buildGeminiToolCallsEvent(toolCallsByIndex) {
|
|
114
|
+
if (toolCallsByIndex.size === 0) {
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
return {
|
|
118
|
+
type: "tool_calls",
|
|
119
|
+
toolCalls: buildOpenAIStreamToolCalls(toolCallsByIndex, (acc) => ({
|
|
120
|
+
id: acc.id,
|
|
121
|
+
thoughtSignature: acc.thoughtSignature,
|
|
122
|
+
function: {
|
|
123
|
+
name: acc.name || "",
|
|
124
|
+
arguments: parseOpenAIStreamToolCallArguments(acc.argsString),
|
|
125
|
+
},
|
|
126
|
+
})),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
extractGeminiThinkingText(delta) {
|
|
130
|
+
const directThinking = [
|
|
131
|
+
delta.reasoning_content,
|
|
132
|
+
delta.reasoning,
|
|
133
|
+
delta.thought,
|
|
134
|
+
delta.thought_summary,
|
|
135
|
+
delta.extra_content?.google?.reasoning_content,
|
|
136
|
+
delta.extra_content?.google?.thought,
|
|
137
|
+
delta.extra_content?.google?.thought_summary,
|
|
138
|
+
delta.extra_content?.google?.thinking,
|
|
139
|
+
]
|
|
140
|
+
.filter((value) => typeof value === "string")
|
|
141
|
+
.join("");
|
|
142
|
+
const reasoningDetails = delta.reasoning_details
|
|
143
|
+
?.map((detail) => {
|
|
144
|
+
if (typeof detail.text === "string") {
|
|
145
|
+
return detail.text;
|
|
146
|
+
}
|
|
147
|
+
if (typeof detail.summary === "string") {
|
|
148
|
+
return detail.summary;
|
|
149
|
+
}
|
|
150
|
+
return "";
|
|
151
|
+
})
|
|
152
|
+
.join("") ?? "";
|
|
153
|
+
const thoughtParts = Array.isArray(delta.content)
|
|
154
|
+
? delta.content
|
|
155
|
+
.filter((part) => part.thought === true)
|
|
156
|
+
.map((part) => part.text ?? "")
|
|
157
|
+
.join("")
|
|
158
|
+
: "";
|
|
159
|
+
return this.cleanGeminiThinkingText(`${directThinking}${reasoningDetails}${thoughtParts}`);
|
|
160
|
+
}
|
|
161
|
+
cleanGeminiThinkingText(text) {
|
|
162
|
+
return text.replace(GEMINI_THOUGHT_TAG_PATTERN, "");
|
|
163
|
+
}
|
|
164
|
+
resetGeminiStreamState() {
|
|
165
|
+
this.streamContentBuffer = "";
|
|
166
|
+
}
|
|
167
|
+
processGeminiStreamingContent(chunk) {
|
|
168
|
+
this.streamContentBuffer += chunk;
|
|
169
|
+
const buffer = this.streamContentBuffer;
|
|
170
|
+
let thinking = "";
|
|
171
|
+
let assistant = "";
|
|
172
|
+
let consumed = 0;
|
|
173
|
+
GEMINI_THOUGHT_BLOCK_PATTERN.lastIndex = 0;
|
|
174
|
+
for (const match of buffer.matchAll(GEMINI_THOUGHT_BLOCK_PATTERN)) {
|
|
175
|
+
if (match.index === undefined) {
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
assistant += buffer.slice(consumed, match.index);
|
|
179
|
+
thinking += match[1] ?? "";
|
|
180
|
+
consumed = match.index + match[0].length;
|
|
181
|
+
}
|
|
182
|
+
const tail = buffer.slice(consumed);
|
|
183
|
+
const openThoughtMatch = tail.match(/<thought(?:\s[^>]*)?>/i);
|
|
184
|
+
if (openThoughtMatch?.index !== undefined) {
|
|
185
|
+
assistant += tail.slice(0, openThoughtMatch.index);
|
|
186
|
+
this.streamContentBuffer = tail.slice(openThoughtMatch.index);
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
const partialTagMatch = tail.match(GEMINI_PARTIAL_THOUGHT_TAG_PATTERN);
|
|
190
|
+
if (partialTagMatch?.index !== undefined) {
|
|
191
|
+
assistant += tail.slice(0, partialTagMatch.index);
|
|
192
|
+
this.streamContentBuffer = tail.slice(partialTagMatch.index);
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
assistant += tail;
|
|
196
|
+
this.streamContentBuffer = "";
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return {
|
|
200
|
+
thinking: this.cleanGeminiThinkingText(thinking),
|
|
201
|
+
assistant: this.cleanGeminiThinkingText(assistant),
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
flushGeminiStreamContentBuffer() {
|
|
205
|
+
if (this.streamContentBuffer.length === 0) {
|
|
206
|
+
return { thinking: "", assistant: "" };
|
|
207
|
+
}
|
|
208
|
+
const tail = this.streamContentBuffer;
|
|
209
|
+
this.streamContentBuffer = "";
|
|
210
|
+
const cleaned = this.cleanGeminiThinkingText(tail);
|
|
211
|
+
if (/<thought/i.test(tail)) {
|
|
212
|
+
return { thinking: cleaned, assistant: "" };
|
|
213
|
+
}
|
|
214
|
+
return { thinking: "", assistant: cleaned };
|
|
215
|
+
}
|
|
216
|
+
extractGeminiAssistantText(delta) {
|
|
217
|
+
if (typeof delta.content === "string") {
|
|
218
|
+
return "";
|
|
219
|
+
}
|
|
220
|
+
if (!Array.isArray(delta.content)) {
|
|
221
|
+
return "";
|
|
222
|
+
}
|
|
223
|
+
return this.cleanGeminiThinkingText(delta.content
|
|
224
|
+
.filter((part) => part.thought !== true)
|
|
225
|
+
.map((part) => part.text ?? "")
|
|
226
|
+
.join(""));
|
|
227
|
+
}
|
|
228
|
+
extractGeminiContentText(delta) {
|
|
229
|
+
if (typeof delta.content === "string") {
|
|
230
|
+
return this.processGeminiStreamingContent(delta.content);
|
|
231
|
+
}
|
|
232
|
+
return {
|
|
233
|
+
thinking: "",
|
|
234
|
+
assistant: this.extractGeminiAssistantText(delta),
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
parseGeminiStreamChunk(data, toolCallsByIndex) {
|
|
238
|
+
if (data === "[DONE]") {
|
|
239
|
+
return { events: [], done: true };
|
|
240
|
+
}
|
|
241
|
+
const choice = parseJsonMaybe(data)
|
|
242
|
+
?.choices?.[0];
|
|
243
|
+
if (!choice?.delta) {
|
|
244
|
+
return { events: [], done: false };
|
|
245
|
+
}
|
|
246
|
+
const events = [];
|
|
247
|
+
const contentText = this.extractGeminiContentText(choice.delta);
|
|
248
|
+
const thinkingText = this.extractGeminiThinkingText(choice.delta) + contentText.thinking;
|
|
249
|
+
if (thinkingText.length > 0) {
|
|
250
|
+
events.push({ type: "thinking_delta", delta: thinkingText });
|
|
251
|
+
}
|
|
252
|
+
const assistantText = contentText.assistant;
|
|
253
|
+
if (assistantText.length > 0) {
|
|
254
|
+
events.push({ type: "assistant_text", delta: assistantText });
|
|
255
|
+
}
|
|
256
|
+
this.processGeminiToolCallsDelta(choice.delta.tool_calls ?? choice.delta.toolCalls, toolCallsByIndex);
|
|
257
|
+
return {
|
|
258
|
+
events,
|
|
259
|
+
stopReason: choice.finish_reason
|
|
260
|
+
? this.mapFinishReason(choice.finish_reason)
|
|
261
|
+
: undefined,
|
|
262
|
+
done: false,
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
async createGeminiStreamReader(request) {
|
|
266
|
+
const body = this.buildGeminiRequestBody(request);
|
|
267
|
+
return fetchOpenAiCompatibleStreamReader({
|
|
268
|
+
body,
|
|
269
|
+
signal: request.signal,
|
|
270
|
+
fetchStream: (streamBody, signal) => this.fetchGeminiStream(streamBody, signal),
|
|
271
|
+
retryOptions: this.buildRetryOptions(request, this.model, this.retryConfig, this.onDiagnosticEvent),
|
|
272
|
+
translateError: (error) => this.translateError(error),
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
buildGeminiRequestBody(request) {
|
|
276
|
+
const effectiveModel = request.model || this.model;
|
|
277
|
+
return buildOpenAIChatCompletionRequestBody({
|
|
278
|
+
request,
|
|
279
|
+
model: effectiveModel,
|
|
280
|
+
mapMessage: (msg) => this.chatMessageToOpenAIMessage(msg),
|
|
281
|
+
mapTool: (tool) => this.chatToolToOpenAITool(tool),
|
|
282
|
+
extra: (body) => {
|
|
283
|
+
if (request.requestReasoning) {
|
|
284
|
+
body.extra_body = {
|
|
285
|
+
google: {
|
|
286
|
+
thinking_config: {
|
|
287
|
+
include_thoughts: true,
|
|
288
|
+
},
|
|
289
|
+
},
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
},
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
async fetchGeminiStream(body, signal) {
|
|
296
|
+
const res = await fetch(GEMINI_API_URL, {
|
|
297
|
+
method: "POST",
|
|
298
|
+
headers: {
|
|
299
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
300
|
+
"Content-Type": "application/json",
|
|
301
|
+
},
|
|
302
|
+
body: JSON.stringify(body),
|
|
303
|
+
signal,
|
|
304
|
+
});
|
|
305
|
+
if (!res.ok) {
|
|
306
|
+
let errorBody = "";
|
|
307
|
+
try {
|
|
308
|
+
errorBody = await res.text();
|
|
309
|
+
}
|
|
310
|
+
catch {
|
|
311
|
+
/* ignore read failures */
|
|
312
|
+
}
|
|
313
|
+
throw this.translateError(new Error(errorBody || `HTTP ${res.status}`), res);
|
|
314
|
+
}
|
|
315
|
+
return res;
|
|
316
|
+
}
|
|
317
|
+
async *streamChat(request) {
|
|
318
|
+
try {
|
|
319
|
+
this.resetGeminiStreamState();
|
|
320
|
+
const reader = await this.createGeminiStreamReader(request);
|
|
321
|
+
const toolCallsByIndex = new Map();
|
|
322
|
+
let stopReason = "end_turn";
|
|
323
|
+
for await (const data of readSseDataLines(reader)) {
|
|
324
|
+
const result = this.parseGeminiStreamChunk(data, toolCallsByIndex);
|
|
325
|
+
if (result.stopReason) {
|
|
326
|
+
stopReason = result.stopReason;
|
|
327
|
+
}
|
|
328
|
+
yield* result.events;
|
|
329
|
+
if (result.done) {
|
|
330
|
+
break;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
const flushedContent = this.flushGeminiStreamContentBuffer();
|
|
334
|
+
if (flushedContent.thinking.length > 0) {
|
|
335
|
+
yield {
|
|
336
|
+
type: "thinking_delta",
|
|
337
|
+
delta: flushedContent.thinking,
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
if (flushedContent.assistant.length > 0) {
|
|
341
|
+
yield {
|
|
342
|
+
type: "assistant_text",
|
|
343
|
+
delta: flushedContent.assistant,
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
const toolCallsEvent = this.buildGeminiToolCallsEvent(toolCallsByIndex);
|
|
347
|
+
if (toolCallsEvent) {
|
|
348
|
+
yield toolCallsEvent;
|
|
349
|
+
}
|
|
350
|
+
yield { type: "terminal", stopReason };
|
|
351
|
+
}
|
|
352
|
+
catch (error) {
|
|
353
|
+
if (error instanceof ProviderError)
|
|
354
|
+
throw error;
|
|
355
|
+
throw this.translateError(error);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
//# sourceMappingURL=gemini.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/providers/gemini.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { LLMProvider, ProviderCapabilities } from "../interface.js";
|
|
2
|
+
import { ChatRequest, ChatStreamEvent } from "../types.js";
|
|
3
|
+
import type { ProviderDiagnosticListener } from "../diagnostics.js";
|
|
4
|
+
/**
|
|
5
|
+
* Ollama implementation of LLMProvider
|
|
6
|
+
*/
|
|
7
|
+
export declare class OllamaProvider implements LLMProvider {
|
|
8
|
+
readonly name = "ollama";
|
|
9
|
+
private ollama;
|
|
10
|
+
private model;
|
|
11
|
+
private capabilities;
|
|
12
|
+
private retryConfig?;
|
|
13
|
+
private onDiagnosticEvent?;
|
|
14
|
+
constructor(options: {
|
|
15
|
+
model: string;
|
|
16
|
+
contextWindowTokens: number;
|
|
17
|
+
host?: string;
|
|
18
|
+
retryConfig?: {
|
|
19
|
+
maxRetries: number;
|
|
20
|
+
consecutive529Limit: number;
|
|
21
|
+
};
|
|
22
|
+
onDiagnosticEvent?: ProviderDiagnosticListener;
|
|
23
|
+
});
|
|
24
|
+
getCapabilities(): ProviderCapabilities;
|
|
25
|
+
/**
|
|
26
|
+
* Resolve host with smart localhost→host.docker.internal conversion for sandbox mode
|
|
27
|
+
*/
|
|
28
|
+
private resolveHost;
|
|
29
|
+
private isRetryableError;
|
|
30
|
+
private mapOllamaDoneReason;
|
|
31
|
+
private createOllamaMessages;
|
|
32
|
+
private createOllamaTools;
|
|
33
|
+
private createOllamaStream;
|
|
34
|
+
private processOllamaChunk;
|
|
35
|
+
private buildOllamaToolCallsEvent;
|
|
36
|
+
streamChat(request: ChatRequest): AsyncIterable<ChatStreamEvent>;
|
|
37
|
+
/**
|
|
38
|
+
* Expand batched tool results into separate messages for Ollama.
|
|
39
|
+
* Ollama expects each tool result as a separate message, not batched like Bedrock.
|
|
40
|
+
*/
|
|
41
|
+
private expandToolResults;
|
|
42
|
+
/**
|
|
43
|
+
* Translate ChatMessage to Ollama Message format
|
|
44
|
+
*/
|
|
45
|
+
private chatMessageToOllamaMessage;
|
|
46
|
+
/**
|
|
47
|
+
* Translate Ollama Message to ChatMessage
|
|
48
|
+
*/
|
|
49
|
+
private ollamaMessageToChatMessage;
|
|
50
|
+
/**
|
|
51
|
+
* Translate Ollama ToolCall to ChatToolCall
|
|
52
|
+
*/
|
|
53
|
+
private ollamaToolCallToChatToolCall;
|
|
54
|
+
/**
|
|
55
|
+
* Translate ChatTool to Ollama Tool format
|
|
56
|
+
*/
|
|
57
|
+
private chatToolToOllamaTool;
|
|
58
|
+
/**
|
|
59
|
+
* Determine stop reason from Ollama response
|
|
60
|
+
*/
|
|
61
|
+
private getStopReason;
|
|
62
|
+
/**
|
|
63
|
+
* Translate errors to ProviderError types
|
|
64
|
+
*/
|
|
65
|
+
private translateError;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=ollama.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../src/providers/ollama.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEpE,OAAO,EAEL,WAAW,EACX,eAAe,EAQhB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAiEpE;;GAEG;AACH,qBAAa,cAAe,YAAW,WAAW;IAChD,QAAQ,CAAC,IAAI,YAAY;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,WAAW,CAAC,CAAsD;IAC1E,OAAO,CAAC,iBAAiB,CAAC,CAA6B;gBAE3C,OAAO,EAAE;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,mBAAmB,EAAE,MAAM,CAAC;QAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE;YAAE,UAAU,EAAE,MAAM,CAAC;YAAC,mBAAmB,EAAE,MAAM,CAAA;SAAE,CAAC;QAClE,iBAAiB,CAAC,EAAE,0BAA0B,CAAC;KAChD;IAcD,eAAe,IAAI,oBAAoB;IAIvC;;OAEG;IACH,OAAO,CAAC,WAAW;IAoBnB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,oBAAoB;IAM5B,OAAO,CAAC,iBAAiB;YAIX,kBAAkB;IAsBhC,OAAO,CAAC,kBAAkB;IA2B1B,OAAO,CAAC,yBAAyB;IAW1B,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,aAAa,CAAC,eAAe,CAAC;IA8BvE;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAOzB;;OAEG;IACH,OAAO,CAAC,0BAA0B;IA4BlC;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAoBlC;;OAEG;IACH,OAAO,CAAC,4BAA4B;IASpC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAW5B;;OAEG;IACH,OAAO,CAAC,aAAa;IASrB;;OAEG;IACH,OAAO,CAAC,cAAc;CAavB"}
|