Arsalaan Ahmed
commited on
feat: added hyperbolic llm models (#943)
Browse files* Added Hyperbolic Models
* Fix: Fixed problem in connecting with hyperbolic models
* added dynamic models for hyperbolic
* removed logs
- .env.example +6 -0
- app/lib/modules/llm/providers/hyperbolic.ts +117 -0
- app/lib/modules/llm/registry.ts +2 -0
- package.json +1 -0
- pnpm-lock.yaml +8 -5
.env.example
CHANGED
@@ -51,6 +51,12 @@ OPENAI_LIKE_API_KEY=
|
|
51 |
# Get your Together API Key
|
52 |
TOGETHER_API_KEY=
|
53 |
|
|
|
|
|
|
|
|
|
|
|
|
|
54 |
# Get your Mistral API Key by following these instructions -
|
55 |
# https://console.mistral.ai/api-keys/
|
56 |
# You only need this environment variable set if you want to use Mistral models
|
|
|
51 |
# Get your Together API Key
|
52 |
TOGETHER_API_KEY=
|
53 |
|
54 |
+
# You only need this environment variable set if you want to use Hyperbolic models
|
55 |
+
#Get your Hyperbolics API Key at https://app.hyperbolic.xyz/settings
|
56 |
+
#baseURL="https://api.hyperbolic.xyz/v1/chat/completions"
|
57 |
+
HYPERBOLIC_API_KEY=
|
58 |
+
HYPERBOLIC_API_BASE_URL=
|
59 |
+
|
60 |
# Get your Mistral API Key by following these instructions -
|
61 |
# https://console.mistral.ai/api-keys/
|
62 |
# You only need this environment variable set if you want to use Mistral models
|
app/lib/modules/llm/providers/hyperbolic.ts
ADDED
@@ -0,0 +1,117 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { BaseProvider } from '~/lib/modules/llm/base-provider';
|
2 |
+
import type { ModelInfo } from '~/lib/modules/llm/types';
|
3 |
+
import type { IProviderSetting } from '~/types/model';
|
4 |
+
import type { LanguageModelV1 } from 'ai';
|
5 |
+
import { createOpenAI } from '@ai-sdk/openai';
|
6 |
+
|
7 |
+
export default class HyperbolicProvider extends BaseProvider {
|
8 |
+
name = 'Hyperbolic';
|
9 |
+
getApiKeyLink = 'https://hyperbolic.xyz/settings';
|
10 |
+
|
11 |
+
config = {
|
12 |
+
apiTokenKey: 'HYPERBOLIC_API_KEY',
|
13 |
+
};
|
14 |
+
|
15 |
+
staticModels: ModelInfo[] = [
|
16 |
+
{
|
17 |
+
name: 'Qwen/Qwen2.5-Coder-32B-Instruct',
|
18 |
+
label: 'Qwen 2.5 Coder 32B Instruct',
|
19 |
+
provider: 'Hyperbolic',
|
20 |
+
maxTokenAllowed: 8192,
|
21 |
+
},
|
22 |
+
{
|
23 |
+
name: 'Qwen/Qwen2.5-72B-Instruct',
|
24 |
+
label: 'Qwen2.5-72B-Instruct',
|
25 |
+
provider: 'Hyperbolic',
|
26 |
+
maxTokenAllowed: 8192,
|
27 |
+
},
|
28 |
+
{
|
29 |
+
name: 'deepseek-ai/DeepSeek-V2.5',
|
30 |
+
label: 'DeepSeek-V2.5',
|
31 |
+
provider: 'Hyperbolic',
|
32 |
+
maxTokenAllowed: 8192,
|
33 |
+
},
|
34 |
+
{
|
35 |
+
name: 'Qwen/QwQ-32B-Preview',
|
36 |
+
label: 'QwQ-32B-Preview',
|
37 |
+
provider: 'Hyperbolic',
|
38 |
+
maxTokenAllowed: 8192,
|
39 |
+
},
|
40 |
+
{
|
41 |
+
name: 'Qwen/Qwen2-VL-72B-Instruct',
|
42 |
+
label: 'Qwen2-VL-72B-Instruct',
|
43 |
+
provider: 'Hyperbolic',
|
44 |
+
maxTokenAllowed: 8192,
|
45 |
+
},
|
46 |
+
];
|
47 |
+
|
48 |
+
async getDynamicModels(
|
49 |
+
apiKeys?: Record<string, string>,
|
50 |
+
settings?: IProviderSetting,
|
51 |
+
serverEnv: Record<string, string> = {},
|
52 |
+
): Promise<ModelInfo[]> {
|
53 |
+
try {
|
54 |
+
const { baseUrl: fetchBaseUrl, apiKey } = this.getProviderBaseUrlAndKey({
|
55 |
+
apiKeys,
|
56 |
+
providerSettings: settings,
|
57 |
+
serverEnv,
|
58 |
+
defaultBaseUrlKey: '',
|
59 |
+
defaultApiTokenKey: 'HYPERBOLIC_API_KEY',
|
60 |
+
});
|
61 |
+
const baseUrl = fetchBaseUrl || 'https://api.hyperbolic.xyz/v1';
|
62 |
+
|
63 |
+
if (!baseUrl || !apiKey) {
|
64 |
+
return [];
|
65 |
+
}
|
66 |
+
|
67 |
+
const response = await fetch(`${baseUrl}/models`, {
|
68 |
+
headers: {
|
69 |
+
Authorization: `Bearer ${apiKey}`,
|
70 |
+
},
|
71 |
+
});
|
72 |
+
|
73 |
+
const res = (await response.json()) as any;
|
74 |
+
|
75 |
+
const data = res.data.filter((model: any) => model.object === 'model' && model.supports_chat);
|
76 |
+
|
77 |
+
return data.map((m: any) => ({
|
78 |
+
name: m.id,
|
79 |
+
label: `${m.id} - context ${m.context_length ? Math.floor(m.context_length / 1000) + 'k' : 'N/A'}`,
|
80 |
+
provider: this.name,
|
81 |
+
maxTokenAllowed: m.context_length || 8000,
|
82 |
+
}));
|
83 |
+
} catch (error: any) {
|
84 |
+
console.error('Error getting Hyperbolic models:', error.message);
|
85 |
+
return [];
|
86 |
+
}
|
87 |
+
}
|
88 |
+
|
89 |
+
getModelInstance(options: {
|
90 |
+
model: string;
|
91 |
+
serverEnv: Env;
|
92 |
+
apiKeys?: Record<string, string>;
|
93 |
+
providerSettings?: Record<string, IProviderSetting>;
|
94 |
+
}): LanguageModelV1 {
|
95 |
+
const { model, serverEnv, apiKeys, providerSettings } = options;
|
96 |
+
|
97 |
+
const { apiKey } = this.getProviderBaseUrlAndKey({
|
98 |
+
apiKeys,
|
99 |
+
providerSettings: providerSettings?.[this.name],
|
100 |
+
serverEnv: serverEnv as any,
|
101 |
+
defaultBaseUrlKey: '',
|
102 |
+
defaultApiTokenKey: 'HYPERBOLIC_API_KEY',
|
103 |
+
});
|
104 |
+
|
105 |
+
if (!apiKey) {
|
106 |
+
console.log(`Missing configuration for ${this.name} provider`);
|
107 |
+
throw new Error(`Missing configuration for ${this.name} provider`);
|
108 |
+
}
|
109 |
+
|
110 |
+
const openai = createOpenAI({
|
111 |
+
baseURL: 'https://api.hyperbolic.xyz/v1/',
|
112 |
+
apiKey,
|
113 |
+
});
|
114 |
+
|
115 |
+
return openai(model);
|
116 |
+
}
|
117 |
+
}
|
app/lib/modules/llm/registry.ts
CHANGED
@@ -13,6 +13,7 @@ import OpenAIProvider from './providers/openai';
|
|
13 |
import PerplexityProvider from './providers/perplexity';
|
14 |
import TogetherProvider from './providers/together';
|
15 |
import XAIProvider from './providers/xai';
|
|
|
16 |
|
17 |
export {
|
18 |
AnthropicProvider,
|
@@ -21,6 +22,7 @@ export {
|
|
21 |
GoogleProvider,
|
22 |
GroqProvider,
|
23 |
HuggingFaceProvider,
|
|
|
24 |
MistralProvider,
|
25 |
OllamaProvider,
|
26 |
OpenAIProvider,
|
|
|
13 |
import PerplexityProvider from './providers/perplexity';
|
14 |
import TogetherProvider from './providers/together';
|
15 |
import XAIProvider from './providers/xai';
|
16 |
+
import HyperbolicProvider from './providers/hyperbolic';
|
17 |
|
18 |
export {
|
19 |
AnthropicProvider,
|
|
|
22 |
GoogleProvider,
|
23 |
GroqProvider,
|
24 |
HuggingFaceProvider,
|
25 |
+
HyperbolicProvider,
|
26 |
MistralProvider,
|
27 |
OllamaProvider,
|
28 |
OpenAIProvider,
|
package.json
CHANGED
@@ -76,6 +76,7 @@
|
|
76 |
"ai": "^4.0.13",
|
77 |
"date-fns": "^3.6.0",
|
78 |
"diff": "^5.2.0",
|
|
|
79 |
"file-saver": "^2.0.5",
|
80 |
"framer-motion": "^11.12.0",
|
81 |
"ignore": "^6.0.2",
|
|
|
76 |
"ai": "^4.0.13",
|
77 |
"date-fns": "^3.6.0",
|
78 |
"diff": "^5.2.0",
|
79 |
+
"dotenv": "^16.4.7",
|
80 |
"file-saver": "^2.0.5",
|
81 |
"framer-motion": "^11.12.0",
|
82 |
"ignore": "^6.0.2",
|
pnpm-lock.yaml
CHANGED
@@ -149,6 +149,9 @@ importers:
|
|
149 |
diff:
|
150 |
specifier: ^5.2.0
|
151 |
version: 5.2.0
|
|
|
|
|
|
|
152 |
file-saver:
|
153 |
specifier: ^2.0.5
|
154 |
version: 2.0.5
|
@@ -2901,8 +2904,8 @@ packages:
|
|
2901 |
resolution: {integrity: sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==}
|
2902 |
engines: {node: '>=10'}
|
2903 |
|
2904 |
-
[email protected].
|
2905 |
-
resolution: {integrity: sha512-
|
2906 |
engines: {node: '>=12'}
|
2907 |
|
2908 | |
@@ -7246,7 +7249,7 @@ snapshots:
|
|
7246 |
chalk: 4.1.2
|
7247 |
chokidar: 3.6.0
|
7248 |
cross-spawn: 7.0.6
|
7249 |
-
dotenv: 16.4.
|
7250 |
es-module-lexer: 1.5.4
|
7251 |
esbuild: 0.17.6
|
7252 |
esbuild-plugins-node-modules-polyfill: 1.6.8([email protected])
|
@@ -8450,7 +8453,7 @@ snapshots:
|
|
8450 |
|
8451 | |
8452 |
|
8453 |
-
[email protected].
|
8454 |
|
8455 | |
8456 |
|
@@ -11957,4 +11960,4 @@ snapshots:
|
|
11957 |
|
11958 | |
11959 |
|
11960 |
-
[email protected]: {}
|
|
|
149 |
diff:
|
150 |
specifier: ^5.2.0
|
151 |
version: 5.2.0
|
152 |
+
dotenv:
|
153 |
+
specifier: ^16.4.7
|
154 |
+
version: 16.4.7
|
155 |
file-saver:
|
156 |
specifier: ^2.0.5
|
157 |
version: 2.0.5
|
|
|
2904 |
resolution: {integrity: sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==}
|
2905 |
engines: {node: '>=10'}
|
2906 |
|
2907 |
+
[email protected].7:
|
2908 |
+
resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==}
|
2909 |
engines: {node: '>=12'}
|
2910 |
|
2911 | |
|
|
7249 |
chalk: 4.1.2
|
7250 |
chokidar: 3.6.0
|
7251 |
cross-spawn: 7.0.6
|
7252 |
+
dotenv: 16.4.7
|
7253 |
es-module-lexer: 1.5.4
|
7254 |
esbuild: 0.17.6
|
7255 |
esbuild-plugins-node-modules-polyfill: 1.6.8([email protected])
|
|
|
8453 |
|
8454 | |
8455 |
|
8456 |
+
[email protected].7: {}
|
8457 |
|
8458 | |
8459 |
|
|
|
11960 |
|
11961 | |
11962 |
|
11963 |
+
[email protected]: {}
|