@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,360 @@
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 { GoogleGenAI, } from "@google/genai";
8
+ import { getEnvApiKey } from "../env-api-keys.js";
9
+ import { calculateCost } from "../models.js";
10
+ import { AssistantMessageEventStream } from "../utils/event-stream.js";
11
+ import { sanitizeSurrogates } from "../utils/sanitize-unicode.js";
12
+ import { convertMessages, convertTools, isThinkingPart, mapStopReason, mapToolChoice, retainThoughtSignature, } from "./google-shared.js";
13
+ import { buildBaseOptions, clampReasoning } from "./simple-options.js";
14
+ // Counter for generating unique tool call IDs
15
+ let toolCallCounter = 0;
16
+ export const streamGoogle = (model, context, options) => {
17
+ const stream = new AssistantMessageEventStream();
18
+ (async () => {
19
+ const output = {
20
+ role: "assistant",
21
+ content: [],
22
+ api: "google-generative-ai",
23
+ provider: model.provider,
24
+ model: model.id,
25
+ usage: {
26
+ input: 0,
27
+ output: 0,
28
+ cacheRead: 0,
29
+ cacheWrite: 0,
30
+ totalTokens: 0,
31
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
32
+ },
33
+ stopReason: "stop",
34
+ timestamp: Date.now(),
35
+ };
36
+ try {
37
+ const apiKey = options?.apiKey || getEnvApiKey(model.provider) || "";
38
+ const client = createClient(model, apiKey, options?.headers);
39
+ const params = buildParams(model, context, options);
40
+ options?.onPayload?.(params);
41
+ const googleStream = await client.models.generateContentStream(params);
42
+ stream.push({ type: "start", partial: output });
43
+ let currentBlock = null;
44
+ const blocks = output.content;
45
+ const blockIndex = () => blocks.length - 1;
46
+ for await (const chunk of googleStream) {
47
+ const candidate = chunk.candidates?.[0];
48
+ if (candidate?.content?.parts) {
49
+ for (const part of candidate.content.parts) {
50
+ if (part.text !== undefined) {
51
+ const isThinking = isThinkingPart(part);
52
+ if (!currentBlock ||
53
+ (isThinking && currentBlock.type !== "thinking") ||
54
+ (!isThinking && currentBlock.type !== "text")) {
55
+ if (currentBlock) {
56
+ if (currentBlock.type === "text") {
57
+ stream.push({
58
+ type: "text_end",
59
+ contentIndex: blocks.length - 1,
60
+ content: currentBlock.text,
61
+ partial: output,
62
+ });
63
+ }
64
+ else {
65
+ stream.push({
66
+ type: "thinking_end",
67
+ contentIndex: blockIndex(),
68
+ content: currentBlock.thinking,
69
+ partial: output,
70
+ });
71
+ }
72
+ }
73
+ if (isThinking) {
74
+ currentBlock = { type: "thinking", thinking: "", thinkingSignature: undefined };
75
+ output.content.push(currentBlock);
76
+ stream.push({ type: "thinking_start", contentIndex: blockIndex(), partial: output });
77
+ }
78
+ else {
79
+ currentBlock = { type: "text", text: "" };
80
+ output.content.push(currentBlock);
81
+ stream.push({ type: "text_start", contentIndex: blockIndex(), partial: output });
82
+ }
83
+ }
84
+ if (currentBlock.type === "thinking") {
85
+ currentBlock.thinking += part.text;
86
+ currentBlock.thinkingSignature = retainThoughtSignature(currentBlock.thinkingSignature, part.thoughtSignature);
87
+ stream.push({
88
+ type: "thinking_delta",
89
+ contentIndex: blockIndex(),
90
+ delta: part.text,
91
+ partial: output,
92
+ });
93
+ }
94
+ else {
95
+ currentBlock.text += part.text;
96
+ currentBlock.textSignature = retainThoughtSignature(currentBlock.textSignature, part.thoughtSignature);
97
+ stream.push({
98
+ type: "text_delta",
99
+ contentIndex: blockIndex(),
100
+ delta: part.text,
101
+ partial: output,
102
+ });
103
+ }
104
+ }
105
+ if (part.functionCall) {
106
+ if (currentBlock) {
107
+ if (currentBlock.type === "text") {
108
+ stream.push({
109
+ type: "text_end",
110
+ contentIndex: blockIndex(),
111
+ content: currentBlock.text,
112
+ partial: output,
113
+ });
114
+ }
115
+ else {
116
+ stream.push({
117
+ type: "thinking_end",
118
+ contentIndex: blockIndex(),
119
+ content: currentBlock.thinking,
120
+ partial: output,
121
+ });
122
+ }
123
+ currentBlock = null;
124
+ }
125
+ // Generate unique ID if not provided or if it's a duplicate
126
+ const providedId = part.functionCall.id;
127
+ const needsNewId = !providedId || output.content.some((b) => b.type === "toolCall" && b.id === providedId);
128
+ const toolCallId = needsNewId
129
+ ? `${part.functionCall.name}_${Date.now()}_${++toolCallCounter}`
130
+ : providedId;
131
+ const toolCall = {
132
+ type: "toolCall",
133
+ id: toolCallId,
134
+ name: part.functionCall.name || "",
135
+ arguments: part.functionCall.args ?? {},
136
+ ...(part.thoughtSignature && { thoughtSignature: part.thoughtSignature }),
137
+ };
138
+ output.content.push(toolCall);
139
+ stream.push({ type: "toolcall_start", contentIndex: blockIndex(), partial: output });
140
+ stream.push({
141
+ type: "toolcall_delta",
142
+ contentIndex: blockIndex(),
143
+ delta: JSON.stringify(toolCall.arguments),
144
+ partial: output,
145
+ });
146
+ stream.push({ type: "toolcall_end", contentIndex: blockIndex(), toolCall, partial: output });
147
+ }
148
+ }
149
+ }
150
+ if (candidate?.finishReason) {
151
+ output.stopReason = mapStopReason(candidate.finishReason);
152
+ if (output.content.some((b) => b.type === "toolCall")) {
153
+ output.stopReason = "toolUse";
154
+ }
155
+ }
156
+ if (chunk.usageMetadata) {
157
+ output.usage = {
158
+ input: chunk.usageMetadata.promptTokenCount || 0,
159
+ output: (chunk.usageMetadata.candidatesTokenCount || 0) + (chunk.usageMetadata.thoughtsTokenCount || 0),
160
+ cacheRead: chunk.usageMetadata.cachedContentTokenCount || 0,
161
+ cacheWrite: 0,
162
+ totalTokens: chunk.usageMetadata.totalTokenCount || 0,
163
+ cost: {
164
+ input: 0,
165
+ output: 0,
166
+ cacheRead: 0,
167
+ cacheWrite: 0,
168
+ total: 0,
169
+ },
170
+ };
171
+ calculateCost(model, output.usage);
172
+ }
173
+ }
174
+ if (currentBlock) {
175
+ if (currentBlock.type === "text") {
176
+ stream.push({
177
+ type: "text_end",
178
+ contentIndex: blockIndex(),
179
+ content: currentBlock.text,
180
+ partial: output,
181
+ });
182
+ }
183
+ else {
184
+ stream.push({
185
+ type: "thinking_end",
186
+ contentIndex: blockIndex(),
187
+ content: currentBlock.thinking,
188
+ partial: output,
189
+ });
190
+ }
191
+ }
192
+ if (options?.signal?.aborted) {
193
+ throw new Error("Request was aborted");
194
+ }
195
+ if (output.stopReason === "aborted" || output.stopReason === "error") {
196
+ throw new Error("An unknown error occurred");
197
+ }
198
+ stream.push({ type: "done", reason: output.stopReason, message: output });
199
+ stream.end();
200
+ }
201
+ catch (error) {
202
+ // Remove internal index property used during streaming
203
+ for (const block of output.content) {
204
+ if ("index" in block) {
205
+ delete block.index;
206
+ }
207
+ }
208
+ output.stopReason = options?.signal?.aborted ? "aborted" : "error";
209
+ output.errorMessage = error instanceof Error ? error.message : JSON.stringify(error);
210
+ stream.push({ type: "error", reason: output.stopReason, error: output });
211
+ stream.end();
212
+ }
213
+ })();
214
+ return stream;
215
+ };
216
+ export const streamSimpleGoogle = (model, context, options) => {
217
+ const apiKey = options?.apiKey || getEnvApiKey(model.provider);
218
+ if (!apiKey) {
219
+ throw new Error(`No API key for provider: ${model.provider}`);
220
+ }
221
+ const base = buildBaseOptions(model, options, apiKey);
222
+ const toolChoice = options?.toolChoice;
223
+ if (!options?.reasoning) {
224
+ return streamGoogle(model, context, { ...base, toolChoice, thinking: { enabled: false } });
225
+ }
226
+ const effort = clampReasoning(options.reasoning);
227
+ const googleModel = model;
228
+ if (isGemini3ProModel(googleModel) || isGemini3FlashModel(googleModel)) {
229
+ return streamGoogle(model, context, {
230
+ ...base,
231
+ toolChoice,
232
+ thinking: {
233
+ enabled: true,
234
+ level: getGemini3ThinkingLevel(effort, googleModel),
235
+ },
236
+ });
237
+ }
238
+ return streamGoogle(model, context, {
239
+ ...base,
240
+ toolChoice,
241
+ thinking: {
242
+ enabled: true,
243
+ budgetTokens: getGoogleBudget(googleModel, effort, options.thinkingBudgets),
244
+ },
245
+ });
246
+ };
247
+ function createClient(model, apiKey, optionsHeaders) {
248
+ const httpOptions = {};
249
+ if (model.baseUrl) {
250
+ httpOptions.baseUrl = model.baseUrl;
251
+ httpOptions.apiVersion = ""; // baseUrl already includes version path, don't append
252
+ }
253
+ if (model.headers || optionsHeaders) {
254
+ httpOptions.headers = { ...model.headers, ...optionsHeaders };
255
+ }
256
+ return new GoogleGenAI({
257
+ apiKey,
258
+ httpOptions: Object.keys(httpOptions).length > 0 ? httpOptions : undefined,
259
+ });
260
+ }
261
+ function buildParams(model, context, options = {}) {
262
+ const contents = convertMessages(model, context);
263
+ const generationConfig = {};
264
+ if (options.temperature !== undefined) {
265
+ generationConfig.temperature = options.temperature;
266
+ }
267
+ if (options.maxTokens !== undefined) {
268
+ generationConfig.maxOutputTokens = options.maxTokens;
269
+ }
270
+ const config = {
271
+ ...(Object.keys(generationConfig).length > 0 && generationConfig),
272
+ ...(context.systemPrompt && { systemInstruction: sanitizeSurrogates(context.systemPrompt) }),
273
+ ...(context.tools && context.tools.length > 0 && { tools: convertTools(context.tools) }),
274
+ };
275
+ if (context.tools && context.tools.length > 0 && options.toolChoice) {
276
+ config.toolConfig = {
277
+ functionCallingConfig: {
278
+ mode: mapToolChoice(options.toolChoice),
279
+ },
280
+ };
281
+ }
282
+ else {
283
+ config.toolConfig = undefined;
284
+ }
285
+ if (options.thinking?.enabled && model.reasoning) {
286
+ const thinkingConfig = { includeThoughts: true };
287
+ if (options.thinking.level !== undefined) {
288
+ // Cast to any since our GoogleThinkingLevel mirrors Google's ThinkingLevel enum values
289
+ thinkingConfig.thinkingLevel = options.thinking.level;
290
+ }
291
+ else if (options.thinking.budgetTokens !== undefined) {
292
+ thinkingConfig.thinkingBudget = options.thinking.budgetTokens;
293
+ }
294
+ config.thinkingConfig = thinkingConfig;
295
+ }
296
+ if (options.signal) {
297
+ if (options.signal.aborted) {
298
+ throw new Error("Request aborted");
299
+ }
300
+ config.abortSignal = options.signal;
301
+ }
302
+ const params = {
303
+ model: model.id,
304
+ contents,
305
+ config,
306
+ };
307
+ return params;
308
+ }
309
+ function isGemini3ProModel(model) {
310
+ return model.id.includes("3-pro");
311
+ }
312
+ function isGemini3FlashModel(model) {
313
+ return model.id.includes("3-flash");
314
+ }
315
+ function getGemini3ThinkingLevel(effort, model) {
316
+ if (isGemini3ProModel(model)) {
317
+ switch (effort) {
318
+ case "minimal":
319
+ case "low":
320
+ return "LOW";
321
+ case "medium":
322
+ case "high":
323
+ return "HIGH";
324
+ }
325
+ }
326
+ switch (effort) {
327
+ case "minimal":
328
+ return "MINIMAL";
329
+ case "low":
330
+ return "LOW";
331
+ case "medium":
332
+ return "MEDIUM";
333
+ case "high":
334
+ return "HIGH";
335
+ }
336
+ }
337
+ function getGoogleBudget(model, effort, customBudgets) {
338
+ if (customBudgets?.[effort] !== undefined) {
339
+ return customBudgets[effort];
340
+ }
341
+ if (model.id.includes("2.5-pro")) {
342
+ const budgets = {
343
+ minimal: 128,
344
+ low: 2048,
345
+ medium: 8192,
346
+ high: 32768,
347
+ };
348
+ return budgets[effort];
349
+ }
350
+ if (model.id.includes("2.5-flash")) {
351
+ const budgets = {
352
+ minimal: 128,
353
+ low: 2048,
354
+ medium: 8192,
355
+ high: 24576,
356
+ };
357
+ return budgets[effort];
358
+ }
359
+ return -1;
360
+ }
@@ -0,0 +1,8 @@
1
+ import type { SimpleStreamOptions, StreamFunction, StreamOptions } from "../types.js";
2
+ export interface OpenAICodexResponsesOptions extends StreamOptions {
3
+ reasoningEffort?: "none" | "minimal" | "low" | "medium" | "high" | "xhigh";
4
+ reasoningSummary?: "auto" | "concise" | "detailed" | "off" | "on" | null;
5
+ textVerbosity?: "low" | "medium" | "high";
6
+ }
7
+ export declare const streamOpenAICodexResponses: StreamFunction<"openai-codex-responses", OpenAICodexResponsesOptions>;
8
+ export declare const streamSimpleOpenAICodexResponses: StreamFunction<"openai-codex-responses", SimpleStreamOptions>;