@google/gemini-cli-core 0.12.0-nightly.20251027.cb0947c5 → 0.12.0-preview.10
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 +7 -5
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/src/code_assist/oauth2.js +8 -9
- package/dist/src/code_assist/oauth2.js.map +1 -1
- package/dist/src/code_assist/oauth2.test.js +32 -32
- package/dist/src/code_assist/oauth2.test.js.map +1 -1
- package/dist/src/config/config.d.ts +14 -11
- package/dist/src/config/config.js +36 -14
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +79 -11
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/models.d.ts +1 -1
- package/dist/src/config/models.js +2 -2
- package/dist/src/config/models.js.map +1 -1
- package/dist/src/config/storage.d.ts +1 -0
- package/dist/src/config/storage.js +3 -0
- package/dist/src/config/storage.js.map +1 -1
- package/dist/src/core/contentGenerator.js +38 -31
- package/dist/src/core/contentGenerator.js.map +1 -1
- package/dist/src/core/contentGenerator.test.js +13 -0
- package/dist/src/core/contentGenerator.test.js.map +1 -1
- package/dist/src/core/coreToolScheduler.js +109 -96
- package/dist/src/core/coreToolScheduler.js.map +1 -1
- package/dist/src/core/fakeContentGenerator.d.ts +20 -13
- package/dist/src/core/fakeContentGenerator.js +21 -24
- package/dist/src/core/fakeContentGenerator.js.map +1 -1
- package/dist/src/core/fakeContentGenerator.test.js +71 -84
- package/dist/src/core/fakeContentGenerator.test.js.map +1 -1
- package/dist/src/core/loggingContentGenerator.d.ts +1 -0
- package/dist/src/core/loggingContentGenerator.js +113 -33
- package/dist/src/core/loggingContentGenerator.js.map +1 -1
- package/dist/src/core/recordingContentGenerator.d.ts +18 -0
- package/dist/src/core/recordingContentGenerator.js +77 -0
- package/dist/src/core/recordingContentGenerator.js.map +1 -0
- package/dist/src/core/recordingContentGenerator.test.d.ts +6 -0
- package/dist/src/core/recordingContentGenerator.test.js +101 -0
- package/dist/src/core/recordingContentGenerator.test.js.map +1 -0
- package/dist/src/fallback/handler.js +2 -0
- package/dist/src/fallback/handler.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +2 -2
- package/dist/src/generated/git-commit.js +2 -2
- package/dist/src/generated/git-commit.js.map +1 -1
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.js +2 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/google-auth-provider.d.ts +0 -2
- package/dist/src/mcp/google-auth-provider.js +6 -40
- package/dist/src/mcp/google-auth-provider.js.map +1 -1
- package/dist/src/mcp/google-auth-provider.test.js +2 -63
- package/dist/src/mcp/google-auth-provider.test.js.map +1 -1
- package/dist/src/mcp/oauth-token-storage.js +1 -1
- package/dist/src/mcp/oauth-token-storage.js.map +1 -1
- package/dist/src/mcp/oauth-token-storage.test.js +2 -2
- package/dist/src/mcp/oauth-token-storage.test.js.map +1 -1
- package/dist/src/mcp/sa-impersonation-provider.js +3 -2
- package/dist/src/mcp/sa-impersonation-provider.js.map +1 -1
- package/dist/src/mcp/token-storage/keychain-token-storage.d.ts +6 -2
- package/dist/src/mcp/token-storage/keychain-token-storage.js +57 -2
- package/dist/src/mcp/token-storage/keychain-token-storage.js.map +1 -1
- package/dist/src/mcp/token-storage/keychain-token-storage.test.js +33 -0
- package/dist/src/mcp/token-storage/keychain-token-storage.test.js.map +1 -1
- package/dist/src/mcp/token-storage/types.d.ts +6 -0
- package/dist/src/mcp/token-storage/types.js.map +1 -1
- package/dist/src/policy/policy-engine.js +4 -0
- package/dist/src/policy/policy-engine.js.map +1 -1
- package/dist/src/services/chatCompressionService.d.ts +3 -3
- package/dist/src/services/chatCompressionService.js +4 -5
- package/dist/src/services/chatCompressionService.js.map +1 -1
- package/dist/src/services/chatCompressionService.test.js +2 -2
- package/dist/src/services/chatCompressionService.test.js.map +1 -1
- package/dist/src/services/loopDetectionService.js +4 -1
- package/dist/src/services/loopDetectionService.js.map +1 -1
- package/dist/src/services/loopDetectionService.test.js +10 -0
- package/dist/src/services/loopDetectionService.test.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +5 -5
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
- package/dist/src/telemetry/index.d.ts +1 -0
- package/dist/src/telemetry/index.js +1 -0
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/loggers.js +25 -26
- package/dist/src/telemetry/loggers.js.map +1 -1
- package/dist/src/telemetry/loggers.test.js +177 -34
- package/dist/src/telemetry/loggers.test.js.map +1 -1
- package/dist/src/telemetry/metrics.d.ts +13 -5
- package/dist/src/telemetry/metrics.js +20 -1
- package/dist/src/telemetry/metrics.js.map +1 -1
- package/dist/src/telemetry/metrics.test.js +45 -0
- package/dist/src/telemetry/metrics.test.js.map +1 -1
- package/dist/src/telemetry/semantic.d.ts +82 -0
- package/dist/src/telemetry/semantic.js +269 -0
- package/dist/src/telemetry/semantic.js.map +1 -0
- package/dist/src/telemetry/semantic.test.d.ts +6 -0
- package/dist/src/telemetry/semantic.test.js +387 -0
- package/dist/src/telemetry/semantic.test.js.map +1 -0
- package/dist/src/telemetry/trace.d.ts +46 -0
- package/dist/src/telemetry/trace.js +121 -0
- package/dist/src/telemetry/trace.js.map +1 -0
- package/dist/src/telemetry/types.d.ts +37 -18
- package/dist/src/telemetry/types.js +107 -36
- package/dist/src/telemetry/types.js.map +1 -1
- package/dist/src/telemetry/uiTelemetry.js +6 -6
- package/dist/src/telemetry/uiTelemetry.js.map +1 -1
- package/dist/src/telemetry/uiTelemetry.test.js +88 -66
- package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
- package/dist/src/tools/glob.test.js +203 -199
- package/dist/src/tools/glob.test.js.map +1 -1
- package/dist/src/tools/mcp-client-manager.js +2 -1
- package/dist/src/tools/mcp-client-manager.js.map +1 -1
- package/dist/src/tools/mcp-client.d.ts +4 -1
- package/dist/src/tools/mcp-client.js +71 -92
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-client.test.js +16 -6
- package/dist/src/tools/mcp-client.test.js.map +1 -1
- package/dist/src/tools/mcp-tool.d.ts +1 -1
- package/dist/src/tools/mcp-tool.js +11 -9
- package/dist/src/tools/mcp-tool.js.map +1 -1
- package/dist/src/tools/shell.d.ts +2 -2
- package/dist/src/tools/shell.js +4 -4
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/tool-registry.d.ts +3 -0
- package/dist/src/tools/tool-registry.js +9 -2
- package/dist/src/tools/tool-registry.js.map +1 -1
- package/dist/src/tools/tools.d.ts +1 -2
- package/dist/src/tools/tools.js +20 -3
- package/dist/src/tools/tools.js.map +1 -1
- package/dist/src/tools/write-todos.js +4 -1
- package/dist/src/tools/write-todos.js.map +1 -1
- package/dist/src/utils/events.d.ts +36 -1
- package/dist/src/utils/events.js +17 -0
- package/dist/src/utils/events.js.map +1 -1
- package/dist/src/utils/events.test.js +10 -0
- package/dist/src/utils/events.test.js.map +1 -1
- package/dist/src/utils/extensionLoader.d.ts +38 -0
- package/dist/src/utils/extensionLoader.js +20 -0
- package/dist/src/utils/extensionLoader.js.map +1 -0
- package/dist/src/utils/googleQuotaErrors.js +2 -2
- package/dist/src/utils/googleQuotaErrors.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.d.ts +2 -2
- package/dist/src/utils/memoryDiscovery.js +3 -2
- package/dist/src/utils/memoryDiscovery.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.test.js +19 -35
- package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
- package/dist/src/utils/workspaceContext.js +1 -1
- package/dist/src/utils/workspaceContext.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
7
|
-
import { FakeContentGenerator } from './fakeContentGenerator.js';
|
|
7
|
+
import { FakeContentGenerator, } from './fakeContentGenerator.js';
|
|
8
8
|
import { promises } from 'node:fs';
|
|
9
|
+
import { GenerateContentResponse, } from '@google/genai';
|
|
9
10
|
vi.mock('node:fs', async (importOriginal) => {
|
|
10
11
|
const actual = await importOriginal();
|
|
11
12
|
return {
|
|
@@ -18,122 +19,108 @@ vi.mock('node:fs', async (importOriginal) => {
|
|
|
18
19
|
});
|
|
19
20
|
const mockReadFile = vi.mocked(promises.readFile);
|
|
20
21
|
describe('FakeContentGenerator', () => {
|
|
21
|
-
const
|
|
22
|
-
|
|
22
|
+
const fakeGenerateContentResponse = {
|
|
23
|
+
method: 'generateContent',
|
|
24
|
+
response: {
|
|
25
|
+
candidates: [
|
|
26
|
+
{ content: { parts: [{ text: 'response1' }], role: 'model' } },
|
|
27
|
+
],
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
const fakeGenerateContentStreamResponse = {
|
|
31
|
+
method: 'generateContentStream',
|
|
32
|
+
response: [
|
|
23
33
|
{
|
|
24
34
|
candidates: [
|
|
25
|
-
{ content: { parts: [{ text: '
|
|
35
|
+
{ content: { parts: [{ text: 'chunk1' }], role: 'model' } },
|
|
36
|
+
],
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
candidates: [
|
|
40
|
+
{ content: { parts: [{ text: 'chunk2' }], role: 'model' } },
|
|
26
41
|
],
|
|
27
42
|
},
|
|
28
|
-
],
|
|
29
|
-
generateContentStream: [
|
|
30
|
-
[
|
|
31
|
-
{
|
|
32
|
-
candidates: [
|
|
33
|
-
{ content: { parts: [{ text: 'chunk1' }], role: 'model' } },
|
|
34
|
-
],
|
|
35
|
-
},
|
|
36
|
-
{
|
|
37
|
-
candidates: [
|
|
38
|
-
{ content: { parts: [{ text: 'chunk2' }], role: 'model' } },
|
|
39
|
-
],
|
|
40
|
-
},
|
|
41
|
-
],
|
|
42
|
-
],
|
|
43
|
-
countTokens: [{ totalTokens: 10 }],
|
|
44
|
-
embedContent: [
|
|
45
|
-
{ embeddings: [{ values: [1, 2, 3] }] },
|
|
46
43
|
],
|
|
47
44
|
};
|
|
45
|
+
const fakeCountTokensResponse = {
|
|
46
|
+
method: 'countTokens',
|
|
47
|
+
response: { totalTokens: 10 },
|
|
48
|
+
};
|
|
49
|
+
const fakeEmbedContentResponse = {
|
|
50
|
+
method: 'embedContent',
|
|
51
|
+
response: {
|
|
52
|
+
embeddings: [{ values: [1, 2, 3] }],
|
|
53
|
+
},
|
|
54
|
+
};
|
|
48
55
|
beforeEach(() => {
|
|
49
56
|
vi.resetAllMocks();
|
|
50
57
|
});
|
|
51
58
|
it('should return responses for generateContent', async () => {
|
|
52
|
-
const generator = new FakeContentGenerator(
|
|
59
|
+
const generator = new FakeContentGenerator([fakeGenerateContentResponse]);
|
|
53
60
|
const response = await generator.generateContent({}, 'id');
|
|
54
|
-
expect(response).
|
|
55
|
-
|
|
56
|
-
it('should throw error when no more generateContent responses', async () => {
|
|
57
|
-
const generator = new FakeContentGenerator({
|
|
58
|
-
...fakeResponses,
|
|
59
|
-
generateContent: [],
|
|
60
|
-
});
|
|
61
|
-
await expect(generator.generateContent({}, 'id')).rejects.toThrowError('No more mock responses for generateContent');
|
|
61
|
+
expect(response).instanceOf(GenerateContentResponse);
|
|
62
|
+
expect(response).toEqual(fakeGenerateContentResponse.response);
|
|
62
63
|
});
|
|
63
64
|
it('should return responses for generateContentStream', async () => {
|
|
64
|
-
const generator = new FakeContentGenerator(
|
|
65
|
+
const generator = new FakeContentGenerator([
|
|
66
|
+
fakeGenerateContentStreamResponse,
|
|
67
|
+
]);
|
|
65
68
|
const stream = await generator.generateContentStream({}, 'id');
|
|
66
69
|
const responses = [];
|
|
67
70
|
for await (const response of stream) {
|
|
71
|
+
expect(response).instanceOf(GenerateContentResponse);
|
|
68
72
|
responses.push(response);
|
|
69
73
|
}
|
|
70
|
-
expect(responses).toEqual(
|
|
71
|
-
});
|
|
72
|
-
it('should throw error when no more generateContentStream responses', async () => {
|
|
73
|
-
const generator = new FakeContentGenerator({
|
|
74
|
-
...fakeResponses,
|
|
75
|
-
generateContentStream: [],
|
|
76
|
-
});
|
|
77
|
-
await expect(generator.generateContentStream({}, 'id')).rejects.toThrow('No more mock responses for generateContentStream');
|
|
74
|
+
expect(responses).toEqual(fakeGenerateContentStreamResponse.response);
|
|
78
75
|
});
|
|
79
76
|
it('should return responses for countTokens', async () => {
|
|
80
|
-
const generator = new FakeContentGenerator(
|
|
77
|
+
const generator = new FakeContentGenerator([fakeCountTokensResponse]);
|
|
81
78
|
const response = await generator.countTokens({});
|
|
82
|
-
expect(response).toEqual(
|
|
83
|
-
});
|
|
84
|
-
it('should throw error when no more countTokens responses', async () => {
|
|
85
|
-
const generator = new FakeContentGenerator({
|
|
86
|
-
...fakeResponses,
|
|
87
|
-
countTokens: [],
|
|
88
|
-
});
|
|
89
|
-
await expect(generator.countTokens({})).rejects.toThrowError('No more mock responses for countTokens');
|
|
79
|
+
expect(response).toEqual(fakeCountTokensResponse.response);
|
|
90
80
|
});
|
|
91
81
|
it('should return responses for embedContent', async () => {
|
|
92
|
-
const generator = new FakeContentGenerator(
|
|
82
|
+
const generator = new FakeContentGenerator([fakeEmbedContentResponse]);
|
|
93
83
|
const response = await generator.embedContent({});
|
|
94
|
-
expect(response).toEqual(
|
|
84
|
+
expect(response).toEqual(fakeEmbedContentResponse.response);
|
|
95
85
|
});
|
|
96
|
-
it('should
|
|
97
|
-
const
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
it('should handle multiple calls and exhaust responses', async () => {
|
|
86
|
+
it('should handle a mixture of calls', async () => {
|
|
87
|
+
const fakeResponses = [
|
|
88
|
+
fakeGenerateContentResponse,
|
|
89
|
+
fakeGenerateContentStreamResponse,
|
|
90
|
+
fakeCountTokensResponse,
|
|
91
|
+
fakeEmbedContentResponse,
|
|
92
|
+
];
|
|
104
93
|
const generator = new FakeContentGenerator(fakeResponses);
|
|
94
|
+
for (const fakeResponse of fakeResponses) {
|
|
95
|
+
const response = await generator[fakeResponse.method]({}, '');
|
|
96
|
+
if (fakeResponse.method === 'generateContentStream') {
|
|
97
|
+
const responses = [];
|
|
98
|
+
for await (const item of response) {
|
|
99
|
+
expect(item).instanceOf(GenerateContentResponse);
|
|
100
|
+
responses.push(item);
|
|
101
|
+
}
|
|
102
|
+
expect(responses).toEqual(fakeResponse.response);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
expect(response).toEqual(fakeResponse.response);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
it('should throw error when no more responses', async () => {
|
|
110
|
+
const generator = new FakeContentGenerator([fakeGenerateContentResponse]);
|
|
105
111
|
await generator.generateContent({}, 'id');
|
|
106
|
-
await expect(generator.
|
|
112
|
+
await expect(generator.embedContent({})).rejects.toThrowError('No more mock responses for embedContent');
|
|
113
|
+
await expect(generator.countTokens({})).rejects.toThrowError('No more mock responses for countTokens');
|
|
114
|
+
await expect(generator.generateContentStream({}, 'id')).rejects.toThrow('No more mock responses for generateContentStream');
|
|
115
|
+
await expect(generator.generateContent({}, 'id')).rejects.toThrowError('No more mock responses for generateContent');
|
|
107
116
|
});
|
|
108
117
|
describe('fromFile', () => {
|
|
109
118
|
it('should create a generator from a file', async () => {
|
|
110
|
-
const fileContent = JSON.stringify(
|
|
119
|
+
const fileContent = JSON.stringify(fakeGenerateContentResponse) + '\n';
|
|
111
120
|
mockReadFile.mockResolvedValue(fileContent);
|
|
112
121
|
const generator = await FakeContentGenerator.fromFile('fake-path.json');
|
|
113
122
|
const response = await generator.generateContent({}, 'id');
|
|
114
|
-
expect(response).toEqual(
|
|
115
|
-
});
|
|
116
|
-
});
|
|
117
|
-
describe('constructor with partial responses', () => {
|
|
118
|
-
it('should handle missing generateContent', async () => {
|
|
119
|
-
const responses = { ...fakeResponses, generateContent: undefined };
|
|
120
|
-
const generator = new FakeContentGenerator(responses);
|
|
121
|
-
await expect(generator.generateContent({}, 'id')).rejects.toThrowError('No more mock responses for generateContent');
|
|
122
|
-
});
|
|
123
|
-
it('should handle missing generateContentStream', async () => {
|
|
124
|
-
const responses = { ...fakeResponses, generateContentStream: undefined };
|
|
125
|
-
const generator = new FakeContentGenerator(responses);
|
|
126
|
-
await expect(generator.generateContentStream({}, 'id')).rejects.toThrowError('No more mock responses for generateContentStream');
|
|
127
|
-
});
|
|
128
|
-
it('should handle missing countTokens', async () => {
|
|
129
|
-
const responses = { ...fakeResponses, countTokens: undefined };
|
|
130
|
-
const generator = new FakeContentGenerator(responses);
|
|
131
|
-
await expect(generator.countTokens({})).rejects.toThrowError('No more mock responses for countTokens');
|
|
132
|
-
});
|
|
133
|
-
it('should handle missing embedContent', async () => {
|
|
134
|
-
const responses = { ...fakeResponses, embedContent: undefined };
|
|
135
|
-
const generator = new FakeContentGenerator(responses);
|
|
136
|
-
await expect(generator.embedContent({})).rejects.toThrowError('No more mock responses for embedContent');
|
|
123
|
+
expect(response).toEqual(fakeGenerateContentResponse.response);
|
|
137
124
|
});
|
|
138
125
|
});
|
|
139
126
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fakeContentGenerator.test.js","sourceRoot":"","sources":["../../../src/core/fakeContentGenerator.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,
|
|
1
|
+
{"version":3,"file":"fakeContentGenerator.test.js","sourceRoot":"","sources":["../../../src/core/fakeContentGenerator.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,7 @@ export declare class LoggingContentGenerator implements ContentGenerator {
|
|
|
15
15
|
constructor(wrapped: ContentGenerator, config: Config);
|
|
16
16
|
getWrapped(): ContentGenerator;
|
|
17
17
|
private logApiRequest;
|
|
18
|
+
private _getEndpointUrl;
|
|
18
19
|
private _logApiResponse;
|
|
19
20
|
private _logApiError;
|
|
20
21
|
generateContent(req: GenerateContentParameters, userPromptId: string): Promise<GenerateContentResponse>;
|
|
@@ -5,8 +5,10 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { ApiRequestEvent, ApiResponseEvent, ApiErrorEvent, } from '../telemetry/types.js';
|
|
7
7
|
import { logApiError, logApiRequest, logApiResponse, } from '../telemetry/loggers.js';
|
|
8
|
+
import { CodeAssistServer } from '../code_assist/server.js';
|
|
8
9
|
import { toContents } from '../code_assist/converter.js';
|
|
9
10
|
import { isStructuredError } from '../utils/quotaErrorDetection.js';
|
|
11
|
+
import { runInDevTraceSpan } from '../telemetry/trace.js';
|
|
10
12
|
/**
|
|
11
13
|
* A decorator that wraps a ContentGenerator to add logging to API calls.
|
|
12
14
|
*/
|
|
@@ -24,48 +26,108 @@ export class LoggingContentGenerator {
|
|
|
24
26
|
const requestText = JSON.stringify(contents);
|
|
25
27
|
logApiRequest(this.config, new ApiRequestEvent(model, promptId, requestText));
|
|
26
28
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
+
_getEndpointUrl(req, method) {
|
|
30
|
+
// Case 1: Authenticated with a Google account (`gcloud auth login`).
|
|
31
|
+
// Requests are routed through the internal CodeAssistServer.
|
|
32
|
+
if (this.wrapped instanceof CodeAssistServer) {
|
|
33
|
+
const url = new URL(this.wrapped.getMethodUrl(method));
|
|
34
|
+
const port = url.port
|
|
35
|
+
? parseInt(url.port, 10)
|
|
36
|
+
: url.protocol === 'https:'
|
|
37
|
+
? 443
|
|
38
|
+
: 80;
|
|
39
|
+
return { address: url.hostname, port };
|
|
40
|
+
}
|
|
41
|
+
const genConfig = this.config.getContentGeneratorConfig();
|
|
42
|
+
// Case 2: Using an API key for Vertex AI.
|
|
43
|
+
if (genConfig?.vertexai) {
|
|
44
|
+
const location = process.env['GOOGLE_CLOUD_LOCATION'];
|
|
45
|
+
if (location) {
|
|
46
|
+
return { address: `${location}-aiplatform.googleapis.com`, port: 443 };
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
return { address: 'unknown', port: 0 };
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// Case 3: Default to the public Gemini API endpoint.
|
|
53
|
+
// This is used when an API key is provided but not for Vertex AI.
|
|
54
|
+
return { address: `generativelanguage.googleapis.com`, port: 443 };
|
|
55
|
+
}
|
|
56
|
+
_logApiResponse(requestContents, durationMs, model, prompt_id, responseId, responseCandidates, usageMetadata, responseText, generationConfig, serverDetails) {
|
|
57
|
+
logApiResponse(this.config, new ApiResponseEvent(model, durationMs, {
|
|
58
|
+
prompt_id,
|
|
59
|
+
contents: requestContents,
|
|
60
|
+
generate_content_config: generationConfig,
|
|
61
|
+
server: serverDetails,
|
|
62
|
+
}, {
|
|
63
|
+
candidates: responseCandidates,
|
|
64
|
+
response_id: responseId,
|
|
65
|
+
}, this.config.getContentGeneratorConfig()?.authType, usageMetadata, responseText));
|
|
29
66
|
}
|
|
30
|
-
_logApiError(durationMs, error, model, prompt_id) {
|
|
67
|
+
_logApiError(durationMs, error, model, prompt_id, requestContents, generationConfig, serverDetails) {
|
|
31
68
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
32
69
|
const errorType = error instanceof Error ? error.name : 'unknown';
|
|
33
|
-
logApiError(this.config, new ApiErrorEvent(model, errorMessage, durationMs,
|
|
70
|
+
logApiError(this.config, new ApiErrorEvent(model, errorMessage, durationMs, {
|
|
71
|
+
prompt_id,
|
|
72
|
+
contents: requestContents,
|
|
73
|
+
generate_content_config: generationConfig,
|
|
74
|
+
server: serverDetails,
|
|
75
|
+
}, this.config.getContentGeneratorConfig()?.authType, errorType, isStructuredError(error)
|
|
34
76
|
? error.status
|
|
35
77
|
: undefined));
|
|
36
78
|
}
|
|
37
79
|
async generateContent(req, userPromptId) {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
80
|
+
return runInDevTraceSpan({
|
|
81
|
+
name: 'generateContent',
|
|
82
|
+
}, async ({ metadata: spanMetadata }) => {
|
|
83
|
+
spanMetadata.input = { request: req, userPromptId, model: req.model };
|
|
84
|
+
const startTime = Date.now();
|
|
85
|
+
const contents = toContents(req.contents);
|
|
86
|
+
this.logApiRequest(toContents(req.contents), req.model, userPromptId);
|
|
87
|
+
const serverDetails = this._getEndpointUrl(req, 'generateContent');
|
|
88
|
+
try {
|
|
89
|
+
const response = await this.wrapped.generateContent(req, userPromptId);
|
|
90
|
+
spanMetadata.output = {
|
|
91
|
+
response,
|
|
92
|
+
usageMetadata: response.usageMetadata,
|
|
93
|
+
};
|
|
94
|
+
const durationMs = Date.now() - startTime;
|
|
95
|
+
this._logApiResponse(contents, durationMs, response.modelVersion || req.model, userPromptId, response.responseId, response.candidates, response.usageMetadata, JSON.stringify(response), req.config, serverDetails);
|
|
96
|
+
return response;
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
const durationMs = Date.now() - startTime;
|
|
100
|
+
this._logApiError(durationMs, error, req.model, userPromptId, contents, req.config, serverDetails);
|
|
101
|
+
throw error;
|
|
102
|
+
}
|
|
103
|
+
});
|
|
51
104
|
}
|
|
52
105
|
async generateContentStream(req, userPromptId) {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
106
|
+
return runInDevTraceSpan({
|
|
107
|
+
name: 'generateContentStream',
|
|
108
|
+
noAutoEnd: true,
|
|
109
|
+
}, async ({ metadata: spanMetadata, endSpan }) => {
|
|
110
|
+
spanMetadata.input = { request: req, userPromptId, model: req.model };
|
|
111
|
+
const startTime = Date.now();
|
|
112
|
+
this.logApiRequest(toContents(req.contents), req.model, userPromptId);
|
|
113
|
+
const serverDetails = this._getEndpointUrl(req, 'generateContentStream');
|
|
114
|
+
let stream;
|
|
115
|
+
try {
|
|
116
|
+
stream = await this.wrapped.generateContentStream(req, userPromptId);
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
const durationMs = Date.now() - startTime;
|
|
120
|
+
this._logApiError(durationMs, error, req.model, userPromptId, toContents(req.contents), req.config, serverDetails);
|
|
121
|
+
throw error;
|
|
122
|
+
}
|
|
123
|
+
return this.loggingStreamWrapper(req, stream, startTime, userPromptId, spanMetadata, endSpan);
|
|
124
|
+
});
|
|
65
125
|
}
|
|
66
|
-
async *loggingStreamWrapper(stream, startTime, userPromptId,
|
|
126
|
+
async *loggingStreamWrapper(req, stream, startTime, userPromptId, spanMetadata, endSpan) {
|
|
67
127
|
const responses = [];
|
|
68
128
|
let lastUsageMetadata;
|
|
129
|
+
const serverDetails = this._getEndpointUrl(req, 'generateContentStream');
|
|
130
|
+
const requestContents = toContents(req.contents);
|
|
69
131
|
try {
|
|
70
132
|
for await (const response of stream) {
|
|
71
133
|
responses.push(response);
|
|
@@ -76,19 +138,37 @@ export class LoggingContentGenerator {
|
|
|
76
138
|
}
|
|
77
139
|
// Only log successful API response if no error occurred
|
|
78
140
|
const durationMs = Date.now() - startTime;
|
|
79
|
-
this._logApiResponse(durationMs, responses[0]?.modelVersion || model, userPromptId, lastUsageMetadata, JSON.stringify(responses));
|
|
141
|
+
this._logApiResponse(requestContents, durationMs, responses[0]?.modelVersion || req.model, userPromptId, responses[0]?.responseId, responses.flatMap((response) => response.candidates || []), lastUsageMetadata, JSON.stringify(responses), req.config, serverDetails);
|
|
142
|
+
spanMetadata.output = {
|
|
143
|
+
streamChunks: responses.map((r) => ({
|
|
144
|
+
content: r.candidates?.[0]?.content ?? null,
|
|
145
|
+
})),
|
|
146
|
+
usageMetadata: lastUsageMetadata,
|
|
147
|
+
durationMs,
|
|
148
|
+
};
|
|
80
149
|
}
|
|
81
150
|
catch (error) {
|
|
151
|
+
spanMetadata.error = error;
|
|
82
152
|
const durationMs = Date.now() - startTime;
|
|
83
|
-
this._logApiError(durationMs, error, responses[0]?.modelVersion || model, userPromptId);
|
|
153
|
+
this._logApiError(durationMs, error, responses[0]?.modelVersion || req.model, userPromptId, requestContents, req.config, serverDetails);
|
|
84
154
|
throw error;
|
|
85
155
|
}
|
|
156
|
+
finally {
|
|
157
|
+
endSpan();
|
|
158
|
+
}
|
|
86
159
|
}
|
|
87
160
|
async countTokens(req) {
|
|
88
161
|
return this.wrapped.countTokens(req);
|
|
89
162
|
}
|
|
90
163
|
async embedContent(req) {
|
|
91
|
-
return
|
|
164
|
+
return runInDevTraceSpan({
|
|
165
|
+
name: 'embedContent',
|
|
166
|
+
}, async ({ metadata: spanMetadata }) => {
|
|
167
|
+
spanMetadata.input = { request: req };
|
|
168
|
+
const output = await this.wrapped.embedContent(req);
|
|
169
|
+
spanMetadata.output = output;
|
|
170
|
+
return output;
|
|
171
|
+
});
|
|
92
172
|
}
|
|
93
173
|
}
|
|
94
174
|
//# sourceMappingURL=loggingContentGenerator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loggingContentGenerator.js","sourceRoot":"","sources":["../../../src/core/loggingContentGenerator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"loggingContentGenerator.js","sourceRoot":"","sources":["../../../src/core/loggingContentGenerator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import type { CountTokensResponse, GenerateContentParameters, GenerateContentResponse, CountTokensParameters, EmbedContentResponse, EmbedContentParameters } from '@google/genai';
|
|
7
|
+
import type { ContentGenerator } from './contentGenerator.js';
|
|
8
|
+
import type { UserTierId } from '../code_assist/types.js';
|
|
9
|
+
export declare class RecordingContentGenerator implements ContentGenerator {
|
|
10
|
+
private readonly realGenerator;
|
|
11
|
+
private readonly filePath;
|
|
12
|
+
userTier?: UserTierId;
|
|
13
|
+
constructor(realGenerator: ContentGenerator, filePath: string);
|
|
14
|
+
generateContent(request: GenerateContentParameters, userPromptId: string): Promise<GenerateContentResponse>;
|
|
15
|
+
generateContentStream(request: GenerateContentParameters, userPromptId: string): Promise<AsyncGenerator<GenerateContentResponse>>;
|
|
16
|
+
countTokens(request: CountTokensParameters): Promise<CountTokensResponse>;
|
|
17
|
+
embedContent(request: EmbedContentParameters): Promise<EmbedContentResponse>;
|
|
18
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { appendFileSync } from 'node:fs';
|
|
7
|
+
import { safeJsonStringify } from '../utils/safeJsonStringify.js';
|
|
8
|
+
// A ContentGenerator that wraps another content generator and records all the
|
|
9
|
+
// responses, with the ability to write them out to a file. These files are
|
|
10
|
+
// intended to be consumed later on by a FakeContentGenerator, given the
|
|
11
|
+
// `--fake-responses` CLI argument.
|
|
12
|
+
//
|
|
13
|
+
// Note that only the "interesting" bits of the responses are actually kept.
|
|
14
|
+
export class RecordingContentGenerator {
|
|
15
|
+
realGenerator;
|
|
16
|
+
filePath;
|
|
17
|
+
userTier;
|
|
18
|
+
constructor(realGenerator, filePath) {
|
|
19
|
+
this.realGenerator = realGenerator;
|
|
20
|
+
this.filePath = filePath;
|
|
21
|
+
}
|
|
22
|
+
async generateContent(request, userPromptId) {
|
|
23
|
+
const response = await this.realGenerator.generateContent(request, userPromptId);
|
|
24
|
+
const recordedResponse = {
|
|
25
|
+
method: 'generateContent',
|
|
26
|
+
response: {
|
|
27
|
+
candidates: response.candidates,
|
|
28
|
+
usageMetadata: response.usageMetadata,
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
appendFileSync(this.filePath, `${safeJsonStringify(recordedResponse)}\n`);
|
|
32
|
+
return response;
|
|
33
|
+
}
|
|
34
|
+
async generateContentStream(request, userPromptId) {
|
|
35
|
+
const recordedResponse = {
|
|
36
|
+
method: 'generateContentStream',
|
|
37
|
+
response: [],
|
|
38
|
+
};
|
|
39
|
+
const realResponses = await this.realGenerator.generateContentStream(request, userPromptId);
|
|
40
|
+
async function* stream(filePath) {
|
|
41
|
+
for await (const response of realResponses) {
|
|
42
|
+
recordedResponse.response.push({
|
|
43
|
+
candidates: response.candidates,
|
|
44
|
+
usageMetadata: response.usageMetadata,
|
|
45
|
+
});
|
|
46
|
+
yield response;
|
|
47
|
+
}
|
|
48
|
+
appendFileSync(filePath, `${safeJsonStringify(recordedResponse)}\n`);
|
|
49
|
+
}
|
|
50
|
+
return Promise.resolve(stream(this.filePath));
|
|
51
|
+
}
|
|
52
|
+
async countTokens(request) {
|
|
53
|
+
const response = await this.realGenerator.countTokens(request);
|
|
54
|
+
const recordedResponse = {
|
|
55
|
+
method: 'countTokens',
|
|
56
|
+
response: {
|
|
57
|
+
totalTokens: response.totalTokens,
|
|
58
|
+
cachedContentTokenCount: response.cachedContentTokenCount,
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
appendFileSync(this.filePath, `${safeJsonStringify(recordedResponse)}\n`);
|
|
62
|
+
return response;
|
|
63
|
+
}
|
|
64
|
+
async embedContent(request) {
|
|
65
|
+
const response = await this.realGenerator.embedContent(request);
|
|
66
|
+
const recordedResponse = {
|
|
67
|
+
method: 'embedContent',
|
|
68
|
+
response: {
|
|
69
|
+
embeddings: response.embeddings,
|
|
70
|
+
metadata: response.metadata,
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
appendFileSync(this.filePath, `${safeJsonStringify(recordedResponse)}\n`);
|
|
74
|
+
return response;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=recordingContentGenerator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recordingContentGenerator.js","sourceRoot":"","sources":["../../../src/core/recordingContentGenerator.ts"],"names":[],"mappings":"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"}
|