@chatcops/core 0.4.0 → 0.6.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 (243) hide show
  1. package/dist/agent/chat.d.ts +13 -0
  2. package/dist/agent/chat.d.ts.map +1 -0
  3. package/dist/agent/chat.js +42 -0
  4. package/dist/agent/chat.js.map +1 -0
  5. package/dist/agent/errors.d.ts +14 -0
  6. package/dist/agent/errors.d.ts.map +1 -0
  7. package/dist/agent/errors.js +24 -0
  8. package/dist/agent/errors.js.map +1 -0
  9. package/dist/agent/index.d.ts +5 -0
  10. package/dist/agent/index.d.ts.map +1 -0
  11. package/dist/agent/index.js +5 -0
  12. package/dist/agent/index.js.map +1 -0
  13. package/dist/agent/run-turn.d.ts +79 -0
  14. package/dist/agent/run-turn.d.ts.map +1 -0
  15. package/dist/agent/run-turn.js +400 -0
  16. package/dist/agent/run-turn.js.map +1 -0
  17. package/dist/agent/tool-registry.d.ts +30 -0
  18. package/dist/agent/tool-registry.d.ts.map +1 -0
  19. package/dist/agent/tool-registry.js +66 -0
  20. package/dist/agent/tool-registry.js.map +1 -0
  21. package/dist/analytics/collector.d.ts +2 -0
  22. package/dist/analytics/collector.d.ts.map +1 -1
  23. package/dist/analytics/collector.js +16 -10
  24. package/dist/analytics/collector.js.map +1 -1
  25. package/dist/analytics/index.d.ts +2 -0
  26. package/dist/analytics/index.d.ts.map +1 -1
  27. package/dist/analytics/index.js +2 -0
  28. package/dist/analytics/index.js.map +1 -1
  29. package/dist/analytics/names.d.ts +21 -0
  30. package/dist/analytics/names.d.ts.map +1 -0
  31. package/dist/analytics/names.js +41 -0
  32. package/dist/analytics/names.js.map +1 -0
  33. package/dist/analytics/sink.d.ts +27 -0
  34. package/dist/analytics/sink.d.ts.map +1 -0
  35. package/dist/analytics/sink.js +109 -0
  36. package/dist/analytics/sink.js.map +1 -0
  37. package/dist/conversation/index.d.ts +1 -0
  38. package/dist/conversation/index.d.ts.map +1 -1
  39. package/dist/conversation/index.js.map +1 -1
  40. package/dist/conversation/manager.d.ts +65 -6
  41. package/dist/conversation/manager.d.ts.map +1 -1
  42. package/dist/conversation/manager.js +110 -34
  43. package/dist/conversation/manager.js.map +1 -1
  44. package/dist/conversation/store.d.ts +6 -5
  45. package/dist/conversation/store.d.ts.map +1 -1
  46. package/dist/conversation/store.js +4 -0
  47. package/dist/conversation/store.js.map +1 -1
  48. package/dist/index.d.ts +21 -4
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +16 -2
  51. package/dist/index.js.map +1 -1
  52. package/dist/knowledge/base.d.ts +8 -0
  53. package/dist/knowledge/base.d.ts.map +1 -1
  54. package/dist/knowledge/tokenize.d.ts.map +1 -1
  55. package/dist/knowledge/tokenize.js +4 -4
  56. package/dist/knowledge/tokenize.js.map +1 -1
  57. package/dist/limits/budget.d.ts +84 -0
  58. package/dist/limits/budget.d.ts.map +1 -0
  59. package/dist/limits/budget.js +114 -0
  60. package/dist/limits/budget.js.map +1 -0
  61. package/dist/limits/rate-limit.d.ts +53 -0
  62. package/dist/limits/rate-limit.d.ts.map +1 -0
  63. package/dist/limits/rate-limit.js +68 -0
  64. package/dist/limits/rate-limit.js.map +1 -0
  65. package/dist/logger.d.ts +36 -0
  66. package/dist/logger.d.ts.map +1 -0
  67. package/dist/logger.js +40 -0
  68. package/dist/logger.js.map +1 -0
  69. package/dist/parts.d.ts +9 -0
  70. package/dist/parts.d.ts.map +1 -0
  71. package/dist/parts.js +17 -0
  72. package/dist/parts.js.map +1 -0
  73. package/dist/protocol/ai-sdk.d.ts +27 -0
  74. package/dist/protocol/ai-sdk.d.ts.map +1 -0
  75. package/dist/protocol/ai-sdk.js +127 -0
  76. package/dist/protocol/ai-sdk.js.map +1 -0
  77. package/dist/protocol/errors.d.ts +10 -0
  78. package/dist/protocol/errors.d.ts.map +1 -0
  79. package/dist/protocol/errors.js +42 -0
  80. package/dist/protocol/errors.js.map +1 -0
  81. package/dist/protocol/index.d.ts +9 -0
  82. package/dist/protocol/index.d.ts.map +1 -0
  83. package/dist/protocol/index.js +6 -0
  84. package/dist/protocol/index.js.map +1 -0
  85. package/dist/protocol/legacy.d.ts +18 -0
  86. package/dist/protocol/legacy.d.ts.map +1 -0
  87. package/dist/protocol/legacy.js +41 -0
  88. package/dist/protocol/legacy.js.map +1 -0
  89. package/dist/protocol/sse.d.ts +10 -0
  90. package/dist/protocol/sse.d.ts.map +1 -0
  91. package/dist/protocol/sse.js +15 -0
  92. package/dist/protocol/sse.js.map +1 -0
  93. package/dist/protocol/v1.d.ts +140 -0
  94. package/dist/protocol/v1.d.ts.map +1 -0
  95. package/dist/protocol/v1.js +15 -0
  96. package/dist/protocol/v1.js.map +1 -0
  97. package/dist/providers/base.d.ts +13 -28
  98. package/dist/providers/base.d.ts.map +1 -1
  99. package/dist/providers/base.js +36 -47
  100. package/dist/providers/base.js.map +1 -1
  101. package/dist/providers/claude.d.ts +41 -6
  102. package/dist/providers/claude.d.ts.map +1 -1
  103. package/dist/providers/claude.js +223 -96
  104. package/dist/providers/claude.js.map +1 -1
  105. package/dist/providers/gemini.d.ts +18 -3
  106. package/dist/providers/gemini.d.ts.map +1 -1
  107. package/dist/providers/gemini.js +208 -91
  108. package/dist/providers/gemini.js.map +1 -1
  109. package/dist/providers/history.d.ts +52 -0
  110. package/dist/providers/history.d.ts.map +1 -0
  111. package/dist/providers/history.js +212 -0
  112. package/dist/providers/history.js.map +1 -0
  113. package/dist/providers/index.d.ts +5 -5
  114. package/dist/providers/index.d.ts.map +1 -1
  115. package/dist/providers/index.js +5 -4
  116. package/dist/providers/index.js.map +1 -1
  117. package/dist/providers/openai.d.ts +28 -6
  118. package/dist/providers/openai.d.ts.map +1 -1
  119. package/dist/providers/openai.js +213 -113
  120. package/dist/providers/openai.js.map +1 -1
  121. package/dist/providers/registry.d.ts +7 -0
  122. package/dist/providers/registry.d.ts.map +1 -0
  123. package/dist/providers/registry.js +12 -0
  124. package/dist/providers/registry.js.map +1 -0
  125. package/dist/providers/schema.d.ts +16 -0
  126. package/dist/providers/schema.d.ts.map +1 -0
  127. package/dist/providers/schema.js +80 -0
  128. package/dist/providers/schema.js.map +1 -0
  129. package/dist/providers/tool-execution.d.ts +13 -0
  130. package/dist/providers/tool-execution.d.ts.map +1 -1
  131. package/dist/providers/tool-execution.js +49 -13
  132. package/dist/providers/tool-execution.js.map +1 -1
  133. package/dist/providers/types.d.ts +89 -0
  134. package/dist/providers/types.d.ts.map +1 -0
  135. package/dist/providers/types.js +2 -0
  136. package/dist/providers/types.js.map +1 -0
  137. package/dist/retrieval/citations.d.ts +44 -0
  138. package/dist/retrieval/citations.d.ts.map +1 -0
  139. package/dist/retrieval/citations.js +97 -0
  140. package/dist/retrieval/citations.js.map +1 -0
  141. package/dist/retrieval/cohere-reranker.d.ts +13 -0
  142. package/dist/retrieval/cohere-reranker.d.ts.map +1 -0
  143. package/dist/retrieval/cohere-reranker.js +33 -0
  144. package/dist/retrieval/cohere-reranker.js.map +1 -0
  145. package/dist/retrieval/gemini-embedder.d.ts +26 -0
  146. package/dist/retrieval/gemini-embedder.d.ts.map +1 -0
  147. package/dist/retrieval/gemini-embedder.js +36 -0
  148. package/dist/retrieval/gemini-embedder.js.map +1 -0
  149. package/dist/retrieval/http.d.ts +20 -0
  150. package/dist/retrieval/http.d.ts.map +1 -0
  151. package/dist/retrieval/http.js +68 -0
  152. package/dist/retrieval/http.js.map +1 -0
  153. package/dist/retrieval/index.d.ts +14 -0
  154. package/dist/retrieval/index.d.ts.map +1 -0
  155. package/dist/retrieval/index.js +13 -0
  156. package/dist/retrieval/index.js.map +1 -0
  157. package/dist/retrieval/knowledge.d.ts +16 -0
  158. package/dist/retrieval/knowledge.d.ts.map +1 -0
  159. package/dist/retrieval/knowledge.js +21 -0
  160. package/dist/retrieval/knowledge.js.map +1 -0
  161. package/dist/retrieval/openai-embedder.d.ts +25 -0
  162. package/dist/retrieval/openai-embedder.d.ts.map +1 -0
  163. package/dist/retrieval/openai-embedder.js +30 -0
  164. package/dist/retrieval/openai-embedder.js.map +1 -0
  165. package/dist/retrieval/query.d.ts +8 -0
  166. package/dist/retrieval/query.d.ts.map +1 -0
  167. package/dist/retrieval/query.js +19 -0
  168. package/dist/retrieval/query.js.map +1 -0
  169. package/dist/retrieval/retrievers.d.ts +30 -0
  170. package/dist/retrieval/retrievers.d.ts.map +1 -0
  171. package/dist/retrieval/retrievers.js +89 -0
  172. package/dist/retrieval/retrievers.js.map +1 -0
  173. package/dist/retrieval/sources.d.ts +16 -0
  174. package/dist/retrieval/sources.d.ts.map +1 -0
  175. package/dist/retrieval/sources.js +37 -0
  176. package/dist/retrieval/sources.js.map +1 -0
  177. package/dist/retrieval/types.d.ts +50 -0
  178. package/dist/retrieval/types.d.ts.map +1 -0
  179. package/dist/retrieval/types.js +2 -0
  180. package/dist/retrieval/types.js.map +1 -0
  181. package/dist/retrieval/voyage-embedder.d.ts +33 -0
  182. package/dist/retrieval/voyage-embedder.d.ts.map +1 -0
  183. package/dist/retrieval/voyage-embedder.js +33 -0
  184. package/dist/retrieval/voyage-embedder.js.map +1 -0
  185. package/dist/retrieval/voyage-reranker.d.ts +13 -0
  186. package/dist/retrieval/voyage-reranker.d.ts.map +1 -0
  187. package/dist/retrieval/voyage-reranker.js +38 -0
  188. package/dist/retrieval/voyage-reranker.js.map +1 -0
  189. package/dist/retrieval/workers-ai-embedder.d.ts +21 -0
  190. package/dist/retrieval/workers-ai-embedder.d.ts.map +1 -0
  191. package/dist/retrieval/workers-ai-embedder.js +42 -0
  192. package/dist/retrieval/workers-ai-embedder.js.map +1 -0
  193. package/dist/retrieval/workers-ai-reranker.d.ts +11 -0
  194. package/dist/retrieval/workers-ai-reranker.d.ts.map +1 -0
  195. package/dist/retrieval/workers-ai-reranker.js +54 -0
  196. package/dist/retrieval/workers-ai-reranker.js.map +1 -0
  197. package/dist/storage/adapt.d.ts +15 -0
  198. package/dist/storage/adapt.d.ts.map +1 -0
  199. package/dist/storage/adapt.js +83 -0
  200. package/dist/storage/adapt.js.map +1 -0
  201. package/dist/storage/errors.d.ts +18 -0
  202. package/dist/storage/errors.d.ts.map +1 -0
  203. package/dist/storage/errors.js +28 -0
  204. package/dist/storage/errors.js.map +1 -0
  205. package/dist/storage/index.d.ts +6 -0
  206. package/dist/storage/index.d.ts.map +1 -0
  207. package/dist/storage/index.js +5 -0
  208. package/dist/storage/index.js.map +1 -0
  209. package/dist/storage/memory-vectors.d.ts +22 -0
  210. package/dist/storage/memory-vectors.d.ts.map +1 -0
  211. package/dist/storage/memory-vectors.js +140 -0
  212. package/dist/storage/memory-vectors.js.map +1 -0
  213. package/dist/storage/memory.d.ts +24 -0
  214. package/dist/storage/memory.d.ts.map +1 -0
  215. package/dist/storage/memory.js +265 -0
  216. package/dist/storage/memory.js.map +1 -0
  217. package/dist/storage/types.d.ts +188 -0
  218. package/dist/storage/types.d.ts.map +1 -0
  219. package/dist/storage/types.js +2 -0
  220. package/dist/storage/types.js.map +1 -0
  221. package/dist/testing/conformance.d.ts +30 -0
  222. package/dist/testing/conformance.d.ts.map +1 -0
  223. package/dist/testing/conformance.js +505 -0
  224. package/dist/testing/conformance.js.map +1 -0
  225. package/dist/testing/index.d.ts +3 -0
  226. package/dist/testing/index.d.ts.map +1 -0
  227. package/dist/testing/index.js +5 -0
  228. package/dist/testing/index.js.map +1 -0
  229. package/dist/testing/provider.d.ts +47 -0
  230. package/dist/testing/provider.d.ts.map +1 -0
  231. package/dist/testing/provider.js +83 -0
  232. package/dist/testing/provider.js.map +1 -0
  233. package/dist/tools/base.d.ts +14 -4
  234. package/dist/tools/base.d.ts.map +1 -1
  235. package/dist/tools/base.js +4 -2
  236. package/dist/tools/base.js.map +1 -1
  237. package/dist/tools/lead-capture.d.ts +4 -2
  238. package/dist/tools/lead-capture.d.ts.map +1 -1
  239. package/dist/tools/lead-capture.js +7 -2
  240. package/dist/tools/lead-capture.js.map +1 -1
  241. package/dist/types.d.ts +146 -7
  242. package/dist/types.d.ts.map +1 -1
  243. package/package.json +51 -3
@@ -1,12 +1,12 @@
1
- import { GoogleGenAI, ThinkingLevel, } from '@google/genai';
2
- import { DEFAULT_MAX_TOKENS, normalizeHistory, toGeminiTools } from './base.js';
3
- import { MAX_TOOL_ROUNDS, executeToolCall, serializeToolResult, } from './tool-execution.js';
1
+ import { FinishReason as GeminiFinishReason, GoogleGenAI, ThinkingLevel, } from '@google/genai';
2
+ import { chatSyncViaTurn, chatViaTurn } from '../agent/chat.js';
3
+ import { joinSystem } from '../agent/run-turn.js';
4
+ import { DEFAULT_MAX_TOKENS, toGeminiTools } from './base.js';
5
+ import { normalizeTurns } from './history.js';
4
6
  const DEFAULT_MODEL = 'gemini-3.5-flash-lite';
5
7
  const DEFAULT_EFFORT = 'low';
6
- let toolCallSequence = 0;
7
8
  function createToolCallId() {
8
- toolCallSequence += 1;
9
- return `gemini_tool_call_${toolCallSequence}`;
9
+ return `gemini_call_${crypto.randomUUID()}`;
10
10
  }
11
11
  const THINKING_LEVELS = {
12
12
  low: ThinkingLevel.LOW,
@@ -20,30 +20,120 @@ export function geminiSupportsThinkingLevel(model) {
20
20
  const major = Number(model.match(/gemini-(\d+)/)?.[1] ?? 0);
21
21
  return major >= 3;
22
22
  }
23
+ function geminiMetadata(part) {
24
+ return 'providerMetadata' in part ? part.providerMetadata?.gemini : undefined;
25
+ }
26
+ /**
27
+ * Gemini 3 wants a thought signature on the first function call of each
28
+ * step. Calls that came from another provider have none, and Google
29
+ * documents this value for that case.
30
+ */
31
+ const PLACEHOLDER_SIGNATURE = 'skip_thought_signature_validator';
23
32
  /**
24
- * Builds the full request history. The API is stateless, so every round sends
25
- * the whole conversation: normalized stored messages, then any model turns
26
- * and tool results from earlier rounds of this reply.
33
+ * Stored history as Gemini contents. An assistant message with tool calls
34
+ * becomes a model turn with its `functionCall` parts, then a user turn with
35
+ * the `functionResponse` parts, for each step. Thought signatures go back on
36
+ * the parts they came with.
27
37
  */
28
- function toGeminiContents(params) {
29
- const contents = normalizeHistory(params.messages).map((message) => ({
30
- role: message.role === 'assistant' ? 'model' : 'user',
31
- parts: [{ text: message.content }],
32
- }));
38
+ export function toGeminiStepContents(messages, model = DEFAULT_MODEL) {
39
+ const contents = [];
40
+ const needsSignature = geminiSupportsThinkingLevel(model);
41
+ const synthetic = new Set();
42
+ const push = (role, parts) => {
43
+ if (parts.length === 0)
44
+ return;
45
+ const last = contents.at(-1);
46
+ if (last?.role === role)
47
+ last.parts = [...(last.parts ?? []), ...parts];
48
+ else
49
+ contents.push({ role, parts });
50
+ };
51
+ for (const turn of normalizeTurns(messages)) {
52
+ let role = turn.role === 'assistant' ? 'model' : 'user';
53
+ let run = [];
54
+ let signedCall = false;
55
+ for (const part of turn.parts) {
56
+ const partRole = part.type === 'tool-result' ? 'user' : turn.role === 'assistant' ? 'model' : 'user';
57
+ if (partRole !== role) {
58
+ push(role, run);
59
+ run = [];
60
+ role = partRole;
61
+ signedCall = false;
62
+ }
63
+ const meta = geminiMetadata(part);
64
+ const signature = meta?.thoughtSignature ? { thoughtSignature: meta.thoughtSignature } : {};
65
+ switch (part.type) {
66
+ case 'text':
67
+ run.push({ text: part.text, ...signature });
68
+ break;
69
+ case 'reasoning':
70
+ // Thoughts from another provider mean nothing to Gemini.
71
+ if (meta)
72
+ run.push({ text: part.text, thought: true, ...signature });
73
+ break;
74
+ case 'tool-call': {
75
+ if (meta?.syntheticId)
76
+ synthetic.add(part.toolCallId);
77
+ const args = typeof part.input === 'object' && part.input !== null && !Array.isArray(part.input)
78
+ ? part.input
79
+ : {};
80
+ const placeholder = needsSignature && !signedCall && !meta?.thoughtSignature
81
+ ? { thoughtSignature: PLACEHOLDER_SIGNATURE }
82
+ : {};
83
+ signedCall = true;
84
+ run.push({
85
+ functionCall: { ...(meta?.syntheticId ? {} : { id: part.toolCallId }), name: part.toolName, args },
86
+ ...signature,
87
+ ...placeholder,
88
+ });
89
+ break;
90
+ }
91
+ case 'tool-result':
92
+ run.push({
93
+ functionResponse: {
94
+ ...(synthetic.has(part.toolCallId) ? {} : { id: part.toolCallId }),
95
+ name: part.toolName,
96
+ response: part.output ?? { success: false, message: part.error },
97
+ },
98
+ });
99
+ break;
100
+ }
101
+ }
102
+ push(role, run);
103
+ }
33
104
  if (contents.length === 0) {
34
105
  throw new Error('Cannot send a request with no user message.');
35
106
  }
36
107
  return contents;
37
108
  }
38
- /** Text parts only, without thought summaries. */
39
- function visibleText(parts) {
40
- return parts
41
- .filter((part) => typeof part.text === 'string' && !part.thought)
42
- .map((part) => part.text)
43
- .join('');
109
+ const CONTENT_FILTERED = new Set([
110
+ GeminiFinishReason.SAFETY,
111
+ GeminiFinishReason.RECITATION,
112
+ GeminiFinishReason.BLOCKLIST,
113
+ GeminiFinishReason.PROHIBITED_CONTENT,
114
+ GeminiFinishReason.SPII,
115
+ GeminiFinishReason.IMAGE_SAFETY,
116
+ GeminiFinishReason.IMAGE_PROHIBITED_CONTENT,
117
+ ]);
118
+ function finishReason(reason, blocked, hasToolCalls) {
119
+ if (blocked || (reason && CONTENT_FILTERED.has(reason)))
120
+ return 'content-filter';
121
+ if (reason === GeminiFinishReason.MAX_TOKENS)
122
+ return 'length';
123
+ if (reason === GeminiFinishReason.MALFORMED_FUNCTION_CALL || reason === GeminiFinishReason.UNEXPECTED_TOOL_CALL)
124
+ return 'error';
125
+ if (hasToolCalls)
126
+ return 'tool-calls';
127
+ return 'stop';
44
128
  }
45
- function partsOf(response) {
46
- return response.candidates?.[0]?.content?.parts ?? [];
129
+ /** Thinking tokens are billed as output, so they count as output here. */
130
+ function toUsage(usage) {
131
+ const cached = usage?.cachedContentTokenCount ?? 0;
132
+ return {
133
+ inputTokens: usage?.promptTokenCount ?? 0,
134
+ outputTokens: (usage?.candidatesTokenCount ?? 0) + (usage?.thoughtsTokenCount ?? 0),
135
+ ...(cached ? { cacheReadTokens: cached } : {}),
136
+ };
47
137
  }
48
138
  export class GeminiProvider {
49
139
  name = 'gemini';
@@ -51,16 +141,25 @@ export class GeminiProvider {
51
141
  model;
52
142
  effort;
53
143
  constructor(config) {
144
+ if (!config.apiKey?.trim())
145
+ throw new Error('gemini requires apiKey');
54
146
  this.ai = new GoogleGenAI({
55
147
  apiKey: config.apiKey,
56
- ...(config.baseURL ? { httpOptions: { baseUrl: config.baseURL } } : {}),
148
+ ...(config.baseURL || config.fetch
149
+ ? {
150
+ httpOptions: {
151
+ ...(config.baseURL ? { baseUrl: config.baseURL } : {}),
152
+ ...(config.fetch ? { fetch: config.fetch } : {}),
153
+ },
154
+ }
155
+ : {}),
57
156
  });
58
157
  this.model = config.model ?? DEFAULT_MODEL;
59
158
  this.effort = config.effort ?? DEFAULT_EFFORT;
60
159
  }
61
160
  config(params) {
62
161
  return {
63
- systemInstruction: params.systemPrompt,
162
+ systemInstruction: joinSystem(params.systemPrompt, params.systemContext),
64
163
  maxOutputTokens: params.maxTokens ?? DEFAULT_MAX_TOKENS,
65
164
  ...(params.temperature != null ? { temperature: params.temperature } : {}),
66
165
  ...(params.tools?.length ? { tools: toGeminiTools(params.tools) } : {}),
@@ -70,79 +169,97 @@ export class GeminiProvider {
70
169
  ...(params.signal ? { abortSignal: params.signal } : {}),
71
170
  };
72
171
  }
73
- async *chat(params) {
74
- const contents = toGeminiContents(params);
75
- const config = this.config(params);
76
- let toolRounds = 0;
77
- while (true) {
78
- params.signal?.throwIfAborted();
79
- const stream = await this.ai.models.generateContentStream({ model: this.model, contents, config });
80
- // Keep every part the model sent (function calls carry thought signatures
81
- // that Gemini 3 needs back on the next round).
82
- const modelParts = [];
83
- const functionCalls = [];
84
- for await (const chunk of stream) {
85
- const parts = partsOf(chunk);
86
- modelParts.push(...parts);
87
- const text = visibleText(parts);
88
- if (text) {
89
- yield text;
172
+ /** One model request: streams text and thoughts, then reports tool calls, usage and why it stopped. */
173
+ async *step(params) {
174
+ params.signal?.throwIfAborted();
175
+ const stream = await this.ai.models.generateContentStream({
176
+ model: this.model,
177
+ contents: toGeminiStepContents(params.messages, this.model),
178
+ config: this.config(params),
179
+ });
180
+ const parts = [];
181
+ const calls = [];
182
+ // Text and thoughts arrive in pieces. A signature ends the part it's on.
183
+ let current = null;
184
+ let reason;
185
+ let blocked = false;
186
+ let usage;
187
+ for await (const chunk of stream) {
188
+ if (chunk.usageMetadata)
189
+ usage = chunk.usageMetadata;
190
+ if (chunk.promptFeedback?.blockReason)
191
+ blocked = true;
192
+ const candidate = chunk.candidates?.[0];
193
+ if (candidate?.finishReason)
194
+ reason = candidate.finishReason;
195
+ for (const part of candidate?.content?.parts ?? []) {
196
+ const signature = part.thoughtSignature;
197
+ if (part.functionCall) {
198
+ current = null;
199
+ const call = part.functionCall;
200
+ const syntheticId = !call.id;
201
+ const meta = {
202
+ ...(signature ? { thoughtSignature: signature } : {}),
203
+ ...(syntheticId ? { syntheticId: true } : {}),
204
+ };
205
+ const toolCall = {
206
+ type: 'tool-call',
207
+ toolCallId: call.id ?? createToolCallId(),
208
+ toolName: call.name ?? '',
209
+ input: call.args ?? {},
210
+ executor: 'server',
211
+ state: 'pending',
212
+ ...(Object.keys(meta).length ? { providerMetadata: { gemini: { ...meta } } } : {}),
213
+ };
214
+ parts.push(toolCall);
215
+ calls.push(toolCall);
216
+ continue;
90
217
  }
91
- for (const part of parts) {
92
- if (part.functionCall)
93
- functionCalls.push(part.functionCall);
218
+ if (typeof part.text === 'string') {
219
+ const kind = part.thought ? 'reasoning' : 'text';
220
+ if (!current || current.type !== kind) {
221
+ const next = kind === 'text' ? { type: 'text', text: '' } : { type: 'reasoning', text: '' };
222
+ parts.push(next);
223
+ current = next;
224
+ }
225
+ current.text += part.text;
226
+ if (part.text)
227
+ yield { type: kind === 'text' ? 'text-delta' : 'reasoning-delta', delta: part.text };
228
+ }
229
+ if (signature) {
230
+ const target = current ?? parts.at(-1);
231
+ if (target && (target.type === 'text' || target.type === 'reasoning')) {
232
+ target.providerMetadata = { gemini: { thoughtSignature: signature } };
233
+ }
234
+ current = null;
94
235
  }
95
236
  }
96
- if (functionCalls.length === 0) {
97
- return;
98
- }
99
- if (toolRounds >= MAX_TOOL_ROUNDS) {
100
- throw new Error(`Exceeded maximum tool rounds (${MAX_TOOL_ROUNDS}).`);
101
- }
102
- toolRounds += 1;
103
- contents.push({ role: 'model', parts: modelParts });
104
- contents.push({ role: 'user', parts: await this.runTools(params, functionCalls) });
105
237
  }
106
- }
107
- async chatSync(params) {
108
- const contents = toGeminiContents(params);
109
- const config = this.config(params);
110
- let toolRounds = 0;
111
- let text = '';
112
- while (true) {
113
- params.signal?.throwIfAborted();
114
- const response = await this.ai.models.generateContent({ model: this.model, contents, config });
115
- const parts = partsOf(response);
116
- text += visibleText(parts);
117
- const functionCalls = parts
118
- .map((part) => part.functionCall)
119
- .filter((call) => call !== undefined);
120
- if (functionCalls.length === 0) {
121
- return text;
122
- }
123
- if (toolRounds >= MAX_TOOL_ROUNDS) {
124
- throw new Error(`Exceeded maximum tool rounds (${MAX_TOOL_ROUNDS}).`);
125
- }
126
- toolRounds += 1;
127
- contents.push({ role: 'model', parts });
128
- contents.push({ role: 'user', parts: await this.runTools(params, functionCalls) });
238
+ params.signal?.throwIfAborted();
239
+ for (const call of calls) {
240
+ yield {
241
+ type: 'tool-call',
242
+ call: { id: call.toolCallId, name: call.toolName, input: call.input },
243
+ ...(call.toolName ? {} : { inputError: 'The model sent a function call without a name.' }),
244
+ };
129
245
  }
246
+ yield {
247
+ type: 'finish',
248
+ reason: finishReason(reason, blocked, calls.length > 0),
249
+ usage: toUsage(usage),
250
+ parts: parts.filter((part) => part.type !== 'text' || part.text !== '' || part.providerMetadata),
251
+ };
130
252
  }
131
- async runTools(params, calls) {
132
- return Promise.all(calls.map(async (call) => {
133
- const name = call.name ?? '';
134
- const id = call.id ?? createToolCallId();
135
- const result = name
136
- ? await executeToolCall(params, { id, name, input: call.args ?? {} })
137
- : { success: false, message: 'The model sent a function call without a name.' };
138
- return {
139
- functionResponse: {
140
- ...(call.id ? { id: call.id } : {}),
141
- name,
142
- response: serializeToolResult(result),
143
- },
144
- };
145
- }));
253
+ /**
254
+ * A turn with tools run through `params.toolExecutor`, as text.
255
+ * @deprecated Use `runTurn()`, which also returns the reply's parts, status and usage.
256
+ */
257
+ chat(params) {
258
+ return chatViaTurn(this, params);
259
+ }
260
+ /** @deprecated Use `runTurn()`. */
261
+ chatSync(params) {
262
+ return chatSyncViaTurn(this, params);
146
263
  }
147
264
  }
148
265
  //# sourceMappingURL=gemini.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/providers/gemini.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/providers/gemini.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import type { ChatMessage, ReasoningPart, TextPart, ToolCallPart, ToolResultPart } from '../types.js';
2
+ export interface NormalizedMessage {
3
+ role: 'user' | 'assistant';
4
+ content: string;
5
+ }
6
+ /**
7
+ * Turns stored messages into a history every provider accepts: it starts with
8
+ * a user turn and alternates between user and assistant.
9
+ *
10
+ * - System messages and empty messages are dropped.
11
+ * - Leading assistant turns are dropped (history trimming can leave one first).
12
+ * - Consecutive turns with the same role are merged with a blank line, for
13
+ * example a user message saved before a provider call that then failed.
14
+ */
15
+ export declare function normalizeHistory(messages: ChatMessage[]): NormalizedMessage[];
16
+ /** The parts a model sees again on the next request. */
17
+ export type TurnPart = TextPart | ReasoningPart | ToolCallPart | ToolResultPart;
18
+ export interface NormalizedTurn {
19
+ role: 'user' | 'assistant';
20
+ parts: TurnPart[];
21
+ }
22
+ /**
23
+ * Like `normalizeHistory`, but keeps message parts, so tool calls, their
24
+ * results and reasoning signatures from earlier steps go back to the model.
25
+ *
26
+ * - System messages, empty messages and leading assistant turns are dropped.
27
+ * - Sources, captured leads and handoff notes are dropped; they're for people.
28
+ * - Turns with the same role in a row are merged, and text that meets across
29
+ * the join is combined with a blank line, as `normalizeHistory` does.
30
+ */
31
+ export declare function normalizeTurns(messages: ChatMessage[]): NormalizedTurn[];
32
+ /**
33
+ * A rough token count for budgeting, on the high side: about 3.5 characters
34
+ * per token for English, plus a few tokens of per-message overhead. Real
35
+ * counts differ by model; this only has to keep a long conversation from
36
+ * growing without bound. Messages with parts are counted by their parts, so
37
+ * tool inputs and results count too.
38
+ */
39
+ export declare function estimateTokens(message: Pick<ChatMessage, 'content' | 'parts'>): number;
40
+ /** History budget used when nothing else is configured. */
41
+ export declare const DEFAULT_MAX_HISTORY_TOKENS = 32000;
42
+ /**
43
+ * Keeps a conversation within a token budget before it goes to the model.
44
+ * The first user message stays (it usually says what the visitor came for),
45
+ * then as many of the newest messages as fit. The result never starts with
46
+ * an assistant turn. System messages are left out, since the system prompt
47
+ * is sent separately.
48
+ *
49
+ * Nothing stored changes; this only shapes what the model sees.
50
+ */
51
+ export declare function trimHistory(messages: ChatMessage[], maxTokens?: number): ChatMessage[];
52
+ //# sourceMappingURL=history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/providers/history.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EAEX,aAAa,EACb,QAAQ,EACR,YAAY,EACZ,cAAc,EACf,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,iBAAiB,EAAE,CAiB7E;AAED,wDAAwD;AACxD,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,aAAa,GAAG,YAAY,GAAG,cAAc,CAAC;AAEhF,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AA6ED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,cAAc,EAAE,CA0BxE;AAyBD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,SAAS,GAAG,OAAO,CAAC,GAAG,MAAM,CAKtF;AAED,2DAA2D;AAC3D,eAAO,MAAM,0BAA0B,QAAS,CAAC;AAEjD;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,WAAW,EAAE,EACvB,SAAS,GAAE,MAAmC,GAC7C,WAAW,EAAE,CA2Bf"}