diff --git a/src/globals.ts b/src/globals.ts index 33db8b693..451214161 100644 --- a/src/globals.ts +++ b/src/globals.ts @@ -49,6 +49,7 @@ export const OPENROUTER: string = 'openrouter'; export const LINGYI: string = 'lingyi'; export const ZHIPU: string = 'zhipu'; export const NOVITA_AI: string = 'novita-ai'; +export const MONSTERAPI: string = 'monsterapi'; export const VALID_PROVIDERS = [ ANTHROPIC, @@ -78,6 +79,7 @@ export const VALID_PROVIDERS = [ LINGYI, ZHIPU, NOVITA_AI, + MONSTERAPI, ]; export const CONTENT_TYPES = { diff --git a/src/providers/index.ts b/src/providers/index.ts index 0dcb46a81..5e16eaf1c 100644 --- a/src/providers/index.ts +++ b/src/providers/index.ts @@ -26,6 +26,7 @@ import OpenrouterConfig from './openrouter'; import LingYiConfig from './lingyi'; import ZhipuConfig from './zhipu'; import NovitaAIConfig from './novita-ai'; +import MonsterAPIConfig from './monsterapi'; const Providers: { [key: string]: ProviderConfigs } = { openai: OpenAIConfig, @@ -55,6 +56,7 @@ const Providers: { [key: string]: ProviderConfigs } = { lingyi: LingYiConfig, zhipu: ZhipuConfig, 'novita-ai': NovitaAIConfig, + monsterapi: MonsterAPIConfig, }; export default Providers; diff --git a/src/providers/monsterapi/api.ts b/src/providers/monsterapi/api.ts new file mode 100644 index 000000000..70ebe1d13 --- /dev/null +++ b/src/providers/monsterapi/api.ts @@ -0,0 +1,18 @@ +import { ProviderAPIConfig } from '../types'; + +const MonsterAPIApiConfig: ProviderAPIConfig = { + getBaseURL: () => 'https://llm.monsterapi.ai/v1', + headers: ({ providerOptions }) => { + return { Authorization: `Bearer ${providerOptions.apiKey}` }; + }, + getEndpoint: ({ fn }) => { + switch (fn) { + case 'chatComplete': + return '/generate'; + default: + return ''; + } + }, +}; + +export default MonsterAPIApiConfig; diff --git a/src/providers/monsterapi/chatComplete.ts b/src/providers/monsterapi/chatComplete.ts new file mode 100644 index 000000000..5c7baebd3 --- /dev/null +++ b/src/providers/monsterapi/chatComplete.ts @@ -0,0 +1,118 @@ +import { MONSTERAPI } from '../../globals'; +import { + ChatCompletionResponse, + ErrorResponse, + ProviderConfig, +} from '../types'; +import { + generateErrorResponse, + generateInvalidProviderResponseError, +} from '../utils'; + +export const MonsterAPIChatCompleteConfig: ProviderConfig = { + top_k: { + param: 'top_k', + min: 1, + max: 20, + }, + top_p: { + param: 'top_p', + min: 0, + max: 1, + }, + temperature: { + param: 'temperature', + min: 0, + max: 1, + }, + max_length: { + param: 'max_length', + min: 1, + max: 2048, + }, + repetition_penalty: { + param: 'repetition_penalty', + min: 0, + }, + beam_size: { + param: 'beam_size', + min: 1, + }, + model: { + param: 'model', + required: true, + default: 'mistralai/Mistral-7B-Instruct-v0.2', + }, + messages: { + param: 'messages', + required: true, + default: [], + }, +}; + +export interface MonsterAPIChatCompleteResponse { + model: string; + response: { + text: string[]; + token_counts: { + input: number; + output: number; + }; + credits_consumed: number; + }; +} + +export interface MonsterAPIErrorResponse { + error: { + message: string; + type: string; + code: number; + }; +} + +export const MonsterAPIChatCompleteResponseTransform: ( + response: MonsterAPIChatCompleteResponse | MonsterAPIErrorResponse, + responseStatus: number +) => ChatCompletionResponse | ErrorResponse = (response, responseStatus) => { + if ('error' in response) { + return generateErrorResponse( + { + message: response.error.message, + type: response.error.type, + param: null, + code: response.error.code.toString(), + }, + MONSTERAPI + ); + } + + if ('response' in response) { + return { + id: Date.now().toString(), + object: 'chat.completion', + created: Math.floor(Date.now() / 1000), + model: response?.model, + choices: [ + { + message: { + role: 'assistant', + content: response.response.text.join('\n'), + }, + index: 0, + logprobs: null, + finish_reason: 'completed', + }, + ], + usage: { + prompt_tokens: response.response.token_counts.input, + completion_tokens: response.response.token_counts.output, + total_tokens: + response.response.token_counts.input + + response.response.token_counts.output, + }, + provider: MONSTERAPI, + }; + } + + return generateInvalidProviderResponseError(response, MONSTERAPI); +}; diff --git a/src/providers/monsterapi/index.ts b/src/providers/monsterapi/index.ts new file mode 100644 index 000000000..ab5bdaf92 --- /dev/null +++ b/src/providers/monsterapi/index.ts @@ -0,0 +1,16 @@ +import { ProviderConfigs } from '../types'; +import MonsterAPIApiConfig from './api'; +import { + MonsterAPIChatCompleteConfig, + MonsterAPIChatCompleteResponseTransform, +} from './chatComplete'; + +const MonsterAPIConfig: ProviderConfigs = { + api: MonsterAPIApiConfig, + chatComplete: MonsterAPIChatCompleteConfig, + responseTransforms: { + chatComplete: MonsterAPIChatCompleteResponseTransform, + }, +}; + +export default MonsterAPIConfig;