Skip to content

Commit

Permalink
Merge pull request #505 from b4s36t4/deepseek-support
Browse files Browse the repository at this point in the history
Deepseek support
  • Loading branch information
VisargD authored Aug 19, 2024
2 parents 9ab4280 + 544043e commit df557ce
Show file tree
Hide file tree
Showing 5 changed files with 215 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/globals.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ export const LINGYI: string = 'lingyi';
export const ZHIPU: string = 'zhipu';
export const NOVITA_AI: string = 'novita-ai';
export const MONSTERAPI: string = 'monsterapi';
export const DEEPSEEK: string = 'deepseek';
export const PREDIBASE: string = 'predibase';
export const VOYAGE: string = 'voyage';

Expand Down Expand Up @@ -87,6 +88,7 @@ export const VALID_PROVIDERS = [
ZHIPU,
NOVITA_AI,
MONSTERAPI,
DEEPSEEK,
PREDIBASE,
VOYAGE,
];
Expand Down
18 changes: 18 additions & 0 deletions src/providers/deepseek/api.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { ProviderAPIConfig } from '../types';

const DeepSeekAPIConfig: ProviderAPIConfig = {
getBaseURL: () => 'https://api.deepseek.com',
headers: ({ providerOptions }) => {
return { Authorization: `Bearer ${providerOptions.apiKey}` }; // https://platform.deepseek.com/api_keys
},
getEndpoint: ({ fn }) => {
switch (fn) {
case 'chatComplete':
return '/v1/chat/completions';
default:
return '';
}
},
};

export default DeepSeekAPIConfig;
175 changes: 175 additions & 0 deletions src/providers/deepseek/chatComplete.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,175 @@
import { DEEPSEEK } from '../../globals';

import {
ChatCompletionResponse,
ErrorResponse,
ProviderConfig,
} from '../types';
import {
generateErrorResponse,
generateInvalidProviderResponseError,
} from '../utils';

export const DeepSeekChatCompleteConfig: ProviderConfig = {
model: {
param: 'model',
required: true,
default: 'deepseek-chat',
},
messages: {
param: 'messages',
default: '',
},
max_tokens: {
param: 'max_tokens',
default: 100,
min: 0,
},
temperature: {
param: 'temperature',
default: 1,
min: 0,
max: 2,
},
top_p: {
param: 'top_p',
default: 1,
min: 0,
max: 1,
},
stream: {
param: 'stream',
default: false,
},
frequency_penalty: {
param: 'frequency_penalty',
default: 0,
min: -2,
max: 2,
},
presence_penalty: {
param: 'presence_penalty',
default: 0,
min: -2,
max: 2,
},
stop: {
param: 'stop',
default: null,
},
logprobs: {
param: 'logprobs',
default: false,
},
top_logprobs: {
param: 'top_logprobs',
default: 0,
min: 0,
max: 20,
},
};

interface DeepSeekChatCompleteResponse extends ChatCompletionResponse {
id: string;
object: string;
created: number;
model: 'deepseek-chat' | 'deepseek-coder';
usage: {
prompt_tokens: number;
completion_tokens: number;
total_tokens: number;
};
}

export interface DeepSeekErrorResponse {
object: string;
message: string;
type: string;
param: string | null;
code: string;
}

interface DeepSeekStreamChunk {
id: string;
object: string;
created: number;
model: string;
choices: {
delta: {
role?: string | null;
content?: string;
};
index: number;
finish_reason: string | null;
}[];
}

export const DeepSeekChatCompleteResponseTransform: (
response: DeepSeekChatCompleteResponse | DeepSeekErrorResponse,
responseStatus: number
) => ChatCompletionResponse | ErrorResponse = (response, responseStatus) => {
if ('message' in response && responseStatus !== 200) {
return generateErrorResponse(
{
message: response.message,
type: response.type,
param: response.param,
code: response.code,
},
DEEPSEEK
);
}

if ('choices' in response) {
return {
id: response.id,
object: response.object,
created: response.created,
model: response.model,
provider: DEEPSEEK,
choices: response.choices.map((c) => ({
index: c.index,
message: {
role: c.message.role,
content: c.message.content,
},
finish_reason: c.finish_reason,
})),
usage: {
prompt_tokens: response.usage?.prompt_tokens,
completion_tokens: response.usage?.completion_tokens,
total_tokens: response.usage?.total_tokens,
},
};
}

return generateInvalidProviderResponseError(response, DEEPSEEK);
};

export const DeepSeekChatCompleteStreamChunkTransform: (
response: string
) => string = (responseChunk) => {
let chunk = responseChunk.trim();
chunk = chunk.replace(/^data: /, '');
chunk = chunk.trim();
if (chunk === '[DONE]') {
return `data: ${chunk}\n\n`;
}
const parsedChunk: DeepSeekStreamChunk = JSON.parse(chunk);
return (
`data: ${JSON.stringify({
id: parsedChunk.id,
object: parsedChunk.object,
created: parsedChunk.created,
model: parsedChunk.model,
provider: DEEPSEEK,
choices: [
{
index: parsedChunk.choices[0].index,
delta: parsedChunk.choices[0].delta,
finish_reason: parsedChunk.choices[0].finish_reason,
},
],
})}` + '\n\n'
);
};
18 changes: 18 additions & 0 deletions src/providers/deepseek/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { ProviderConfigs } from '../types';
import DeepSeekAPIConfig from './api';
import {
DeepSeekChatCompleteConfig,
DeepSeekChatCompleteResponseTransform,
DeepSeekChatCompleteStreamChunkTransform,
} from './chatComplete';

const DeepSeekConfig: ProviderConfigs = {
chatComplete: DeepSeekChatCompleteConfig,
api: DeepSeekAPIConfig,
responseTransforms: {
chatComplete: DeepSeekChatCompleteResponseTransform,
'stream-chatComplete': DeepSeekChatCompleteStreamChunkTransform,
},
};

export default DeepSeekConfig;
2 changes: 2 additions & 0 deletions src/providers/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import LingYiConfig from './lingyi';
import ZhipuConfig from './zhipu';
import NovitaAIConfig from './novita-ai';
import MonsterAPIConfig from './monsterapi';
import DeepSeekAPIConfig from './deepseek';
import PredibaseConfig from './predibase';
import VoyageConfig from './voyage';

Expand Down Expand Up @@ -61,6 +62,7 @@ const Providers: { [key: string]: ProviderConfigs } = {
zhipu: ZhipuConfig,
'novita-ai': NovitaAIConfig,
monsterapi: MonsterAPIConfig,
deepseek: DeepSeekAPIConfig,
predibase: PredibaseConfig,
voyage: VoyageConfig,
};
Expand Down

0 comments on commit df557ce

Please sign in to comment.