Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@
"build": "next build --webpack",
"start": "next start",
"lint": "next lint",
"format:write": "prettier . --write"
"format:write": "prettier . --write",
"test": "vitest",
"test:run": "vitest run",
"test:coverage": "vitest run --coverage"
},
"dependencies": {
"@google/genai": "^1.34.0",
Expand Down Expand Up @@ -61,14 +64,16 @@
"@types/react-dom": "^18",
"@types/react-syntax-highlighter": "^15.5.13",
"@types/turndown": "^5.0.6",
"@vitest/coverage-v8": "^4.0.18",
"autoprefixer": "^10.0.1",
"drizzle-kit": "^0.30.5",
"eslint": "^8",
"eslint-config-next": "14.1.4",
"postcss": "^8",
"prettier": "^3.2.5",
"tailwindcss": "^3.3.0",
"typescript": "^5.9.3"
"typescript": "^5.9.3",
"vitest": "^4.0.18"
},
"optionalDependencies": {
"@napi-rs/canvas": "^0.1.87"
Expand Down
2 changes: 2 additions & 0 deletions src/lib/models/providers/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import GroqProvider from './groq';
import LemonadeProvider from './lemonade';
import AnthropicProvider from './anthropic';
import LMStudioProvider from './lmstudio';
import MiniMaxProvider from './minimax';

export const providers: Record<string, ProviderConstructor<any>> = {
openai: OpenAIProvider,
Expand All @@ -18,6 +19,7 @@ export const providers: Record<string, ProviderConstructor<any>> = {
lemonade: LemonadeProvider,
anthropic: AnthropicProvider,
lmstudio: LMStudioProvider,
minimax: MiniMaxProvider,
};

export const getModelProvidersUIConfigSection =
Expand Down
103 changes: 103 additions & 0 deletions src/lib/models/providers/minimax/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
import { UIConfigField } from '@/lib/config/types';
import { Model, ModelList, ProviderMetadata } from '../../types';
import BaseEmbedding from '../../base/embedding';
import BaseModelProvider from '../../base/provider';
import BaseLLM from '../../base/llm';
import MiniMaxLLM from './minimaxLLM';

interface MiniMaxConfig {
apiKey: string;
baseURL?: string;
}

const providerConfigFields: UIConfigField[] = [
{
type: 'password',
name: 'API Key',
key: 'apiKey',
description: 'Your MiniMax API key',
required: true,
placeholder: 'MiniMax API Key',
env: 'MINIMAX_API_KEY',
scope: 'server',
},
{
type: 'string',
name: 'Base URL',
key: 'baseURL',
description: 'MiniMax API base URL',
required: false,
placeholder: 'https://api.minimax.io/v1',
default: 'https://api.minimax.io/v1',
env: 'MINIMAX_BASE_URL',
scope: 'server',
},
];

const DEFAULT_MODELS: ModelList = {
chat: [
{ key: 'MiniMax-M2.5', name: 'MiniMax M2.5' },
{ key: 'MiniMax-M2.5-highspeed', name: 'MiniMax M2.5 High Speed' },
],
embedding: [],
};

class MiniMaxProvider extends BaseModelProvider<MiniMaxConfig> {
constructor(id: string, name: string, config: MiniMaxConfig) {
super(id, name, config);
}

async getDefaultModels(): Promise<ModelList> {
return DEFAULT_MODELS;
}

async getModelList(): Promise<ModelList> {
return DEFAULT_MODELS;
}

async loadChatModel(key: string): Promise<BaseLLM<any>> {
const modelList = await this.getModelList();
const exists = modelList.chat.find((m) => m.key === key);

if (!exists) {
throw new Error(
'Error Loading MiniMax Chat Model. Invalid Model Selected',
);
}

return new MiniMaxLLM({
apiKey: this.config.apiKey,
model: key,
baseURL: this.config.baseURL || 'https://api.minimax.io/v1',
});
}

async loadEmbeddingModel(key: string): Promise<BaseEmbedding<any>> {
throw new Error('MiniMax provider does not support embedding models.');
}

static parseAndValidate(raw: any): MiniMaxConfig {
if (!raw || typeof raw !== 'object')
throw new Error('Invalid config provided. Expected object');
if (!raw.apiKey)
throw new Error('Invalid config provided. API key must be provided');

return {
apiKey: String(raw.apiKey),
baseURL: raw.baseURL ? String(raw.baseURL) : undefined,
};
}

static getProviderConfigFields(): UIConfigField[] {
return providerConfigFields;
}

static getProviderMetadata(): ProviderMetadata {
return {
key: 'minimax',
name: 'MiniMax',
};
}
}

export default MiniMaxProvider;
Loading