Cole Medin commited on
Commit
5f6a595
·
unverified ·
2 Parent(s): ca99ed5 4660e5b

Merge pull request #60 from ZerxZ/main

Browse files

chore: Add environment variables for OpenAI Like integration

.env.example CHANGED
@@ -29,6 +29,12 @@ GOOGLE_GENERATIVE_AI_API_KEY=
29
  # EXAMPLE http://localhost:11434
30
  OLLAMA_API_BASE_URL=
31
 
 
 
 
 
 
 
32
  # Get your Mistral API Key by following these instructions -
33
  # https://console.mistral.ai/api-keys/
34
  # You only need this environment variable set if you want to use Mistral models
 
29
  # EXAMPLE http://localhost:11434
30
  OLLAMA_API_BASE_URL=
31
 
32
+ # You only need this environment variable set if you want to use OpenAI Like models
33
+ OPENAI_LIKE_API_BASE_URL=
34
+
35
+ # Get your OpenAI Like API Key
36
+ OPENAI_LIKE_API_KEY=
37
+
38
  # Get your Mistral API Key by following these instructions -
39
  # https://console.mistral.ai/api-keys/
40
  # You only need this environment variable set if you want to use Mistral models
app/components/chat/BaseChat.tsx CHANGED
@@ -28,7 +28,7 @@ const ModelSelector = ({ model, setModel, modelList, providerList }) => {
28
  const [provider, setProvider] = useState(DEFAULT_PROVIDER);
29
  return (
30
  <div className="mb-2">
31
- <select
32
  value={provider}
33
  onChange={(e) => {
34
  setProvider(e.target.value);
@@ -42,9 +42,12 @@ const ModelSelector = ({ model, setModel, modelList, providerList }) => {
42
  {provider}
43
  </option>
44
  ))}
45
- <option key="Ollama" value="Ollama">
46
- Ollama
47
- </option>
 
 
 
48
  </select>
49
  <select
50
  value={model}
@@ -263,4 +266,4 @@ export const BaseChat = React.forwardRef<HTMLDivElement, BaseChatProps>(
263
  </div>
264
  );
265
  },
266
- );
 
28
  const [provider, setProvider] = useState(DEFAULT_PROVIDER);
29
  return (
30
  <div className="mb-2">
31
+ <select
32
  value={provider}
33
  onChange={(e) => {
34
  setProvider(e.target.value);
 
42
  {provider}
43
  </option>
44
  ))}
45
+ <option key="Ollama" value="Ollama">
46
+ Ollama
47
+ </option>
48
+ <option key="OpenAILike" value="OpenAILike">
49
+ OpenAILike
50
+ </option>
51
  </select>
52
  <select
53
  value={model}
 
266
  </div>
267
  );
268
  },
269
+ );
app/lib/.server/llm/api-key.ts CHANGED
@@ -22,7 +22,18 @@ export function getAPIKey(cloudflareEnv: Env, provider: string) {
22
  case 'Deepseek':
23
  return env.DEEPSEEK_API_KEY || cloudflareEnv.DEEPSEEK_API_KEY
24
  case 'Mistral':
25
- return env.MISTRAL_API_KEY || cloudflareEnv.MISTRAL_API_KEY;
 
 
 
 
 
 
 
 
 
 
 
26
  default:
27
  return "";
28
  }
 
22
  case 'Deepseek':
23
  return env.DEEPSEEK_API_KEY || cloudflareEnv.DEEPSEEK_API_KEY
24
  case 'Mistral':
25
+ return env.MISTRAL_API_KEY || cloudflareEnv.MISTRAL_API_KEY;
26
+ case "OpenAILike":
27
+ return env.OPENAI_LIKE_API_KEY || cloudflareEnv.OPENAI_LIKE_API_KEY;
28
+ default:
29
+ return "";
30
+ }
31
+ }
32
+
33
+ export function getBaseURL(cloudflareEnv: Env, provider: string) {
34
+ switch (provider) {
35
+ case 'OpenAILike':
36
+ return env.OPENAI_LIKE_API_BASE_URL || cloudflareEnv.OPENAI_LIKE_API_BASE_URL;
37
  default:
38
  return "";
39
  }
app/lib/.server/llm/model.ts CHANGED
@@ -1,6 +1,6 @@
1
  // @ts-nocheck
2
  // Preventing TS checks with files presented in the video for a better presentation.
3
- import { getAPIKey } from '~/lib/.server/llm/api-key';
4
  import { createAnthropic } from '@ai-sdk/anthropic';
5
  import { createOpenAI } from '@ai-sdk/openai';
6
  import { createGoogleGenerativeAI } from '@ai-sdk/google';
@@ -16,7 +16,14 @@ export function getAnthropicModel(apiKey: string, model: string) {
16
 
17
  return anthropic(model);
18
  }
 
 
 
 
 
19
 
 
 
20
  export function getOpenAIModel(apiKey: string, model: string) {
21
  const openai = createOpenAI({
22
  apiKey,
@@ -72,7 +79,7 @@ export function getOpenRouterModel(apiKey: string, model: string) {
72
 
73
  export function getModel(provider: string, model: string, env: Env) {
74
  const apiKey = getAPIKey(env, provider);
75
-
76
 
77
  switch (provider) {
78
  case 'Anthropic':
@@ -85,6 +92,8 @@ export function getModel(provider: string, model: string, env: Env) {
85
  return getOpenRouterModel(apiKey, model);
86
  case 'Google':
87
  return getGoogleModel(apiKey, model)
 
 
88
  case 'Deepseek':
89
  return getDeepseekModel(apiKey, model)
90
  case 'Mistral':
 
1
  // @ts-nocheck
2
  // Preventing TS checks with files presented in the video for a better presentation.
3
+ import { getAPIKey, getBaseURL } from '~/lib/.server/llm/api-key';
4
  import { createAnthropic } from '@ai-sdk/anthropic';
5
  import { createOpenAI } from '@ai-sdk/openai';
6
  import { createGoogleGenerativeAI } from '@ai-sdk/google';
 
16
 
17
  return anthropic(model);
18
  }
19
+ export function getOpenAILikeModel(baseURL:string,apiKey: string, model: string) {
20
+ const openai = createOpenAI({
21
+ baseURL,
22
+ apiKey,
23
+ });
24
 
25
+ return openai(model);
26
+ }
27
  export function getOpenAIModel(apiKey: string, model: string) {
28
  const openai = createOpenAI({
29
  apiKey,
 
79
 
80
  export function getModel(provider: string, model: string, env: Env) {
81
  const apiKey = getAPIKey(env, provider);
82
+ const baseURL = getBaseURL(env, provider);
83
 
84
  switch (provider) {
85
  case 'Anthropic':
 
92
  return getOpenRouterModel(apiKey, model);
93
  case 'Google':
94
  return getGoogleModel(apiKey, model)
95
+ case 'OpenAILike':
96
+ return getOpenAILikeModel(baseURL,apiKey, model);
97
  case 'Deepseek':
98
  return getDeepseekModel(apiKey, model)
99
  case 'Mistral':
app/utils/constants.ts CHANGED
@@ -49,7 +49,9 @@ export let MODEL_LIST: ModelInfo[] = [...staticModels];
49
 
50
  async function getOllamaModels(): Promise<ModelInfo[]> {
51
  try {
52
- const response = await fetch(`http://localhost:11434/api/tags`);
 
 
53
  const data = await response.json() as OllamaApiResponse;
54
 
55
  return data.models.map((model: OllamaModel) => ({
@@ -62,9 +64,36 @@ async function getOllamaModels(): Promise<ModelInfo[]> {
62
  }
63
  }
64
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
65
  async function initializeModelList(): Promise<void> {
66
  const ollamaModels = await getOllamaModels();
67
- MODEL_LIST = [...ollamaModels, ...staticModels];
 
 
68
  }
69
  initializeModelList().then();
70
  export { getOllamaModels, initializeModelList };
 
49
 
50
  async function getOllamaModels(): Promise<ModelInfo[]> {
51
  try {
52
+ const base_url = import.meta.env.OLLAMA_API_BASE_URL || "http://localhost:11434";
53
+ const url = new URL(base_url).toString();
54
+ const response = await fetch(`${url}/api/tags`);
55
  const data = await response.json() as OllamaApiResponse;
56
 
57
  return data.models.map((model: OllamaModel) => ({
 
64
  }
65
  }
66
 
67
+ async function getOpenAILikeModels(): Promise<ModelInfo[]> {
68
+
69
+ try {
70
+ const base_url =import.meta.env.OPENAI_LIKE_API_BASE_URL || "";
71
+ if (!base_url) {
72
+ return [];
73
+ }
74
+ const url = new URL(base_url).toString();
75
+ const api_key = import.meta.env.OPENAI_LIKE_API_KEY ?? "";
76
+ const response = await fetch(`${url}/models`, {
77
+ headers: {
78
+ Authorization: `Bearer ${api_key}`,
79
+ }
80
+ });
81
+ const res = await response.json();
82
+ return res.data.map((model: any) => ({
83
+ name: model.id,
84
+ label: model.id,
85
+ provider: 'OpenAILike',
86
+ }));
87
+ }catch (e) {
88
+ return []
89
+ }
90
+
91
+ }
92
  async function initializeModelList(): Promise<void> {
93
  const ollamaModels = await getOllamaModels();
94
+ const openAiLikeModels = await getOpenAILikeModels();
95
+ console.log(openAiLikeModels);
96
+ MODEL_LIST = [...ollamaModels,...openAiLikeModels, ...staticModels];
97
  }
98
  initializeModelList().then();
99
  export { getOllamaModels, initializeModelList };
vite.config.ts CHANGED
@@ -27,6 +27,7 @@ export default defineConfig((config) => {
27
  chrome129IssuePlugin(),
28
  config.mode === 'production' && optimizeCssModules({ apply: 'build' }),
29
  ],
 
30
  css: {
31
  preprocessorOptions: {
32
  scss: {
 
27
  chrome129IssuePlugin(),
28
  config.mode === 'production' && optimizeCssModules({ apply: 'build' }),
29
  ],
30
+ envPrefix:["VITE_","OPENAI_LIKE_API_","OLLAMA_API_BASE_URL"],
31
  css: {
32
  preprocessorOptions: {
33
  scss: {
worker-configuration.d.ts CHANGED
@@ -4,5 +4,7 @@ interface Env {
4
  GROQ_API_KEY: string;
5
  OPEN_ROUTER_API_KEY: string;
6
  OLLAMA_API_BASE_URL: string;
 
 
7
  DEEPSEEK_API_KEY: string;
8
  }
 
4
  GROQ_API_KEY: string;
5
  OPEN_ROUTER_API_KEY: string;
6
  OLLAMA_API_BASE_URL: string;
7
+ OPENAI_LIKE_API_KEY: string;
8
+ OPENAI_LIKE_API_BASE_URL: string;
9
  DEEPSEEK_API_KEY: string;
10
  }