@memberjunction/ai-vertex 4.4.0 → 5.0.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.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=vertexLLM.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vertexLLM.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/vertexLLM.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,437 @@
1
+ import { VertexLLM } from '../models/vertexLLM.js';
2
+ import { ChatMessageRole, ModelUsage } from '@memberjunction/ai';
3
+ /**
4
+ * Test suite for VertexLLM
5
+ *
6
+ * VertexLLM extends GeminiLLM and inherits all its functionality (chat, streaming,
7
+ * thinking, multimodal, etc.). These tests focus on:
8
+ * 1. Constructor and authentication configuration
9
+ * 2. Basic integration tests (if credentials are available)
10
+ *
11
+ * Setup Requirements:
12
+ * 1. Set VERTEX_PROJECT_ID environment variable
13
+ * 2. Set VERTEX_SERVICE_ACCOUNT_KEY_PATH to path of JSON key file (optional)
14
+ * 3. Set VERTEX_LOCATION (optional, defaults to 'us-central1')
15
+ *
16
+ * To run tests:
17
+ * ```bash
18
+ * export VERTEX_PROJECT_ID="your-project-id"
19
+ * export VERTEX_SERVICE_ACCOUNT_KEY_PATH="/path/to/service-account-key.json"
20
+ * npm test
21
+ * ```
22
+ */
23
+ describe('VertexLLM', () => {
24
+ const projectId = process.env.VERTEX_PROJECT_ID || 'test-project';
25
+ const keyPath = process.env.VERTEX_SERVICE_ACCOUNT_KEY_PATH;
26
+ const location = process.env.VERTEX_LOCATION || 'us-central1';
27
+ // Build credentials JSON based on what's available
28
+ const buildCredentialsJson = () => JSON.stringify({
29
+ project: projectId,
30
+ location: location,
31
+ ...(keyPath ? { keyFilePath: keyPath } : {})
32
+ });
33
+ describe('Constructor - Credential Formats', () => {
34
+ it('should accept ADC credentials format', () => {
35
+ const creds = JSON.stringify({
36
+ project: 'test-project',
37
+ location: 'us-central1'
38
+ });
39
+ const llm = new VertexLLM(creds);
40
+ expect(llm.Credentials.project).toBe('test-project');
41
+ expect(llm.Credentials.location).toBe('us-central1');
42
+ });
43
+ it('should accept service account JSON format', () => {
44
+ const creds = JSON.stringify({
45
+ type: 'service_account',
46
+ project_id: 'test-project',
47
+ private_key: '-----BEGIN PRIVATE KEY-----\ntest\n-----END PRIVATE KEY-----\n',
48
+ client_email: 'test@test.iam.gserviceaccount.com',
49
+ location: 'us-central1'
50
+ });
51
+ const llm = new VertexLLM(creds);
52
+ expect(llm.Credentials.project).toBe('test-project');
53
+ });
54
+ it('should accept keyFilePath format', () => {
55
+ const creds = JSON.stringify({
56
+ keyFilePath: '/path/to/key.json',
57
+ project: 'test-project',
58
+ location: 'us-central1'
59
+ });
60
+ const llm = new VertexLLM(creds);
61
+ expect(llm.Credentials.keyFilePath).toBe('/path/to/key.json');
62
+ });
63
+ it('should throw error for invalid JSON', () => {
64
+ expect(() => new VertexLLM('not json')).toThrow('Invalid Vertex AI credentials JSON');
65
+ });
66
+ it('should throw error for missing project', () => {
67
+ expect(() => new VertexLLM(JSON.stringify({ location: 'us-central1' })))
68
+ .toThrow('must include "project"');
69
+ });
70
+ it('should default location to us-central1', () => {
71
+ const creds = JSON.stringify({ project: 'test-project' });
72
+ const llm = new VertexLLM(creds);
73
+ expect(llm.Credentials.location).toBe('us-central1');
74
+ });
75
+ it('should use project_id over project if both provided', () => {
76
+ const creds = JSON.stringify({
77
+ project: 'wrong-project',
78
+ project_id: 'correct-project',
79
+ location: 'us-central1'
80
+ });
81
+ const llm = new VertexLLM(creds);
82
+ expect(llm.Credentials.project).toBe('correct-project');
83
+ });
84
+ });
85
+ describe('Instance Properties', () => {
86
+ let vertexLLM;
87
+ beforeEach(() => {
88
+ vertexLLM = new VertexLLM(buildCredentialsJson());
89
+ });
90
+ it('should create instance successfully', () => {
91
+ expect(vertexLLM).toBeInstanceOf(VertexLLM);
92
+ });
93
+ it('should expose GeminiClient getter (inherited)', async () => {
94
+ // GeminiClient requires async initialization - make a chat call to trigger it
95
+ const params = {
96
+ messages: [{ role: 'user', content: 'test' }],
97
+ model: 'gemini-2.0-flash-exp',
98
+ temperature: 0.7
99
+ };
100
+ // This will initialize the client (or fail gracefully if no credentials)
101
+ try {
102
+ await vertexLLM.ChatCompletion(params);
103
+ }
104
+ catch (error) {
105
+ // Expected to fail without real credentials
106
+ }
107
+ // Now the client should be initialized
108
+ expect(vertexLLM.GeminiClient).toBeDefined();
109
+ });
110
+ it('should expose Credentials getter', () => {
111
+ const creds = vertexLLM.Credentials;
112
+ expect(creds.project).toBe(projectId);
113
+ expect(creds.location).toBe(location);
114
+ });
115
+ it('should report streaming support (inherited from GeminiLLM)', () => {
116
+ expect(vertexLLM.SupportsStreaming).toBe(true);
117
+ });
118
+ });
119
+ describe('Chat Completion - Integration Tests', () => {
120
+ // Skip actual API calls in CI/CD - only run when credentials are available
121
+ const shouldRunIntegrationTests = process.env.VERTEX_PROJECT_ID &&
122
+ process.env.VERTEX_SERVICE_ACCOUNT_KEY_PATH;
123
+ let vertexLLM;
124
+ beforeEach(() => {
125
+ if (shouldRunIntegrationTests) {
126
+ vertexLLM = new VertexLLM(buildCredentialsJson());
127
+ }
128
+ });
129
+ it('should handle simple text completion', async () => {
130
+ if (!shouldRunIntegrationTests) {
131
+ console.log('Skipping integration test - credentials not configured');
132
+ return;
133
+ }
134
+ const params = {
135
+ messages: [
136
+ {
137
+ role: ChatMessageRole.user,
138
+ content: 'What is 2+2? Reply with just the number.'
139
+ }
140
+ ],
141
+ model: 'gemini-2.5-flash',
142
+ temperature: 0.1,
143
+ maxOutputTokens: 10
144
+ };
145
+ const result = await vertexLLM.ChatCompletion(params);
146
+ if (!result.success) {
147
+ console.error('Chat completion failed:', result.errorMessage);
148
+ console.error('Exception details:', JSON.stringify(result.exception, null, 2));
149
+ if (result.errorInfo) {
150
+ console.error('Error info:', JSON.stringify(result.errorInfo, null, 2));
151
+ }
152
+ }
153
+ expect(result.success).toBe(true);
154
+ expect(result.data.choices).toHaveLength(1);
155
+ expect(result.data.choices[0].message.content).toBeTruthy();
156
+ expect(result.data.choices[0].message.role).toBe(ChatMessageRole.assistant);
157
+ expect(result.data.usage).toBeInstanceOf(ModelUsage);
158
+ expect(result.data.usage.promptTokens).toBeGreaterThan(0);
159
+ expect(result.data.usage.completionTokens).toBeGreaterThan(0);
160
+ }, 30000);
161
+ it('should handle system messages (inherited from GeminiLLM)', async () => {
162
+ if (!shouldRunIntegrationTests) {
163
+ console.log('Skipping integration test - credentials not configured');
164
+ return;
165
+ }
166
+ const params = {
167
+ messages: [
168
+ {
169
+ role: ChatMessageRole.system,
170
+ content: 'You are a helpful math tutor. Always explain your answers.'
171
+ },
172
+ {
173
+ role: ChatMessageRole.user,
174
+ content: 'What is 5+3?'
175
+ }
176
+ ],
177
+ model: 'gemini-2.5-flash',
178
+ temperature: 0.5
179
+ };
180
+ const result = await vertexLLM.ChatCompletion(params);
181
+ if (!result.success) {
182
+ console.error('Chat completion failed:', result.errorMessage);
183
+ console.error('Exception details:', JSON.stringify(result.exception, null, 2));
184
+ if (result.errorInfo) {
185
+ console.error('Error info:', JSON.stringify(result.errorInfo, null, 2));
186
+ }
187
+ }
188
+ expect(result.success).toBe(true);
189
+ expect(result.data.choices[0].message.content).toContain('8');
190
+ }, 30000);
191
+ it('should handle conversation history (inherited from GeminiLLM)', async () => {
192
+ if (!shouldRunIntegrationTests) {
193
+ console.log('Skipping integration test - credentials not configured');
194
+ return;
195
+ }
196
+ const params = {
197
+ messages: [
198
+ {
199
+ role: ChatMessageRole.user,
200
+ content: 'My name is Alice.'
201
+ },
202
+ {
203
+ role: ChatMessageRole.assistant,
204
+ content: 'Hello Alice! Nice to meet you.'
205
+ },
206
+ {
207
+ role: ChatMessageRole.user,
208
+ content: 'What is my name?'
209
+ }
210
+ ],
211
+ model: 'gemini-2.5-flash',
212
+ temperature: 0.1
213
+ };
214
+ const result = await vertexLLM.ChatCompletion(params);
215
+ if (!result.success) {
216
+ console.error('Chat completion failed:', result.errorMessage);
217
+ console.error('Exception details:', JSON.stringify(result.exception, null, 2));
218
+ if (result.errorInfo) {
219
+ console.error('Error info:', JSON.stringify(result.errorInfo, null, 2));
220
+ }
221
+ }
222
+ expect(result.success).toBe(true);
223
+ expect(result.data.choices[0].message.content.toLowerCase()).toContain('alice');
224
+ }, 30000);
225
+ it.skip('should support streaming with callbacks (inherited from GeminiLLM)', async () => {
226
+ if (!shouldRunIntegrationTests) {
227
+ console.log('Skipping integration test - credentials not configured');
228
+ return;
229
+ }
230
+ const chunks = [];
231
+ let completeCalled = false;
232
+ const params = {
233
+ messages: [
234
+ {
235
+ role: ChatMessageRole.user,
236
+ content: 'Count from 1 to 3.'
237
+ }
238
+ ],
239
+ model: 'gemini-2.5-flash',
240
+ temperature: 0.1,
241
+ streaming: true,
242
+ streamingCallbacks: {
243
+ OnContent: (content) => {
244
+ chunks.push(content);
245
+ },
246
+ OnComplete: (result) => {
247
+ completeCalled = true;
248
+ expect(result.success).toBe(true);
249
+ },
250
+ OnError: (error) => {
251
+ throw new Error(`Streaming error: ${error}`);
252
+ }
253
+ }
254
+ };
255
+ const result = await vertexLLM.ChatCompletion(params);
256
+ if (!result.success) {
257
+ console.error('Chat completion failed:', result.errorMessage);
258
+ console.error('Exception details:', JSON.stringify(result.exception, null, 2));
259
+ if (result.errorInfo) {
260
+ console.error('Error info:', JSON.stringify(result.errorInfo, null, 2));
261
+ }
262
+ }
263
+ expect(result.success).toBe(true);
264
+ expect(completeCalled).toBe(true);
265
+ // Streaming should return final result in data
266
+ expect(result.data.choices).toHaveLength(1);
267
+ expect(result.data.choices[0].message.content).toBeTruthy();
268
+ expect(result.data.choices[0].message.content.length).toBeGreaterThan(0);
269
+ // Note: OnContent callbacks may or may not fire depending on provider implementation
270
+ // What matters is that streaming mode completes successfully
271
+ }, 30000);
272
+ it('should handle thinking/reasoning for Gemini 2.5+ models', async () => {
273
+ if (!shouldRunIntegrationTests) {
274
+ console.log('Skipping integration test - credentials not configured');
275
+ return;
276
+ }
277
+ const params = {
278
+ messages: [
279
+ {
280
+ role: ChatMessageRole.user,
281
+ content: 'Solve: If x + 5 = 12, what is x?'
282
+ }
283
+ ],
284
+ model: 'gemini-2.5-flash',
285
+ temperature: 0.3,
286
+ effortLevel: '50' // Medium thinking effort (string for compatibility)
287
+ };
288
+ const result = await vertexLLM.ChatCompletion(params);
289
+ if (!result.success) {
290
+ console.error('Chat completion failed:', result.errorMessage);
291
+ console.error('Exception details:', JSON.stringify(result.exception, null, 2));
292
+ if (result.errorInfo) {
293
+ console.error('Error info:', JSON.stringify(result.errorInfo, null, 2));
294
+ }
295
+ }
296
+ expect(result.success).toBe(true);
297
+ expect(result.data.choices[0].message.content).toBeTruthy();
298
+ // Note: thinking content may or may not be present depending on model version
299
+ }, 30000);
300
+ });
301
+ describe('Gemini 3 Models - Integration Tests', () => {
302
+ // Skip actual API calls in CI/CD - only run when credentials are available
303
+ const shouldRunIntegrationTests = process.env.VERTEX_PROJECT_ID &&
304
+ process.env.VERTEX_SERVICE_ACCOUNT_KEY_PATH;
305
+ let vertexLLM;
306
+ beforeEach(() => {
307
+ if (shouldRunIntegrationTests) {
308
+ // Gemini 3 preview models require 'global' location, not regional endpoints
309
+ // See: https://github.com/block/goose/issues/6186
310
+ const gemini3CredentialsJson = JSON.stringify({
311
+ project: projectId,
312
+ location: 'global', // Must use global for Gemini 3 preview models
313
+ ...(keyPath ? { keyFilePath: keyPath } : {})
314
+ });
315
+ vertexLLM = new VertexLLM(gemini3CredentialsJson);
316
+ }
317
+ });
318
+ it('should work with Gemini 3 Flash', async () => {
319
+ if (!shouldRunIntegrationTests) {
320
+ console.log('Skipping integration test - credentials not configured');
321
+ return;
322
+ }
323
+ const params = {
324
+ messages: [
325
+ {
326
+ role: ChatMessageRole.user,
327
+ content: 'What is the capital of France? Reply with just the city name.'
328
+ }
329
+ ],
330
+ model: 'gemini-3-flash-preview',
331
+ temperature: 0.1,
332
+ maxOutputTokens: 20
333
+ };
334
+ const result = await vertexLLM.ChatCompletion(params);
335
+ // Gemini 3 models may not be available in all projects (preview status)
336
+ if (!result.success) {
337
+ console.log('Gemini 3 Flash not available (preview), skipping:', result.errorMessage);
338
+ return; // Skip test if model not available
339
+ }
340
+ expect(result.success).toBe(true);
341
+ expect(result.data.choices).toHaveLength(1);
342
+ expect(result.data.choices[0].message.content).toBeTruthy();
343
+ expect(result.data.choices[0].message.content.toLowerCase()).toContain('paris');
344
+ }, 30000);
345
+ it('should work with Gemini 3 Pro for complex reasoning', async () => {
346
+ if (!shouldRunIntegrationTests) {
347
+ console.log('Skipping integration test - credentials not configured');
348
+ return;
349
+ }
350
+ const params = {
351
+ messages: [
352
+ {
353
+ role: ChatMessageRole.user,
354
+ content: 'Write a function in Python that calculates fibonacci numbers. Keep it concise.'
355
+ }
356
+ ],
357
+ model: 'gemini-3-pro-preview',
358
+ temperature: 0.3,
359
+ maxOutputTokens: 200,
360
+ effortLevel: '75' // High reasoning effort
361
+ };
362
+ const result = await vertexLLM.ChatCompletion(params);
363
+ // Gemini 3 models may not be available in all projects (preview status)
364
+ if (!result.success) {
365
+ console.log('Gemini 3 Pro not available (preview), skipping:', result.errorMessage);
366
+ return; // Skip test if model not available
367
+ }
368
+ expect(result.success).toBe(true);
369
+ expect(result.data.choices).toHaveLength(1);
370
+ const content = result.data.choices[0].message.content;
371
+ expect(content).toBeTruthy();
372
+ expect(content.toLowerCase()).toContain('def');
373
+ // Model may use "fib" or "fibonacci" as function name
374
+ expect(content.toLowerCase()).toMatch(/fib(onacci)?/);
375
+ }, 30000);
376
+ it('should handle Gemini 3 Pro Image for image generation', async () => {
377
+ if (!shouldRunIntegrationTests) {
378
+ console.log('Skipping integration test - credentials not configured');
379
+ return;
380
+ }
381
+ const params = {
382
+ messages: [
383
+ {
384
+ role: ChatMessageRole.user,
385
+ content: 'Describe what a blue sky looks like. Keep it brief.'
386
+ }
387
+ ],
388
+ model: 'gemini-3-pro-image-preview',
389
+ temperature: 0.5,
390
+ maxOutputTokens: 100
391
+ };
392
+ const result = await vertexLLM.ChatCompletion(params);
393
+ // Gemini 3 Pro Image may not be available in all projects (preview status)
394
+ if (!result.success) {
395
+ console.log('Gemini 3 Pro Image not available (preview), skipping:', result.errorMessage);
396
+ return; // Skip test if model not available
397
+ }
398
+ expect(result.success).toBe(true);
399
+ expect(result.data.choices).toHaveLength(1);
400
+ expect(result.data.choices[0].message.content).toBeTruthy();
401
+ }, 60000); // Increased timeout for slower image model
402
+ });
403
+ describe('Error Handling (inherited from GeminiLLM)', () => {
404
+ let vertexLLM;
405
+ beforeEach(() => {
406
+ vertexLLM = new VertexLLM(buildCredentialsJson());
407
+ });
408
+ it('should handle invalid model name gracefully', async () => {
409
+ const params = {
410
+ messages: [
411
+ {
412
+ role: ChatMessageRole.user,
413
+ content: 'Test message'
414
+ }
415
+ ],
416
+ model: 'nonexistent-model-xyz-123',
417
+ temperature: 0.5
418
+ };
419
+ const result = await vertexLLM.ChatCompletion(params);
420
+ expect(result.success).toBe(false);
421
+ expect(result.errorMessage).toBeTruthy();
422
+ expect(result.exception).toBeDefined();
423
+ expect(result.errorInfo).toBeDefined();
424
+ }, 30000);
425
+ it('should handle empty messages array', async () => {
426
+ const params = {
427
+ messages: [],
428
+ model: 'gemini-2.5-flash',
429
+ temperature: 0.5
430
+ };
431
+ const result = await vertexLLM.ChatCompletion(params);
432
+ expect(result).toBeDefined();
433
+ expect(result.success).toBeDefined();
434
+ }, 30000);
435
+ });
436
+ });
437
+ //# sourceMappingURL=vertexLLM.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vertexLLM.test.js","sourceRoot":"","sources":["../../src/__tests__/vertexLLM.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { EmbedTextParams, EmbedTextsParams, BaseEmbeddings, EmbedTextResult, EmbedTextsResult } from "@memberjunction/ai";
2
+ import { VertexAI } from '@google-cloud/vertexai';
3
+ export declare class VertexEmbedding extends BaseEmbeddings {
4
+ private _client;
5
+ private _projectId;
6
+ private _location;
7
+ constructor(apiKey: string, projectId: string, location?: string);
8
+ get Client(): VertexAI;
9
+ /**
10
+ * Embeds a single text using Google Vertex AI embedding models
11
+ */
12
+ EmbedText(params: EmbedTextParams): Promise<EmbedTextResult>;
13
+ /**
14
+ * Embeds multiple texts using Google Vertex AI embedding models
15
+ */
16
+ EmbedTexts(params: EmbedTextsParams): Promise<EmbedTextsResult>;
17
+ /**
18
+ * Get available embedding models from Vertex AI
19
+ */
20
+ GetEmbeddingModels(): Promise<any>;
21
+ }
22
+ export declare function LoadVertexEmbedding(): void;
23
+ //# sourceMappingURL=vertexEmbedding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vertexEmbedding.d.ts","sourceRoot":"","sources":["../../src/models/vertexEmbedding.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,cAAc,EAEd,eAAe,EACf,gBAAgB,EAEjB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAElD,qBACa,eAAgB,SAAQ,cAAc;IACjD,OAAO,CAAC,OAAO,CAAW;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAsB;IAgB/E,IAAW,MAAM,IAAI,QAAQ,CAE5B;IAED;;OAEG;IACU,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;IA0DzE;;OAEG;IACU,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA4E5E;;OAEG;IACU,kBAAkB,IAAI,OAAO,CAAC,GAAG,CAAC;CAahD;AAED,wBAAgB,mBAAmB,SAElC"}
@@ -0,0 +1,179 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.LoadVertexEmbedding = exports.VertexEmbedding = void 0;
10
+ const ai_1 = require("@memberjunction/ai");
11
+ const global_1 = require("@memberjunction/global");
12
+ const vertexai_1 = require("@google-cloud/vertexai");
13
+ let VertexEmbedding = class VertexEmbedding extends ai_1.BaseEmbeddings {
14
+ constructor(apiKey, projectId, location = 'us-central1') {
15
+ super(apiKey);
16
+ this._projectId = projectId;
17
+ this._location = location;
18
+ // Initialize Google Vertex AI client
19
+ this._client = new vertexai_1.VertexAI({
20
+ project: this._projectId,
21
+ location: this._location,
22
+ apiEndpoint: `${this._location}-aiplatform.googleapis.com`,
23
+ googleAuthOptions: {
24
+ keyFile: apiKey // assumes apiKey is a path to a service account key file
25
+ }
26
+ });
27
+ }
28
+ get Client() {
29
+ return this._client;
30
+ }
31
+ /**
32
+ * Embeds a single text using Google Vertex AI embedding models
33
+ */
34
+ async EmbedText(params) {
35
+ try {
36
+ // The model should be specified like "textembedding-gecko", "textembedding-gecko-multilingual"
37
+ const modelName = params.model || 'textembedding-gecko';
38
+ // Get the embedding model - Vertex API doesn't have a dedicated embedding method yet
39
+ // For now, we'll simulate embeddings through the generative model
40
+ const generativeModel = this._client.getGenerativeModel({
41
+ model: modelName
42
+ });
43
+ // Prepare request parameters
44
+ const requestParams = {
45
+ taskType: 'RETRIEVAL_QUERY', // or 'RETRIEVAL_DOCUMENT' or 'SEMANTIC_SIMILARITY'
46
+ };
47
+ // For demonstration purposes only - in a real implementation, we would need
48
+ // to use the actual Vertex AI embedding endpoint when available
49
+ // For now, we'll simulate with a fake embedding vector
50
+ const embeddingSize = 768; // Common embedding size
51
+ const mockEmbedding = Array(embeddingSize).fill(0).map(() => Math.random() - 0.5);
52
+ // Simulated response
53
+ const response = {
54
+ embeddings: [{ values: mockEmbedding }],
55
+ totalTokenCount: params.text.length / 4 // Rough estimate
56
+ };
57
+ const embeddings = response.embeddings;
58
+ if (embeddings && embeddings.length > 0 && embeddings[0].values) {
59
+ // Extract token count if available
60
+ const tokensUsed = response.totalTokenCount || 0;
61
+ return {
62
+ object: "object",
63
+ model: modelName,
64
+ ModelUsage: new ai_1.ModelUsage(tokensUsed, 0),
65
+ vector: embeddings[0].values
66
+ };
67
+ }
68
+ else {
69
+ throw new Error('No embeddings returned from Vertex AI');
70
+ }
71
+ }
72
+ catch (error) {
73
+ // Log error details for debugging
74
+ const errorInfo = ai_1.ErrorAnalyzer.analyzeError(error, 'Vertex');
75
+ console.error('Vertex embedding error:', errorInfo);
76
+ // Return error result
77
+ return {
78
+ object: "object",
79
+ model: params.model || 'textembedding-gecko',
80
+ ModelUsage: new ai_1.ModelUsage(0, 0),
81
+ vector: []
82
+ };
83
+ }
84
+ }
85
+ /**
86
+ * Embeds multiple texts using Google Vertex AI embedding models
87
+ */
88
+ async EmbedTexts(params) {
89
+ try {
90
+ // The model should be specified like "textembedding-gecko", "textembedding-gecko-multilingual"
91
+ const modelName = params.model || 'textembedding-gecko';
92
+ // Get the embedding model - Vertex API doesn't have a dedicated embedding method yet
93
+ // For now, we'll simulate embeddings through the generative model
94
+ const generativeModel = this._client.getGenerativeModel({
95
+ model: modelName
96
+ });
97
+ // Prepare request parameters
98
+ const requestParams = {
99
+ taskType: 'RETRIEVAL_DOCUMENT', // or 'RETRIEVAL_QUERY' or 'SEMANTIC_SIMILARITY'
100
+ };
101
+ // Process texts in batches (Vertex AI may have limits on batch size)
102
+ const batchSize = 5; // Adjust based on Vertex AI limitations
103
+ const vectors = [];
104
+ let totalTokens = 0;
105
+ for (let i = 0; i < params.texts.length; i += batchSize) {
106
+ const batch = params.texts.slice(i, i + batchSize);
107
+ // Create batch request
108
+ const batchRequests = batch.map(text => ({
109
+ content: { text }
110
+ }));
111
+ // For demonstration purposes only - in a real implementation, we would need
112
+ // to use the actual Vertex AI embedding endpoint when available
113
+ // For now, we'll simulate with fake embedding vectors
114
+ const embeddingSize = 768; // Common embedding size
115
+ // Simulated batch response
116
+ const batchResponse = {
117
+ embeddings: batch.map(() => ({
118
+ values: Array(embeddingSize).fill(0).map(() => Math.random() - 0.5)
119
+ })),
120
+ totalTokenCount: batch.reduce((sum, text) => sum + text.length / 4, 0) // Rough estimate
121
+ };
122
+ if (batchResponse && batchResponse.embeddings) {
123
+ // Extract embeddings
124
+ for (const embedding of batchResponse.embeddings) {
125
+ if (embedding.values) {
126
+ vectors.push(embedding.values);
127
+ }
128
+ }
129
+ // Add to token count
130
+ totalTokens += batchResponse.totalTokenCount || 0;
131
+ }
132
+ }
133
+ return {
134
+ object: "list",
135
+ model: modelName,
136
+ ModelUsage: new ai_1.ModelUsage(totalTokens, 0),
137
+ vectors: vectors
138
+ };
139
+ }
140
+ catch (error) {
141
+ // Log error details for debugging
142
+ const errorInfo = ai_1.ErrorAnalyzer.analyzeError(error, 'Vertex');
143
+ console.error('Vertex embedding error:', errorInfo);
144
+ // Return error result
145
+ return {
146
+ object: "list",
147
+ model: params.model || 'textembedding-gecko',
148
+ ModelUsage: new ai_1.ModelUsage(0, 0),
149
+ vectors: []
150
+ };
151
+ }
152
+ }
153
+ /**
154
+ * Get available embedding models from Vertex AI
155
+ */
156
+ async GetEmbeddingModels() {
157
+ try {
158
+ // In practice, you would list models from Vertex AI and filter for embedding models
159
+ // This is a simplified implementation
160
+ return [
161
+ "textembedding-gecko",
162
+ "textembedding-gecko-multilingual"
163
+ ];
164
+ }
165
+ catch (error) {
166
+ console.error('Error listing Vertex embedding models:', ai_1.ErrorAnalyzer.analyzeError(error, 'Vertex'));
167
+ return [];
168
+ }
169
+ }
170
+ };
171
+ exports.VertexEmbedding = VertexEmbedding;
172
+ exports.VertexEmbedding = VertexEmbedding = __decorate([
173
+ (0, global_1.RegisterClass)(ai_1.BaseEmbeddings, 'VertexEmbedding')
174
+ ], VertexEmbedding);
175
+ function LoadVertexEmbedding() {
176
+ // this does nothing but prevents the class from being removed by the tree shaker
177
+ }
178
+ exports.LoadVertexEmbedding = LoadVertexEmbedding;
179
+ //# sourceMappingURL=vertexEmbedding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vertexEmbedding.js","sourceRoot":"","sources":["../../src/models/vertexEmbedding.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@memberjunction/ai-vertex",
3
3
  "type": "module",
4
- "version": "4.4.0",
4
+ "version": "5.0.0",
5
5
  "description": "MemberJunction Wrapper for Google Vertex AI Models",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
@@ -24,9 +24,9 @@
24
24
  },
25
25
  "dependencies": {
26
26
  "@google/genai": "^1.40.0",
27
- "@memberjunction/ai": "4.4.0",
28
- "@memberjunction/ai-gemini": "4.4.0",
29
- "@memberjunction/global": "4.4.0"
27
+ "@memberjunction/ai": "5.0.0",
28
+ "@memberjunction/ai-gemini": "5.0.0",
29
+ "@memberjunction/global": "5.0.0"
30
30
  },
31
31
  "repository": {
32
32
  "type": "git",
package/README.md DELETED
@@ -1,83 +0,0 @@
1
- # @memberjunction/ai-vertex
2
-
3
- MemberJunction AI provider for Google Cloud Vertex AI. This package extends the Gemini provider to work with Google Cloud's enterprise Vertex AI platform, providing access to Gemini models through GCP authentication and project-based deployments.
4
-
5
- ## Architecture
6
-
7
- ```mermaid
8
- graph TD
9
- A["VertexLLM<br/>(Provider)"] -->|extends| B["GeminiLLM<br/>(@memberjunction/ai-gemini)"]
10
- B -->|extends| C["BaseLLM<br/>(@memberjunction/ai)"]
11
- A -->|overrides client creation| D["GoogleGenAI<br/>(Vertex Config)"]
12
- D -->|authenticates via| E["Google Cloud<br/>Service Account"]
13
- D -->|targets| F["GCP Project +<br/>Region"]
14
- C -->|registered via| G["@RegisterClass"]
15
-
16
- style A fill:#7c5295,stroke:#563a6b,color:#fff
17
- style B fill:#2d6a9f,stroke:#1a4971,color:#fff
18
- style C fill:#2d6a9f,stroke:#1a4971,color:#fff
19
- style D fill:#2d8659,stroke:#1a5c3a,color:#fff
20
- style E fill:#b8762f,stroke:#8a5722,color:#fff
21
- style F fill:#b8762f,stroke:#8a5722,color:#fff
22
- style G fill:#b8762f,stroke:#8a5722,color:#fff
23
- ```
24
-
25
- ## Features
26
-
27
- - **Gemini on Vertex**: Access Gemini Pro, Flash, and other models through Google Cloud
28
- - **Enterprise Authentication**: Google Cloud service account credentials
29
- - **Project Isolation**: Scoped to GCP project and region
30
- - **All Gemini Features**: Inherits chat, streaming, thinking/reasoning, and multimodal support from GeminiLLM
31
- - **VPC Service Controls**: Compatible with GCP network security boundaries
32
- - **Regional Deployment**: Deploy to specific GCP regions for data residency
33
-
34
- ## Installation
35
-
36
- ```bash
37
- npm install @memberjunction/ai-vertex
38
- ```
39
-
40
- ## Usage
41
-
42
- ```typescript
43
- import { VertexLLM } from '@memberjunction/ai-vertex';
44
-
45
- const llm = new VertexLLM('service-account-json');
46
-
47
- const result = await llm.ChatCompletion({
48
- model: 'gemini-2.5-pro',
49
- messages: [
50
- { role: 'user', content: 'Explain cloud AI architecture.' }
51
- ],
52
- temperature: 0.7
53
- });
54
-
55
- if (result.success) {
56
- console.log(result.data.choices[0].message.content);
57
- }
58
- ```
59
-
60
- ## Configuration
61
-
62
- The API key parameter accepts a JSON string containing GCP service account credentials. Additional settings for project and location are configured via `SetAdditionalSettings`:
63
-
64
- | Setting | Description |
65
- |---------|-------------|
66
- | `project` | GCP project ID |
67
- | `location` | GCP region (e.g., `us-central1`) |
68
-
69
- ## How It Works
70
-
71
- `VertexLLM` extends `GeminiLLM` and overrides the `createClient()` method to configure the `GoogleGenAI` client for Vertex AI instead of the public Gemini API. This provides GCP project-scoped access with service account authentication while inheriting all of GeminiLLM's capabilities.
72
-
73
- ## Class Registration
74
-
75
- Registered as `VertexLLM` via `@RegisterClass(BaseLLM, 'VertexLLM')`.
76
-
77
- ## Dependencies
78
-
79
- - `@memberjunction/ai` - Core AI abstractions
80
- - `@memberjunction/ai-gemini` - Gemini provider (parent class)
81
- - `@memberjunction/global` - Class registration
82
- - `@google/genai` - Google GenAI SDK
83
- - `google-auth-library` - Google Cloud authentication