@falai/agent 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/README.md +516 -0
- package/dist/constants/index.d.ts +5 -0
- package/dist/constants/index.d.ts.map +1 -0
- package/dist/constants/index.js +5 -0
- package/dist/constants/index.js.map +1 -0
- package/dist/core/Agent.d.ts +98 -0
- package/dist/core/Agent.d.ts.map +1 -0
- package/dist/core/Agent.js +248 -0
- package/dist/core/Agent.js.map +1 -0
- package/dist/core/DomainRegistry.d.ts +26 -0
- package/dist/core/DomainRegistry.d.ts.map +1 -0
- package/dist/core/DomainRegistry.js +41 -0
- package/dist/core/DomainRegistry.js.map +1 -0
- package/dist/core/Events.d.ts +19 -0
- package/dist/core/Events.d.ts.map +1 -0
- package/dist/core/Events.js +79 -0
- package/dist/core/Events.js.map +1 -0
- package/dist/core/Observation.d.ts +24 -0
- package/dist/core/Observation.d.ts.map +1 -0
- package/dist/core/Observation.js +35 -0
- package/dist/core/Observation.js.map +1 -0
- package/dist/core/PromptBuilder.d.ts +121 -0
- package/dist/core/PromptBuilder.d.ts.map +1 -0
- package/dist/core/PromptBuilder.js +339 -0
- package/dist/core/PromptBuilder.js.map +1 -0
- package/dist/core/Route.d.ts +46 -0
- package/dist/core/Route.d.ts.map +1 -0
- package/dist/core/Route.js +113 -0
- package/dist/core/Route.js.map +1 -0
- package/dist/core/State.d.ts +50 -0
- package/dist/core/State.d.ts.map +1 -0
- package/dist/core/State.js +110 -0
- package/dist/core/State.js.map +1 -0
- package/dist/core/Tool.d.ts +31 -0
- package/dist/core/Tool.d.ts.map +1 -0
- package/dist/core/Tool.js +33 -0
- package/dist/core/Tool.js.map +1 -0
- package/dist/core/Transition.d.ts +32 -0
- package/dist/core/Transition.d.ts.map +1 -0
- package/dist/core/Transition.js +59 -0
- package/dist/core/Transition.js.map +1 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/GeminiProvider.d.ts +40 -0
- package/dist/providers/GeminiProvider.d.ts.map +1 -0
- package/dist/providers/GeminiProvider.js +126 -0
- package/dist/providers/GeminiProvider.js.map +1 -0
- package/dist/providers/OpenAIProvider.d.ts +42 -0
- package/dist/providers/OpenAIProvider.d.ts.map +1 -0
- package/dist/providers/OpenAIProvider.js +164 -0
- package/dist/providers/OpenAIProvider.js.map +1 -0
- package/dist/providers/OpenRouterProvider.d.ts +46 -0
- package/dist/providers/OpenRouterProvider.d.ts.map +1 -0
- package/dist/providers/OpenRouterProvider.js +171 -0
- package/dist/providers/OpenRouterProvider.js.map +1 -0
- package/dist/types/agent.d.ts +105 -0
- package/dist/types/agent.d.ts.map +1 -0
- package/dist/types/agent.js +18 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/ai.d.ts +78 -0
- package/dist/types/ai.d.ts.map +1 -0
- package/dist/types/ai.js +5 -0
- package/dist/types/ai.js.map +1 -0
- package/dist/types/history.d.ts +112 -0
- package/dist/types/history.d.ts.map +1 -0
- package/dist/types/history.js +34 -0
- package/dist/types/history.js.map +1 -0
- package/dist/types/index.d.ts +14 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/observation.d.ts +25 -0
- package/dist/types/observation.d.ts.map +1 -0
- package/dist/types/observation.js +5 -0
- package/dist/types/observation.js.map +1 -0
- package/dist/types/prompt.d.ts +46 -0
- package/dist/types/prompt.d.ts.map +1 -0
- package/dist/types/prompt.js +16 -0
- package/dist/types/prompt.js.map +1 -0
- package/dist/types/route.d.ts +59 -0
- package/dist/types/route.d.ts.map +1 -0
- package/dist/types/route.js +5 -0
- package/dist/types/route.js.map +1 -0
- package/dist/types/tool.d.ts +46 -0
- package/dist/types/tool.d.ts.map +1 -0
- package/dist/types/tool.js +5 -0
- package/dist/types/tool.js.map +1 -0
- package/dist/utils/retry.d.ts +13 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +70 -0
- package/dist/utils/retry.js.map +1 -0
- package/docs/API_REFERENCE.md +517 -0
- package/docs/CONSTRUCTOR_OPTIONS.md +256 -0
- package/docs/CONTRIBUTING.md +481 -0
- package/docs/GETTING_STARTED.md +328 -0
- package/docs/PROVIDERS.md +472 -0
- package/docs/PUBLISHING.md +174 -0
- package/docs/README.md +68 -0
- package/docs/STRUCTURE.md +32 -0
- package/examples/declarative-agent.ts +217 -0
- package/examples/healthcare-agent.ts +283 -0
- package/examples/openai-agent.ts +167 -0
- package/examples/travel-agent.ts +342 -0
- package/package.json +73 -0
- package/src/constants/index.ts +5 -0
- package/src/core/Agent.ts +307 -0
- package/src/core/DomainRegistry.ts +50 -0
- package/src/core/Events.ts +101 -0
- package/src/core/Observation.ts +46 -0
- package/src/core/PromptBuilder.ts +511 -0
- package/src/core/Route.ts +136 -0
- package/src/core/State.ts +153 -0
- package/src/core/Tool.ts +54 -0
- package/src/core/Transition.ts +66 -0
- package/src/index.ts +83 -0
- package/src/providers/GeminiProvider.ts +220 -0
- package/src/providers/OpenAIProvider.ts +272 -0
- package/src/providers/OpenRouterProvider.ts +282 -0
- package/src/types/agent.ts +112 -0
- package/src/types/ai.ts +85 -0
- package/src/types/history.ts +125 -0
- package/src/types/index.ts +56 -0
- package/src/types/observation.ts +27 -0
- package/src/types/prompt.ts +49 -0
- package/src/types/route.ts +68 -0
- package/src/types/tool.ts +53 -0
- package/src/utils/retry.ts +96 -0
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI provider implementation with retry and backup models
|
|
3
|
+
*/
|
|
4
|
+
import OpenAI from "openai";
|
|
5
|
+
import { withTimeoutAndRetry } from "@/utils/retry";
|
|
6
|
+
const DEFAULT_RETRY_CONFIG = {
|
|
7
|
+
timeout: 60000,
|
|
8
|
+
retries: 3,
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Type guard to check if error is ErrorWithStatus
|
|
12
|
+
*/
|
|
13
|
+
function isErrorWithStatus(error) {
|
|
14
|
+
return (typeof error === "object" &&
|
|
15
|
+
error !== null &&
|
|
16
|
+
("status" in error || "code" in error || "message" in error));
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Safely extract error message
|
|
20
|
+
*/
|
|
21
|
+
function getErrorMessage(error) {
|
|
22
|
+
if (error instanceof Error) {
|
|
23
|
+
return error.message;
|
|
24
|
+
}
|
|
25
|
+
if (isErrorWithStatus(error) && error.message) {
|
|
26
|
+
return error.message;
|
|
27
|
+
}
|
|
28
|
+
return String(error);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Determines if an error should trigger backup model usage
|
|
32
|
+
*/
|
|
33
|
+
const shouldUseBackupModel = (error) => {
|
|
34
|
+
if (!isErrorWithStatus(error)) {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
// Server errors
|
|
38
|
+
if (error.status === 500 || error.status === 503) {
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
// Rate limiting
|
|
42
|
+
if (error.status === 429) {
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
// Model overloaded or unavailable
|
|
46
|
+
if (error.code === "model_not_found" || error.code === "model_overloaded") {
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
const message = getErrorMessage(error);
|
|
50
|
+
if (message.includes("overloaded") ||
|
|
51
|
+
message.includes("unavailable") ||
|
|
52
|
+
message.includes("internal error") ||
|
|
53
|
+
message.includes("Internal error")) {
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
return false;
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* OpenAI provider implementation with backup models and retry logic
|
|
60
|
+
*/
|
|
61
|
+
export class OpenAIProvider {
|
|
62
|
+
name = "openai";
|
|
63
|
+
client;
|
|
64
|
+
primaryModel;
|
|
65
|
+
backupModels;
|
|
66
|
+
config;
|
|
67
|
+
retryConfig;
|
|
68
|
+
constructor(options) {
|
|
69
|
+
const { apiKey, organization, model, backupModels = [], config, retryConfig, } = options;
|
|
70
|
+
if (!apiKey) {
|
|
71
|
+
throw new Error("OpenAI API key is required");
|
|
72
|
+
}
|
|
73
|
+
if (!model) {
|
|
74
|
+
throw new Error("Model is required. Example: 'gpt-5' or 'gpt-5-mini'");
|
|
75
|
+
}
|
|
76
|
+
// Dynamic import to avoid bundling issues
|
|
77
|
+
this.client = new OpenAI({
|
|
78
|
+
apiKey,
|
|
79
|
+
organization,
|
|
80
|
+
});
|
|
81
|
+
this.primaryModel = model;
|
|
82
|
+
this.backupModels = backupModels;
|
|
83
|
+
this.config = config;
|
|
84
|
+
this.retryConfig = {
|
|
85
|
+
timeout: retryConfig?.timeout || DEFAULT_RETRY_CONFIG.timeout,
|
|
86
|
+
retries: retryConfig?.retries || DEFAULT_RETRY_CONFIG.retries,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
async generateMessage(input) {
|
|
90
|
+
return this.generateWithBackup(input);
|
|
91
|
+
}
|
|
92
|
+
async generateWithBackup(input) {
|
|
93
|
+
// Try primary model first
|
|
94
|
+
try {
|
|
95
|
+
return await this.generateWithModel(this.primaryModel, input);
|
|
96
|
+
}
|
|
97
|
+
catch (primaryError) {
|
|
98
|
+
const primaryErrMsg = getErrorMessage(primaryError);
|
|
99
|
+
console.warn(`[OPENAI] Primary model ${this.primaryModel} failed: ${primaryErrMsg}`);
|
|
100
|
+
if (!shouldUseBackupModel(primaryError)) {
|
|
101
|
+
throw primaryError;
|
|
102
|
+
}
|
|
103
|
+
console.log(`[OPENAI] Trying backup models`);
|
|
104
|
+
let lastBackupError = primaryError;
|
|
105
|
+
for (let i = 0; i < this.backupModels.length; i++) {
|
|
106
|
+
const backupModel = this.backupModels[i];
|
|
107
|
+
console.log(`[OPENAI] Trying backup model ${i + 1}/${this.backupModels.length}: ${backupModel}`);
|
|
108
|
+
try {
|
|
109
|
+
const result = await this.generateWithModel(backupModel, input);
|
|
110
|
+
console.log(`[OPENAI] Backup model ${backupModel} succeeded`);
|
|
111
|
+
return result;
|
|
112
|
+
}
|
|
113
|
+
catch (backupError) {
|
|
114
|
+
const backupErrMsg = getErrorMessage(backupError);
|
|
115
|
+
console.warn(`[OPENAI] Backup model ${backupModel} failed: ${backupErrMsg}`);
|
|
116
|
+
lastBackupError = backupError;
|
|
117
|
+
if (!shouldUseBackupModel(backupError) &&
|
|
118
|
+
i < this.backupModels.length - 1) {
|
|
119
|
+
console.log(`[OPENAI] Backup model error doesn't qualify for further attempts`);
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
const lastBackupErrMsg = getErrorMessage(lastBackupError);
|
|
125
|
+
console.error(`[OPENAI] All models failed. Primary: ${primaryErrMsg}, Last backup: ${lastBackupErrMsg}`);
|
|
126
|
+
throw lastBackupError;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
async generateWithModel(model, input) {
|
|
130
|
+
const operation = async () => {
|
|
131
|
+
const params = {
|
|
132
|
+
model,
|
|
133
|
+
messages: [
|
|
134
|
+
{
|
|
135
|
+
role: "user",
|
|
136
|
+
content: input.prompt,
|
|
137
|
+
},
|
|
138
|
+
],
|
|
139
|
+
...this.config,
|
|
140
|
+
};
|
|
141
|
+
// Override with input parameters if provided
|
|
142
|
+
if (input.parameters?.maxOutputTokens !== undefined) {
|
|
143
|
+
params.max_tokens = input.parameters.maxOutputTokens;
|
|
144
|
+
}
|
|
145
|
+
const response = await this.client.chat.completions.create(params);
|
|
146
|
+
const message = response.choices[0]?.message?.content;
|
|
147
|
+
if (!message) {
|
|
148
|
+
throw new Error("No response from OpenAI");
|
|
149
|
+
}
|
|
150
|
+
return {
|
|
151
|
+
message,
|
|
152
|
+
metadata: {
|
|
153
|
+
model: response.model,
|
|
154
|
+
finishReason: response.choices[0]?.finish_reason,
|
|
155
|
+
tokensUsed: response.usage?.total_tokens,
|
|
156
|
+
promptTokens: response.usage?.prompt_tokens,
|
|
157
|
+
completionTokens: response.usage?.completion_tokens,
|
|
158
|
+
},
|
|
159
|
+
};
|
|
160
|
+
};
|
|
161
|
+
return withTimeoutAndRetry(operation, this.retryConfig.timeout, this.retryConfig.retries, `OpenAI ${model}`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
//# 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,EACV,oBAAoB,EACpB,qBAAqB,EACtB,MAAM,YAAY,CAAC;AAQpB;;;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;CA+ChC"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenRouter provider implementation
|
|
3
|
+
* OpenRouter provides access to multiple AI models through a unified OpenAI-compatible API
|
|
4
|
+
*/
|
|
5
|
+
import OpenAI from "openai";
|
|
6
|
+
import { withTimeoutAndRetry } from "@/utils/retry";
|
|
7
|
+
const DEFAULT_RETRY_CONFIG = {
|
|
8
|
+
timeout: 60000,
|
|
9
|
+
retries: 3,
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Type guard to check if error is ErrorWithStatus
|
|
13
|
+
*/
|
|
14
|
+
function isErrorWithStatus(error) {
|
|
15
|
+
return (typeof error === "object" &&
|
|
16
|
+
error !== null &&
|
|
17
|
+
("status" in error || "code" in error || "message" in error));
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Safely extract error message
|
|
21
|
+
*/
|
|
22
|
+
function getErrorMessage(error) {
|
|
23
|
+
if (error instanceof Error) {
|
|
24
|
+
return error.message;
|
|
25
|
+
}
|
|
26
|
+
if (isErrorWithStatus(error) && error.message) {
|
|
27
|
+
return error.message;
|
|
28
|
+
}
|
|
29
|
+
return String(error);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Determines if an error should trigger backup model usage
|
|
33
|
+
*/
|
|
34
|
+
const shouldUseBackupModel = (error) => {
|
|
35
|
+
if (!isErrorWithStatus(error)) {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
// Server errors
|
|
39
|
+
if (error.status === 500 || error.status === 503) {
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
// Rate limiting
|
|
43
|
+
if (error.status === 429) {
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
// Model not available or overloaded
|
|
47
|
+
if (error.code === "model_not_found" || error.code === "model_overloaded") {
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
const message = getErrorMessage(error);
|
|
51
|
+
if (message.includes("overloaded") ||
|
|
52
|
+
message.includes("unavailable") ||
|
|
53
|
+
message.includes("internal error") ||
|
|
54
|
+
message.includes("Internal error") ||
|
|
55
|
+
message.includes("capacity")) {
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
return false;
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* OpenRouter provider implementation
|
|
62
|
+
* Provides access to multiple AI models through OpenRouter's unified API
|
|
63
|
+
*/
|
|
64
|
+
export class OpenRouterProvider {
|
|
65
|
+
name = "openrouter";
|
|
66
|
+
client;
|
|
67
|
+
primaryModel;
|
|
68
|
+
backupModels;
|
|
69
|
+
config;
|
|
70
|
+
retryConfig;
|
|
71
|
+
constructor(options) {
|
|
72
|
+
const { apiKey, model, backupModels = [], siteUrl, siteName, config, retryConfig, } = options;
|
|
73
|
+
if (!apiKey) {
|
|
74
|
+
throw new Error("OpenRouter API key is required");
|
|
75
|
+
}
|
|
76
|
+
if (!model) {
|
|
77
|
+
throw new Error("Model is required. See https://openrouter.ai/models");
|
|
78
|
+
}
|
|
79
|
+
// Initialize OpenAI client with OpenRouter base URL
|
|
80
|
+
this.client = new OpenAI({
|
|
81
|
+
apiKey,
|
|
82
|
+
baseURL: "https://openrouter.ai/api/v1",
|
|
83
|
+
defaultHeaders: {
|
|
84
|
+
"HTTP-Referer": siteUrl || "",
|
|
85
|
+
"X-Title": siteName || "",
|
|
86
|
+
},
|
|
87
|
+
});
|
|
88
|
+
this.primaryModel = model;
|
|
89
|
+
this.backupModels = backupModels;
|
|
90
|
+
this.config = config;
|
|
91
|
+
this.retryConfig = {
|
|
92
|
+
timeout: retryConfig?.timeout || DEFAULT_RETRY_CONFIG.timeout,
|
|
93
|
+
retries: retryConfig?.retries || DEFAULT_RETRY_CONFIG.retries,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
async generateMessage(input) {
|
|
97
|
+
return this.generateWithBackup(input);
|
|
98
|
+
}
|
|
99
|
+
async generateWithBackup(input) {
|
|
100
|
+
// Try primary model first
|
|
101
|
+
try {
|
|
102
|
+
return await this.generateWithModel(this.primaryModel, input);
|
|
103
|
+
}
|
|
104
|
+
catch (primaryError) {
|
|
105
|
+
const primaryErrMsg = getErrorMessage(primaryError);
|
|
106
|
+
console.warn(`[OPENROUTER] Primary model ${this.primaryModel} failed: ${primaryErrMsg}`);
|
|
107
|
+
if (!shouldUseBackupModel(primaryError)) {
|
|
108
|
+
throw primaryError;
|
|
109
|
+
}
|
|
110
|
+
console.log(`[OPENROUTER] Trying backup models`);
|
|
111
|
+
let lastBackupError = primaryError;
|
|
112
|
+
for (let i = 0; i < this.backupModels.length; i++) {
|
|
113
|
+
const backupModel = this.backupModels[i];
|
|
114
|
+
console.log(`[OPENROUTER] Trying backup model ${i + 1}/${this.backupModels.length}: ${backupModel}`);
|
|
115
|
+
try {
|
|
116
|
+
const result = await this.generateWithModel(backupModel, input);
|
|
117
|
+
console.log(`[OPENROUTER] Backup model ${backupModel} succeeded`);
|
|
118
|
+
return result;
|
|
119
|
+
}
|
|
120
|
+
catch (backupError) {
|
|
121
|
+
const backupErrMsg = getErrorMessage(backupError);
|
|
122
|
+
console.warn(`[OPENROUTER] Backup model ${backupModel} failed: ${backupErrMsg}`);
|
|
123
|
+
lastBackupError = backupError;
|
|
124
|
+
if (!shouldUseBackupModel(backupError) &&
|
|
125
|
+
i < this.backupModels.length - 1) {
|
|
126
|
+
console.log(`[OPENROUTER] Backup model error doesn't qualify for further attempts`);
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
const lastBackupErrMsg = getErrorMessage(lastBackupError);
|
|
132
|
+
console.error(`[OPENROUTER] All models failed. Primary: ${primaryErrMsg}, Last backup: ${lastBackupErrMsg}`);
|
|
133
|
+
throw lastBackupError;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
async generateWithModel(model, input) {
|
|
137
|
+
const operation = async () => {
|
|
138
|
+
const params = {
|
|
139
|
+
model,
|
|
140
|
+
messages: [
|
|
141
|
+
{
|
|
142
|
+
role: "user",
|
|
143
|
+
content: input.prompt,
|
|
144
|
+
},
|
|
145
|
+
],
|
|
146
|
+
...this.config,
|
|
147
|
+
};
|
|
148
|
+
// Override with input parameters if provided
|
|
149
|
+
if (input.parameters?.maxOutputTokens !== undefined) {
|
|
150
|
+
params.max_tokens = input.parameters.maxOutputTokens;
|
|
151
|
+
}
|
|
152
|
+
const response = await this.client.chat.completions.create(params);
|
|
153
|
+
const message = response.choices[0]?.message?.content;
|
|
154
|
+
if (!message) {
|
|
155
|
+
throw new Error("No response from OpenRouter");
|
|
156
|
+
}
|
|
157
|
+
return {
|
|
158
|
+
message,
|
|
159
|
+
metadata: {
|
|
160
|
+
model: response.model,
|
|
161
|
+
finishReason: response.choices[0]?.finish_reason,
|
|
162
|
+
tokensUsed: response.usage?.total_tokens,
|
|
163
|
+
promptTokens: response.usage?.prompt_tokens,
|
|
164
|
+
completionTokens: response.usage?.completion_tokens,
|
|
165
|
+
},
|
|
166
|
+
};
|
|
167
|
+
};
|
|
168
|
+
return withTimeoutAndRetry(operation, this.retryConfig.timeout, this.retryConfig.retries, `OpenRouter ${model}`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=OpenRouterProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OpenRouterProvider.js","sourceRoot":"","sources":["../../src/providers/OpenRouterProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent-related type definitions
|
|
3
|
+
*/
|
|
4
|
+
import type { AiProvider } from "./ai";
|
|
5
|
+
import type { ToolRef } from "./tool";
|
|
6
|
+
import type { RouteOptions } from "./route";
|
|
7
|
+
/**
|
|
8
|
+
* Composition mode determines how the agent processes and structures responses
|
|
9
|
+
*/
|
|
10
|
+
export declare enum CompositionMode {
|
|
11
|
+
/** Fluid, natural conversation without strict structure */
|
|
12
|
+
FLUID = "fluid",
|
|
13
|
+
/** Canned responses with fluid fallback */
|
|
14
|
+
CANNED_FLUID = "canned_fluid",
|
|
15
|
+
/** Composited canned responses */
|
|
16
|
+
CANNED_COMPOSITED = "composited_canned",
|
|
17
|
+
/** Strict canned responses only */
|
|
18
|
+
CANNED_STRICT = "strict_canned"
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Forward declare observation types
|
|
22
|
+
*/
|
|
23
|
+
import type { ObservationOptions } from "./observation";
|
|
24
|
+
/**
|
|
25
|
+
* Options for creating an Agent
|
|
26
|
+
*/
|
|
27
|
+
export interface AgentOptions<TContext = unknown> {
|
|
28
|
+
/** Display name of the agent */
|
|
29
|
+
name: string;
|
|
30
|
+
/** Detailed description of the agent's purpose and personality */
|
|
31
|
+
description?: string;
|
|
32
|
+
/** The agent's primary goal or objective */
|
|
33
|
+
goal?: string;
|
|
34
|
+
/** Default context data available to the agent */
|
|
35
|
+
context?: TContext;
|
|
36
|
+
/** AI provider strategy for generating responses */
|
|
37
|
+
ai: AiProvider;
|
|
38
|
+
/** Maximum number of processing iterations per request */
|
|
39
|
+
maxEngineIterations?: number;
|
|
40
|
+
/** Composition mode for response generation */
|
|
41
|
+
compositionMode?: CompositionMode;
|
|
42
|
+
/** Initial terms for domain glossary */
|
|
43
|
+
terms?: Term[];
|
|
44
|
+
/** Initial guidelines for agent behavior */
|
|
45
|
+
guidelines?: Guideline[];
|
|
46
|
+
/** Initial capabilities */
|
|
47
|
+
capabilities?: Capability[];
|
|
48
|
+
/** Initial routes (will be instantiated as Route objects) */
|
|
49
|
+
routes?: RouteOptions[];
|
|
50
|
+
/** Initial observations for disambiguation */
|
|
51
|
+
observations?: ObservationOptions[];
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* A term in the domain glossary
|
|
55
|
+
*/
|
|
56
|
+
export interface Term {
|
|
57
|
+
/** Name of the term */
|
|
58
|
+
name: string;
|
|
59
|
+
/** Description/definition of the term */
|
|
60
|
+
description: string;
|
|
61
|
+
/** Alternative names or synonyms */
|
|
62
|
+
synonyms?: string[];
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* A behavioral guideline for the agent
|
|
66
|
+
*/
|
|
67
|
+
export interface Guideline {
|
|
68
|
+
/** Unique identifier */
|
|
69
|
+
id?: string;
|
|
70
|
+
/** Condition that triggers this guideline (optional for always-active guidelines) */
|
|
71
|
+
condition?: string;
|
|
72
|
+
/** Action the agent should take when the condition is met */
|
|
73
|
+
action: string;
|
|
74
|
+
/** Whether this guideline is currently enabled */
|
|
75
|
+
enabled?: boolean;
|
|
76
|
+
/** Tags for organizing and filtering guidelines */
|
|
77
|
+
tags?: string[];
|
|
78
|
+
/** Tools available when following this guideline */
|
|
79
|
+
tools?: ToolRef<unknown, unknown[], unknown>[];
|
|
80
|
+
/** Additional metadata */
|
|
81
|
+
metadata?: Record<string, unknown>;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* A capability the agent can perform
|
|
85
|
+
*/
|
|
86
|
+
export interface Capability {
|
|
87
|
+
/** Unique identifier */
|
|
88
|
+
id?: string;
|
|
89
|
+
/** Title of the capability */
|
|
90
|
+
title: string;
|
|
91
|
+
/** Description of what the capability does */
|
|
92
|
+
description: string;
|
|
93
|
+
/** Tools used by this capability */
|
|
94
|
+
tools?: ToolRef<unknown, unknown[], unknown>[];
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Guideline match with rationale
|
|
98
|
+
*/
|
|
99
|
+
export interface GuidelineMatch {
|
|
100
|
+
/** The matched guideline */
|
|
101
|
+
guideline: Guideline;
|
|
102
|
+
/** Explanation of why this guideline was matched */
|
|
103
|
+
rationale?: string;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/types/agent.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AACvC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C;;GAEG;AACH,oBAAY,eAAe;IACzB,2DAA2D;IAC3D,KAAK,UAAU;IACf,2CAA2C;IAC3C,YAAY,iBAAiB;IAC7B,kCAAkC;IAClC,iBAAiB,sBAAsB;IACvC,mCAAmC;IACnC,aAAa,kBAAkB;CAChC;AAED;;GAEG;AACH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,QAAQ,GAAG,OAAO;IAC9C,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,oDAAoD;IACpD,EAAE,EAAE,UAAU,CAAC;IACf,0DAA0D;IAC1D,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,+CAA+C;IAC/C,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,wCAAwC;IACxC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;IACf,4CAA4C;IAC5C,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,2BAA2B;IAC3B,YAAY,CAAC,EAAE,UAAU,EAAE,CAAC;IAC5B,6DAA6D;IAC7D,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC;IACxB,8CAA8C;IAC9C,YAAY,CAAC,EAAE,kBAAkB,EAAE,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,IAAI;IACnB,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,yCAAyC;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,wBAAwB;IACxB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,qFAAqF;IACrF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,oDAAoD;IACpD,KAAK,CAAC,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC;IAC/C,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,wBAAwB;IACxB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,oCAAoC;IACpC,KAAK,CAAC,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC;CAChD;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,4BAA4B;IAC5B,SAAS,EAAE,SAAS,CAAC;IACrB,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent-related type definitions
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Composition mode determines how the agent processes and structures responses
|
|
6
|
+
*/
|
|
7
|
+
export var CompositionMode;
|
|
8
|
+
(function (CompositionMode) {
|
|
9
|
+
/** Fluid, natural conversation without strict structure */
|
|
10
|
+
CompositionMode["FLUID"] = "fluid";
|
|
11
|
+
/** Canned responses with fluid fallback */
|
|
12
|
+
CompositionMode["CANNED_FLUID"] = "canned_fluid";
|
|
13
|
+
/** Composited canned responses */
|
|
14
|
+
CompositionMode["CANNED_COMPOSITED"] = "composited_canned";
|
|
15
|
+
/** Strict canned responses only */
|
|
16
|
+
CompositionMode["CANNED_STRICT"] = "strict_canned";
|
|
17
|
+
})(CompositionMode || (CompositionMode = {}));
|
|
18
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/types/agent.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH;;GAEG;AACH,MAAM,CAAN,IAAY,eASX;AATD,WAAY,eAAe;IACzB,2DAA2D;IAC3D,kCAAe,CAAA;IACf,2CAA2C;IAC3C,gDAA6B,CAAA;IAC7B,kCAAkC;IAClC,0DAAuC,CAAA;IACvC,mCAAmC;IACnC,kDAA+B,CAAA;AACjC,CAAC,EATW,eAAe,KAAf,eAAe,QAS1B"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI provider strategy types
|
|
3
|
+
*/
|
|
4
|
+
import type { Event } from "./history";
|
|
5
|
+
/**
|
|
6
|
+
* Reasoning/thinking configuration for AI models
|
|
7
|
+
*/
|
|
8
|
+
export interface ReasoningConfig {
|
|
9
|
+
/**
|
|
10
|
+
* Effort level for reasoning models (OpenAI: gpt-5, o-series)
|
|
11
|
+
* - minimal: Fastest, least reasoning
|
|
12
|
+
* - low: Basic reasoning
|
|
13
|
+
* - medium: Balanced reasoning
|
|
14
|
+
* - high: Maximum reasoning effort
|
|
15
|
+
*/
|
|
16
|
+
effort?: "minimal" | "low" | "medium" | "high";
|
|
17
|
+
/**
|
|
18
|
+
* Summary detail level of reasoning process
|
|
19
|
+
* - auto: Model decides
|
|
20
|
+
* - concise: Brief summary
|
|
21
|
+
* - detailed: Full reasoning details
|
|
22
|
+
*/
|
|
23
|
+
summary?: "auto" | "concise" | "detailed";
|
|
24
|
+
/**
|
|
25
|
+
* Whether to include thinking/reasoning in response (Gemini)
|
|
26
|
+
*/
|
|
27
|
+
includeThoughts?: boolean;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Input for AI message generation
|
|
31
|
+
*/
|
|
32
|
+
export interface GenerateMessageInput<TContext = unknown> {
|
|
33
|
+
/** The constructed prompt */
|
|
34
|
+
prompt: string;
|
|
35
|
+
/** Interaction history */
|
|
36
|
+
history: Event[];
|
|
37
|
+
/** Context data */
|
|
38
|
+
context: TContext;
|
|
39
|
+
/** Additional generation parameters */
|
|
40
|
+
parameters?: {
|
|
41
|
+
/** Maximum output tokens to generate */
|
|
42
|
+
maxOutputTokens?: number;
|
|
43
|
+
/** Reasoning/thinking configuration */
|
|
44
|
+
reasoning?: ReasoningConfig;
|
|
45
|
+
};
|
|
46
|
+
/** Abort signal for cancellation */
|
|
47
|
+
signal?: AbortSignal;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Output from AI message generation
|
|
51
|
+
*/
|
|
52
|
+
export interface GenerateMessageOutput {
|
|
53
|
+
/** The generated message */
|
|
54
|
+
message: string;
|
|
55
|
+
/** Optional metadata about generation */
|
|
56
|
+
metadata?: {
|
|
57
|
+
/** Model used */
|
|
58
|
+
model?: string;
|
|
59
|
+
/** Tokens consumed */
|
|
60
|
+
tokensUsed?: number;
|
|
61
|
+
/** Finish reason */
|
|
62
|
+
finishReason?: string;
|
|
63
|
+
/** Additional provider-specific data */
|
|
64
|
+
[key: string]: unknown;
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* AI provider interface (strategy pattern)
|
|
69
|
+
*/
|
|
70
|
+
export interface AiProvider {
|
|
71
|
+
/** Provider name/identifier */
|
|
72
|
+
readonly name: string;
|
|
73
|
+
/**
|
|
74
|
+
* Generate a message based on prompt and context
|
|
75
|
+
*/
|
|
76
|
+
generateMessage<TContext = unknown>(input: GenerateMessageInput<TContext>): Promise<GenerateMessageOutput>;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=ai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../src/types/ai.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAEvC;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC/C;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC;IAC1C;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB,CAAC,QAAQ,GAAG,OAAO;IACtD,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,0BAA0B;IAC1B,OAAO,EAAE,KAAK,EAAE,CAAC;IACjB,mBAAmB;IACnB,OAAO,EAAE,QAAQ,CAAC;IAClB,uCAAuC;IACvC,UAAU,CAAC,EAAE;QACX,wCAAwC;QACxC,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,uCAAuC;QACvC,SAAS,CAAC,EAAE,eAAe,CAAC;KAC7B,CAAC;IACF,oCAAoC;IACpC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,QAAQ,CAAC,EAAE;QACT,iBAAiB;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,sBAAsB;QACtB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,oBAAoB;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,wCAAwC;QACxC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,+BAA+B;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,eAAe,CAAC,QAAQ,GAAG,OAAO,EAChC,KAAK,EAAE,oBAAoB,CAAC,QAAQ,CAAC,GACpC,OAAO,CAAC,qBAAqB,CAAC,CAAC;CACnC"}
|
package/dist/types/ai.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai.js","sourceRoot":"","sources":["../../src/types/ai.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|