genaicode 0.0.35 → 0.1.1

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 (229) hide show
  1. package/README.md +3 -0
  2. package/bin/genaicode-dev.js +11 -0
  3. package/bin/genaicode.cjs +8 -1
  4. package/dist/ai-service/ai-studio.d.ts +5 -0
  5. package/dist/ai-service/ai-studio.js +135 -0
  6. package/dist/ai-service/ai-studio.js.map +1 -0
  7. package/dist/ai-service/anthropic.d.ts +5 -0
  8. package/dist/ai-service/anthropic.js +133 -0
  9. package/dist/ai-service/anthropic.js.map +1 -0
  10. package/dist/ai-service/chat-gpt.d.ts +5 -0
  11. package/dist/ai-service/chat-gpt.js +131 -0
  12. package/dist/ai-service/chat-gpt.js.map +1 -0
  13. package/dist/ai-service/common.d.ts +57 -0
  14. package/dist/ai-service/common.js +38 -0
  15. package/dist/ai-service/common.js.map +1 -0
  16. package/dist/ai-service/common.test.d.ts +1 -0
  17. package/dist/ai-service/common.test.js +85 -0
  18. package/dist/ai-service/common.test.js.map +1 -0
  19. package/dist/ai-service/dall-e.d.ts +14 -0
  20. package/dist/ai-service/dall-e.js +47 -0
  21. package/dist/ai-service/dall-e.js.map +1 -0
  22. package/dist/ai-service/vertex-ai-claude.d.ts +5 -0
  23. package/dist/ai-service/vertex-ai-claude.js +93 -0
  24. package/dist/ai-service/vertex-ai-claude.js.map +1 -0
  25. package/dist/ai-service/vertex-ai-imagen.d.ts +14 -0
  26. package/dist/ai-service/vertex-ai-imagen.js +74 -0
  27. package/dist/ai-service/vertex-ai-imagen.js.map +1 -0
  28. package/dist/ai-service/vertex-ai.d.ts +7 -0
  29. package/dist/ai-service/vertex-ai.js +147 -0
  30. package/dist/ai-service/vertex-ai.js.map +1 -0
  31. package/dist/cli/cli-options.d.ts +10 -0
  32. package/dist/cli/cli-options.js +124 -0
  33. package/dist/cli/cli-options.js.map +1 -0
  34. package/dist/cli/cli-options.test.d.ts +1 -0
  35. package/dist/cli/cli-options.test.js +34 -0
  36. package/dist/cli/cli-options.test.js.map +1 -0
  37. package/dist/cli/cli-params.d.ts +29 -0
  38. package/dist/cli/cli-params.js +103 -0
  39. package/dist/cli/cli-params.js.map +1 -0
  40. package/dist/cli/cli-params.test.d.ts +1 -0
  41. package/dist/cli/cli-params.test.js +38 -0
  42. package/dist/cli/cli-params.test.js.map +1 -0
  43. package/dist/cli/service-autodetect.d.ts +2 -0
  44. package/dist/cli/service-autodetect.js +17 -0
  45. package/dist/cli/service-autodetect.js.map +1 -0
  46. package/dist/cli/service-autodetect.test.d.ts +1 -0
  47. package/dist/cli/service-autodetect.test.js +38 -0
  48. package/dist/cli/service-autodetect.test.js.map +1 -0
  49. package/dist/cli/validate-cli-params.d.ts +18 -0
  50. package/dist/cli/validate-cli-params.js +128 -0
  51. package/dist/cli/validate-cli-params.js.map +1 -0
  52. package/dist/cli/validate-cli-params.test.d.ts +1 -0
  53. package/dist/cli/validate-cli-params.test.js +106 -0
  54. package/dist/cli/validate-cli-params.test.js.map +1 -0
  55. package/dist/files/file-utils.d.ts +2 -0
  56. package/dist/files/file-utils.js +7 -0
  57. package/dist/files/file-utils.js.map +1 -0
  58. package/dist/files/file-utils.test.d.ts +1 -0
  59. package/dist/files/file-utils.test.js +18 -0
  60. package/dist/files/file-utils.test.js.map +1 -0
  61. package/dist/files/find-files.d.ts +8 -0
  62. package/dist/files/find-files.js +76 -0
  63. package/dist/files/find-files.js.map +1 -0
  64. package/dist/files/read-files.d.ts +13 -0
  65. package/dist/files/read-files.js +61 -0
  66. package/dist/files/read-files.js.map +1 -0
  67. package/dist/files/read-files.test.d.ts +1 -0
  68. package/dist/files/read-files.test.js +89 -0
  69. package/dist/files/read-files.test.js.map +1 -0
  70. package/dist/files/temp-buffer.d.ts +2 -0
  71. package/dist/files/temp-buffer.js +12 -0
  72. package/dist/files/temp-buffer.js.map +1 -0
  73. package/dist/files/update-files.d.ts +5 -0
  74. package/dist/files/update-files.js +197 -0
  75. package/dist/files/update-files.js.map +1 -0
  76. package/dist/images/ensure-alpha.d.ts +1 -0
  77. package/dist/images/ensure-alpha.js +5 -0
  78. package/dist/images/ensure-alpha.js.map +1 -0
  79. package/dist/images/imgly-remove-background.d.ts +2 -0
  80. package/dist/images/imgly-remove-background.js +21 -0
  81. package/dist/images/imgly-remove-background.js.map +1 -0
  82. package/dist/images/resize-image.d.ts +19 -0
  83. package/dist/images/resize-image.js +22 -0
  84. package/dist/images/resize-image.js.map +1 -0
  85. package/dist/images/split-image.d.ts +18 -0
  86. package/dist/images/split-image.js +25 -0
  87. package/dist/images/split-image.js.map +1 -0
  88. package/dist/main/codegen.d.ts +2 -0
  89. package/dist/main/codegen.js +101 -0
  90. package/dist/main/codegen.js.map +1 -0
  91. package/dist/main/codegen.test.d.ts +2 -0
  92. package/dist/main/codegen.test.js +259 -0
  93. package/dist/main/codegen.test.js.map +1 -0
  94. package/dist/main/config-lib.d.ts +8 -0
  95. package/dist/main/config-lib.js +28 -0
  96. package/dist/main/config-lib.js.map +1 -0
  97. package/dist/main/config-lib.test.d.ts +1 -0
  98. package/dist/main/config-lib.test.js +64 -0
  99. package/dist/main/config-lib.test.js.map +1 -0
  100. package/dist/main/config.d.ts +5 -0
  101. package/{src → dist}/main/config.js +16 -22
  102. package/dist/main/config.js.map +1 -0
  103. package/dist/prompt/function-calling-validate.d.ts +3 -0
  104. package/dist/prompt/function-calling-validate.js +27 -0
  105. package/dist/prompt/function-calling-validate.js.map +1 -0
  106. package/dist/prompt/function-calling.d.ts +5 -0
  107. package/dist/prompt/function-calling.js +48 -0
  108. package/dist/prompt/function-calling.js.map +1 -0
  109. package/dist/prompt/function-defs/ask-question.d.ts +31 -0
  110. package/dist/prompt/function-defs/ask-question.js +32 -0
  111. package/dist/prompt/function-defs/ask-question.js.map +1 -0
  112. package/dist/prompt/function-defs/codegen-summary.d.ts +63 -0
  113. package/dist/prompt/function-defs/codegen-summary.js +80 -0
  114. package/dist/prompt/function-defs/codegen-summary.js.map +1 -0
  115. package/dist/prompt/function-defs/create-directory.d.ts +21 -0
  116. package/dist/prompt/function-defs/create-directory.js +22 -0
  117. package/dist/prompt/function-defs/create-directory.js.map +1 -0
  118. package/dist/prompt/function-defs/create-file.d.ts +25 -0
  119. package/dist/prompt/function-defs/create-file.js +26 -0
  120. package/dist/prompt/function-defs/create-file.js.map +1 -0
  121. package/dist/prompt/function-defs/delete-file.d.ts +21 -0
  122. package/dist/prompt/function-defs/delete-file.js +22 -0
  123. package/dist/prompt/function-defs/delete-file.js.map +1 -0
  124. package/dist/prompt/function-defs/download-file.d.ts +25 -0
  125. package/dist/prompt/function-defs/download-file.js +26 -0
  126. package/dist/prompt/function-defs/download-file.js.map +1 -0
  127. package/dist/prompt/function-defs/explanation.d.ts +17 -0
  128. package/dist/prompt/function-defs/explanation.js +18 -0
  129. package/dist/prompt/function-defs/explanation.js.map +1 -0
  130. package/dist/prompt/function-defs/generate-image.d.ts +48 -0
  131. package/dist/prompt/function-defs/generate-image.js +49 -0
  132. package/dist/prompt/function-defs/generate-image.js.map +1 -0
  133. package/dist/prompt/function-defs/get-image-assets.d.ts +20 -0
  134. package/dist/prompt/function-defs/get-image-assets.js +21 -0
  135. package/dist/prompt/function-defs/get-image-assets.js.map +1 -0
  136. package/dist/prompt/function-defs/get-source-code.d.ts +20 -0
  137. package/dist/prompt/function-defs/get-source-code.js +21 -0
  138. package/dist/prompt/function-defs/get-source-code.js.map +1 -0
  139. package/dist/prompt/function-defs/imgly-remove-background.d.ts +25 -0
  140. package/dist/prompt/function-defs/imgly-remove-background.js +26 -0
  141. package/dist/prompt/function-defs/imgly-remove-background.js.map +1 -0
  142. package/dist/prompt/function-defs/move-file.d.ts +25 -0
  143. package/dist/prompt/function-defs/move-file.js +26 -0
  144. package/dist/prompt/function-defs/move-file.js.map +1 -0
  145. package/dist/prompt/function-defs/patch-file.d.ts +25 -0
  146. package/dist/prompt/function-defs/patch-file.js +39 -0
  147. package/dist/prompt/function-defs/patch-file.js.map +1 -0
  148. package/dist/prompt/function-defs/resize-image.d.ts +36 -0
  149. package/dist/prompt/function-defs/resize-image.js +37 -0
  150. package/dist/prompt/function-defs/resize-image.js.map +1 -0
  151. package/dist/prompt/function-defs/split-image.d.ts +57 -0
  152. package/dist/prompt/function-defs/split-image.js +46 -0
  153. package/dist/prompt/function-defs/split-image.js.map +1 -0
  154. package/dist/prompt/function-defs/update-file.d.ts +25 -0
  155. package/dist/prompt/function-defs/update-file.js +26 -0
  156. package/dist/prompt/function-defs/update-file.js.map +1 -0
  157. package/dist/prompt/limits.d.ts +3 -0
  158. package/dist/prompt/limits.js +19 -0
  159. package/dist/prompt/limits.js.map +1 -0
  160. package/dist/prompt/limits.test.d.ts +1 -0
  161. package/dist/prompt/limits.test.js +35 -0
  162. package/dist/prompt/limits.test.js.map +1 -0
  163. package/dist/prompt/prompt-codegen.d.ts +4 -0
  164. package/dist/prompt/prompt-codegen.js +81 -0
  165. package/dist/prompt/prompt-codegen.js.map +1 -0
  166. package/dist/prompt/prompt-codegen.test.d.ts +1 -0
  167. package/dist/prompt/prompt-codegen.test.js +94 -0
  168. package/dist/prompt/prompt-codegen.test.js.map +1 -0
  169. package/dist/prompt/prompt-consts.d.ts +1 -0
  170. package/{src → dist}/prompt/prompt-consts.js +1 -0
  171. package/dist/prompt/prompt-consts.js.map +1 -0
  172. package/dist/prompt/prompt-service-ask-question.test.d.ts +3 -0
  173. package/dist/prompt/prompt-service-ask-question.test.js +146 -0
  174. package/dist/prompt/prompt-service-ask-question.test.js.map +1 -0
  175. package/dist/prompt/prompt-service.d.ts +13 -0
  176. package/dist/prompt/prompt-service.js +278 -0
  177. package/dist/prompt/prompt-service.js.map +1 -0
  178. package/dist/prompt/prompt-service.test.d.ts +1 -0
  179. package/dist/prompt/prompt-service.test.js +511 -0
  180. package/dist/prompt/prompt-service.test.js.map +1 -0
  181. package/dist/prompt/systemprompt.d.ts +2 -0
  182. package/dist/prompt/systemprompt.js +43 -0
  183. package/dist/prompt/systemprompt.js.map +1 -0
  184. package/dist/prompt/systemprompt.test.d.ts +2 -0
  185. package/dist/prompt/systemprompt.test.js +47 -0
  186. package/dist/prompt/systemprompt.test.js.map +1 -0
  187. package/package.json +15 -5
  188. package/bin/genaicode.js +0 -5
  189. package/src/ai-service/anthropic.js +0 -95
  190. package/src/ai-service/chat-gpt.js +0 -99
  191. package/src/ai-service/common.js +0 -40
  192. package/src/ai-service/common.test.js +0 -107
  193. package/src/ai-service/dall-e.js +0 -50
  194. package/src/ai-service/vertex-ai-claude.js +0 -99
  195. package/src/ai-service/vertex-ai-imagen.js +0 -78
  196. package/src/ai-service/vertex-ai.js +0 -156
  197. package/src/cli/cli-options.js +0 -120
  198. package/src/cli/cli-options.test.js +0 -50
  199. package/src/cli/cli-params.js +0 -99
  200. package/src/cli/cli-params.test.js +0 -43
  201. package/src/cli/service-autodetect.js +0 -11
  202. package/src/cli/service-autodetect.test.js +0 -43
  203. package/src/cli/validate-cli-params.js +0 -117
  204. package/src/cli/validate-cli-params.test.js +0 -134
  205. package/src/files/file-utils.js +0 -7
  206. package/src/files/file-utils.test.js +0 -21
  207. package/src/files/find-files.js +0 -86
  208. package/src/files/read-files.js +0 -60
  209. package/src/files/read-files.test.js +0 -102
  210. package/src/files/temp-buffer.js +0 -13
  211. package/src/files/update-files.js +0 -205
  212. package/src/images/ensure-alpha.js +0 -5
  213. package/src/images/imgly-remove-background.js +0 -23
  214. package/src/images/resize-image.js +0 -23
  215. package/src/images/split-image.js +0 -26
  216. package/src/main/codegen.js +0 -120
  217. package/src/main/codegen.test.js +0 -334
  218. package/src/main/config-lib.js +0 -33
  219. package/src/main/config-lib.test.js +0 -80
  220. package/src/prompt/function-calling-validate.js +0 -25
  221. package/src/prompt/function-calling.js +0 -454
  222. package/src/prompt/limits.js +0 -23
  223. package/src/prompt/limits.test.js +0 -40
  224. package/src/prompt/prompt-codegen.js +0 -106
  225. package/src/prompt/prompt-codegen.test.js +0 -116
  226. package/src/prompt/prompt-service.js +0 -287
  227. package/src/prompt/prompt-service.test.js +0 -601
  228. package/src/prompt/systemprompt.js +0 -32
  229. package/src/prompt/systemprompt.test.js +0 -63
package/README.md CHANGED
@@ -79,6 +79,9 @@ GenAIcode supports various command-line options to customize its behavior:
79
79
  - `--imagen`: Enables image generation capabilities using AI models.
80
80
  - `--cheap`: Uses a cheaper, faster model for code generation, which may provide lower quality results but is more cost-effective for simpler tasks.
81
81
  - `--content-mask=<path>`: Applies a content mask to limit the initial source code files included in the request. The value should be a prefix of the path relative to rootDir.
82
+ - `--ignore-pattern="glob/regex"`: Specify a pattern of files to ignore during the initial source code fetching. This saves initial token usage.
83
+ - `--ask-question`: Allows the AI assistant to ask questions for clarification during the code generation process.
84
+ - `--disable-cache`: Disables caching for the application, which can be useful if caching is causing issues or if you want to ensure fresh data is used for each operation.
82
85
  - `--help`: Displays the help message with all available options.
83
86
 
84
87
  ## Configuration (.genaicoderc)
@@ -0,0 +1,11 @@
1
+ import url from 'node:url';
2
+ import { register } from 'node:module';
3
+ import path from 'path';
4
+
5
+ const __filename = url.fileURLToPath(import.meta.url);
6
+ register('ts-node/esm', url.pathToFileURL(__filename));
7
+
8
+ const project = path.resolve('./tsconfig.json');
9
+ (await import('ts-node')).register({ project });
10
+
11
+ (await import('../src/main/codegen.ts')).runCodegen();
package/bin/genaicode.cjs CHANGED
@@ -5,4 +5,11 @@ const pleaseUpgradeNode = require('please-upgrade-node');
5
5
  const pkg = require('../package.json');
6
6
  pleaseUpgradeNode(pkg);
7
7
 
8
- import('../src/main/codegen.js').then(({ runCodegen }) => runCodegen());
8
+ const devMode = require('fs').existsSync(`${__dirname}/../src`);
9
+ const forceDist = process.argv.indexOf('--force-dist') >= 0;
10
+
11
+ if (devMode && !forceDist) {
12
+ import('./genaicode-dev.js');
13
+ } else {
14
+ import('../dist/main/codegen.js').then(({ runCodegen }) => runCodegen());
15
+ }
@@ -0,0 +1,5 @@
1
+ import { FunctionCall, FunctionDef, PromptItem } from './common.js';
2
+ /**
3
+ * This function generates content using the Anthropic Claude model via Vertex AI.
4
+ */
5
+ export declare function generateContent(prompt: PromptItem[], functionDefs: FunctionDef[], requiredFunctionName: string | null, temperature: number, cheap?: boolean): Promise<FunctionCall[]>;
@@ -0,0 +1,135 @@
1
+ import { FunctionCallingMode, GoogleGenerativeAI, HarmBlockThreshold, HarmCategory, } from '@google/generative-ai';
2
+ import assert from 'node:assert';
3
+ import { geminiBlockNone } from '../cli/cli-params.js';
4
+ import { printTokenUsageAndCost, processFunctionCalls } from './common.js';
5
+ /**
6
+ * This function generates content using the Anthropic Claude model via Vertex AI.
7
+ */
8
+ export async function generateContent(prompt, functionDefs, requiredFunctionName, temperature, cheap = false) {
9
+ const messages = prompt
10
+ .filter((item) => item.type === 'user' || item.type === 'assistant')
11
+ .map((item) => {
12
+ if (item.type === 'user') {
13
+ const content = {
14
+ role: 'user',
15
+ parts: [
16
+ ...(item.functionResponses ?? []).map((response) => ({
17
+ functionResponse: {
18
+ name: response.name,
19
+ response: { name: response.name, content: response.content },
20
+ },
21
+ })),
22
+ ...(item.images ?? []).map((image) => ({
23
+ inlineData: {
24
+ mimeType: image.mediaType,
25
+ data: image.base64url,
26
+ },
27
+ })),
28
+ { text: item.text },
29
+ ],
30
+ };
31
+ return content;
32
+ }
33
+ else {
34
+ assert(item.type === 'assistant');
35
+ const content = {
36
+ role: 'model',
37
+ parts: [
38
+ ...(item.text ? [{ text: item.text }] : []),
39
+ ...item.functionCalls.map((call) => ({
40
+ functionCall: {
41
+ name: call.name,
42
+ args: call.args ?? {},
43
+ },
44
+ })),
45
+ ],
46
+ };
47
+ return content;
48
+ }
49
+ });
50
+ const req = {
51
+ contents: messages,
52
+ tools: [
53
+ {
54
+ functionDeclarations: functionDefs,
55
+ },
56
+ ],
57
+ toolConfig: {
58
+ functionCallingConfig: {
59
+ mode: cheap ? undefined : FunctionCallingMode.ANY,
60
+ ...(!cheap && requiredFunctionName ? { allowedFunctionNames: [requiredFunctionName] } : {}),
61
+ },
62
+ },
63
+ };
64
+ const model = getModel(cheap ? 'gemini-1.5-flash-001' : 'gemini-1.5-pro-001', temperature, prompt.find((item) => item.type === 'systemPrompt').systemPrompt);
65
+ const result = await model.generateContent(req);
66
+ // Print token usage
67
+ const usageMetadata = result.response.usageMetadata;
68
+ const usage = {
69
+ inputTokens: usageMetadata.promptTokenCount,
70
+ outputTokens: usageMetadata.candidatesTokenCount,
71
+ totalTokens: usageMetadata.totalTokenCount,
72
+ };
73
+ printTokenUsageAndCost(usage, 0.000125 / 1000, 0.000375 / 1000);
74
+ if (result.response.promptFeedback) {
75
+ console.log('Prompt feedback:');
76
+ console.log(JSON.stringify(result.response.promptFeedback, null, 2));
77
+ }
78
+ if (!result.response.candidates?.length) {
79
+ console.log('Response:', result);
80
+ throw new Error('No candidates found');
81
+ }
82
+ const functionCalls = result.response.candidates
83
+ .map((candidate) => candidate.content.parts?.map((part) => part.functionCall))
84
+ .flat()
85
+ .filter((functionCall) => !!functionCall)
86
+ .map((call) => ({ name: call.name, args: call.args }));
87
+ if (functionCalls.length === 0) {
88
+ const textResponse = result.response.candidates
89
+ .map((candidate) => candidate.content.parts?.map((part) => part.text))
90
+ .flat()
91
+ .filter((text) => !!text)
92
+ .join('\n');
93
+ console.log('No function calls, output text response if it exists:', textResponse);
94
+ }
95
+ return processFunctionCalls(functionCalls);
96
+ }
97
+ function getModel(model, temperature, systemPrompt) {
98
+ assert(process.env.API_KEY, 'API_KEY environment variable is not set');
99
+ const genAI = new GoogleGenerativeAI(process.env.API_KEY);
100
+ return genAI.getGenerativeModel({
101
+ model,
102
+ generationConfig: {
103
+ maxOutputTokens: 8192,
104
+ temperature,
105
+ topP: 0.95,
106
+ },
107
+ safetySettings: [
108
+ {
109
+ category: HarmCategory.HARM_CATEGORY_HATE_SPEECH,
110
+ threshold: geminiBlockNone ? HarmBlockThreshold.BLOCK_NONE : HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
111
+ },
112
+ {
113
+ category: HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,
114
+ threshold: geminiBlockNone ? HarmBlockThreshold.BLOCK_NONE : HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
115
+ },
116
+ {
117
+ category: HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT,
118
+ threshold: geminiBlockNone ? HarmBlockThreshold.BLOCK_NONE : HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
119
+ },
120
+ {
121
+ category: HarmCategory.HARM_CATEGORY_HARASSMENT,
122
+ threshold: geminiBlockNone ? HarmBlockThreshold.BLOCK_NONE : HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
123
+ },
124
+ ],
125
+ systemInstruction: {
126
+ role: 'system',
127
+ parts: [
128
+ {
129
+ text: systemPrompt,
130
+ },
131
+ ],
132
+ },
133
+ });
134
+ }
135
+ //# sourceMappingURL=ai-studio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-studio.js","sourceRoot":"","sources":["../../src/ai-service/ai-studio.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { FunctionCall, PromptItem, FunctionDef } from './common.js';
2
+ /**
3
+ * This function generates content using the Anthropic Claude model.
4
+ */
5
+ export declare function generateContent(prompt: PromptItem[], functionDefs: FunctionDef[], requiredFunctionName: string | null, temperature: number, cheap?: boolean): Promise<FunctionCall[]>;
@@ -0,0 +1,133 @@
1
+ import assert from 'node:assert';
2
+ import Anthropic from '@anthropic-ai/sdk';
3
+ import { printTokenUsageAndCost, processFunctionCalls } from './common.js';
4
+ import { disableCache } from '../cli/cli-params.js';
5
+ /**
6
+ * This function generates content using the Anthropic Claude model.
7
+ */
8
+ export async function generateContent(prompt, functionDefs, requiredFunctionName, temperature, cheap = false) {
9
+ const anthropic = new Anthropic({
10
+ defaultHeaders: {
11
+ 'anthropic-beta': 'max-tokens-3-5-sonnet-2024-07-15' + (!disableCache ? ',prompt-caching-2024-07-31' : ''),
12
+ },
13
+ });
14
+ const messages = prompt
15
+ .filter((item) => item.type !== 'systemPrompt')
16
+ .map((item) => {
17
+ if (item.type === 'user') {
18
+ const content = [];
19
+ if (item.functionResponses) {
20
+ content.push(...item.functionResponses.map((response) => ({
21
+ tool_use_id: response.call_id ?? response.name,
22
+ content: response.content,
23
+ type: 'tool_result',
24
+ is_error: response.isError === true,
25
+ })));
26
+ }
27
+ if (item.images) {
28
+ content.push(...item.images.map((image) => ({
29
+ type: 'image',
30
+ source: {
31
+ type: 'base64',
32
+ media_type: image.mediaType,
33
+ data: image.base64url,
34
+ },
35
+ })));
36
+ }
37
+ content.push({
38
+ type: 'text',
39
+ text: item.text,
40
+ ...(item.cache && !disableCache ? { cache_control: { type: 'ephemeral' } } : {}),
41
+ });
42
+ const message = {
43
+ role: 'user',
44
+ content,
45
+ };
46
+ return message;
47
+ }
48
+ else {
49
+ assert(item.type === 'assistant');
50
+ const message = {
51
+ role: 'assistant',
52
+ content: [
53
+ ...(item.text ? [{ type: 'text', text: item.text }] : []),
54
+ ...item.functionCalls.map((call) => ({
55
+ id: call.id ?? call.name,
56
+ name: call.name,
57
+ input: call.args ?? {},
58
+ type: 'tool_use',
59
+ })),
60
+ ],
61
+ };
62
+ return message;
63
+ }
64
+ });
65
+ const model = cheap ? 'claude-3-haiku-20240307' : 'claude-3-5-sonnet-20240620';
66
+ console.log(`Using Anthropic model: ${model}`);
67
+ let retryCount = 0;
68
+ let response;
69
+ while (retryCount < 3) {
70
+ try {
71
+ response = await anthropic.beta.promptCaching.messages.create({
72
+ model: model,
73
+ system: prompt.find((item) => item.type === 'systemPrompt').systemPrompt,
74
+ messages: messages,
75
+ tools: functionDefs.map((fd) => ({
76
+ name: fd.name,
77
+ description: fd.description,
78
+ input_schema: fd.parameters,
79
+ })),
80
+ tool_choice: requiredFunctionName
81
+ ? { type: 'tool', name: requiredFunctionName }
82
+ : { type: 'any' },
83
+ max_tokens: cheap ? 4096 : 8192,
84
+ temperature: temperature,
85
+ });
86
+ break; // Exit loop if successful
87
+ }
88
+ catch (error) {
89
+ if (error instanceof Anthropic.APIError && error.headers?.['retry-after']) {
90
+ let retryAfter;
91
+ if (error.headers['retry-after'] === '0') {
92
+ retryAfter = (new Date(error.headers['anthropic-ratelimit-tokens-reset']).getTime() - Date.now()) / 1000;
93
+ }
94
+ else {
95
+ retryAfter = Math.max(parseInt(error.headers['retry-after'], 10), 10);
96
+ }
97
+ console.log(`Rate limited. Retrying after ${retryAfter} seconds. Attempt ${retryCount + 1} of 3.`);
98
+ await new Promise((resolve) => setTimeout(resolve, retryAfter * 1000));
99
+ retryCount++;
100
+ }
101
+ else {
102
+ console.error('An error occurred:', error);
103
+ throw error; // Re-throw the error if it's not a rate limit error
104
+ }
105
+ }
106
+ }
107
+ if (retryCount === 3) {
108
+ console.error('Failed to complete request after 3 attempts due to rate limiting.');
109
+ throw new Error('Rate limit exceeded. Operation aborted.');
110
+ }
111
+ // Print token usage for Anthropic
112
+ const usage = {
113
+ cacheCreateTokens: response.usage.cache_creation_input_tokens,
114
+ cacheReadTokens: response.usage.cache_read_input_tokens,
115
+ inputTokens: response.usage.input_tokens,
116
+ outputTokens: response.usage.output_tokens,
117
+ totalTokens: response.usage.input_tokens + response.usage.output_tokens,
118
+ };
119
+ printTokenUsageAndCost(usage, 3 / 1000 / 1000, 15 / 1000 / 1000);
120
+ const responseMessages = response.content.filter((item) => item.type !== 'tool_use');
121
+ if (responseMessages.length > 0) {
122
+ console.log('Response messages', responseMessages);
123
+ }
124
+ const functionCalls = response.content
125
+ .filter((item) => item.type === 'tool_use')
126
+ .map((item) => ({
127
+ id: item.id,
128
+ name: item.name,
129
+ args: item.input,
130
+ }));
131
+ return processFunctionCalls(functionCalls);
132
+ }
133
+ //# sourceMappingURL=anthropic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/ai-service/anthropic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { FunctionCall, PromptItem, FunctionDef } from './common.js';
2
+ /**
3
+ * This function generates content using the OpenAI chat model.
4
+ */
5
+ export declare function generateContent(prompt: PromptItem[], functionDefs: FunctionDef[], requiredFunctionName: string | null, temperature: number, cheap?: boolean): Promise<FunctionCall[]>;
@@ -0,0 +1,131 @@
1
+ import OpenAI, { APIError } from 'openai';
2
+ import assert from 'node:assert';
3
+ import { printTokenUsageAndCost, processFunctionCalls } from './common.js';
4
+ /**
5
+ * This function generates content using the OpenAI chat model.
6
+ */
7
+ export async function generateContent(prompt, functionDefs, requiredFunctionName, temperature, cheap = false) {
8
+ const openai = new OpenAI();
9
+ const messages = prompt
10
+ .map((item) => {
11
+ if (item.type === 'systemPrompt') {
12
+ return {
13
+ role: 'system',
14
+ content: item.systemPrompt,
15
+ };
16
+ }
17
+ else if (item.type === 'user') {
18
+ const messages = [];
19
+ if (item.functionResponses) {
20
+ messages.push(...item.functionResponses.map((response) => ({
21
+ role: 'tool',
22
+ name: response.name,
23
+ content: response.content ?? '',
24
+ tool_call_id: response.name,
25
+ })));
26
+ }
27
+ if ((item.images?.length ?? 0) > 0) {
28
+ messages.push({
29
+ role: 'user',
30
+ content: [
31
+ ...item.images.map((image) => ({
32
+ type: 'image_url',
33
+ image_url: {
34
+ url: 'data:' + image.mediaType + ';base64,' + image.base64url,
35
+ },
36
+ })),
37
+ {
38
+ type: 'text',
39
+ text: item.text,
40
+ },
41
+ ],
42
+ });
43
+ }
44
+ else {
45
+ messages.push({
46
+ role: 'user',
47
+ content: item.text,
48
+ });
49
+ }
50
+ return messages;
51
+ }
52
+ else {
53
+ assert(item.type === 'assistant');
54
+ const message = {
55
+ role: 'assistant',
56
+ ...(item.text ? { content: item.text } : {}),
57
+ tool_calls: item.functionCalls?.map((call) => ({
58
+ type: 'function',
59
+ function: { name: call.name, arguments: JSON.stringify(call.args ?? {}) },
60
+ id: call.name,
61
+ })),
62
+ };
63
+ return message;
64
+ }
65
+ })
66
+ .flat();
67
+ const model = cheap ? 'gpt-4o-mini' : 'gpt-4o-2024-08-06';
68
+ console.log(`Using OpenAI model: ${model}`);
69
+ let retryCount = 0;
70
+ let response = undefined;
71
+ while (retryCount < 3) {
72
+ try {
73
+ response = await openai.chat.completions.create({
74
+ model: model,
75
+ messages,
76
+ tools: functionDefs.map((funDef) => ({ type: 'function', function: funDef })),
77
+ tool_choice: requiredFunctionName
78
+ ? { type: 'function', function: { name: requiredFunctionName } }
79
+ : 'required',
80
+ temperature: temperature,
81
+ });
82
+ break; // Exit loop if successful
83
+ }
84
+ catch (error) {
85
+ if (error instanceof APIError && error.headers?.['x-ratelimit-limit-tokens']) {
86
+ const rateLimitTokens = parseInt(error.headers['x-ratelimit-limit-tokens'], 10);
87
+ const retryAfter = error.headers['retry-after'] ? parseInt(error.headers['retry-after'], 10) : 1;
88
+ console.log(`Rate limited. Token limit: ${rateLimitTokens}. Retrying after ${retryAfter} seconds. Attempt ${retryCount + 1} of 3.`);
89
+ await new Promise((resolve) => setTimeout(resolve, retryAfter * 1000));
90
+ retryCount++;
91
+ }
92
+ else {
93
+ console.error('An error occurred:', error);
94
+ throw error; // Re-throw the error if it's not a rate limit error
95
+ }
96
+ }
97
+ }
98
+ if (retryCount === 3) {
99
+ console.error('Failed to complete request after 3 attempts due to rate limiting.');
100
+ throw new Error('Rate limit exceeded. Operation aborted.');
101
+ }
102
+ assert(response);
103
+ // Print token usage for chat gpt
104
+ const usage = {
105
+ inputTokens: response.usage.prompt_tokens,
106
+ outputTokens: response.usage.completion_tokens,
107
+ totalTokens: response.usage.total_tokens,
108
+ };
109
+ printTokenUsageAndCost(usage, 0.000005, 0.000015);
110
+ const responseMessage = response.choices[0].message;
111
+ if (responseMessage.content) {
112
+ console.log('Message', responseMessage.content);
113
+ }
114
+ const toolCalls = responseMessage.tool_calls;
115
+ if (toolCalls) {
116
+ const functionCalls = toolCalls.map((call) => {
117
+ const name = call.function.name;
118
+ const args = JSON.parse(call.function.arguments);
119
+ return {
120
+ id: call.id,
121
+ name,
122
+ args,
123
+ };
124
+ });
125
+ return processFunctionCalls(functionCalls);
126
+ }
127
+ else {
128
+ throw new Error('No tool calls found in response');
129
+ }
130
+ }
131
+ //# sourceMappingURL=chat-gpt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-gpt.js","sourceRoot":"","sources":["../../src/ai-service/chat-gpt.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAyC,MAAM,aAAa,CAAC;AAGlH;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAoB,EACpB,YAA2B,EAC3B,oBAAmC,EACnC,WAAmB,EACnB,KAAK,GAAG,KAAK;IAEb,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;IAE5B,MAAM,QAAQ,GAAsC,MAAM;SACvD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YACjC,OAAO;gBACL,IAAI,EAAE,QAAiB;gBACvB,OAAO,EAAE,IAAI,CAAC,YAAa;aAC5B,CAAC;QACJ,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAChC,MAAM,QAAQ,GAAiC,EAAE,CAAC;YAClD,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAC3B,QAAQ,CAAC,IAAI,CACX,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;oBAC3C,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,QAAQ,CAAC,IAAI;oBACnB,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,EAAE;oBAC/B,YAAY,EAAE,QAAQ,CAAC,IAAI;iBAC5B,CAAC,CAAC,CACJ,CAAC;YACJ,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnC,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,MAAe;oBACrB,OAAO,EAAE;wBACP,GAAG,IAAI,CAAC,MAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;4BAC9B,IAAI,EAAE,WAAoB;4BAC1B,SAAS,EAAE;gCACT,GAAG,EAAE,OAAO,GAAG,KAAK,CAAC,SAAS,GAAG,UAAU,GAAG,KAAK,CAAC,SAAS;6BAC9D;yBACF,CAAC,CAAC;wBACH;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,IAAI,CAAC,IAAK;yBACjB;qBACF;iBACF,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,MAAe;oBACrB,OAAO,EAAE,IAAI,CAAC,IAAK;iBACpB,CAAC,CAAC;YACL,CAAC;YACD,OAAO,QAAQ,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;YAClC,MAAM,OAAO,GAA+B;gBAC1C,IAAI,EAAE,WAAoB;gBAC1B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5C,UAAU,EAAE,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oBAC7C,IAAI,EAAE,UAAmB;oBACzB,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE;oBACzE,EAAE,EAAE,IAAI,CAAC,IAAI;iBACd,CAAC,CAAC;aACJ,CAAC;YACF,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC,CAAC;SACD,IAAI,EAAE,CAAC;IAEV,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,mBAAmB,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,EAAE,CAAC,CAAC;IAE5C,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,QAAQ,GAAuD,SAAS,CAAC;IAC7E,OAAO,UAAU,GAAG,CAAC,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;gBAC9C,KAAK,EAAE,KAAK;gBACZ,QAAQ;gBACR,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,UAAmB,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;gBACtF,WAAW,EAAE,oBAAoB;oBAC/B,CAAC,CAAC,EAAE,IAAI,EAAE,UAAmB,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,EAAE;oBACzE,CAAC,CAAC,UAAU;gBACd,WAAW,EAAE,WAAW;aACzB,CAAC,CAAC;YACH,MAAM,CAAC,0BAA0B;QACnC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,QAAQ,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC,0BAA0B,CAAC,EAAE,CAAC;gBAC7E,MAAM,eAAe,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,0BAA0B,CAAC,EAAE,EAAE,CAAC,CAAC;gBAChF,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACjG,OAAO,CAAC,GAAG,CACT,8BAA8B,eAAe,oBAAoB,UAAU,qBAAqB,UAAU,GAAG,CAAC,QAAQ,CACvH,CAAC;gBACF,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC;gBACvE,UAAU,EAAE,CAAC;YACf,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;gBAC3C,MAAM,KAAK,CAAC,CAAC,oDAAoD;YACnE,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,CAAC,KAAK,CAAC,mEAAmE,CAAC,CAAC;QACnF,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,CAAC;IAEjB,iCAAiC;IACjC,MAAM,KAAK,GAAG;QACZ,WAAW,EAAE,QAAQ,CAAC,KAAM,CAAC,aAAa;QAC1C,YAAY,EAAE,QAAQ,CAAC,KAAM,CAAC,iBAAiB;QAC/C,WAAW,EAAE,QAAQ,CAAC,KAAM,CAAC,YAAY;KAC1C,CAAC;IACF,sBAAsB,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAElD,MAAM,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAEpD,IAAI,eAAe,CAAC,OAAO,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,SAAS,GAAG,eAAe,CAAC,UAAU,CAAC;IAC7C,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,aAAa,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAChC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YAEjD,OAAO;gBACL,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,IAAI;gBACJ,IAAI;aACL,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,OAAO,oBAAoB,CAAC,aAAa,CAAC,CAAC;IAC7C,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;AACH,CAAC"}
@@ -0,0 +1,57 @@
1
+ interface TokenUsage {
2
+ inputTokens: number | undefined | null;
3
+ outputTokens: number | undefined | null;
4
+ totalTokens: number | undefined | null;
5
+ cacheCreateTokens?: number | null;
6
+ cacheReadTokens?: number | null;
7
+ }
8
+ export interface FunctionDef {
9
+ name: string;
10
+ description: string;
11
+ parameters: {
12
+ type: 'object';
13
+ properties: Record<string, unknown>;
14
+ required: string[];
15
+ };
16
+ }
17
+ export interface FunctionCall {
18
+ id?: string;
19
+ name: string;
20
+ args?: Record<string, unknown>;
21
+ }
22
+ export interface PromptItem {
23
+ type: string;
24
+ systemPrompt?: string;
25
+ text?: string;
26
+ functionResponses?: {
27
+ call_id?: string;
28
+ name: string;
29
+ content?: string;
30
+ isError?: boolean;
31
+ }[];
32
+ images?: {
33
+ mediaType: 'image/jpeg' | 'image/png' | 'image/gif' | 'image/webp';
34
+ base64url: string;
35
+ }[];
36
+ functionCalls?: FunctionCall[];
37
+ cache?: boolean;
38
+ }
39
+ export type GenerateContentFunction = (prompt: PromptItem[], functionDefs: FunctionDef[], requiredFunctionName: string, temperature: number, cheap: boolean) => Promise<FunctionCall[]>;
40
+ export type GenerateImageFunction = (prompt: string, contextImagePath: string | undefined, size: {
41
+ width: number;
42
+ height: number;
43
+ }, cheap: boolean) => Promise<string>;
44
+ /**
45
+ * Common function to print token usage and estimated cost
46
+ * @param {TokenUsage} usage Token usage object
47
+ * @param {number} inputCostPerToken Cost per input token
48
+ * @param {number} outputCostPerToken Cost per output token
49
+ */
50
+ export declare function printTokenUsageAndCost(usage: TokenUsage, inputCostPerToken: number, outputCostPerToken: number): void;
51
+ /**
52
+ * Common function to process function calls and explanations
53
+ * @param {FunctionCall[]} functionCalls Array of function calls
54
+ * @returns {FunctionCall[]} Processed function calls
55
+ */
56
+ export declare function processFunctionCalls(functionCalls: FunctionCall[]): FunctionCall[];
57
+ export {};
@@ -0,0 +1,38 @@
1
+ import assert from 'node:assert';
2
+ import { functionDefs } from '../prompt/function-calling.js';
3
+ /**
4
+ * Common function to print token usage and estimated cost
5
+ * @param {TokenUsage} usage Token usage object
6
+ * @param {number} inputCostPerToken Cost per input token
7
+ * @param {number} outputCostPerToken Cost per output token
8
+ */
9
+ export function printTokenUsageAndCost(usage, inputCostPerToken, outputCostPerToken) {
10
+ console.log('Token Usage:');
11
+ console.log(' - Input tokens: ', usage.inputTokens);
12
+ console.log(' - Output tokens: ', usage.outputTokens);
13
+ console.log(' - Total tokens: ', usage.totalTokens);
14
+ if (usage.cacheCreateTokens) {
15
+ console.log(' - Cache create tokens: ', usage.cacheCreateTokens);
16
+ }
17
+ if (usage.cacheReadTokens) {
18
+ console.log(' - Cache read tokens: ', usage.cacheReadTokens);
19
+ }
20
+ const inputCost = (usage.inputTokens ?? 0) * inputCostPerToken +
21
+ (usage.cacheCreateTokens ?? 0) * inputCostPerToken * 1.25 +
22
+ (usage.cacheReadTokens ?? 0) * inputCostPerToken * 0.2;
23
+ const outputCost = (usage.outputTokens ?? 0) * outputCostPerToken;
24
+ const totalCost = inputCost + outputCost;
25
+ console.log(' - Estimated cost: ', totalCost.toFixed(6), ' USD');
26
+ }
27
+ /**
28
+ * Common function to process function calls and explanations
29
+ * @param {FunctionCall[]} functionCalls Array of function calls
30
+ * @returns {FunctionCall[]} Processed function calls
31
+ */
32
+ export function processFunctionCalls(functionCalls) {
33
+ const unknownFunctionCalls = functionCalls.filter((call) => !functionDefs.some((fd) => fd.name === call.name));
34
+ assert(unknownFunctionCalls.length === 0, 'Unknown function name: ' + unknownFunctionCalls.map((call) => call.name).join(', '));
35
+ console.log('Explanations:', functionCalls.filter((fn) => fn.name === 'explanation').map((call) => call.args?.text));
36
+ return functionCalls; // .filter((fn) => fn.name !== 'explanation');
37
+ }
38
+ //# sourceMappingURL=common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/ai-service/common.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AA2D7D;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAiB,EAAE,iBAAyB,EAAE,kBAA0B;IAC7G,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;IACrD,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,2BAA2B,EAAE,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,SAAS,GACb,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC,GAAG,iBAAiB;QAC5C,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,CAAC,GAAG,iBAAiB,GAAG,IAAI;QACzD,CAAC,KAAK,CAAC,eAAe,IAAI,CAAC,CAAC,GAAG,iBAAiB,GAAG,GAAG,CAAC;IACzD,MAAM,UAAU,GAAG,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC,GAAG,kBAAkB,CAAC;IAClE,MAAM,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AACpE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,aAA6B;IAChE,MAAM,oBAAoB,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/G,MAAM,CACJ,oBAAoB,CAAC,MAAM,KAAK,CAAC,EACjC,yBAAyB,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CACrF,CAAC;IAEF,OAAO,CAAC,GAAG,CACT,eAAe,EACf,aAAa,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CACvF,CAAC;IAEF,OAAO,aAAa,CAAC,CAAC,8CAA8C;AACtE,CAAC"}
@@ -0,0 +1 @@
1
+ export {};