From 47fac6ab193e395bb43a4d9dd0a92a2f313d973f Mon Sep 17 00:00:00 2001 From: AKKO89 Date: Thu, 9 Jul 2026 04:44:20 +0800 Subject: [PATCH] feat: add TokenLab provider --- src/globals.ts | 2 ++ src/providers/index.ts | 2 ++ src/providers/tokenlab/api.ts | 24 ++++++++++++++++++++++++ src/providers/tokenlab/index.ts | 30 ++++++++++++++++++++++++++++++ src/public/index.html | 4 ++++ 5 files changed, 62 insertions(+) create mode 100644 src/providers/tokenlab/api.ts create mode 100644 src/providers/tokenlab/index.ts diff --git a/src/globals.ts b/src/globals.ts index 4d6e327e4..96fa98cae 100644 --- a/src/globals.ts +++ b/src/globals.ts @@ -113,6 +113,7 @@ export const ORACLE: string = 'oracle'; export const IO_INTELLIGENCE: string = 'iointelligence'; export const AIBADGR: string = 'aibadgr'; export const OVHCLOUD: string = 'ovhcloud'; +export const TOKENLAB: string = 'tokenlab'; export const VALID_PROVIDERS = [ ANTHROPIC, @@ -189,6 +190,7 @@ export const VALID_PROVIDERS = [ IO_INTELLIGENCE, AIBADGR, OVHCLOUD, + TOKENLAB, ]; export const CONTENT_TYPES = { diff --git a/src/providers/index.ts b/src/providers/index.ts index 2cd5355f8..2ed17fe10 100644 --- a/src/providers/index.ts +++ b/src/providers/index.ts @@ -74,6 +74,7 @@ import OracleConfig from './oracle'; import IOIntelligenceConfig from './iointelligence'; import AIBadgrConfig from './aibadgr'; import OVHcloudConfig from './ovhcloud'; +import TokenLabConfig from './tokenlab'; const Providers: { [key: string]: ProviderConfigs } = { openai: OpenAIConfig, @@ -148,6 +149,7 @@ const Providers: { [key: string]: ProviderConfigs } = { iointelligence: IOIntelligenceConfig, aibadgr: AIBadgrConfig, ovhcloud: OVHcloudConfig, + tokenlab: TokenLabConfig, }; export default Providers; diff --git a/src/providers/tokenlab/api.ts b/src/providers/tokenlab/api.ts new file mode 100644 index 000000000..69856a2a9 --- /dev/null +++ b/src/providers/tokenlab/api.ts @@ -0,0 +1,24 @@ +import { ProviderAPIConfig } from '../types'; + +const TokenLabAPIConfig: ProviderAPIConfig = { + getBaseURL: () => 'https://api.tokenlab.sh/v1', + headers: ({ providerOptions }) => ({ + Authorization: `Bearer ${providerOptions.apiKey}`, + }), + getEndpoint: ({ fn, gatewayRequestURL }) => { + const basePath = gatewayRequestURL.split('/v1')?.[1]; + switch (fn) { + case 'chatComplete': + return '/chat/completions'; + case 'createModelResponse': + case 'getModelResponse': + case 'deleteModelResponse': + case 'listResponseInputItems': + return basePath; + default: + return ''; + } + }, +}; + +export default TokenLabAPIConfig; diff --git a/src/providers/tokenlab/index.ts b/src/providers/tokenlab/index.ts new file mode 100644 index 000000000..23871e0dd --- /dev/null +++ b/src/providers/tokenlab/index.ts @@ -0,0 +1,30 @@ +import { TOKENLAB } from '../../globals'; +import { + chatCompleteParams, + createModelResponseParams, + OpenAICreateModelResponseTransformer, + OpenAIDeleteModelResponseTransformer, + OpenAIGetModelResponseTransformer, + OpenAIListInputItemsResponseTransformer, + responseTransformers, +} from '../open-ai-base'; +import { ProviderConfigs } from '../types'; +import TokenLabAPIConfig from './api'; + +const TokenLabConfig: ProviderConfigs = { + api: TokenLabAPIConfig, + chatComplete: chatCompleteParams([], { model: 'gpt-5.4-mini' }), + createModelResponse: createModelResponseParams([]), + getModelResponse: {}, + deleteModelResponse: {}, + listResponseInputItems: {}, + responseTransforms: { + ...responseTransformers(TOKENLAB, { chatComplete: true }), + createModelResponse: OpenAICreateModelResponseTransformer(TOKENLAB), + getModelResponse: OpenAIGetModelResponseTransformer(TOKENLAB), + deleteModelResponse: OpenAIDeleteModelResponseTransformer(TOKENLAB), + listResponseInputItems: OpenAIListInputItemsResponseTransformer(TOKENLAB), + }, +}; + +export default TokenLabConfig; diff --git a/src/public/index.html b/src/public/index.html index 014ff42b1..aef5b3cf2 100644 --- a/src/public/index.html +++ b/src/public/index.html @@ -1182,6 +1182,7 @@

Select Provider

+ @@ -1533,6 +1534,7 @@

Enter API Key

"perplexity-ai": "pplx-7b-online", "mistral-ai": "mistral-small-latest", "bytez": "google/gemma-3-1b-it", + "tokenlab": "gpt-5.4-mini", "others": "gpt-4o-mini" } @@ -1546,6 +1548,7 @@

Enter API Key

"together-ai": "https://portkey.ai/docs/integrations/llms/together-ai", "perplexity-ai": "https://portkey.ai/docs/integrations/llms/perplexity-ai", "mistral-ai": "https://portkey.ai/docs/integrations/llms/mistral-ai", + "tokenlab": "https://docs.tokenlab.sh/", "others": "https://portkey.ai/docs/integrations/llms" } @@ -1879,6 +1882,7 @@

Enter API Key

case 'openai': case 'anthropic': case 'groq': + case 'tokenlab': return [{ id: 'apiKey', placeholder: 'Enter your API key' }]; case 'azure-openai': return [