@ugm/desiagent 0.1.21

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 (202) hide show
  1. package/README.md +251 -0
  2. package/dist/__tests__/test-utils.d.ts +24 -0
  3. package/dist/__tests__/test-utils.d.ts.map +1 -0
  4. package/dist/__tests__/test-utils.js +32 -0
  5. package/dist/__tests__/test-utils.js.map +1 -0
  6. package/dist/core/execution/agents.d.ts +60 -0
  7. package/dist/core/execution/agents.d.ts.map +1 -0
  8. package/dist/core/execution/agents.js +249 -0
  9. package/dist/core/execution/agents.js.map +1 -0
  10. package/dist/core/execution/artifacts.d.ts +27 -0
  11. package/dist/core/execution/artifacts.d.ts.map +1 -0
  12. package/dist/core/execution/artifacts.js +93 -0
  13. package/dist/core/execution/artifacts.js.map +1 -0
  14. package/dist/core/execution/costs.d.ts +160 -0
  15. package/dist/core/execution/costs.d.ts.map +1 -0
  16. package/dist/core/execution/costs.js +196 -0
  17. package/dist/core/execution/costs.js.map +1 -0
  18. package/dist/core/execution/dagExecutor.d.ts +112 -0
  19. package/dist/core/execution/dagExecutor.d.ts.map +1 -0
  20. package/dist/core/execution/dagExecutor.js +647 -0
  21. package/dist/core/execution/dagExecutor.js.map +1 -0
  22. package/dist/core/execution/dags.d.ts +167 -0
  23. package/dist/core/execution/dags.d.ts.map +1 -0
  24. package/dist/core/execution/dags.js +713 -0
  25. package/dist/core/execution/dags.js.map +1 -0
  26. package/dist/core/execution/executions.d.ts +158 -0
  27. package/dist/core/execution/executions.d.ts.map +1 -0
  28. package/dist/core/execution/executions.js +258 -0
  29. package/dist/core/execution/executions.js.map +1 -0
  30. package/dist/core/execution/goals.d.ts +62 -0
  31. package/dist/core/execution/goals.d.ts.map +1 -0
  32. package/dist/core/execution/goals.js +245 -0
  33. package/dist/core/execution/goals.js.map +1 -0
  34. package/dist/core/execution/runs.d.ts +65 -0
  35. package/dist/core/execution/runs.d.ts.map +1 -0
  36. package/dist/core/execution/runs.js +219 -0
  37. package/dist/core/execution/runs.js.map +1 -0
  38. package/dist/core/execution/tools.d.ts +24 -0
  39. package/dist/core/execution/tools.d.ts.map +1 -0
  40. package/dist/core/execution/tools.js +33 -0
  41. package/dist/core/execution/tools.js.map +1 -0
  42. package/dist/core/orchestration/index.d.ts +7 -0
  43. package/dist/core/orchestration/index.d.ts.map +1 -0
  44. package/dist/core/orchestration/index.js +7 -0
  45. package/dist/core/orchestration/index.js.map +1 -0
  46. package/dist/core/orchestration/orchestrator.d.ts +39 -0
  47. package/dist/core/orchestration/orchestrator.d.ts.map +1 -0
  48. package/dist/core/orchestration/orchestrator.js +141 -0
  49. package/dist/core/orchestration/orchestrator.js.map +1 -0
  50. package/dist/core/orchestration/planner.d.ts +63 -0
  51. package/dist/core/orchestration/planner.d.ts.map +1 -0
  52. package/dist/core/orchestration/planner.js +99 -0
  53. package/dist/core/orchestration/planner.js.map +1 -0
  54. package/dist/core/providers/factory.d.ts +25 -0
  55. package/dist/core/providers/factory.d.ts.map +1 -0
  56. package/dist/core/providers/factory.js +86 -0
  57. package/dist/core/providers/factory.js.map +1 -0
  58. package/dist/core/providers/index.d.ts +11 -0
  59. package/dist/core/providers/index.d.ts.map +1 -0
  60. package/dist/core/providers/index.js +10 -0
  61. package/dist/core/providers/index.js.map +1 -0
  62. package/dist/core/providers/ollama.d.ts +36 -0
  63. package/dist/core/providers/ollama.d.ts.map +1 -0
  64. package/dist/core/providers/ollama.js +123 -0
  65. package/dist/core/providers/ollama.js.map +1 -0
  66. package/dist/core/providers/openai.d.ts +33 -0
  67. package/dist/core/providers/openai.d.ts.map +1 -0
  68. package/dist/core/providers/openai.js +114 -0
  69. package/dist/core/providers/openai.js.map +1 -0
  70. package/dist/core/providers/openrouter.d.ts +38 -0
  71. package/dist/core/providers/openrouter.d.ts.map +1 -0
  72. package/dist/core/providers/openrouter.js +269 -0
  73. package/dist/core/providers/openrouter.js.map +1 -0
  74. package/dist/core/providers/types.d.ts +101 -0
  75. package/dist/core/providers/types.d.ts.map +1 -0
  76. package/dist/core/providers/types.js +7 -0
  77. package/dist/core/providers/types.js.map +1 -0
  78. package/dist/core/tools/base.d.ts +56 -0
  79. package/dist/core/tools/base.d.ts.map +1 -0
  80. package/dist/core/tools/base.js +60 -0
  81. package/dist/core/tools/base.js.map +1 -0
  82. package/dist/core/tools/bash.d.ts +50 -0
  83. package/dist/core/tools/bash.d.ts.map +1 -0
  84. package/dist/core/tools/bash.js +179 -0
  85. package/dist/core/tools/bash.js.map +1 -0
  86. package/dist/core/tools/edit.d.ts +39 -0
  87. package/dist/core/tools/edit.d.ts.map +1 -0
  88. package/dist/core/tools/edit.js +67 -0
  89. package/dist/core/tools/edit.js.map +1 -0
  90. package/dist/core/tools/executor.d.ts +33 -0
  91. package/dist/core/tools/executor.d.ts.map +1 -0
  92. package/dist/core/tools/executor.js +105 -0
  93. package/dist/core/tools/executor.js.map +1 -0
  94. package/dist/core/tools/fetchPage.d.ts +46 -0
  95. package/dist/core/tools/fetchPage.d.ts.map +1 -0
  96. package/dist/core/tools/fetchPage.js +87 -0
  97. package/dist/core/tools/fetchPage.js.map +1 -0
  98. package/dist/core/tools/fetchURLs.d.ts +39 -0
  99. package/dist/core/tools/fetchURLs.d.ts.map +1 -0
  100. package/dist/core/tools/fetchURLs.js +67 -0
  101. package/dist/core/tools/fetchURLs.js.map +1 -0
  102. package/dist/core/tools/glob.d.ts +36 -0
  103. package/dist/core/tools/glob.d.ts.map +1 -0
  104. package/dist/core/tools/glob.js +78 -0
  105. package/dist/core/tools/glob.js.map +1 -0
  106. package/dist/core/tools/grep.d.ts +51 -0
  107. package/dist/core/tools/grep.d.ts.map +1 -0
  108. package/dist/core/tools/grep.js +152 -0
  109. package/dist/core/tools/grep.js.map +1 -0
  110. package/dist/core/tools/index.d.ts +22 -0
  111. package/dist/core/tools/index.d.ts.map +1 -0
  112. package/dist/core/tools/index.js +22 -0
  113. package/dist/core/tools/index.js.map +1 -0
  114. package/dist/core/tools/llmExecute.d.ts +153 -0
  115. package/dist/core/tools/llmExecute.d.ts.map +1 -0
  116. package/dist/core/tools/llmExecute.js +105 -0
  117. package/dist/core/tools/llmExecute.js.map +1 -0
  118. package/dist/core/tools/readEmail.d.ts +68 -0
  119. package/dist/core/tools/readEmail.d.ts.map +1 -0
  120. package/dist/core/tools/readEmail.js +182 -0
  121. package/dist/core/tools/readEmail.js.map +1 -0
  122. package/dist/core/tools/readFile.d.ts +42 -0
  123. package/dist/core/tools/readFile.d.ts.map +1 -0
  124. package/dist/core/tools/readFile.js +79 -0
  125. package/dist/core/tools/readFile.js.map +1 -0
  126. package/dist/core/tools/registry.d.ts +53 -0
  127. package/dist/core/tools/registry.d.ts.map +1 -0
  128. package/dist/core/tools/registry.js +112 -0
  129. package/dist/core/tools/registry.js.map +1 -0
  130. package/dist/core/tools/sendEmail.d.ts +83 -0
  131. package/dist/core/tools/sendEmail.d.ts.map +1 -0
  132. package/dist/core/tools/sendEmail.js +132 -0
  133. package/dist/core/tools/sendEmail.js.map +1 -0
  134. package/dist/core/tools/sendWebhook.d.ts +48 -0
  135. package/dist/core/tools/sendWebhook.d.ts.map +1 -0
  136. package/dist/core/tools/sendWebhook.js +61 -0
  137. package/dist/core/tools/sendWebhook.js.map +1 -0
  138. package/dist/core/tools/webSearch.d.ts +34 -0
  139. package/dist/core/tools/webSearch.d.ts.map +1 -0
  140. package/dist/core/tools/webSearch.js +104 -0
  141. package/dist/core/tools/webSearch.js.map +1 -0
  142. package/dist/core/tools/writeFile.d.ts +49 -0
  143. package/dist/core/tools/writeFile.d.ts.map +1 -0
  144. package/dist/core/tools/writeFile.js +120 -0
  145. package/dist/core/tools/writeFile.js.map +1 -0
  146. package/dist/db/client.d.ts +22 -0
  147. package/dist/db/client.d.ts.map +1 -0
  148. package/dist/db/client.js +178 -0
  149. package/dist/db/client.js.map +1 -0
  150. package/dist/db/schema.d.ts +1846 -0
  151. package/dist/db/schema.d.ts.map +1 -0
  152. package/dist/db/schema.js +175 -0
  153. package/dist/db/schema.js.map +1 -0
  154. package/dist/errors/index.d.ts +80 -0
  155. package/dist/errors/index.d.ts.map +1 -0
  156. package/dist/errors/index.js +135 -0
  157. package/dist/errors/index.js.map +1 -0
  158. package/dist/index.d.ts +52 -0
  159. package/dist/index.d.ts.map +1 -0
  160. package/dist/index.js +172 -0
  161. package/dist/index.js.map +1 -0
  162. package/dist/services/initDB.d.ts +17 -0
  163. package/dist/services/initDB.d.ts.map +1 -0
  164. package/dist/services/initDB.js +212 -0
  165. package/dist/services/initDB.js.map +1 -0
  166. package/dist/types/agent.d.ts +354 -0
  167. package/dist/types/agent.d.ts.map +1 -0
  168. package/dist/types/agent.js +63 -0
  169. package/dist/types/agent.js.map +1 -0
  170. package/dist/types/client.d.ts +309 -0
  171. package/dist/types/client.d.ts.map +1 -0
  172. package/dist/types/client.js +2 -0
  173. package/dist/types/client.js.map +1 -0
  174. package/dist/types/config.d.ts +96 -0
  175. package/dist/types/config.d.ts.map +1 -0
  176. package/dist/types/config.js +33 -0
  177. package/dist/types/config.js.map +1 -0
  178. package/dist/types/dag.d.ts +253 -0
  179. package/dist/types/dag.d.ts.map +1 -0
  180. package/dist/types/dag.js +46 -0
  181. package/dist/types/dag.js.map +1 -0
  182. package/dist/types/execution.d.ts +171 -0
  183. package/dist/types/execution.d.ts.map +1 -0
  184. package/dist/types/execution.js +41 -0
  185. package/dist/types/execution.js.map +1 -0
  186. package/dist/types/index.d.ts +12 -0
  187. package/dist/types/index.d.ts.map +1 -0
  188. package/dist/types/index.js +11 -0
  189. package/dist/types/index.js.map +1 -0
  190. package/dist/util/cron-validator.d.ts +16 -0
  191. package/dist/util/cron-validator.d.ts.map +1 -0
  192. package/dist/util/cron-validator.js +31 -0
  193. package/dist/util/cron-validator.js.map +1 -0
  194. package/dist/util/dag-utils.d.ts +54 -0
  195. package/dist/util/dag-utils.d.ts.map +1 -0
  196. package/dist/util/dag-utils.js +167 -0
  197. package/dist/util/dag-utils.js.map +1 -0
  198. package/dist/util/logger.d.ts +21 -0
  199. package/dist/util/logger.d.ts.map +1 -0
  200. package/dist/util/logger.js +87 -0
  201. package/dist/util/logger.js.map +1 -0
  202. package/package.json +82 -0
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Ollama LLM Provider
3
+ *
4
+ * Implements LLMProvider interface for Ollama (local LLM)
5
+ */
6
+ import { getLogger } from '../../util/logger.js';
7
+ import { LLMProviderError } from '../../errors/index.js';
8
+ /**
9
+ * Ollama Provider
10
+ */
11
+ export class OllamaProvider {
12
+ name = 'ollama';
13
+ baseUrl;
14
+ model;
15
+ logger = getLogger();
16
+ constructor(baseUrl = 'http://localhost:11434', model = 'mistral', _defaultMaxTokens = 4096) {
17
+ this.baseUrl = baseUrl.replace(/\/$/, ''); // Remove trailing slash
18
+ this.model = model;
19
+ void _defaultMaxTokens; // Not used by Ollama API
20
+ }
21
+ /**
22
+ * Validate if model supports tool calling
23
+ */
24
+ async validateToolCallSupport(model) {
25
+ // Ollama has limited tool calling support
26
+ // Most models don't support it natively
27
+ return {
28
+ supported: false,
29
+ message: `Ollama model ${model} has limited tool calling support. Recommended: OpenAI or OpenRouter for reliable tool use.`,
30
+ };
31
+ }
32
+ /**
33
+ * Simple chat call (no tools)
34
+ */
35
+ async chat(params) {
36
+ try {
37
+ const response = await fetch(`${this.baseUrl}/api/chat`, {
38
+ method: 'POST',
39
+ headers: { 'Content-Type': 'application/json' },
40
+ body: JSON.stringify({
41
+ model: this.model,
42
+ messages: params.messages,
43
+ stream: false,
44
+ temperature: params.temperature ?? 0.7,
45
+ }),
46
+ });
47
+ if (!response.ok) {
48
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
49
+ }
50
+ const data = (await response.json());
51
+ this.logger.debug(`Ollama chat response (${this.model}): ${data.message?.content?.length || 0} chars`);
52
+ return {
53
+ content: data.message?.content || '',
54
+ };
55
+ }
56
+ catch (error) {
57
+ throw new LLMProviderError(`Ollama chat call failed: ${error instanceof Error ? error.message : String(error)}`, 'ollama', error instanceof Error ? error : undefined);
58
+ }
59
+ }
60
+ /**
61
+ * Call with tool support (limited/not supported)
62
+ */
63
+ async callWithTools(params) {
64
+ // Ollama doesn't have good tool calling support
65
+ // Fall back to chat and try to parse tool calls from response
66
+ this.logger.warn('Ollama provider has limited tool calling support. Falling back to basic chat.');
67
+ const response = await this.chat({
68
+ messages: params.messages,
69
+ temperature: params.temperature,
70
+ maxTokens: params.maxTokens,
71
+ });
72
+ // Try to parse tool calls from response (basic heuristic)
73
+ const toolCalls = this.parseToolCallsFromText(response.content, params.tools);
74
+ return {
75
+ thought: response.content,
76
+ toolCalls,
77
+ finishReason: 'stop',
78
+ usage: undefined,
79
+ };
80
+ }
81
+ /**
82
+ * Basic tool call parsing from text (heuristic)
83
+ */
84
+ parseToolCallsFromText(content, tools) {
85
+ // This is a very basic implementation
86
+ // In production, you'd want more sophisticated parsing
87
+ const toolCalls = [];
88
+ for (const tool of tools) {
89
+ const pattern = new RegExp(`\\b${tool.name}\\s*\\(([^)]*)\\)`, 'gi');
90
+ const match = pattern.exec(content);
91
+ if (match) {
92
+ try {
93
+ // Try to parse arguments as JSON or simple key=value pairs
94
+ const argsStr = match[1];
95
+ const args = {};
96
+ if (argsStr.startsWith('{')) {
97
+ Object.assign(args, JSON.parse(argsStr));
98
+ }
99
+ else {
100
+ // Parse key=value pairs
101
+ const pairs = argsStr.split(',');
102
+ for (const pair of pairs) {
103
+ const [key, value] = pair.split('=').map((s) => s.trim());
104
+ if (key && value) {
105
+ args[key] = value.replace(/^["']|["']$/g, '');
106
+ }
107
+ }
108
+ }
109
+ toolCalls.push({
110
+ id: `${tool.name}_${Date.now()}`,
111
+ name: tool.name,
112
+ arguments: args,
113
+ });
114
+ }
115
+ catch {
116
+ // Skip if parsing fails
117
+ }
118
+ }
119
+ }
120
+ return toolCalls.length > 0 ? toolCalls : undefined;
121
+ }
122
+ }
123
+ //# sourceMappingURL=ollama.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../../src/core/providers/ollama.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * OpenAI LLM Provider
3
+ *
4
+ * Implements LLMProvider interface for OpenAI API
5
+ */
6
+ import type { LLMProvider, ChatParams, ChatResponse, LLMCallParams, LLMResponse } from './types.js';
7
+ /**
8
+ * OpenAI Provider
9
+ */
10
+ export declare class OpenAIProvider implements LLMProvider {
11
+ name: string;
12
+ private client;
13
+ private model;
14
+ private defaultMaxTokens;
15
+ private logger;
16
+ constructor(apiKey: string, model?: string, defaultMaxTokens?: number);
17
+ /**
18
+ * Validate if model supports tool calling
19
+ */
20
+ validateToolCallSupport(model: string): Promise<{
21
+ supported: boolean;
22
+ message?: string;
23
+ }>;
24
+ /**
25
+ * Simple chat call (no tools)
26
+ */
27
+ chat(params: ChatParams): Promise<ChatResponse>;
28
+ /**
29
+ * Call with tool support
30
+ */
31
+ callWithTools(params: LLMCallParams): Promise<LLMResponse>;
32
+ }
33
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/core/providers/openai.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,YAAY,EACZ,aAAa,EACb,WAAW,EACZ,MAAM,YAAY,CAAC;AAIpB;;GAEG;AACH,qBAAa,cAAe,YAAW,WAAW;IAChD,IAAI,SAAY;IAChB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,MAAM,CAAe;gBAG3B,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,MAAiB,EACxB,gBAAgB,GAAE,MAAa;IAWjC;;OAEG;IACG,uBAAuB,CAC3B,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAwBpD;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC;IAiCrD;;OAEG;IACG,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC;CAiDjE"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * OpenAI LLM Provider
3
+ *
4
+ * Implements LLMProvider interface for OpenAI API
5
+ */
6
+ import OpenAI from 'openai';
7
+ import { getLogger } from '../../util/logger.js';
8
+ import { LLMProviderError } from '../../errors/index.js';
9
+ /**
10
+ * OpenAI Provider
11
+ */
12
+ export class OpenAIProvider {
13
+ name = 'openai';
14
+ client;
15
+ model;
16
+ defaultMaxTokens;
17
+ logger = getLogger();
18
+ constructor(apiKey, model = 'gpt-4o', defaultMaxTokens = 4096) {
19
+ if (!apiKey) {
20
+ throw new Error('OpenAI API key is required');
21
+ }
22
+ this.client = new OpenAI({ apiKey });
23
+ this.model = model;
24
+ this.defaultMaxTokens = defaultMaxTokens;
25
+ }
26
+ /**
27
+ * Validate if model supports tool calling
28
+ */
29
+ async validateToolCallSupport(model) {
30
+ // Models that support function calling/tools
31
+ const toolSupportedModels = [
32
+ 'gpt-4',
33
+ 'gpt-4o',
34
+ 'gpt-4-turbo',
35
+ 'gpt-3.5-turbo',
36
+ ];
37
+ const normalizedModel = model.toLowerCase();
38
+ const supported = toolSupportedModels.some((m) => normalizedModel.includes(m));
39
+ if (!supported) {
40
+ return {
41
+ supported: false,
42
+ message: `Model ${model} may not support tool calling. Recommended models: ${toolSupportedModels.join(', ')}`,
43
+ };
44
+ }
45
+ return { supported: true };
46
+ }
47
+ /**
48
+ * Simple chat call (no tools)
49
+ */
50
+ async chat(params) {
51
+ try {
52
+ const response = await this.client.chat.completions.create({
53
+ model: this.model,
54
+ messages: params.messages,
55
+ temperature: params.temperature ?? 0.7,
56
+ max_tokens: params.maxTokens ?? this.defaultMaxTokens,
57
+ });
58
+ const content = response.choices[0]?.message.content || '';
59
+ const usage = response.usage
60
+ ? {
61
+ promptTokens: response.usage.prompt_tokens,
62
+ completionTokens: response.usage.completion_tokens,
63
+ totalTokens: response.usage.total_tokens,
64
+ }
65
+ : undefined;
66
+ this.logger.debug(`OpenAI chat response (${response.model}): ${content.length} chars`);
67
+ return { content, usage };
68
+ }
69
+ catch (error) {
70
+ throw new LLMProviderError(`OpenAI chat call failed: ${error instanceof Error ? error.message : String(error)}`, 'openai', error instanceof Error ? error : undefined);
71
+ }
72
+ }
73
+ /**
74
+ * Call with tool support
75
+ */
76
+ async callWithTools(params) {
77
+ try {
78
+ const response = await this.client.chat.completions.create({
79
+ model: this.model,
80
+ messages: params.messages,
81
+ tools: params.tools,
82
+ temperature: params.temperature ?? 0.7,
83
+ max_tokens: params.maxTokens ?? this.defaultMaxTokens,
84
+ });
85
+ const choice = response.choices[0];
86
+ const message = choice.message;
87
+ // Extract tool calls
88
+ const toolCalls = message.tool_calls?.map((tc) => ({
89
+ id: tc.id,
90
+ name: tc.function.name,
91
+ arguments: JSON.parse(tc.function.arguments || '{}'),
92
+ }));
93
+ const finishReason = choice.finish_reason === 'tool_calls' ? 'tool_calls' : 'stop';
94
+ const usage = response.usage
95
+ ? {
96
+ promptTokens: response.usage.prompt_tokens,
97
+ completionTokens: response.usage.completion_tokens,
98
+ totalTokens: response.usage.total_tokens,
99
+ }
100
+ : undefined;
101
+ this.logger.debug(`OpenAI callWithTools response: ${toolCalls?.length || 0} tool calls`);
102
+ return {
103
+ thought: message.content || '',
104
+ toolCalls,
105
+ finishReason,
106
+ usage,
107
+ };
108
+ }
109
+ catch (error) {
110
+ throw new LLMProviderError(`OpenAI API call failed: ${error instanceof Error ? error.message : String(error)}`, 'openai', error instanceof Error ? error : undefined);
111
+ }
112
+ }
113
+ }
114
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/core/providers/openai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * OpenRouter LLM Provider
3
+ *
4
+ * Implements LLMProvider interface for OpenRouter API (fetch-based)
5
+ * Adapted from asyncAgent's openrouter-fetch.ts
6
+ */
7
+ import type { LLMProvider, ChatParams, ChatResponse, LLMCallParams, LLMResponse } from './types.js';
8
+ /**
9
+ * OpenRouter Provider using native fetch
10
+ */
11
+ export declare class OpenRouterProvider implements LLMProvider {
12
+ name: string;
13
+ private apiKey;
14
+ private model;
15
+ private defaultMaxTokens;
16
+ private logger;
17
+ constructor(apiKey: string, model: string, defaultMaxTokens?: number);
18
+ /**
19
+ * Fetch generation stats from OpenRouter to get cost information
20
+ */
21
+ private extractGenerationId;
22
+ /**
23
+ * Validate if model supports tool calling via OpenRouter's API
24
+ */
25
+ validateToolCallSupport(model: string): Promise<{
26
+ supported: boolean;
27
+ message?: string;
28
+ }>;
29
+ /**
30
+ * Simple chat call (no tools)
31
+ */
32
+ chat(params: ChatParams): Promise<ChatResponse>;
33
+ /**
34
+ * Call with tool support
35
+ */
36
+ callWithTools(params: LLMCallParams): Promise<LLMResponse>;
37
+ }
38
+ //# sourceMappingURL=openrouter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openrouter.d.ts","sourceRoot":"","sources":["../../../src/core/providers/openrouter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,YAAY,EACZ,aAAa,EACb,WAAW,EAEZ,MAAM,YAAY,CAAC;AA6HpB;;GAEG;AACH,qBAAa,kBAAmB,YAAW,WAAW;IACpD,IAAI,SAAgB;IACpB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,MAAM,CAAe;gBAG3B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,gBAAgB,GAAE,MAAa;IAWjC;;OAEG;YACW,mBAAmB;IAqDjC;;OAEG;IACG,uBAAuB,CAC3B,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAsCpD;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC;IAgDrD;;OAEG;IACG,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC;CAiEjE"}
@@ -0,0 +1,269 @@
1
+ /**
2
+ * OpenRouter LLM Provider
3
+ *
4
+ * Implements LLMProvider interface for OpenRouter API (fetch-based)
5
+ * Adapted from asyncAgent's openrouter-fetch.ts
6
+ */
7
+ import { getLogger } from '../../util/logger.js';
8
+ import { LLMProviderError } from '../../errors/index.js';
9
+ const BASE_URL = 'https://openrouter.ai/api/v1';
10
+ const DEFAULT_TIMEOUT_MS = 60000;
11
+ function buildHeaders(apiKey) {
12
+ return {
13
+ 'Authorization': `Bearer ${apiKey}`,
14
+ 'Content-Type': 'application/json',
15
+ 'Accept': 'application/json',
16
+ 'HTTP-Referer': 'https://github.com/desiagent',
17
+ 'X-Title': 'DesiAgent',
18
+ };
19
+ }
20
+ async function handleApiError(res) {
21
+ try {
22
+ const body = await res.json();
23
+ const msg = body?.error?.message ?? `HTTP ${res.status}`;
24
+ const err = new Error(msg);
25
+ err.status = res.status;
26
+ err.code = body?.error?.code;
27
+ err.type = body?.error?.type;
28
+ throw err;
29
+ }
30
+ catch (parseError) {
31
+ const text = await res.text().catch(() => '');
32
+ const err = new Error(`HTTP ${res.status}: ${text || res.statusText}`);
33
+ err.status = res.status;
34
+ throw err;
35
+ }
36
+ }
37
+ function mapFinishReason(reason) {
38
+ switch (reason) {
39
+ case 'stop':
40
+ return 'stop';
41
+ case 'tool_calls':
42
+ return 'tool_calls';
43
+ case 'length':
44
+ return 'length';
45
+ case 'content_filter':
46
+ return 'content_filter';
47
+ default:
48
+ return 'stop';
49
+ }
50
+ }
51
+ function jsonParseSafe(s) {
52
+ try {
53
+ return JSON.parse(s);
54
+ }
55
+ catch {
56
+ return s;
57
+ }
58
+ }
59
+ function extractUsage(data) {
60
+ if (!data.usage)
61
+ return undefined;
62
+ return {
63
+ promptTokens: data.usage.prompt_tokens,
64
+ completionTokens: data.usage.completion_tokens,
65
+ totalTokens: data.usage.total_tokens,
66
+ };
67
+ }
68
+ function extractCostFromGenerationStats(generationStats) {
69
+ const totalCost = generationStats?.data?.total_cost;
70
+ if (totalCost !== undefined && totalCost !== null) {
71
+ return typeof totalCost === 'number' ? totalCost : parseFloat(totalCost);
72
+ }
73
+ return undefined;
74
+ }
75
+ async function fetchWithTimeout(url, init, timeoutMs = DEFAULT_TIMEOUT_MS) {
76
+ const controller = new AbortController();
77
+ const id = setTimeout(() => controller.abort(), timeoutMs);
78
+ try {
79
+ return await fetch(url, { ...init, signal: controller.signal });
80
+ }
81
+ finally {
82
+ clearTimeout(id);
83
+ }
84
+ }
85
+ /**
86
+ * OpenRouter Provider using native fetch
87
+ */
88
+ export class OpenRouterProvider {
89
+ name = 'openrouter';
90
+ apiKey;
91
+ model;
92
+ defaultMaxTokens;
93
+ logger = getLogger();
94
+ constructor(apiKey, model, defaultMaxTokens = 4096) {
95
+ if (!apiKey) {
96
+ throw new Error('OpenRouter API key is required');
97
+ }
98
+ this.apiKey = apiKey;
99
+ this.model = model;
100
+ this.defaultMaxTokens = defaultMaxTokens;
101
+ }
102
+ /**
103
+ * Fetch generation stats from OpenRouter to get cost information
104
+ */
105
+ async extractGenerationId(data, maxAttempts = 5, initialDelayMs = 500) {
106
+ const generationId = data.id;
107
+ this.logger.debug({ url: `${BASE_URL}/generation?id=${generationId}` }, 'Generation url');
108
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
109
+ try {
110
+ const delayMs = initialDelayMs * Math.pow(1.5, attempt - 1);
111
+ await new Promise(resolve => setTimeout(resolve, delayMs));
112
+ const res = await fetch(`${BASE_URL}/generation?id=${generationId}`, { headers: buildHeaders(this.apiKey) });
113
+ if (!res.ok) {
114
+ if (attempt === maxAttempts) {
115
+ this.logger.warn({ status: res.status, generationId, attempts: attempt }, 'Failed to fetch generation details after max attempts');
116
+ return { error: 'Failed to fetch details' };
117
+ }
118
+ this.logger.debug({ status: res.status, generationId, attempt }, 'Generation not ready, retrying...');
119
+ continue;
120
+ }
121
+ const details = await res.json();
122
+ const detailsData = details.data;
123
+ this.logger.debug({ generationId, attempt }, 'Successfully fetched generation details');
124
+ const stats = {};
125
+ const allowedKeys = ['latency', 'model', 'generation_time', 'finish_reason', 'native_finish_reason', 'total_cost', 'id'];
126
+ for (const key of allowedKeys) {
127
+ if (detailsData?.[key] !== undefined) {
128
+ stats[key] = detailsData[key];
129
+ }
130
+ }
131
+ return { data: stats };
132
+ }
133
+ catch (error) {
134
+ if (attempt === maxAttempts) {
135
+ this.logger.warn({ err: error, generationId, attempts: attempt }, 'Error fetching generation details after max attempts');
136
+ return { error: String(error) };
137
+ }
138
+ this.logger.debug({ err: error, generationId, attempt }, 'Error fetching generation, retrying...');
139
+ }
140
+ }
141
+ return { error: 'Max attempts reached' };
142
+ }
143
+ /**
144
+ * Validate if model supports tool calling via OpenRouter's API
145
+ */
146
+ async validateToolCallSupport(model) {
147
+ this.logger.debug({ model }, 'Validating model tool support');
148
+ try {
149
+ const res = await fetch(`${BASE_URL}/parameters/${model}`, {
150
+ headers: buildHeaders(this.apiKey),
151
+ });
152
+ if (!res.ok) {
153
+ if (res.status === 404) {
154
+ return {
155
+ supported: false,
156
+ message: `Model ${model} not found on OpenRouter`
157
+ };
158
+ }
159
+ this.logger.warn({ status: res.status }, 'Unable to verify model capabilities');
160
+ return { supported: true };
161
+ }
162
+ const data = await res.json();
163
+ const toolsSupported = data.supported_parameters?.includes('tools') ?? false;
164
+ this.logger.debug({ toolsSupported }, 'Model validation result');
165
+ if (!toolsSupported) {
166
+ return {
167
+ supported: false,
168
+ message: `Model ${model} does not support tool calling`
169
+ };
170
+ }
171
+ return { supported: true };
172
+ }
173
+ catch (error) {
174
+ this.logger.warn({ err: error }, 'OpenRouter validation check failed, assuming tool support');
175
+ return { supported: true };
176
+ }
177
+ }
178
+ /**
179
+ * Simple chat call (no tools)
180
+ */
181
+ async chat(params) {
182
+ try {
183
+ const requestBody = {
184
+ model: this.model,
185
+ messages: params.messages,
186
+ temperature: params.temperature ?? 0.7,
187
+ max_tokens: params.maxTokens ?? this.defaultMaxTokens,
188
+ };
189
+ const res = await fetchWithTimeout(`${BASE_URL}/chat/completions`, {
190
+ method: 'POST',
191
+ headers: buildHeaders(this.apiKey),
192
+ body: JSON.stringify(requestBody),
193
+ });
194
+ if (!res.ok) {
195
+ await handleApiError(res);
196
+ }
197
+ const data = await res.json();
198
+ const usage = extractUsage(data);
199
+ const content = data.choices[0]?.message?.content || '';
200
+ const generation_stats = await this.extractGenerationId(data);
201
+ const costUsd = extractCostFromGenerationStats(generation_stats);
202
+ if (usage) {
203
+ this.logger.debug({ usage, generation_stats, costUsd }, 'OpenRouter chat response metadata');
204
+ }
205
+ return {
206
+ content,
207
+ usage,
208
+ costUsd,
209
+ generationStats: generation_stats?.data,
210
+ };
211
+ }
212
+ catch (error) {
213
+ throw new LLMProviderError(`OpenRouter chat call failed: ${error instanceof Error ? error.message : String(error)}`, 'openrouter', error instanceof Error ? error : undefined);
214
+ }
215
+ }
216
+ /**
217
+ * Call with tool support
218
+ */
219
+ async callWithTools(params) {
220
+ try {
221
+ const requestBody = {
222
+ model: this.model,
223
+ messages: params.messages,
224
+ tools: params.tools,
225
+ temperature: params.temperature ?? 0.7,
226
+ max_tokens: params.maxTokens ?? this.defaultMaxTokens,
227
+ };
228
+ this.logger.debug({ model: this.model }, 'OpenRouter callWithTools request');
229
+ const res = await fetchWithTimeout(`${BASE_URL}/chat/completions`, {
230
+ method: 'POST',
231
+ headers: buildHeaders(this.apiKey),
232
+ body: JSON.stringify(requestBody),
233
+ });
234
+ if (!res.ok) {
235
+ await handleApiError(res);
236
+ }
237
+ const data = await res.json();
238
+ const usage = extractUsage(data);
239
+ const generation_stats = await this.extractGenerationId(data);
240
+ const costUsd = extractCostFromGenerationStats(generation_stats);
241
+ if (usage) {
242
+ this.logger.debug({ usage, generation_stats, costUsd }, 'OpenRouter callWithTools response metadata');
243
+ }
244
+ const choice = data.choices[0];
245
+ if (!choice) {
246
+ throw new Error('No choices in response');
247
+ }
248
+ const message = choice.message;
249
+ const thought = message.content || '';
250
+ const toolCalls = message.tool_calls?.map(tc => ({
251
+ id: tc.id,
252
+ name: tc.function.name,
253
+ arguments: jsonParseSafe(tc.function.arguments),
254
+ }));
255
+ return {
256
+ thought,
257
+ toolCalls,
258
+ finishReason: mapFinishReason(choice.finish_reason),
259
+ usage,
260
+ costUsd,
261
+ generationStats: generation_stats?.data,
262
+ };
263
+ }
264
+ catch (error) {
265
+ throw new LLMProviderError(`OpenRouter API call failed: ${error instanceof Error ? error.message : String(error)}`, 'openrouter', error instanceof Error ? error : undefined);
266
+ }
267
+ }
268
+ }
269
+ //# sourceMappingURL=openrouter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openrouter.js","sourceRoot":"","sources":["../../../src/core/providers/openrouter.ts"],"names":[],"mappings":"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"}