@holokai/holo-provider-gemini 1.2.2
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/dist/gemini.auditor.d.ts +24 -0
- package/dist/gemini.auditor.d.ts.map +1 -0
- package/dist/gemini.auditor.js +117 -0
- package/dist/gemini.auditor.js.map +1 -0
- package/dist/gemini.pricing.d.ts +3 -0
- package/dist/gemini.pricing.d.ts.map +1 -0
- package/dist/gemini.pricing.js +251 -0
- package/dist/gemini.pricing.js.map +1 -0
- package/dist/gemini.provider.d.ts +18 -0
- package/dist/gemini.provider.d.ts.map +1 -0
- package/dist/gemini.provider.js +112 -0
- package/dist/gemini.provider.js.map +1 -0
- package/dist/gemini.response.factory.d.ts +42 -0
- package/dist/gemini.response.factory.d.ts.map +1 -0
- package/dist/gemini.response.factory.js +94 -0
- package/dist/gemini.response.factory.js.map +1 -0
- package/dist/gemini.translator.d.ts +28 -0
- package/dist/gemini.translator.d.ts.map +1 -0
- package/dist/gemini.translator.js +74 -0
- package/dist/gemini.translator.js.map +1 -0
- package/dist/gemini.wire.adapter.d.ts +5 -0
- package/dist/gemini.wire.adapter.d.ts.map +1 -0
- package/dist/gemini.wire.adapter.js +7 -0
- package/dist/gemini.wire.adapter.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest.d.ts +3 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +13 -0
- package/dist/manifest.js.map +1 -0
- package/dist/plugin.d.ts +46 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +104 -0
- package/dist/plugin.js.map +1 -0
- package/dist/translators/gemini.content.translator.d.ts +12 -0
- package/dist/translators/gemini.content.translator.d.ts.map +1 -0
- package/dist/translators/gemini.content.translator.js +67 -0
- package/dist/translators/gemini.content.translator.js.map +1 -0
- package/dist/translators/gemini.message.translator.d.ts +14 -0
- package/dist/translators/gemini.message.translator.d.ts.map +1 -0
- package/dist/translators/gemini.message.translator.js +115 -0
- package/dist/translators/gemini.message.translator.js.map +1 -0
- package/dist/translators/gemini.request.translator.d.ts +24 -0
- package/dist/translators/gemini.request.translator.d.ts.map +1 -0
- package/dist/translators/gemini.request.translator.js +112 -0
- package/dist/translators/gemini.request.translator.js.map +1 -0
- package/dist/translators/gemini.response.content.translator.d.ts +12 -0
- package/dist/translators/gemini.response.content.translator.d.ts.map +1 -0
- package/dist/translators/gemini.response.content.translator.js +40 -0
- package/dist/translators/gemini.response.content.translator.js.map +1 -0
- package/dist/translators/gemini.response.message.translator.d.ts +14 -0
- package/dist/translators/gemini.response.message.translator.d.ts.map +1 -0
- package/dist/translators/gemini.response.message.translator.js +90 -0
- package/dist/translators/gemini.response.message.translator.js.map +1 -0
- package/dist/translators/gemini.response.translator.d.ts +16 -0
- package/dist/translators/gemini.response.translator.d.ts.map +1 -0
- package/dist/translators/gemini.response.translator.js +70 -0
- package/dist/translators/gemini.response.translator.js.map +1 -0
- package/dist/translators/gemini.tool.translator.d.ts +19 -0
- package/dist/translators/gemini.tool.translator.d.ts.map +1 -0
- package/dist/translators/gemini.tool.translator.js +84 -0
- package/dist/translators/gemini.tool.translator.js.map +1 -0
- package/dist/translators/gemini.usage.translator.d.ts +12 -0
- package/dist/translators/gemini.usage.translator.d.ts.map +1 -0
- package/dist/translators/gemini.usage.translator.js +45 -0
- package/dist/translators/gemini.usage.translator.js.map +1 -0
- package/dist/translators/index.d.ts +10 -0
- package/dist/translators/index.d.ts.map +1 -0
- package/dist/translators/index.js +10 -0
- package/dist/translators/index.js.map +1 -0
- package/dist/translators/streaming/gemini.content.delta.translator.d.ts +12 -0
- package/dist/translators/streaming/gemini.content.delta.translator.d.ts.map +1 -0
- package/dist/translators/streaming/gemini.content.delta.translator.js +85 -0
- package/dist/translators/streaming/gemini.content.delta.translator.js.map +1 -0
- package/dist/translators/streaming/gemini.message.delta.translator.d.ts +14 -0
- package/dist/translators/streaming/gemini.message.delta.translator.d.ts.map +1 -0
- package/dist/translators/streaming/gemini.message.delta.translator.js +73 -0
- package/dist/translators/streaming/gemini.message.delta.translator.js.map +1 -0
- package/dist/translators/streaming/gemini.message.start.translator.d.ts +14 -0
- package/dist/translators/streaming/gemini.message.start.translator.d.ts.map +1 -0
- package/dist/translators/streaming/gemini.message.start.translator.js +62 -0
- package/dist/translators/streaming/gemini.message.start.translator.js.map +1 -0
- package/dist/translators/streaming/gemini.message.stop.translator.d.ts +12 -0
- package/dist/translators/streaming/gemini.message.stop.translator.d.ts.map +1 -0
- package/dist/translators/streaming/gemini.message.stop.translator.js +57 -0
- package/dist/translators/streaming/gemini.message.stop.translator.js.map +1 -0
- package/dist/translators/streaming/gemini.stream.translator.d.ts +22 -0
- package/dist/translators/streaming/gemini.stream.translator.d.ts.map +1 -0
- package/dist/translators/streaming/gemini.stream.translator.js +90 -0
- package/dist/translators/streaming/gemini.stream.translator.js.map +1 -0
- package/dist/translators/streaming/index.d.ts +6 -0
- package/dist/translators/streaming/index.d.ts.map +1 -0
- package/dist/translators/streaming/index.js +6 -0
- package/dist/translators/streaming/index.js.map +1 -0
- package/dist/utils/finish.reason.mapper.d.ts +4 -0
- package/dist/utils/finish.reason.mapper.d.ts.map +1 -0
- package/dist/utils/finish.reason.mapper.js +25 -0
- package/dist/utils/finish.reason.mapper.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { BaseAuditor } from "@holokai/sdk/provider";
|
|
2
|
+
import type { ProviderEnvelope, ProviderEvent } from "@holokai/types/provider";
|
|
3
|
+
import type { HoloWorkerRequest, WorkerResponseEnvelope } from "@holokai/types/worker";
|
|
4
|
+
import type { ProviderRequest } from "@holokai/types/entities";
|
|
5
|
+
import { LlmStatus } from "@holokai/types/entities";
|
|
6
|
+
export declare class GeminiAuditor extends BaseAuditor {
|
|
7
|
+
readonly provider = "gemini";
|
|
8
|
+
protected toHoloRequest(workerRequest: HoloWorkerRequest, llmRequest: Omit<ProviderRequest, 'id'>): void;
|
|
9
|
+
protected mapProviderPayload(workerRequest: HoloWorkerRequest, llmRequest: Omit<ProviderRequest, 'id'>): void;
|
|
10
|
+
protected mapResponseMetrics(providerEvent: Extract<ProviderEvent, {
|
|
11
|
+
type: 'done' | 'error';
|
|
12
|
+
}>, envelope: WorkerResponseEnvelope): Promise<Partial<{
|
|
13
|
+
usage_raw: any;
|
|
14
|
+
input_tokens: any;
|
|
15
|
+
output_tokens: any;
|
|
16
|
+
time_to_first_token: any;
|
|
17
|
+
total_processing_time: any;
|
|
18
|
+
}>>;
|
|
19
|
+
protected mapResponseStatus(providerEvent: ProviderEvent, envelope: WorkerResponseEnvelope): Promise<LlmStatus>;
|
|
20
|
+
protected createProviderEnvelope(payload: any): Promise<ProviderEnvelope>;
|
|
21
|
+
protected extractExtraTokens(metrics: Record<string, any>, base: Record<string, number>): Record<string, number>;
|
|
22
|
+
private extractUserPromptFromContents;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=gemini.auditor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.auditor.d.ts","sourceRoot":"","sources":["../src/gemini.auditor.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,WAAW,EAAC,MAAM,uBAAuB,CAAC;AAElD,OAAO,KAAK,EAAC,gBAAgB,EAAE,aAAa,EAAC,MAAM,yBAAyB,CAAC;AAC7E,OAAO,KAAK,EAAC,iBAAiB,EAAE,sBAAsB,EAAC,MAAM,uBAAuB,CAAC;AACrF,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAC,SAAS,EAAC,MAAM,yBAAyB,CAAC;AAElD,qBACa,aAAc,SAAQ,WAAW;IAC1C,QAAQ,CAAC,QAAQ,YAAY;IAE7B,SAAS,CAAC,aAAa,CAAC,aAAa,EAAE,iBAAiB,EAAE,UAAU,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,GAAG,IAAI;IAkBxG,SAAS,CAAC,kBAAkB,CAAC,aAAa,EAAE,iBAAiB,EAAE,UAAU,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,GAAG,IAAI;cAiB7F,kBAAkB,CAAC,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE;QAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC,EAAE,QAAQ,EAAE,sBAAsB;;;;;;;cAkBtH,iBAAiB,CAAC,aAAa,EAAE,aAAa,EAAE,QAAQ,EAAE,sBAAsB,GAAG,OAAO,CAAC,SAAS,CAAC;cAWrG,sBAAsB,CAClC,OAAO,EAAE,GAAG,GACb,OAAO,CAAC,gBAAgB,CAAC;IAgB5B,SAAS,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAUhH,OAAO,CAAC,6BAA6B;CAgBxC"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { injectable } from 'tsyringe';
|
|
8
|
+
import { BaseAuditor } from "@holokai/sdk/provider";
|
|
9
|
+
import { pickDefined } from "@holokai/sdk";
|
|
10
|
+
import { LlmStatus } from "@holokai/types/entities";
|
|
11
|
+
let GeminiAuditor = class GeminiAuditor extends BaseAuditor {
|
|
12
|
+
provider = 'gemini';
|
|
13
|
+
toHoloRequest(workerRequest, llmRequest) {
|
|
14
|
+
const payload = workerRequest.payload;
|
|
15
|
+
llmRequest.access_model = payload.model;
|
|
16
|
+
const userPrompt = this.extractUserPromptFromContents(payload.contents);
|
|
17
|
+
if (userPrompt !== undefined) {
|
|
18
|
+
llmRequest.metadata.user_prompt = userPrompt;
|
|
19
|
+
}
|
|
20
|
+
if (payload.config?.systemInstruction) {
|
|
21
|
+
const si = payload.config.systemInstruction;
|
|
22
|
+
llmRequest.metadata.system_prompt = typeof si === 'string'
|
|
23
|
+
? si
|
|
24
|
+
: JSON.stringify(si);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
mapProviderPayload(workerRequest, llmRequest) {
|
|
28
|
+
const payload = workerRequest.payload;
|
|
29
|
+
const config = payload.config;
|
|
30
|
+
const options = {};
|
|
31
|
+
if (config?.temperature !== undefined)
|
|
32
|
+
options.temperature = config.temperature;
|
|
33
|
+
if (config?.topP !== undefined)
|
|
34
|
+
options.topP = config.topP;
|
|
35
|
+
if (config?.topK !== undefined)
|
|
36
|
+
options.topK = config.topK;
|
|
37
|
+
if (config?.maxOutputTokens !== undefined)
|
|
38
|
+
options.maxOutputTokens = config.maxOutputTokens;
|
|
39
|
+
if (config?.stopSequences !== undefined)
|
|
40
|
+
options.stopSequences = config.stopSequences;
|
|
41
|
+
if (config?.responseMimeType !== undefined)
|
|
42
|
+
options.responseMimeType = config.responseMimeType;
|
|
43
|
+
if (Object.keys(options).length > 0) {
|
|
44
|
+
llmRequest.metadata.options = options;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async mapResponseMetrics(providerEvent, envelope) {
|
|
48
|
+
const metrics = await super.mapResponseMetrics(providerEvent, envelope);
|
|
49
|
+
if (providerEvent.type === 'error') {
|
|
50
|
+
return metrics;
|
|
51
|
+
}
|
|
52
|
+
const { usageMetadata } = providerEvent.message;
|
|
53
|
+
if (!usageMetadata)
|
|
54
|
+
return metrics;
|
|
55
|
+
return pickDefined({
|
|
56
|
+
...metrics,
|
|
57
|
+
usage_raw: usageMetadata,
|
|
58
|
+
input_tokens: usageMetadata.promptTokenCount,
|
|
59
|
+
output_tokens: usageMetadata.candidatesTokenCount
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
async mapResponseStatus(providerEvent, envelope) {
|
|
63
|
+
if (providerEvent.type === 'done') {
|
|
64
|
+
const candidates = providerEvent.message?.candidates;
|
|
65
|
+
if (candidates && candidates.length > 0) {
|
|
66
|
+
const finishReason = candidates[0].finishReason;
|
|
67
|
+
if (finishReason === 'MAX_TOKENS')
|
|
68
|
+
return LlmStatus.PARTIAL;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return super.mapResponseStatus(providerEvent, envelope);
|
|
72
|
+
}
|
|
73
|
+
async createProviderEnvelope(payload) {
|
|
74
|
+
const logger = this.mlog(this.createProviderEnvelope);
|
|
75
|
+
if (!payload.model) {
|
|
76
|
+
logger.error(`Missing model: ${JSON.stringify(payload)}`);
|
|
77
|
+
}
|
|
78
|
+
const systemInstruction = payload.config?.systemInstruction;
|
|
79
|
+
return pickDefined({
|
|
80
|
+
access_model: payload.model,
|
|
81
|
+
system_prompt: systemInstruction
|
|
82
|
+
? (typeof systemInstruction === 'string' ? systemInstruction : JSON.stringify(systemInstruction))
|
|
83
|
+
: undefined
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
extractExtraTokens(metrics, base) {
|
|
87
|
+
const usage = metrics.usage_raw;
|
|
88
|
+
if (!usage)
|
|
89
|
+
return base;
|
|
90
|
+
return pickDefined({
|
|
91
|
+
...base,
|
|
92
|
+
thinking: usage.thoughtsTokenCount,
|
|
93
|
+
cache_read: usage.cachedContentTokenCount,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
extractUserPromptFromContents(contents) {
|
|
97
|
+
if (!contents || !Array.isArray(contents))
|
|
98
|
+
return undefined;
|
|
99
|
+
const userMessages = contents.filter(msg => msg.role === 'user');
|
|
100
|
+
if (userMessages.length === 0)
|
|
101
|
+
return undefined;
|
|
102
|
+
const lastUserMessage = userMessages[userMessages.length - 1];
|
|
103
|
+
if (typeof lastUserMessage.parts === 'string') {
|
|
104
|
+
return lastUserMessage.parts;
|
|
105
|
+
}
|
|
106
|
+
else if (Array.isArray(lastUserMessage.parts)) {
|
|
107
|
+
const textParts = lastUserMessage.parts.filter((part) => part.text !== undefined);
|
|
108
|
+
return textParts.length > 0 ? textParts[0].text : undefined;
|
|
109
|
+
}
|
|
110
|
+
return undefined;
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
GeminiAuditor = __decorate([
|
|
114
|
+
injectable()
|
|
115
|
+
], GeminiAuditor);
|
|
116
|
+
export { GeminiAuditor };
|
|
117
|
+
//# sourceMappingURL=gemini.auditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.auditor.js","sourceRoot":"","sources":["../src/gemini.auditor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.pricing.d.ts","sourceRoot":"","sources":["../src/gemini.pricing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,uBAAuB,CAAC;AAI1D,eAAO,MAAM,sBAAsB,EAAE,cAqQpC,CAAC"}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
const M = 1_000_000;
|
|
2
|
+
export const GEMINI_PRICING_DATASET = {
|
|
3
|
+
name: 'Google Gemini',
|
|
4
|
+
version: '2026-03',
|
|
5
|
+
pricing_snapshots: [
|
|
6
|
+
// ── 2024-02: Gemini 1.0 / 1.5 Pro launch ──────────────────────
|
|
7
|
+
{
|
|
8
|
+
name: 'gemini-2024-02',
|
|
9
|
+
version: '2024-02',
|
|
10
|
+
effective_from: '2024-02-15',
|
|
11
|
+
models: [
|
|
12
|
+
{
|
|
13
|
+
model_name: 'gemini-1.5-pro',
|
|
14
|
+
input_cost: 3.50 / M,
|
|
15
|
+
output_cost: 10.50 / M,
|
|
16
|
+
context_threshold: 128_000,
|
|
17
|
+
extended_input_cost: 7.00 / M,
|
|
18
|
+
extended_output_cost: 21.00 / M,
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
model_name: 'gemini-1.0-pro',
|
|
22
|
+
input_cost: 0.50 / M,
|
|
23
|
+
output_cost: 1.50 / M,
|
|
24
|
+
},
|
|
25
|
+
],
|
|
26
|
+
},
|
|
27
|
+
// ── 2024-05: Gemini 1.5 Flash launch ──────────────────────────
|
|
28
|
+
{
|
|
29
|
+
name: 'gemini-2024-05',
|
|
30
|
+
version: '2024-05',
|
|
31
|
+
effective_from: '2024-05-24',
|
|
32
|
+
models: [
|
|
33
|
+
{
|
|
34
|
+
model_name: 'gemini-1.5-flash',
|
|
35
|
+
input_cost: 0.35 / M,
|
|
36
|
+
output_cost: 1.05 / M,
|
|
37
|
+
context_threshold: 128_000,
|
|
38
|
+
extended_input_cost: 0.70 / M,
|
|
39
|
+
extended_output_cost: 2.10 / M,
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
model_name: 'gemini-1.5-flash-8b',
|
|
43
|
+
input_cost: 0.0375 / M,
|
|
44
|
+
output_cost: 0.15 / M,
|
|
45
|
+
context_threshold: 128_000,
|
|
46
|
+
extended_input_cost: 0.075 / M,
|
|
47
|
+
extended_output_cost: 0.30 / M,
|
|
48
|
+
},
|
|
49
|
+
],
|
|
50
|
+
},
|
|
51
|
+
// ── 2024-10: Gemini 1.5 price cuts ─────────────────────────────
|
|
52
|
+
{
|
|
53
|
+
name: 'gemini-2024-10',
|
|
54
|
+
version: '2024-10',
|
|
55
|
+
effective_from: '2024-10-01',
|
|
56
|
+
models: [
|
|
57
|
+
{
|
|
58
|
+
model_name: 'gemini-1.5-pro',
|
|
59
|
+
input_cost: 1.25 / M,
|
|
60
|
+
output_cost: 5.00 / M,
|
|
61
|
+
context_threshold: 128_000,
|
|
62
|
+
extended_input_cost: 2.50 / M,
|
|
63
|
+
extended_output_cost: 10.00 / M,
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
model_name: 'gemini-1.5-flash',
|
|
67
|
+
input_cost: 0.075 / M,
|
|
68
|
+
output_cost: 0.30 / M,
|
|
69
|
+
context_threshold: 128_000,
|
|
70
|
+
extended_input_cost: 0.15 / M,
|
|
71
|
+
extended_output_cost: 0.60 / M,
|
|
72
|
+
},
|
|
73
|
+
],
|
|
74
|
+
},
|
|
75
|
+
// ── 2025-02: Gemini 2.0 Flash launch ───────────────────────────
|
|
76
|
+
{
|
|
77
|
+
name: 'gemini-2025-02',
|
|
78
|
+
version: '2025-02',
|
|
79
|
+
effective_from: '2025-02-05',
|
|
80
|
+
models: [
|
|
81
|
+
{
|
|
82
|
+
model_name: 'gemini-2.0-flash',
|
|
83
|
+
input_cost: 0.10 / M,
|
|
84
|
+
output_cost: 0.40 / M,
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
model_name: 'gemini-2.0-flash-lite',
|
|
88
|
+
input_cost: 0.08 / M,
|
|
89
|
+
output_cost: 0.30 / M,
|
|
90
|
+
},
|
|
91
|
+
],
|
|
92
|
+
},
|
|
93
|
+
// ── 2025-03: Gemini 2.5 Pro/Flash launch ───────────────────────
|
|
94
|
+
{
|
|
95
|
+
name: 'gemini-2025-03',
|
|
96
|
+
version: '2025-03',
|
|
97
|
+
effective_from: '2025-03-25',
|
|
98
|
+
models: [
|
|
99
|
+
{
|
|
100
|
+
model_name: 'gemini-2.5-pro',
|
|
101
|
+
input_cost: 1.25 / M,
|
|
102
|
+
output_cost: 10.00 / M,
|
|
103
|
+
token_costs: { thinking: 10.00 / M },
|
|
104
|
+
context_threshold: 200_000,
|
|
105
|
+
extended_input_cost: 2.50 / M,
|
|
106
|
+
extended_output_cost: 15.00 / M,
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
model_name: 'gemini-2.5-flash',
|
|
110
|
+
input_cost: 0.15 / M,
|
|
111
|
+
output_cost: 0.60 / M,
|
|
112
|
+
token_costs: { thinking: 0.60 / M },
|
|
113
|
+
},
|
|
114
|
+
],
|
|
115
|
+
},
|
|
116
|
+
// ── 2025-06: Gemini 2.5 Flash price update + Lite ──────────────
|
|
117
|
+
{
|
|
118
|
+
name: 'gemini-2025-06',
|
|
119
|
+
version: '2025-06',
|
|
120
|
+
effective_from: '2025-06-17',
|
|
121
|
+
models: [
|
|
122
|
+
{
|
|
123
|
+
model_name: 'gemini-2.5-flash',
|
|
124
|
+
input_cost: 0.30 / M,
|
|
125
|
+
output_cost: 2.50 / M,
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
model_name: 'gemini-2.5-flash-lite',
|
|
129
|
+
input_cost: 0.10 / M,
|
|
130
|
+
output_cost: 0.40 / M,
|
|
131
|
+
},
|
|
132
|
+
],
|
|
133
|
+
},
|
|
134
|
+
// ── 2026-01: Gemini 3 launch ───────────────────────────────────
|
|
135
|
+
{
|
|
136
|
+
name: 'gemini-2026-01',
|
|
137
|
+
version: '2026-01',
|
|
138
|
+
effective_from: '2026-01-15',
|
|
139
|
+
models: [
|
|
140
|
+
{
|
|
141
|
+
model_name: 'gemini-3-pro',
|
|
142
|
+
input_cost: 2.00 / M,
|
|
143
|
+
output_cost: 12.00 / M,
|
|
144
|
+
context_threshold: 200_000,
|
|
145
|
+
extended_input_cost: 4.00 / M,
|
|
146
|
+
extended_output_cost: 18.00 / M,
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
model_name: 'gemini-3-flash',
|
|
150
|
+
input_cost: 0.50 / M,
|
|
151
|
+
output_cost: 3.00 / M,
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
model_name: 'gemini-3.1-flash-lite',
|
|
155
|
+
input_cost: 0.25 / M,
|
|
156
|
+
output_cost: 1.50 / M,
|
|
157
|
+
},
|
|
158
|
+
],
|
|
159
|
+
},
|
|
160
|
+
],
|
|
161
|
+
model_ids: [
|
|
162
|
+
// ── Gemini 1.0 ─────────────────────────────────────────────────
|
|
163
|
+
{
|
|
164
|
+
model_id: 'gemini-1.0-pro-001',
|
|
165
|
+
family: 'gemini-1.0-pro',
|
|
166
|
+
kind: 'chat',
|
|
167
|
+
release_date: '2024-02-15',
|
|
168
|
+
shutdown_date: '2025-02-15',
|
|
169
|
+
pricing_snapshot: 'gemini-2024-02',
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
model_id: 'gemini-1.0-pro-002',
|
|
173
|
+
family: 'gemini-1.0-pro',
|
|
174
|
+
kind: 'chat',
|
|
175
|
+
release_date: '2024-04-09',
|
|
176
|
+
shutdown_date: '2025-02-15',
|
|
177
|
+
pricing_snapshot: 'gemini-2024-02',
|
|
178
|
+
},
|
|
179
|
+
// ── Gemini 1.5 Pro ─────────────────────────────────────────────
|
|
180
|
+
{
|
|
181
|
+
model_id: 'gemini-1.5-pro-001',
|
|
182
|
+
family: 'gemini-1.5-pro',
|
|
183
|
+
kind: 'chat',
|
|
184
|
+
release_date: '2024-02-15',
|
|
185
|
+
shutdown_date: null,
|
|
186
|
+
pricing_snapshot: 'gemini-2024-02',
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
model_id: 'gemini-1.5-pro-002',
|
|
190
|
+
family: 'gemini-1.5-pro',
|
|
191
|
+
kind: 'chat',
|
|
192
|
+
release_date: '2024-09-24',
|
|
193
|
+
shutdown_date: null,
|
|
194
|
+
pricing_snapshot: 'gemini-2024-02',
|
|
195
|
+
},
|
|
196
|
+
// ── Gemini 1.5 Flash ───────────────────────────────────────────
|
|
197
|
+
{
|
|
198
|
+
model_id: 'gemini-1.5-flash-001',
|
|
199
|
+
family: 'gemini-1.5-flash',
|
|
200
|
+
kind: 'chat',
|
|
201
|
+
release_date: '2024-05-24',
|
|
202
|
+
shutdown_date: null,
|
|
203
|
+
pricing_snapshot: 'gemini-2024-05',
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
model_id: 'gemini-1.5-flash-002',
|
|
207
|
+
family: 'gemini-1.5-flash',
|
|
208
|
+
kind: 'chat',
|
|
209
|
+
release_date: '2024-09-24',
|
|
210
|
+
shutdown_date: null,
|
|
211
|
+
pricing_snapshot: 'gemini-2024-05',
|
|
212
|
+
},
|
|
213
|
+
// ── Gemini 1.5 Flash 8B ────────────────────────────────────────
|
|
214
|
+
{
|
|
215
|
+
model_id: 'gemini-1.5-flash-8b-001',
|
|
216
|
+
family: 'gemini-1.5-flash-8b',
|
|
217
|
+
kind: 'chat',
|
|
218
|
+
release_date: '2024-10-03',
|
|
219
|
+
shutdown_date: null,
|
|
220
|
+
pricing_snapshot: 'gemini-2024-05',
|
|
221
|
+
},
|
|
222
|
+
// ── Gemini 2.0 Flash ───────────────────────────────────────────
|
|
223
|
+
{
|
|
224
|
+
model_id: 'gemini-2.0-flash-001',
|
|
225
|
+
family: 'gemini-2.0-flash',
|
|
226
|
+
kind: 'chat',
|
|
227
|
+
release_date: '2025-02-05',
|
|
228
|
+
shutdown_date: null,
|
|
229
|
+
pricing_snapshot: 'gemini-2025-02',
|
|
230
|
+
},
|
|
231
|
+
// ── Gemini 2.5 Pro ─────────────────────────────────────────────
|
|
232
|
+
{
|
|
233
|
+
model_id: 'gemini-2.5-pro-preview-05-06',
|
|
234
|
+
family: 'gemini-2.5-pro',
|
|
235
|
+
kind: 'chat',
|
|
236
|
+
release_date: '2025-05-06',
|
|
237
|
+
shutdown_date: null,
|
|
238
|
+
pricing_snapshot: 'gemini-2025-03',
|
|
239
|
+
},
|
|
240
|
+
// ── Gemini 2.5 Flash ───────────────────────────────────────────
|
|
241
|
+
{
|
|
242
|
+
model_id: 'gemini-2.5-flash-preview-04-17',
|
|
243
|
+
family: 'gemini-2.5-flash',
|
|
244
|
+
kind: 'chat',
|
|
245
|
+
release_date: '2025-04-17',
|
|
246
|
+
shutdown_date: null,
|
|
247
|
+
pricing_snapshot: 'gemini-2025-03',
|
|
248
|
+
},
|
|
249
|
+
],
|
|
250
|
+
};
|
|
251
|
+
//# sourceMappingURL=gemini.pricing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.pricing.js","sourceRoot":"","sources":["../src/gemini.pricing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { BaseProvider } from '@holokai/sdk/provider';
|
|
2
|
+
import type { IAuditor, IProviderTranslator, IResponseFactory, ProviderContext } from '@holokai/types/provider';
|
|
3
|
+
import { GoogleGenAI } from '@google/genai';
|
|
4
|
+
import { GeminiErrorResponse } from './gemini.response.factory.js';
|
|
5
|
+
export declare class GeminiProvider extends BaseProvider<GoogleGenAI, any> {
|
|
6
|
+
getModels(allowedModels: string[] | true): Promise<any>;
|
|
7
|
+
getModelNameFromRequest(payload: any): Promise<string>;
|
|
8
|
+
protected createAuditor(): IAuditor;
|
|
9
|
+
protected createClient(): GoogleGenAI;
|
|
10
|
+
protected createTranslator(): IProviderTranslator;
|
|
11
|
+
protected createResponseFactory(): IResponseFactory;
|
|
12
|
+
protected handleRequest(payload: any, ctx: ProviderContext): Promise<{
|
|
13
|
+
final: () => Promise<any>;
|
|
14
|
+
}>;
|
|
15
|
+
protected handleError(error: any): Promise<GeminiErrorResponse>;
|
|
16
|
+
private mapHttpStatusToGeminiStatus;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=gemini.provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.provider.d.ts","sourceRoot":"","sources":["../src/gemini.provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAC,QAAQ,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,eAAe,EAAC,MAAM,yBAAyB,CAAC;AAC9G,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAC;AAG1C,OAAO,EAAC,mBAAmB,EAA2C,MAAM,8BAA8B,CAAC;AAG3G,qBAAa,cAAe,SAAQ,YAAY,CAAC,WAAW,EAAE,GAAG,CAAC;IAExD,SAAS,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC;IAevD,uBAAuB,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;IAI5D,SAAS,CAAC,aAAa,IAAI,QAAQ;IAInC,SAAS,CAAC,YAAY,IAAI,WAAW;IAIrC,SAAS,CAAC,gBAAgB,IAAI,mBAAmB;IAIjD,SAAS,CAAC,qBAAqB,IAAI,gBAAgB;cAInC,aAAa,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,eAAe;;;cAsDhD,WAAW,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAarE,OAAO,CAAC,2BAA2B;CAkBtC"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { BaseProvider } from '@holokai/sdk/provider';
|
|
2
|
+
import { GoogleGenAI } from '@google/genai';
|
|
3
|
+
import { GeminiAuditor } from './gemini.auditor.js';
|
|
4
|
+
import { GeminiTranslator } from './gemini.translator.js';
|
|
5
|
+
import { GeminiResponseFactory } from './gemini.response.factory.js';
|
|
6
|
+
import { GeminiProtocols } from './plugin.js';
|
|
7
|
+
export class GeminiProvider extends BaseProvider {
|
|
8
|
+
async getModels(allowedModels) {
|
|
9
|
+
const url = `https://generativelanguage.googleapis.com/v1beta/models?key=${this._config.apiKey}`;
|
|
10
|
+
const res = await fetch(url);
|
|
11
|
+
const data = await res.json();
|
|
12
|
+
const response = data.models ?? [];
|
|
13
|
+
if (allowedModels === true) {
|
|
14
|
+
return response;
|
|
15
|
+
}
|
|
16
|
+
return response.filter(model => allowedModels.includes(model.name?.replace('models/', '') ?? ''));
|
|
17
|
+
}
|
|
18
|
+
async getModelNameFromRequest(payload) {
|
|
19
|
+
return payload.model;
|
|
20
|
+
}
|
|
21
|
+
createAuditor() {
|
|
22
|
+
return new GeminiAuditor();
|
|
23
|
+
}
|
|
24
|
+
createClient() {
|
|
25
|
+
return new GoogleGenAI({ apiKey: this._config.apiKey });
|
|
26
|
+
}
|
|
27
|
+
createTranslator() {
|
|
28
|
+
return GeminiTranslator.instance();
|
|
29
|
+
}
|
|
30
|
+
createResponseFactory() {
|
|
31
|
+
return GeminiResponseFactory.instance();
|
|
32
|
+
}
|
|
33
|
+
async handleRequest(payload, ctx) {
|
|
34
|
+
switch (ctx.protocol.name) {
|
|
35
|
+
case GeminiProtocols.EMBED_CONTENT: {
|
|
36
|
+
return {
|
|
37
|
+
final: () => this.client.models.embedContent({
|
|
38
|
+
model: payload.model,
|
|
39
|
+
contents: payload.contents
|
|
40
|
+
})
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
case GeminiProtocols.STREAM_GENERATE_CONTENT:
|
|
44
|
+
default: {
|
|
45
|
+
const { model, contents, config } = payload;
|
|
46
|
+
const isStreaming = ctx.query?.alt === 'sse' || payload.stream === true;
|
|
47
|
+
if (isStreaming) {
|
|
48
|
+
return {
|
|
49
|
+
final: async () => {
|
|
50
|
+
const stream = await this.client.models.generateContentStream({
|
|
51
|
+
model,
|
|
52
|
+
contents,
|
|
53
|
+
config
|
|
54
|
+
});
|
|
55
|
+
let finalResponse;
|
|
56
|
+
for await (const chunk of stream) {
|
|
57
|
+
if (chunk.candidates?.[0]?.finishReason) {
|
|
58
|
+
finalResponse = chunk;
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
ctx.emitStreamEvent(chunk);
|
|
62
|
+
const text = chunk.candidates?.[0]?.content?.parts?.[0]?.text;
|
|
63
|
+
if (text) {
|
|
64
|
+
ctx.emitTextDelta(text);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return finalResponse;
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
final: () => this.client.models.generateContent({
|
|
73
|
+
model,
|
|
74
|
+
contents,
|
|
75
|
+
config
|
|
76
|
+
})
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async handleError(error) {
|
|
82
|
+
if (error.status && error.statusText) {
|
|
83
|
+
return {
|
|
84
|
+
error: {
|
|
85
|
+
code: error.status,
|
|
86
|
+
message: error.message || error.statusText,
|
|
87
|
+
status: this.mapHttpStatusToGeminiStatus(error.status)
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
return this.responseFactory.createError(error.message, 'api_error');
|
|
92
|
+
}
|
|
93
|
+
mapHttpStatusToGeminiStatus(status) {
|
|
94
|
+
switch (status) {
|
|
95
|
+
case 400:
|
|
96
|
+
return 'INVALID_ARGUMENT';
|
|
97
|
+
case 401:
|
|
98
|
+
return 'UNAUTHENTICATED';
|
|
99
|
+
case 403:
|
|
100
|
+
return 'PERMISSION_DENIED';
|
|
101
|
+
case 404:
|
|
102
|
+
return 'NOT_FOUND';
|
|
103
|
+
case 429:
|
|
104
|
+
return 'RESOURCE_EXHAUSTED';
|
|
105
|
+
case 503:
|
|
106
|
+
return 'UNAVAILABLE';
|
|
107
|
+
default:
|
|
108
|
+
return 'INTERNAL';
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=gemini.provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.provider.js","sourceRoot":"","sources":["../src/gemini.provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { IResponseFactory } from '@holokai/types/provider';
|
|
2
|
+
import type { HoloErrorCode } from '@holokai/types/holo';
|
|
3
|
+
export type GeminiErrorStatus = 'INVALID_ARGUMENT' | 'NOT_FOUND' | 'PERMISSION_DENIED' | 'RESOURCE_EXHAUSTED' | 'UNAUTHENTICATED' | 'INTERNAL' | 'UNAVAILABLE';
|
|
4
|
+
export interface GeminiErrorResponse {
|
|
5
|
+
error: {
|
|
6
|
+
code: number;
|
|
7
|
+
message: string;
|
|
8
|
+
status: GeminiErrorStatus;
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export interface GeminiCandidate {
|
|
12
|
+
content: {
|
|
13
|
+
parts: Array<{
|
|
14
|
+
text: string;
|
|
15
|
+
}>;
|
|
16
|
+
role: string;
|
|
17
|
+
};
|
|
18
|
+
finishReason?: string;
|
|
19
|
+
index: number;
|
|
20
|
+
}
|
|
21
|
+
export interface GeminiUsageMetadata {
|
|
22
|
+
promptTokenCount: number;
|
|
23
|
+
candidatesTokenCount: number;
|
|
24
|
+
totalTokenCount: number;
|
|
25
|
+
}
|
|
26
|
+
export interface GenerateContentResponse {
|
|
27
|
+
candidates: GeminiCandidate[];
|
|
28
|
+
usageMetadata: GeminiUsageMetadata;
|
|
29
|
+
modelVersion?: string;
|
|
30
|
+
}
|
|
31
|
+
export declare class GeminiResponseFactory implements IResponseFactory {
|
|
32
|
+
static streamResponseMessage(text?: string | string[]): Partial<GenerateContentResponse>[];
|
|
33
|
+
static createResponseMessage(text?: string | string[]): Partial<GenerateContentResponse>;
|
|
34
|
+
static createStreamChunk(text: string): Partial<GenerateContentResponse>;
|
|
35
|
+
static createFinalChunk(): Partial<GenerateContentResponse>;
|
|
36
|
+
static createUsageMetadata(): GeminiUsageMetadata;
|
|
37
|
+
static instance(): GeminiResponseFactory;
|
|
38
|
+
mapHoloCode(code: HoloErrorCode): GeminiErrorStatus;
|
|
39
|
+
createError(message: string, code: HoloErrorCode): GeminiErrorResponse;
|
|
40
|
+
private statusToHttpCode;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=gemini.response.factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.response.factory.d.ts","sourceRoot":"","sources":["../src/gemini.response.factory.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,qBAAqB,CAAC;AAEvD,MAAM,MAAM,iBAAiB,GACzB,kBAAkB,GAChB,WAAW,GACX,mBAAmB,GACnB,oBAAoB,GACpB,iBAAiB,GACjB,UAAU,GACV,aAAa,CAAC;AAEpB,MAAM,WAAW,mBAAmB;IAChC,KAAK,EAAE;QACH,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,iBAAiB,CAAC;KAC7B,CAAC;CACL;AAED,MAAM,WAAW,eAAe;IAC5B,OAAO,EAAE;QACL,KAAK,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAC/B,IAAI,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAChC,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,eAAe,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,uBAAuB;IACpC,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,aAAa,EAAE,mBAAmB,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,qBAAsB,YAAW,gBAAgB;IAE1D,MAAM,CAAC,qBAAqB,CAAC,IAAI,GAAE,MAAM,GAAG,MAAM,EAAO;IAgBzD,MAAM,CAAC,qBAAqB,CAAC,IAAI,GAAE,MAAM,GAAG,MAAM,EAAO,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAkB5F,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAYxE,MAAM,CAAC,gBAAgB,IAAI,OAAO,CAAC,uBAAuB,CAAC;IAc3D,MAAM,CAAC,mBAAmB,IAAI,mBAAmB;IAQjD,MAAM,CAAC,QAAQ,IAAI,qBAAqB;IAIxC,WAAW,CAAC,IAAI,EAAE,aAAa,GAAG,iBAAiB;IAOnD,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,mBAAmB;IAWtE,OAAO,CAAC,gBAAgB;CAW3B"}
|