@kindgi/adapter-model-gemini 0.1.4-rc.4 → 0.1.4
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/README.md +6 -13
- package/dist/provider.d.ts.map +1 -1
- package/dist/provider.js +22 -3
- package/dist/provider.js.map +1 -1
- package/package.json +2 -2
- package/src/provider.ts +24 -3
package/README.md
CHANGED
|
@@ -23,6 +23,7 @@ One non-streaming `models.generateContent` call per `invoke`:
|
|
|
23
23
|
- **Thinking parts** (`thought: true`) are left out of the message text. Thinking tokens count as completion tokens, since they bill as output.
|
|
24
24
|
- **Structured output.** `structuredOutput` becomes `responseMimeType: 'application/json'` plus `responseJsonSchema`.
|
|
25
25
|
- `temperature`, `maxOutputTokens` (the call's, else the model's `ModelInfo.maxOutputTokens`) and `abortSignal` are passed through.
|
|
26
|
+
- **Retries.** A call that fails with a transient status (408, 429, 500, 502, 503, 504) is retried: three attempts in all, backing off from a second, with jitter. The `@google/genai` client retries only when it's told to, and the adapter tells it. A failed connection isn't retried. The result's `attempts` counts every attempt; a call that still fails throws the last error, and `attemptsOf(error)` (`@kindgi/capabilities/attempts`) counts them. An injected `client` keeps its own settings.
|
|
26
27
|
- **`finishReason`:**
|
|
27
28
|
- a response with function calls → `tool-use`;
|
|
28
29
|
- `STOP` or unspecified → `stop`;
|
|
@@ -37,7 +38,7 @@ One non-streaming `models.generateContent` call per `invoke`:
|
|
|
37
38
|
- uncached prompt tokens at `promptUsdPer1kTokens`;
|
|
38
39
|
- cached prompt tokens at `promptUsdPer1kTokens × cachedPromptMultiplier` (default `0.25`, Gemini 2.5's implicit-cache discount);
|
|
39
40
|
- completion tokens, thinking included, at `completionUsdPer1kTokens`;
|
|
40
|
-
- `longContext: { thresholdTokens, promptUsdPer1kTokens, completionUsdPer1kTokens }`: a call whose prompt exceeds the threshold bills entirely at those rates
|
|
41
|
+
- `longContext: { thresholdTokens, promptUsdPer1kTokens, completionUsdPer1kTokens }`: a call whose prompt exceeds the threshold bills entirely at those rates, for a model whose price rises past a prompt size.
|
|
41
42
|
|
|
42
43
|
`usage.promptTokens` includes cached tokens and built-in tool prompts; `usage.cachedTokens` reports the cached ones when there are any.
|
|
43
44
|
|
|
@@ -69,27 +70,19 @@ const gemini = createGeminiProvider({
|
|
|
69
70
|
region: 'global',
|
|
70
71
|
models: [
|
|
71
72
|
{
|
|
72
|
-
name: 'gemini-
|
|
73
|
+
name: 'gemini-3.8-flash',
|
|
73
74
|
contextWindow: 1_048_576,
|
|
74
|
-
features: ['tool-use'],
|
|
75
|
+
features: ['tool-use', 'structured-output', 'long-context'],
|
|
75
76
|
maxOutputTokens: 8_192,
|
|
76
77
|
// Rates from Google's published pricing.
|
|
77
|
-
cost: {
|
|
78
|
-
promptUsdPer1kTokens: 0.00125,
|
|
79
|
-
completionUsdPer1kTokens: 0.01,
|
|
80
|
-
longContext: {
|
|
81
|
-
thresholdTokens: 200_000,
|
|
82
|
-
promptUsdPer1kTokens: 0.0025,
|
|
83
|
-
completionUsdPer1kTokens: 0.015,
|
|
84
|
-
},
|
|
85
|
-
},
|
|
78
|
+
cost: { promptUsdPer1kTokens: 0.00075, completionUsdPer1kTokens: 0.00375 },
|
|
86
79
|
},
|
|
87
80
|
],
|
|
88
81
|
},
|
|
89
82
|
});
|
|
90
83
|
|
|
91
84
|
const result = await gemini.invoke({
|
|
92
|
-
model: 'gemini-
|
|
85
|
+
model: 'gemini-3.8-flash',
|
|
93
86
|
messages: [{ role: 'user', content: 'Summarise the grievance in one sentence.' }],
|
|
94
87
|
});
|
|
95
88
|
```
|
package/dist/provider.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,yBAAyB,EAC9B,KAAK,uBAAuB,
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,yBAAyB,EAC9B,KAAK,uBAAuB,EAG7B,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EACV,cAAc,EAGd,aAAa,EACb,gBAAgB,EACjB,MAAM,sBAAsB,CAAC;AAI9B,OAAO,EAAE,KAAK,eAAe,EAAoC,MAAM,WAAW,CAAC;AAGnF,oEAAoE;AACpE,eAAO,MAAM,iBAAiB,iCAAiC,CAAC;AAEhE,wEAAwE;AACxE,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE;QACf,eAAe,CAAC,MAAM,EAAE,yBAAyB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;KACtF,CAAC;CACH;AAED,MAAM,WAAW,qBAAqB;IACpC;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,GAAG;QACpD,QAAQ,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC;KAC7C,CAAC;IACF;;;;OAIG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1E;;;;;OAKG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACtD;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACjD,oGAAoG;IACpG,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC;CAChC;AAaD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,aAAa,CA8GlF;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAiC1E;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,oBAAoB,EAAE,cAqBlC,CAAC;AAEF,yFAAyF;AACzF,wBAAgB,YAAY,CAC1B,KAAK,EAAE,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,GACnC,WAAW,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC,CAa9C"}
|
package/dist/provider.js
CHANGED
|
@@ -1,12 +1,21 @@
|
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
|
2
2
|
// Copyright (C) 2026 Kindgi Inc.
|
|
3
3
|
import { GoogleGenAI, } from '@google/genai';
|
|
4
|
+
import { samplingFor } from '@kindgi/capabilities';
|
|
4
5
|
import { createAttemptCounter } from '@kindgi/capabilities/attempts';
|
|
5
6
|
import { computeCostUsd, toFrameworkUsage } from './cost.js';
|
|
6
7
|
import { fromGeminiResponse, toGeminiFunctions, toGeminiRequest } from './translate.js';
|
|
7
8
|
/** The adapter id servers register `geminiAdapterFactory` under. */
|
|
8
9
|
export const GEMINI_ADAPTER_ID = '@kindgi/adapter-model-gemini';
|
|
9
10
|
const CLOUD_PLATFORM_SCOPE = 'https://www.googleapis.com/auth/cloud-platform';
|
|
11
|
+
/**
|
|
12
|
+
* The SDK retries a call only when it's given `retryOptions`: three
|
|
13
|
+
* attempts on a transient status (408, 429, 500, 502, 503, 504), backing
|
|
14
|
+
* off from a second, with jitter, the OpenAI and Anthropic SDKs' default
|
|
15
|
+
* count. Unlike theirs, it doesn't retry a failed connection (Node's
|
|
16
|
+
* `fetch failed`).
|
|
17
|
+
*/
|
|
18
|
+
const RETRY_ATTEMPTS = 3;
|
|
10
19
|
/**
|
|
11
20
|
* A Gemini `ModelProvider`, on Vertex AI (`vertex`) or the Gemini
|
|
12
21
|
* Developer API (`apiKey`). Non-streaming, tool-use enabled: one
|
|
@@ -32,7 +41,10 @@ export function createGeminiProvider(options) {
|
|
|
32
41
|
}
|
|
33
42
|
if (cached?.key === key)
|
|
34
43
|
return cached.client;
|
|
35
|
-
const client = new GoogleGenAI({
|
|
44
|
+
const client = new GoogleGenAI({
|
|
45
|
+
apiKey: key,
|
|
46
|
+
httpOptions: { fetch: attempts.fetch, retryOptions: { attempts: RETRY_ATTEMPTS } },
|
|
47
|
+
});
|
|
36
48
|
cached = { key, client };
|
|
37
49
|
return client;
|
|
38
50
|
}
|
|
@@ -44,7 +56,7 @@ export function createGeminiProvider(options) {
|
|
|
44
56
|
vertexai: true,
|
|
45
57
|
project: vertex.project,
|
|
46
58
|
location: vertex.location,
|
|
47
|
-
httpOptions: { fetch: attempts.fetch },
|
|
59
|
+
httpOptions: { fetch: attempts.fetch, retryOptions: { attempts: RETRY_ATTEMPTS } },
|
|
48
60
|
...(key !== '' && {
|
|
49
61
|
googleAuthOptions: {
|
|
50
62
|
credentials: parseServiceAccountKey(key),
|
|
@@ -66,6 +78,7 @@ export function createGeminiProvider(options) {
|
|
|
66
78
|
const startedAt = Date.now();
|
|
67
79
|
const { systemInstruction, contents } = toGeminiRequest(input.messages);
|
|
68
80
|
const maxOutputTokens = input.maxOutputTokens ?? model.maxOutputTokens;
|
|
81
|
+
const sampling = samplingFor(model, input);
|
|
69
82
|
const config = {
|
|
70
83
|
...(systemInstruction !== undefined && { systemInstruction }),
|
|
71
84
|
...(input.tools !== undefined &&
|
|
@@ -76,7 +89,12 @@ export function createGeminiProvider(options) {
|
|
|
76
89
|
responseMimeType: 'application/json',
|
|
77
90
|
responseJsonSchema: input.structuredOutput.schema,
|
|
78
91
|
}),
|
|
79
|
-
...(
|
|
92
|
+
...(sampling.temperature !== undefined && { temperature: sampling.temperature }),
|
|
93
|
+
...(input.thinking === 'lowest' &&
|
|
94
|
+
model.thinking !== undefined && {
|
|
95
|
+
// Gemini's thinking levels: `low`, `minimal` (3.8 Flash refuses `minimal`).
|
|
96
|
+
thinkingConfig: { thinkingLevel: model.thinking.lowest.toUpperCase() },
|
|
97
|
+
}),
|
|
80
98
|
...(maxOutputTokens !== undefined && { maxOutputTokens }),
|
|
81
99
|
...(input.abortSignal !== undefined && { abortSignal: input.abortSignal }),
|
|
82
100
|
};
|
|
@@ -101,6 +119,7 @@ export function createGeminiProvider(options) {
|
|
|
101
119
|
// An injected client sends with its own fetch: nothing was counted.
|
|
102
120
|
...(counted.attempts > 0 && { attempts: counted.attempts }),
|
|
103
121
|
...(response.usageMetadata !== undefined && { rawUsage: { ...response.usageMetadata } }),
|
|
122
|
+
...(sampling.warnings.length > 0 && { warnings: sampling.warnings }),
|
|
104
123
|
};
|
|
105
124
|
},
|
|
106
125
|
};
|
package/dist/provider.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,iCAAiC;AAEjC,OAAO,EAIL,WAAW,
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kindgi/adapter-model-gemini",
|
|
3
|
-
"version": "0.1.4
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"description": "Gemini ModelProvider for @kindgi/capabilities, on Vertex AI. Wraps @google/genai with the framework's provider-neutral interface: message-trail ↔ generateContent translation, function calling with thought signatures, token and cost accounting including thinking tokens, and Google Application Default Credentials (or a service-account key from the secret store). Non-streaming, tool-use enabled.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"README.md"
|
|
29
29
|
],
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@kindgi/capabilities": "0.1.4
|
|
31
|
+
"@kindgi/capabilities": "0.1.4",
|
|
32
32
|
"@google/genai": "^2.24.0"
|
|
33
33
|
},
|
|
34
34
|
"engines": {
|
package/src/provider.ts
CHANGED
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
type GenerateContentParameters,
|
|
7
7
|
type GenerateContentResponse,
|
|
8
8
|
GoogleGenAI,
|
|
9
|
+
type ThinkingLevel,
|
|
9
10
|
} from '@google/genai';
|
|
10
11
|
import type {
|
|
11
12
|
AdapterFactory,
|
|
@@ -14,6 +15,7 @@ import type {
|
|
|
14
15
|
ModelProvider,
|
|
15
16
|
ProviderMetadata,
|
|
16
17
|
} from '@kindgi/capabilities';
|
|
18
|
+
import { samplingFor } from '@kindgi/capabilities';
|
|
17
19
|
import { createAttemptCounter } from '@kindgi/capabilities/attempts';
|
|
18
20
|
|
|
19
21
|
import { type GeminiModelInfo, computeCostUsd, toFrameworkUsage } from './cost.js';
|
|
@@ -62,6 +64,15 @@ export interface GeminiProviderOptions {
|
|
|
62
64
|
|
|
63
65
|
const CLOUD_PLATFORM_SCOPE = 'https://www.googleapis.com/auth/cloud-platform';
|
|
64
66
|
|
|
67
|
+
/**
|
|
68
|
+
* The SDK retries a call only when it's given `retryOptions`: three
|
|
69
|
+
* attempts on a transient status (408, 429, 500, 502, 503, 504), backing
|
|
70
|
+
* off from a second, with jitter, the OpenAI and Anthropic SDKs' default
|
|
71
|
+
* count. Unlike theirs, it doesn't retry a failed connection (Node's
|
|
72
|
+
* `fetch failed`).
|
|
73
|
+
*/
|
|
74
|
+
const RETRY_ATTEMPTS = 3;
|
|
75
|
+
|
|
65
76
|
/**
|
|
66
77
|
* A Gemini `ModelProvider`, on Vertex AI (`vertex`) or the Gemini
|
|
67
78
|
* Developer API (`apiKey`). Non-streaming, tool-use enabled: one
|
|
@@ -89,7 +100,10 @@ export function createGeminiProvider(options: GeminiProviderOptions): ModelProvi
|
|
|
89
100
|
);
|
|
90
101
|
}
|
|
91
102
|
if (cached?.key === key) return cached.client;
|
|
92
|
-
const client = new GoogleGenAI({
|
|
103
|
+
const client = new GoogleGenAI({
|
|
104
|
+
apiKey: key,
|
|
105
|
+
httpOptions: { fetch: attempts.fetch, retryOptions: { attempts: RETRY_ATTEMPTS } },
|
|
106
|
+
});
|
|
93
107
|
cached = { key, client };
|
|
94
108
|
return client;
|
|
95
109
|
}
|
|
@@ -100,7 +114,7 @@ export function createGeminiProvider(options: GeminiProviderOptions): ModelProvi
|
|
|
100
114
|
vertexai: true,
|
|
101
115
|
project: vertex.project,
|
|
102
116
|
location: vertex.location,
|
|
103
|
-
httpOptions: { fetch: attempts.fetch },
|
|
117
|
+
httpOptions: { fetch: attempts.fetch, retryOptions: { attempts: RETRY_ATTEMPTS } },
|
|
104
118
|
...(key !== '' && {
|
|
105
119
|
googleAuthOptions: {
|
|
106
120
|
credentials: parseServiceAccountKey(key),
|
|
@@ -125,6 +139,7 @@ export function createGeminiProvider(options: GeminiProviderOptions): ModelProvi
|
|
|
125
139
|
const startedAt = Date.now();
|
|
126
140
|
const { systemInstruction, contents } = toGeminiRequest(input.messages);
|
|
127
141
|
const maxOutputTokens = input.maxOutputTokens ?? model.maxOutputTokens;
|
|
142
|
+
const sampling = samplingFor(model, input);
|
|
128
143
|
const config: GenerateContentConfig = {
|
|
129
144
|
...(systemInstruction !== undefined && { systemInstruction }),
|
|
130
145
|
...(input.tools !== undefined &&
|
|
@@ -135,7 +150,12 @@ export function createGeminiProvider(options: GeminiProviderOptions): ModelProvi
|
|
|
135
150
|
responseMimeType: 'application/json',
|
|
136
151
|
responseJsonSchema: input.structuredOutput.schema,
|
|
137
152
|
}),
|
|
138
|
-
...(
|
|
153
|
+
...(sampling.temperature !== undefined && { temperature: sampling.temperature }),
|
|
154
|
+
...(input.thinking === 'lowest' &&
|
|
155
|
+
model.thinking !== undefined && {
|
|
156
|
+
// Gemini's thinking levels: `low`, `minimal` (3.8 Flash refuses `minimal`).
|
|
157
|
+
thinkingConfig: { thinkingLevel: model.thinking.lowest.toUpperCase() as ThinkingLevel },
|
|
158
|
+
}),
|
|
139
159
|
...(maxOutputTokens !== undefined && { maxOutputTokens }),
|
|
140
160
|
...(input.abortSignal !== undefined && { abortSignal: input.abortSignal }),
|
|
141
161
|
};
|
|
@@ -164,6 +184,7 @@ export function createGeminiProvider(options: GeminiProviderOptions): ModelProvi
|
|
|
164
184
|
// An injected client sends with its own fetch: nothing was counted.
|
|
165
185
|
...(counted.attempts > 0 && { attempts: counted.attempts }),
|
|
166
186
|
...(response.usageMetadata !== undefined && { rawUsage: { ...response.usageMetadata } }),
|
|
187
|
+
...(sampling.warnings.length > 0 && { warnings: sampling.warnings }),
|
|
167
188
|
};
|
|
168
189
|
},
|
|
169
190
|
};
|