@frengki0707/google-cloud-clone 1.33.0
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/LICENSE +203 -0
- package/README.md +83 -0
- package/lib/auth.d.mts +33 -0
- package/lib/auth.d.ts +33 -0
- package/lib/auth.js +70 -0
- package/lib/auth.js.map +1 -0
- package/lib/auth.mjs +45 -0
- package/lib/auth.mjs.map +1 -0
- package/lib/gcpLogger.d.mts +25 -0
- package/lib/gcpLogger.d.ts +25 -0
- package/lib/gcpLogger.js +118 -0
- package/lib/gcpLogger.js.map +1 -0
- package/lib/gcpLogger.mjs +82 -0
- package/lib/gcpLogger.mjs.map +1 -0
- package/lib/gcpOpenTelemetry.d.mts +59 -0
- package/lib/gcpOpenTelemetry.d.ts +59 -0
- package/lib/gcpOpenTelemetry.js +374 -0
- package/lib/gcpOpenTelemetry.js.map +1 -0
- package/lib/gcpOpenTelemetry.mjs +364 -0
- package/lib/gcpOpenTelemetry.mjs.map +1 -0
- package/lib/index.d.mts +36 -0
- package/lib/index.d.ts +36 -0
- package/lib/index.js +56 -0
- package/lib/index.js.map +1 -0
- package/lib/index.mjs +29 -0
- package/lib/index.mjs.map +1 -0
- package/lib/metrics.d.mts +65 -0
- package/lib/metrics.d.ts +65 -0
- package/lib/metrics.js +91 -0
- package/lib/metrics.js.map +1 -0
- package/lib/metrics.mjs +65 -0
- package/lib/metrics.mjs.map +1 -0
- package/lib/model-armor.d.mts +59 -0
- package/lib/model-armor.d.ts +59 -0
- package/lib/model-armor.js +205 -0
- package/lib/model-armor.js.map +1 -0
- package/lib/model-armor.mjs +181 -0
- package/lib/model-armor.mjs.map +1 -0
- package/lib/telemetry/action.d.mts +27 -0
- package/lib/telemetry/action.d.ts +27 -0
- package/lib/telemetry/action.js +92 -0
- package/lib/telemetry/action.js.map +1 -0
- package/lib/telemetry/action.mjs +73 -0
- package/lib/telemetry/action.mjs.map +1 -0
- package/lib/telemetry/defaults.d.mts +30 -0
- package/lib/telemetry/defaults.d.ts +30 -0
- package/lib/telemetry/defaults.js +70 -0
- package/lib/telemetry/defaults.js.map +1 -0
- package/lib/telemetry/defaults.mjs +46 -0
- package/lib/telemetry/defaults.mjs.map +1 -0
- package/lib/telemetry/engagement.d.mts +35 -0
- package/lib/telemetry/engagement.d.ts +35 -0
- package/lib/telemetry/engagement.js +106 -0
- package/lib/telemetry/engagement.js.map +1 -0
- package/lib/telemetry/engagement.mjs +85 -0
- package/lib/telemetry/engagement.mjs.map +1 -0
- package/lib/telemetry/feature.d.mts +35 -0
- package/lib/telemetry/feature.d.ts +35 -0
- package/lib/telemetry/feature.js +142 -0
- package/lib/telemetry/feature.js.map +1 -0
- package/lib/telemetry/feature.mjs +127 -0
- package/lib/telemetry/feature.mjs.map +1 -0
- package/lib/telemetry/generate.d.mts +53 -0
- package/lib/telemetry/generate.d.ts +53 -0
- package/lib/telemetry/generate.js +326 -0
- package/lib/telemetry/generate.js.map +1 -0
- package/lib/telemetry/generate.mjs +314 -0
- package/lib/telemetry/generate.mjs.map +1 -0
- package/lib/telemetry/path.d.mts +32 -0
- package/lib/telemetry/path.d.ts +32 -0
- package/lib/telemetry/path.js +91 -0
- package/lib/telemetry/path.js.map +1 -0
- package/lib/telemetry/path.mjs +78 -0
- package/lib/telemetry/path.mjs.map +1 -0
- package/lib/types.d.mts +121 -0
- package/lib/types.d.ts +121 -0
- package/lib/types.js +17 -0
- package/lib/types.js.map +1 -0
- package/lib/types.mjs +1 -0
- package/lib/types.mjs.map +1 -0
- package/lib/utils.d.mts +57 -0
- package/lib/utils.d.ts +57 -0
- package/lib/utils.js +143 -0
- package/lib/utils.js.map +1 -0
- package/lib/utils.mjs +104 -0
- package/lib/utils.mjs.map +1 -0
- package/package.json +89 -0
- package/src/auth.ts +89 -0
- package/src/gcpLogger.ts +124 -0
- package/src/gcpOpenTelemetry.ts +485 -0
- package/src/index.ts +59 -0
- package/src/metrics.ts +122 -0
- package/src/model-armor.ts +317 -0
- package/src/telemetry/action.ts +106 -0
- package/src/telemetry/defaults.ts +72 -0
- package/src/telemetry/engagement.ts +120 -0
- package/src/telemetry/feature.ts +170 -0
- package/src/telemetry/generate.ts +454 -0
- package/src/telemetry/path.ts +111 -0
- package/src/types.ts +133 -0
- package/src/utils.ts +175 -0
- package/tests/logs_no_input_output_test.ts +267 -0
- package/tests/logs_session_test.ts +219 -0
- package/tests/logs_test.ts +633 -0
- package/tests/metrics_test.ts +792 -0
- package/tests/model_armor_test.ts +336 -0
- package/tests/traces_test.ts +380 -0
- package/typedoc.json +3 -0
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2024 Google LLC
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import {
|
|
18
|
+
afterAll,
|
|
19
|
+
beforeAll,
|
|
20
|
+
beforeEach,
|
|
21
|
+
describe,
|
|
22
|
+
expect,
|
|
23
|
+
it,
|
|
24
|
+
jest,
|
|
25
|
+
} from '@jest/globals';
|
|
26
|
+
import type { ReadableSpan } from '@opentelemetry/sdk-trace-base';
|
|
27
|
+
import * as assert from 'assert';
|
|
28
|
+
import { z, type GenerateResponseData, type Genkit } from 'genkit';
|
|
29
|
+
import { genkit, type GenkitBeta } from 'genkit/beta';
|
|
30
|
+
import type { ModelAction } from 'genkit/model';
|
|
31
|
+
import { Writable } from 'stream';
|
|
32
|
+
import {
|
|
33
|
+
__addTransportStreamForTesting,
|
|
34
|
+
__forceFlushSpansForTesting,
|
|
35
|
+
__getSpanExporterForTesting,
|
|
36
|
+
__useJsonFormatForTesting,
|
|
37
|
+
enableGoogleCloudTelemetry,
|
|
38
|
+
} from '../src/index.js';
|
|
39
|
+
|
|
40
|
+
jest.mock('../src/auth.js', () => {
|
|
41
|
+
const original = jest.requireActual('../src/auth.js');
|
|
42
|
+
return {
|
|
43
|
+
...(original || {}),
|
|
44
|
+
resolveCurrentPrincipal: jest.fn().mockImplementation(() => {
|
|
45
|
+
return Promise.resolve({
|
|
46
|
+
projectId: 'test',
|
|
47
|
+
serviceAccountEmail: 'test@test.com',
|
|
48
|
+
});
|
|
49
|
+
}),
|
|
50
|
+
credentialsFromEnvironment: jest.fn().mockImplementation(() => {
|
|
51
|
+
return Promise.resolve({
|
|
52
|
+
projectId: 'test',
|
|
53
|
+
credentials: {
|
|
54
|
+
client_email: 'test@genkit.com',
|
|
55
|
+
private_key: '-----BEGIN PRIVATE KEY-----',
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
}),
|
|
59
|
+
};
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
describe('GoogleCloudLogs for sessions', () => {
|
|
63
|
+
let logLines = '';
|
|
64
|
+
const logStream = new Writable();
|
|
65
|
+
logStream._write = (chunk, encoding, next) => {
|
|
66
|
+
logLines = logLines += chunk.toString();
|
|
67
|
+
next();
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
let ai: GenkitBeta;
|
|
71
|
+
let testModel: ModelAction;
|
|
72
|
+
|
|
73
|
+
beforeAll(async () => {
|
|
74
|
+
process.env.GCLOUD_PROJECT = 'test';
|
|
75
|
+
process.env.GENKIT_ENV = 'dev';
|
|
76
|
+
__useJsonFormatForTesting();
|
|
77
|
+
__addTransportStreamForTesting(logStream);
|
|
78
|
+
|
|
79
|
+
await enableGoogleCloudTelemetry({
|
|
80
|
+
projectId: 'test',
|
|
81
|
+
forceDevExport: false,
|
|
82
|
+
metricExportIntervalMillis: 100,
|
|
83
|
+
metricExportTimeoutMillis: 100,
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
ai = genkit({
|
|
87
|
+
// Force GCP Plugin to use in-memory metrics exporter
|
|
88
|
+
plugins: [],
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
testModel = createModel(ai, 'testModel', async () => {
|
|
92
|
+
return {
|
|
93
|
+
message: {
|
|
94
|
+
role: 'user',
|
|
95
|
+
content: [
|
|
96
|
+
{
|
|
97
|
+
text: 'response',
|
|
98
|
+
},
|
|
99
|
+
],
|
|
100
|
+
},
|
|
101
|
+
finishReason: 'stop',
|
|
102
|
+
usage: {
|
|
103
|
+
inputTokens: 10,
|
|
104
|
+
outputTokens: 14,
|
|
105
|
+
inputCharacters: 8,
|
|
106
|
+
outputCharacters: 16,
|
|
107
|
+
inputImages: 1,
|
|
108
|
+
outputImages: 3,
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
await waitForLogsInit(ai, logLines);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
beforeEach(async () => {
|
|
117
|
+
logLines = '';
|
|
118
|
+
__getSpanExporterForTesting().reset();
|
|
119
|
+
});
|
|
120
|
+
afterAll(async () => {
|
|
121
|
+
await ai.stopServers();
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
it('writes logs with sessionId', async () => {
|
|
125
|
+
const chat = ai.chat();
|
|
126
|
+
|
|
127
|
+
await chat.send({ model: testModel, prompt: 'Test message' });
|
|
128
|
+
|
|
129
|
+
await getExportedSpans();
|
|
130
|
+
|
|
131
|
+
const logMessages = await getLogs(1, 100, logLines);
|
|
132
|
+
const logObjects = logMessages.map((l) => JSON.parse(l as string));
|
|
133
|
+
|
|
134
|
+
// Right now sessionId is applied only at the top level send.
|
|
135
|
+
// We intend to eventually make the session id available on all relevant spans.
|
|
136
|
+
logObjects.forEach((logBlob) => {
|
|
137
|
+
if (
|
|
138
|
+
logBlob.message === 'Input[send, send]' ||
|
|
139
|
+
logBlob.message === 'Output[send, send]' ||
|
|
140
|
+
logBlob.message === 'Paths[send]'
|
|
141
|
+
) {
|
|
142
|
+
expect(logBlob.sessionId).not.toBeUndefined();
|
|
143
|
+
expect(logBlob.threadName).not.toBeUndefined();
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
expect(logBlob.sessionId).toBeUndefined();
|
|
148
|
+
expect(logBlob.threadName).toBeUndefined();
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
/** Helper to create a flow with no inputs or outputs */
|
|
154
|
+
function createFlow(
|
|
155
|
+
ai: Genkit,
|
|
156
|
+
name: string,
|
|
157
|
+
fn: () => Promise<any> = async () => {}
|
|
158
|
+
) {
|
|
159
|
+
return ai.defineFlow(
|
|
160
|
+
{
|
|
161
|
+
name,
|
|
162
|
+
inputSchema: z.void(),
|
|
163
|
+
outputSchema: z.void(),
|
|
164
|
+
},
|
|
165
|
+
fn
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Helper to create a model that returns the value produced by the given
|
|
171
|
+
* response function.
|
|
172
|
+
*/
|
|
173
|
+
function createModel(
|
|
174
|
+
genkit: Genkit,
|
|
175
|
+
name: string,
|
|
176
|
+
respFn: () => Promise<GenerateResponseData>
|
|
177
|
+
) {
|
|
178
|
+
return genkit.defineModel({ name }, (req) => respFn());
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
async function waitForLogsInit(genkit: Genkit, logLines: any) {
|
|
182
|
+
await import('winston');
|
|
183
|
+
const testFlow = createFlow(genkit, 'testFlow');
|
|
184
|
+
await testFlow();
|
|
185
|
+
await getLogs(1, 100, logLines);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
async function getLogs(
|
|
189
|
+
logCount: number,
|
|
190
|
+
maxAttempts: number,
|
|
191
|
+
logLines: string
|
|
192
|
+
): Promise<string[]> {
|
|
193
|
+
var attempts = 0;
|
|
194
|
+
while (attempts++ < maxAttempts) {
|
|
195
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
196
|
+
const found = logLines
|
|
197
|
+
.trim()
|
|
198
|
+
.split('\n')
|
|
199
|
+
.map((l) => l.trim());
|
|
200
|
+
if (found.length >= logCount) {
|
|
201
|
+
return found.filter((l) => l !== undefined && l !== '');
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
assert.fail(`Waiting for logs, but none have been written.`);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/** Polls the in memory metric exporter until the genkit scope is found. */
|
|
208
|
+
async function getExportedSpans(maxAttempts = 200): Promise<ReadableSpan[]> {
|
|
209
|
+
__forceFlushSpansForTesting();
|
|
210
|
+
var attempts = 0;
|
|
211
|
+
while (attempts++ < maxAttempts) {
|
|
212
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
213
|
+
const found = __getSpanExporterForTesting().getFinishedSpans();
|
|
214
|
+
if (found.length > 0) {
|
|
215
|
+
return found;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
assert.fail(`Timed out while waiting for spans to be exported.`);
|
|
219
|
+
}
|