diff --git a/.env.example b/.env.example index 2ba4fede..67a6b7c1 100644 --- a/.env.example +++ b/.env.example @@ -50,6 +50,11 @@ NEXT_PUBLIC_ACCESS_PERPLEXITY= PERPLEXITY_API_KEY= PERPLEXITY_ENDPOINT= +## Venice +NEXT_PUBLIC_ACCESS_VENICE= +VENICE_API_KEY= +VENICE_ENDPOINT= + # -------------- Search Engines -------------- ## Google diff --git a/Dockerfile b/Dockerfile index 925b32f7..987f7919 100644 --- a/Dockerfile +++ b/Dockerfile @@ -41,6 +41,8 @@ ENV AWS_ACCESS_KEY="" \ OPENAI_API_KEY="" \ OPENAI_API_ENDPOINT="" \ PERPLEXITY_API_KEY="" \ - PERPLEXITY_ENDPOINT="" + PERPLEXITY_ENDPOINT="" \ + VENICE_API_KEY="" \ + VENICE_ENDPOINT="" CMD ["pnpm", "start"] diff --git a/app/api/chat/messages/route.ts b/app/api/chat/messages/route.ts index 0090f6b4..68e4e00c 100644 --- a/app/api/chat/messages/route.ts +++ b/app/api/chat/messages/route.ts @@ -54,6 +54,11 @@ const perplexity = new OpenAI({ baseURL: process.env.PERPLEXITY_ENDPOINT ?? 'https://api.perplexity.ai/', }); +const venice = new OpenAI({ + apiKey: process.env.VENICE_API_KEY ?? '', + baseURL: process.env.VENICE_ENDPOINT ?? 'https://api.venice.ai/api/v1', +}); + export const runtime = 'edge'; export const dynamic = 'force-dynamic'; @@ -185,6 +190,16 @@ export async function POST(req: Request) { const output = OpenAIStream(response); return new StreamingTextResponse(output); } + case Provider.Venice: { + const response = await venice.chat.completions.create({ + model: config.model.model_id, + stream: true, + max_tokens: 4096, + messages, + }); + const output = OpenAIStream(response); + return new StreamingTextResponse(output); + } default: return new Response('Invalid Provider', { status: 400 }); } diff --git a/app/api/chat/messages/venice/route.ts b/app/api/chat/messages/venice/route.ts new file mode 100644 index 00000000..7f232c3d --- /dev/null +++ b/app/api/chat/messages/venice/route.ts @@ -0,0 +1,36 @@ +import { OpenAIStream, StreamingTextResponse } from 'ai'; +import OpenAI from 'openai'; + +import { ApiConfig } from '@/types/app'; + +export const runtime = 'edge'; + +export const dynamic = 'force-dynamic'; + +export async function POST(req: Request) { + const { + messages, + config, + stream, + }: { + messages: any[]; + config: ApiConfig; + stream: boolean; + } = await req.json(); + + const venice = new OpenAI({ + apiKey: config.provider?.apiKey ?? process.env.VENICE_API_KEY ?? '', + baseURL: config.provider?.endpoint ?? process.env.VENICE_ENDPOINT ?? 'https://api.venice.ai/api/v1', + }); + + const response = await venice.chat.completions.create({ + model: config.model.model_id, + stream: true, + max_tokens: 4096, + messages, + }); + + const output = OpenAIStream(response); + + return new StreamingTextResponse(output); +} diff --git a/components/layout/model-select.tsx b/components/layout/model-select.tsx index 07392297..71c1de08 100644 --- a/components/layout/model-select.tsx +++ b/components/layout/model-select.tsx @@ -30,6 +30,7 @@ import { model as HuggingFaceModel } from '@/config/provider/huggingface'; import { model as MistralModel } from '@/config/provider/mistral'; import { model as OpenAIModel } from '@/config/provider/openai'; import { model as PerplexityModel } from '@/config/provider/perplexity'; +import { model as VeniceModel } from '@/config/provider/venice'; import store from '@/hooks/store'; import { Model, SimpleModel } from '@/types/model'; import { ProviderSetting } from '@/types/settings'; @@ -162,6 +163,14 @@ export const ModelSelect = () => { currentProviderSettings={currentProviderSettings} configured={process.env['NEXT_PUBLIC_ACCESS_PERPLEXITY'] == 'true'} /> + { const [mistral, setMistral] = useState(currentProviderSettings?.Mistral || null); const [openAI, setOpenAI] = useState(currentProviderSettings?.OpenAI || null); const [perplexity, setPerplexity] = useState(currentProviderSettings?.Perplexity || null); + const [venice, setVenice] = useState(currentProviderSettings?.Venice || null); const [custom, setCustom] = useState(currentProviderSettings?.Custom || null); @@ -100,6 +101,7 @@ export const SettingsDialog = () => { Mistral: mistral!, OpenAI: openAI!, Perplexity: perplexity!, + Venice: venice!, Custom: custom!, }); @@ -203,6 +205,8 @@ export const SettingsDialog = () => { setMistral={setMistral} perplexity={perplexity} setPerplexity={setPerplexity} + venice={venice} + setVenice={setVenice} custom={custom} setCustom={setCustom} /> diff --git a/components/layout/settings-drawer.tsx b/components/layout/settings-drawer.tsx index e9a55688..6e6127f2 100644 --- a/components/layout/settings-drawer.tsx +++ b/components/layout/settings-drawer.tsx @@ -52,6 +52,7 @@ export const SettingsDrawer = () => { const [mistral, setMistral] = useState(currentProviderSettings?.Mistral || null); const [openAI, setOpenAI] = useState(currentProviderSettings?.OpenAI || null); const [perplexity, setPerplexity] = useState(currentProviderSettings?.Perplexity || null); + const [venice, setVenice] = useState(currentProviderSettings?.Venice || null); const [custom, setCustom] = useState(currentProviderSettings?.Custom || null); @@ -100,6 +101,7 @@ export const SettingsDrawer = () => { Mistral: mistral!, OpenAI: openAI!, Perplexity: perplexity!, + Venice: venice!, }); setCurrentSearchEngineSettings({ @@ -186,6 +188,8 @@ export const SettingsDrawer = () => { setMistral={setMistral} perplexity={perplexity} setPerplexity={setPerplexity} + venice={venice} + setVenice={setVenice} custom={custom} setCustom={setCustom} /> diff --git a/components/layout/settings/provider.tsx b/components/layout/settings/provider.tsx index 45656813..373aad3d 100644 --- a/components/layout/settings/provider.tsx +++ b/components/layout/settings/provider.tsx @@ -14,6 +14,7 @@ import { HuggingFaceProvider } from '@/components/layout/settings/provider/huggi import { MistralProvider } from '@/components/layout/settings/provider/mistral'; import { OpenAIProvider } from '@/components/layout/settings/provider/openai'; import { PerplexityProvider } from '@/components/layout/settings/provider/perplexity'; +import { VeniceProvider } from '@/components/layout/settings/provider/venice'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/custom/select'; import { Provider, Providers } from '@/config/provider'; import { ProviderSetting } from '@/types/settings'; @@ -43,6 +44,8 @@ export const ProviderSettings = ({ setOpenAI, perplexity, setPerplexity, + venice, + setVenice, custom, setCustom, @@ -71,6 +74,8 @@ export const ProviderSettings = ({ setOpenAI: (value: ProviderSetting['OpenAI'] | null) => void; perplexity: ProviderSetting['Perplexity'] | null; setPerplexity: (value: ProviderSetting['Perplexity'] | null) => void; + venice: ProviderSetting['Venice'] | null; + setVenice: (value: ProviderSetting['Venice'] | null) => void; custom: ProviderSetting['Custom'] | null; setCustom: (value: ProviderSetting['Custom'] | null) => void; @@ -103,6 +108,8 @@ export const ProviderSettings = ({ return ; case Provider.Perplexity: return ; + case Provider.Venice: + return ; case Provider.Custom: return ; default: diff --git a/components/layout/settings/provider/venice.tsx b/components/layout/settings/provider/venice.tsx new file mode 100644 index 00000000..d6842675 --- /dev/null +++ b/components/layout/settings/provider/venice.tsx @@ -0,0 +1,35 @@ +import { Input } from '@/components/ui/custom/input'; +import { ProviderSetting } from '@/types/settings'; + +export const VeniceProvider = ({ venice, setVenice }: { venice: ProviderSetting['Venice'] | null; setVenice: (value: ProviderSetting['Venice'] | null) => void }) => { + return ( +
+
+

Venice API Key

+ { + setVenice({ + apiKey: e.target.value, + }); + }} + /> +
+
+

Venice Endpoint

+ { + setVenice({ + endpoint: e.target.value, + }); + }} + /> +
+
+ ); +}; diff --git a/config/provider/index.ts b/config/provider/index.ts index a72dabd0..a3de64ee 100644 --- a/config/provider/index.ts +++ b/config/provider/index.ts @@ -9,6 +9,7 @@ import { HuggingFaceModelId, HuggingFaceModelName } from '@/config/provider/hugg import { MistralModelId, MistralModelName } from '@/config/provider/mistral'; import { OpenAIModelId, OpenAIModelName } from '@/config/provider/openai'; import { PerplexityModelId, PerplexityModelName } from '@/config/provider/perplexity'; +import { VeniceModelId, VeniceModelName } from '@/config/provider/venice'; export type AllModelId = | AmazonModelId @@ -21,7 +22,8 @@ export type AllModelId = | MistralModelId | GoogleModelId | OpenAIModelId - | PerplexityModelId; + | PerplexityModelId + | VeniceModelId; export type AllModelName = | AmazonModelName @@ -34,7 +36,8 @@ export type AllModelName = | MistralModelName | GoogleModelName | OpenAIModelName - | PerplexityModelName; + | PerplexityModelName + | VeniceModelName; export enum Provider { Amazon = 'Amazon', @@ -48,6 +51,7 @@ export enum Provider { HuggingFace = 'HuggingFace', Mistral = 'Mistral', Perplexity = 'Perplexity', + Venice = 'Venice', Custom = 'Custom', } @@ -100,6 +104,10 @@ export const Providers: { id: 'perplexity', name: Provider.Perplexity, }, + { + id: 'venice', + name: Provider.Venice, + }, { id: 'custom', name: Provider.Custom, diff --git a/docker-compose.yml b/docker-compose.yml index a39ccd18..5ac5a94a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -34,6 +34,9 @@ services: - PERPLEXITY_API_KEY= - PERPLEXITY_ENDPOINT= + + - VENICE_API_KEY= + - VENICE_ENDPOINT= restart: always ports: - 3000:3000 diff --git a/public/img/Venice.png b/public/img/Venice.png new file mode 100644 index 00000000..473d98c3 Binary files /dev/null and b/public/img/Venice.png differ diff --git a/types/settings.ts b/types/settings.ts index 8793fafc..918266c6 100644 --- a/types/settings.ts +++ b/types/settings.ts @@ -87,6 +87,11 @@ export interface PerplexitySettings { endpoint?: string; } +export interface VeniceSettings { + apiKey?: string; + endpoint?: string; +} + export type CustomSettings = SingleCustomSettings[]; export interface SingleCustomSettings { @@ -108,6 +113,7 @@ export interface ProviderSetting { [Provider.HuggingFace]?: HuggingFaceSettings; [Provider.Mistral]?: MistralSettings; [Provider.Perplexity]?: PerplexitySettings; + [Provider.Venice]?: VeniceSettings; [Provider.Custom]?: CustomSettings; } @@ -123,4 +129,5 @@ export type SpecifiedProviderSetting = | HuggingFaceSettings | MistralSettings | PerplexitySettings + | VeniceSettings | SingleCustomSettings;