From 1cc281f6fe21933bc6ea566d2685b54d5a80c4a4 Mon Sep 17 00:00:00 2001 From: user Date: Tue, 31 Dec 2024 07:45:11 +0000 Subject: [PATCH] Add automatic prefill for Deepseek - works the same way as with Claude --- src/proxy/deepseek.ts | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/src/proxy/deepseek.ts b/src/proxy/deepseek.ts index 32ee566..5bbf8a6 100644 --- a/src/proxy/deepseek.ts +++ b/src/proxy/deepseek.ts @@ -1,4 +1,4 @@ -import { Router } from "express"; +import { Request, Router } from "express"; import { createPreprocessorMiddleware } from "./middleware/request"; import { ipLimiter } from "./rate-limit"; import { createQueuedProxyMiddleware } from "./middleware/request/proxy-middleware-factory"; @@ -22,20 +22,40 @@ const deepseekResponseHandler: ProxyResHandlerWithBody = async ( const deepseekProxy = createQueuedProxyMiddleware({ mutations: [addKey, finalizeBody], - target: "https://api.deepseek.com", + target: "https://api.deepseek.com/beta", blockingResponseHandler: deepseekResponseHandler, }); const deepseekRouter = Router(); +// combines all the assistant messages at the end of the context and adds the +// beta 'prefix' option, makes prefills work the same way they work for Claude +function enablePrefill(req: Request) { + // If you want to disable + if (process.env.NO_DEEPSEEK_PREFILL) return + + const msgs = req.body.messages; + if (msgs.at(-1)?.role !== 'assistant') return; + + let i = msgs.length - 1; + let content = ''; + + while (i >= 0 && msgs[i].role === 'assistant') { + // maybe we should also add a newline between messages? no for now. + content = msgs[i--].content + content; + } + + msgs.splice(i + 1, msgs.length, { role: 'assistant', content, prefix: true }); +} + + deepseekRouter.post( "/v1/chat/completions", ipLimiter, - createPreprocessorMiddleware({ - inApi: "openai", - outApi: "openai", - service: "deepseek" - }), + createPreprocessorMiddleware( + { inApi: "openai", outApi: "openai", service: "deepseek" }, + { afterTransform: [ enablePrefill ] } + ), deepseekProxy );