Skip to content

Commit

Permalink
✨ feat: add vertex ai route
Browse files Browse the repository at this point in the history
  • Loading branch information
arvinxx committed Nov 6, 2024
1 parent ad3a154 commit 05754da
Show file tree
Hide file tree
Showing 13 changed files with 332 additions and 14 deletions.
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@
"@clerk/themes": "^2.1.37",
"@codesandbox/sandpack-react": "^2.19.9",
"@cyntler/react-doc-viewer": "^1.17.0",
"@google-cloud/vertexai": "^1.9.0",
"@google/generative-ai": "^0.21.0",
"@huggingface/inference": "^2.8.1",
"@icons-pack/react-simple-icons": "9.6.0",
Expand Down
38 changes: 38 additions & 0 deletions src/app/(backend)/webapi/chat/vertexai/route.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import { readFileSync } from 'node:fs';
import { resolve } from 'node:path';

import { getLLMConfig } from '@/config/llm';
import { AgentRuntime, ModelProvider } from '@/libs/agent-runtime';
import { LobeVertexAI } from '@/libs/agent-runtime/vertexai';
import { safeParseJSON } from '@/utils/safeParseJSON';

import { POST as UniverseRoute } from '../[provider]/route';

export const POST = async (req: Request) =>
UniverseRoute(req, {
createRuntime: () => {
const {
VERTEXAI_PROJECT,
VERTEXAI_LOCATION,
VERTEXAI_CREDENTIALS,
VERTEXAI_CREDENTIALS_PATH,
} = getLLMConfig();

const credentialsContent =
VERTEXAI_CREDENTIALS ??
(VERTEXAI_CREDENTIALS_PATH
? readFileSync(resolve(process.cwd(), VERTEXAI_CREDENTIALS_PATH), 'utf8')
: undefined);

const googleAuthOptions = credentialsContent ? safeParseJSON(credentialsContent) : undefined;

const instance = LobeVertexAI.initFromVertexAI({
googleAuthOptions: googleAuthOptions,
location: VERTEXAI_LOCATION,
project: VERTEXAI_PROJECT,
});

return new AgentRuntime(instance);
},
params: { provider: ModelProvider.VertexAI },
});
4 changes: 3 additions & 1 deletion src/app/(main)/settings/llm/ProviderList/providers.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import {
TaichuProviderCard,
TogetherAIProviderCard,
UpstageProviderCard,
VertexAIProviderCard,
ZeroOneProviderCard,
ZhiPuProviderCard,
} from '@/config/modelProviders';
Expand All @@ -34,8 +35,8 @@ import { useGithubProvider } from './Github';
import { useHuggingFaceProvider } from './HuggingFace';
import { useOllamaProvider } from './Ollama';
import { useOpenAIProvider } from './OpenAI';
import { useWenxinProvider } from './Wenxin';
import { useSenseNovaProvider } from './SenseNova';
import { useWenxinProvider } from './Wenxin';

export const useProviderList = (): ProviderItem[] => {
const AzureProvider = useAzureProvider();
Expand All @@ -55,6 +56,7 @@ export const useProviderList = (): ProviderItem[] => {
AnthropicProviderCard,
BedrockProvider,
GoogleProviderCard,
VertexAIProviderCard,
DeepSeekProviderCard,
HuggingFaceProvider,
OpenRouterProviderCard,
Expand Down
18 changes: 17 additions & 1 deletion src/config/llm.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,13 @@ export const getLLMConfig = () => {
GOOGLE_PROXY_URL: z.string().optional(),
GOOGLE_MODEL_LIST: z.string().optional(),

ENABLED_VERTEXAI: z.boolean(),
VERTEXAI_CREDENTIALS: z.string().optional(),
VERTEXAI_CREDENTIALS_PATH: z.string().optional(),
VERTEXAI_PROJECT: z.string().optional(),
VERTEXAI_LOCATION: z.string().optional(),
VERTEXAI_MODEL_LIST: z.string().optional(),

ENABLED_MOONSHOT: z.boolean(),
MOONSHOT_API_KEY: z.string().optional(),
MOONSHOT_MODEL_LIST: z.string().optional(),
Expand Down Expand Up @@ -177,6 +184,14 @@ export const getLLMConfig = () => {
GOOGLE_PROXY_URL: process.env.GOOGLE_PROXY_URL,
GOOGLE_MODEL_LIST: process.env.GOOGLE_MODEL_LIST,

ENABLED_VERTEXAI:
!!process.env.VERTEXAI_CREDENTIALS_PATH || !!process.env.VERTEXAI_CREDENTIALS,
VERTEXAI_CREDENTIALS_PATH: process.env.VERTEXAI_CREDENTIALS_PATH,
VERTEXAI_CREDENTIALS: process.env.VERTEXAI_CREDENTIALS,
VERTEXAI_LOCATION: process.env.VERTEXAI_LOCATION,
VERTEXAI_PROJECT: process.env.VERTEXAI_PROJECT,
VERTEXAI_MODEL_LIST: process.env.VERTEXAI_MODEL_LIST,

ENABLED_PERPLEXITY: !!process.env.PERPLEXITY_API_KEY,
PERPLEXITY_API_KEY: process.env.PERPLEXITY_API_KEY,
PERPLEXITY_MODEL_LIST: process.env.PERPLEXITY_MODEL_LIST,
Expand Down Expand Up @@ -291,7 +306,8 @@ export const getLLMConfig = () => {
HUGGINGFACE_PROXY_URL: process.env.HUGGINGFACE_PROXY_URL,
HUGGINGFACE_MODEL_LIST: process.env.HUGGINGFACE_MODEL_LIST,

ENABLED_SENSENOVA: !!process.env.SENSENOVA_ACCESS_KEY_ID && !!process.env.SENSENOVA_ACCESS_KEY_SECRET,
ENABLED_SENSENOVA:
!!process.env.SENSENOVA_ACCESS_KEY_ID && !!process.env.SENSENOVA_ACCESS_KEY_SECRET,
SENSENOVA_ACCESS_KEY_ID: process.env.SENSENOVA_ACCESS_KEY_ID,
SENSENOVA_ACCESS_KEY_SECRET: process.env.SENSENOVA_ACCESS_KEY_SECRET,
SENSENOVA_MODEL_LIST: process.env.SENSENOVA_MODEL_LIST,
Expand Down
4 changes: 4 additions & 0 deletions src/config/modelProviders/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import StepfunProvider from './stepfun';
import TaichuProvider from './taichu';
import TogetherAIProvider from './togetherai';
import UpstageProvider from './upstage';
import VertexAIProvider from './vertexai';
import WenxinProvider from './wenxin';
import ZeroOneProvider from './zeroone';
import ZhiPuProvider from './zhipu';
Expand Down Expand Up @@ -61,6 +62,7 @@ export const LOBE_DEFAULT_MODEL_LIST: ChatModelCard[] = [
SiliconCloudProvider.chatModels,
UpstageProvider.chatModels,
SparkProvider.chatModels,
VertexAIProvider.chatModels,
Ai21Provider.chatModels,
HunyuanProvider.chatModels,
WenxinProvider.chatModels,
Expand Down Expand Up @@ -100,6 +102,7 @@ export const DEFAULT_MODEL_PROVIDER_LIST = [
Ai360Provider,
TaichuProvider,
SiliconCloudProvider,
VertexAIProvider,
];

export const filterEnabledModels = (provider: ModelProviderCard) => {
Expand Down Expand Up @@ -140,6 +143,7 @@ export { default as StepfunProviderCard } from './stepfun';
export { default as TaichuProviderCard } from './taichu';
export { default as TogetherAIProviderCard } from './togetherai';
export { default as UpstageProviderCard } from './upstage';
export { default as VertexAIProviderCard } from './vertexai';
export { default as WenxinProviderCard } from './wenxin';
export { default as ZeroOneProviderCard } from './zeroone';
export { default as ZhiPuProviderCard } from './zhipu';
217 changes: 217 additions & 0 deletions src/config/modelProviders/vertexai.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,217 @@
import { ModelProviderCard } from '@/types/llm';

// ref: https://ai.google.dev/gemini-api/docs/models/gemini
const VertexAI: ModelProviderCard = {
chatModels: [
{
description:
'Gemini 1.5 Flash 是Google最新的多模态AI模型,具备快速处理能力,支持文本、图像和视频输入,适用于多种任务的高效扩展。',
displayName: 'Gemini 1.5 Flash',
enabled: true,
functionCall: true,
id: 'gemini-1.5-flash-latest',
maxOutput: 8192,
pricing: {
cachedInput: 0.018_75,
input: 0.075,
output: 0.3,
},
tokens: 1_000_000 + 8192,
vision: true,
},
{
description: 'Gemini 1.5 Flash 002 是一款高效的多模态模型,支持广泛应用的扩展。',
displayName: 'Gemini 1.5 Flash 002',
enabled: true,
functionCall: true,
id: 'gemini-1.5-flash-002',
maxOutput: 8192,
pricing: {
cachedInput: 0.018_75,
input: 0.075,
output: 0.3,
},
releasedAt: '2024-09-25',
tokens: 1_000_000 + 8192,
vision: true,
},
{
description: 'Gemini 1.5 Flash 001 是一款高效的多模态模型,支持广泛应用的扩展。',
displayName: 'Gemini 1.5 Flash 001',
functionCall: true,
id: 'gemini-1.5-flash-001',
maxOutput: 8192,
pricing: {
cachedInput: 0.018_75,
input: 0.075,
output: 0.3,
},
tokens: 1_000_000 + 8192,
vision: true,
},
{
description: 'Gemini 1.5 Flash 0827 提供了优化后的多模态处理能力,适用多种复杂任务场景。',
displayName: 'Gemini 1.5 Flash 0827',
functionCall: true,
id: 'gemini-1.5-flash-exp-0827',
maxOutput: 8192,
pricing: {
cachedInput: 0.018_75,
input: 0.075,
output: 0.3,
},
releasedAt: '2024-08-27',
tokens: 1_000_000 + 8192,
vision: true,
},

{
description:
'Gemini 1.5 Flash 8B 0924 是最新的实验性模型,在文本和多模态用例中都有显著的性能提升。',
displayName: 'Gemini 1.5 Flash 8B 0924',
functionCall: true,
id: 'gemini-1.5-flash-8b-exp-0924',
maxOutput: 8192,
pricing: {
cachedInput: 0.018_75,
input: 0.075,
output: 0.3,
},
releasedAt: '2024-09-24',
tokens: 1_000_000 + 8192,
vision: true,
},
{
description:
'Gemini 1.5 Pro 支持高达200万个tokens,是中型多模态模型的理想选择,适用于复杂任务的多方面支持。',
displayName: 'Gemini 1.5 Pro',
enabled: true,
functionCall: true,
id: 'gemini-1.5-pro-latest',
maxOutput: 8192,
pricing: {
cachedInput: 0.875,
input: 3.5,
output: 10.5,
},
releasedAt: '2024-02-15',
tokens: 2_000_000 + 8192,
vision: true,
},
{
description:
'Gemini 1.5 Pro 002 是最新的生产就绪模型,提供更高质量的输出,特别在数学、长上下文和视觉任务方面有显著提升。',
displayName: 'Gemini 1.5 Pro 002',
enabled: true,
functionCall: true,
id: 'gemini-1.5-pro-002',
maxOutput: 8192,
pricing: {
cachedInput: 0.315,
input: 1.25,
output: 2.5,
},
releasedAt: '2024-09-24',
tokens: 2_000_000 + 8192,
vision: true,
},
{
description: 'Gemini 1.5 Pro 001 是可扩展的多模态AI解决方案,支持广泛的复杂任务。',
displayName: 'Gemini 1.5 Pro 001',
functionCall: true,
id: 'gemini-1.5-pro-001',
maxOutput: 8192,
pricing: {
cachedInput: 0.875,
input: 3.5,
output: 10.5,
},
releasedAt: '2024-02-15',
tokens: 2_000_000 + 8192,
vision: true,
},
{
description: 'Gemini 1.5 Pro 0827 结合最新优化技术,带来更高效的多模态数据处理能力。',
displayName: 'Gemini 1.5 Pro 0827',
functionCall: true,
id: 'gemini-1.5-pro-exp-0827',
maxOutput: 8192,
pricing: {
cachedInput: 0.875,
input: 3.5,
output: 10.5,
},
releasedAt: '2024-08-27',
tokens: 2_000_000 + 8192,
vision: true,
},
{
description: 'Gemini 1.5 Pro 0801 提供出色的多模态处理能力,为应用开发带来更大灵活性。',
displayName: 'Gemini 1.5 Pro 0801',
functionCall: true,
id: 'gemini-1.5-pro-exp-0801',
maxOutput: 8192,
pricing: {
cachedInput: 0.875,
input: 3.5,
output: 10.5,
},
releasedAt: '2024-08-01',
tokens: 2_000_000 + 8192,
vision: true,
},
{
description: 'Gemini 1.0 Pro 是Google的高性能AI模型,专为广泛任务扩展而设计。',
displayName: 'Gemini 1.0 Pro',
id: 'gemini-1.0-pro-latest',
maxOutput: 2048,
pricing: {
input: 0.5,
output: 1.5,
},
releasedAt: '2023-12-06',
tokens: 30_720 + 2048,
},
{
description:
'Gemini 1.0 Pro 001 (Tuning) 提供稳定并可调优的性能,是复杂任务解决方案的理想选择。',
displayName: 'Gemini 1.0 Pro 001 (Tuning)',
functionCall: true,
id: 'gemini-1.0-pro-001',
maxOutput: 2048,
pricing: {
input: 0.5,
output: 1.5,
},
releasedAt: '2023-12-06',
tokens: 30_720 + 2048,
},
{
description: 'Gemini 1.0 Pro 002 (Tuning) 提供出色的多模态支持,专注于复杂任务的有效解决。',
displayName: 'Gemini 1.0 Pro 002 (Tuning)',
id: 'gemini-1.0-pro-002',
maxOutput: 2048,
pricing: {
input: 0.5,
output: 1.5,
},
releasedAt: '2023-12-06',
tokens: 30_720 + 2048,
},
],
checkModel: 'gemini-1.5-flash-latest',
description:
'Google 的 Gemini 系列是其最先进、通用的 AI模型,由 Google DeepMind 打造,专为多模态设计,支持文本、代码、图像、音频和视频的无缝理解与处理。适用于从数据中心到移动设备的多种环境,极大提升了AI模型的效率与应用广泛性。',
id: 'vertexai',
modelsUrl: 'https://cloud.google.com/vertex-ai/generative-ai/docs/learn/model-versioning',
name: 'VertexAI',
showApiKey: false,
showChecker: false,
smoothing: {
speed: 2,
text: true,
},
url: 'https://cloud.google.com/vertex-ai',
};

export default VertexAI;
4 changes: 4 additions & 0 deletions src/const/settings/llm.ts
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,10 @@ export const DEFAULT_LLM_CONFIG: UserModelProviderConfig = {
enabled: false,
enabledModels: filterEnabledModels(UpstageProviderCard),
},
vertexai: {
enabled: false,
enabledModels: filterEnabledModels(GoogleProviderCard),
},
wenxin: {
enabled: false,
enabledModels: filterEnabledModels(WenxinProviderCard),
Expand Down
1 change: 1 addition & 0 deletions src/libs/agent-runtime/error.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ export const AgentRuntimeErrorType = {
OllamaBizError: 'OllamaBizError',

InvalidBedrockCredentials: 'InvalidBedrockCredentials',
InvalidVertexCredentials: 'InvalidVertexCredentials',
StreamChunkError: 'StreamChunkError',

InvalidGithubToken: 'InvalidGithubToken',
Expand Down
Loading

0 comments on commit 05754da

Please sign in to comment.