vertex-ai-proxy 1.2.1 → 1.3.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,328 @@
1
+ /**
2
+ * Vertex AI Model Region Discovery v2
3
+ *
4
+ * Discovers which Claude models are available in which regions
5
+ * by testing each known model in each region.
6
+ */
7
+ import * as fs from 'fs';
8
+ import * as path from 'path';
9
+ import * as os from 'os';
10
+ import { GoogleAuth } from 'google-auth-library';
11
+ // ============================================================================
12
+ // Constants
13
+ // ============================================================================
14
+ const DATA_DIR = path.join(os.homedir(), '.vertex_proxy');
15
+ const CACHE_FILE = path.join(DATA_DIR, 'model-regions.json');
16
+ const CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours
17
+ // All known Vertex AI regions that support Claude
18
+ export const ALL_REGIONS = [
19
+ 'us-central1',
20
+ 'us-east1',
21
+ 'us-east4',
22
+ 'us-east5',
23
+ 'us-south1',
24
+ 'us-west1',
25
+ 'us-west4',
26
+ 'europe-west1',
27
+ 'europe-west2',
28
+ 'europe-west3',
29
+ 'europe-west4',
30
+ 'europe-west9',
31
+ 'asia-east1',
32
+ 'asia-east2',
33
+ 'asia-northeast1',
34
+ 'asia-northeast3',
35
+ 'asia-south1',
36
+ 'asia-southeast1',
37
+ 'australia-southeast1',
38
+ 'me-central1',
39
+ 'me-west1',
40
+ 'northamerica-northeast1',
41
+ 'southamerica-east1'
42
+ ];
43
+ // Known Claude model versions to check
44
+ export const CLAUDE_MODELS = [
45
+ 'claude-opus-4-5@20251101',
46
+ 'claude-sonnet-4-5@20250929',
47
+ 'claude-sonnet-4@20250514',
48
+ 'claude-haiku-4-5@20251001',
49
+ 'claude-opus-4@20250410',
50
+ 'claude-3-5-sonnet-v2@20241022',
51
+ 'claude-3-5-sonnet@20240620',
52
+ 'claude-3-5-haiku@20241022',
53
+ 'claude-3-opus@20240229',
54
+ 'claude-3-sonnet@20240229',
55
+ 'claude-3-haiku@20240307'
56
+ ];
57
+ // Gemini models - usually available in different regions
58
+ export const GEMINI_MODELS = [
59
+ 'gemini-3-pro-preview',
60
+ 'gemini-3-pro-image-preview',
61
+ 'gemini-2.5-pro',
62
+ 'gemini-2.5-flash',
63
+ 'gemini-2.5-flash-lite',
64
+ 'gemini-2.0-flash',
65
+ 'gemini-1.5-pro',
66
+ 'gemini-1.5-flash'
67
+ ];
68
+ // ============================================================================
69
+ // Cache Management
70
+ // ============================================================================
71
+ function ensureDataDir() {
72
+ if (!fs.existsSync(DATA_DIR)) {
73
+ fs.mkdirSync(DATA_DIR, { recursive: true });
74
+ }
75
+ }
76
+ export function loadRegionCache() {
77
+ try {
78
+ if (fs.existsSync(CACHE_FILE)) {
79
+ const data = JSON.parse(fs.readFileSync(CACHE_FILE, 'utf8'));
80
+ return data;
81
+ }
82
+ }
83
+ catch (e) { }
84
+ return null;
85
+ }
86
+ export function saveRegionCache(cache) {
87
+ ensureDataDir();
88
+ fs.writeFileSync(CACHE_FILE, JSON.stringify(cache, null, 2));
89
+ }
90
+ export function isCacheValid(cache, projectId) {
91
+ if (!cache)
92
+ return false;
93
+ if (cache.projectId !== projectId)
94
+ return false;
95
+ if (Date.now() - cache.lastUpdated > CACHE_TTL_MS)
96
+ return false;
97
+ return true;
98
+ }
99
+ // ============================================================================
100
+ // Model Discovery
101
+ // ============================================================================
102
+ async function getAccessToken() {
103
+ const auth = new GoogleAuth({ scopes: 'https://www.googleapis.com/auth/cloud-platform' });
104
+ const client = await auth.getClient();
105
+ const tokenResponse = await client.getAccessToken();
106
+ return tokenResponse.token || '';
107
+ }
108
+ /**
109
+ * Check if a Claude model is available in a specific region
110
+ * by attempting a minimal API call
111
+ */
112
+ async function checkClaudeModelInRegion(projectId, region, modelId, accessToken) {
113
+ // Try to make a minimal rawPredict call with very small input
114
+ const url = `https://${region}-aiplatform.googleapis.com/v1/projects/${projectId}/locations/${region}/publishers/anthropic/models/${modelId}:rawPredict`;
115
+ const testRequest = {
116
+ anthropic_version: 'vertex-2023-10-16',
117
+ max_tokens: 1,
118
+ messages: [{ role: 'user', content: 'hi' }]
119
+ };
120
+ try {
121
+ const response = await fetch(url, {
122
+ method: 'POST',
123
+ headers: {
124
+ 'Authorization': `Bearer ${accessToken}`,
125
+ 'Content-Type': 'application/json'
126
+ },
127
+ body: JSON.stringify(testRequest),
128
+ signal: AbortSignal.timeout(15000)
129
+ });
130
+ // Model is available if we get a successful response OR a rate limit error
131
+ // (rate limit means the model exists but we hit quota)
132
+ if (response.ok) {
133
+ return { available: true };
134
+ }
135
+ const text = await response.text();
136
+ // Rate limit or quota exceeded = model exists
137
+ if (response.status === 429 || text.includes('quota') || text.includes('rate')) {
138
+ return { available: true };
139
+ }
140
+ // Model not found in this region
141
+ if (response.status === 404 ||
142
+ text.includes('not found') ||
143
+ text.includes('does not exist') ||
144
+ text.includes('not supported') ||
145
+ text.includes('is not available')) {
146
+ return { available: false };
147
+ }
148
+ // Permission denied might mean model exists but not enabled
149
+ if (response.status === 403 && text.includes('permission')) {
150
+ return { available: false, error: 'permission_denied' };
151
+ }
152
+ // Other errors - assume not available but log
153
+ return { available: false, error: `${response.status}: ${text.slice(0, 100)}` };
154
+ }
155
+ catch (e) {
156
+ if (e.name === 'TimeoutError' || e.message?.includes('timeout')) {
157
+ return { available: false, error: 'timeout' };
158
+ }
159
+ return { available: false, error: e.message?.slice(0, 100) };
160
+ }
161
+ }
162
+ /**
163
+ * Check if a Gemini model is available in a specific region
164
+ */
165
+ async function checkGeminiModelInRegion(projectId, region, modelId, accessToken) {
166
+ const url = `https://${region}-aiplatform.googleapis.com/v1/projects/${projectId}/locations/${region}/publishers/google/models/${modelId}:generateContent`;
167
+ const testRequest = {
168
+ contents: [{ role: 'user', parts: [{ text: 'hi' }] }],
169
+ generationConfig: { maxOutputTokens: 1 }
170
+ };
171
+ try {
172
+ const response = await fetch(url, {
173
+ method: 'POST',
174
+ headers: {
175
+ 'Authorization': `Bearer ${accessToken}`,
176
+ 'Content-Type': 'application/json'
177
+ },
178
+ body: JSON.stringify(testRequest),
179
+ signal: AbortSignal.timeout(15000)
180
+ });
181
+ if (response.ok) {
182
+ return { available: true };
183
+ }
184
+ const text = await response.text();
185
+ if (response.status === 429 || text.includes('quota') || text.includes('rate')) {
186
+ return { available: true };
187
+ }
188
+ if (response.status === 404 || text.includes('not found')) {
189
+ return { available: false };
190
+ }
191
+ return { available: false, error: `${response.status}` };
192
+ }
193
+ catch (e) {
194
+ return { available: false, error: e.message?.slice(0, 50) };
195
+ }
196
+ }
197
+ export async function discoverModelRegions(options) {
198
+ const { projectId, regions = ALL_REGIONS, models = CLAUDE_MODELS, includeGemini = false, onProgress, concurrency = 3 // Lower concurrency to avoid rate limits
199
+ } = options;
200
+ const accessToken = await getAccessToken();
201
+ const cache = {
202
+ version: 2,
203
+ projectId,
204
+ lastUpdated: Date.now(),
205
+ models: {}
206
+ };
207
+ const allModels = [...models];
208
+ if (includeGemini) {
209
+ allModels.push(...GEMINI_MODELS);
210
+ }
211
+ let completed = 0;
212
+ const total = allModels.length * regions.length;
213
+ // Process each model
214
+ for (const modelId of allModels) {
215
+ const isGemini = GEMINI_MODELS.includes(modelId);
216
+ const availableRegions = [];
217
+ const checkedRegions = [];
218
+ // Check regions in batches
219
+ for (let i = 0; i < regions.length; i += concurrency) {
220
+ const batch = regions.slice(i, i + concurrency);
221
+ const results = await Promise.all(batch.map(async (region) => {
222
+ onProgress?.({
223
+ total,
224
+ completed,
225
+ currentModel: modelId,
226
+ currentRegion: region
227
+ });
228
+ const result = isGemini
229
+ ? await checkGeminiModelInRegion(projectId, region, modelId, accessToken)
230
+ : await checkClaudeModelInRegion(projectId, region, modelId, accessToken);
231
+ completed++;
232
+ return { region, available: result.available, error: result.error };
233
+ }));
234
+ for (const { region, available, error } of results) {
235
+ checkedRegions.push(region);
236
+ if (available) {
237
+ availableRegions.push(region);
238
+ }
239
+ }
240
+ // Small delay between batches to avoid rate limiting
241
+ await new Promise(resolve => setTimeout(resolve, 200));
242
+ }
243
+ cache.models[modelId] = {
244
+ modelId,
245
+ provider: isGemini ? 'google' : 'anthropic',
246
+ availableRegions,
247
+ checkedRegions,
248
+ lastChecked: Date.now()
249
+ };
250
+ }
251
+ saveRegionCache(cache);
252
+ return cache;
253
+ }
254
+ // ============================================================================
255
+ // Helper Functions
256
+ // ============================================================================
257
+ /**
258
+ * Get the best region for a model based on cache
259
+ */
260
+ export function getBestRegion(modelId, preferredRegions) {
261
+ const cache = loadRegionCache();
262
+ if (!cache)
263
+ return null;
264
+ const modelInfo = cache.models[modelId];
265
+ if (!modelInfo || modelInfo.availableRegions.length === 0)
266
+ return null;
267
+ // Prefer requested regions
268
+ if (preferredRegions) {
269
+ for (const region of preferredRegions) {
270
+ if (modelInfo.availableRegions.includes(region)) {
271
+ return region;
272
+ }
273
+ }
274
+ }
275
+ // Default priority: us-east5 > us-central1 > europe-west1
276
+ const priority = ['us-east5', 'us-central1', 'europe-west1', 'us-east1'];
277
+ for (const region of priority) {
278
+ if (modelInfo.availableRegions.includes(region)) {
279
+ return region;
280
+ }
281
+ }
282
+ return modelInfo.availableRegions[0];
283
+ }
284
+ /**
285
+ * Get all regions for a model
286
+ */
287
+ export function getModelRegions(modelId) {
288
+ const cache = loadRegionCache();
289
+ if (!cache)
290
+ return [];
291
+ const modelInfo = cache.models[modelId];
292
+ return modelInfo?.availableRegions || [];
293
+ }
294
+ /**
295
+ * Format cache for display
296
+ */
297
+ export function formatCacheForDisplay(cache) {
298
+ const lines = [];
299
+ lines.push(`Model Region Cache (v${cache.version})`);
300
+ lines.push(`${'='.repeat(50)}`);
301
+ lines.push(`Project: ${cache.projectId}`);
302
+ lines.push(`Updated: ${new Date(cache.lastUpdated).toISOString()}`);
303
+ lines.push(`Age: ${Math.round((Date.now() - cache.lastUpdated) / 1000 / 60)} minutes`);
304
+ lines.push(``);
305
+ // Group by provider
306
+ const byProvider = { anthropic: [], google: [] };
307
+ for (const model of Object.values(cache.models)) {
308
+ byProvider[model.provider]?.push(model);
309
+ }
310
+ const providerNames = {
311
+ anthropic: '🤖 Claude Models',
312
+ google: '✨ Gemini Models'
313
+ };
314
+ for (const [provider, models] of Object.entries(byProvider)) {
315
+ if (models.length === 0)
316
+ continue;
317
+ lines.push(`\n${providerNames[provider] || provider}`);
318
+ lines.push(`${'─'.repeat(50)}`);
319
+ for (const model of models.sort((a, b) => a.modelId.localeCompare(b.modelId))) {
320
+ const regionCount = model.availableRegions.length;
321
+ const status = regionCount > 0 ? `✓ ${regionCount} regions` : '✗ not available';
322
+ lines.push(` ${model.modelId}`);
323
+ lines.push(` ${status}: ${model.availableRegions.join(', ') || 'none'}`);
324
+ }
325
+ }
326
+ return lines.join('\n');
327
+ }
328
+ //# sourceMappingURL=regions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regions.js","sourceRoot":"","sources":["../src/regions.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vertex-ai-proxy",
3
- "version": "1.2.1",
3
+ "version": "1.3.0",
4
4
  "description": "OpenAI-compatible proxy for Google Vertex AI (Claude + Gemini) with automatic failover, retries, and prompt caching",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",