@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.
Files changed (148) hide show
  1. package/README.md +7 -5
  2. package/dist/index.d.ts +1 -0
  3. package/dist/index.js +1 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/src/code_assist/oauth2.js +8 -9
  6. package/dist/src/code_assist/oauth2.js.map +1 -1
  7. package/dist/src/code_assist/oauth2.test.js +32 -32
  8. package/dist/src/code_assist/oauth2.test.js.map +1 -1
  9. package/dist/src/config/config.d.ts +14 -11
  10. package/dist/src/config/config.js +36 -14
  11. package/dist/src/config/config.js.map +1 -1
  12. package/dist/src/config/config.test.js +79 -11
  13. package/dist/src/config/config.test.js.map +1 -1
  14. package/dist/src/config/models.d.ts +1 -1
  15. package/dist/src/config/models.js +2 -2
  16. package/dist/src/config/models.js.map +1 -1
  17. package/dist/src/config/storage.d.ts +1 -0
  18. package/dist/src/config/storage.js +3 -0
  19. package/dist/src/config/storage.js.map +1 -1
  20. package/dist/src/core/contentGenerator.js +38 -31
  21. package/dist/src/core/contentGenerator.js.map +1 -1
  22. package/dist/src/core/contentGenerator.test.js +13 -0
  23. package/dist/src/core/contentGenerator.test.js.map +1 -1
  24. package/dist/src/core/coreToolScheduler.js +109 -96
  25. package/dist/src/core/coreToolScheduler.js.map +1 -1
  26. package/dist/src/core/fakeContentGenerator.d.ts +20 -13
  27. package/dist/src/core/fakeContentGenerator.js +21 -24
  28. package/dist/src/core/fakeContentGenerator.js.map +1 -1
  29. package/dist/src/core/fakeContentGenerator.test.js +71 -84
  30. package/dist/src/core/fakeContentGenerator.test.js.map +1 -1
  31. package/dist/src/core/loggingContentGenerator.d.ts +1 -0
  32. package/dist/src/core/loggingContentGenerator.js +113 -33
  33. package/dist/src/core/loggingContentGenerator.js.map +1 -1
  34. package/dist/src/core/recordingContentGenerator.d.ts +18 -0
  35. package/dist/src/core/recordingContentGenerator.js +77 -0
  36. package/dist/src/core/recordingContentGenerator.js.map +1 -0
  37. package/dist/src/core/recordingContentGenerator.test.d.ts +6 -0
  38. package/dist/src/core/recordingContentGenerator.test.js +101 -0
  39. package/dist/src/core/recordingContentGenerator.test.js.map +1 -0
  40. package/dist/src/fallback/handler.js +2 -0
  41. package/dist/src/fallback/handler.js.map +1 -1
  42. package/dist/src/generated/git-commit.d.ts +2 -2
  43. package/dist/src/generated/git-commit.js +2 -2
  44. package/dist/src/generated/git-commit.js.map +1 -1
  45. package/dist/src/index.d.ts +2 -0
  46. package/dist/src/index.js +2 -0
  47. package/dist/src/index.js.map +1 -1
  48. package/dist/src/mcp/google-auth-provider.d.ts +0 -2
  49. package/dist/src/mcp/google-auth-provider.js +6 -40
  50. package/dist/src/mcp/google-auth-provider.js.map +1 -1
  51. package/dist/src/mcp/google-auth-provider.test.js +2 -63
  52. package/dist/src/mcp/google-auth-provider.test.js.map +1 -1
  53. package/dist/src/mcp/oauth-token-storage.js +1 -1
  54. package/dist/src/mcp/oauth-token-storage.js.map +1 -1
  55. package/dist/src/mcp/oauth-token-storage.test.js +2 -2
  56. package/dist/src/mcp/oauth-token-storage.test.js.map +1 -1
  57. package/dist/src/mcp/sa-impersonation-provider.js +3 -2
  58. package/dist/src/mcp/sa-impersonation-provider.js.map +1 -1
  59. package/dist/src/mcp/token-storage/keychain-token-storage.d.ts +6 -2
  60. package/dist/src/mcp/token-storage/keychain-token-storage.js +57 -2
  61. package/dist/src/mcp/token-storage/keychain-token-storage.js.map +1 -1
  62. package/dist/src/mcp/token-storage/keychain-token-storage.test.js +33 -0
  63. package/dist/src/mcp/token-storage/keychain-token-storage.test.js.map +1 -1
  64. package/dist/src/mcp/token-storage/types.d.ts +6 -0
  65. package/dist/src/mcp/token-storage/types.js.map +1 -1
  66. package/dist/src/policy/policy-engine.js +4 -0
  67. package/dist/src/policy/policy-engine.js.map +1 -1
  68. package/dist/src/services/chatCompressionService.d.ts +3 -3
  69. package/dist/src/services/chatCompressionService.js +4 -5
  70. package/dist/src/services/chatCompressionService.js.map +1 -1
  71. package/dist/src/services/chatCompressionService.test.js +2 -2
  72. package/dist/src/services/chatCompressionService.test.js.map +1 -1
  73. package/dist/src/services/loopDetectionService.js +4 -1
  74. package/dist/src/services/loopDetectionService.js.map +1 -1
  75. package/dist/src/services/loopDetectionService.test.js +10 -0
  76. package/dist/src/services/loopDetectionService.test.js.map +1 -1
  77. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +5 -5
  78. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  79. package/dist/src/telemetry/index.d.ts +1 -0
  80. package/dist/src/telemetry/index.js +1 -0
  81. package/dist/src/telemetry/index.js.map +1 -1
  82. package/dist/src/telemetry/loggers.js +25 -26
  83. package/dist/src/telemetry/loggers.js.map +1 -1
  84. package/dist/src/telemetry/loggers.test.js +177 -34
  85. package/dist/src/telemetry/loggers.test.js.map +1 -1
  86. package/dist/src/telemetry/metrics.d.ts +13 -5
  87. package/dist/src/telemetry/metrics.js +20 -1
  88. package/dist/src/telemetry/metrics.js.map +1 -1
  89. package/dist/src/telemetry/metrics.test.js +45 -0
  90. package/dist/src/telemetry/metrics.test.js.map +1 -1
  91. package/dist/src/telemetry/semantic.d.ts +82 -0
  92. package/dist/src/telemetry/semantic.js +269 -0
  93. package/dist/src/telemetry/semantic.js.map +1 -0
  94. package/dist/src/telemetry/semantic.test.d.ts +6 -0
  95. package/dist/src/telemetry/semantic.test.js +387 -0
  96. package/dist/src/telemetry/semantic.test.js.map +1 -0
  97. package/dist/src/telemetry/trace.d.ts +46 -0
  98. package/dist/src/telemetry/trace.js +121 -0
  99. package/dist/src/telemetry/trace.js.map +1 -0
  100. package/dist/src/telemetry/types.d.ts +37 -18
  101. package/dist/src/telemetry/types.js +107 -36
  102. package/dist/src/telemetry/types.js.map +1 -1
  103. package/dist/src/telemetry/uiTelemetry.js +6 -6
  104. package/dist/src/telemetry/uiTelemetry.js.map +1 -1
  105. package/dist/src/telemetry/uiTelemetry.test.js +88 -66
  106. package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
  107. package/dist/src/tools/glob.test.js +203 -199
  108. package/dist/src/tools/glob.test.js.map +1 -1
  109. package/dist/src/tools/mcp-client-manager.js +2 -1
  110. package/dist/src/tools/mcp-client-manager.js.map +1 -1
  111. package/dist/src/tools/mcp-client.d.ts +4 -1
  112. package/dist/src/tools/mcp-client.js +71 -92
  113. package/dist/src/tools/mcp-client.js.map +1 -1
  114. package/dist/src/tools/mcp-client.test.js +16 -6
  115. package/dist/src/tools/mcp-client.test.js.map +1 -1
  116. package/dist/src/tools/mcp-tool.d.ts +1 -1
  117. package/dist/src/tools/mcp-tool.js +11 -9
  118. package/dist/src/tools/mcp-tool.js.map +1 -1
  119. package/dist/src/tools/shell.d.ts +2 -2
  120. package/dist/src/tools/shell.js +4 -4
  121. package/dist/src/tools/shell.js.map +1 -1
  122. package/dist/src/tools/tool-registry.d.ts +3 -0
  123. package/dist/src/tools/tool-registry.js +9 -2
  124. package/dist/src/tools/tool-registry.js.map +1 -1
  125. package/dist/src/tools/tools.d.ts +1 -2
  126. package/dist/src/tools/tools.js +20 -3
  127. package/dist/src/tools/tools.js.map +1 -1
  128. package/dist/src/tools/write-todos.js +4 -1
  129. package/dist/src/tools/write-todos.js.map +1 -1
  130. package/dist/src/utils/events.d.ts +36 -1
  131. package/dist/src/utils/events.js +17 -0
  132. package/dist/src/utils/events.js.map +1 -1
  133. package/dist/src/utils/events.test.js +10 -0
  134. package/dist/src/utils/events.test.js.map +1 -1
  135. package/dist/src/utils/extensionLoader.d.ts +38 -0
  136. package/dist/src/utils/extensionLoader.js +20 -0
  137. package/dist/src/utils/extensionLoader.js.map +1 -0
  138. package/dist/src/utils/googleQuotaErrors.js +2 -2
  139. package/dist/src/utils/googleQuotaErrors.js.map +1 -1
  140. package/dist/src/utils/memoryDiscovery.d.ts +2 -2
  141. package/dist/src/utils/memoryDiscovery.js +3 -2
  142. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  143. package/dist/src/utils/memoryDiscovery.test.js +19 -35
  144. package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
  145. package/dist/src/utils/workspaceContext.js +1 -1
  146. package/dist/src/utils/workspaceContext.js.map +1 -1
  147. package/dist/tsconfig.tsbuildinfo +1 -1
  148. 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 fakeResponses = {
22
- generateContent: [
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: 'response1' }], role: 'model' } },
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(fakeResponses);
59
+ const generator = new FakeContentGenerator([fakeGenerateContentResponse]);
53
60
  const response = await generator.generateContent({}, 'id');
54
- expect(response).toEqual(fakeResponses.generateContent[0]);
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(fakeResponses);
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(fakeResponses.generateContentStream[0]);
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(fakeResponses);
77
+ const generator = new FakeContentGenerator([fakeCountTokensResponse]);
81
78
  const response = await generator.countTokens({});
82
- expect(response).toEqual(fakeResponses.countTokens[0]);
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(fakeResponses);
82
+ const generator = new FakeContentGenerator([fakeEmbedContentResponse]);
93
83
  const response = await generator.embedContent({});
94
- expect(response).toEqual(fakeResponses.embedContent[0]);
84
+ expect(response).toEqual(fakeEmbedContentResponse.response);
95
85
  });
96
- it('should throw error when no more embedContent responses', async () => {
97
- const generator = new FakeContentGenerator({
98
- ...fakeResponses,
99
- embedContent: [],
100
- });
101
- await expect(generator.embedContent({})).rejects.toThrowError('No more mock responses for embedContent');
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.generateContent({}, 'id')).rejects.toThrow();
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(fakeResponses);
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(fakeResponses.generateContent[0]);
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":"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"}
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
- _logApiResponse(durationMs, model, prompt_id, usageMetadata, responseText) {
28
- logApiResponse(this.config, new ApiResponseEvent(model, durationMs, prompt_id, this.config.getContentGeneratorConfig()?.authType, usageMetadata, responseText));
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, prompt_id, this.config.getContentGeneratorConfig()?.authType, errorType, isStructuredError(error)
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
- const startTime = Date.now();
39
- this.logApiRequest(toContents(req.contents), req.model, userPromptId);
40
- try {
41
- const response = await this.wrapped.generateContent(req, userPromptId);
42
- const durationMs = Date.now() - startTime;
43
- this._logApiResponse(durationMs, response.modelVersion || req.model, userPromptId, response.usageMetadata, JSON.stringify(response));
44
- return response;
45
- }
46
- catch (error) {
47
- const durationMs = Date.now() - startTime;
48
- this._logApiError(durationMs, error, req.model, userPromptId);
49
- throw error;
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
- const startTime = Date.now();
54
- this.logApiRequest(toContents(req.contents), req.model, userPromptId);
55
- let stream;
56
- try {
57
- stream = await this.wrapped.generateContentStream(req, userPromptId);
58
- }
59
- catch (error) {
60
- const durationMs = Date.now() - startTime;
61
- this._logApiError(durationMs, error, req.model, userPromptId);
62
- throw error;
63
- }
64
- return this.loggingStreamWrapper(stream, startTime, userPromptId, req.model);
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, model) {
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 this.wrapped.embedContent(req);
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":"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"}
1
+ {"version":3,"file":"loggingContentGenerator.js","sourceRoot":"","sources":["../../../src/core/loggingContentGenerator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAeH,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,aAAa,GACd,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,WAAW,EACX,aAAa,EACb,cAAc,GACf,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAqB,MAAM,uBAAuB,CAAC;AAM7E;;GAEG;AACH,MAAM,OAAO,uBAAuB;IAEf;IACA;IAFnB,YACmB,OAAyB,EACzB,MAAc;QADd,YAAO,GAAP,OAAO,CAAkB;QACzB,WAAM,GAAN,MAAM,CAAQ;IAC9B,CAAC;IAEJ,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAEO,aAAa,CACnB,QAAmB,EACnB,KAAa,EACb,QAAgB;QAEhB,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC7C,aAAa,CACX,IAAI,CAAC,MAAM,EACX,IAAI,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,CAAC,CAClD,CAAC;IACJ,CAAC;IAEO,eAAe,CACrB,GAA8B,EAC9B,MAAmD;QAEnD,qEAAqE;QACrE,6DAA6D;QAC7D,IAAI,IAAI,CAAC,OAAO,YAAY,gBAAgB,EAAE,CAAC;YAC7C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;YACvD,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI;gBACnB,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;gBACxB,CAAC,CAAC,GAAG,CAAC,QAAQ,KAAK,QAAQ;oBACzB,CAAC,CAAC,GAAG;oBACL,CAAC,CAAC,EAAE,CAAC;YACT,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;QACzC,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,yBAAyB,EAAE,CAAC;QAE1D,0CAA0C;QAC1C,IAAI,SAAS,EAAE,QAAQ,EAAE,CAAC;YACxB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;YACtD,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,EAAE,OAAO,EAAE,GAAG,QAAQ,4BAA4B,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;YACzE,CAAC;iBAAM,CAAC;gBACN,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACzC,CAAC;QACH,CAAC;QAED,qDAAqD;QACrD,kEAAkE;QAClE,OAAO,EAAE,OAAO,EAAE,mCAAmC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;IACrE,CAAC;IAEO,eAAe,CACrB,eAA0B,EAC1B,UAAkB,EAClB,KAAa,EACb,SAAiB,EACjB,UAA8B,EAC9B,kBAAgC,EAChC,aAAoD,EACpD,YAAqB,EACrB,gBAAwC,EACxC,aAA6B;QAE7B,cAAc,CACZ,IAAI,CAAC,MAAM,EACX,IAAI,gBAAgB,CAClB,KAAK,EACL,UAAU,EACV;YACE,SAAS;YACT,QAAQ,EAAE,eAAe;YACzB,uBAAuB,EAAE,gBAAgB;YACzC,MAAM,EAAE,aAAa;SACtB,EACD;YACE,UAAU,EAAE,kBAAkB;YAC9B,WAAW,EAAE,UAAU;SACxB,EACD,IAAI,CAAC,MAAM,CAAC,yBAAyB,EAAE,EAAE,QAAQ,EACjD,aAAa,EACb,YAAY,CACb,CACF,CAAC;IACJ,CAAC;IAEO,YAAY,CAClB,UAAkB,EAClB,KAAc,EACd,KAAa,EACb,SAAiB,EACjB,eAA0B,EAC1B,gBAAwC,EACxC,aAA6B;QAE7B,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5E,MAAM,SAAS,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QAElE,WAAW,CACT,IAAI,CAAC,MAAM,EACX,IAAI,aAAa,CACf,KAAK,EACL,YAAY,EACZ,UAAU,EACV;YACE,SAAS;YACT,QAAQ,EAAE,eAAe;YACzB,uBAAuB,EAAE,gBAAgB;YACzC,MAAM,EAAE,aAAa;SACtB,EACD,IAAI,CAAC,MAAM,CAAC,yBAAyB,EAAE,EAAE,QAAQ,EACjD,SAAS,EACT,iBAAiB,CAAC,KAAK,CAAC;YACtB,CAAC,CAAE,KAAyB,CAAC,MAAM;YACnC,CAAC,CAAC,SAAS,CACd,CACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,GAA8B,EAC9B,YAAoB;QAEpB,OAAO,iBAAiB,CACtB;YACE,IAAI,EAAE,iBAAiB;SACxB,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,EAAE;YACnC,YAAY,CAAC,KAAK,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;YAEtE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAc,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACrD,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;YACtE,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;YACnE,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,CACjD,GAAG,EACH,YAAY,CACb,CAAC;gBACF,YAAY,CAAC,MAAM,GAAG;oBACpB,QAAQ;oBACR,aAAa,EAAE,QAAQ,CAAC,aAAa;iBACtC,CAAC;gBACF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;gBAC1C,IAAI,CAAC,eAAe,CAClB,QAAQ,EACR,UAAU,EACV,QAAQ,CAAC,YAAY,IAAI,GAAG,CAAC,KAAK,EAClC,YAAY,EACZ,QAAQ,CAAC,UAAU,EACnB,QAAQ,CAAC,UAAU,EACnB,QAAQ,CAAC,aAAa,EACtB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EACxB,GAAG,CAAC,MAAM,EACV,aAAa,CACd,CAAC;gBACF,OAAO,QAAQ,CAAC;YAClB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;gBAC1C,IAAI,CAAC,YAAY,CACf,UAAU,EACV,KAAK,EACL,GAAG,CAAC,KAAK,EACT,YAAY,EACZ,QAAQ,EACR,GAAG,CAAC,MAAM,EACV,aAAa,CACd,CAAC;gBACF,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,qBAAqB,CACzB,GAA8B,EAC9B,YAAoB;QAEpB,OAAO,iBAAiB,CACtB;YACE,IAAI,EAAE,uBAAuB;YAC7B,SAAS,EAAE,IAAI;SAChB,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,EAAE,EAAE;YAC5C,YAAY,CAAC,KAAK,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;YACtE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7B,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;YACtE,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CACxC,GAAG,EACH,uBAAuB,CACxB,CAAC;YAEF,IAAI,MAA+C,CAAC;YACpD,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YACvE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;gBAC1C,IAAI,CAAC,YAAY,CACf,UAAU,EACV,KAAK,EACL,GAAG,CAAC,KAAK,EACT,YAAY,EACZ,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EACxB,GAAG,CAAC,MAAM,EACV,aAAa,CACd,CAAC;gBACF,MAAM,KAAK,CAAC;YACd,CAAC;YAED,OAAO,IAAI,CAAC,oBAAoB,CAC9B,GAAG,EACH,MAAM,EACN,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,OAAO,CACR,CAAC;QACJ,CAAC,CACF,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,CAAC,oBAAoB,CACjC,GAA8B,EAC9B,MAA+C,EAC/C,SAAiB,EACjB,YAAoB,EACpB,YAA0B,EAC1B,OAAmB;QAEnB,MAAM,SAAS,GAA8B,EAAE,CAAC;QAEhD,IAAI,iBAAmE,CAAC;QACxE,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAC;QACzE,MAAM,eAAe,GAAc,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5D,IAAI,CAAC;YACH,IAAI,KAAK,EAAE,MAAM,QAAQ,IAAI,MAAM,EAAE,CAAC;gBACpC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACzB,IAAI,QAAQ,CAAC,aAAa,EAAE,CAAC;oBAC3B,iBAAiB,GAAG,QAAQ,CAAC,aAAa,CAAC;gBAC7C,CAAC;gBACD,MAAM,QAAQ,CAAC;YACjB,CAAC;YACD,wDAAwD;YACxD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAC1C,IAAI,CAAC,eAAe,CAClB,eAAe,EACf,UAAU,EACV,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,IAAI,GAAG,CAAC,KAAK,EACvC,YAAY,EACZ,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EACxB,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,IAAI,EAAE,CAAC,EAC1D,iBAAiB,EACjB,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EACzB,GAAG,CAAC,MAAM,EACV,aAAa,CACd,CAAC;YACF,YAAY,CAAC,MAAM,GAAG;gBACpB,YAAY,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAClC,OAAO,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,IAAI;iBAC5C,CAAC,CAAC;gBACH,aAAa,EAAE,iBAAiB;gBAChC,UAAU;aACX,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,YAAY,CAAC,KAAK,GAAG,KAAK,CAAC;YAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAC1C,IAAI,CAAC,YAAY,CACf,UAAU,EACV,KAAK,EACL,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,IAAI,GAAG,CAAC,KAAK,EACvC,YAAY,EACZ,eAAe,EACf,GAAG,CAAC,MAAM,EACV,aAAa,CACd,CAAC;YACF,MAAM,KAAK,CAAC;QACd,CAAC;gBAAS,CAAC;YACT,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,GAA0B;QAC1C,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,GAA2B;QAE3B,OAAO,iBAAiB,CACtB;YACE,IAAI,EAAE,cAAc;SACrB,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,EAAE;YACnC,YAAY,CAAC,KAAK,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;YACtC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;YACpD,YAAY,CAAC,MAAM,GAAG,MAAM,CAAC;YAC7B,OAAO,MAAM,CAAC;QAChB,CAAC,CACF,CAAC;IACJ,CAAC;CACF"}
@@ -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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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};