@cogitator-ai/core 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.
Files changed (191) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +76 -0
  3. package/dist/__tests__/agent.test.d.ts +2 -0
  4. package/dist/__tests__/agent.test.d.ts.map +1 -0
  5. package/dist/__tests__/agent.test.js +91 -0
  6. package/dist/__tests__/agent.test.js.map +1 -0
  7. package/dist/__tests__/base64.test.d.ts +2 -0
  8. package/dist/__tests__/base64.test.d.ts.map +1 -0
  9. package/dist/__tests__/base64.test.js +62 -0
  10. package/dist/__tests__/base64.test.js.map +1 -0
  11. package/dist/__tests__/calculator.test.d.ts +2 -0
  12. package/dist/__tests__/calculator.test.d.ts.map +1 -0
  13. package/dist/__tests__/calculator.test.js +146 -0
  14. package/dist/__tests__/calculator.test.js.map +1 -0
  15. package/dist/__tests__/cogitator-memory.test.d.ts +2 -0
  16. package/dist/__tests__/cogitator-memory.test.d.ts.map +1 -0
  17. package/dist/__tests__/cogitator-memory.test.js +176 -0
  18. package/dist/__tests__/cogitator-memory.test.js.map +1 -0
  19. package/dist/__tests__/datetime.test.d.ts +2 -0
  20. package/dist/__tests__/datetime.test.d.ts.map +1 -0
  21. package/dist/__tests__/datetime.test.js +87 -0
  22. package/dist/__tests__/datetime.test.js.map +1 -0
  23. package/dist/__tests__/exec.test.d.ts +2 -0
  24. package/dist/__tests__/exec.test.d.ts.map +1 -0
  25. package/dist/__tests__/exec.test.js +59 -0
  26. package/dist/__tests__/exec.test.js.map +1 -0
  27. package/dist/__tests__/filesystem.test.d.ts +2 -0
  28. package/dist/__tests__/filesystem.test.d.ts.map +1 -0
  29. package/dist/__tests__/filesystem.test.js +148 -0
  30. package/dist/__tests__/filesystem.test.js.map +1 -0
  31. package/dist/__tests__/google-backend.test.d.ts +5 -0
  32. package/dist/__tests__/google-backend.test.d.ts.map +1 -0
  33. package/dist/__tests__/google-backend.test.js +429 -0
  34. package/dist/__tests__/google-backend.test.js.map +1 -0
  35. package/dist/__tests__/hash.test.d.ts +2 -0
  36. package/dist/__tests__/hash.test.d.ts.map +1 -0
  37. package/dist/__tests__/hash.test.js +50 -0
  38. package/dist/__tests__/hash.test.js.map +1 -0
  39. package/dist/__tests__/http.test.d.ts +2 -0
  40. package/dist/__tests__/http.test.d.ts.map +1 -0
  41. package/dist/__tests__/http.test.js +64 -0
  42. package/dist/__tests__/http.test.js.map +1 -0
  43. package/dist/__tests__/json.test.d.ts +2 -0
  44. package/dist/__tests__/json.test.d.ts.map +1 -0
  45. package/dist/__tests__/json.test.js +65 -0
  46. package/dist/__tests__/json.test.js.map +1 -0
  47. package/dist/__tests__/logger.test.d.ts +2 -0
  48. package/dist/__tests__/logger.test.d.ts.map +1 -0
  49. package/dist/__tests__/logger.test.js +186 -0
  50. package/dist/__tests__/logger.test.js.map +1 -0
  51. package/dist/__tests__/random.test.d.ts +2 -0
  52. package/dist/__tests__/random.test.d.ts.map +1 -0
  53. package/dist/__tests__/random.test.js +81 -0
  54. package/dist/__tests__/random.test.js.map +1 -0
  55. package/dist/__tests__/regex.test.d.ts +2 -0
  56. package/dist/__tests__/regex.test.d.ts.map +1 -0
  57. package/dist/__tests__/regex.test.js +75 -0
  58. package/dist/__tests__/regex.test.js.map +1 -0
  59. package/dist/__tests__/registry.test.d.ts +2 -0
  60. package/dist/__tests__/registry.test.d.ts.map +1 -0
  61. package/dist/__tests__/registry.test.js +102 -0
  62. package/dist/__tests__/registry.test.js.map +1 -0
  63. package/dist/__tests__/sleep.test.d.ts +2 -0
  64. package/dist/__tests__/sleep.test.d.ts.map +1 -0
  65. package/dist/__tests__/sleep.test.js +29 -0
  66. package/dist/__tests__/sleep.test.js.map +1 -0
  67. package/dist/__tests__/tool.test.d.ts +2 -0
  68. package/dist/__tests__/tool.test.d.ts.map +1 -0
  69. package/dist/__tests__/tool.test.js +103 -0
  70. package/dist/__tests__/tool.test.js.map +1 -0
  71. package/dist/__tests__/uuid.test.d.ts +2 -0
  72. package/dist/__tests__/uuid.test.d.ts.map +1 -0
  73. package/dist/__tests__/uuid.test.js +37 -0
  74. package/dist/__tests__/uuid.test.js.map +1 -0
  75. package/dist/agent.d.ts +15 -0
  76. package/dist/agent.d.ts.map +1 -0
  77. package/dist/agent.js +35 -0
  78. package/dist/agent.js.map +1 -0
  79. package/dist/cogitator.d.ts +66 -0
  80. package/dist/cogitator.d.ts.map +1 -0
  81. package/dist/cogitator.js +538 -0
  82. package/dist/cogitator.js.map +1 -0
  83. package/dist/index.d.ts +19 -0
  84. package/dist/index.d.ts.map +1 -0
  85. package/dist/index.js +15 -0
  86. package/dist/index.js.map +1 -0
  87. package/dist/llm/anthropic.d.ts +19 -0
  88. package/dist/llm/anthropic.d.ts.map +1 -0
  89. package/dist/llm/anthropic.js +188 -0
  90. package/dist/llm/anthropic.js.map +1 -0
  91. package/dist/llm/base.d.ts +11 -0
  92. package/dist/llm/base.d.ts.map +1 -0
  93. package/dist/llm/base.js +9 -0
  94. package/dist/llm/base.js.map +1 -0
  95. package/dist/llm/google.d.ts +32 -0
  96. package/dist/llm/google.d.ts.map +1 -0
  97. package/dist/llm/google.js +282 -0
  98. package/dist/llm/google.js.map +1 -0
  99. package/dist/llm/index.d.ts +22 -0
  100. package/dist/llm/index.d.ts.map +1 -0
  101. package/dist/llm/index.js +67 -0
  102. package/dist/llm/index.js.map +1 -0
  103. package/dist/llm/ollama.d.ts +20 -0
  104. package/dist/llm/ollama.d.ts.map +1 -0
  105. package/dist/llm/ollama.js +134 -0
  106. package/dist/llm/ollama.js.map +1 -0
  107. package/dist/llm/openai.d.ts +21 -0
  108. package/dist/llm/openai.d.ts.map +1 -0
  109. package/dist/llm/openai.js +154 -0
  110. package/dist/llm/openai.js.map +1 -0
  111. package/dist/logger.d.ts +48 -0
  112. package/dist/logger.d.ts.map +1 -0
  113. package/dist/logger.js +118 -0
  114. package/dist/logger.js.map +1 -0
  115. package/dist/registry.d.ts +15 -0
  116. package/dist/registry.d.ts.map +1 -0
  117. package/dist/registry.js +31 -0
  118. package/dist/registry.js.map +1 -0
  119. package/dist/tool.d.ts +13 -0
  120. package/dist/tool.d.ts.map +1 -0
  121. package/dist/tool.js +44 -0
  122. package/dist/tool.js.map +1 -0
  123. package/dist/tools/base64.d.ts +23 -0
  124. package/dist/tools/base64.d.ts.map +1 -0
  125. package/dist/tools/base64.js +53 -0
  126. package/dist/tools/base64.js.map +1 -0
  127. package/dist/tools/calculator.d.ts +15 -0
  128. package/dist/tools/calculator.d.ts.map +1 -0
  129. package/dist/tools/calculator.js +193 -0
  130. package/dist/tools/calculator.js.map +1 -0
  131. package/dist/tools/datetime.d.ts +23 -0
  132. package/dist/tools/datetime.d.ts.map +1 -0
  133. package/dist/tools/datetime.js +95 -0
  134. package/dist/tools/datetime.js.map +1 -0
  135. package/dist/tools/exec.d.ts +46 -0
  136. package/dist/tools/exec.d.ts.map +1 -0
  137. package/dist/tools/exec.js +87 -0
  138. package/dist/tools/exec.js.map +1 -0
  139. package/dist/tools/filesystem.d.ts +100 -0
  140. package/dist/tools/filesystem.d.ts.map +1 -0
  141. package/dist/tools/filesystem.js +186 -0
  142. package/dist/tools/filesystem.js.map +1 -0
  143. package/dist/tools/hash.d.ts +19 -0
  144. package/dist/tools/hash.d.ts.map +1 -0
  145. package/dist/tools/hash.js +32 -0
  146. package/dist/tools/hash.js.map +1 -0
  147. package/dist/tools/http.d.ts +29 -0
  148. package/dist/tools/http.d.ts.map +1 -0
  149. package/dist/tools/http.js +82 -0
  150. package/dist/tools/http.js.map +1 -0
  151. package/dist/tools/index.d.ts +323 -0
  152. package/dist/tools/index.d.ts.map +1 -0
  153. package/dist/tools/index.js +50 -0
  154. package/dist/tools/index.js.map +1 -0
  155. package/dist/tools/json.d.ts +28 -0
  156. package/dist/tools/json.d.ts.map +1 -0
  157. package/dist/tools/json.js +42 -0
  158. package/dist/tools/json.js.map +1 -0
  159. package/dist/tools/random.d.ts +29 -0
  160. package/dist/tools/random.d.ts.map +1 -0
  161. package/dist/tools/random.js +56 -0
  162. package/dist/tools/random.js.map +1 -0
  163. package/dist/tools/regex.d.ts +43 -0
  164. package/dist/tools/regex.d.ts.map +1 -0
  165. package/dist/tools/regex.js +68 -0
  166. package/dist/tools/regex.js.map +1 -0
  167. package/dist/tools/sleep.d.ts +10 -0
  168. package/dist/tools/sleep.d.ts.map +1 -0
  169. package/dist/tools/sleep.js +25 -0
  170. package/dist/tools/sleep.js.map +1 -0
  171. package/dist/tools/uuid.d.ts +15 -0
  172. package/dist/tools/uuid.d.ts.map +1 -0
  173. package/dist/tools/uuid.js +25 -0
  174. package/dist/tools/uuid.js.map +1 -0
  175. package/dist/utils/circuit-breaker.d.ts +127 -0
  176. package/dist/utils/circuit-breaker.d.ts.map +1 -0
  177. package/dist/utils/circuit-breaker.js +235 -0
  178. package/dist/utils/circuit-breaker.js.map +1 -0
  179. package/dist/utils/fallback.d.ts +66 -0
  180. package/dist/utils/fallback.d.ts.map +1 -0
  181. package/dist/utils/fallback.js +99 -0
  182. package/dist/utils/fallback.js.map +1 -0
  183. package/dist/utils/index.d.ts +4 -0
  184. package/dist/utils/index.d.ts.map +1 -0
  185. package/dist/utils/index.js +4 -0
  186. package/dist/utils/index.js.map +1 -0
  187. package/dist/utils/retry.d.ts +51 -0
  188. package/dist/utils/retry.d.ts.map +1 -0
  189. package/dist/utils/retry.js +115 -0
  190. package/dist/utils/retry.js.map +1 -0
  191. package/package.json +56 -0
@@ -0,0 +1,188 @@
1
+ /**
2
+ * Anthropic LLM Backend
3
+ */
4
+ import Anthropic from '@anthropic-ai/sdk';
5
+ import { BaseLLMBackend } from './base';
6
+ export class AnthropicBackend extends BaseLLMBackend {
7
+ provider = 'anthropic';
8
+ client;
9
+ constructor(config) {
10
+ super();
11
+ this.client = new Anthropic({
12
+ apiKey: config.apiKey,
13
+ });
14
+ }
15
+ async chat(request) {
16
+ const { system, messages } = this.convertMessages(request.messages);
17
+ const tools = request.tools?.map((t) => ({
18
+ name: t.name,
19
+ description: t.description,
20
+ input_schema: t.parameters,
21
+ }));
22
+ const response = await this.client.messages.create({
23
+ model: request.model,
24
+ system,
25
+ messages,
26
+ tools,
27
+ max_tokens: request.maxTokens ?? 4096,
28
+ temperature: request.temperature,
29
+ top_p: request.topP,
30
+ stop_sequences: request.stop,
31
+ });
32
+ const toolCalls = [];
33
+ let content = '';
34
+ for (const block of response.content) {
35
+ if (block.type === 'text') {
36
+ content += block.text;
37
+ }
38
+ else if (block.type === 'tool_use') {
39
+ toolCalls.push({
40
+ id: block.id,
41
+ name: block.name,
42
+ arguments: block.input,
43
+ });
44
+ }
45
+ }
46
+ return {
47
+ id: response.id,
48
+ content,
49
+ toolCalls: toolCalls.length > 0 ? toolCalls : undefined,
50
+ finishReason: this.mapStopReason(response.stop_reason),
51
+ usage: {
52
+ inputTokens: response.usage.input_tokens,
53
+ outputTokens: response.usage.output_tokens,
54
+ totalTokens: response.usage.input_tokens + response.usage.output_tokens,
55
+ },
56
+ };
57
+ }
58
+ async *chatStream(request) {
59
+ const { system, messages } = this.convertMessages(request.messages);
60
+ const tools = request.tools?.map((t) => ({
61
+ name: t.name,
62
+ description: t.description,
63
+ input_schema: t.parameters,
64
+ }));
65
+ const stream = this.client.messages.stream({
66
+ model: request.model,
67
+ system,
68
+ messages,
69
+ tools,
70
+ max_tokens: request.maxTokens ?? 4096,
71
+ temperature: request.temperature,
72
+ top_p: request.topP,
73
+ stop_sequences: request.stop,
74
+ });
75
+ const id = this.generateId();
76
+ const toolCalls = [];
77
+ let currentToolCall = null;
78
+ let inputJson = '';
79
+ let inputTokens = 0;
80
+ let outputTokens = 0;
81
+ for await (const event of stream) {
82
+ if (event.type === 'message_start') {
83
+ inputTokens = event.message.usage.input_tokens;
84
+ }
85
+ else if (event.type === 'content_block_start') {
86
+ const block = event.content_block;
87
+ if (block.type === 'tool_use') {
88
+ currentToolCall = {
89
+ id: block.id,
90
+ name: block.name,
91
+ arguments: {},
92
+ };
93
+ inputJson = '';
94
+ }
95
+ }
96
+ else if (event.type === 'content_block_delta') {
97
+ const delta = event.delta;
98
+ if (delta.type === 'text_delta') {
99
+ yield {
100
+ id,
101
+ delta: { content: delta.text },
102
+ };
103
+ }
104
+ else if (delta.type === 'input_json_delta') {
105
+ inputJson += delta.partial_json;
106
+ }
107
+ }
108
+ else if (event.type === 'content_block_stop') {
109
+ if (currentToolCall) {
110
+ try {
111
+ currentToolCall.arguments = JSON.parse(inputJson);
112
+ }
113
+ catch {
114
+ currentToolCall.arguments = {};
115
+ }
116
+ toolCalls.push(currentToolCall);
117
+ currentToolCall = null;
118
+ }
119
+ }
120
+ else if (event.type === 'message_delta') {
121
+ outputTokens = event.usage.output_tokens;
122
+ }
123
+ else if (event.type === 'message_stop') {
124
+ yield {
125
+ id,
126
+ delta: {
127
+ toolCalls: toolCalls.length > 0 ? toolCalls : undefined,
128
+ },
129
+ finishReason: toolCalls.length > 0 ? 'tool_calls' : 'stop',
130
+ usage: {
131
+ inputTokens,
132
+ outputTokens,
133
+ totalTokens: inputTokens + outputTokens,
134
+ },
135
+ };
136
+ }
137
+ }
138
+ }
139
+ convertMessages(messages) {
140
+ let system = '';
141
+ const anthropicMessages = [];
142
+ for (const m of messages) {
143
+ switch (m.role) {
144
+ case 'system':
145
+ system = m.content;
146
+ break;
147
+ case 'user':
148
+ anthropicMessages.push({
149
+ role: 'user',
150
+ content: m.content,
151
+ });
152
+ break;
153
+ case 'assistant':
154
+ anthropicMessages.push({
155
+ role: 'assistant',
156
+ content: m.content,
157
+ });
158
+ break;
159
+ case 'tool':
160
+ anthropicMessages.push({
161
+ role: 'user',
162
+ content: [
163
+ {
164
+ type: 'tool_result',
165
+ tool_use_id: m.toolCallId ?? '',
166
+ content: m.content,
167
+ },
168
+ ],
169
+ });
170
+ break;
171
+ }
172
+ }
173
+ return { system, messages: anthropicMessages };
174
+ }
175
+ mapStopReason(reason) {
176
+ switch (reason) {
177
+ case 'end_turn':
178
+ return 'stop';
179
+ case 'tool_use':
180
+ return 'tool_calls';
181
+ case 'max_tokens':
182
+ return 'length';
183
+ default:
184
+ return 'stop';
185
+ }
186
+ }
187
+ }
188
+ //# sourceMappingURL=anthropic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/llm/anthropic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Base LLM Backend interface
3
+ */
4
+ import type { LLMBackend, LLMProvider, ChatRequest, ChatResponse, ChatStreamChunk } from '@cogitator-ai/types';
5
+ export declare abstract class BaseLLMBackend implements LLMBackend {
6
+ abstract readonly provider: LLMProvider;
7
+ abstract chat(request: ChatRequest): Promise<ChatResponse>;
8
+ abstract chatStream(request: ChatRequest): AsyncGenerator<ChatStreamChunk>;
9
+ protected generateId(): string;
10
+ }
11
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/llm/base.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,UAAU,EACV,WAAW,EACX,WAAW,EACX,YAAY,EACZ,eAAe,EAChB,MAAM,qBAAqB,CAAC;AAE7B,8BAAsB,cAAe,YAAW,UAAU;IACxD,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAExC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAE1D,QAAQ,CAAC,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,CAAC,eAAe,CAAC;IAE1E,SAAS,CAAC,UAAU,IAAI,MAAM;CAG/B"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Base LLM Backend interface
3
+ */
4
+ export class BaseLLMBackend {
5
+ generateId() {
6
+ return `chatcmpl-${Date.now().toString()}-${Math.random().toString(36).substring(7)}`;
7
+ }
8
+ }
9
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/llm/base.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH,MAAM,OAAgB,cAAc;IAOxB,UAAU;QAClB,OAAO,YAAY,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IACxF,CAAC;CACF"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Google Gemini LLM Backend
3
+ *
4
+ * Implements the Gemini API with full support for:
5
+ * - Chat completions
6
+ * - Tool/function calling
7
+ * - Streaming responses
8
+ * - Token counting
9
+ */
10
+ import type { ChatRequest, ChatResponse, ChatStreamChunk } from '@cogitator-ai/types';
11
+ import { BaseLLMBackend } from './base';
12
+ interface GoogleConfig {
13
+ apiKey: string;
14
+ baseUrl?: string;
15
+ }
16
+ export declare class GoogleBackend extends BaseLLMBackend {
17
+ readonly provider: "google";
18
+ private apiKey;
19
+ private baseUrl;
20
+ constructor(config: GoogleConfig);
21
+ chat(request: ChatRequest): Promise<ChatResponse>;
22
+ chatStream(request: ChatRequest): AsyncGenerator<ChatStreamChunk>;
23
+ private buildRequest;
24
+ private normalizeModel;
25
+ private convertMessages;
26
+ private parseToolResult;
27
+ private convertTool;
28
+ private parseResponse;
29
+ private mapFinishReason;
30
+ }
31
+ export {};
32
+ //# sourceMappingURL=google.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google.d.ts","sourceRoot":"","sources":["../../src/llm/google.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,eAAe,EAIhB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAExC,UAAU,YAAY;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAwED,qBAAa,aAAc,SAAQ,cAAc;IAC/C,QAAQ,CAAC,QAAQ,EAAG,QAAQ,CAAU;IACtC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,YAAY;IAM1B,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAuBhD,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,CAAC,eAAe,CAAC;IAmGxE,OAAO,CAAC,YAAY;IA+CpB,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,eAAe;IAwDvB,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,WAAW;IAYnB,OAAO,CAAC,aAAa;IAoCrB,OAAO,CAAC,eAAe;CAgBxB"}
@@ -0,0 +1,282 @@
1
+ /**
2
+ * Google Gemini LLM Backend
3
+ *
4
+ * Implements the Gemini API with full support for:
5
+ * - Chat completions
6
+ * - Tool/function calling
7
+ * - Streaming responses
8
+ * - Token counting
9
+ */
10
+ import { BaseLLMBackend } from './base';
11
+ export class GoogleBackend extends BaseLLMBackend {
12
+ provider = 'google';
13
+ apiKey;
14
+ baseUrl;
15
+ constructor(config) {
16
+ super();
17
+ this.apiKey = config.apiKey;
18
+ this.baseUrl = config.baseUrl ?? 'https://generativelanguage.googleapis.com/v1beta';
19
+ }
20
+ async chat(request) {
21
+ const { geminiRequest, model } = this.buildRequest(request);
22
+ const response = await fetch(`${this.baseUrl}/models/${model}:generateContent?key=${this.apiKey}`, {
23
+ method: 'POST',
24
+ headers: {
25
+ 'Content-Type': 'application/json',
26
+ },
27
+ body: JSON.stringify(geminiRequest),
28
+ });
29
+ if (!response.ok) {
30
+ const error = await response.text();
31
+ throw new Error(`Gemini API error: ${response.status} - ${error}`);
32
+ }
33
+ const data = (await response.json());
34
+ return this.parseResponse(data);
35
+ }
36
+ async *chatStream(request) {
37
+ const { geminiRequest, model } = this.buildRequest(request);
38
+ const response = await fetch(`${this.baseUrl}/models/${model}:streamGenerateContent?key=${this.apiKey}&alt=sse`, {
39
+ method: 'POST',
40
+ headers: {
41
+ 'Content-Type': 'application/json',
42
+ },
43
+ body: JSON.stringify(geminiRequest),
44
+ });
45
+ if (!response.ok) {
46
+ const error = await response.text();
47
+ throw new Error(`Gemini API error: ${response.status} - ${error}`);
48
+ }
49
+ const reader = response.body?.getReader();
50
+ if (!reader) {
51
+ throw new Error('No response body');
52
+ }
53
+ const decoder = new TextDecoder();
54
+ const id = this.generateId();
55
+ let buffer = '';
56
+ const accumulatedToolCalls = [];
57
+ let toolCallIndex = 0;
58
+ try {
59
+ while (true) {
60
+ const { done, value } = await reader.read();
61
+ if (done)
62
+ break;
63
+ buffer += decoder.decode(value, { stream: true });
64
+ const lines = buffer.split('\n');
65
+ buffer = lines.pop() ?? '';
66
+ for (const line of lines) {
67
+ if (line.startsWith('data: ')) {
68
+ const jsonStr = line.slice(6).trim();
69
+ if (!jsonStr || jsonStr === '[DONE]')
70
+ continue;
71
+ try {
72
+ const chunk = JSON.parse(jsonStr);
73
+ if (chunk.candidates?.[0]) {
74
+ const candidate = chunk.candidates[0];
75
+ const parts = candidate.content?.parts ?? [];
76
+ for (const part of parts) {
77
+ if ('text' in part) {
78
+ yield {
79
+ id,
80
+ delta: { content: part.text },
81
+ };
82
+ }
83
+ else if ('functionCall' in part) {
84
+ const toolCall = {
85
+ id: `call_${toolCallIndex++}`,
86
+ name: part.functionCall.name,
87
+ arguments: part.functionCall.args,
88
+ };
89
+ accumulatedToolCalls.push(toolCall);
90
+ }
91
+ }
92
+ if (candidate.finishReason) {
93
+ const finishReason = this.mapFinishReason(candidate.finishReason);
94
+ const streamChunk = {
95
+ id,
96
+ delta: {
97
+ toolCalls: accumulatedToolCalls.length > 0 ? accumulatedToolCalls : undefined,
98
+ },
99
+ finishReason,
100
+ };
101
+ if (chunk.usageMetadata) {
102
+ streamChunk.usage = {
103
+ inputTokens: chunk.usageMetadata.promptTokenCount,
104
+ outputTokens: chunk.usageMetadata.candidatesTokenCount,
105
+ totalTokens: chunk.usageMetadata.totalTokenCount,
106
+ };
107
+ }
108
+ yield streamChunk;
109
+ }
110
+ }
111
+ }
112
+ catch {
113
+ }
114
+ }
115
+ }
116
+ }
117
+ }
118
+ finally {
119
+ reader.releaseLock();
120
+ }
121
+ }
122
+ buildRequest(request) {
123
+ const model = this.normalizeModel(request.model);
124
+ const { systemInstruction, contents } = this.convertMessages(request.messages);
125
+ const geminiRequest = {
126
+ contents,
127
+ };
128
+ if (systemInstruction) {
129
+ geminiRequest.systemInstruction = {
130
+ parts: [{ text: systemInstruction }],
131
+ };
132
+ }
133
+ if (request.tools && request.tools.length > 0) {
134
+ geminiRequest.tools = [
135
+ {
136
+ functionDeclarations: request.tools.map((t) => this.convertTool(t)),
137
+ },
138
+ ];
139
+ }
140
+ geminiRequest.generationConfig = {};
141
+ if (request.temperature !== undefined) {
142
+ geminiRequest.generationConfig.temperature = request.temperature;
143
+ }
144
+ if (request.topP !== undefined) {
145
+ geminiRequest.generationConfig.topP = request.topP;
146
+ }
147
+ if (request.maxTokens !== undefined) {
148
+ geminiRequest.generationConfig.maxOutputTokens = request.maxTokens;
149
+ }
150
+ if (request.stop !== undefined) {
151
+ geminiRequest.generationConfig.stopSequences = request.stop;
152
+ }
153
+ if (Object.keys(geminiRequest.generationConfig).length === 0) {
154
+ delete geminiRequest.generationConfig;
155
+ }
156
+ return { geminiRequest, model };
157
+ }
158
+ normalizeModel(model) {
159
+ const modelMap = {
160
+ 'gemini-pro': 'gemini-1.5-pro',
161
+ 'gemini-flash': 'gemini-1.5-flash',
162
+ 'gemini-2-flash': 'gemini-2.0-flash',
163
+ 'gemini-2.5-flash': 'gemini-2.5-flash-preview-05-20',
164
+ 'gemini-2.5-pro': 'gemini-2.5-pro-preview-05-06',
165
+ };
166
+ return modelMap[model] ?? model;
167
+ }
168
+ convertMessages(messages) {
169
+ let systemInstruction = null;
170
+ const contents = [];
171
+ const pendingToolResults = new Map();
172
+ for (const msg of messages) {
173
+ switch (msg.role) {
174
+ case 'system':
175
+ systemInstruction = msg.content;
176
+ break;
177
+ case 'user':
178
+ contents.push({
179
+ role: 'user',
180
+ parts: [{ text: msg.content }],
181
+ });
182
+ break;
183
+ case 'assistant': {
184
+ const parts = [];
185
+ if (msg.content) {
186
+ parts.push({ text: msg.content });
187
+ }
188
+ if (parts.length > 0 || pendingToolResults.size === 0) {
189
+ contents.push({
190
+ role: 'model',
191
+ parts: parts.length > 0 ? parts : [{ text: '' }],
192
+ });
193
+ }
194
+ break;
195
+ }
196
+ case 'tool': {
197
+ const functionResponse = {
198
+ name: msg.name ?? '',
199
+ response: this.parseToolResult(msg.content),
200
+ };
201
+ contents.push({
202
+ role: 'user',
203
+ parts: [{ functionResponse }],
204
+ });
205
+ break;
206
+ }
207
+ }
208
+ }
209
+ return { systemInstruction, contents };
210
+ }
211
+ parseToolResult(content) {
212
+ try {
213
+ const parsed = JSON.parse(content);
214
+ if (typeof parsed === 'object' && parsed !== null) {
215
+ return parsed;
216
+ }
217
+ return { result: parsed };
218
+ }
219
+ catch {
220
+ return { result: content };
221
+ }
222
+ }
223
+ convertTool(tool) {
224
+ return {
225
+ name: tool.name,
226
+ description: tool.description,
227
+ parameters: {
228
+ type: 'object',
229
+ properties: tool.parameters.properties,
230
+ required: tool.parameters.required,
231
+ },
232
+ };
233
+ }
234
+ parseResponse(data) {
235
+ const candidate = data.candidates[0];
236
+ if (!candidate) {
237
+ throw new Error('No candidates in response');
238
+ }
239
+ const parts = candidate.content?.parts ?? [];
240
+ let content = '';
241
+ const toolCalls = [];
242
+ let toolCallIndex = 0;
243
+ for (const part of parts) {
244
+ if ('text' in part) {
245
+ content += part.text;
246
+ }
247
+ else if ('functionCall' in part) {
248
+ toolCalls.push({
249
+ id: `call_${toolCallIndex++}`,
250
+ name: part.functionCall.name,
251
+ arguments: part.functionCall.args,
252
+ });
253
+ }
254
+ }
255
+ return {
256
+ id: this.generateId(),
257
+ content,
258
+ toolCalls: toolCalls.length > 0 ? toolCalls : undefined,
259
+ finishReason: this.mapFinishReason(candidate.finishReason),
260
+ usage: {
261
+ inputTokens: data.usageMetadata.promptTokenCount,
262
+ outputTokens: data.usageMetadata.candidatesTokenCount,
263
+ totalTokens: data.usageMetadata.totalTokenCount,
264
+ },
265
+ };
266
+ }
267
+ mapFinishReason(reason) {
268
+ switch (reason) {
269
+ case 'STOP':
270
+ return 'stop';
271
+ case 'MAX_TOKENS':
272
+ return 'length';
273
+ case 'SAFETY':
274
+ case 'RECITATION':
275
+ case 'OTHER':
276
+ return 'error';
277
+ default:
278
+ return 'stop';
279
+ }
280
+ }
281
+ }
282
+ //# sourceMappingURL=google.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google.js","sourceRoot":"","sources":["../../src/llm/google.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * LLM Backends
3
+ */
4
+ export { BaseLLMBackend } from './base';
5
+ export { OllamaBackend } from './ollama';
6
+ export { OpenAIBackend } from './openai';
7
+ export { AnthropicBackend } from './anthropic';
8
+ export { GoogleBackend } from './google';
9
+ import type { LLMBackend, LLMProvider, CogitatorConfig } from '@cogitator-ai/types';
10
+ /**
11
+ * Create an LLM backend from configuration
12
+ */
13
+ export declare function createLLMBackend(provider: LLMProvider, config: CogitatorConfig['llm']): LLMBackend;
14
+ /**
15
+ * Parse model string to extract provider and model name
16
+ * e.g., "ollama/llama3.2:latest" -> { provider: "ollama", model: "llama3.2:latest" }
17
+ */
18
+ export declare function parseModel(modelString: string): {
19
+ provider: LLMProvider | null;
20
+ model: string;
21
+ };
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAMpF;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,WAAW,EACrB,MAAM,EAAE,eAAe,CAAC,KAAK,CAAC,GAC7B,UAAU,CA0CZ;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG;IAC/C,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;CACf,CASA"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * LLM Backends
3
+ */
4
+ export { BaseLLMBackend } from './base';
5
+ export { OllamaBackend } from './ollama';
6
+ export { OpenAIBackend } from './openai';
7
+ export { AnthropicBackend } from './anthropic';
8
+ export { GoogleBackend } from './google';
9
+ import { OllamaBackend } from './ollama';
10
+ import { OpenAIBackend } from './openai';
11
+ import { AnthropicBackend } from './anthropic';
12
+ import { GoogleBackend } from './google';
13
+ /**
14
+ * Create an LLM backend from configuration
15
+ */
16
+ export function createLLMBackend(provider, config) {
17
+ const providers = config?.providers ?? {};
18
+ switch (provider) {
19
+ case 'ollama':
20
+ return new OllamaBackend({
21
+ baseUrl: providers.ollama?.baseUrl ?? 'http://localhost:11434',
22
+ });
23
+ case 'openai':
24
+ if (!providers.openai?.apiKey) {
25
+ throw new Error('OpenAI API key is required');
26
+ }
27
+ return new OpenAIBackend({
28
+ apiKey: providers.openai.apiKey,
29
+ baseUrl: providers.openai.baseUrl,
30
+ });
31
+ case 'anthropic':
32
+ if (!providers.anthropic?.apiKey) {
33
+ throw new Error('Anthropic API key is required');
34
+ }
35
+ return new AnthropicBackend({
36
+ apiKey: providers.anthropic.apiKey,
37
+ });
38
+ case 'google':
39
+ if (!providers.google?.apiKey) {
40
+ throw new Error('Google API key is required');
41
+ }
42
+ return new GoogleBackend({
43
+ apiKey: providers.google.apiKey,
44
+ });
45
+ case 'vllm':
46
+ throw new Error(`Provider ${provider} not yet implemented`);
47
+ default: {
48
+ const _exhaustive = provider;
49
+ throw new Error(`Unknown provider: ${_exhaustive}`);
50
+ }
51
+ }
52
+ }
53
+ /**
54
+ * Parse model string to extract provider and model name
55
+ * e.g., "ollama/llama3.2:latest" -> { provider: "ollama", model: "llama3.2:latest" }
56
+ */
57
+ export function parseModel(modelString) {
58
+ if (modelString.includes('/')) {
59
+ const [provider, ...rest] = modelString.split('/');
60
+ return {
61
+ provider: provider,
62
+ model: rest.join('/'),
63
+ };
64
+ }
65
+ return { provider: null, model: modelString };
66
+ }
67
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,QAAqB,EACrB,MAA8B;IAE9B,MAAM,SAAS,GAAG,MAAM,EAAE,SAAS,IAAI,EAAE,CAAC;IAE1C,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,IAAI,aAAa,CAAC;gBACvB,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE,OAAO,IAAI,wBAAwB;aAC/D,CAAC,CAAC;QAEL,KAAK,QAAQ;YACX,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;gBAC9B,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAChD,CAAC;YACD,OAAO,IAAI,aAAa,CAAC;gBACvB,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM;gBAC/B,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,OAAO;aAClC,CAAC,CAAC;QAEL,KAAK,WAAW;YACd,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;gBACjC,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;YACnD,CAAC;YACD,OAAO,IAAI,gBAAgB,CAAC;gBAC1B,MAAM,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM;aACnC,CAAC,CAAC;QAEL,KAAK,QAAQ;YACX,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;gBAC9B,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAChD,CAAC;YACD,OAAO,IAAI,aAAa,CAAC;gBACvB,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM;aAChC,CAAC,CAAC;QAEL,KAAK,MAAM;YACT,MAAM,IAAI,KAAK,CAAC,YAAY,QAAQ,sBAAsB,CAAC,CAAC;QAE9D,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,WAAW,GAAU,QAAQ,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,qBAAqB,WAAqB,EAAE,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,WAAmB;IAI5C,IAAI,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9B,MAAM,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnD,OAAO;YACL,QAAQ,EAAE,QAAuB;YACjC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;SACtB,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;AAChD,CAAC"}