@falai/agent 0.1.3 → 0.1.5

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.
Files changed (160) hide show
  1. package/README.md +56 -1
  2. package/dist/cjs/constants/index.d.ts +5 -0
  3. package/dist/cjs/constants/index.d.ts.map +1 -0
  4. package/dist/cjs/constants/index.js +8 -0
  5. package/dist/cjs/constants/index.js.map +1 -0
  6. package/dist/cjs/core/Agent.d.ts +110 -0
  7. package/dist/cjs/core/Agent.d.ts.map +1 -0
  8. package/dist/cjs/core/Agent.js +290 -0
  9. package/dist/cjs/core/Agent.js.map +1 -0
  10. package/dist/cjs/core/DomainRegistry.d.ts +26 -0
  11. package/dist/cjs/core/DomainRegistry.d.ts.map +1 -0
  12. package/dist/cjs/core/DomainRegistry.js +47 -0
  13. package/dist/cjs/core/DomainRegistry.js.map +1 -0
  14. package/dist/cjs/core/Events.d.ts +19 -0
  15. package/dist/cjs/core/Events.d.ts.map +1 -0
  16. package/dist/cjs/core/Events.js +84 -0
  17. package/dist/cjs/core/Events.js.map +1 -0
  18. package/dist/cjs/core/Observation.d.ts +24 -0
  19. package/dist/cjs/core/Observation.d.ts.map +1 -0
  20. package/dist/cjs/core/Observation.js +39 -0
  21. package/dist/cjs/core/Observation.js.map +1 -0
  22. package/dist/cjs/core/PromptBuilder.d.ts +125 -0
  23. package/dist/cjs/core/PromptBuilder.d.ts.map +1 -0
  24. package/dist/cjs/core/PromptBuilder.js +374 -0
  25. package/dist/cjs/core/PromptBuilder.js.map +1 -0
  26. package/dist/cjs/core/Route.d.ts +46 -0
  27. package/dist/cjs/core/Route.d.ts.map +1 -0
  28. package/dist/cjs/core/Route.js +111 -0
  29. package/dist/cjs/core/Route.js.map +1 -0
  30. package/dist/cjs/core/State.d.ts +50 -0
  31. package/dist/cjs/core/State.d.ts.map +1 -0
  32. package/dist/cjs/core/State.js +112 -0
  33. package/dist/cjs/core/State.js.map +1 -0
  34. package/dist/cjs/core/Tool.d.ts +32 -0
  35. package/dist/cjs/core/Tool.d.ts.map +1 -0
  36. package/dist/cjs/core/Tool.js +37 -0
  37. package/dist/cjs/core/Tool.js.map +1 -0
  38. package/dist/cjs/core/Transition.d.ts +32 -0
  39. package/dist/cjs/core/Transition.d.ts.map +1 -0
  40. package/dist/cjs/core/Transition.js +59 -0
  41. package/dist/cjs/core/Transition.js.map +1 -0
  42. package/dist/cjs/index.d.ts +35 -0
  43. package/dist/cjs/index.d.ts.map +1 -0
  44. package/dist/cjs/index.js +55 -0
  45. package/dist/cjs/index.js.map +1 -0
  46. package/dist/cjs/package.json +1 -0
  47. package/dist/cjs/providers/GeminiProvider.d.ts +40 -0
  48. package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -0
  49. package/dist/cjs/providers/GeminiProvider.js +142 -0
  50. package/dist/cjs/providers/GeminiProvider.js.map +1 -0
  51. package/dist/cjs/providers/OpenAIProvider.d.ts +42 -0
  52. package/dist/cjs/providers/OpenAIProvider.d.ts.map +1 -0
  53. package/dist/cjs/providers/OpenAIProvider.js +242 -0
  54. package/dist/cjs/providers/OpenAIProvider.js.map +1 -0
  55. package/dist/cjs/providers/OpenRouterProvider.d.ts +46 -0
  56. package/dist/cjs/providers/OpenRouterProvider.d.ts.map +1 -0
  57. package/dist/cjs/providers/OpenRouterProvider.js +249 -0
  58. package/dist/cjs/providers/OpenRouterProvider.js.map +1 -0
  59. package/dist/cjs/types/agent.d.ts +105 -0
  60. package/dist/cjs/types/agent.d.ts.map +1 -0
  61. package/dist/cjs/types/agent.js +21 -0
  62. package/dist/cjs/types/agent.js.map +1 -0
  63. package/dist/cjs/types/ai.d.ts +102 -0
  64. package/dist/cjs/types/ai.d.ts.map +1 -0
  65. package/dist/cjs/types/ai.js +6 -0
  66. package/dist/cjs/types/ai.js.map +1 -0
  67. package/dist/cjs/types/history.d.ts +112 -0
  68. package/dist/cjs/types/history.d.ts.map +1 -0
  69. package/dist/cjs/types/history.js +37 -0
  70. package/dist/cjs/types/history.js.map +1 -0
  71. package/dist/cjs/types/index.d.ts +14 -0
  72. package/dist/cjs/types/index.d.ts.map +1 -0
  73. package/dist/cjs/types/index.js +14 -0
  74. package/dist/cjs/types/index.js.map +1 -0
  75. package/dist/cjs/types/observation.d.ts +27 -0
  76. package/dist/cjs/types/observation.d.ts.map +1 -0
  77. package/dist/cjs/types/observation.js +6 -0
  78. package/dist/cjs/types/observation.js.map +1 -0
  79. package/dist/cjs/types/prompt.d.ts +46 -0
  80. package/dist/cjs/types/prompt.d.ts.map +1 -0
  81. package/dist/cjs/types/prompt.js +19 -0
  82. package/dist/cjs/types/prompt.js.map +1 -0
  83. package/dist/cjs/types/route.d.ts +61 -0
  84. package/dist/cjs/types/route.d.ts.map +1 -0
  85. package/dist/cjs/types/route.js +6 -0
  86. package/dist/cjs/types/route.js.map +1 -0
  87. package/dist/cjs/types/tool.d.ts +46 -0
  88. package/dist/cjs/types/tool.d.ts.map +1 -0
  89. package/dist/cjs/types/tool.js +6 -0
  90. package/dist/cjs/types/tool.js.map +1 -0
  91. package/dist/cjs/utils/id.d.ts +25 -0
  92. package/dist/cjs/utils/id.d.ts.map +1 -0
  93. package/dist/cjs/utils/id.js +71 -0
  94. package/dist/cjs/utils/id.js.map +1 -0
  95. package/dist/cjs/utils/retry.d.ts +13 -0
  96. package/dist/cjs/utils/retry.d.ts.map +1 -0
  97. package/dist/cjs/utils/retry.js +75 -0
  98. package/dist/cjs/utils/retry.js.map +1 -0
  99. package/dist/core/Agent.js +10 -11
  100. package/dist/core/Agent.js.map +1 -1
  101. package/dist/core/DomainRegistry.js +3 -1
  102. package/dist/core/DomainRegistry.js.map +1 -1
  103. package/dist/core/Events.d.ts +2 -2
  104. package/dist/core/Events.d.ts.map +1 -1
  105. package/dist/core/Events.js +4 -4
  106. package/dist/core/Events.js.map +1 -1
  107. package/dist/core/Observation.d.ts.map +1 -1
  108. package/dist/core/Observation.js +4 -5
  109. package/dist/core/Observation.js.map +1 -1
  110. package/dist/core/PromptBuilder.js +2 -3
  111. package/dist/core/PromptBuilder.js.map +1 -1
  112. package/dist/core/Route.d.ts.map +1 -1
  113. package/dist/core/Route.js +4 -10
  114. package/dist/core/Route.js.map +1 -1
  115. package/dist/core/State.d.ts +1 -1
  116. package/dist/core/State.d.ts.map +1 -1
  117. package/dist/core/State.js +6 -8
  118. package/dist/core/State.js.map +1 -1
  119. package/dist/core/Tool.d.ts +1 -0
  120. package/dist/core/Tool.d.ts.map +1 -1
  121. package/dist/core/Tool.js +3 -2
  122. package/dist/core/Tool.js.map +1 -1
  123. package/dist/core/Transition.js +0 -4
  124. package/dist/core/Transition.js.map +1 -1
  125. package/dist/index.d.ts +1 -0
  126. package/dist/index.d.ts.map +1 -1
  127. package/dist/index.js +2 -0
  128. package/dist/index.js.map +1 -1
  129. package/dist/providers/GeminiProvider.js +1 -6
  130. package/dist/providers/GeminiProvider.js.map +1 -1
  131. package/dist/providers/OpenAIProvider.js +1 -6
  132. package/dist/providers/OpenAIProvider.js.map +1 -1
  133. package/dist/providers/OpenRouterProvider.js +1 -6
  134. package/dist/providers/OpenRouterProvider.js.map +1 -1
  135. package/dist/types/agent.d.ts +2 -2
  136. package/dist/types/agent.d.ts.map +1 -1
  137. package/dist/types/observation.d.ts +2 -0
  138. package/dist/types/observation.d.ts.map +1 -1
  139. package/dist/types/route.d.ts +2 -0
  140. package/dist/types/route.d.ts.map +1 -1
  141. package/dist/utils/id.d.ts +25 -0
  142. package/dist/utils/id.d.ts.map +1 -0
  143. package/dist/utils/id.js +65 -0
  144. package/dist/utils/id.js.map +1 -0
  145. package/docs/API_REFERENCE.md +122 -6
  146. package/docs/CONSTRUCTOR_OPTIONS.md +43 -36
  147. package/docs/GETTING_STARTED.md +2 -0
  148. package/docs/PROVIDERS.md +3 -0
  149. package/examples/declarative-agent.ts +31 -7
  150. package/package.json +15 -5
  151. package/src/core/Events.ts +6 -4
  152. package/src/core/Observation.ts +3 -3
  153. package/src/core/Route.ts +3 -5
  154. package/src/core/State.ts +5 -4
  155. package/src/core/Tool.ts +4 -3
  156. package/src/index.ts +8 -0
  157. package/src/types/agent.ts +4 -2
  158. package/src/types/observation.ts +2 -0
  159. package/src/types/route.ts +2 -0
  160. package/src/utils/id.ts +74 -0
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Google Gemini AI provider implementation with retry and backup models
3
+ */
4
+ import type { GenerateContentConfig } from "@google/genai";
5
+ import type { AiProvider, GenerateMessageInput, GenerateMessageOutput } from "../types/ai";
6
+ /**
7
+ * Configuration options for Gemini provider
8
+ * Uses types from @google/genai package
9
+ */
10
+ export interface GeminiProviderOptions {
11
+ /** Gemini API key */
12
+ apiKey: string;
13
+ /** Model to use (required) - e.g., "models/gemini-2.5-pro" */
14
+ model: string;
15
+ /** Backup models to try if primary fails (default: []) */
16
+ backupModels?: string[];
17
+ /** Default generation config - uses GenerateContentConfig from @google/genai */
18
+ config?: Partial<GenerateContentConfig>;
19
+ /** Retry configuration */
20
+ retryConfig?: {
21
+ timeout?: number;
22
+ retries?: number;
23
+ };
24
+ }
25
+ /**
26
+ * Gemini provider implementation with backup models and retry logic
27
+ */
28
+ export declare class GeminiProvider implements AiProvider {
29
+ readonly name = "gemini";
30
+ private genAI;
31
+ private primaryModel;
32
+ private backupModels;
33
+ private config?;
34
+ private retryConfig;
35
+ constructor(options: GeminiProviderOptions);
36
+ generateMessage<TContext = unknown>(input: GenerateMessageInput<TContext>): Promise<GenerateMessageOutput>;
37
+ private generateWithBackup;
38
+ private generateWithModel;
39
+ }
40
+ //# sourceMappingURL=GeminiProvider.d.ts.map
@@ -0,0 +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,EAEtB,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;YAInB,kBAAkB;YA2DlB,iBAAiB;CAqDhC"}
@@ -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"}