@kalenkevich/agent_007 0.0.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 (247) hide show
  1. package/dist/agent/agent.d.ts +17 -0
  2. package/dist/agent/agent.js +6 -0
  3. package/dist/agent/agent.js.map +1 -0
  4. package/dist/agent/agent_event.d.ts +108 -0
  5. package/dist/agent/agent_event.js +56 -0
  6. package/dist/agent/agent_event.js.map +1 -0
  7. package/dist/agent/agent_event_utils.d.ts +5 -0
  8. package/dist/agent/agent_event_utils.js +66 -0
  9. package/dist/agent/agent_event_utils.js.map +1 -0
  10. package/dist/agent/cli_agent/cli_agent.d.ts +41 -0
  11. package/dist/agent/cli_agent/cli_agent.js +324 -0
  12. package/dist/agent/cli_agent/cli_agent.js.map +1 -0
  13. package/dist/agent/cli_agent/system_prompt.d.ts +1 -0
  14. package/dist/agent/cli_agent/system_prompt.js +58 -0
  15. package/dist/agent/cli_agent/system_prompt.js.map +1 -0
  16. package/dist/agent/cli_agent.d.ts +34 -0
  17. package/dist/agent/cli_agent.js +91 -0
  18. package/dist/agent/cli_agent.js.map +1 -0
  19. package/dist/agent/planner_agent/planner_agent.d.ts +28 -0
  20. package/dist/agent/planner_agent/planner_agent.js +102 -0
  21. package/dist/agent/planner_agent/planner_agent.js.map +1 -0
  22. package/dist/agent/request_processor/basic_request_processor.d.ts +17 -0
  23. package/dist/agent/request_processor/basic_request_processor.js +28 -0
  24. package/dist/agent/request_processor/basic_request_processor.js.map +1 -0
  25. package/dist/agent/request_processor/compaction_processor.d.ts +17 -0
  26. package/dist/agent/request_processor/compaction_processor.js +118 -0
  27. package/dist/agent/request_processor/compaction_processor.js.map +1 -0
  28. package/dist/agent/request_processor/request_processor.d.ts +11 -0
  29. package/dist/agent/request_processor/request_processor.js +2 -0
  30. package/dist/agent/request_processor/request_processor.js.map +1 -0
  31. package/dist/cli/init_project_command_handler.d.ts +3 -0
  32. package/dist/cli/init_project_command_handler.js +58 -0
  33. package/dist/cli/init_project_command_handler.js.map +1 -0
  34. package/dist/cli/loader.d.ts +6 -0
  35. package/dist/cli/loader.js +27 -0
  36. package/dist/cli/loader.js.map +1 -0
  37. package/dist/cli/prompt_utils.d.ts +11 -0
  38. package/dist/cli/prompt_utils.js +18 -0
  39. package/dist/cli/prompt_utils.js.map +1 -0
  40. package/dist/cli/run_command.d.ts +6 -0
  41. package/dist/cli/run_command.js +72 -0
  42. package/dist/cli/run_command.js.map +1 -0
  43. package/dist/cli/run_interactive_command.d.ts +6 -0
  44. package/dist/cli/run_interactive_command.js +282 -0
  45. package/dist/cli/run_interactive_command.js.map +1 -0
  46. package/dist/cli/run_noninteractive_command.d.ts +6 -0
  47. package/dist/cli/run_noninteractive_command.js +60 -0
  48. package/dist/cli/run_noninteractive_command.js.map +1 -0
  49. package/dist/cli_entrypoint.d.ts +2 -0
  50. package/dist/cli_entrypoint.js +110 -0
  51. package/dist/cli_entrypoint.js.map +1 -0
  52. package/dist/command/commnad_handler.d.ts +3 -0
  53. package/dist/command/commnad_handler.js +2 -0
  54. package/dist/command/commnad_handler.js.map +1 -0
  55. package/dist/command/init_project_command_handler.d.ts +4 -0
  56. package/dist/command/init_project_command_handler.js +58 -0
  57. package/dist/command/init_project_command_handler.js.map +1 -0
  58. package/dist/config/app_dir.d.ts +1 -0
  59. package/dist/config/app_dir.js +4 -0
  60. package/dist/config/app_dir.js.map +1 -0
  61. package/dist/config/config.d.ts +21 -0
  62. package/dist/config/config.js +2 -0
  63. package/dist/config/config.js.map +1 -0
  64. package/dist/config/config_loader.d.ts +2 -0
  65. package/dist/config/config_loader.js +47 -0
  66. package/dist/config/config_loader.js.map +1 -0
  67. package/dist/config/config_store.d.ts +10 -0
  68. package/dist/config/config_store.js +44 -0
  69. package/dist/config/config_store.js.map +1 -0
  70. package/dist/content.d.ts +51 -0
  71. package/dist/content.js +16 -0
  72. package/dist/content.js.map +1 -0
  73. package/dist/core/functions.d.ts +1 -0
  74. package/dist/core/functions.js +6 -0
  75. package/dist/core/functions.js.map +1 -0
  76. package/dist/core/loop.d.ts +20 -0
  77. package/dist/core/loop.js +121 -0
  78. package/dist/core/loop.js.map +1 -0
  79. package/dist/core/project_service.d.ts +11 -0
  80. package/dist/core/project_service.js +26 -0
  81. package/dist/core/project_service.js.map +1 -0
  82. package/dist/core/run.d.ts +6 -0
  83. package/dist/core/run.js +25 -0
  84. package/dist/core/run.js.map +1 -0
  85. package/dist/index.d.ts +1 -0
  86. package/dist/index.js +2 -0
  87. package/dist/index.js.map +1 -0
  88. package/dist/logger.d.ts +27 -0
  89. package/dist/logger.js +98 -0
  90. package/dist/logger.js.map +1 -0
  91. package/dist/model/adaptive_model.d.ts +16 -0
  92. package/dist/model/adaptive_model.js +57 -0
  93. package/dist/model/adaptive_model.js.map +1 -0
  94. package/dist/model/google/gemini_model.d.ts +15 -0
  95. package/dist/model/google/gemini_model.js +131 -0
  96. package/dist/model/google/gemini_model.js.map +1 -0
  97. package/dist/model/google/gemini_response_utils.d.ts +3 -0
  98. package/dist/model/google/gemini_response_utils.js +36 -0
  99. package/dist/model/google/gemini_response_utils.js.map +1 -0
  100. package/dist/model/google/gemini_streaming_utils.d.ts +28 -0
  101. package/dist/model/google/gemini_streaming_utils.js +235 -0
  102. package/dist/model/google/gemini_streaming_utils.js.map +1 -0
  103. package/dist/model/google/gen_ai_convert_utils.d.ts +6 -0
  104. package/dist/model/google/gen_ai_convert_utils.js +117 -0
  105. package/dist/model/google/gen_ai_convert_utils.js.map +1 -0
  106. package/dist/model/model.d.ts +11 -0
  107. package/dist/model/model.js +2 -0
  108. package/dist/model/model.js.map +1 -0
  109. package/dist/model/registry.d.ts +19 -0
  110. package/dist/model/registry.js +47 -0
  111. package/dist/model/registry.js.map +1 -0
  112. package/dist/model/request.d.ts +13 -0
  113. package/dist/model/request.js +2 -0
  114. package/dist/model/request.js.map +1 -0
  115. package/dist/model/request_builder_utils.d.ts +19 -0
  116. package/dist/model/request_builder_utils.js +43 -0
  117. package/dist/model/request_builder_utils.js.map +1 -0
  118. package/dist/model/response.d.ts +60 -0
  119. package/dist/model/response.js +2 -0
  120. package/dist/model/response.js.map +1 -0
  121. package/dist/model/util_llm.d.ts +10 -0
  122. package/dist/model/util_llm.js +149 -0
  123. package/dist/model/util_llm.js.map +1 -0
  124. package/dist/session/session.d.ts +14 -0
  125. package/dist/session/session.js +2 -0
  126. package/dist/session/session.js.map +1 -0
  127. package/dist/session/session_file_service.d.ts +23 -0
  128. package/dist/session/session_file_service.js +147 -0
  129. package/dist/session/session_file_service.js.map +1 -0
  130. package/dist/skills/skill.d.ts +23 -0
  131. package/dist/skills/skill.js +12 -0
  132. package/dist/skills/skill.js.map +1 -0
  133. package/dist/tools/build_in/find.d.ts +3 -0
  134. package/dist/tools/build_in/find.js +71 -0
  135. package/dist/tools/build_in/find.js.map +1 -0
  136. package/dist/tools/build_in/grep.d.ts +3 -0
  137. package/dist/tools/build_in/grep.js +97 -0
  138. package/dist/tools/build_in/grep.js.map +1 -0
  139. package/dist/tools/build_in/index.d.ts +1 -0
  140. package/dist/tools/build_in/index.js +13 -0
  141. package/dist/tools/build_in/index.js.map +1 -0
  142. package/dist/tools/build_in/list_dir.d.ts +3 -0
  143. package/dist/tools/build_in/list_dir.js +46 -0
  144. package/dist/tools/build_in/list_dir.js.map +1 -0
  145. package/dist/tools/build_in/view_file.d.ts +3 -0
  146. package/dist/tools/build_in/view_file.js +44 -0
  147. package/dist/tools/build_in/view_file.js.map +1 -0
  148. package/dist/tools/build_in/write_file.d.ts +3 -0
  149. package/dist/tools/build_in/write_file.js +50 -0
  150. package/dist/tools/build_in/write_file.js.map +1 -0
  151. package/dist/tools/functional_tool.d.ts +18 -0
  152. package/dist/tools/functional_tool.js +20 -0
  153. package/dist/tools/functional_tool.js.map +1 -0
  154. package/dist/tools/schema.d.ts +86 -0
  155. package/dist/tools/schema.js +37 -0
  156. package/dist/tools/schema.js.map +1 -0
  157. package/dist/tools/tool.d.ts +30 -0
  158. package/dist/tools/tool.js +9 -0
  159. package/dist/tools/tool.js.map +1 -0
  160. package/dist/tools/tool_call_policy.d.ts +4 -0
  161. package/dist/tools/tool_call_policy.js +4 -0
  162. package/dist/tools/tool_call_policy.js.map +1 -0
  163. package/dist/tools/tool_policy.d.ts +4 -0
  164. package/dist/tools/tool_policy.js +4 -0
  165. package/dist/tools/tool_policy.js.map +1 -0
  166. package/dist/ui/ui.d.ts +1 -0
  167. package/dist/ui/ui.js +2 -0
  168. package/dist/ui/ui.js.map +1 -0
  169. package/dist/user_input.d.ts +20 -0
  170. package/dist/user_input.js +21 -0
  171. package/dist/user_input.js.map +1 -0
  172. package/package.json +44 -0
  173. package/src/agent/agent.ts +18 -0
  174. package/src/agent/agent_event.ts +171 -0
  175. package/src/agent/agent_event_utils.ts +87 -0
  176. package/src/agent/cli_agent/cli_agent.ts +418 -0
  177. package/src/agent/cli_agent/system_prompt.ts +57 -0
  178. package/src/agent/planner_agent/planner_agent.ts +136 -0
  179. package/src/agent/request_processor/basic_request_processor.ts +46 -0
  180. package/src/agent/request_processor/compaction_processor.ts +164 -0
  181. package/src/agent/request_processor/request_processor.ts +13 -0
  182. package/src/cli/loader.ts +27 -0
  183. package/src/cli/prompt_utils.ts +19 -0
  184. package/src/cli/run_interactive_command.ts +337 -0
  185. package/src/cli/run_noninteractive_command.ts +74 -0
  186. package/src/cli_entrypoint.ts +128 -0
  187. package/src/command/commnad_handler.ts +3 -0
  188. package/src/command/init_project_command_handler.ts +66 -0
  189. package/src/config/app_dir.ts +4 -0
  190. package/src/config/config.ts +24 -0
  191. package/src/config/config_loader.ts +57 -0
  192. package/src/config/config_store.ts +50 -0
  193. package/src/content.ts +87 -0
  194. package/src/core/functions.ts +7 -0
  195. package/src/core/loop.ts +165 -0
  196. package/src/core/project_service.ts +38 -0
  197. package/src/core/run.ts +36 -0
  198. package/src/index.ts +1 -0
  199. package/src/logger.ts +128 -0
  200. package/src/model/adaptive_model.ts +77 -0
  201. package/src/model/google/gemini_model.ts +194 -0
  202. package/src/model/google/gemini_response_utils.ts +46 -0
  203. package/src/model/google/gemini_streaming_utils.ts +294 -0
  204. package/src/model/google/gen_ai_convert_utils.ts +149 -0
  205. package/src/model/model.ts +18 -0
  206. package/src/model/registry.ts +61 -0
  207. package/src/model/request.ts +15 -0
  208. package/src/model/request_builder_utils.ts +79 -0
  209. package/src/model/response.ts +66 -0
  210. package/src/model/util_llm.ts +167 -0
  211. package/src/session/session.ts +16 -0
  212. package/src/session/session_file_service.ts +207 -0
  213. package/src/skills/skill.ts +38 -0
  214. package/src/tools/build_in/find.ts +80 -0
  215. package/src/tools/build_in/grep.ts +101 -0
  216. package/src/tools/build_in/index.ts +13 -0
  217. package/src/tools/build_in/list_dir.ts +50 -0
  218. package/src/tools/build_in/view_file.ts +47 -0
  219. package/src/tools/build_in/write_file.ts +53 -0
  220. package/src/tools/functional_tool.ts +59 -0
  221. package/src/tools/schema.ts +87 -0
  222. package/src/tools/tool.ts +68 -0
  223. package/src/tools/tool_call_policy.ts +7 -0
  224. package/src/ui/ui.ts +0 -0
  225. package/src/user_input.ts +51 -0
  226. package/tests/integration/util_llm_test.ts +42 -0
  227. package/tests/unit/adaptive_model_test.ts +122 -0
  228. package/tests/unit/agent/request_processor/compaction_processor_test.ts +121 -0
  229. package/tests/unit/cli/prompt_utils_test.ts +47 -0
  230. package/tests/unit/cli_agent_test.ts +476 -0
  231. package/tests/unit/content_test.ts +56 -0
  232. package/tests/unit/logger_test.ts +109 -0
  233. package/tests/unit/loop_test.ts +141 -0
  234. package/tests/unit/model/gemini_model_test.ts +111 -0
  235. package/tests/unit/planner_agent_test.ts +52 -0
  236. package/tests/unit/project_service_test.ts +102 -0
  237. package/tests/unit/session_file_service_test.ts +160 -0
  238. package/tests/unit/tools/find_test.ts +40 -0
  239. package/tests/unit/tools/grep_test.ts +43 -0
  240. package/tests/unit/tools/list_dir_test.ts +32 -0
  241. package/tests/unit/tools/view_file_test.ts +32 -0
  242. package/tests/unit/tools/write_file_test.ts +44 -0
  243. package/tests/unit/user_input_test.ts +55 -0
  244. package/tests/unit/util_llm_test.ts +61 -0
  245. package/todo.md +29 -0
  246. package/tsconfig.json +33 -0
  247. package/vitest.config.ts +33 -0
package/dist/logger.js ADDED
@@ -0,0 +1,98 @@
1
+ import * as fs from "fs";
2
+ import * as path from "path";
3
+ import * as util from "util";
4
+ export class ConsoleTransport {
5
+ constructor(enabled) {
6
+ this.enabled = enabled;
7
+ }
8
+ log(level, formattedMessage, args) {
9
+ if (!this.enabled) {
10
+ return;
11
+ }
12
+ switch (level) {
13
+ case "DEBUG":
14
+ console.debug(...args);
15
+ break;
16
+ case "INFO":
17
+ console.info(...args);
18
+ break;
19
+ case "WARN":
20
+ console.warn(...args);
21
+ break;
22
+ case "ERROR":
23
+ console.error(...args);
24
+ break;
25
+ case "LOG":
26
+ default:
27
+ console.log(...args);
28
+ }
29
+ }
30
+ }
31
+ export class FileTransport {
32
+ constructor(enabled, logFile) {
33
+ this.logFile = logFile;
34
+ this.enabled = true;
35
+ this.enabled = enabled;
36
+ }
37
+ log(level, formattedMessage, args) {
38
+ if (!this.enabled) {
39
+ return;
40
+ }
41
+ try {
42
+ fs.appendFileSync(this.logFile, `[${level}] ${formattedMessage}\n`);
43
+ }
44
+ catch (err) {
45
+ console.error("Failed to write to log file:", err);
46
+ }
47
+ }
48
+ }
49
+ export class Logger {
50
+ constructor(transports) {
51
+ this.transports = [];
52
+ if (transports) {
53
+ this.transports = transports;
54
+ }
55
+ }
56
+ getTransports() {
57
+ if (this.transports.length) {
58
+ return this.transports;
59
+ }
60
+ if (process.env.DEBUG_LOGGER) {
61
+ const logFile = path.join(process.cwd(), "debug.log");
62
+ return [
63
+ new ConsoleTransport(process.env.DEBUG_LOGGER_CONSOLE === "true"),
64
+ new FileTransport(process.env.DEBUG_LOGGER === "true", logFile),
65
+ ];
66
+ }
67
+ return [];
68
+ }
69
+ formatMessage(level, ...args) {
70
+ const timestamp = new Date().toISOString();
71
+ const message = args
72
+ .map((arg) => typeof arg === "string" ? arg : util.inspect(arg, { depth: null }))
73
+ .join(" ");
74
+ return `[${timestamp}] [${level}] ${message}`;
75
+ }
76
+ log(...args) {
77
+ const formatted = this.formatMessage("LOG", ...args);
78
+ this.getTransports().forEach((t) => t.log("LOG", formatted, args));
79
+ }
80
+ debug(...args) {
81
+ const formatted = this.formatMessage("DEBUG", ...args);
82
+ this.getTransports().forEach((t) => t.log("DEBUG", formatted, args));
83
+ }
84
+ info(...args) {
85
+ const formatted = this.formatMessage("INFO", ...args);
86
+ this.getTransports().forEach((t) => t.log("INFO", formatted, args));
87
+ }
88
+ warn(...args) {
89
+ const formatted = this.formatMessage("WARN", ...args);
90
+ this.getTransports().forEach((t) => t.log("WARN", formatted, args));
91
+ }
92
+ error(...args) {
93
+ const formatted = this.formatMessage("ERROR", ...args);
94
+ this.getTransports().forEach((t) => t.log("ERROR", formatted, args));
95
+ }
96
+ }
97
+ export const logger = new Logger();
98
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { LlmModel, LlmModelConfig } from "./model.js";
2
+ import type { LlmRequest } from "./request.js";
3
+ import type { LlmResponse } from "./response.js";
4
+ import type { ModelConfig } from "../config/config.js";
5
+ export declare class AdaptiveLlmModel implements LlmModel {
6
+ private currentModel;
7
+ private fallbackConfigs?;
8
+ readonly modelName: string;
9
+ constructor(config: {
10
+ main: ModelConfig;
11
+ fallback?: ModelConfig[];
12
+ });
13
+ setModel(modelConfig: ModelConfig): void;
14
+ run(request: LlmRequest, config?: LlmModelConfig): AsyncGenerator<LlmResponse, void, unknown>;
15
+ countTokens(request: LlmRequest): Promise<number>;
16
+ }
@@ -0,0 +1,57 @@
1
+ import { resolveLlmModel } from "./registry.js";
2
+ import { logger } from "../logger.js";
3
+ export class AdaptiveLlmModel {
4
+ constructor(config) {
5
+ this.modelName = "adaptive";
6
+ this.setModel(config.main);
7
+ this.fallbackConfigs = config.fallback;
8
+ }
9
+ setModel(modelConfig) {
10
+ const ModelClass = resolveLlmModel(modelConfig.modelName);
11
+ this.currentModel = new ModelClass(modelConfig);
12
+ }
13
+ async *run(request, config) {
14
+ if (!this.currentModel) {
15
+ throw new Error("Model not initialized");
16
+ }
17
+ try {
18
+ yield* this.currentModel.run(request, config);
19
+ }
20
+ catch (e) {
21
+ logger.error("[AdaptiveLlmModel] error:", e);
22
+ if (this.fallbackConfigs && this.fallbackConfigs.length > 0) {
23
+ for (const fallbackConfig of this.fallbackConfigs) {
24
+ logger.info(`[AdaptiveLlmModel] Attempting fallback to ${fallbackConfig.modelName}`);
25
+ try {
26
+ const FallbackModelClass = resolveLlmModel(fallbackConfig.modelName);
27
+ this.currentModel = new FallbackModelClass(fallbackConfig);
28
+ yield* this.currentModel.run(request, config);
29
+ return; // Success, exit the generator
30
+ }
31
+ catch (fallbackError) {
32
+ logger.error(`[AdaptiveLlmModel] fallback to ${fallbackConfig.modelName} failed:`, fallbackError);
33
+ // Continue loop to try next fallback
34
+ }
35
+ }
36
+ // If all fallbacks failed
37
+ yield {
38
+ errorCode: "ADAPTIVE_MODEL_ALL_FALLBACKS_FAILED",
39
+ errorMessage: "All fallback models failed.",
40
+ };
41
+ }
42
+ else {
43
+ yield {
44
+ errorCode: "ADAPTIVE_MODEL_ERROR",
45
+ errorMessage: e instanceof Error ? e.message : String(e),
46
+ };
47
+ }
48
+ }
49
+ }
50
+ async countTokens(request) {
51
+ if (!this.currentModel) {
52
+ throw new Error("Model not initialized");
53
+ }
54
+ return this.currentModel.countTokens(request);
55
+ }
56
+ }
57
+ //# sourceMappingURL=adaptive_model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adaptive_model.js","sourceRoot":"","sources":["../../src/model/adaptive_model.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,OAAO,gBAAgB;IAK3B,YAAY,MAAuD;QAF1D,cAAS,GAAW,UAAU,CAAC;QAGtC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC;IACzC,CAAC;IAED,QAAQ,CAAC,WAAwB;QAC/B,MAAM,UAAU,GAAG,eAAe,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAC1D,IAAI,CAAC,YAAY,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,CAAC,GAAG,CACR,OAAmB,EACnB,MAAuB;QAEvB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC3C,CAAC;QAED,IAAI,CAAC;YACH,KAAK,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE,CAAC,CAAC,CAAC;YAE7C,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5D,KAAK,MAAM,cAAc,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;oBAClD,MAAM,CAAC,IAAI,CACT,6CAA6C,cAAc,CAAC,SAAS,EAAE,CACxE,CAAC;oBACF,IAAI,CAAC;wBACH,MAAM,kBAAkB,GAAG,eAAe,CACxC,cAAc,CAAC,SAAS,CACzB,CAAC;wBAEF,IAAI,CAAC,YAAY,GAAG,IAAI,kBAAkB,CAAC,cAAc,CAAC,CAAC;wBAC3D,KAAK,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;wBAC9C,OAAO,CAAC,8BAA8B;oBACxC,CAAC;oBAAC,OAAO,aAAsB,EAAE,CAAC;wBAChC,MAAM,CAAC,KAAK,CACV,kCAAkC,cAAc,CAAC,SAAS,UAAU,EACpE,aAAa,CACd,CAAC;wBACF,qCAAqC;oBACvC,CAAC;gBACH,CAAC;gBACD,0BAA0B;gBAC1B,MAAM;oBACJ,SAAS,EAAE,qCAAqC;oBAChD,YAAY,EAAE,6BAA6B;iBAC5C,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM;oBACJ,SAAS,EAAE,sBAAsB;oBACjC,YAAY,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;iBACzD,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAmB;QACnC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;CACF"}
@@ -0,0 +1,15 @@
1
+ import type { LlmRequest } from "../request.js";
2
+ import type { LlmResponse } from "../response.js";
3
+ import type { ModelConfig } from "../../config/config.js";
4
+ export interface RunConfig {
5
+ stream?: boolean;
6
+ abortSignal?: AbortSignal;
7
+ }
8
+ export declare class Gemini {
9
+ readonly modelName: string;
10
+ private readonly client;
11
+ constructor(config: ModelConfig);
12
+ run(request: LlmRequest, config?: RunConfig): AsyncGenerator<LlmResponse, void, unknown>;
13
+ countTokens(request: LlmRequest): Promise<number>;
14
+ private runStream;
15
+ }
@@ -0,0 +1,131 @@
1
+ import { GoogleGenAI, ThinkingLevel, } from "@google/genai";
2
+ import { contentToGenAIContent } from "./gen_ai_convert_utils.js";
3
+ import { StreamingResponseAggregator } from "./gemini_streaming_utils.js";
4
+ import { createLlmResponse } from "./gemini_response_utils.js";
5
+ import { logger } from "../../logger.js";
6
+ export class Gemini {
7
+ constructor(config) {
8
+ this.modelName = config.modelName;
9
+ this.client = new GoogleGenAI(config);
10
+ }
11
+ async *run(request, config) {
12
+ logger.debug("[Gemini Model] Running model with request:", JSON.stringify(request, null, 2));
13
+ if (config?.stream) {
14
+ yield* this.runStream(request, config);
15
+ return;
16
+ }
17
+ try {
18
+ const response = await this.client.models.generateContent(toGenAiRequest({
19
+ model: this.modelName,
20
+ request,
21
+ config,
22
+ }));
23
+ logger.debug("[Gemini Model] response received:", JSON.stringify(response, null, 2));
24
+ yield createLlmResponse(response);
25
+ }
26
+ catch (e) {
27
+ logger.error("[Gemini Model] error:", e);
28
+ yield {
29
+ errorCode: "GEMINI_ERROR",
30
+ errorMessage: extractErrorMessage(e),
31
+ };
32
+ }
33
+ }
34
+ async countTokens(request) {
35
+ const response = await this.client.models.countTokens({
36
+ model: this.modelName,
37
+ contents: request.contents.map((c) => contentToGenAIContent(c)),
38
+ config: {
39
+ tools: request.tools
40
+ ? [{ functionDeclarations: request.tools }]
41
+ : undefined,
42
+ systemInstruction: request.systemInstructions,
43
+ },
44
+ });
45
+ logger.debug("[Gemini Model] token count:", response.totalTokens);
46
+ return response.totalTokens || 0;
47
+ }
48
+ async *runStream(request, config) {
49
+ try {
50
+ const aggregator = new StreamingResponseAggregator();
51
+ const stream = await this.client.models.generateContentStream(toGenAiRequest({
52
+ model: this.modelName,
53
+ request,
54
+ config,
55
+ }));
56
+ for await (const response of stream) {
57
+ for await (const llmResponse of aggregator.processResponse(response)) {
58
+ logger.debug("[Gemini Model] yielding streaming response", JSON.stringify(llmResponse, null, 2));
59
+ yield llmResponse;
60
+ }
61
+ }
62
+ const finalResponse = aggregator.close();
63
+ if (finalResponse) {
64
+ logger.debug("[Gemini Model] yielding final streaming response", JSON.stringify(finalResponse, null, 2));
65
+ yield finalResponse;
66
+ }
67
+ }
68
+ catch (e) {
69
+ logger.error("[Gemini Model] stream error:", e);
70
+ yield {
71
+ errorCode: "GEMINI_STREAM_ERROR",
72
+ errorMessage: extractErrorMessage(e),
73
+ };
74
+ }
75
+ logger.debug("[Gemini Model] stream finished");
76
+ }
77
+ }
78
+ function toGenAiRequest({ model, request, config = {}, }) {
79
+ return {
80
+ model,
81
+ contents: request.contents.map((c) => contentToGenAIContent(c)),
82
+ config: {
83
+ ...(config || {}),
84
+ tools: request.tools
85
+ ? [{ functionDeclarations: request.tools }]
86
+ : undefined,
87
+ thinkingConfig: request.thinkingConfig?.enabled ? {
88
+ includeThoughts: request.thinkingConfig.enabled,
89
+ thinkingLevel: toThinkingLevelConfig(request.thinkingConfig.level || "auto"),
90
+ } : undefined,
91
+ systemInstruction: request.systemInstructions,
92
+ },
93
+ };
94
+ }
95
+ function extractErrorMessage(e) {
96
+ if (e instanceof Error) {
97
+ try {
98
+ const parsed = JSON.parse(e.message);
99
+ if (parsed.error && parsed.error.message) {
100
+ try {
101
+ const innerParsed = JSON.parse(parsed.error.message);
102
+ if (innerParsed.error && innerParsed.error.message) {
103
+ return innerParsed.error.message;
104
+ }
105
+ }
106
+ catch {
107
+ return parsed.error.message;
108
+ }
109
+ return parsed.error.message;
110
+ }
111
+ }
112
+ catch {
113
+ return e.message;
114
+ }
115
+ return e.message;
116
+ }
117
+ return String(e);
118
+ }
119
+ function toThinkingLevelConfig(thinkingLevel) {
120
+ switch (thinkingLevel) {
121
+ case "low":
122
+ return ThinkingLevel.LOW;
123
+ case "medium":
124
+ return ThinkingLevel.MEDIUM;
125
+ case "high":
126
+ return ThinkingLevel.HIGH;
127
+ case "auto":
128
+ return ThinkingLevel.HIGH;
129
+ }
130
+ }
131
+ //# sourceMappingURL=gemini_model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini_model.js","sourceRoot":"","sources":["../../../src/model/google/gemini_model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { GenerateContentResponse } from "@google/genai";
2
+ import type { LlmResponse } from "../response.js";
3
+ export declare function createLlmResponse(response: GenerateContentResponse): LlmResponse;
@@ -0,0 +1,36 @@
1
+ import { GenerateContentResponse, FinishReason } from "@google/genai";
2
+ import { genAIContentToContent } from "./gen_ai_convert_utils.js";
3
+ export function createLlmResponse(response) {
4
+ const candidate = response.candidates?.[0];
5
+ const llmResponse = {};
6
+ if (response.usageMetadata) {
7
+ llmResponse.usageMetadata = {
8
+ inputTokens: response.usageMetadata.promptTokenCount,
9
+ outputTokens: response.usageMetadata.candidatesTokenCount,
10
+ cachedTokens: response.usageMetadata.cachedContentTokenCount,
11
+ };
12
+ }
13
+ if (candidate) {
14
+ if (candidate.content) {
15
+ llmResponse.content = genAIContentToContent(candidate.content);
16
+ }
17
+ if (candidate.finishReason) {
18
+ llmResponse.finishReason = candidate.finishReason;
19
+ if (candidate.finishReason !== FinishReason.STOP) {
20
+ llmResponse.errorCode = candidate.finishReason;
21
+ llmResponse.errorMessage = candidate.finishMessage;
22
+ }
23
+ }
24
+ }
25
+ if (candidate) {
26
+ const cand = candidate;
27
+ if (cand.groundingMetadata) {
28
+ llmResponse.groundingMetadata = cand.groundingMetadata;
29
+ }
30
+ if (cand.citationMetadata) {
31
+ llmResponse.citationMetadata = cand.citationMetadata;
32
+ }
33
+ }
34
+ return llmResponse;
35
+ }
36
+ //# sourceMappingURL=gemini_response_utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini_response_utils.js","sourceRoot":"","sources":["../../../src/model/google/gemini_response_utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAEtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,MAAM,UAAU,iBAAiB,CAC/B,QAAiC;IAEjC,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;IAE3C,MAAM,WAAW,GAAgB,EAAE,CAAC;IAEpC,IAAI,QAAQ,CAAC,aAAa,EAAE,CAAC;QAC3B,WAAW,CAAC,aAAa,GAAG;YAC1B,WAAW,EAAE,QAAQ,CAAC,aAAa,CAAC,gBAAgB;YACpD,YAAY,EAAE,QAAQ,CAAC,aAAa,CAAC,oBAAoB;YACzD,YAAY,EAAE,QAAQ,CAAC,aAAa,CAAC,uBAAuB;SAC7D,CAAC;IACJ,CAAC;IAED,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;YACtB,WAAW,CAAC,OAAO,GAAG,qBAAqB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACjE,CAAC;QAED,IAAI,SAAS,CAAC,YAAY,EAAE,CAAC;YAC3B,WAAW,CAAC,YAAY,GAAG,SAAS,CAAC,YAAY,CAAC;YAElD,IAAI,SAAS,CAAC,YAAY,KAAK,YAAY,CAAC,IAAI,EAAE,CAAC;gBACjD,WAAW,CAAC,SAAS,GAAG,SAAS,CAAC,YAAY,CAAC;gBAC/C,WAAW,CAAC,YAAY,GAAI,SAAiB,CAAC,aAAa,CAAC;YAC9D,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,IAAI,GAAG,SAAgB,CAAC;QAC9B,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC1B,WAAmB,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC;QAClE,CAAC;QACD,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACzB,WAAmB,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC;QAChE,CAAC;IACH,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { GenerateContentResponse } from "@google/genai";
2
+ import type { LlmResponse } from "../response.js";
3
+ /**
4
+ * Aggregates partial streaming responses.
5
+ *
6
+ * It aggregates content from partial responses, and generates LlmResponses for
7
+ * individual (partial) model responses, as well as for aggregated content.
8
+ */
9
+ export declare class StreamingResponseAggregator {
10
+ private usageMetadata?;
11
+ private response?;
12
+ private partsSequence;
13
+ private currentTextBuffer;
14
+ private currentTextIsThought?;
15
+ private finishReason?;
16
+ private currentFcName?;
17
+ private currentFcArgs;
18
+ private currentFcId?;
19
+ private currentThoughtSignature?;
20
+ private flushTextBufferToSequence;
21
+ private getValueFromPartialArg;
22
+ private setValueByJsonPath;
23
+ private flushFunctionCallToSequence;
24
+ private processStreamingFunctionCall;
25
+ private processFunctionCallPart;
26
+ processResponse(response: GenerateContentResponse): AsyncGenerator<LlmResponse, void, void>;
27
+ close(): LlmResponse | undefined;
28
+ }
@@ -0,0 +1,235 @@
1
+ import { GenerateContentResponse, FinishReason } from "@google/genai";
2
+ import { generateClientFunctionCallId } from "../../core/functions.js";
3
+ import { isTextContentPart, isThoughtContentPart, isFunctionCallContentPart, } from "../../content.js";
4
+ import { createLlmResponse } from "./gemini_response_utils.js";
5
+ /**
6
+ * Aggregates partial streaming responses.
7
+ *
8
+ * It aggregates content from partial responses, and generates LlmResponses for
9
+ * individual (partial) model responses, as well as for aggregated content.
10
+ */
11
+ export class StreamingResponseAggregator {
12
+ constructor() {
13
+ // For progressive SSE streaming mode: accumulate parts in order
14
+ this.partsSequence = [];
15
+ this.currentTextBuffer = "";
16
+ this.currentFcArgs = {};
17
+ }
18
+ flushTextBufferToSequence() {
19
+ if (!this.currentTextBuffer) {
20
+ return;
21
+ }
22
+ if (this.currentTextIsThought) {
23
+ this.partsSequence.push({
24
+ type: "thought",
25
+ thought: this.currentTextBuffer,
26
+ });
27
+ }
28
+ else {
29
+ this.partsSequence.push({
30
+ type: "text",
31
+ text: this.currentTextBuffer,
32
+ });
33
+ }
34
+ this.currentTextBuffer = "";
35
+ this.currentTextIsThought = undefined;
36
+ }
37
+ getValueFromPartialArg(partialArg, jsonPath) {
38
+ let value = null;
39
+ let hasValue = false;
40
+ const stringValue = partialArg.stringValue;
41
+ const numberValue = partialArg.numberValue;
42
+ const boolValue = partialArg.boolValue;
43
+ const nullValue = partialArg.nullValue;
44
+ if (stringValue !== undefined) {
45
+ const stringChunk = stringValue;
46
+ hasValue = true;
47
+ const pathWithoutPrefix = jsonPath.startsWith("$.")
48
+ ? jsonPath.slice(2)
49
+ : jsonPath;
50
+ const pathParts = pathWithoutPrefix.split(".");
51
+ let existingValue = this.currentFcArgs;
52
+ for (const part of pathParts) {
53
+ if (existingValue &&
54
+ typeof existingValue === "object" &&
55
+ part in existingValue) {
56
+ existingValue = existingValue[part];
57
+ }
58
+ else {
59
+ break;
60
+ }
61
+ }
62
+ if (typeof existingValue === "string") {
63
+ value = existingValue + stringChunk;
64
+ }
65
+ else {
66
+ value = stringChunk;
67
+ }
68
+ }
69
+ else if (numberValue !== undefined) {
70
+ value = numberValue;
71
+ hasValue = true;
72
+ }
73
+ else if (boolValue !== undefined) {
74
+ value = boolValue;
75
+ hasValue = true;
76
+ }
77
+ else if (nullValue !== undefined) {
78
+ value = null;
79
+ hasValue = true;
80
+ }
81
+ return [value, hasValue];
82
+ }
83
+ setValueByJsonPath(jsonPath, value) {
84
+ const path = jsonPath.startsWith("$.") ? jsonPath.slice(2) : jsonPath;
85
+ const pathParts = path.split(".");
86
+ let current = this.currentFcArgs;
87
+ for (let i = 0; i < pathParts.length - 1; i++) {
88
+ const part = pathParts[i];
89
+ if (!(part in current)) {
90
+ current[part] = {};
91
+ }
92
+ current = current[part];
93
+ }
94
+ current[pathParts[pathParts.length - 1]] = value;
95
+ }
96
+ flushFunctionCallToSequence() {
97
+ if (this.currentFcName) {
98
+ const fcPart = {
99
+ type: "function_call",
100
+ name: this.currentFcName,
101
+ args: JSON.parse(JSON.stringify(this.currentFcArgs)),
102
+ id: this.currentFcId ?? generateClientFunctionCallId(),
103
+ };
104
+ if (this.currentThoughtSignature) {
105
+ fcPart.thoughtSignature = this.currentThoughtSignature.toString();
106
+ }
107
+ this.partsSequence.push(fcPart);
108
+ this.currentFcName = undefined;
109
+ this.currentFcArgs = {};
110
+ this.currentFcId = undefined;
111
+ this.currentThoughtSignature = undefined;
112
+ }
113
+ }
114
+ processStreamingFunctionCall(fc) {
115
+ if (fc.name) {
116
+ this.currentFcName = fc.name;
117
+ }
118
+ if (fc.id) {
119
+ this.currentFcId = fc.id;
120
+ }
121
+ for (const partialArg of fc.partialArgs || []) {
122
+ const jsonPath = partialArg.jsonPath;
123
+ if (!jsonPath) {
124
+ continue;
125
+ }
126
+ const [value, hasValue] = this.getValueFromPartialArg(partialArg, jsonPath);
127
+ if (hasValue) {
128
+ this.setValueByJsonPath(jsonPath, value);
129
+ }
130
+ }
131
+ if (!fc.willContinue) {
132
+ this.flushTextBufferToSequence();
133
+ this.flushFunctionCallToSequence();
134
+ }
135
+ }
136
+ processFunctionCallPart(part) {
137
+ const fc = part;
138
+ if (fc.partialArgs || fc.willContinue) {
139
+ if (!fc.id && !this.currentFcId) {
140
+ fc.id = generateClientFunctionCallId();
141
+ }
142
+ if (part.thoughtSignature && !this.currentThoughtSignature) {
143
+ this.currentThoughtSignature = part.thoughtSignature;
144
+ }
145
+ this.processStreamingFunctionCall(fc);
146
+ }
147
+ else {
148
+ if (fc.name) {
149
+ if (!fc.id) {
150
+ fc.id = generateClientFunctionCallId();
151
+ }
152
+ this.flushTextBufferToSequence();
153
+ this.partsSequence.push(part);
154
+ }
155
+ }
156
+ }
157
+ async *processResponse(response) {
158
+ this.response = response;
159
+ const llmResponse = createLlmResponse(response);
160
+ this.usageMetadata = llmResponse.usageMetadata;
161
+ // if (llmResponse.groundingMetadata) {
162
+ // this.groundingMetadata = llmResponse.groundingMetadata;
163
+ // }
164
+ // if (llmResponse.citationMetadata) {
165
+ // this.citationMetadata = llmResponse.citationMetadata;
166
+ // }
167
+ if (llmResponse.finishReason) {
168
+ this.finishReason = llmResponse.finishReason;
169
+ }
170
+ if (llmResponse.content && llmResponse.content.parts) {
171
+ for (const part of llmResponse.content.parts) {
172
+ if (isTextContentPart(part)) {
173
+ const isThought = false;
174
+ if (this.currentTextBuffer &&
175
+ isThought !== this.currentTextIsThought) {
176
+ this.flushTextBufferToSequence();
177
+ }
178
+ if (!this.currentTextBuffer) {
179
+ this.currentTextIsThought = isThought;
180
+ }
181
+ this.currentTextBuffer += part.text;
182
+ }
183
+ else if (isThoughtContentPart(part)) {
184
+ const isThought = true;
185
+ if (this.currentTextBuffer &&
186
+ isThought !== this.currentTextIsThought) {
187
+ this.flushTextBufferToSequence();
188
+ }
189
+ if (!this.currentTextBuffer) {
190
+ this.currentTextIsThought = isThought;
191
+ }
192
+ this.currentTextBuffer += part.thought;
193
+ }
194
+ else if (isFunctionCallContentPart(part)) {
195
+ this.processFunctionCallPart(part);
196
+ }
197
+ else {
198
+ this.flushTextBufferToSequence();
199
+ this.partsSequence.push(part);
200
+ }
201
+ }
202
+ }
203
+ llmResponse.partial = true;
204
+ yield llmResponse;
205
+ }
206
+ close() {
207
+ if (!this.response?.candidates || this.response.candidates.length === 0) {
208
+ return;
209
+ }
210
+ this.flushTextBufferToSequence();
211
+ this.flushFunctionCallToSequence();
212
+ const finalParts = this.partsSequence;
213
+ if (finalParts.length === 0) {
214
+ return;
215
+ }
216
+ const candidate = this.response.candidates[0];
217
+ const finishReason = this.finishReason ?? candidate.finishReason;
218
+ return {
219
+ content: {
220
+ role: "agent",
221
+ parts: finalParts,
222
+ },
223
+ // groundingMetadata: this.groundingMetadata,
224
+ // citationMetadata: this.citationMetadata,
225
+ errorCode: finishReason === FinishReason.STOP ? undefined : finishReason,
226
+ errorMessage: finishReason === FinishReason.STOP
227
+ ? undefined
228
+ : candidate.finishMessage,
229
+ usageMetadata: this.usageMetadata,
230
+ finishReason: finishReason,
231
+ partial: false,
232
+ };
233
+ }
234
+ }
235
+ //# sourceMappingURL=gemini_streaming_utils.js.map