当前位置: 首页 > article >正文

如何用 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 的几个特点:

  1. 内置 TypeScript 支持:Deno 原生支持 TypeScript,无需额外配置。
  2. 安全性:默认情况下,Deno 对文件、网络和环境变量访问进行限制,只有明确授权的操作才可以执行。
  3. 标准库:Deno 提供了一套标准库,不依赖第三方包管理工具(如 npm)。
  4. 简洁的模块系统:模块直接通过 URL 引入,而不是依赖本地的 package.json。
  5. 单一二进制文件: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


http://www.kler.cn/a/526401.html

相关文章:

  • DeepSeek介绍及使用ollama本地化部署DeepSeek-R1大模型
  • Docker/K8S
  • qt内部的特殊技巧【QT】
  • C++ 中用于控制输出格式的操纵符——setw 、setfill、setprecision、fixed
  • 开发环境搭建-4:WSL 配置 docker 运行环境
  • RocketMQ 中如何实现消息的可靠传递?
  • 青少年编程与数学 02-007 PostgreSQL数据库应用 20课题、连接与ORM
  • Maven的单元测试
  • Deepseek技术浅析(二):大语言模型
  • 【信息系统项目管理师-选择真题】2005下半年综合知识答案和详解
  • 【2024年华为OD机试】 (A卷,100分)- 异常的打卡记录(JavaScriptJava PythonC/C++)
  • 【原创改进】SCI级改进算法,一种多策略改进Alpha进化算法(IAE)
  • SAP系统中的主要采购类型/采购模式总结
  • 应用程序中处理文件上传的方法
  • Linux-Robust-Futex学习笔记
  • Timer计时器
  • 从0到1:C++ 开启游戏开发奇幻之旅(二)
  • 我的求职面经:(1)C++里指针和数组的区别
  • 【异或和之差——Trie,DP】
  • 基于Springboot的社区药房管理系统
  • 【练习】PAT 乙 1023 组个最小数
  • 镭速大文件传输自动选择压缩算法原理
  • 学技术学英语:elasticsearch查询的两阶段queryingfetching
  • 如何监控ubuntu系统某个程序的运行状态,如果程序出现异常,对其自动重启。
  • MATLAB的数据类型和各类数据类型转化示例
  • 基于新一代电子电器架构的SOA服务设计方法