diff --git a/servers/tools-pve/litellm/.env.example b/servers/tools-pve/litellm/.env.example index f433c47..481f44a 100644 --- a/servers/tools-pve/litellm/.env.example +++ b/servers/tools-pve/litellm/.env.example @@ -7,3 +7,6 @@ ZENMUX_SUBSCRIPTION_API_KEY= ZENMUX_PAYG_API_KEY= OPENROUTER_API_KEY= GOOGLE_AI_STUDIO_API_KEY= +VERTEXAI_ENABLED=false +VERTEXAI_PROJECT= +VERTEXAI_LOCATION=global diff --git a/servers/tools-pve/litellm/compose.yaml b/servers/tools-pve/litellm/compose.yaml index 661b489..a534779 100644 --- a/servers/tools-pve/litellm/compose.yaml +++ b/servers/tools-pve/litellm/compose.yaml @@ -38,6 +38,10 @@ services: ZENMUX_PAYG_API_KEY: ${ZENMUX_PAYG_API_KEY:-} OPENROUTER_API_KEY: ${OPENROUTER_API_KEY:-} GOOGLE_AI_STUDIO_API_KEY: ${GOOGLE_AI_STUDIO_API_KEY:-} + VERTEXAI_ENABLED: ${VERTEXAI_ENABLED:-false} + VERTEXAI_PROJECT: ${VERTEXAI_PROJECT:-} + VERTEXAI_LOCATION: ${VERTEXAI_LOCATION:-global} + GOOGLE_APPLICATION_CREDENTIALS: /tokens/google/adc.json CHATGPT_TOKEN_DIR: /tokens/chatgpt XAI_OAUTH_TOKEN_DIR: /tokens/xai LITELLM_LOG: WARNING diff --git a/servers/tools-pve/litellm/models.yaml b/servers/tools-pve/litellm/models.yaml index 156fa9f..867522d 100644 --- a/servers/tools-pve/litellm/models.yaml +++ b/servers/tools-pve/litellm/models.yaml @@ -13,6 +13,11 @@ google_ai_studio: gemini-flash-latest: gemini-flash-latest gemini-flash-lite-latest: gemini-flash-lite-latest gemini-pro-latest: gemini-pro-latest + gemini-embedding-2-studio: gemini-embedding-2 +google_vertex: + gemini-flash-vertex: gemini-3.8-flash + gemini-flash-lite-vertex: gemini-3.5-flash-lite + gemini-pro-vertex: gemini-3.1-pro-preview # 已有 Hindsight 部署用过的候选模型;本代理仍需独立授权与请求验收。 # renderer 在实际 token 出现前排除这些路线。 chatgpt: diff --git a/servers/tools-pve/litellm/render_config.py b/servers/tools-pve/litellm/render_config.py index 091d7f1..e31a34e 100644 --- a/servers/tools-pve/litellm/render_config.py +++ b/servers/tools-pve/litellm/render_config.py @@ -34,6 +34,11 @@ def build_config(catalog, env, exists): if env.get('GOOGLE_AI_STUDIO_API_KEY'): for alias, model in catalog['google_ai_studio'].items(): add(alias, 'gemini/' + model, 'GOOGLE_AI_STUDIO_API_KEY') + if env.get('VERTEXAI_ENABLED', '').lower() == 'true' and env.get('VERTEXAI_PROJECT'): + for alias, model in catalog.get('google_vertex', {}).items(): + add(alias, 'vertex_ai/' + model, + vertex_project='os.environ/VERTEXAI_PROJECT', + vertex_location='os.environ/VERTEXAI_LOCATION') for provider, token_var, default_dir in [ ('chatgpt', 'CHATGPT_TOKEN_DIR', '/tokens/chatgpt'), ('xai', 'XAI_OAUTH_TOKEN_DIR', '/tokens/xai'), diff --git a/servers/tools-pve/litellm/test_config.py b/servers/tools-pve/litellm/test_config.py index b62fc01..718c120 100644 --- a/servers/tools-pve/litellm/test_config.py +++ b/servers/tools-pve/litellm/test_config.py @@ -9,6 +9,7 @@ class ConfigTests(unittest.TestCase): 'zenmux': {'claude-sonnet-latest': 'anthropic/claude-sonnet-5.5'}, 'openrouter': {'glm-latest': 'z-ai/glm-5.3-prime'}, 'google_ai_studio': {'gemini-latest': 'gemini-test'}, + 'google_vertex': {'gemini-vertex': 'gemini-vertex-test'}, 'chatgpt': {'codex-latest': 'gpt-test'}, 'xai': {'grok-latest': 'grok-test'}, } @@ -44,6 +45,15 @@ class ConfigTests(unittest.TestCase): path.write_text('{"access_token": "fixture-only"}') self.assertTrue(oauth_ready(path)) + def test_vertex_requires_explicit_enable_and_project(self): + for env in ({'VERTEXAI_PROJECT': 'test-project'}, {'VERTEXAI_ENABLED': 'true'}): + self.assertEqual(build_config(self.catalog, env, lambda _: False)['model_list'], []) + routes = build_config(self.catalog, {'VERTEXAI_ENABLED': 'true', + 'VERTEXAI_PROJECT': 'test-project'}, lambda _: False)['model_list'] + self.assertEqual(routes[0]['litellm_params']['model'], 'vertex_ai/gemini-vertex-test') + self.assertEqual(routes[0]['litellm_params']['vertex_project'], 'os.environ/VERTEXAI_PROJECT') + self.assertNotIn('api_key', routes[0]['litellm_params']) + if __name__ == '__main__': unittest.main()