如何用 Groq API 免费使用 DeepSeek-R1 70B,并通过 Deno 实现国内访问
这几天都被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 requests
def 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 content
else:
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