@falai/agent 0.1.3 → 0.1.4
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/dist/cjs/constants/index.d.ts +5 -0
- package/dist/cjs/constants/index.d.ts.map +1 -0
- package/dist/cjs/constants/index.js +8 -0
- package/dist/cjs/constants/index.js.map +1 -0
- package/dist/cjs/core/Agent.d.ts +110 -0
- package/dist/cjs/core/Agent.d.ts.map +1 -0
- package/dist/cjs/core/Agent.js +290 -0
- package/dist/cjs/core/Agent.js.map +1 -0
- package/dist/cjs/core/DomainRegistry.d.ts +26 -0
- package/dist/cjs/core/DomainRegistry.d.ts.map +1 -0
- package/dist/cjs/core/DomainRegistry.js +47 -0
- package/dist/cjs/core/DomainRegistry.js.map +1 -0
- package/dist/cjs/core/Events.d.ts +19 -0
- package/dist/cjs/core/Events.d.ts.map +1 -0
- package/dist/cjs/core/Events.js +84 -0
- package/dist/cjs/core/Events.js.map +1 -0
- package/dist/cjs/core/Observation.d.ts +24 -0
- package/dist/cjs/core/Observation.d.ts.map +1 -0
- package/dist/cjs/core/Observation.js +38 -0
- package/dist/cjs/core/Observation.js.map +1 -0
- package/dist/cjs/core/PromptBuilder.d.ts +125 -0
- package/dist/cjs/core/PromptBuilder.d.ts.map +1 -0
- package/dist/cjs/core/PromptBuilder.js +374 -0
- package/dist/cjs/core/PromptBuilder.js.map +1 -0
- package/dist/cjs/core/Route.d.ts +46 -0
- package/dist/cjs/core/Route.d.ts.map +1 -0
- package/dist/cjs/core/Route.js +112 -0
- package/dist/cjs/core/Route.js.map +1 -0
- package/dist/cjs/core/State.d.ts +50 -0
- package/dist/cjs/core/State.d.ts.map +1 -0
- package/dist/cjs/core/State.js +111 -0
- package/dist/cjs/core/State.js.map +1 -0
- package/dist/cjs/core/Tool.d.ts +31 -0
- package/dist/cjs/core/Tool.d.ts.map +1 -0
- package/dist/cjs/core/Tool.js +36 -0
- package/dist/cjs/core/Tool.js.map +1 -0
- package/dist/cjs/core/Transition.d.ts +32 -0
- package/dist/cjs/core/Transition.d.ts.map +1 -0
- package/dist/cjs/core/Transition.js +59 -0
- package/dist/cjs/core/Transition.js.map +1 -0
- package/dist/cjs/index.d.ts +34 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +49 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/providers/GeminiProvider.d.ts +40 -0
- package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -0
- package/dist/cjs/providers/GeminiProvider.js +142 -0
- package/dist/cjs/providers/GeminiProvider.js.map +1 -0
- package/dist/cjs/providers/OpenAIProvider.d.ts +42 -0
- package/dist/cjs/providers/OpenAIProvider.d.ts.map +1 -0
- package/dist/cjs/providers/OpenAIProvider.js +242 -0
- package/dist/cjs/providers/OpenAIProvider.js.map +1 -0
- package/dist/cjs/providers/OpenRouterProvider.d.ts +46 -0
- package/dist/cjs/providers/OpenRouterProvider.d.ts.map +1 -0
- package/dist/cjs/providers/OpenRouterProvider.js +249 -0
- package/dist/cjs/providers/OpenRouterProvider.js.map +1 -0
- package/dist/cjs/types/agent.d.ts +105 -0
- package/dist/cjs/types/agent.d.ts.map +1 -0
- package/dist/cjs/types/agent.js +21 -0
- package/dist/cjs/types/agent.js.map +1 -0
- package/dist/cjs/types/ai.d.ts +102 -0
- package/dist/cjs/types/ai.d.ts.map +1 -0
- package/dist/cjs/types/ai.js +6 -0
- package/dist/cjs/types/ai.js.map +1 -0
- package/dist/cjs/types/history.d.ts +112 -0
- package/dist/cjs/types/history.d.ts.map +1 -0
- package/dist/cjs/types/history.js +37 -0
- package/dist/cjs/types/history.js.map +1 -0
- package/dist/cjs/types/index.d.ts +14 -0
- package/dist/cjs/types/index.d.ts.map +1 -0
- package/dist/cjs/types/index.js +14 -0
- package/dist/cjs/types/index.js.map +1 -0
- package/dist/cjs/types/observation.d.ts +25 -0
- package/dist/cjs/types/observation.d.ts.map +1 -0
- package/dist/cjs/types/observation.js +6 -0
- package/dist/cjs/types/observation.js.map +1 -0
- package/dist/cjs/types/prompt.d.ts +46 -0
- package/dist/cjs/types/prompt.d.ts.map +1 -0
- package/dist/cjs/types/prompt.js +19 -0
- package/dist/cjs/types/prompt.js.map +1 -0
- package/dist/cjs/types/route.d.ts +59 -0
- package/dist/cjs/types/route.d.ts.map +1 -0
- package/dist/cjs/types/route.js +6 -0
- package/dist/cjs/types/route.js.map +1 -0
- package/dist/cjs/types/tool.d.ts +46 -0
- package/dist/cjs/types/tool.d.ts.map +1 -0
- package/dist/cjs/types/tool.js +6 -0
- package/dist/cjs/types/tool.js.map +1 -0
- package/dist/cjs/utils/retry.d.ts +13 -0
- package/dist/cjs/utils/retry.d.ts.map +1 -0
- package/dist/cjs/utils/retry.js +75 -0
- package/dist/cjs/utils/retry.js.map +1 -0
- package/dist/core/Agent.js +10 -11
- package/dist/core/Agent.js.map +1 -1
- package/dist/core/DomainRegistry.js +3 -1
- package/dist/core/DomainRegistry.js.map +1 -1
- package/dist/core/Observation.js +1 -3
- package/dist/core/Observation.js.map +1 -1
- package/dist/core/PromptBuilder.js +2 -3
- package/dist/core/PromptBuilder.js.map +1 -1
- package/dist/core/Route.js +1 -6
- package/dist/core/Route.js.map +1 -1
- package/dist/core/State.js +2 -5
- package/dist/core/State.js.map +1 -1
- package/dist/core/Transition.js +0 -4
- package/dist/core/Transition.js.map +1 -1
- package/dist/providers/GeminiProvider.js +1 -6
- package/dist/providers/GeminiProvider.js.map +1 -1
- package/dist/providers/OpenAIProvider.js +1 -6
- package/dist/providers/OpenAIProvider.js.map +1 -1
- package/dist/providers/OpenRouterProvider.js +1 -6
- package/dist/providers/OpenRouterProvider.js.map +1 -1
- package/package.json +15 -5
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Google Gemini AI provider implementation with retry and backup models
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.GeminiProvider = void 0;
|
|
7
|
+
const genai_1 = require("@google/genai");
|
|
8
|
+
const retry_1 = require("../utils/retry");
|
|
9
|
+
const DEFAULT_RETRY_CONFIG = {
|
|
10
|
+
timeout: 60000,
|
|
11
|
+
retries: 3,
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Determines if an error should trigger backup model usage
|
|
15
|
+
*/
|
|
16
|
+
const shouldUseBackupModel = (error) => {
|
|
17
|
+
const err = error;
|
|
18
|
+
if (err?.status === 500 || err?.code === 500) {
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
const message = err?.message ?? String(error);
|
|
22
|
+
if (message.includes("internal error") ||
|
|
23
|
+
message.includes("Internal error") ||
|
|
24
|
+
message.includes("INTERNAL")) {
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
if (err?.status === 429 ||
|
|
28
|
+
err?.code === 429 ||
|
|
29
|
+
err?.status === 503 ||
|
|
30
|
+
err?.code === 503) {
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
if (message.includes("unavailable") || message.includes("not available")) {
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
return false;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Gemini provider implementation with backup models and retry logic
|
|
40
|
+
*/
|
|
41
|
+
class GeminiProvider {
|
|
42
|
+
constructor(options) {
|
|
43
|
+
this.name = "gemini";
|
|
44
|
+
const { apiKey, model, backupModels = [], config, retryConfig } = options;
|
|
45
|
+
if (!apiKey) {
|
|
46
|
+
throw new Error("Gemini API key is required");
|
|
47
|
+
}
|
|
48
|
+
if (!model) {
|
|
49
|
+
throw new Error("Model is required. Example: 'models/gemini-2.5-pro'");
|
|
50
|
+
}
|
|
51
|
+
this.genAI = new genai_1.GoogleGenAI({ apiKey });
|
|
52
|
+
this.primaryModel = model;
|
|
53
|
+
this.backupModels = backupModels;
|
|
54
|
+
this.config = config;
|
|
55
|
+
this.retryConfig = {
|
|
56
|
+
timeout: retryConfig?.timeout || DEFAULT_RETRY_CONFIG.timeout,
|
|
57
|
+
retries: retryConfig?.retries || DEFAULT_RETRY_CONFIG.retries,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
async generateMessage(input) {
|
|
61
|
+
return this.generateWithBackup(input);
|
|
62
|
+
}
|
|
63
|
+
async generateWithBackup(input) {
|
|
64
|
+
// Try primary model first
|
|
65
|
+
try {
|
|
66
|
+
return await this.generateWithModel(this.primaryModel, input);
|
|
67
|
+
}
|
|
68
|
+
catch (primaryError) {
|
|
69
|
+
const primaryErrMsg = String(primaryError);
|
|
70
|
+
console.warn(`[GEMINI] Primary model ${this.primaryModel} failed: ${primaryErrMsg}`);
|
|
71
|
+
if (!shouldUseBackupModel(primaryError)) {
|
|
72
|
+
throw primaryError;
|
|
73
|
+
}
|
|
74
|
+
console.log(`[GEMINI] Trying backup models`);
|
|
75
|
+
let lastBackupError = primaryError;
|
|
76
|
+
for (let i = 0; i < this.backupModels.length; i++) {
|
|
77
|
+
const backupModel = this.backupModels[i];
|
|
78
|
+
console.log(`[GEMINI] Trying backup model ${i + 1}/${this.backupModels.length}: ${backupModel}`);
|
|
79
|
+
try {
|
|
80
|
+
const result = await this.generateWithModel(backupModel, input);
|
|
81
|
+
console.log(`[GEMINI] Backup model ${backupModel} succeeded`);
|
|
82
|
+
return result;
|
|
83
|
+
}
|
|
84
|
+
catch (backupError) {
|
|
85
|
+
const backupErrMsg = String(backupError);
|
|
86
|
+
console.warn(`[GEMINI] Backup model ${backupModel} failed: ${backupErrMsg}`);
|
|
87
|
+
lastBackupError = backupError;
|
|
88
|
+
if (!shouldUseBackupModel(backupError) &&
|
|
89
|
+
i < this.backupModels.length - 1) {
|
|
90
|
+
console.log(`[GEMINI] Backup model error doesn't qualify for further attempts`);
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
const lastBackupErrMsg = String(lastBackupError);
|
|
96
|
+
console.error(`[GEMINI] All models failed. Primary: ${primaryErrMsg}, Last backup: ${lastBackupErrMsg}`);
|
|
97
|
+
throw lastBackupError;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
async generateWithModel(model, input) {
|
|
101
|
+
const operation = async () => {
|
|
102
|
+
// Enable JSON mode if requested
|
|
103
|
+
const configOverride = { ...this.config };
|
|
104
|
+
if (input.parameters?.jsonMode) {
|
|
105
|
+
configOverride.responseMimeType = "application/json";
|
|
106
|
+
}
|
|
107
|
+
const response = await this.genAI.models.generateContent({
|
|
108
|
+
model,
|
|
109
|
+
contents: input.prompt,
|
|
110
|
+
config: configOverride,
|
|
111
|
+
});
|
|
112
|
+
const message = response.text;
|
|
113
|
+
if (!message) {
|
|
114
|
+
throw new Error("No response from Gemini");
|
|
115
|
+
}
|
|
116
|
+
// Parse JSON response if JSON mode was enabled
|
|
117
|
+
let structured;
|
|
118
|
+
if (input.parameters?.jsonMode) {
|
|
119
|
+
try {
|
|
120
|
+
structured = JSON.parse(message);
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
console.warn("[GEMINI] Failed to parse JSON response:", error);
|
|
124
|
+
// Fall back to treating the message as plain text
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
message,
|
|
129
|
+
metadata: {
|
|
130
|
+
model,
|
|
131
|
+
tokensUsed: response.usageMetadata?.totalTokenCount,
|
|
132
|
+
promptTokens: response.usageMetadata?.promptTokenCount,
|
|
133
|
+
completionTokens: response.usageMetadata?.candidatesTokenCount,
|
|
134
|
+
},
|
|
135
|
+
structured,
|
|
136
|
+
};
|
|
137
|
+
};
|
|
138
|
+
return (0, retry_1.withTimeoutAndRetry)(operation, this.retryConfig.timeout, this.retryConfig.retries, `Gemini ${model}`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
exports.GeminiProvider = GeminiProvider;
|
|
142
|
+
//# sourceMappingURL=GeminiProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GeminiProvider.js","sourceRoot":"","sources":["../../../src/providers/GeminiProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI provider implementation with retry and backup models
|
|
3
|
+
*/
|
|
4
|
+
import type { ChatCompletionCreateParamsNonStreaming } from "openai/resources/chat/completions";
|
|
5
|
+
import type { AiProvider, GenerateMessageInput, GenerateMessageOutput } from "../types/ai";
|
|
6
|
+
/**
|
|
7
|
+
* Configuration options for OpenAI provider
|
|
8
|
+
* Uses types from openai package
|
|
9
|
+
*/
|
|
10
|
+
export interface OpenAIProviderOptions {
|
|
11
|
+
/** OpenAI API key */
|
|
12
|
+
apiKey: string;
|
|
13
|
+
/** Organization ID (optional) */
|
|
14
|
+
organization?: string;
|
|
15
|
+
/** Model to use (required) - e.g., "gpt-5", "gpt-5-mini" */
|
|
16
|
+
model: string;
|
|
17
|
+
/** Backup models to try if primary fails (default: []) */
|
|
18
|
+
backupModels?: string[];
|
|
19
|
+
/** Default parameters - uses ChatCompletionCreateParamsNonStreaming from openai package */
|
|
20
|
+
config?: Partial<Omit<ChatCompletionCreateParamsNonStreaming, "model" | "messages">>;
|
|
21
|
+
/** Retry configuration */
|
|
22
|
+
retryConfig?: {
|
|
23
|
+
timeout?: number;
|
|
24
|
+
retries?: number;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* OpenAI provider implementation with backup models and retry logic
|
|
29
|
+
*/
|
|
30
|
+
export declare class OpenAIProvider implements AiProvider {
|
|
31
|
+
readonly name = "openai";
|
|
32
|
+
private client;
|
|
33
|
+
private primaryModel;
|
|
34
|
+
private backupModels;
|
|
35
|
+
private config?;
|
|
36
|
+
private retryConfig;
|
|
37
|
+
constructor(options: OpenAIProviderOptions);
|
|
38
|
+
generateMessage<TContext = unknown>(input: GenerateMessageInput<TContext>): Promise<GenerateMessageOutput>;
|
|
39
|
+
private generateWithBackup;
|
|
40
|
+
private generateWithModel;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=OpenAIProvider.d.ts.map
|
|
@@ -0,0 +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,EAEtB,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;YAInB,kBAAkB;YA2DlB,iBAAiB;CAkIhC"}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* OpenAI 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.OpenAIProvider = void 0;
|
|
10
|
+
const openai_1 = __importDefault(require("openai"));
|
|
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) {
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
// Rate limiting
|
|
48
|
+
if (error.status === 429) {
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
// Model overloaded or unavailable
|
|
52
|
+
if (error.code === "model_not_found" || error.code === "model_overloaded") {
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
const message = getErrorMessage(error);
|
|
56
|
+
if (message.includes("overloaded") ||
|
|
57
|
+
message.includes("unavailable") ||
|
|
58
|
+
message.includes("internal error") ||
|
|
59
|
+
message.includes("Internal error")) {
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
return false;
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* OpenAI provider implementation with backup models and retry logic
|
|
66
|
+
*/
|
|
67
|
+
class OpenAIProvider {
|
|
68
|
+
constructor(options) {
|
|
69
|
+
this.name = "openai";
|
|
70
|
+
const { apiKey, organization, model, backupModels = [], config, retryConfig, } = options;
|
|
71
|
+
if (!apiKey) {
|
|
72
|
+
throw new Error("OpenAI API key is required");
|
|
73
|
+
}
|
|
74
|
+
if (!model) {
|
|
75
|
+
throw new Error("Model is required. Example: 'gpt-5' or 'gpt-5-mini'");
|
|
76
|
+
}
|
|
77
|
+
// Dynamic import to avoid bundling issues
|
|
78
|
+
this.client = new openai_1.default({
|
|
79
|
+
apiKey,
|
|
80
|
+
organization,
|
|
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 generateWithBackup(input) {
|
|
94
|
+
// Try primary model first
|
|
95
|
+
try {
|
|
96
|
+
return await this.generateWithModel(this.primaryModel, input);
|
|
97
|
+
}
|
|
98
|
+
catch (primaryError) {
|
|
99
|
+
const primaryErrMsg = getErrorMessage(primaryError);
|
|
100
|
+
console.warn(`[OPENAI] Primary model ${this.primaryModel} failed: ${primaryErrMsg}`);
|
|
101
|
+
if (!shouldUseBackupModel(primaryError)) {
|
|
102
|
+
throw primaryError;
|
|
103
|
+
}
|
|
104
|
+
console.log(`[OPENAI] Trying backup models`);
|
|
105
|
+
let lastBackupError = primaryError;
|
|
106
|
+
for (let i = 0; i < this.backupModels.length; i++) {
|
|
107
|
+
const backupModel = this.backupModels[i];
|
|
108
|
+
console.log(`[OPENAI] Trying backup model ${i + 1}/${this.backupModels.length}: ${backupModel}`);
|
|
109
|
+
try {
|
|
110
|
+
const result = await this.generateWithModel(backupModel, input);
|
|
111
|
+
console.log(`[OPENAI] Backup model ${backupModel} succeeded`);
|
|
112
|
+
return result;
|
|
113
|
+
}
|
|
114
|
+
catch (backupError) {
|
|
115
|
+
const backupErrMsg = getErrorMessage(backupError);
|
|
116
|
+
console.warn(`[OPENAI] Backup model ${backupModel} failed: ${backupErrMsg}`);
|
|
117
|
+
lastBackupError = backupError;
|
|
118
|
+
if (!shouldUseBackupModel(backupError) &&
|
|
119
|
+
i < this.backupModels.length - 1) {
|
|
120
|
+
console.log(`[OPENAI] Backup model error doesn't qualify for further attempts`);
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
const lastBackupErrMsg = getErrorMessage(lastBackupError);
|
|
126
|
+
console.error(`[OPENAI] All models failed. Primary: ${primaryErrMsg}, Last backup: ${lastBackupErrMsg}`);
|
|
127
|
+
throw lastBackupError;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
async generateWithModel(model, input) {
|
|
131
|
+
const operation = async () => {
|
|
132
|
+
const params = {
|
|
133
|
+
model,
|
|
134
|
+
messages: [
|
|
135
|
+
{
|
|
136
|
+
role: "user",
|
|
137
|
+
content: input.prompt,
|
|
138
|
+
},
|
|
139
|
+
],
|
|
140
|
+
...this.config,
|
|
141
|
+
};
|
|
142
|
+
// Override with input parameters if provided
|
|
143
|
+
if (input.parameters?.maxOutputTokens !== undefined) {
|
|
144
|
+
params.max_tokens = input.parameters.maxOutputTokens;
|
|
145
|
+
}
|
|
146
|
+
// Use structured output API if JSON mode is enabled
|
|
147
|
+
if (input.parameters?.jsonMode) {
|
|
148
|
+
// Define the JSON schema for agent response
|
|
149
|
+
const agentResponseSchema = {
|
|
150
|
+
type: "object",
|
|
151
|
+
properties: {
|
|
152
|
+
message: {
|
|
153
|
+
type: "string",
|
|
154
|
+
description: "The actual message to send to the user",
|
|
155
|
+
},
|
|
156
|
+
route: {
|
|
157
|
+
type: ["string", "null"],
|
|
158
|
+
description: "The title of the route chosen (or null if no specific route)",
|
|
159
|
+
},
|
|
160
|
+
state: {
|
|
161
|
+
type: ["string", "null"],
|
|
162
|
+
description: "The current state within the route (or null if not in a route)",
|
|
163
|
+
},
|
|
164
|
+
toolCalls: {
|
|
165
|
+
type: "array",
|
|
166
|
+
items: {
|
|
167
|
+
type: "object",
|
|
168
|
+
properties: {
|
|
169
|
+
toolName: {
|
|
170
|
+
type: "string",
|
|
171
|
+
description: "Name of the tool to call",
|
|
172
|
+
},
|
|
173
|
+
arguments: {
|
|
174
|
+
type: "object",
|
|
175
|
+
description: "Arguments to pass to the tool",
|
|
176
|
+
},
|
|
177
|
+
},
|
|
178
|
+
required: ["toolName", "arguments"],
|
|
179
|
+
},
|
|
180
|
+
description: "Tool calls the agent wants to execute",
|
|
181
|
+
},
|
|
182
|
+
reasoning: {
|
|
183
|
+
type: "string",
|
|
184
|
+
description: "Optional: Internal reasoning for this response",
|
|
185
|
+
},
|
|
186
|
+
},
|
|
187
|
+
required: ["message"],
|
|
188
|
+
additionalProperties: false,
|
|
189
|
+
};
|
|
190
|
+
const response = await this.client.responses.parse({
|
|
191
|
+
model,
|
|
192
|
+
instructions: input.prompt,
|
|
193
|
+
input: "",
|
|
194
|
+
reasoning: {
|
|
195
|
+
effort: input.parameters?.reasoning?.effort || "low",
|
|
196
|
+
},
|
|
197
|
+
text: {
|
|
198
|
+
format: {
|
|
199
|
+
type: "json_schema",
|
|
200
|
+
name: "agentResponseSchema",
|
|
201
|
+
schema: agentResponseSchema,
|
|
202
|
+
},
|
|
203
|
+
},
|
|
204
|
+
});
|
|
205
|
+
if (!response.output_parsed) {
|
|
206
|
+
throw new Error("No parsed output returned from OpenAI");
|
|
207
|
+
}
|
|
208
|
+
const structured = response.output_parsed;
|
|
209
|
+
const message = structured.message;
|
|
210
|
+
return {
|
|
211
|
+
message,
|
|
212
|
+
metadata: {
|
|
213
|
+
model: response.model,
|
|
214
|
+
tokensUsed: response.usage?.total_tokens,
|
|
215
|
+
promptTokens: response.usage?.input_tokens,
|
|
216
|
+
completionTokens: response.usage?.output_tokens,
|
|
217
|
+
},
|
|
218
|
+
structured,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
// Fall back to regular chat completions API if JSON mode not enabled
|
|
222
|
+
const response = await this.client.chat.completions.create(params);
|
|
223
|
+
const message = response.choices[0]?.message?.content;
|
|
224
|
+
if (!message) {
|
|
225
|
+
throw new Error("No response from OpenAI");
|
|
226
|
+
}
|
|
227
|
+
return {
|
|
228
|
+
message,
|
|
229
|
+
metadata: {
|
|
230
|
+
model: response.model,
|
|
231
|
+
finishReason: response.choices[0]?.finish_reason,
|
|
232
|
+
tokensUsed: response.usage?.total_tokens,
|
|
233
|
+
promptTokens: response.usage?.prompt_tokens,
|
|
234
|
+
completionTokens: response.usage?.completion_tokens,
|
|
235
|
+
},
|
|
236
|
+
};
|
|
237
|
+
};
|
|
238
|
+
return (0, retry_1.withTimeoutAndRetry)(operation, this.retryConfig.timeout, this.retryConfig.retries, `OpenAI ${model}`);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
exports.OpenAIProvider = OpenAIProvider;
|
|
242
|
+
//# sourceMappingURL=OpenAIProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OpenAIProvider.js","sourceRoot":"","sources":["../../../src/providers/OpenAIProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenRouter provider implementation
|
|
3
|
+
* OpenRouter provides access to multiple AI models through a unified OpenAI-compatible API
|
|
4
|
+
*/
|
|
5
|
+
import type { ChatCompletionCreateParamsNonStreaming } from "openai/resources/chat/completions";
|
|
6
|
+
import type { AiProvider, GenerateMessageInput, GenerateMessageOutput } from "../types/ai";
|
|
7
|
+
/**
|
|
8
|
+
* Configuration options for OpenRouter provider
|
|
9
|
+
* Uses types from openai package (OpenRouter is OpenAI-compatible)
|
|
10
|
+
*/
|
|
11
|
+
export interface OpenRouterProviderOptions {
|
|
12
|
+
/** OpenRouter API key */
|
|
13
|
+
apiKey: string;
|
|
14
|
+
/** Model to use (required) - see https://openrouter.ai/models */
|
|
15
|
+
model: string;
|
|
16
|
+
/** Backup models to try if primary fails (default: []) */
|
|
17
|
+
backupModels?: string[];
|
|
18
|
+
/** Optional site URL for OpenRouter rankings */
|
|
19
|
+
siteUrl?: string;
|
|
20
|
+
/** Optional app name for OpenRouter rankings */
|
|
21
|
+
siteName?: string;
|
|
22
|
+
/** Default parameters - uses ChatCompletionCreateParamsNonStreaming from openai package */
|
|
23
|
+
config?: Partial<Omit<ChatCompletionCreateParamsNonStreaming, "model" | "messages">>;
|
|
24
|
+
/** Retry configuration */
|
|
25
|
+
retryConfig?: {
|
|
26
|
+
timeout?: number;
|
|
27
|
+
retries?: number;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* OpenRouter provider implementation
|
|
32
|
+
* Provides access to multiple AI models through OpenRouter's unified API
|
|
33
|
+
*/
|
|
34
|
+
export declare class OpenRouterProvider implements AiProvider {
|
|
35
|
+
readonly name = "openrouter";
|
|
36
|
+
private client;
|
|
37
|
+
private primaryModel;
|
|
38
|
+
private backupModels;
|
|
39
|
+
private config?;
|
|
40
|
+
private retryConfig;
|
|
41
|
+
constructor(options: OpenRouterProviderOptions);
|
|
42
|
+
generateMessage<TContext = unknown>(input: GenerateMessageInput<TContext>): Promise<GenerateMessageOutput>;
|
|
43
|
+
private generateWithBackup;
|
|
44
|
+
private generateWithModel;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=OpenRouterProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OpenRouterProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/OpenRouterProvider.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,sCAAsC,EAAE,MAAM,mCAAmC,CAAC;AAEhG,OAAO,KAAK,EACV,UAAU,EAEV,oBAAoB,EACpB,qBAAqB,EACtB,MAAM,aAAa,CAAC;AAQrB;;;GAGG;AACH,MAAM,WAAW,yBAAyB;IACxC,yBAAyB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,KAAK,EAAE,MAAM,CAAC;IACd,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,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;AAyED;;;GAGG;AACH,qBAAa,kBAAmB,YAAW,UAAU;IACnD,SAAgB,IAAI,gBAAgB;IACpC,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,yBAAyB;IAsCxC,eAAe,CAAC,QAAQ,GAAG,OAAO,EACtC,KAAK,EAAE,oBAAoB,CAAC,QAAQ,CAAC,GACpC,OAAO,CAAC,qBAAqB,CAAC;YAInB,kBAAkB;YA2DlB,iBAAiB;CAkIhC"}
|