这几天都被Deepseek刷屏了,而且Deepseek由于异常访问量,这几天都不能愉快的和它玩耍了,
我发现Groq新增了一个Deepseek的70b参数的模型,
DeepSeek-R1 70B 作为一款强大的开源模型,提供了卓越的推理能力,而 Groq API 提供了一个免费访问该模型的途径。然而,由于 Groq API 在国内无法直接访问,我们可以借助 Deno 进行代理,实现无缝调用。
一、问题分析
1. Groq API 的优势
-
免费使用 DeepSeek-R1 70B
-
计算速度快
-
API 设计简洁
2. 国内访问的挑战
-
直接访问 Groq API 可能受限
-
需要稳定、易用的代理方案
二、解决方案
1. 通过 Groq API 调用 DeepSeek-R1 70B
首先,需要注册 Groq 账号并获取 API Key。然后,调用 Groq API 的接口请求 DeepSeek-R1 70B 进行推理。
Groq is Fast AI InferenceThe LPU™ Inference Engine by Groq is a hardware and software platform that delivers exceptional compute speed, quality, and energy efficiency. Groq provides cloud and on-prem solutions at scale for AI applications.https://groq.com/https://groq.com/
当申请下来key以后,下面python代码可以测试key
import requestsdef chat_api_curl(prompt):# 请确保将以下变量替换为您的实际API密钥openai_api_key = 'GROQ_KEY'headers = {"Content-Type": "application/json","Authorization": f"Bearer {openai_api_key}"}data = {"model": "deepseek-r1-distill-llama-70b","messages": [{"role": "system", "content": "You are a helpful assistant."},{"role": "user", "content": prompt},]}response = requests.post("https://api.groq.com/openai/v1/chat/completions", headers=headers, json=data)# 检查响应是否成功if response.status_code == 200:# 解析响应数据response_data = response.json()# 获取choices列表中的第一个元素的message字典的content值content = response_data['choices'][0]['message']['content']return contentelse:print("请求失败,状态码:", response.status_code)print("响应内容:", response.text)prompt = "你是什么模型?"
res = chat_api_curl(prompt)
print(res)
可以看到回答如下:
2. 使用 Deno 作为国内访问代理
Deno 作为一个现代化的 JavaScript 运行时,支持原生 TypeScript,且内置 HTTP 服务器,非常适合快速搭建代理。我们可以在 Deno 上部署一个代理服务,将国内请求转发至 Groq API。
这里简单介绍一下Deno:
Deno 是一个现代的 JavaScript/TypeScript 运行时环境,由 Node.js 的创造者 Ryan Dahl 发起。它旨在解决 Node.js 中的一些设计缺陷,并提供更安全、更简洁的开发体验。
Deno 的几个特点:
- 内置 TypeScript 支持:Deno 原生支持 TypeScript,无需额外配置。
- 安全性:默认情况下,Deno 对文件、网络和环境变量访问进行限制,只有明确授权的操作才可以执行。
- 标准库:Deno 提供了一套标准库,不依赖第三方包管理工具(如 npm)。
- 简洁的模块系统:模块直接通过 URL 引入,而不是依赖本地的 package.json。
- 单一二进制文件:Deno 是一个单一的二进制文件,没有复杂的安装过程。
总的来说,Deno 是一个轻量级、现代化的运行时环境,特别适合快速开发和现代 Web 应用。
Deno, the next-generation JavaScript runtimeDeno features improved security, performance, and developer experience compared to its predecessor. It's a great time to upgrade your Node.js project to run on Deno.https://deno.com/https://deno.com/
部署过程如下:
Deno DeployDeno Deploy: deploy JavaScript globally to the edge.https://dash.deno.com/account/overviewhttps://dash.deno.com/account/overview
将下面代码拷贝过去:
interface RateLimiter {requests: number;tokens: number;lastReset: number;
}const rateLimiter: RateLimiter = {requests: 0,tokens: 0,lastReset: Date.now(),
};function estimateTokens(body: any): number {try {const messages = body?.messages || [];return messages.reduce((acc: number, msg: any) => acc + (msg.content?.length || 0) * 0.25, 0);} catch {return 0;}
}function resetCountersIfNeeded() {const now = Date.now();if (now - rateLimiter.lastReset >= 60000) {rateLimiter.requests = 0;rateLimiter.tokens = 0;rateLimiter.lastReset = now;}
}async function processResponse(response: Response): Promise<Response> {const contentType = response.headers.get('content-type');if (contentType?.includes('application/json')) {const jsonData = await response.json();if (jsonData.choices && jsonData.choices[0]?.message?.content) {const content = jsonData.choices[0].message.content;const processedContent = content.replace(/<think>.*?<\/think>\s*/s, '').trim();jsonData.choices[0].message.content = processedContent;}return new Response(JSON.stringify(jsonData), {status: response.status,headers: response.headers});}return response;
}async function handleRequest(request: Request): Promise<Response> {const url = new URL(request.url);const pathname = url.pathname;if (pathname === '/' || pathname === '/index.html') {return new Response('Proxy is Running!', {status: 200,headers: { 'Content-Type': 'text/html' }});}if (pathname.includes('api.groq.com')) {resetCountersIfNeeded();if (rateLimiter.requests >= 30) {return new Response('Rate limit exceeded. Max 30 requests per minute.', {status: 429,headers: {'Retry-After': '60','Content-Type': 'application/json'}});}try {const bodyClone = request.clone();const body = await bodyClone.json();const estimatedTokens = estimateTokens(body);if (rateLimiter.tokens + estimatedTokens > 6000) {return new Response('Token limit exceeded. Max 6000 tokens per minute.', {status: 429,headers: {'Retry-After': '60','Content-Type': 'application/json'}});}rateLimiter.tokens += estimatedTokens;} catch (error) {console.error('Error parsing request body:', error);}rateLimiter.requests++;}const targetUrl = `https://${pathname}`;try {const headers = new Headers();const allowedHeaders = ['accept', 'content-type', 'authorization'];for (const [key, value] of request.headers.entries()) {if (allowedHeaders.includes(key.toLowerCase())) {headers.set(key, value);}}const response = await fetch(targetUrl, {method: request.method,headers: headers,body: request.body});const responseHeaders = new Headers(response.headers);responseHeaders.set('Referrer-Policy', 'no-referrer');responseHeaders.set('X-RateLimit-Remaining', `${30 - rateLimiter.requests}`);responseHeaders.set('X-TokenLimit-Remaining', `${6000 - rateLimiter.tokens}`);const processedResponse = await processResponse(response);return new Response(processedResponse.body, {status: processedResponse.status,headers: responseHeaders});} catch (error) {console.error('Failed to fetch:', error);return new Response(JSON.stringify({error: 'Internal Server Error',message: error.message}), { status: 500,headers: {'Content-Type': 'application/json'}});}
}Deno.serve(handleRequest);
最后生成的地址和groq的地址拼接起来就是国内可以访问的url地址:
https://epic-gecko-41.deno.dev/api.groq.com/openai/v1/chat/completions
如何使用,以openwebui 为例,其他AI模型都可以参照这个
代理地址填入刚才拼接生成的地址,apikey就填写groq的apikey
回答速度超级快。
如果用python调用,回答结果如下:
Github项目地址:
https://github.com/wuhanwhite/geno_groq_proxyhttps://github.com/wuhanwhite/geno_groq_proxy