@pencil-agent/nano-pencil 2.0.0-beta.2 → 2.0.0-beta.3

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 (179) hide show
  1. package/dist/build-meta.json +3 -3
  2. package/dist/node_modules/@pencil-agent/agent-core/dist/agent-loop-continuations.d.ts +17 -0
  3. package/dist/node_modules/@pencil-agent/agent-core/dist/agent-loop-continuations.js +60 -0
  4. package/dist/node_modules/@pencil-agent/agent-core/dist/agent-loop-stream-events.d.ts +19 -0
  5. package/dist/node_modules/@pencil-agent/agent-core/dist/agent-loop-stream-events.js +55 -0
  6. package/dist/node_modules/@pencil-agent/agent-core/dist/agent-loop-tool-results.d.ts +10 -0
  7. package/dist/node_modules/@pencil-agent/agent-core/dist/agent-loop-tool-results.js +137 -0
  8. package/dist/node_modules/@pencil-agent/agent-core/dist/agent-loop-tool-summaries.d.ts +22 -0
  9. package/dist/node_modules/@pencil-agent/agent-core/dist/agent-loop-tool-summaries.js +64 -0
  10. package/dist/node_modules/@pencil-agent/agent-core/dist/agent-loop.d.ts +26 -0
  11. package/dist/node_modules/@pencil-agent/agent-core/dist/agent-loop.js +913 -0
  12. package/dist/node_modules/@pencil-agent/agent-core/dist/agent-run-result.d.ts +9 -0
  13. package/dist/node_modules/@pencil-agent/agent-core/dist/agent-run-result.js +32 -0
  14. package/dist/node_modules/@pencil-agent/agent-core/dist/agent.d.ts +215 -0
  15. package/dist/node_modules/@pencil-agent/agent-core/dist/agent.js +522 -0
  16. package/dist/node_modules/@pencil-agent/agent-core/dist/errors.d.ts +62 -0
  17. package/dist/node_modules/@pencil-agent/agent-core/dist/errors.js +146 -0
  18. package/dist/node_modules/@pencil-agent/agent-core/dist/index.d.ts +14 -0
  19. package/dist/node_modules/@pencil-agent/agent-core/dist/index.js +19 -0
  20. package/dist/node_modules/@pencil-agent/agent-core/dist/proxy.d.ts +91 -0
  21. package/dist/node_modules/@pencil-agent/agent-core/dist/proxy.js +279 -0
  22. package/dist/node_modules/@pencil-agent/agent-core/dist/structured-adaptive-agent-loop.d.ts +15 -0
  23. package/dist/node_modules/@pencil-agent/agent-core/dist/structured-adaptive-agent-loop.js +625 -0
  24. package/dist/node_modules/@pencil-agent/agent-core/dist/structured-adaptive-streaming-tool-executor.d.ts +33 -0
  25. package/dist/node_modules/@pencil-agent/agent-core/dist/structured-adaptive-streaming-tool-executor.js +189 -0
  26. package/dist/node_modules/@pencil-agent/agent-core/dist/structured-adaptive-tool-orchestration.d.ts +35 -0
  27. package/dist/node_modules/@pencil-agent/agent-core/dist/structured-adaptive-tool-orchestration.js +319 -0
  28. package/dist/node_modules/@pencil-agent/agent-core/dist/types.d.ts +417 -0
  29. package/dist/node_modules/@pencil-agent/agent-core/dist/types.js +13 -0
  30. package/dist/node_modules/@pencil-agent/agent-core/package.json +28 -0
  31. package/dist/node_modules/@pencil-agent/ai/dist/api-registry.d.ts +27 -0
  32. package/dist/node_modules/@pencil-agent/ai/dist/api-registry.js +152 -0
  33. package/dist/node_modules/@pencil-agent/ai/dist/cli.d.ts +2 -0
  34. package/dist/node_modules/@pencil-agent/ai/dist/cli.js +121 -0
  35. package/dist/node_modules/@pencil-agent/ai/dist/config-path.d.ts +1 -0
  36. package/dist/node_modules/@pencil-agent/ai/dist/config-path.js +17 -0
  37. package/dist/node_modules/@pencil-agent/ai/dist/debug-logger.d.ts +94 -0
  38. package/dist/node_modules/@pencil-agent/ai/dist/debug-logger.js +218 -0
  39. package/dist/node_modules/@pencil-agent/ai/dist/env-api-keys.d.ts +8 -0
  40. package/dist/node_modules/@pencil-agent/ai/dist/env-api-keys.js +107 -0
  41. package/dist/node_modules/@pencil-agent/ai/dist/env.d.ts +7 -0
  42. package/dist/node_modules/@pencil-agent/ai/dist/env.js +7 -0
  43. package/dist/node_modules/@pencil-agent/ai/dist/events.d.ts +8 -0
  44. package/dist/node_modules/@pencil-agent/ai/dist/events.js +7 -0
  45. package/dist/node_modules/@pencil-agent/ai/dist/index.d.ts +27 -0
  46. package/dist/node_modules/@pencil-agent/ai/dist/index.js +20 -0
  47. package/dist/node_modules/@pencil-agent/ai/dist/json.d.ts +7 -0
  48. package/dist/node_modules/@pencil-agent/ai/dist/json.js +7 -0
  49. package/dist/node_modules/@pencil-agent/ai/dist/models.d.ts +31 -0
  50. package/dist/node_modules/@pencil-agent/ai/dist/models.generated.d.ts +15159 -0
  51. package/dist/node_modules/@pencil-agent/ai/dist/models.generated.js +14928 -0
  52. package/dist/node_modules/@pencil-agent/ai/dist/models.js +60 -0
  53. package/dist/node_modules/@pencil-agent/ai/dist/overflow.d.ts +7 -0
  54. package/dist/node_modules/@pencil-agent/ai/dist/overflow.js +7 -0
  55. package/dist/node_modules/@pencil-agent/ai/dist/providers/amazon-bedrock.d.ts +20 -0
  56. package/dist/node_modules/@pencil-agent/ai/dist/providers/amazon-bedrock.js +606 -0
  57. package/dist/node_modules/@pencil-agent/ai/dist/providers/anthropic.d.ts +38 -0
  58. package/dist/node_modules/@pencil-agent/ai/dist/providers/anthropic.js +737 -0
  59. package/dist/node_modules/@pencil-agent/ai/dist/providers/azure-openai-responses.d.ts +21 -0
  60. package/dist/node_modules/@pencil-agent/ai/dist/providers/azure-openai-responses.js +193 -0
  61. package/dist/node_modules/@pencil-agent/ai/dist/providers/github-copilot-headers.d.ts +13 -0
  62. package/dist/node_modules/@pencil-agent/ai/dist/providers/github-copilot-headers.js +34 -0
  63. package/dist/node_modules/@pencil-agent/ai/dist/providers/google-gemini-cli.d.ts +79 -0
  64. package/dist/node_modules/@pencil-agent/ai/dist/providers/google-gemini-cli.js +753 -0
  65. package/dist/node_modules/@pencil-agent/ai/dist/providers/google-shared.d.ts +70 -0
  66. package/dist/node_modules/@pencil-agent/ai/dist/providers/google-shared.js +311 -0
  67. package/dist/node_modules/@pencil-agent/ai/dist/providers/google-vertex.d.ts +20 -0
  68. package/dist/node_modules/@pencil-agent/ai/dist/providers/google-vertex.js +380 -0
  69. package/dist/node_modules/@pencil-agent/ai/dist/providers/google.d.ts +18 -0
  70. package/dist/node_modules/@pencil-agent/ai/dist/providers/google.js +360 -0
  71. package/dist/node_modules/@pencil-agent/ai/dist/providers/openai-codex-responses.d.ts +8 -0
  72. package/dist/node_modules/@pencil-agent/ai/dist/providers/openai-codex-responses.js +704 -0
  73. package/dist/node_modules/@pencil-agent/ai/dist/providers/openai-completions.d.ts +20 -0
  74. package/dist/node_modules/@pencil-agent/ai/dist/providers/openai-completions.js +870 -0
  75. package/dist/node_modules/@pencil-agent/ai/dist/providers/openai-responses-shared.d.ts +22 -0
  76. package/dist/node_modules/@pencil-agent/ai/dist/providers/openai-responses-shared.js +432 -0
  77. package/dist/node_modules/@pencil-agent/ai/dist/providers/openai-responses.d.ts +19 -0
  78. package/dist/node_modules/@pencil-agent/ai/dist/providers/openai-responses.js +207 -0
  79. package/dist/node_modules/@pencil-agent/ai/dist/providers/register-builtins.d.ts +8 -0
  80. package/dist/node_modules/@pencil-agent/ai/dist/providers/register-builtins.js +86 -0
  81. package/dist/node_modules/@pencil-agent/ai/dist/providers/simple-options.d.ts +13 -0
  82. package/dist/node_modules/@pencil-agent/ai/dist/providers/simple-options.js +40 -0
  83. package/dist/node_modules/@pencil-agent/ai/dist/providers/transform-messages.d.ts +13 -0
  84. package/dist/node_modules/@pencil-agent/ai/dist/providers/transform-messages.js +175 -0
  85. package/dist/node_modules/@pencil-agent/ai/dist/registry.d.ts +8 -0
  86. package/dist/node_modules/@pencil-agent/ai/dist/registry.js +8 -0
  87. package/dist/node_modules/@pencil-agent/ai/dist/schema.d.ts +10 -0
  88. package/dist/node_modules/@pencil-agent/ai/dist/schema.js +9 -0
  89. package/dist/node_modules/@pencil-agent/ai/dist/stream.d.ts +25 -0
  90. package/dist/node_modules/@pencil-agent/ai/dist/stream.js +324 -0
  91. package/dist/node_modules/@pencil-agent/ai/dist/types.d.ts +306 -0
  92. package/dist/node_modules/@pencil-agent/ai/dist/types.js +7 -0
  93. package/dist/node_modules/@pencil-agent/ai/dist/utils/event-stream-types.d.ts +12 -0
  94. package/dist/node_modules/@pencil-agent/ai/dist/utils/event-stream-types.js +7 -0
  95. package/dist/node_modules/@pencil-agent/ai/dist/utils/event-stream.d.ts +31 -0
  96. package/dist/node_modules/@pencil-agent/ai/dist/utils/event-stream.js +98 -0
  97. package/dist/node_modules/@pencil-agent/ai/dist/utils/http-proxy.d.ts +13 -0
  98. package/dist/node_modules/@pencil-agent/ai/dist/utils/http-proxy.js +20 -0
  99. package/dist/node_modules/@pencil-agent/ai/dist/utils/json-parse.d.ts +14 -0
  100. package/dist/node_modules/@pencil-agent/ai/dist/utils/json-parse.js +34 -0
  101. package/dist/node_modules/@pencil-agent/ai/dist/utils/oauth/anthropic.d.ts +22 -0
  102. package/dist/node_modules/@pencil-agent/ai/dist/utils/oauth/anthropic.js +109 -0
  103. package/dist/node_modules/@pencil-agent/ai/dist/utils/oauth/decode-credential.d.ts +12 -0
  104. package/dist/node_modules/@pencil-agent/ai/dist/utils/oauth/decode-credential.js +25 -0
  105. package/dist/node_modules/@pencil-agent/ai/dist/utils/oauth/github-copilot.d.ts +35 -0
  106. package/dist/node_modules/@pencil-agent/ai/dist/utils/oauth/github-copilot.js +286 -0
  107. package/dist/node_modules/@pencil-agent/ai/dist/utils/oauth/google-antigravity.d.ts +31 -0
  108. package/dist/node_modules/@pencil-agent/ai/dist/utils/oauth/google-antigravity.js +378 -0
  109. package/dist/node_modules/@pencil-agent/ai/dist/utils/oauth/google-gemini-cli.d.ts +31 -0
  110. package/dist/node_modules/@pencil-agent/ai/dist/utils/oauth/google-gemini-cli.js +483 -0
  111. package/dist/node_modules/@pencil-agent/ai/dist/utils/oauth/index.d.ts +60 -0
  112. package/dist/node_modules/@pencil-agent/ai/dist/utils/oauth/index.js +131 -0
  113. package/dist/node_modules/@pencil-agent/ai/dist/utils/oauth/openai-codex.d.ts +39 -0
  114. package/dist/node_modules/@pencil-agent/ai/dist/utils/oauth/openai-codex.js +385 -0
  115. package/dist/node_modules/@pencil-agent/ai/dist/utils/oauth/pkce.d.ts +18 -0
  116. package/dist/node_modules/@pencil-agent/ai/dist/utils/oauth/pkce.js +36 -0
  117. package/dist/node_modules/@pencil-agent/ai/dist/utils/oauth/types.d.ts +52 -0
  118. package/dist/node_modules/@pencil-agent/ai/dist/utils/oauth/types.js +7 -0
  119. package/dist/node_modules/@pencil-agent/ai/dist/utils/overflow.d.ts +57 -0
  120. package/dist/node_modules/@pencil-agent/ai/dist/utils/overflow.js +120 -0
  121. package/dist/node_modules/@pencil-agent/ai/dist/utils/sanitize-unicode.d.ts +16 -0
  122. package/dist/node_modules/@pencil-agent/ai/dist/utils/sanitize-unicode.js +20 -0
  123. package/dist/node_modules/@pencil-agent/ai/dist/utils/typebox-helpers.d.ts +22 -0
  124. package/dist/node_modules/@pencil-agent/ai/dist/utils/typebox-helpers.js +26 -0
  125. package/dist/node_modules/@pencil-agent/ai/dist/utils/validation.d.ts +23 -0
  126. package/dist/node_modules/@pencil-agent/ai/dist/utils/validation.js +78 -0
  127. package/dist/node_modules/@pencil-agent/ai/package.json +94 -0
  128. package/dist/node_modules/@pencil-agent/tui/dist/autocomplete.d.ts +62 -0
  129. package/dist/node_modules/@pencil-agent/tui/dist/autocomplete.js +624 -0
  130. package/dist/node_modules/@pencil-agent/tui/dist/components/box.d.ts +27 -0
  131. package/dist/node_modules/@pencil-agent/tui/dist/components/box.js +109 -0
  132. package/dist/node_modules/@pencil-agent/tui/dist/components/cancellable-loader.d.ts +27 -0
  133. package/dist/node_modules/@pencil-agent/tui/dist/components/cancellable-loader.js +40 -0
  134. package/dist/node_modules/@pencil-agent/tui/dist/components/editor.d.ts +218 -0
  135. package/dist/node_modules/@pencil-agent/tui/dist/components/editor.js +1697 -0
  136. package/dist/node_modules/@pencil-agent/tui/dist/components/image.d.ts +33 -0
  137. package/dist/node_modules/@pencil-agent/tui/dist/components/image.js +74 -0
  138. package/dist/node_modules/@pencil-agent/tui/dist/components/input.d.ts +42 -0
  139. package/dist/node_modules/@pencil-agent/tui/dist/components/input.js +438 -0
  140. package/dist/node_modules/@pencil-agent/tui/dist/components/loader.d.ts +26 -0
  141. package/dist/node_modules/@pencil-agent/tui/dist/components/loader.js +54 -0
  142. package/dist/node_modules/@pencil-agent/tui/dist/components/markdown.d.ts +100 -0
  143. package/dist/node_modules/@pencil-agent/tui/dist/components/markdown.js +634 -0
  144. package/dist/node_modules/@pencil-agent/tui/dist/components/select-list.d.ts +37 -0
  145. package/dist/node_modules/@pencil-agent/tui/dist/components/select-list.js +157 -0
  146. package/dist/node_modules/@pencil-agent/tui/dist/components/settings-list.d.ts +55 -0
  147. package/dist/node_modules/@pencil-agent/tui/dist/components/settings-list.js +190 -0
  148. package/dist/node_modules/@pencil-agent/tui/dist/components/spacer.d.ts +17 -0
  149. package/dist/node_modules/@pencil-agent/tui/dist/components/spacer.js +28 -0
  150. package/dist/node_modules/@pencil-agent/tui/dist/components/text.d.ts +24 -0
  151. package/dist/node_modules/@pencil-agent/tui/dist/components/text.js +94 -0
  152. package/dist/node_modules/@pencil-agent/tui/dist/components/truncated-text.d.ts +18 -0
  153. package/dist/node_modules/@pencil-agent/tui/dist/components/truncated-text.js +56 -0
  154. package/dist/node_modules/@pencil-agent/tui/dist/editor-component.d.ts +51 -0
  155. package/dist/node_modules/@pencil-agent/tui/dist/editor-component.js +7 -0
  156. package/dist/node_modules/@pencil-agent/tui/dist/fuzzy.d.ts +32 -0
  157. package/dist/node_modules/@pencil-agent/tui/dist/fuzzy.js +152 -0
  158. package/dist/node_modules/@pencil-agent/tui/dist/index.d.ts +28 -0
  159. package/dist/node_modules/@pencil-agent/tui/dist/index.js +37 -0
  160. package/dist/node_modules/@pencil-agent/tui/dist/keybindings.d.ts +44 -0
  161. package/dist/node_modules/@pencil-agent/tui/dist/keybindings.js +119 -0
  162. package/dist/node_modules/@pencil-agent/tui/dist/keys.d.ts +149 -0
  163. package/dist/node_modules/@pencil-agent/tui/dist/keys.js +948 -0
  164. package/dist/node_modules/@pencil-agent/tui/dist/kill-ring.d.ts +33 -0
  165. package/dist/node_modules/@pencil-agent/tui/dist/kill-ring.js +49 -0
  166. package/dist/node_modules/@pencil-agent/tui/dist/stdin-buffer.d.ts +38 -0
  167. package/dist/node_modules/@pencil-agent/tui/dist/stdin-buffer.js +307 -0
  168. package/dist/node_modules/@pencil-agent/tui/dist/terminal-image.d.ts +73 -0
  169. package/dist/node_modules/@pencil-agent/tui/dist/terminal-image.js +287 -0
  170. package/dist/node_modules/@pencil-agent/tui/dist/terminal.d.ts +86 -0
  171. package/dist/node_modules/@pencil-agent/tui/dist/terminal.js +266 -0
  172. package/dist/node_modules/@pencil-agent/tui/dist/tui.d.ts +219 -0
  173. package/dist/node_modules/@pencil-agent/tui/dist/tui.js +1001 -0
  174. package/dist/node_modules/@pencil-agent/tui/dist/undo-stack.d.ts +22 -0
  175. package/dist/node_modules/@pencil-agent/tui/dist/undo-stack.js +30 -0
  176. package/dist/node_modules/@pencil-agent/tui/dist/utils.d.ts +83 -0
  177. package/dist/node_modules/@pencil-agent/tui/dist/utils.js +811 -0
  178. package/dist/node_modules/@pencil-agent/tui/package.json +37 -0
  179. package/package.json +3 -2
@@ -0,0 +1,380 @@
1
+ /**
2
+ * [WHO]: GoogleVertexOptions, streamGoogleVertex, streamSimpleGoogleVertex
3
+ * [FROM]: Depends on ../models.js, ../utils/event-stream.js, ../utils/sanitize-unicode.js, ./simple-options.js
4
+ * [TO]: Consumed by core/lib/ai/src/index.ts
5
+ * [HERE]: core/lib/ai/src/providers/google-vertex.ts -
6
+ */
7
+ import { GoogleGenAI, ThinkingLevel, } from "@google/genai";
8
+ import { calculateCost } from "../models.js";
9
+ import { AssistantMessageEventStream } from "../utils/event-stream.js";
10
+ import { sanitizeSurrogates } from "../utils/sanitize-unicode.js";
11
+ import { convertMessages, convertTools, isThinkingPart, mapStopReason, mapToolChoice, retainThoughtSignature, } from "./google-shared.js";
12
+ import { buildBaseOptions, clampReasoning } from "./simple-options.js";
13
+ const API_VERSION = "v1";
14
+ const THINKING_LEVEL_MAP = {
15
+ THINKING_LEVEL_UNSPECIFIED: ThinkingLevel.THINKING_LEVEL_UNSPECIFIED,
16
+ MINIMAL: ThinkingLevel.MINIMAL,
17
+ LOW: ThinkingLevel.LOW,
18
+ MEDIUM: ThinkingLevel.MEDIUM,
19
+ HIGH: ThinkingLevel.HIGH,
20
+ };
21
+ // Counter for generating unique tool call IDs
22
+ let toolCallCounter = 0;
23
+ export const streamGoogleVertex = (model, context, options) => {
24
+ const stream = new AssistantMessageEventStream();
25
+ (async () => {
26
+ const output = {
27
+ role: "assistant",
28
+ content: [],
29
+ api: "google-vertex",
30
+ provider: model.provider,
31
+ model: model.id,
32
+ usage: {
33
+ input: 0,
34
+ output: 0,
35
+ cacheRead: 0,
36
+ cacheWrite: 0,
37
+ totalTokens: 0,
38
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
39
+ },
40
+ stopReason: "stop",
41
+ timestamp: Date.now(),
42
+ };
43
+ try {
44
+ const project = resolveProject(options);
45
+ const location = resolveLocation(options);
46
+ const client = createClient(model, project, location, options?.headers);
47
+ const params = buildParams(model, context, options);
48
+ options?.onPayload?.(params);
49
+ const googleStream = await client.models.generateContentStream(params);
50
+ stream.push({ type: "start", partial: output });
51
+ let currentBlock = null;
52
+ const blocks = output.content;
53
+ const blockIndex = () => blocks.length - 1;
54
+ for await (const chunk of googleStream) {
55
+ const candidate = chunk.candidates?.[0];
56
+ if (candidate?.content?.parts) {
57
+ for (const part of candidate.content.parts) {
58
+ if (part.text !== undefined) {
59
+ const isThinking = isThinkingPart(part);
60
+ if (!currentBlock ||
61
+ (isThinking && currentBlock.type !== "thinking") ||
62
+ (!isThinking && currentBlock.type !== "text")) {
63
+ if (currentBlock) {
64
+ if (currentBlock.type === "text") {
65
+ stream.push({
66
+ type: "text_end",
67
+ contentIndex: blocks.length - 1,
68
+ content: currentBlock.text,
69
+ partial: output,
70
+ });
71
+ }
72
+ else {
73
+ stream.push({
74
+ type: "thinking_end",
75
+ contentIndex: blockIndex(),
76
+ content: currentBlock.thinking,
77
+ partial: output,
78
+ });
79
+ }
80
+ }
81
+ if (isThinking) {
82
+ currentBlock = { type: "thinking", thinking: "", thinkingSignature: undefined };
83
+ output.content.push(currentBlock);
84
+ stream.push({ type: "thinking_start", contentIndex: blockIndex(), partial: output });
85
+ }
86
+ else {
87
+ currentBlock = { type: "text", text: "" };
88
+ output.content.push(currentBlock);
89
+ stream.push({ type: "text_start", contentIndex: blockIndex(), partial: output });
90
+ }
91
+ }
92
+ if (currentBlock.type === "thinking") {
93
+ currentBlock.thinking += part.text;
94
+ currentBlock.thinkingSignature = retainThoughtSignature(currentBlock.thinkingSignature, part.thoughtSignature);
95
+ stream.push({
96
+ type: "thinking_delta",
97
+ contentIndex: blockIndex(),
98
+ delta: part.text,
99
+ partial: output,
100
+ });
101
+ }
102
+ else {
103
+ currentBlock.text += part.text;
104
+ currentBlock.textSignature = retainThoughtSignature(currentBlock.textSignature, part.thoughtSignature);
105
+ stream.push({
106
+ type: "text_delta",
107
+ contentIndex: blockIndex(),
108
+ delta: part.text,
109
+ partial: output,
110
+ });
111
+ }
112
+ }
113
+ if (part.functionCall) {
114
+ if (currentBlock) {
115
+ if (currentBlock.type === "text") {
116
+ stream.push({
117
+ type: "text_end",
118
+ contentIndex: blockIndex(),
119
+ content: currentBlock.text,
120
+ partial: output,
121
+ });
122
+ }
123
+ else {
124
+ stream.push({
125
+ type: "thinking_end",
126
+ contentIndex: blockIndex(),
127
+ content: currentBlock.thinking,
128
+ partial: output,
129
+ });
130
+ }
131
+ currentBlock = null;
132
+ }
133
+ const providedId = part.functionCall.id;
134
+ const needsNewId = !providedId || output.content.some((b) => b.type === "toolCall" && b.id === providedId);
135
+ const toolCallId = needsNewId
136
+ ? `${part.functionCall.name}_${Date.now()}_${++toolCallCounter}`
137
+ : providedId;
138
+ const toolCall = {
139
+ type: "toolCall",
140
+ id: toolCallId,
141
+ name: part.functionCall.name || "",
142
+ arguments: part.functionCall.args ?? {},
143
+ ...(part.thoughtSignature && { thoughtSignature: part.thoughtSignature }),
144
+ };
145
+ output.content.push(toolCall);
146
+ stream.push({ type: "toolcall_start", contentIndex: blockIndex(), partial: output });
147
+ stream.push({
148
+ type: "toolcall_delta",
149
+ contentIndex: blockIndex(),
150
+ delta: JSON.stringify(toolCall.arguments),
151
+ partial: output,
152
+ });
153
+ stream.push({ type: "toolcall_end", contentIndex: blockIndex(), toolCall, partial: output });
154
+ }
155
+ }
156
+ }
157
+ if (candidate?.finishReason) {
158
+ output.stopReason = mapStopReason(candidate.finishReason);
159
+ if (output.content.some((b) => b.type === "toolCall")) {
160
+ output.stopReason = "toolUse";
161
+ }
162
+ }
163
+ if (chunk.usageMetadata) {
164
+ output.usage = {
165
+ input: chunk.usageMetadata.promptTokenCount || 0,
166
+ output: (chunk.usageMetadata.candidatesTokenCount || 0) + (chunk.usageMetadata.thoughtsTokenCount || 0),
167
+ cacheRead: chunk.usageMetadata.cachedContentTokenCount || 0,
168
+ cacheWrite: 0,
169
+ totalTokens: chunk.usageMetadata.totalTokenCount || 0,
170
+ cost: {
171
+ input: 0,
172
+ output: 0,
173
+ cacheRead: 0,
174
+ cacheWrite: 0,
175
+ total: 0,
176
+ },
177
+ };
178
+ calculateCost(model, output.usage);
179
+ }
180
+ }
181
+ if (currentBlock) {
182
+ if (currentBlock.type === "text") {
183
+ stream.push({
184
+ type: "text_end",
185
+ contentIndex: blockIndex(),
186
+ content: currentBlock.text,
187
+ partial: output,
188
+ });
189
+ }
190
+ else {
191
+ stream.push({
192
+ type: "thinking_end",
193
+ contentIndex: blockIndex(),
194
+ content: currentBlock.thinking,
195
+ partial: output,
196
+ });
197
+ }
198
+ }
199
+ if (options?.signal?.aborted) {
200
+ throw new Error("Request was aborted");
201
+ }
202
+ if (output.stopReason === "aborted" || output.stopReason === "error") {
203
+ throw new Error("An unknown error occurred");
204
+ }
205
+ stream.push({ type: "done", reason: output.stopReason, message: output });
206
+ stream.end();
207
+ }
208
+ catch (error) {
209
+ // Remove internal index property used during streaming
210
+ for (const block of output.content) {
211
+ if ("index" in block) {
212
+ delete block.index;
213
+ }
214
+ }
215
+ output.stopReason = options?.signal?.aborted ? "aborted" : "error";
216
+ output.errorMessage = error instanceof Error ? error.message : JSON.stringify(error);
217
+ stream.push({ type: "error", reason: output.stopReason, error: output });
218
+ stream.end();
219
+ }
220
+ })();
221
+ return stream;
222
+ };
223
+ export const streamSimpleGoogleVertex = (model, context, options) => {
224
+ const base = buildBaseOptions(model, options, undefined);
225
+ const toolChoice = options?.toolChoice;
226
+ if (!options?.reasoning) {
227
+ return streamGoogleVertex(model, context, {
228
+ ...base,
229
+ toolChoice,
230
+ thinking: { enabled: false },
231
+ });
232
+ }
233
+ const effort = clampReasoning(options.reasoning);
234
+ const geminiModel = model;
235
+ if (isGemini3ProModel(geminiModel) || isGemini3FlashModel(geminiModel)) {
236
+ return streamGoogleVertex(model, context, {
237
+ ...base,
238
+ toolChoice,
239
+ thinking: {
240
+ enabled: true,
241
+ level: getGemini3ThinkingLevel(effort, geminiModel),
242
+ },
243
+ });
244
+ }
245
+ return streamGoogleVertex(model, context, {
246
+ ...base,
247
+ toolChoice,
248
+ thinking: {
249
+ enabled: true,
250
+ budgetTokens: getGoogleBudget(geminiModel, effort, options.thinkingBudgets),
251
+ },
252
+ });
253
+ };
254
+ function createClient(model, project, location, optionsHeaders) {
255
+ const httpOptions = {};
256
+ if (model.headers || optionsHeaders) {
257
+ httpOptions.headers = { ...model.headers, ...optionsHeaders };
258
+ }
259
+ const hasHttpOptions = Object.values(httpOptions).some(Boolean);
260
+ return new GoogleGenAI({
261
+ vertexai: true,
262
+ project,
263
+ location,
264
+ apiVersion: API_VERSION,
265
+ httpOptions: hasHttpOptions ? httpOptions : undefined,
266
+ });
267
+ }
268
+ function resolveProject(options) {
269
+ const project = options?.project || process.env.GOOGLE_CLOUD_PROJECT || process.env.GCLOUD_PROJECT;
270
+ if (!project) {
271
+ throw new Error("Vertex AI requires a project ID. Set GOOGLE_CLOUD_PROJECT/GCLOUD_PROJECT or pass project in options.");
272
+ }
273
+ return project;
274
+ }
275
+ function resolveLocation(options) {
276
+ const location = options?.location || process.env.GOOGLE_CLOUD_LOCATION;
277
+ if (!location) {
278
+ throw new Error("Vertex AI requires a location. Set GOOGLE_CLOUD_LOCATION or pass location in options.");
279
+ }
280
+ return location;
281
+ }
282
+ function buildParams(model, context, options = {}) {
283
+ const contents = convertMessages(model, context);
284
+ const generationConfig = {};
285
+ if (options.temperature !== undefined) {
286
+ generationConfig.temperature = options.temperature;
287
+ }
288
+ if (options.maxTokens !== undefined) {
289
+ generationConfig.maxOutputTokens = options.maxTokens;
290
+ }
291
+ const config = {
292
+ ...(Object.keys(generationConfig).length > 0 && generationConfig),
293
+ ...(context.systemPrompt && { systemInstruction: sanitizeSurrogates(context.systemPrompt) }),
294
+ ...(context.tools && context.tools.length > 0 && { tools: convertTools(context.tools) }),
295
+ };
296
+ if (context.tools && context.tools.length > 0 && options.toolChoice) {
297
+ config.toolConfig = {
298
+ functionCallingConfig: {
299
+ mode: mapToolChoice(options.toolChoice),
300
+ },
301
+ };
302
+ }
303
+ else {
304
+ config.toolConfig = undefined;
305
+ }
306
+ if (options.thinking?.enabled && model.reasoning) {
307
+ const thinkingConfig = { includeThoughts: true };
308
+ if (options.thinking.level !== undefined) {
309
+ thinkingConfig.thinkingLevel = THINKING_LEVEL_MAP[options.thinking.level];
310
+ }
311
+ else if (options.thinking.budgetTokens !== undefined) {
312
+ thinkingConfig.thinkingBudget = options.thinking.budgetTokens;
313
+ }
314
+ config.thinkingConfig = thinkingConfig;
315
+ }
316
+ if (options.signal) {
317
+ if (options.signal.aborted) {
318
+ throw new Error("Request aborted");
319
+ }
320
+ config.abortSignal = options.signal;
321
+ }
322
+ const params = {
323
+ model: model.id,
324
+ contents,
325
+ config,
326
+ };
327
+ return params;
328
+ }
329
+ function isGemini3ProModel(model) {
330
+ return model.id.includes("3-pro");
331
+ }
332
+ function isGemini3FlashModel(model) {
333
+ return model.id.includes("3-flash");
334
+ }
335
+ function getGemini3ThinkingLevel(effort, model) {
336
+ if (isGemini3ProModel(model)) {
337
+ switch (effort) {
338
+ case "minimal":
339
+ case "low":
340
+ return "LOW";
341
+ case "medium":
342
+ case "high":
343
+ return "HIGH";
344
+ }
345
+ }
346
+ switch (effort) {
347
+ case "minimal":
348
+ return "MINIMAL";
349
+ case "low":
350
+ return "LOW";
351
+ case "medium":
352
+ return "MEDIUM";
353
+ case "high":
354
+ return "HIGH";
355
+ }
356
+ }
357
+ function getGoogleBudget(model, effort, customBudgets) {
358
+ if (customBudgets?.[effort] !== undefined) {
359
+ return customBudgets[effort];
360
+ }
361
+ if (model.id.includes("2.5-pro")) {
362
+ const budgets = {
363
+ minimal: 128,
364
+ low: 2048,
365
+ medium: 8192,
366
+ high: 32768,
367
+ };
368
+ return budgets[effort];
369
+ }
370
+ if (model.id.includes("2.5-flash")) {
371
+ const budgets = {
372
+ minimal: 128,
373
+ low: 2048,
374
+ medium: 8192,
375
+ high: 24576,
376
+ };
377
+ return budgets[effort];
378
+ }
379
+ return -1;
380
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * [WHO]: GoogleOptions, streamGoogle, streamSimpleGoogle
3
+ * [FROM]: Depends on ../env-api-keys.js, ../models.js, ../utils/event-stream.js, ../utils/sanitize-unicode.js, ./simple-options.js
4
+ * [TO]: Consumed by core/lib/ai/src/index.ts
5
+ * [HERE]: core/lib/ai/src/providers/google.ts -
6
+ */
7
+ import type { SimpleStreamOptions, StreamFunction, StreamOptions } from "../types.js";
8
+ import type { GoogleThinkingLevel } from "./google-gemini-cli.js";
9
+ export interface GoogleOptions extends StreamOptions {
10
+ toolChoice?: "auto" | "none" | "any";
11
+ thinking?: {
12
+ enabled: boolean;
13
+ budgetTokens?: number;
14
+ level?: GoogleThinkingLevel;
15
+ };
16
+ }
17
+ export declare const streamGoogle: StreamFunction<"google-generative-ai", GoogleOptions>;
18
+ export declare const streamSimpleGoogle: StreamFunction<"google-generative-ai", SimpleStreamOptions>;