@falai/agent 0.3.10 → 0.3.12
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/README.md +192 -16
- package/dist/adapters/PrismaAdapter.d.ts +115 -0
- package/dist/adapters/PrismaAdapter.d.ts.map +1 -0
- package/dist/adapters/PrismaAdapter.js +331 -0
- package/dist/adapters/PrismaAdapter.js.map +1 -0
- package/dist/adapters/index.d.ts +6 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +5 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/cjs/adapters/PrismaAdapter.d.ts +115 -0
- package/dist/cjs/adapters/PrismaAdapter.d.ts.map +1 -0
- package/dist/cjs/adapters/PrismaAdapter.js +335 -0
- package/dist/cjs/adapters/PrismaAdapter.js.map +1 -0
- package/dist/cjs/adapters/index.d.ts +6 -0
- package/dist/cjs/adapters/index.d.ts.map +1 -0
- package/dist/cjs/adapters/index.js +9 -0
- package/dist/cjs/adapters/index.js.map +1 -0
- package/dist/cjs/core/Agent.d.ts +35 -0
- package/dist/cjs/core/Agent.d.ts.map +1 -1
- package/dist/cjs/core/Agent.js +153 -0
- package/dist/cjs/core/Agent.js.map +1 -1
- package/dist/cjs/core/PersistenceManager.d.ts +77 -0
- package/dist/cjs/core/PersistenceManager.d.ts.map +1 -0
- package/dist/cjs/core/PersistenceManager.js +153 -0
- package/dist/cjs/core/PersistenceManager.js.map +1 -0
- package/dist/cjs/index.d.ts +6 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +8 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/providers/AnthropicProvider.d.ts +43 -0
- package/dist/cjs/providers/AnthropicProvider.d.ts.map +1 -0
- package/dist/cjs/providers/AnthropicProvider.js +328 -0
- package/dist/cjs/providers/AnthropicProvider.js.map +1 -0
- package/dist/cjs/providers/GeminiProvider.d.ts +4 -1
- package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/cjs/providers/GeminiProvider.js +96 -0
- package/dist/cjs/providers/GeminiProvider.js.map +1 -1
- package/dist/cjs/providers/OpenAIProvider.d.ts +4 -1
- package/dist/cjs/providers/OpenAIProvider.d.ts.map +1 -1
- package/dist/cjs/providers/OpenAIProvider.js +115 -0
- package/dist/cjs/providers/OpenAIProvider.js.map +1 -1
- package/dist/cjs/providers/OpenRouterProvider.d.ts +4 -1
- package/dist/cjs/providers/OpenRouterProvider.d.ts.map +1 -1
- package/dist/cjs/providers/OpenRouterProvider.js +115 -0
- package/dist/cjs/providers/OpenRouterProvider.js.map +1 -1
- package/dist/cjs/providers/index.d.ts +13 -0
- package/dist/cjs/providers/index.d.ts.map +1 -0
- package/dist/cjs/providers/index.js +16 -0
- package/dist/cjs/providers/index.js.map +1 -0
- package/dist/cjs/types/agent.d.ts +3 -0
- package/dist/cjs/types/agent.d.ts.map +1 -1
- package/dist/cjs/types/agent.js.map +1 -1
- package/dist/cjs/types/ai.d.ts +28 -0
- package/dist/cjs/types/ai.d.ts.map +1 -1
- package/dist/cjs/types/index.d.ts +1 -0
- package/dist/cjs/types/index.d.ts.map +1 -1
- package/dist/cjs/types/persistence.d.ts +194 -0
- package/dist/cjs/types/persistence.d.ts.map +1 -0
- package/dist/cjs/types/persistence.js +7 -0
- package/dist/cjs/types/persistence.js.map +1 -0
- package/dist/core/Agent.d.ts +35 -0
- package/dist/core/Agent.d.ts.map +1 -1
- package/dist/core/Agent.js +153 -0
- package/dist/core/Agent.js.map +1 -1
- package/dist/core/PersistenceManager.d.ts +77 -0
- package/dist/core/PersistenceManager.d.ts.map +1 -0
- package/dist/core/PersistenceManager.js +149 -0
- package/dist/core/PersistenceManager.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/providers/AnthropicProvider.d.ts +43 -0
- package/dist/providers/AnthropicProvider.d.ts.map +1 -0
- package/dist/providers/AnthropicProvider.js +321 -0
- package/dist/providers/AnthropicProvider.js.map +1 -0
- package/dist/providers/GeminiProvider.d.ts +4 -1
- package/dist/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/providers/GeminiProvider.js +96 -0
- package/dist/providers/GeminiProvider.js.map +1 -1
- package/dist/providers/OpenAIProvider.d.ts +4 -1
- package/dist/providers/OpenAIProvider.d.ts.map +1 -1
- package/dist/providers/OpenAIProvider.js +115 -0
- package/dist/providers/OpenAIProvider.js.map +1 -1
- package/dist/providers/OpenRouterProvider.d.ts +4 -1
- package/dist/providers/OpenRouterProvider.d.ts.map +1 -1
- package/dist/providers/OpenRouterProvider.js +115 -0
- package/dist/providers/OpenRouterProvider.js.map +1 -1
- package/dist/providers/index.d.ts +13 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +9 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/types/agent.d.ts +3 -0
- package/dist/types/agent.d.ts.map +1 -1
- package/dist/types/agent.js.map +1 -1
- package/dist/types/ai.d.ts +28 -0
- package/dist/types/ai.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/persistence.d.ts +194 -0
- package/dist/types/persistence.d.ts.map +1 -0
- package/dist/types/persistence.js +6 -0
- package/dist/types/persistence.js.map +1 -0
- package/docs/API_REFERENCE.md +260 -2
- package/docs/PERSISTENCE.md +419 -0
- package/docs/PROVIDERS.md +139 -2
- package/examples/business-onboarding.ts +5 -4
- package/examples/declarative-agent.ts +1 -1
- package/examples/domain-scoping.ts +5 -4
- package/examples/healthcare-agent.ts +4 -4
- package/examples/openai-agent.ts +6 -4
- package/examples/prisma-persistence.ts +313 -0
- package/examples/prisma-schema.example.prisma +74 -0
- package/examples/rules-prohibitions.ts +4 -4
- package/examples/streaming-agent.ts +371 -0
- package/examples/travel-agent.ts +7 -4
- package/package.json +10 -1
- package/src/adapters/PrismaAdapter.ts +510 -0
- package/src/adapters/index.ts +10 -0
- package/src/core/Agent.ts +205 -0
- package/src/core/PersistenceManager.ts +222 -0
- package/src/index.ts +23 -0
- package/src/providers/AnthropicProvider.ts +467 -0
- package/src/providers/GeminiProvider.ts +135 -0
- package/src/providers/OpenAIProvider.ts +157 -0
- package/src/providers/OpenRouterProvider.ts +157 -0
- package/src/providers/index.ts +16 -0
- package/src/types/agent.ts +3 -0
- package/src/types/ai.ts +32 -0
- package/src/types/index.ts +14 -0
- package/src/types/persistence.ts +234 -0
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Anthropic (Claude) provider implementation with retry and backup models
|
|
4
|
+
*/
|
|
5
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.AnthropicProvider = void 0;
|
|
10
|
+
const sdk_1 = __importDefault(require("@anthropic-ai/sdk"));
|
|
11
|
+
const retry_1 = require("../utils/retry");
|
|
12
|
+
const DEFAULT_RETRY_CONFIG = {
|
|
13
|
+
timeout: 60000,
|
|
14
|
+
retries: 3,
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Type guard to check if error is ErrorWithStatus
|
|
18
|
+
*/
|
|
19
|
+
function isErrorWithStatus(error) {
|
|
20
|
+
return (typeof error === "object" &&
|
|
21
|
+
error !== null &&
|
|
22
|
+
("status" in error || "code" in error || "message" in error));
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Safely extract error message
|
|
26
|
+
*/
|
|
27
|
+
function getErrorMessage(error) {
|
|
28
|
+
if (error instanceof Error) {
|
|
29
|
+
return error.message;
|
|
30
|
+
}
|
|
31
|
+
if (isErrorWithStatus(error) && error.message) {
|
|
32
|
+
return error.message;
|
|
33
|
+
}
|
|
34
|
+
return String(error);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Determines if an error should trigger backup model usage
|
|
38
|
+
*/
|
|
39
|
+
const shouldUseBackupModel = (error) => {
|
|
40
|
+
if (!isErrorWithStatus(error)) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
// Server errors
|
|
44
|
+
if (error.status === 500 || error.status === 503 || error.status === 529) {
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
// Rate limiting
|
|
48
|
+
if (error.status === 429) {
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
// Model overloaded or unavailable
|
|
52
|
+
if (error.type === "overloaded_error" ||
|
|
53
|
+
error.type === "api_error" ||
|
|
54
|
+
error.code === "overloaded") {
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
const message = getErrorMessage(error);
|
|
58
|
+
if (message.includes("overloaded") ||
|
|
59
|
+
message.includes("unavailable") ||
|
|
60
|
+
message.includes("internal error") ||
|
|
61
|
+
message.includes("Internal error")) {
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
return false;
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* Anthropic provider implementation with backup models and retry logic
|
|
68
|
+
*/
|
|
69
|
+
class AnthropicProvider {
|
|
70
|
+
constructor(options) {
|
|
71
|
+
this.name = "anthropic";
|
|
72
|
+
const { apiKey, model, backupModels = [], config, retryConfig } = options;
|
|
73
|
+
if (!apiKey) {
|
|
74
|
+
throw new Error("Anthropic API key is required");
|
|
75
|
+
}
|
|
76
|
+
if (!model) {
|
|
77
|
+
throw new Error("Model is required. Example: 'claude-sonnet-4-5'");
|
|
78
|
+
}
|
|
79
|
+
this.client = new sdk_1.default({
|
|
80
|
+
apiKey,
|
|
81
|
+
});
|
|
82
|
+
this.primaryModel = model;
|
|
83
|
+
this.backupModels = backupModels;
|
|
84
|
+
this.config = config;
|
|
85
|
+
this.retryConfig = {
|
|
86
|
+
timeout: retryConfig?.timeout || DEFAULT_RETRY_CONFIG.timeout,
|
|
87
|
+
retries: retryConfig?.retries || DEFAULT_RETRY_CONFIG.retries,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
async generateMessage(input) {
|
|
91
|
+
return this.generateWithBackup(input);
|
|
92
|
+
}
|
|
93
|
+
async *generateMessageStream(input) {
|
|
94
|
+
yield* this.generateStreamWithBackup(input);
|
|
95
|
+
}
|
|
96
|
+
async generateWithBackup(input) {
|
|
97
|
+
// Try primary model first
|
|
98
|
+
try {
|
|
99
|
+
return await this.generateWithModel(this.primaryModel, input);
|
|
100
|
+
}
|
|
101
|
+
catch (primaryError) {
|
|
102
|
+
const primaryErrMsg = getErrorMessage(primaryError);
|
|
103
|
+
console.warn(`[ANTHROPIC] Primary model ${this.primaryModel} failed: ${primaryErrMsg}`);
|
|
104
|
+
if (!shouldUseBackupModel(primaryError)) {
|
|
105
|
+
throw primaryError;
|
|
106
|
+
}
|
|
107
|
+
console.log(`[ANTHROPIC] Trying backup models`);
|
|
108
|
+
let lastBackupError = primaryError;
|
|
109
|
+
for (let i = 0; i < this.backupModels.length; i++) {
|
|
110
|
+
const backupModel = this.backupModels[i];
|
|
111
|
+
console.log(`[ANTHROPIC] Trying backup model ${i + 1}/${this.backupModels.length}: ${backupModel}`);
|
|
112
|
+
try {
|
|
113
|
+
const result = await this.generateWithModel(backupModel, input);
|
|
114
|
+
console.log(`[ANTHROPIC] Backup model ${backupModel} succeeded`);
|
|
115
|
+
return result;
|
|
116
|
+
}
|
|
117
|
+
catch (backupError) {
|
|
118
|
+
const backupErrMsg = getErrorMessage(backupError);
|
|
119
|
+
console.warn(`[ANTHROPIC] Backup model ${backupModel} failed: ${backupErrMsg}`);
|
|
120
|
+
lastBackupError = backupError;
|
|
121
|
+
if (!shouldUseBackupModel(backupError) &&
|
|
122
|
+
i < this.backupModels.length - 1) {
|
|
123
|
+
console.log(`[ANTHROPIC] Backup model error doesn't qualify for further attempts`);
|
|
124
|
+
break;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
const lastBackupErrMsg = getErrorMessage(lastBackupError);
|
|
129
|
+
console.error(`[ANTHROPIC] All models failed. Primary: ${primaryErrMsg}, Last backup: ${lastBackupErrMsg}`);
|
|
130
|
+
throw lastBackupError;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
async generateWithModel(model, input) {
|
|
134
|
+
const operation = async () => {
|
|
135
|
+
// Anthropic requires max_tokens to be specified
|
|
136
|
+
const maxTokens = input.parameters?.maxOutputTokens || 4096;
|
|
137
|
+
const params = {
|
|
138
|
+
model,
|
|
139
|
+
max_tokens: maxTokens,
|
|
140
|
+
messages: [
|
|
141
|
+
{
|
|
142
|
+
role: "user",
|
|
143
|
+
content: input.prompt,
|
|
144
|
+
},
|
|
145
|
+
],
|
|
146
|
+
...this.config,
|
|
147
|
+
};
|
|
148
|
+
// Handle JSON mode if requested
|
|
149
|
+
// Note: Anthropic doesn't have a native JSON mode like OpenAI,
|
|
150
|
+
// but we can add it to the system prompt
|
|
151
|
+
if (input.parameters?.jsonMode) {
|
|
152
|
+
// Add system message requesting JSON output
|
|
153
|
+
const systemPrompt = "You must respond with valid JSON only. Do not include any text outside the JSON structure.";
|
|
154
|
+
// Merge with existing system if present
|
|
155
|
+
if (typeof this.config?.system === "string") {
|
|
156
|
+
params.system = `${this.config.system}\n\n${systemPrompt}`;
|
|
157
|
+
}
|
|
158
|
+
else if (Array.isArray(this.config?.system)) {
|
|
159
|
+
params.system = [
|
|
160
|
+
...this.config.system,
|
|
161
|
+
{
|
|
162
|
+
type: "text",
|
|
163
|
+
text: systemPrompt,
|
|
164
|
+
},
|
|
165
|
+
];
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
params.system = systemPrompt;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
const response = await this.client.messages.create(params);
|
|
172
|
+
// Extract text from response
|
|
173
|
+
const textContent = response.content.find((block) => block.type === "text");
|
|
174
|
+
const message = textContent?.type === "text" ? textContent.text : "";
|
|
175
|
+
if (!message) {
|
|
176
|
+
throw new Error("No response from Anthropic");
|
|
177
|
+
}
|
|
178
|
+
// Parse JSON response if JSON mode was enabled
|
|
179
|
+
let structured;
|
|
180
|
+
if (input.parameters?.jsonMode) {
|
|
181
|
+
try {
|
|
182
|
+
structured = JSON.parse(message);
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
console.warn("[ANTHROPIC] Failed to parse JSON response:", error);
|
|
186
|
+
// Fall back to treating the message as plain text
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return {
|
|
190
|
+
message,
|
|
191
|
+
metadata: {
|
|
192
|
+
model: response.model,
|
|
193
|
+
stopReason: response.stop_reason,
|
|
194
|
+
tokensUsed: response.usage.input_tokens + response.usage.output_tokens,
|
|
195
|
+
promptTokens: response.usage.input_tokens,
|
|
196
|
+
completionTokens: response.usage.output_tokens,
|
|
197
|
+
},
|
|
198
|
+
structured,
|
|
199
|
+
};
|
|
200
|
+
};
|
|
201
|
+
return (0, retry_1.withTimeoutAndRetry)(operation, this.retryConfig.timeout, this.retryConfig.retries, `Anthropic ${model}`);
|
|
202
|
+
}
|
|
203
|
+
async *generateStreamWithBackup(input) {
|
|
204
|
+
// Try primary model first
|
|
205
|
+
try {
|
|
206
|
+
yield* this.generateStreamWithModel(this.primaryModel, input);
|
|
207
|
+
}
|
|
208
|
+
catch (primaryError) {
|
|
209
|
+
const primaryErrMsg = getErrorMessage(primaryError);
|
|
210
|
+
console.warn(`[ANTHROPIC] Primary model ${this.primaryModel} failed: ${primaryErrMsg}`);
|
|
211
|
+
if (!shouldUseBackupModel(primaryError)) {
|
|
212
|
+
throw primaryError;
|
|
213
|
+
}
|
|
214
|
+
console.log(`[ANTHROPIC] Trying backup models for streaming`);
|
|
215
|
+
let lastBackupError = primaryError;
|
|
216
|
+
for (let i = 0; i < this.backupModels.length; i++) {
|
|
217
|
+
const backupModel = this.backupModels[i];
|
|
218
|
+
console.log(`[ANTHROPIC] Trying backup model ${i + 1}/${this.backupModels.length}: ${backupModel}`);
|
|
219
|
+
try {
|
|
220
|
+
yield* this.generateStreamWithModel(backupModel, input);
|
|
221
|
+
console.log(`[ANTHROPIC] Backup model ${backupModel} succeeded`);
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
catch (backupError) {
|
|
225
|
+
const backupErrMsg = getErrorMessage(backupError);
|
|
226
|
+
console.warn(`[ANTHROPIC] Backup model ${backupModel} failed: ${backupErrMsg}`);
|
|
227
|
+
lastBackupError = backupError;
|
|
228
|
+
if (!shouldUseBackupModel(backupError) &&
|
|
229
|
+
i < this.backupModels.length - 1) {
|
|
230
|
+
console.log(`[ANTHROPIC] Backup model error doesn't qualify for further attempts`);
|
|
231
|
+
break;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
const lastBackupErrMsg = getErrorMessage(lastBackupError);
|
|
236
|
+
console.error(`[ANTHROPIC] All models failed. Primary: ${primaryErrMsg}, Last backup: ${lastBackupErrMsg}`);
|
|
237
|
+
throw lastBackupError;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
async *generateStreamWithModel(model, input) {
|
|
241
|
+
// Anthropic requires max_tokens to be specified
|
|
242
|
+
const maxTokens = input.parameters?.maxOutputTokens || 4096;
|
|
243
|
+
const params = {
|
|
244
|
+
model,
|
|
245
|
+
max_tokens: maxTokens,
|
|
246
|
+
messages: [
|
|
247
|
+
{
|
|
248
|
+
role: "user",
|
|
249
|
+
content: input.prompt,
|
|
250
|
+
},
|
|
251
|
+
],
|
|
252
|
+
stream: true,
|
|
253
|
+
...this.config,
|
|
254
|
+
};
|
|
255
|
+
// Handle JSON mode if requested
|
|
256
|
+
if (input.parameters?.jsonMode) {
|
|
257
|
+
const systemPrompt = "You must respond with valid JSON only. Do not include any text outside the JSON structure.";
|
|
258
|
+
if (typeof this.config?.system === "string") {
|
|
259
|
+
params.system = `${this.config.system}\n\n${systemPrompt}`;
|
|
260
|
+
}
|
|
261
|
+
else if (Array.isArray(this.config?.system)) {
|
|
262
|
+
params.system = [
|
|
263
|
+
...this.config.system,
|
|
264
|
+
{
|
|
265
|
+
type: "text",
|
|
266
|
+
text: systemPrompt,
|
|
267
|
+
},
|
|
268
|
+
];
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
params.system = systemPrompt;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
const stream = this.client.messages.stream(params);
|
|
275
|
+
let accumulated = "";
|
|
276
|
+
let currentModel = model;
|
|
277
|
+
let stopReason;
|
|
278
|
+
let inputTokens = 0;
|
|
279
|
+
let outputTokens = 0;
|
|
280
|
+
for await (const chunk of stream) {
|
|
281
|
+
if (chunk.type === "message_start") {
|
|
282
|
+
currentModel = chunk.message.model;
|
|
283
|
+
inputTokens = chunk.message.usage.input_tokens;
|
|
284
|
+
}
|
|
285
|
+
else if (chunk.type === "content_block_delta") {
|
|
286
|
+
if (chunk.delta.type === "text_delta") {
|
|
287
|
+
const delta = chunk.delta.text;
|
|
288
|
+
accumulated += delta;
|
|
289
|
+
yield {
|
|
290
|
+
delta,
|
|
291
|
+
accumulated,
|
|
292
|
+
done: false,
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
else if (chunk.type === "message_delta") {
|
|
297
|
+
stopReason = chunk.delta.stop_reason || undefined;
|
|
298
|
+
outputTokens = chunk.usage.output_tokens;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
// Parse JSON response if JSON mode was enabled
|
|
302
|
+
let structured;
|
|
303
|
+
if (input.parameters?.jsonMode && accumulated) {
|
|
304
|
+
try {
|
|
305
|
+
structured = JSON.parse(accumulated);
|
|
306
|
+
}
|
|
307
|
+
catch (error) {
|
|
308
|
+
console.warn("[ANTHROPIC] Failed to parse JSON response in stream:", error);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
// Yield final chunk
|
|
312
|
+
yield {
|
|
313
|
+
delta: "",
|
|
314
|
+
accumulated,
|
|
315
|
+
done: true,
|
|
316
|
+
metadata: {
|
|
317
|
+
model: currentModel,
|
|
318
|
+
stopReason,
|
|
319
|
+
tokensUsed: inputTokens + outputTokens,
|
|
320
|
+
promptTokens: inputTokens,
|
|
321
|
+
completionTokens: outputTokens,
|
|
322
|
+
},
|
|
323
|
+
structured,
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
exports.AnthropicProvider = AnthropicProvider;
|
|
328
|
+
//# sourceMappingURL=AnthropicProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnthropicProvider.js","sourceRoot":"","sources":["../../../src/providers/AnthropicProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Google Gemini AI provider implementation with retry and backup models
|
|
3
3
|
*/
|
|
4
4
|
import type { GenerateContentConfig } from "@google/genai";
|
|
5
|
-
import type { AiProvider, GenerateMessageInput, GenerateMessageOutput } from "../types/ai";
|
|
5
|
+
import type { AiProvider, GenerateMessageInput, GenerateMessageOutput, GenerateMessageStreamChunk } from "../types/ai";
|
|
6
6
|
/**
|
|
7
7
|
* Configuration options for Gemini provider
|
|
8
8
|
* Uses types from @google/genai package
|
|
@@ -34,7 +34,10 @@ export declare class GeminiProvider implements AiProvider {
|
|
|
34
34
|
private retryConfig;
|
|
35
35
|
constructor(options: GeminiProviderOptions);
|
|
36
36
|
generateMessage<TContext = unknown>(input: GenerateMessageInput<TContext>): Promise<GenerateMessageOutput>;
|
|
37
|
+
generateMessageStream<TContext = unknown>(input: GenerateMessageInput<TContext>): AsyncGenerator<GenerateMessageStreamChunk>;
|
|
37
38
|
private generateWithBackup;
|
|
38
39
|
private generateWithModel;
|
|
40
|
+
private generateStreamWithBackup;
|
|
41
|
+
private generateStreamWithModel;
|
|
39
42
|
}
|
|
40
43
|
//# sourceMappingURL=GeminiProvider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GeminiProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/GeminiProvider.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAEV,qBAAqB,EAEtB,MAAM,eAAe,CAAC;AAGvB,OAAO,KAAK,EACV,UAAU,EACV,oBAAoB,EACpB,qBAAqB,
|
|
1
|
+
{"version":3,"file":"GeminiProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/GeminiProvider.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAEV,qBAAqB,EAEtB,MAAM,eAAe,CAAC;AAGvB,OAAO,KAAK,EACV,UAAU,EACV,oBAAoB,EACpB,qBAAqB,EACrB,0BAA0B,EAE3B,MAAM,aAAa,CAAC;AAQrB;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,qBAAqB;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,KAAK,EAAE,MAAM,CAAC;IACd,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,gFAAgF;IAChF,MAAM,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACxC,0BAA0B;IAC1B,WAAW,CAAC,EAAE;QACZ,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AA8CD;;GAEG;AACH,qBAAa,cAAe,YAAW,UAAU;IAC/C,SAAgB,IAAI,YAAY;IAChC,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,YAAY,CAAW;IAC/B,OAAO,CAAC,MAAM,CAAC,CAAiC;IAChD,OAAO,CAAC,WAAW,CAAuC;gBAE9C,OAAO,EAAE,qBAAqB;IAqBpC,eAAe,CAAC,QAAQ,GAAG,OAAO,EACtC,KAAK,EAAE,oBAAoB,CAAC,QAAQ,CAAC,GACpC,OAAO,CAAC,qBAAqB,CAAC;IAI1B,qBAAqB,CAAC,QAAQ,GAAG,OAAO,EAC7C,KAAK,EAAE,oBAAoB,CAAC,QAAQ,CAAC,GACpC,cAAc,CAAC,0BAA0B,CAAC;YAI/B,kBAAkB;YA2DlB,iBAAiB;YAsDhB,wBAAwB;YA2DxB,uBAAuB;CAoEvC"}
|
|
@@ -60,6 +60,9 @@ class GeminiProvider {
|
|
|
60
60
|
async generateMessage(input) {
|
|
61
61
|
return this.generateWithBackup(input);
|
|
62
62
|
}
|
|
63
|
+
async *generateMessageStream(input) {
|
|
64
|
+
yield* this.generateStreamWithBackup(input);
|
|
65
|
+
}
|
|
63
66
|
async generateWithBackup(input) {
|
|
64
67
|
// Try primary model first
|
|
65
68
|
try {
|
|
@@ -137,6 +140,99 @@ class GeminiProvider {
|
|
|
137
140
|
};
|
|
138
141
|
return (0, retry_1.withTimeoutAndRetry)(operation, this.retryConfig.timeout, this.retryConfig.retries, `Gemini ${model}`);
|
|
139
142
|
}
|
|
143
|
+
async *generateStreamWithBackup(input) {
|
|
144
|
+
// Try primary model first
|
|
145
|
+
try {
|
|
146
|
+
yield* this.generateStreamWithModel(this.primaryModel, input);
|
|
147
|
+
}
|
|
148
|
+
catch (primaryError) {
|
|
149
|
+
const primaryErrMsg = String(primaryError);
|
|
150
|
+
console.warn(`[GEMINI] Primary model ${this.primaryModel} failed: ${primaryErrMsg}`);
|
|
151
|
+
if (!shouldUseBackupModel(primaryError)) {
|
|
152
|
+
throw primaryError;
|
|
153
|
+
}
|
|
154
|
+
console.log(`[GEMINI] Trying backup models for streaming`);
|
|
155
|
+
let lastBackupError = primaryError;
|
|
156
|
+
for (let i = 0; i < this.backupModels.length; i++) {
|
|
157
|
+
const backupModel = this.backupModels[i];
|
|
158
|
+
console.log(`[GEMINI] Trying backup model ${i + 1}/${this.backupModels.length}: ${backupModel}`);
|
|
159
|
+
try {
|
|
160
|
+
yield* this.generateStreamWithModel(backupModel, input);
|
|
161
|
+
console.log(`[GEMINI] Backup model ${backupModel} succeeded`);
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
catch (backupError) {
|
|
165
|
+
const backupErrMsg = String(backupError);
|
|
166
|
+
console.warn(`[GEMINI] Backup model ${backupModel} failed: ${backupErrMsg}`);
|
|
167
|
+
lastBackupError = backupError;
|
|
168
|
+
if (!shouldUseBackupModel(backupError) &&
|
|
169
|
+
i < this.backupModels.length - 1) {
|
|
170
|
+
console.log(`[GEMINI] Backup model error doesn't qualify for further attempts`);
|
|
171
|
+
break;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
const lastBackupErrMsg = String(lastBackupError);
|
|
176
|
+
console.error(`[GEMINI] All models failed. Primary: ${primaryErrMsg}, Last backup: ${lastBackupErrMsg}`);
|
|
177
|
+
throw lastBackupError;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
async *generateStreamWithModel(model, input) {
|
|
181
|
+
// Enable JSON mode if requested
|
|
182
|
+
const configOverride = { ...this.config };
|
|
183
|
+
if (input.parameters?.jsonMode) {
|
|
184
|
+
configOverride.responseMimeType = "application/json";
|
|
185
|
+
}
|
|
186
|
+
const stream = await this.genAI.models.generateContentStream({
|
|
187
|
+
model,
|
|
188
|
+
contents: input.prompt,
|
|
189
|
+
config: configOverride,
|
|
190
|
+
});
|
|
191
|
+
let accumulated = "";
|
|
192
|
+
let promptTokenCount = 0;
|
|
193
|
+
let candidatesTokenCount = 0;
|
|
194
|
+
let totalTokenCount = 0;
|
|
195
|
+
for await (const chunk of stream) {
|
|
196
|
+
const delta = chunk.text || "";
|
|
197
|
+
if (delta) {
|
|
198
|
+
accumulated += delta;
|
|
199
|
+
yield {
|
|
200
|
+
delta,
|
|
201
|
+
accumulated,
|
|
202
|
+
done: false,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
// Update token counts if available
|
|
206
|
+
if (chunk.usageMetadata) {
|
|
207
|
+
promptTokenCount = chunk.usageMetadata.promptTokenCount || 0;
|
|
208
|
+
candidatesTokenCount = chunk.usageMetadata.candidatesTokenCount || 0;
|
|
209
|
+
totalTokenCount = chunk.usageMetadata.totalTokenCount || 0;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
// Parse JSON response if JSON mode was enabled
|
|
213
|
+
let structured;
|
|
214
|
+
if (input.parameters?.jsonMode && accumulated) {
|
|
215
|
+
try {
|
|
216
|
+
structured = JSON.parse(accumulated);
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
console.warn("[GEMINI] Failed to parse JSON response in stream:", error);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
// Yield final chunk
|
|
223
|
+
yield {
|
|
224
|
+
delta: "",
|
|
225
|
+
accumulated,
|
|
226
|
+
done: true,
|
|
227
|
+
metadata: {
|
|
228
|
+
model,
|
|
229
|
+
tokensUsed: totalTokenCount,
|
|
230
|
+
promptTokens: promptTokenCount,
|
|
231
|
+
completionTokens: candidatesTokenCount,
|
|
232
|
+
},
|
|
233
|
+
structured,
|
|
234
|
+
};
|
|
235
|
+
}
|
|
140
236
|
}
|
|
141
237
|
exports.GeminiProvider = GeminiProvider;
|
|
142
238
|
//# sourceMappingURL=GeminiProvider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GeminiProvider.js","sourceRoot":"","sources":["../../../src/providers/GeminiProvider.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAOH,yCAA4C;
|
|
1
|
+
{"version":3,"file":"GeminiProvider.js","sourceRoot":"","sources":["../../../src/providers/GeminiProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* OpenAI provider implementation with retry and backup models
|
|
3
3
|
*/
|
|
4
4
|
import type { ChatCompletionCreateParamsNonStreaming } from "openai/resources/chat/completions";
|
|
5
|
-
import type { AiProvider, GenerateMessageInput, GenerateMessageOutput } from "../types/ai";
|
|
5
|
+
import type { AiProvider, GenerateMessageInput, GenerateMessageOutput, GenerateMessageStreamChunk } from "../types/ai";
|
|
6
6
|
/**
|
|
7
7
|
* Configuration options for OpenAI provider
|
|
8
8
|
* Uses types from openai package
|
|
@@ -36,7 +36,10 @@ export declare class OpenAIProvider implements AiProvider {
|
|
|
36
36
|
private retryConfig;
|
|
37
37
|
constructor(options: OpenAIProviderOptions);
|
|
38
38
|
generateMessage<TContext = unknown>(input: GenerateMessageInput<TContext>): Promise<GenerateMessageOutput>;
|
|
39
|
+
generateMessageStream<TContext = unknown>(input: GenerateMessageInput<TContext>): AsyncGenerator<GenerateMessageStreamChunk>;
|
|
39
40
|
private generateWithBackup;
|
|
40
41
|
private generateWithModel;
|
|
42
|
+
private generateStreamWithBackup;
|
|
43
|
+
private generateStreamWithModel;
|
|
41
44
|
}
|
|
42
45
|
//# sourceMappingURL=OpenAIProvider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpenAIProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/OpenAIProvider.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,sCAAsC,EAAE,MAAM,mCAAmC,CAAC;AAEhG,OAAO,KAAK,EACV,UAAU,EACV,oBAAoB,EACpB,qBAAqB,
|
|
1
|
+
{"version":3,"file":"OpenAIProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/OpenAIProvider.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,sCAAsC,EAAE,MAAM,mCAAmC,CAAC;AAEhG,OAAO,KAAK,EACV,UAAU,EACV,oBAAoB,EACpB,qBAAqB,EACrB,0BAA0B,EAE3B,MAAM,aAAa,CAAC;AAQrB;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,qBAAqB;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,2FAA2F;IAC3F,MAAM,CAAC,EAAE,OAAO,CACd,IAAI,CAAC,sCAAsC,EAAE,OAAO,GAAG,UAAU,CAAC,CACnE,CAAC;IACF,0BAA0B;IAC1B,WAAW,CAAC,EAAE;QACZ,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAwED;;GAEG;AACH,qBAAa,cAAe,YAAW,UAAU;IAC/C,SAAgB,IAAI,YAAY;IAChC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,YAAY,CAAW;IAC/B,OAAO,CAAC,MAAM,CAAC,CAEb;IACF,OAAO,CAAC,WAAW,CAAuC;gBAE9C,OAAO,EAAE,qBAAqB;IAiCpC,eAAe,CAAC,QAAQ,GAAG,OAAO,EACtC,KAAK,EAAE,oBAAoB,CAAC,QAAQ,CAAC,GACpC,OAAO,CAAC,qBAAqB,CAAC;IAI1B,qBAAqB,CAAC,QAAQ,GAAG,OAAO,EAC7C,KAAK,EAAE,oBAAoB,CAAC,QAAQ,CAAC,GACpC,cAAc,CAAC,0BAA0B,CAAC;YAI/B,kBAAkB;YA2DlB,iBAAiB;YAmIhB,wBAAwB;YA2DxB,uBAAuB;CA0FvC"}
|
|
@@ -90,6 +90,9 @@ class OpenAIProvider {
|
|
|
90
90
|
async generateMessage(input) {
|
|
91
91
|
return this.generateWithBackup(input);
|
|
92
92
|
}
|
|
93
|
+
async *generateMessageStream(input) {
|
|
94
|
+
yield* this.generateStreamWithBackup(input);
|
|
95
|
+
}
|
|
93
96
|
async generateWithBackup(input) {
|
|
94
97
|
// Try primary model first
|
|
95
98
|
try {
|
|
@@ -237,6 +240,118 @@ class OpenAIProvider {
|
|
|
237
240
|
};
|
|
238
241
|
return (0, retry_1.withTimeoutAndRetry)(operation, this.retryConfig.timeout, this.retryConfig.retries, `OpenAI ${model}`);
|
|
239
242
|
}
|
|
243
|
+
async *generateStreamWithBackup(input) {
|
|
244
|
+
// Try primary model first
|
|
245
|
+
try {
|
|
246
|
+
yield* this.generateStreamWithModel(this.primaryModel, input);
|
|
247
|
+
}
|
|
248
|
+
catch (primaryError) {
|
|
249
|
+
const primaryErrMsg = getErrorMessage(primaryError);
|
|
250
|
+
console.warn(`[OPENAI] Primary model ${this.primaryModel} failed: ${primaryErrMsg}`);
|
|
251
|
+
if (!shouldUseBackupModel(primaryError)) {
|
|
252
|
+
throw primaryError;
|
|
253
|
+
}
|
|
254
|
+
console.log(`[OPENAI] Trying backup models for streaming`);
|
|
255
|
+
let lastBackupError = primaryError;
|
|
256
|
+
for (let i = 0; i < this.backupModels.length; i++) {
|
|
257
|
+
const backupModel = this.backupModels[i];
|
|
258
|
+
console.log(`[OPENAI] Trying backup model ${i + 1}/${this.backupModels.length}: ${backupModel}`);
|
|
259
|
+
try {
|
|
260
|
+
yield* this.generateStreamWithModel(backupModel, input);
|
|
261
|
+
console.log(`[OPENAI] Backup model ${backupModel} succeeded`);
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
catch (backupError) {
|
|
265
|
+
const backupErrMsg = getErrorMessage(backupError);
|
|
266
|
+
console.warn(`[OPENAI] Backup model ${backupModel} failed: ${backupErrMsg}`);
|
|
267
|
+
lastBackupError = backupError;
|
|
268
|
+
if (!shouldUseBackupModel(backupError) &&
|
|
269
|
+
i < this.backupModels.length - 1) {
|
|
270
|
+
console.log(`[OPENAI] Backup model error doesn't qualify for further attempts`);
|
|
271
|
+
break;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
const lastBackupErrMsg = getErrorMessage(lastBackupError);
|
|
276
|
+
console.error(`[OPENAI] All models failed. Primary: ${primaryErrMsg}, Last backup: ${lastBackupErrMsg}`);
|
|
277
|
+
throw lastBackupError;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
async *generateStreamWithModel(model, input) {
|
|
281
|
+
const params = {
|
|
282
|
+
...this.config,
|
|
283
|
+
model,
|
|
284
|
+
messages: [
|
|
285
|
+
{
|
|
286
|
+
role: "user",
|
|
287
|
+
content: input.prompt,
|
|
288
|
+
},
|
|
289
|
+
],
|
|
290
|
+
stream: true,
|
|
291
|
+
};
|
|
292
|
+
// Override with input parameters if provided
|
|
293
|
+
if (input.parameters?.maxOutputTokens !== undefined) {
|
|
294
|
+
params.max_tokens = input.parameters.maxOutputTokens;
|
|
295
|
+
}
|
|
296
|
+
// Use JSON mode if requested
|
|
297
|
+
// Note: OpenAI streaming doesn't support the responses.parse API,
|
|
298
|
+
// so we use response_format with JSON mode instead
|
|
299
|
+
if (input.parameters?.jsonMode) {
|
|
300
|
+
params.response_format = { type: "json_object" };
|
|
301
|
+
}
|
|
302
|
+
const stream = await this.client.chat.completions.create(params);
|
|
303
|
+
let accumulated = "";
|
|
304
|
+
let currentModel = model;
|
|
305
|
+
let finishReason;
|
|
306
|
+
let promptTokens;
|
|
307
|
+
let completionTokens;
|
|
308
|
+
let totalTokens;
|
|
309
|
+
for await (const chunk of stream) {
|
|
310
|
+
currentModel = chunk.model;
|
|
311
|
+
const delta = chunk.choices[0]?.delta?.content || "";
|
|
312
|
+
if (delta) {
|
|
313
|
+
accumulated += delta;
|
|
314
|
+
yield {
|
|
315
|
+
delta,
|
|
316
|
+
accumulated,
|
|
317
|
+
done: false,
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
if (chunk.choices[0]?.finish_reason) {
|
|
321
|
+
finishReason = chunk.choices[0].finish_reason;
|
|
322
|
+
}
|
|
323
|
+
// OpenAI includes usage in the final chunk for some models
|
|
324
|
+
if (chunk.usage) {
|
|
325
|
+
promptTokens = chunk.usage.prompt_tokens;
|
|
326
|
+
completionTokens = chunk.usage.completion_tokens;
|
|
327
|
+
totalTokens = chunk.usage.total_tokens;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
// Parse JSON response if JSON mode was enabled
|
|
331
|
+
let structured;
|
|
332
|
+
if (input.parameters?.jsonMode && accumulated) {
|
|
333
|
+
try {
|
|
334
|
+
structured = JSON.parse(accumulated);
|
|
335
|
+
}
|
|
336
|
+
catch (error) {
|
|
337
|
+
console.warn("[OPENAI] Failed to parse JSON response in stream:", error);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
// Yield final chunk
|
|
341
|
+
yield {
|
|
342
|
+
delta: "",
|
|
343
|
+
accumulated,
|
|
344
|
+
done: true,
|
|
345
|
+
metadata: {
|
|
346
|
+
model: currentModel,
|
|
347
|
+
finishReason,
|
|
348
|
+
tokensUsed: totalTokens,
|
|
349
|
+
promptTokens,
|
|
350
|
+
completionTokens,
|
|
351
|
+
},
|
|
352
|
+
structured,
|
|
353
|
+
};
|
|
354
|
+
}
|
|
240
355
|
}
|
|
241
356
|
exports.OpenAIProvider = OpenAIProvider;
|
|
242
357
|
//# sourceMappingURL=OpenAIProvider.js.map
|