@vybestack/llxprt-code-core 0.1.23 → 0.2.2-nightly.250908.fb8099b7
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 +21 -17
- package/dist/src/adapters/IStreamAdapter.d.ts +3 -3
- package/dist/src/auth/oauth-errors.d.ts +173 -0
- package/dist/src/auth/oauth-errors.js +461 -0
- package/dist/src/auth/oauth-errors.js.map +1 -0
- package/dist/src/auth/precedence.d.ts +1 -5
- package/dist/src/auth/precedence.js +28 -48
- package/dist/src/auth/precedence.js.map +1 -1
- package/dist/src/auth/token-store.js +2 -2
- package/dist/src/auth/token-store.js.map +1 -1
- package/dist/src/auth/types.d.ts +4 -4
- package/dist/src/code_assist/codeAssist.js +19 -6
- package/dist/src/code_assist/codeAssist.js.map +1 -1
- package/dist/src/code_assist/oauth2.d.ts +7 -0
- package/dist/src/code_assist/oauth2.js +82 -32
- package/dist/src/code_assist/oauth2.js.map +1 -1
- package/dist/src/code_assist/server.js +15 -4
- package/dist/src/code_assist/server.js.map +1 -1
- package/dist/src/code_assist/setup.js +9 -0
- package/dist/src/code_assist/setup.js.map +1 -1
- package/dist/src/config/index.d.ts +7 -0
- package/dist/src/config/index.js +8 -0
- package/dist/src/config/index.js.map +1 -0
- package/dist/src/core/client.d.ts +15 -20
- package/dist/src/core/client.js +98 -124
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/compression-config.d.ts +10 -0
- package/dist/src/core/compression-config.js +17 -0
- package/dist/src/core/compression-config.js.map +1 -0
- package/dist/src/core/coreToolScheduler.js +50 -15
- package/dist/src/core/coreToolScheduler.js.map +1 -1
- package/dist/src/core/geminiChat.d.ts +68 -9
- package/dist/src/core/geminiChat.js +940 -405
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/nonInteractiveToolExecutor.js +70 -19
- package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -1
- package/dist/src/core/prompts.js +35 -25
- package/dist/src/core/prompts.js.map +1 -1
- package/dist/src/core/turn.d.ts +1 -0
- package/dist/src/core/turn.js +8 -6
- package/dist/src/core/turn.js.map +1 -1
- package/dist/src/ide/ide-client.d.ts +1 -1
- package/dist/src/ide/ide-client.js +12 -6
- package/dist/src/ide/ide-client.js.map +1 -1
- package/dist/src/index.d.ts +4 -2
- package/dist/src/index.js +5 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/prompt-config/TemplateEngine.js +17 -0
- package/dist/src/prompt-config/TemplateEngine.js.map +1 -1
- package/dist/src/prompt-config/defaults/core-defaults.js +39 -32
- package/dist/src/prompt-config/defaults/core-defaults.js.map +1 -1
- package/dist/src/prompt-config/defaults/core.md +2 -0
- package/dist/src/prompt-config/defaults/provider-defaults.js +34 -27
- package/dist/src/prompt-config/defaults/provider-defaults.js.map +1 -1
- package/dist/src/prompt-config/defaults/providers/gemini/core.md +270 -0
- package/dist/src/prompt-config/defaults/providers/gemini/models/gemini-2.5-flash/core.md +12 -0
- package/dist/src/prompt-config/defaults/providers/gemini/models/gemini-2.5-flash/gemini-2-5-flash/core.md +12 -0
- package/dist/src/prompt-config/types.d.ts +2 -0
- package/dist/src/providers/BaseProvider.d.ts +39 -13
- package/dist/src/providers/BaseProvider.js +102 -28
- package/dist/src/providers/BaseProvider.js.map +1 -1
- package/dist/src/providers/IProvider.d.ts +17 -3
- package/dist/src/providers/LoggingProviderWrapper.d.ts +10 -3
- package/dist/src/providers/LoggingProviderWrapper.js +33 -27
- package/dist/src/providers/LoggingProviderWrapper.js.map +1 -1
- package/dist/src/providers/ProviderContentGenerator.d.ts +2 -2
- package/dist/src/providers/ProviderContentGenerator.js +9 -6
- package/dist/src/providers/ProviderContentGenerator.js.map +1 -1
- package/dist/src/providers/ProviderManager.d.ts +4 -0
- package/dist/src/providers/ProviderManager.js +6 -0
- package/dist/src/providers/ProviderManager.js.map +1 -1
- package/dist/src/providers/anthropic/AnthropicProvider.d.ts +34 -21
- package/dist/src/providers/anthropic/AnthropicProvider.js +505 -492
- package/dist/src/providers/anthropic/AnthropicProvider.js.map +1 -1
- package/dist/src/providers/gemini/GeminiProvider.d.ts +23 -9
- package/dist/src/providers/gemini/GeminiProvider.js +344 -515
- package/dist/src/providers/gemini/GeminiProvider.js.map +1 -1
- package/dist/src/providers/openai/ConversationCache.d.ts +3 -3
- package/dist/src/providers/openai/IChatGenerateParams.d.ts +9 -4
- package/dist/src/providers/openai/OpenAIProvider.d.ts +46 -96
- package/dist/src/providers/openai/OpenAIProvider.js +532 -1393
- package/dist/src/providers/openai/OpenAIProvider.js.map +1 -1
- package/dist/src/providers/openai/buildResponsesRequest.d.ts +3 -3
- package/dist/src/providers/openai/buildResponsesRequest.js +67 -37
- package/dist/src/providers/openai/buildResponsesRequest.js.map +1 -1
- package/dist/src/providers/openai/estimateRemoteTokens.d.ts +2 -2
- package/dist/src/providers/openai/estimateRemoteTokens.js +21 -8
- package/dist/src/providers/openai/estimateRemoteTokens.js.map +1 -1
- package/dist/src/providers/openai/parseResponsesStream.d.ts +6 -2
- package/dist/src/providers/openai/parseResponsesStream.js +99 -391
- package/dist/src/providers/openai/parseResponsesStream.js.map +1 -1
- package/dist/src/providers/openai/syntheticToolResponses.d.ts +5 -5
- package/dist/src/providers/openai/syntheticToolResponses.js +102 -91
- package/dist/src/providers/openai/syntheticToolResponses.js.map +1 -1
- package/dist/src/providers/openai-responses/OpenAIResponsesProvider.d.ts +89 -0
- package/dist/src/providers/openai-responses/OpenAIResponsesProvider.js +451 -0
- package/dist/src/providers/openai-responses/OpenAIResponsesProvider.js.map +1 -0
- package/dist/src/providers/openai-responses/index.d.ts +1 -0
- package/dist/src/providers/openai-responses/index.js +2 -0
- package/dist/src/providers/openai-responses/index.js.map +1 -0
- package/dist/src/providers/tokenizers/OpenAITokenizer.js +3 -3
- package/dist/src/providers/tokenizers/OpenAITokenizer.js.map +1 -1
- package/dist/src/providers/types.d.ts +1 -1
- package/dist/src/services/ClipboardService.d.ts +19 -0
- package/dist/src/services/ClipboardService.js +66 -0
- package/dist/src/services/ClipboardService.js.map +1 -0
- package/dist/src/services/history/ContentConverters.d.ts +43 -0
- package/dist/src/services/history/ContentConverters.js +325 -0
- package/dist/src/services/history/ContentConverters.js.map +1 -0
- package/dist/src/{providers/IMessage.d.ts → services/history/HistoryEvents.d.ts} +16 -22
- package/dist/src/{providers/IMessage.js → services/history/HistoryEvents.js} +1 -1
- package/dist/src/services/history/HistoryEvents.js.map +1 -0
- package/dist/src/services/history/HistoryService.d.ts +220 -0
- package/dist/src/services/history/HistoryService.js +673 -0
- package/dist/src/services/history/HistoryService.js.map +1 -0
- package/dist/src/services/history/IContent.d.ts +183 -0
- package/dist/src/services/history/IContent.js +104 -0
- package/dist/src/services/history/IContent.js.map +1 -0
- package/dist/src/services/index.d.ts +1 -0
- package/dist/src/services/index.js +1 -0
- package/dist/src/services/index.js.map +1 -1
- package/dist/src/telemetry/types.d.ts +16 -4
- package/dist/src/telemetry/types.js.map +1 -1
- package/dist/src/tools/IToolFormatter.d.ts +2 -2
- package/dist/src/tools/ToolFormatter.d.ts +42 -4
- package/dist/src/tools/ToolFormatter.js +159 -37
- package/dist/src/tools/ToolFormatter.js.map +1 -1
- package/dist/src/tools/doubleEscapeUtils.d.ts +57 -0
- package/dist/src/tools/doubleEscapeUtils.js +241 -0
- package/dist/src/tools/doubleEscapeUtils.js.map +1 -0
- package/dist/src/tools/read-file.d.ts +6 -1
- package/dist/src/tools/read-file.js +25 -11
- package/dist/src/tools/read-file.js.map +1 -1
- package/dist/src/tools/todo-schemas.d.ts +4 -4
- package/dist/src/tools/tools.js +13 -0
- package/dist/src/tools/tools.js.map +1 -1
- package/dist/src/tools/write-file.d.ts +6 -1
- package/dist/src/tools/write-file.js +48 -26
- package/dist/src/tools/write-file.js.map +1 -1
- package/dist/src/types/modelParams.d.ts +8 -0
- package/dist/src/utils/bfsFileSearch.js +2 -6
- package/dist/src/utils/bfsFileSearch.js.map +1 -1
- package/dist/src/utils/schemaValidator.js +16 -1
- package/dist/src/utils/schemaValidator.js.map +1 -1
- package/package.json +8 -7
- package/dist/src/providers/IMessage.js.map +0 -1
- package/dist/src/providers/adapters/GeminiCompatibleWrapper.d.ts +0 -69
- package/dist/src/providers/adapters/GeminiCompatibleWrapper.js +0 -577
- package/dist/src/providers/adapters/GeminiCompatibleWrapper.js.map +0 -1
@@ -1,69 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* @license
|
3
|
-
* Copyright 2025 Vybestack LLC
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
5
|
-
*/
|
6
|
-
import type { IProvider as Provider } from '../IProvider.js';
|
7
|
-
import type { IMessage as ProviderMessage } from '../IMessage.js';
|
8
|
-
import { GenerateContentResponse, GenerateContentConfig, ContentListUnion } from '@google/genai';
|
9
|
-
import { ServerGeminiStreamEvent } from '../../core/turn.js';
|
10
|
-
/**
|
11
|
-
* Wrapper that makes any IProvider compatible with Gemini's ContentGenerator interface
|
12
|
-
*/
|
13
|
-
export declare class GeminiCompatibleWrapper {
|
14
|
-
private readonly provider;
|
15
|
-
constructor(provider: Provider);
|
16
|
-
/**
|
17
|
-
* Converts Gemini schema format to standard JSON Schema format
|
18
|
-
* Handles uppercase type enums and string numeric values
|
19
|
-
*/
|
20
|
-
private convertGeminiSchemaToStandard;
|
21
|
-
/**
|
22
|
-
* Convert Gemini tools format to provider tools format
|
23
|
-
*/
|
24
|
-
private convertGeminiToolsToProviderTools;
|
25
|
-
/**
|
26
|
-
* Generate content using the wrapped provider (non-streaming)
|
27
|
-
* @param params Parameters for content generation
|
28
|
-
* @returns A promise resolving to a Gemini-formatted response
|
29
|
-
*/
|
30
|
-
generateContent(params: {
|
31
|
-
model: string;
|
32
|
-
contents: ContentListUnion;
|
33
|
-
config?: GenerateContentConfig;
|
34
|
-
}): Promise<GenerateContentResponse>;
|
35
|
-
/**
|
36
|
-
* Generate content using the wrapped provider (streaming)
|
37
|
-
* @param params Parameters for content generation
|
38
|
-
* @returns An async generator yielding Gemini-formatted responses
|
39
|
-
*/
|
40
|
-
generateContentStream(params: {
|
41
|
-
model: string;
|
42
|
-
contents: ContentListUnion;
|
43
|
-
config?: GenerateContentConfig;
|
44
|
-
}): AsyncGenerator<GenerateContentResponse>;
|
45
|
-
/**
|
46
|
-
* Adapts a provider's stream to Gemini event format
|
47
|
-
* @param providerStream The provider-specific stream
|
48
|
-
* @returns An async iterator of Gemini events
|
49
|
-
*/
|
50
|
-
adaptStream(providerStream: AsyncIterableIterator<ProviderMessage>): AsyncIterableIterator<ServerGeminiStreamEvent>;
|
51
|
-
/**
|
52
|
-
* Adapts the provider's stream format to Gemini's expected format
|
53
|
-
* @param providerStream Stream from the provider
|
54
|
-
* @returns Async iterator of Gemini events
|
55
|
-
*/
|
56
|
-
private adaptProviderStream;
|
57
|
-
/**
|
58
|
-
* Convert Gemini ContentListUnion to provider ProviderMessage array
|
59
|
-
*/
|
60
|
-
private convertContentsToMessages;
|
61
|
-
/**
|
62
|
-
* Convert provider messages to a single Gemini response
|
63
|
-
*/
|
64
|
-
private convertMessagesToResponse;
|
65
|
-
/**
|
66
|
-
* Convert a single provider message to a streaming Gemini response
|
67
|
-
*/
|
68
|
-
private convertMessageToStreamResponse;
|
69
|
-
}
|
@@ -1,577 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* @license
|
3
|
-
* Copyright 2025 Vybestack LLC
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
5
|
-
*/
|
6
|
-
import { ContentGeneratorRole } from '../ContentGeneratorRole.js';
|
7
|
-
import { GeminiEventType, } from '../../core/turn.js';
|
8
|
-
/**
|
9
|
-
* Wrapper that makes any IProvider compatible with Gemini's ContentGenerator interface
|
10
|
-
*/
|
11
|
-
export class GeminiCompatibleWrapper {
|
12
|
-
provider;
|
13
|
-
constructor(provider) {
|
14
|
-
this.provider = provider;
|
15
|
-
}
|
16
|
-
/**
|
17
|
-
* Converts Gemini schema format to standard JSON Schema format
|
18
|
-
* Handles uppercase type enums and string numeric values
|
19
|
-
*/
|
20
|
-
convertGeminiSchemaToStandard(schema) {
|
21
|
-
if (!schema || typeof schema !== 'object') {
|
22
|
-
return schema;
|
23
|
-
}
|
24
|
-
const newSchema = { ...schema };
|
25
|
-
// Handle schema composition keywords
|
26
|
-
if (newSchema.anyOf && Array.isArray(newSchema.anyOf)) {
|
27
|
-
newSchema.anyOf = newSchema.anyOf.map((v) => this.convertGeminiSchemaToStandard(v));
|
28
|
-
}
|
29
|
-
if (newSchema.allOf && Array.isArray(newSchema.allOf)) {
|
30
|
-
newSchema.allOf = newSchema.allOf.map((v) => this.convertGeminiSchemaToStandard(v));
|
31
|
-
}
|
32
|
-
if (newSchema.oneOf && Array.isArray(newSchema.oneOf)) {
|
33
|
-
newSchema.oneOf = newSchema.oneOf.map((v) => this.convertGeminiSchemaToStandard(v));
|
34
|
-
}
|
35
|
-
// Handle items (can be a schema or array of schemas for tuples)
|
36
|
-
if (newSchema.items) {
|
37
|
-
if (Array.isArray(newSchema.items)) {
|
38
|
-
newSchema.items = newSchema.items.map((item) => this.convertGeminiSchemaToStandard(item));
|
39
|
-
}
|
40
|
-
else {
|
41
|
-
newSchema.items = this.convertGeminiSchemaToStandard(newSchema.items);
|
42
|
-
}
|
43
|
-
}
|
44
|
-
// Handle properties
|
45
|
-
if (newSchema.properties && typeof newSchema.properties === 'object') {
|
46
|
-
const newProperties = {};
|
47
|
-
for (const [key, value] of Object.entries(newSchema.properties)) {
|
48
|
-
newProperties[key] = this.convertGeminiSchemaToStandard(value);
|
49
|
-
}
|
50
|
-
newSchema.properties = newProperties;
|
51
|
-
}
|
52
|
-
// Handle additionalProperties if it's a schema
|
53
|
-
if (newSchema.additionalProperties &&
|
54
|
-
typeof newSchema.additionalProperties === 'object') {
|
55
|
-
newSchema.additionalProperties = this.convertGeminiSchemaToStandard(newSchema.additionalProperties);
|
56
|
-
}
|
57
|
-
// Handle patternProperties
|
58
|
-
if (newSchema.patternProperties &&
|
59
|
-
typeof newSchema.patternProperties === 'object') {
|
60
|
-
const newPatternProperties = {};
|
61
|
-
for (const [key, value] of Object.entries(newSchema.patternProperties)) {
|
62
|
-
newPatternProperties[key] = this.convertGeminiSchemaToStandard(value);
|
63
|
-
}
|
64
|
-
newSchema.patternProperties = newPatternProperties;
|
65
|
-
}
|
66
|
-
// Handle dependencies (can be array of property names or schema)
|
67
|
-
if (newSchema.dependencies && typeof newSchema.dependencies === 'object') {
|
68
|
-
const newDependencies = {};
|
69
|
-
for (const [key, value] of Object.entries(newSchema.dependencies)) {
|
70
|
-
if (Array.isArray(value)) {
|
71
|
-
// Property dependencies (array of property names)
|
72
|
-
newDependencies[key] = value;
|
73
|
-
}
|
74
|
-
else {
|
75
|
-
// Schema dependencies
|
76
|
-
newDependencies[key] = this.convertGeminiSchemaToStandard(value);
|
77
|
-
}
|
78
|
-
}
|
79
|
-
newSchema.dependencies = newDependencies;
|
80
|
-
}
|
81
|
-
// Handle if/then/else
|
82
|
-
if (newSchema.if) {
|
83
|
-
newSchema.if = this.convertGeminiSchemaToStandard(newSchema.if);
|
84
|
-
}
|
85
|
-
if (newSchema.then) {
|
86
|
-
newSchema.then = this.convertGeminiSchemaToStandard(newSchema.then);
|
87
|
-
}
|
88
|
-
if (newSchema.else) {
|
89
|
-
newSchema.else = this.convertGeminiSchemaToStandard(newSchema.else);
|
90
|
-
}
|
91
|
-
// Handle not
|
92
|
-
if (newSchema.not) {
|
93
|
-
newSchema.not = this.convertGeminiSchemaToStandard(newSchema.not);
|
94
|
-
}
|
95
|
-
// Convert type from UPPERCASE enum to lowercase string
|
96
|
-
if (newSchema.type) {
|
97
|
-
newSchema.type = String(newSchema.type).toLowerCase();
|
98
|
-
}
|
99
|
-
// Convert all numeric properties from strings to numbers
|
100
|
-
const numericProperties = [
|
101
|
-
'minItems',
|
102
|
-
'maxItems',
|
103
|
-
'minLength',
|
104
|
-
'maxLength',
|
105
|
-
'minimum',
|
106
|
-
'maximum',
|
107
|
-
'minProperties',
|
108
|
-
'maxProperties',
|
109
|
-
'multipleOf',
|
110
|
-
];
|
111
|
-
for (const prop of numericProperties) {
|
112
|
-
if (newSchema[prop] !== undefined) {
|
113
|
-
newSchema[prop] = Number(newSchema[prop]);
|
114
|
-
}
|
115
|
-
}
|
116
|
-
return newSchema;
|
117
|
-
}
|
118
|
-
/**
|
119
|
-
* Convert Gemini tools format to provider tools format
|
120
|
-
*/
|
121
|
-
convertGeminiToolsToProviderTools(geminiTools) {
|
122
|
-
const providerTools = [];
|
123
|
-
for (const tool of geminiTools) {
|
124
|
-
if (tool.functionDeclarations) {
|
125
|
-
// Gemini format has functionDeclarations array
|
126
|
-
for (const func of tool.functionDeclarations) {
|
127
|
-
providerTools.push({
|
128
|
-
type: 'function',
|
129
|
-
function: {
|
130
|
-
name: func.name,
|
131
|
-
description: func.description || '',
|
132
|
-
parameters: this.convertGeminiSchemaToStandard(func.parameters) ?? {
|
133
|
-
type: 'object',
|
134
|
-
properties: {},
|
135
|
-
required: [],
|
136
|
-
},
|
137
|
-
},
|
138
|
-
});
|
139
|
-
}
|
140
|
-
}
|
141
|
-
}
|
142
|
-
return providerTools;
|
143
|
-
}
|
144
|
-
/**
|
145
|
-
* Generate content using the wrapped provider (non-streaming)
|
146
|
-
* @param params Parameters for content generation
|
147
|
-
* @returns A promise resolving to a Gemini-formatted response
|
148
|
-
*/
|
149
|
-
async generateContent(params) {
|
150
|
-
// Convert Gemini contents to provider messages
|
151
|
-
const messages = this.convertContentsToMessages(params.contents);
|
152
|
-
// Collect full response from provider stream
|
153
|
-
const responseMessages = [];
|
154
|
-
const stream = this.provider.generateChatCompletion(messages);
|
155
|
-
for await (const chunk of stream) {
|
156
|
-
responseMessages.push(chunk);
|
157
|
-
}
|
158
|
-
// Convert provider response to Gemini format
|
159
|
-
return this.convertMessagesToResponse(responseMessages);
|
160
|
-
}
|
161
|
-
/**
|
162
|
-
* Generate content using the wrapped provider (streaming)
|
163
|
-
* @param params Parameters for content generation
|
164
|
-
* @returns An async generator yielding Gemini-formatted responses
|
165
|
-
*/
|
166
|
-
async *generateContentStream(params) {
|
167
|
-
// Convert Gemini contents to provider messages
|
168
|
-
let messages = this.convertContentsToMessages(params.contents);
|
169
|
-
// Add system instruction if provided
|
170
|
-
if (params.config?.systemInstruction) {
|
171
|
-
let systemContent;
|
172
|
-
// Handle different systemInstruction formats
|
173
|
-
if (typeof params.config.systemInstruction === 'string') {
|
174
|
-
systemContent = params.config.systemInstruction;
|
175
|
-
}
|
176
|
-
else {
|
177
|
-
// It's a ContentUnion - convert to string
|
178
|
-
const systemMessages = this.convertContentsToMessages(params.config.systemInstruction);
|
179
|
-
systemContent = systemMessages.map((m) => m.content).join('\n');
|
180
|
-
}
|
181
|
-
messages = [
|
182
|
-
{
|
183
|
-
role: 'system',
|
184
|
-
content: systemContent,
|
185
|
-
},
|
186
|
-
...messages,
|
187
|
-
];
|
188
|
-
}
|
189
|
-
// Extract and convert tools from config if available
|
190
|
-
let providerTools;
|
191
|
-
const geminiTools = params.config?.tools;
|
192
|
-
if (geminiTools && Array.isArray(geminiTools)) {
|
193
|
-
providerTools = this.convertGeminiToolsToProviderTools(geminiTools);
|
194
|
-
}
|
195
|
-
// Stream from provider and convert each chunk
|
196
|
-
const stream = this.provider.generateChatCompletion(messages, providerTools);
|
197
|
-
// Collect all chunks to batch telemetry events
|
198
|
-
const collectedChunks = [];
|
199
|
-
let hasUsageMetadata = false;
|
200
|
-
for await (const chunk of stream) {
|
201
|
-
const response = this.convertMessageToStreamResponse(chunk);
|
202
|
-
collectedChunks.push(response);
|
203
|
-
// Check if this chunk has usage metadata
|
204
|
-
if (chunk.usage) {
|
205
|
-
hasUsageMetadata = true;
|
206
|
-
}
|
207
|
-
// Yield the response chunk immediately for UI updates
|
208
|
-
yield response;
|
209
|
-
}
|
210
|
-
// After streaming is complete, yield a final response with usage metadata if we collected any
|
211
|
-
// This mimics how geminiChat.ts logs telemetry after collecting all chunks
|
212
|
-
if (hasUsageMetadata && collectedChunks.length > 0) {
|
213
|
-
// Find the last chunk with usage metadata
|
214
|
-
const lastChunkWithUsage = [...collectedChunks].reverse().find((chunk) =>
|
215
|
-
// Check if any message in the chunk had usage data
|
216
|
-
chunk.candidates?.some((candidate) => candidate.content?.parts?.some((part) => 'usage' in part)));
|
217
|
-
// The telemetry will be logged by the consuming code when it sees the usage metadata
|
218
|
-
if (lastChunkWithUsage) {
|
219
|
-
// Usage data is included in the stream for telemetry purposes
|
220
|
-
void lastChunkWithUsage; // Mark as intentionally unused
|
221
|
-
}
|
222
|
-
}
|
223
|
-
}
|
224
|
-
/**
|
225
|
-
* Adapts a provider's stream to Gemini event format
|
226
|
-
* @param providerStream The provider-specific stream
|
227
|
-
* @returns An async iterator of Gemini events
|
228
|
-
*/
|
229
|
-
async *adaptStream(providerStream) {
|
230
|
-
yield* this.adaptProviderStream(providerStream);
|
231
|
-
}
|
232
|
-
/**
|
233
|
-
* Adapts the provider's stream format to Gemini's expected format
|
234
|
-
* @param providerStream Stream from the provider
|
235
|
-
* @returns Async iterator of Gemini events
|
236
|
-
*/
|
237
|
-
async *adaptProviderStream(providerStream) {
|
238
|
-
for await (const message of providerStream) {
|
239
|
-
// Emit content event if message has non-empty content
|
240
|
-
if (message.content && message.content.length > 0) {
|
241
|
-
const contentValue = typeof message.content === 'string'
|
242
|
-
? message.content
|
243
|
-
: String(message.content);
|
244
|
-
const contentEvent = {
|
245
|
-
type: GeminiEventType.Content,
|
246
|
-
value: contentValue,
|
247
|
-
};
|
248
|
-
yield contentEvent;
|
249
|
-
}
|
250
|
-
// Emit tool call events if message has tool calls
|
251
|
-
if (message.tool_calls && message.tool_calls.length > 0) {
|
252
|
-
for (const toolCall of message.tool_calls) {
|
253
|
-
let args = {};
|
254
|
-
try {
|
255
|
-
args = JSON.parse(toolCall.function.arguments);
|
256
|
-
}
|
257
|
-
catch (_e) {
|
258
|
-
// Use empty object as fallback
|
259
|
-
}
|
260
|
-
const toolEvent = {
|
261
|
-
type: GeminiEventType.ToolCallRequest,
|
262
|
-
value: {
|
263
|
-
callId: toolCall.id,
|
264
|
-
name: toolCall.function.name,
|
265
|
-
args,
|
266
|
-
isClientInitiated: false,
|
267
|
-
},
|
268
|
-
};
|
269
|
-
yield toolEvent;
|
270
|
-
}
|
271
|
-
}
|
272
|
-
// Emit usage metadata event if message has usage data
|
273
|
-
if (message.usage) {
|
274
|
-
const usageEvent = {
|
275
|
-
type: GeminiEventType.UsageMetadata,
|
276
|
-
value: {
|
277
|
-
promptTokenCount: message.usage.prompt_tokens,
|
278
|
-
candidatesTokenCount: message.usage.completion_tokens,
|
279
|
-
totalTokenCount: message.usage.total_tokens,
|
280
|
-
},
|
281
|
-
};
|
282
|
-
yield usageEvent;
|
283
|
-
}
|
284
|
-
}
|
285
|
-
}
|
286
|
-
/**
|
287
|
-
* Convert Gemini ContentListUnion to provider ProviderMessage array
|
288
|
-
*/
|
289
|
-
convertContentsToMessages(contents) {
|
290
|
-
// Debug logging for OpenRouter issue
|
291
|
-
if (process.env.DEBUG) {
|
292
|
-
console.log('[GeminiCompatibleWrapper] convertContentsToMessages input:', {
|
293
|
-
type: Array.isArray(contents) ? 'array' : typeof contents,
|
294
|
-
length: Array.isArray(contents) ? contents.length : 'N/A',
|
295
|
-
contents: JSON.stringify(contents).substring(0, 500),
|
296
|
-
});
|
297
|
-
}
|
298
|
-
// Normalize ContentListUnion to Content[]
|
299
|
-
let contentArray;
|
300
|
-
// Check if contents is undefined or null
|
301
|
-
if (!contents) {
|
302
|
-
return [];
|
303
|
-
}
|
304
|
-
if (Array.isArray(contents)) {
|
305
|
-
// Filter out any undefined/null elements
|
306
|
-
const validContents = contents.filter((item) => item !== undefined && item !== null);
|
307
|
-
// If it's already an array, check if it's Content[] or PartUnion[]
|
308
|
-
if (validContents.length === 0) {
|
309
|
-
contentArray = [];
|
310
|
-
}
|
311
|
-
else if (validContents[0] &&
|
312
|
-
typeof validContents[0] === 'object' &&
|
313
|
-
'role' in validContents[0]) {
|
314
|
-
// It's Content[]
|
315
|
-
contentArray = validContents;
|
316
|
-
}
|
317
|
-
else {
|
318
|
-
// It's PartUnion[] - convert to Part[] and wrap in a single Content with user role
|
319
|
-
const parts = validContents.map((item) => typeof item === 'string' ? { text: item } : item);
|
320
|
-
// Special handling: check if all parts are functionResponses
|
321
|
-
// Note: this check was computed but not used in the current implementation
|
322
|
-
contentArray = [
|
323
|
-
{
|
324
|
-
role: 'user',
|
325
|
-
parts,
|
326
|
-
},
|
327
|
-
];
|
328
|
-
}
|
329
|
-
}
|
330
|
-
else if (typeof contents === 'string') {
|
331
|
-
// It's a string - wrap in Part and Content
|
332
|
-
contentArray = [
|
333
|
-
{
|
334
|
-
role: 'user',
|
335
|
-
parts: [{ text: contents }],
|
336
|
-
},
|
337
|
-
];
|
338
|
-
}
|
339
|
-
else if (typeof contents === 'object' &&
|
340
|
-
contents !== null &&
|
341
|
-
'role' in contents) {
|
342
|
-
// It's a single Content
|
343
|
-
contentArray = [contents];
|
344
|
-
}
|
345
|
-
else {
|
346
|
-
// It's a single Part - wrap in Content with user role
|
347
|
-
contentArray = [
|
348
|
-
{
|
349
|
-
role: 'user',
|
350
|
-
parts: [contents],
|
351
|
-
},
|
352
|
-
];
|
353
|
-
}
|
354
|
-
const messages = [];
|
355
|
-
for (const content of contentArray) {
|
356
|
-
// Validate content object
|
357
|
-
if (!content || typeof content !== 'object') {
|
358
|
-
continue;
|
359
|
-
}
|
360
|
-
if (!content.role) {
|
361
|
-
continue;
|
362
|
-
}
|
363
|
-
// Check for function responses (tool results)
|
364
|
-
const functionResponses = (content.parts || []).filter((part) => 'functionResponse' in part);
|
365
|
-
if (functionResponses.length > 0) {
|
366
|
-
// Check for other parts that need to be preserved (like PDFs)
|
367
|
-
const nonFunctionResponseParts = (content.parts || []).filter((part) => !('functionResponse' in part));
|
368
|
-
// Collect any binary content from function responses
|
369
|
-
const binaryParts = [];
|
370
|
-
// Convert each function response to a tool message
|
371
|
-
for (const part of functionResponses) {
|
372
|
-
const response = part.functionResponse.response;
|
373
|
-
let content;
|
374
|
-
// Check if response contains binary content
|
375
|
-
if (response &&
|
376
|
-
typeof response === 'object' &&
|
377
|
-
'binaryContent' in response) {
|
378
|
-
// Extract the binary content
|
379
|
-
const binaryContent = response.binaryContent;
|
380
|
-
if (binaryContent) {
|
381
|
-
binaryParts.push(binaryContent);
|
382
|
-
}
|
383
|
-
content = response.output || `Processed binary content`;
|
384
|
-
}
|
385
|
-
else if (typeof response === 'string') {
|
386
|
-
content = response;
|
387
|
-
}
|
388
|
-
else if (response?.error) {
|
389
|
-
content = `Error: ${response.error}`;
|
390
|
-
}
|
391
|
-
else if (response?.llmContent) {
|
392
|
-
content = String(response.llmContent);
|
393
|
-
}
|
394
|
-
else if (response?.output) {
|
395
|
-
content = String(response.output);
|
396
|
-
}
|
397
|
-
else {
|
398
|
-
content = JSON.stringify(response);
|
399
|
-
}
|
400
|
-
const toolCallId = part.functionResponse.id;
|
401
|
-
if (!toolCallId) {
|
402
|
-
throw new Error(`Tool response for '${part.functionResponse.name}' is missing required tool_call_id. This ID must match the original tool call ID from the model.`);
|
403
|
-
}
|
404
|
-
messages.push({
|
405
|
-
role: 'tool',
|
406
|
-
content,
|
407
|
-
tool_call_id: toolCallId,
|
408
|
-
name: part.functionResponse.name,
|
409
|
-
});
|
410
|
-
}
|
411
|
-
// If there are binary parts from function responses or non-functionResponse parts, add them as user messages
|
412
|
-
const allBinaryParts = [...binaryParts, ...nonFunctionResponseParts];
|
413
|
-
if (allBinaryParts.length > 0) {
|
414
|
-
const binaryMessage = {
|
415
|
-
role: ContentGeneratorRole.USER,
|
416
|
-
content: '',
|
417
|
-
};
|
418
|
-
// Only include parts field for Gemini provider
|
419
|
-
if (this.provider.name === 'gemini') {
|
420
|
-
binaryMessage.parts = allBinaryParts;
|
421
|
-
}
|
422
|
-
messages.push(binaryMessage);
|
423
|
-
}
|
424
|
-
}
|
425
|
-
else {
|
426
|
-
// Check for function calls (tool calls from the model)
|
427
|
-
const functionCalls = (content.parts || []).filter((part) => 'functionCall' in part);
|
428
|
-
// Get all parts
|
429
|
-
const allParts = content.parts || [];
|
430
|
-
// Extract text content
|
431
|
-
const textParts = allParts
|
432
|
-
.filter((part) => 'text' in part)
|
433
|
-
.map((part) => part.text);
|
434
|
-
const combinedText = textParts.join('');
|
435
|
-
// Map Gemini roles to provider roles
|
436
|
-
let role;
|
437
|
-
if (content.role === 'model') {
|
438
|
-
role = ContentGeneratorRole.ASSISTANT;
|
439
|
-
}
|
440
|
-
else if (content.role === 'user') {
|
441
|
-
role = ContentGeneratorRole.USER;
|
442
|
-
}
|
443
|
-
else if (content.role === 'system') {
|
444
|
-
role = 'system';
|
445
|
-
}
|
446
|
-
else {
|
447
|
-
role = content.role;
|
448
|
-
}
|
449
|
-
const message = {
|
450
|
-
role,
|
451
|
-
content: combinedText,
|
452
|
-
};
|
453
|
-
// Only include parts field for Gemini provider
|
454
|
-
// OpenAI and Anthropic don't support the parts field
|
455
|
-
if (this.provider.name === 'gemini') {
|
456
|
-
// Preserve all parts including non-text content (PDFs, images, etc.)
|
457
|
-
message.parts = allParts;
|
458
|
-
}
|
459
|
-
// If this is an assistant message with function calls, add them
|
460
|
-
if (role === 'assistant' && functionCalls.length > 0) {
|
461
|
-
message.tool_calls = functionCalls.map((part) => ({
|
462
|
-
id: part.functionCall.id ||
|
463
|
-
`call_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
|
464
|
-
type: 'function',
|
465
|
-
function: {
|
466
|
-
name: part.functionCall.name,
|
467
|
-
arguments: JSON.stringify(part.functionCall.args || {}),
|
468
|
-
},
|
469
|
-
}));
|
470
|
-
}
|
471
|
-
messages.push(message);
|
472
|
-
}
|
473
|
-
}
|
474
|
-
return messages;
|
475
|
-
}
|
476
|
-
/**
|
477
|
-
* Convert provider messages to a single Gemini response
|
478
|
-
*/
|
479
|
-
convertMessagesToResponse(messages) {
|
480
|
-
// Combine all messages into a single response
|
481
|
-
const combinedContent = messages.map((m) => m.content || '').join('');
|
482
|
-
const parts = [];
|
483
|
-
// Add text content
|
484
|
-
if (combinedContent) {
|
485
|
-
parts.push({ text: combinedContent });
|
486
|
-
}
|
487
|
-
// Add tool calls as function calls
|
488
|
-
for (const message of messages) {
|
489
|
-
if (message.tool_calls) {
|
490
|
-
for (const toolCall of message.tool_calls) {
|
491
|
-
let args = {};
|
492
|
-
try {
|
493
|
-
args = JSON.parse(toolCall.function.arguments);
|
494
|
-
}
|
495
|
-
catch (_e) {
|
496
|
-
// Use empty object as fallback
|
497
|
-
}
|
498
|
-
parts.push({
|
499
|
-
functionCall: {
|
500
|
-
name: toolCall.function.name,
|
501
|
-
args,
|
502
|
-
},
|
503
|
-
});
|
504
|
-
}
|
505
|
-
}
|
506
|
-
// CRITICAL FIX: Preserve parts from the message (PDFs, images, etc.)
|
507
|
-
if (message.parts && message.parts.length > 0) {
|
508
|
-
parts.push(...message.parts);
|
509
|
-
}
|
510
|
-
}
|
511
|
-
return {
|
512
|
-
candidates: [
|
513
|
-
{
|
514
|
-
content: {
|
515
|
-
role: 'model',
|
516
|
-
parts,
|
517
|
-
},
|
518
|
-
},
|
519
|
-
],
|
520
|
-
};
|
521
|
-
}
|
522
|
-
/**
|
523
|
-
* Convert a single provider message to a streaming Gemini response
|
524
|
-
*/
|
525
|
-
convertMessageToStreamResponse(message) {
|
526
|
-
const parts = [];
|
527
|
-
// Add text content if present
|
528
|
-
if (message.content) {
|
529
|
-
parts.push({ text: message.content });
|
530
|
-
}
|
531
|
-
// Add tool calls as function calls
|
532
|
-
if (message.tool_calls) {
|
533
|
-
for (const toolCall of message.tool_calls) {
|
534
|
-
let args = {};
|
535
|
-
try {
|
536
|
-
args = JSON.parse(toolCall.function.arguments);
|
537
|
-
}
|
538
|
-
catch (_e) {
|
539
|
-
// Use empty object as fallback
|
540
|
-
}
|
541
|
-
parts.push({
|
542
|
-
functionCall: {
|
543
|
-
name: toolCall.function.name,
|
544
|
-
args,
|
545
|
-
// Store the tool call ID in the functionCall for later retrieval
|
546
|
-
id: toolCall.id,
|
547
|
-
},
|
548
|
-
});
|
549
|
-
}
|
550
|
-
}
|
551
|
-
// CRITICAL FIX: Preserve parts from the message (PDFs, images, etc.)
|
552
|
-
if (message.parts && message.parts.length > 0) {
|
553
|
-
parts.push(...message.parts);
|
554
|
-
}
|
555
|
-
const response = {
|
556
|
-
candidates: [
|
557
|
-
{
|
558
|
-
content: {
|
559
|
-
role: 'model',
|
560
|
-
parts,
|
561
|
-
},
|
562
|
-
},
|
563
|
-
],
|
564
|
-
};
|
565
|
-
// Include usage metadata if present in the message
|
566
|
-
// This ensures telemetry is only triggered when we have complete usage data
|
567
|
-
if (message.usage) {
|
568
|
-
response.usageMetadata = {
|
569
|
-
promptTokenCount: message.usage.prompt_tokens || 0,
|
570
|
-
candidatesTokenCount: message.usage.completion_tokens || 0,
|
571
|
-
totalTokenCount: message.usage.total_tokens || 0,
|
572
|
-
};
|
573
|
-
}
|
574
|
-
return response;
|
575
|
-
}
|
576
|
-
}
|
577
|
-
//# sourceMappingURL=GeminiCompatibleWrapper.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"GeminiCompatibleWrapper.js","sourceRoot":"","sources":["../../../../src/providers/adapters/GeminiCompatibleWrapper.ts"],"names":[],"mappings":"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"}
|