@rcrsr/rill-ext-gemini 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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Andre Bremer
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,167 @@
1
+ # @rcrsr/rill-ext-gemini
2
+
3
+ [rill](https://rill.run) extension for [Google Gemini](https://ai.google.dev/docs) API integration. Provides `message`, `messages`, `embed`, `embed_batch`, and `tool_loop` host functions.
4
+
5
+ > **Experimental.** Breaking changes will occur before stabilization.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ npm install @rcrsr/rill-ext-gemini
11
+ ```
12
+
13
+ **Peer dependencies:** `@rcrsr/rill`
14
+
15
+ ## Quick Start
16
+
17
+ ```typescript
18
+ import { parse, execute, createRuntimeContext, prefixFunctions } from '@rcrsr/rill';
19
+ import { createGeminiExtension } from '@rcrsr/rill-ext-gemini';
20
+
21
+ const ext = createGeminiExtension({
22
+ api_key: process.env.GOOGLE_API_KEY!,
23
+ model: 'gemini-2.0-flash',
24
+ });
25
+ const prefixed = prefixFunctions('gemini', ext);
26
+ const { dispose, ...functions } = prefixed;
27
+
28
+ const ctx = createRuntimeContext({
29
+ functions,
30
+ callbacks: { onLog: (v) => console.log(v) },
31
+ });
32
+
33
+ const script = `gemini::message("Explain TCP handshakes")`;
34
+ const result = await execute(parse(script), ctx);
35
+
36
+ dispose?.();
37
+ ```
38
+
39
+ ## Host Functions
40
+
41
+ All functions return a dict with `content`, `model`, `usage`, `stop_reason`, `id`, and `messages`.
42
+
43
+ ### gemini::message(text, options?)
44
+
45
+ Send a single message to Gemini.
46
+
47
+ ```rill
48
+ gemini::message("Analyze this code for security issues") => $response
49
+ $response.content -> log
50
+ $response.usage.output -> log
51
+ ```
52
+
53
+ ### gemini::messages(messages, options?)
54
+
55
+ Send a multi-turn conversation.
56
+
57
+ ```rill
58
+ gemini::messages([
59
+ [role: "user", content: "What is rill?"],
60
+ [role: "assistant", content: "A scripting language for AI agents."],
61
+ [role: "user", content: "Show me an example."]
62
+ ]) => $response
63
+ $response.content -> log
64
+ ```
65
+
66
+ ### gemini::embed(text)
67
+
68
+ Generate an embedding vector for text. Requires `embed_model` in config.
69
+
70
+ ```rill
71
+ gemini::embed("Hello world") => $vector
72
+ ```
73
+
74
+ ### gemini::embed_batch(texts)
75
+
76
+ Generate embedding vectors for multiple texts in a single API call.
77
+
78
+ ```rill
79
+ gemini::embed_batch(["Hello", "World"]) => $vectors
80
+ ```
81
+
82
+ ### gemini::tool_loop(prompt, options)
83
+
84
+ Execute a tool-use loop where the model calls rill functions iteratively.
85
+
86
+ ```rill
87
+ gemini::tool_loop("Find the weather", [tools: $my_tools]) => $result
88
+ $result.content -> log
89
+ $result.turns -> log
90
+ ```
91
+
92
+ ## Configuration
93
+
94
+ ```typescript
95
+ const ext = createGeminiExtension({
96
+ api_key: process.env.GOOGLE_API_KEY!,
97
+ model: 'gemini-2.0-flash',
98
+ temperature: 0.7,
99
+ max_tokens: 8192,
100
+ system: 'You are a helpful assistant.',
101
+ embed_model: 'text-embedding-004',
102
+ });
103
+ ```
104
+
105
+ | Option | Type | Default | Description |
106
+ |--------|------|---------|-------------|
107
+ | `api_key` | string | required | Google API key |
108
+ | `model` | string | required | Model identifier |
109
+ | `temperature` | number | undefined | Temperature (0.0-2.0) |
110
+ | `base_url` | string | undefined | Custom API endpoint URL |
111
+ | `max_tokens` | number | `8192` | Max tokens in response |
112
+ | `max_retries` | number | undefined | Max retry attempts |
113
+ | `timeout` | number | undefined | Request timeout in ms |
114
+ | `system` | string | undefined | Default system instruction |
115
+ | `embed_model` | string | undefined | Embedding model identifier |
116
+
117
+ ## Result Shape
118
+
119
+ ```typescript
120
+ interface GeminiResult {
121
+ content: string; // response text
122
+ model: string; // model used
123
+ usage: {
124
+ input: number; // prompt tokens
125
+ output: number; // completion tokens
126
+ };
127
+ stop_reason: string; // finish reason
128
+ id: string; // request ID
129
+ messages: Array<{ // full conversation history
130
+ role: string;
131
+ content: string;
132
+ }>;
133
+ }
134
+ ```
135
+
136
+ ## Lifecycle
137
+
138
+ Call `dispose()` on the extension to cancel pending requests:
139
+
140
+ ```typescript
141
+ const ext = createGeminiExtension({ ... });
142
+ // ... use extension ...
143
+ await ext.dispose?.();
144
+ ```
145
+
146
+ ## Test Host
147
+
148
+ A runnable example at `examples/test-host.ts` wires up the extension with the rill runtime:
149
+
150
+ ```bash
151
+ pnpm exec tsx examples/test-host.ts
152
+ pnpm exec tsx examples/test-host.ts -e 'gemini::message("Tell me a joke") -> log'
153
+ pnpm exec tsx examples/test-host.ts script.rill
154
+ ```
155
+
156
+ Requires `GOOGLE_API_KEY` environment variable.
157
+
158
+ ## Documentation
159
+
160
+ | Document | Description |
161
+ |----------|-------------|
162
+ | [Extensions Guide](https://github.com/rcrsr/rill/blob/main/docs/integration-extensions.md) | Extension contract and patterns |
163
+ | [Host API Reference](https://github.com/rcrsr/rill/blob/main/docs/ref-host-api.md) | Runtime context and host functions |
164
+
165
+ ## License
166
+
167
+ MIT
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Extension factory for Gemini API integration.
3
+ * Creates extension instance with config validation and SDK lifecycle management.
4
+ */
5
+ import { type ExtensionResult } from '@rcrsr/rill';
6
+ import type { GeminiExtensionConfig } from './types.js';
7
+ /**
8
+ * Create Gemini extension instance.
9
+ * Validates configuration and returns host functions with cleanup.
10
+ *
11
+ * @param config - Extension configuration
12
+ * @returns ExtensionResult with message, messages, embed, embed_batch, tool_loop and dispose
13
+ * @throws Error for invalid configuration (EC-1 through EC-4)
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * const ext = createGeminiExtension({
18
+ * api_key: process.env.GOOGLE_API_KEY,
19
+ * model: 'gemini-2.0-flash',
20
+ * temperature: 0.7
21
+ * });
22
+ * // Use with rill runtime...
23
+ * await ext.dispose();
24
+ * ```
25
+ */
26
+ export declare function createGeminiExtension(config: GeminiExtensionConfig): ExtensionResult;
27
+ //# sourceMappingURL=factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,OAAO,EAML,KAAK,eAAe,EAIrB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AA0GxD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,qBAAqB,GAC5B,eAAe,CAo7BjB"}
@@ -0,0 +1,865 @@
1
+ /**
2
+ * Extension factory for Gemini API integration.
3
+ * Creates extension instance with config validation and SDK lifecycle management.
4
+ */
5
+ import { GoogleGenAI, Type, } from '@google/genai';
6
+ import { RuntimeError, emitExtensionEvent, createVector, isCallable, isVector, } from '@rcrsr/rill';
7
+ // ============================================================
8
+ // CONSTANTS
9
+ // ============================================================
10
+ const MIN_TEMPERATURE = 0.0;
11
+ const MAX_TEMPERATURE = 2.0;
12
+ const DEFAULT_MAX_TOKENS = 8192;
13
+ // ============================================================
14
+ // HELPER FUNCTIONS
15
+ // ============================================================
16
+ /**
17
+ * Map Gemini API error to RuntimeError with appropriate message.
18
+ *
19
+ * @param error - Error from Gemini SDK
20
+ * @returns RuntimeError with appropriate message
21
+ */
22
+ function mapGeminiError(error) {
23
+ if (error instanceof Error) {
24
+ const message = error.message;
25
+ // Check for common error patterns in Gemini API responses
26
+ if (message.includes('401') || message.includes('authentication')) {
27
+ return new RuntimeError('RILL-R004', 'Gemini: authentication failed (401)');
28
+ }
29
+ if (message.includes('429') || message.includes('rate limit')) {
30
+ return new RuntimeError('RILL-R004', 'Gemini: rate limit');
31
+ }
32
+ if (message.includes('timeout') || message.includes('ETIMEDOUT')) {
33
+ return new RuntimeError('RILL-R004', 'Gemini: request timeout');
34
+ }
35
+ // Extract status code if present
36
+ const statusMatch = message.match(/\((\d{3})\)/);
37
+ if (statusMatch && statusMatch[1]) {
38
+ const status = parseInt(statusMatch[1], 10);
39
+ if (status >= 400) {
40
+ return new RuntimeError('RILL-R004', `Gemini: ${message} (${status})`);
41
+ }
42
+ }
43
+ return new RuntimeError('RILL-R004', `Gemini: ${message}`);
44
+ }
45
+ return new RuntimeError('RILL-R004', 'Gemini: unknown error');
46
+ }
47
+ // ============================================================
48
+ // VALIDATION
49
+ // ============================================================
50
+ /**
51
+ * Validate api_key is present and non-empty.
52
+ *
53
+ * @param api_key - API key to validate
54
+ * @throws Error if api_key missing or empty (EC-1, EC-3)
55
+ */
56
+ function validateApiKey(api_key) {
57
+ if (api_key === undefined) {
58
+ throw new Error('api_key is required');
59
+ }
60
+ if (api_key === '') {
61
+ throw new Error('api_key cannot be empty');
62
+ }
63
+ }
64
+ /**
65
+ * Validate model is present and non-empty.
66
+ *
67
+ * @param model - Model identifier to validate
68
+ * @throws Error if model missing or empty (EC-2)
69
+ */
70
+ function validateModel(model) {
71
+ if (model === undefined || model === '') {
72
+ throw new Error('model is required');
73
+ }
74
+ }
75
+ /**
76
+ * Validate temperature is within valid range (0.0-2.0).
77
+ *
78
+ * @param temperature - Temperature value to validate
79
+ * @throws Error if temperature out of range (EC-4)
80
+ */
81
+ function validateTemperature(temperature) {
82
+ if (temperature !== undefined) {
83
+ if (temperature < MIN_TEMPERATURE || temperature > MAX_TEMPERATURE) {
84
+ throw new Error('temperature must be between 0 and 2');
85
+ }
86
+ }
87
+ }
88
+ // ============================================================
89
+ // FACTORY
90
+ // ============================================================
91
+ /**
92
+ * Create Gemini extension instance.
93
+ * Validates configuration and returns host functions with cleanup.
94
+ *
95
+ * @param config - Extension configuration
96
+ * @returns ExtensionResult with message, messages, embed, embed_batch, tool_loop and dispose
97
+ * @throws Error for invalid configuration (EC-1 through EC-4)
98
+ *
99
+ * @example
100
+ * ```typescript
101
+ * const ext = createGeminiExtension({
102
+ * api_key: process.env.GOOGLE_API_KEY,
103
+ * model: 'gemini-2.0-flash',
104
+ * temperature: 0.7
105
+ * });
106
+ * // Use with rill runtime...
107
+ * await ext.dispose();
108
+ * ```
109
+ */
110
+ export function createGeminiExtension(config) {
111
+ // Validate required fields (§4.1)
112
+ validateApiKey(config.api_key);
113
+ validateModel(config.model);
114
+ validateTemperature(config.temperature);
115
+ // Instantiate SDK client at factory time (§4.1)
116
+ const client = new GoogleGenAI({
117
+ apiKey: config.api_key,
118
+ });
119
+ // Extract config values for use in functions
120
+ const factoryModel = config.model;
121
+ const factoryTemperature = config.temperature;
122
+ const factoryMaxTokens = config.max_tokens ?? DEFAULT_MAX_TOKENS;
123
+ const factorySystem = config.system;
124
+ const factoryEmbedModel = config.embed_model;
125
+ // AbortController for cancelling pending requests (§4.9, IR-11)
126
+ let abortController = new AbortController();
127
+ // Dispose function for cleanup (§4.9)
128
+ const dispose = async () => {
129
+ // AC-28: Idempotent cleanup, try-catch each step
130
+ try {
131
+ // Cancel pending API requests via AbortController (IR-11)
132
+ if (abortController) {
133
+ abortController.abort();
134
+ abortController = undefined;
135
+ }
136
+ }
137
+ catch (error) {
138
+ const message = error instanceof Error ? error.message : 'Unknown error';
139
+ console.warn(`Failed to abort Gemini requests: ${message}`);
140
+ }
141
+ try {
142
+ // Cleanup SDK HTTP connections
143
+ // Note: Gemini SDK doesn't expose a close() method, but we include
144
+ // this structure for consistency with extension pattern
145
+ }
146
+ catch (error) {
147
+ const message = error instanceof Error ? error.message : 'Unknown error';
148
+ console.warn(`Failed to cleanup Gemini SDK: ${message}`);
149
+ }
150
+ };
151
+ // Return extension result with implementations
152
+ const result = {
153
+ // IR-4: gemini::message
154
+ message: {
155
+ params: [
156
+ { name: 'text', type: 'string' },
157
+ { name: 'options', type: 'dict', defaultValue: {} },
158
+ ],
159
+ fn: async (args, ctx) => {
160
+ const startTime = Date.now();
161
+ try {
162
+ // Extract arguments
163
+ const text = args[0];
164
+ const options = (args[1] ?? {});
165
+ // EC-5: Validate text is non-empty
166
+ if (text.trim().length === 0) {
167
+ throw new RuntimeError('RILL-R004', 'prompt text cannot be empty');
168
+ }
169
+ // Extract options
170
+ const system = typeof options['system'] === 'string'
171
+ ? options['system']
172
+ : factorySystem;
173
+ const maxTokens = typeof options['max_tokens'] === 'number'
174
+ ? options['max_tokens']
175
+ : factoryMaxTokens;
176
+ // Build Gemini API request
177
+ // Gemini uses 'contents' array with role: "user" / role: "model"
178
+ const contents = [
179
+ {
180
+ role: 'user',
181
+ parts: [{ text }],
182
+ },
183
+ ];
184
+ // Build config object with optional properties
185
+ const apiConfig = {};
186
+ // Add system instruction if present
187
+ if (system !== undefined) {
188
+ apiConfig.systemInstruction = system;
189
+ }
190
+ // Add max_tokens if present
191
+ if (maxTokens !== undefined) {
192
+ apiConfig.maxOutputTokens = maxTokens;
193
+ }
194
+ // Add temperature if present
195
+ if (factoryTemperature !== undefined) {
196
+ apiConfig.temperature = factoryTemperature;
197
+ }
198
+ // Call Gemini API
199
+ const response = await client.models.generateContent({
200
+ model: factoryModel,
201
+ contents,
202
+ config: apiConfig,
203
+ });
204
+ // Extract text content from response
205
+ const content = response.text ?? '';
206
+ // Build normalized response dict (§3.2)
207
+ const result = {
208
+ content,
209
+ model: factoryModel,
210
+ usage: {
211
+ input: 0, // Gemini API doesn't always provide token counts
212
+ output: 0,
213
+ },
214
+ stop_reason: 'stop',
215
+ id: '', // Gemini API doesn't provide request IDs in the same way
216
+ messages: [
217
+ ...(system ? [{ role: 'system', content: system }] : []),
218
+ { role: 'user', content: text },
219
+ { role: 'assistant', content },
220
+ ],
221
+ };
222
+ // Emit success event (§4.10)
223
+ const duration = Date.now() - startTime;
224
+ emitExtensionEvent(ctx, {
225
+ event: 'gemini:message',
226
+ subsystem: 'extension:gemini',
227
+ duration,
228
+ model: factoryModel,
229
+ usage: result.usage,
230
+ });
231
+ return result;
232
+ }
233
+ catch (error) {
234
+ // Map error and emit failure event
235
+ const duration = Date.now() - startTime;
236
+ const rillError = mapGeminiError(error);
237
+ emitExtensionEvent(ctx, {
238
+ event: 'gemini:error',
239
+ subsystem: 'extension:gemini',
240
+ error: rillError.message,
241
+ duration,
242
+ });
243
+ throw rillError;
244
+ }
245
+ },
246
+ description: 'Send single message to Gemini API',
247
+ returnType: 'dict',
248
+ },
249
+ // IR-5: gemini::messages
250
+ messages: {
251
+ params: [
252
+ { name: 'messages', type: 'list' },
253
+ { name: 'options', type: 'dict', defaultValue: {} },
254
+ ],
255
+ fn: async (args, ctx) => {
256
+ const startTime = Date.now();
257
+ try {
258
+ // Extract arguments
259
+ const messages = args[0];
260
+ const options = (args[1] ?? {});
261
+ // AC-23: Empty messages list raises error
262
+ if (messages.length === 0) {
263
+ throw new RuntimeError('RILL-R004', 'messages list cannot be empty');
264
+ }
265
+ // Extract options
266
+ const system = typeof options['system'] === 'string'
267
+ ? options['system']
268
+ : factorySystem;
269
+ const maxTokens = typeof options['max_tokens'] === 'number'
270
+ ? options['max_tokens']
271
+ : factoryMaxTokens;
272
+ // Build Gemini API contents array
273
+ // Gemini uses role: "user" / role: "model" (not "assistant")
274
+ const contents = [];
275
+ // Validate and transform messages
276
+ for (let i = 0; i < messages.length; i++) {
277
+ const msg = messages[i];
278
+ // EC-10: Missing role raises error
279
+ if (!msg || typeof msg !== 'object' || !('role' in msg)) {
280
+ throw new RuntimeError('RILL-R004', "message missing required 'role' field");
281
+ }
282
+ const role = msg['role'];
283
+ // EC-11: Unknown role value raises error
284
+ if (role !== 'user' && role !== 'assistant' && role !== 'tool') {
285
+ throw new RuntimeError('RILL-R004', `invalid role '${role}'`);
286
+ }
287
+ // EC-12: User message missing content
288
+ if (role === 'user' || role === 'tool') {
289
+ if (!('content' in msg) || typeof msg['content'] !== 'string') {
290
+ throw new RuntimeError('RILL-R004', `${role} message requires 'content'`);
291
+ }
292
+ // Gemini uses "user" for both user and tool messages
293
+ contents.push({
294
+ role: 'user',
295
+ parts: [{ text: msg['content'] }],
296
+ });
297
+ }
298
+ // EC-13: Assistant missing both content and tool_calls
299
+ else if (role === 'assistant') {
300
+ const hasContent = 'content' in msg && msg['content'];
301
+ const hasToolCalls = 'tool_calls' in msg && msg['tool_calls'];
302
+ if (!hasContent && !hasToolCalls) {
303
+ throw new RuntimeError('RILL-R004', "assistant message requires 'content' or 'tool_calls'");
304
+ }
305
+ // For now, we only support content
306
+ if (hasContent) {
307
+ contents.push({
308
+ role: 'model',
309
+ parts: [{ text: msg['content'] }],
310
+ });
311
+ }
312
+ }
313
+ }
314
+ // Build config object with optional properties
315
+ const apiConfig = {};
316
+ // Add system instruction if present
317
+ if (system !== undefined) {
318
+ apiConfig.systemInstruction = system;
319
+ }
320
+ // Add max_tokens if present
321
+ if (maxTokens !== undefined) {
322
+ apiConfig.maxOutputTokens = maxTokens;
323
+ }
324
+ // Add temperature if present
325
+ if (factoryTemperature !== undefined) {
326
+ apiConfig.temperature = factoryTemperature;
327
+ }
328
+ // Call Gemini API
329
+ const response = await client.models.generateContent({
330
+ model: factoryModel,
331
+ contents,
332
+ config: apiConfig,
333
+ });
334
+ // Extract text content from response
335
+ const content = response.text ?? '';
336
+ // Build full conversation history (§3.2)
337
+ const fullMessages = [
338
+ ...messages.map((m) => {
339
+ const normalized = { role: m['role'] };
340
+ if ('content' in m)
341
+ normalized['content'] = m['content'];
342
+ if ('tool_calls' in m)
343
+ normalized['tool_calls'] = m['tool_calls'];
344
+ return normalized;
345
+ }),
346
+ { role: 'assistant', content },
347
+ ];
348
+ // Build normalized response dict (§3.2)
349
+ const result = {
350
+ content,
351
+ model: factoryModel,
352
+ usage: {
353
+ input: 0, // Gemini API doesn't always provide token counts
354
+ output: 0,
355
+ },
356
+ stop_reason: 'stop',
357
+ id: '', // Gemini API doesn't provide request IDs in the same way
358
+ messages: fullMessages,
359
+ };
360
+ // Emit success event (§4.10)
361
+ const duration = Date.now() - startTime;
362
+ emitExtensionEvent(ctx, {
363
+ event: 'gemini:messages',
364
+ subsystem: 'extension:gemini',
365
+ duration,
366
+ model: factoryModel,
367
+ usage: result.usage,
368
+ });
369
+ return result;
370
+ }
371
+ catch (error) {
372
+ // Map error and emit failure event
373
+ const duration = Date.now() - startTime;
374
+ const rillError = mapGeminiError(error);
375
+ emitExtensionEvent(ctx, {
376
+ event: 'gemini:error',
377
+ subsystem: 'extension:gemini',
378
+ error: rillError.message,
379
+ duration,
380
+ });
381
+ throw rillError;
382
+ }
383
+ },
384
+ description: 'Send multi-turn conversation to Gemini API',
385
+ returnType: 'dict',
386
+ },
387
+ // IR-6: gemini::embed
388
+ embed: {
389
+ params: [{ name: 'text', type: 'string' }],
390
+ fn: async (args, ctx) => {
391
+ const startTime = Date.now();
392
+ try {
393
+ // Extract arguments
394
+ const text = args[0];
395
+ // EC-15: Validate text is non-empty
396
+ if (text.trim().length === 0) {
397
+ throw new RuntimeError('RILL-R004', 'embed text cannot be empty');
398
+ }
399
+ // EC-16: Validate embed_model is configured
400
+ if (factoryEmbedModel === undefined || factoryEmbedModel === '') {
401
+ throw new RuntimeError('RILL-R004', 'embed_model not configured');
402
+ }
403
+ // Call Gemini embedContent API
404
+ const response = await client.models.embedContent({
405
+ model: factoryEmbedModel,
406
+ contents: [text],
407
+ });
408
+ // Extract embedding data from response
409
+ const embedding = response.embeddings?.[0];
410
+ if (!embedding ||
411
+ !embedding.values ||
412
+ embedding.values.length === 0) {
413
+ throw new RuntimeError('RILL-R004', 'Gemini: empty embedding returned');
414
+ }
415
+ // Convert to Float32Array and create RillVector
416
+ const float32Data = new Float32Array(embedding.values);
417
+ const vector = createVector(float32Data, factoryEmbedModel);
418
+ // Emit success event
419
+ const duration = Date.now() - startTime;
420
+ emitExtensionEvent(ctx, {
421
+ event: 'gemini:embed',
422
+ subsystem: 'extension:gemini',
423
+ duration,
424
+ model: factoryEmbedModel,
425
+ dimensions: float32Data.length,
426
+ });
427
+ return vector;
428
+ }
429
+ catch (error) {
430
+ // Map error and emit failure event
431
+ const duration = Date.now() - startTime;
432
+ const rillError = mapGeminiError(error);
433
+ emitExtensionEvent(ctx, {
434
+ event: 'gemini:error',
435
+ subsystem: 'extension:gemini',
436
+ error: rillError.message,
437
+ duration,
438
+ });
439
+ throw rillError;
440
+ }
441
+ },
442
+ description: 'Generate embedding vector for text',
443
+ returnType: 'vector',
444
+ },
445
+ // IR-7: gemini::embed_batch
446
+ embed_batch: {
447
+ params: [{ name: 'texts', type: 'list' }],
448
+ fn: async (args, ctx) => {
449
+ const startTime = Date.now();
450
+ try {
451
+ // Extract arguments
452
+ const texts = args[0];
453
+ // AC-24: Empty list returns empty list
454
+ if (texts.length === 0) {
455
+ return [];
456
+ }
457
+ // EC-20: Validate embed_model is configured
458
+ if (factoryEmbedModel === undefined || factoryEmbedModel === '') {
459
+ throw new RuntimeError('RILL-R004', 'embed_model not configured');
460
+ }
461
+ // EC-18: Validate all elements are strings
462
+ const stringTexts = [];
463
+ for (let i = 0; i < texts.length; i++) {
464
+ const text = texts[i];
465
+ if (typeof text !== 'string') {
466
+ throw new RuntimeError('RILL-R004', 'embed_batch requires list of strings');
467
+ }
468
+ // EC-19: Check for empty strings
469
+ if (text.trim().length === 0) {
470
+ throw new RuntimeError('RILL-R004', `embed text cannot be empty at index ${i}`);
471
+ }
472
+ stringTexts.push(text);
473
+ }
474
+ // Call Gemini embedContent API with array of texts
475
+ const response = await client.models.embedContent({
476
+ model: factoryEmbedModel,
477
+ contents: stringTexts,
478
+ });
479
+ // Convert embeddings to RillVector list
480
+ const vectors = [];
481
+ if (!response.embeddings || response.embeddings.length === 0) {
482
+ throw new RuntimeError('RILL-R004', 'Gemini: empty embeddings returned');
483
+ }
484
+ for (const embedding of response.embeddings) {
485
+ if (!embedding ||
486
+ !embedding.values ||
487
+ embedding.values.length === 0) {
488
+ throw new RuntimeError('RILL-R004', 'Gemini: empty embedding returned');
489
+ }
490
+ const float32Data = new Float32Array(embedding.values);
491
+ const vector = createVector(float32Data, factoryEmbedModel);
492
+ vectors.push(vector);
493
+ }
494
+ // Emit success event
495
+ const duration = Date.now() - startTime;
496
+ const firstVector = vectors[0];
497
+ const dimensions = firstVector && isVector(firstVector) ? firstVector.data.length : 0;
498
+ emitExtensionEvent(ctx, {
499
+ event: 'gemini:embed_batch',
500
+ subsystem: 'extension:gemini',
501
+ duration,
502
+ model: factoryEmbedModel,
503
+ dimensions,
504
+ count: vectors.length,
505
+ });
506
+ return vectors;
507
+ }
508
+ catch (error) {
509
+ // Map error and emit failure event
510
+ const duration = Date.now() - startTime;
511
+ const rillError = mapGeminiError(error);
512
+ emitExtensionEvent(ctx, {
513
+ event: 'gemini:error',
514
+ subsystem: 'extension:gemini',
515
+ error: rillError.message,
516
+ duration,
517
+ });
518
+ throw rillError;
519
+ }
520
+ },
521
+ description: 'Generate embedding vectors for multiple texts',
522
+ returnType: 'list',
523
+ },
524
+ // IR-8: gemini::tool_loop
525
+ tool_loop: {
526
+ params: [
527
+ { name: 'prompt', type: 'string' },
528
+ { name: 'options', type: 'dict', defaultValue: {} },
529
+ ],
530
+ fn: async (args, ctx) => {
531
+ const startTime = Date.now();
532
+ try {
533
+ // Extract arguments
534
+ const prompt = args[0];
535
+ const options = (args[1] ?? {});
536
+ // EC-22: Validate prompt is non-empty
537
+ if (prompt.trim().length === 0) {
538
+ throw new RuntimeError('RILL-R004', 'prompt text cannot be empty');
539
+ }
540
+ // EC-23: Validate tools option is present
541
+ if (!('tools' in options) || !Array.isArray(options['tools'])) {
542
+ throw new RuntimeError('RILL-R004', "tool_loop requires 'tools' option");
543
+ }
544
+ const toolDescriptors = options['tools'];
545
+ // Extract options with defaults
546
+ const system = typeof options['system'] === 'string'
547
+ ? options['system']
548
+ : factorySystem;
549
+ const maxTokens = typeof options['max_tokens'] === 'number'
550
+ ? options['max_tokens']
551
+ : factoryMaxTokens;
552
+ const maxTurns = typeof options['max_turns'] === 'number'
553
+ ? options['max_turns']
554
+ : 10;
555
+ const maxErrors = typeof options['max_errors'] === 'number'
556
+ ? options['max_errors']
557
+ : 3;
558
+ const initialMessages = Array.isArray(options['messages']) && options['messages'].length > 0
559
+ ? options['messages']
560
+ : [];
561
+ // Build tool map and Gemini tools array
562
+ const toolMap = new Map();
563
+ const geminiTools = [];
564
+ for (const tool of toolDescriptors) {
565
+ if (typeof tool !== 'object' ||
566
+ tool === null ||
567
+ !('name' in tool) ||
568
+ !('fn' in tool)) {
569
+ throw new RuntimeError('RILL-R004', 'invalid tool descriptor in tools list');
570
+ }
571
+ const toolName = tool['name'];
572
+ const toolFn = tool['fn'];
573
+ if (!isCallable(toolFn)) {
574
+ throw new RuntimeError('RILL-R004', `tool '${toolName}' not callable`);
575
+ }
576
+ toolMap.set(toolName, toolFn);
577
+ // Build Gemini tool definition
578
+ const description = typeof tool['description'] === 'string'
579
+ ? tool['description']
580
+ : '';
581
+ const params = tool['params'] ?? {};
582
+ // Convert rill params dict to JSON Schema
583
+ const properties = {};
584
+ const required = [];
585
+ if (typeof params === 'object' && params !== null) {
586
+ for (const [paramName, paramSpec] of Object.entries(params)) {
587
+ if (typeof paramSpec === 'object' &&
588
+ paramSpec !== null &&
589
+ 'type' in paramSpec) {
590
+ const spec = paramSpec;
591
+ const typeStr = (spec['type'] ?? 'string');
592
+ // Map rill types to Gemini Schema types
593
+ let schemaType = Type.STRING;
594
+ if (typeStr === 'number')
595
+ schemaType = Type.NUMBER;
596
+ if (typeStr === 'boolean')
597
+ schemaType = Type.BOOLEAN;
598
+ if (typeStr === 'integer')
599
+ schemaType = Type.INTEGER;
600
+ properties[paramName] = {
601
+ type: schemaType,
602
+ description: (spec['description'] ?? ''),
603
+ };
604
+ // All params are required by default
605
+ required.push(paramName);
606
+ }
607
+ }
608
+ }
609
+ geminiTools.push({
610
+ name: toolName,
611
+ description,
612
+ parameters: {
613
+ type: Type.OBJECT,
614
+ properties,
615
+ required,
616
+ },
617
+ });
618
+ }
619
+ // Build initial contents array
620
+ const conversationContents = [];
621
+ // Add history messages if provided
622
+ for (const msg of initialMessages) {
623
+ if (typeof msg === 'object' &&
624
+ msg !== null &&
625
+ 'role' in msg &&
626
+ 'content' in msg) {
627
+ const role = msg['role'];
628
+ if (role === 'user') {
629
+ conversationContents.push({
630
+ role: 'user',
631
+ parts: [{ text: msg['content'] }],
632
+ });
633
+ }
634
+ else if (role === 'assistant') {
635
+ conversationContents.push({
636
+ role: 'model',
637
+ parts: [{ text: msg['content'] }],
638
+ });
639
+ }
640
+ }
641
+ }
642
+ // Add user prompt
643
+ conversationContents.push({
644
+ role: 'user',
645
+ parts: [{ text: prompt }],
646
+ });
647
+ // Tool loop state
648
+ let turns = 0;
649
+ let consecutiveErrors = 0;
650
+ let totalInputTokens = 0;
651
+ let totalOutputTokens = 0;
652
+ let finalContent = '';
653
+ let stopReason = 'stop';
654
+ // Main tool loop
655
+ while (turns < maxTurns) {
656
+ turns++;
657
+ // Build config object
658
+ const apiConfig = {
659
+ ...(system !== undefined && { systemInstruction: system }),
660
+ ...(maxTokens !== undefined && { maxOutputTokens: maxTokens }),
661
+ ...(factoryTemperature !== undefined && {
662
+ temperature: factoryTemperature,
663
+ }),
664
+ tools: [{ functionDeclarations: geminiTools }],
665
+ };
666
+ // Call Gemini API with tools
667
+ const response = await client.models.generateContent({
668
+ model: factoryModel,
669
+ contents: conversationContents,
670
+ config: apiConfig,
671
+ });
672
+ // Aggregate usage (Gemini API may not provide token counts)
673
+ totalInputTokens += 0;
674
+ totalOutputTokens += 0;
675
+ // Extract response text
676
+ const responseText = response.text ?? '';
677
+ // Check for function calls in response
678
+ const functionCalls = response.functionCalls;
679
+ if (functionCalls && functionCalls.length > 0) {
680
+ // Add model message with function calls to conversation
681
+ const functionCallParts = functionCalls.map((fc) => ({
682
+ functionCall: {
683
+ name: fc.name ?? '',
684
+ args: fc.args ?? {},
685
+ id: fc.id ?? '',
686
+ },
687
+ }));
688
+ conversationContents.push({
689
+ role: 'model',
690
+ parts: functionCallParts,
691
+ });
692
+ // Execute tool calls (parallel for multiple calls)
693
+ const toolResults = await Promise.all(functionCalls.map(async (functionCall) => {
694
+ const toolStartTime = Date.now();
695
+ const toolName = functionCall.name ?? '';
696
+ // Emit tool_call event
697
+ emitExtensionEvent(ctx, {
698
+ event: 'gemini:tool_call',
699
+ subsystem: 'extension:gemini',
700
+ tool_name: toolName,
701
+ args: JSON.stringify(functionCall.args),
702
+ });
703
+ // EC-24: Check tool exists (configuration error, abort immediately)
704
+ const toolFn = toolMap.get(toolName);
705
+ if (!toolFn) {
706
+ throw new RuntimeError('RILL-R004', `unknown tool '${toolName}'`);
707
+ }
708
+ try {
709
+ // Convert args object to RillValue array (positional args)
710
+ const toolArgs = functionCall.args ?? {};
711
+ const argsArray = [];
712
+ for (const [, value] of Object.entries(toolArgs)) {
713
+ argsArray.push(value);
714
+ }
715
+ // Invoke tool callable based on type
716
+ let result;
717
+ if (toolFn.kind === 'script') {
718
+ // ScriptCallable: not supported in tool_loop context
719
+ throw new RuntimeError('RILL-R004', 'script closures not yet supported in tool_loop');
720
+ }
721
+ else {
722
+ // RuntimeCallable or ApplicationCallable
723
+ result = await toolFn.fn(argsArray, ctx, undefined);
724
+ }
725
+ // Reset consecutive errors on success
726
+ consecutiveErrors = 0;
727
+ // Emit tool_result event
728
+ const toolDuration = Date.now() - toolStartTime;
729
+ emitExtensionEvent(ctx, {
730
+ event: 'gemini:tool_result',
731
+ subsystem: 'extension:gemini',
732
+ tool_name: toolName,
733
+ duration: toolDuration,
734
+ });
735
+ // Return tool result
736
+ return {
737
+ name: toolName,
738
+ response: typeof result === 'string'
739
+ ? result
740
+ : JSON.stringify(result),
741
+ };
742
+ }
743
+ catch (error) {
744
+ consecutiveErrors++;
745
+ // Format error for LLM
746
+ const errorMessage = error instanceof RuntimeError
747
+ ? error.message
748
+ : error instanceof Error
749
+ ? error.message
750
+ : 'unknown error';
751
+ // Emit tool_result event with error
752
+ const toolDuration = Date.now() - toolStartTime;
753
+ emitExtensionEvent(ctx, {
754
+ event: 'gemini:tool_result',
755
+ subsystem: 'extension:gemini',
756
+ tool_name: toolName,
757
+ duration: toolDuration,
758
+ error: errorMessage,
759
+ });
760
+ // EC-25: Check if max_errors exceeded
761
+ if (consecutiveErrors >= maxErrors) {
762
+ throw new RuntimeError('RILL-R004', `tool loop aborted after ${maxErrors} consecutive errors`);
763
+ }
764
+ // Return error to LLM as tool result
765
+ return {
766
+ name: toolName,
767
+ response: JSON.stringify({
768
+ error: errorMessage,
769
+ code: 'RILL-R001',
770
+ }),
771
+ };
772
+ }
773
+ }));
774
+ // Add function responses to conversation
775
+ const functionResponseParts = toolResults.map((tr) => ({
776
+ functionResponse: {
777
+ name: tr.name ?? '',
778
+ response: { result: tr.response },
779
+ },
780
+ }));
781
+ conversationContents.push({
782
+ role: 'user',
783
+ parts: functionResponseParts,
784
+ });
785
+ // Continue loop to get next response
786
+ continue;
787
+ }
788
+ // No function calls - final response
789
+ finalContent = responseText;
790
+ stopReason = 'stop';
791
+ break;
792
+ }
793
+ // Check if we hit max_turns
794
+ if (turns >= maxTurns && stopReason === 'stop') {
795
+ stopReason = 'max_turns';
796
+ }
797
+ // Build conversation history for response
798
+ const fullMessages = [];
799
+ for (const content of conversationContents) {
800
+ if (content.role === 'user' && content.parts) {
801
+ // Extract text from parts
802
+ const textParts = content.parts.filter((p) => 'text' in p);
803
+ if (textParts.length > 0 && textParts[0]) {
804
+ fullMessages.push({
805
+ role: 'user',
806
+ content: textParts[0].text,
807
+ });
808
+ }
809
+ }
810
+ else if (content.role === 'model' && content.parts) {
811
+ // Extract text from parts
812
+ const textParts = content.parts.filter((p) => 'text' in p);
813
+ if (textParts.length > 0 && textParts[0]) {
814
+ fullMessages.push({
815
+ role: 'assistant',
816
+ content: textParts[0].text,
817
+ });
818
+ }
819
+ }
820
+ }
821
+ // Build result dict
822
+ const result = {
823
+ content: finalContent,
824
+ model: factoryModel,
825
+ usage: {
826
+ input: totalInputTokens,
827
+ output: totalOutputTokens,
828
+ },
829
+ stop_reason: stopReason,
830
+ turns,
831
+ messages: fullMessages,
832
+ };
833
+ // Emit success event
834
+ const duration = Date.now() - startTime;
835
+ emitExtensionEvent(ctx, {
836
+ event: 'gemini:tool_loop',
837
+ subsystem: 'extension:gemini',
838
+ turns,
839
+ total_duration: duration,
840
+ usage: result.usage,
841
+ });
842
+ return result;
843
+ }
844
+ catch (error) {
845
+ // Map error and emit failure event
846
+ const duration = Date.now() - startTime;
847
+ const rillError = mapGeminiError(error);
848
+ emitExtensionEvent(ctx, {
849
+ event: 'gemini:error',
850
+ subsystem: 'extension:gemini',
851
+ error: rillError.message,
852
+ duration,
853
+ });
854
+ throw rillError;
855
+ }
856
+ },
857
+ description: 'Execute tool-use loop with Gemini API',
858
+ returnType: 'dict',
859
+ },
860
+ };
861
+ // IR-11: Attach dispose lifecycle method
862
+ result.dispose = dispose;
863
+ return result;
864
+ }
865
+ //# sourceMappingURL=factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @rcrsr/rill-ext-gemini
3
+ *
4
+ * Extension for Google Gemini API integration with rill scripts.
5
+ */
6
+ export declare const VERSION = "0.0.1";
7
+ export type { LLMExtensionConfig, GeminiExtensionConfig } from './types.js';
8
+ export { createGeminiExtension } from './factory.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,eAAO,MAAM,OAAO,UAAU,CAAC;AAM/B,YAAY,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAM5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @rcrsr/rill-ext-gemini
3
+ *
4
+ * Extension for Google Gemini API integration with rill scripts.
5
+ */
6
+ // ============================================================
7
+ // VERSION
8
+ // ============================================================
9
+ export const VERSION = '0.0.1';
10
+ // ============================================================
11
+ // EXTENSION FACTORY
12
+ // ============================================================
13
+ export { createGeminiExtension } from './factory.js';
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,+DAA+D;AAC/D,UAAU;AACV,+DAA+D;AAE/D,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAQ/B,+DAA+D;AAC/D,oBAAoB;AACpB,+DAA+D;AAE/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Type definitions for Google extension.
3
+ * Defines configuration, message types, and result structures.
4
+ */
5
+ /**
6
+ * Base configuration interface for LLM extensions.
7
+ * Defines common fields across all LLM providers.
8
+ */
9
+ export interface LLMExtensionConfig {
10
+ /** Model identifier (e.g., 'gemini-2.0-flash') */
11
+ readonly model: string;
12
+ /** Temperature for response generation (0.0-2.0) */
13
+ readonly temperature?: number | undefined;
14
+ /** API key for authentication */
15
+ readonly api_key: string;
16
+ /** Custom base URL for API endpoint */
17
+ readonly base_url?: string | undefined;
18
+ /** Embedding model identifier for embed operations */
19
+ readonly embed_model?: string | undefined;
20
+ }
21
+ /**
22
+ * Configuration options for Google extension.
23
+ * Extends base LLM config with Google-specific fields.
24
+ */
25
+ export interface GeminiExtensionConfig extends LLMExtensionConfig {
26
+ /** Maximum retry attempts for failed requests */
27
+ readonly max_retries?: number | undefined;
28
+ /** Request timeout in milliseconds */
29
+ readonly timeout?: number | undefined;
30
+ /** Maximum tokens in response */
31
+ readonly max_tokens?: number | undefined;
32
+ /** System prompt text */
33
+ readonly system?: string | undefined;
34
+ }
35
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,kDAAkD;IAClD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,iCAAiC;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,uCAAuC;IACvC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,sDAAsD;IACtD,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3C;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAsB,SAAQ,kBAAkB;IAC/D,iDAAiD;IACjD,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,sCAAsC;IACtC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,iCAAiC;IACjC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,yBAAyB;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACtC"}
package/dist/types.js ADDED
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Type definitions for Google extension.
3
+ * Defines configuration, message types, and result structures.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@rcrsr/rill-ext-gemini",
3
+ "version": "0.0.1",
4
+ "description": "rill extension for Google Gemini API integration",
5
+ "license": "MIT",
6
+ "author": "Andre Bremer",
7
+ "type": "module",
8
+ "main": "dist/index.js",
9
+ "types": "dist/index.d.ts",
10
+ "keywords": [
11
+ "rill",
12
+ "gemini",
13
+ "google",
14
+ "llm",
15
+ "extension",
16
+ "ai",
17
+ "scripting"
18
+ ],
19
+ "scripts": {
20
+ "build": "tsc --build",
21
+ "test": "vitest run",
22
+ "typecheck": "tsc --noEmit",
23
+ "lint": "eslint --config ../../../eslint.config.js src/",
24
+ "check": "pnpm run build && pnpm run test && pnpm run lint"
25
+ },
26
+ "peerDependencies": {
27
+ "@rcrsr/rill": "workspace:^"
28
+ },
29
+ "devDependencies": {
30
+ "@rcrsr/rill": "workspace:^"
31
+ },
32
+ "files": [
33
+ "dist"
34
+ ],
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "git+https://github.com/rcrsr/rill.git",
38
+ "directory": "packages/ext/gemini"
39
+ },
40
+ "homepage": "https://github.com/rcrsr/rill/tree/main/packages/ext/gemini#readme",
41
+ "bugs": {
42
+ "url": "https://github.com/rcrsr/rill/issues"
43
+ },
44
+ "publishConfig": {
45
+ "access": "public"
46
+ },
47
+ "dependencies": {
48
+ "@google/genai": "^1.40.0"
49
+ }
50
+ }