如何用 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/961945.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

docker配置mysql并使用mysql connector cpp编程

mysql 配置mysql使用docker 这里使用docker安装了&#xff0c;比较简洁&#xff0c;不想使用了直接就可以把容器删掉&#xff0c;首先获取下镜像&#xff0c;如下命令 docker pull container-registry.oracle.com/mysql/community-server这里直接默认使用最新版本的mysql了 …

STM32 TIM输入捕获 测量频率

输入捕获简介&#xff1a; IC&#xff08;Input Capture&#xff09;输入捕获 输入捕获模式下&#xff0c;当通道输入引脚出现指定电平跳变时&#xff0c;当前CNT的值将被锁存到CCR中&#xff0c;可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数 每个高级定时器…

【已解决】windows7虚拟机安装VMtools频繁报错

为了在虚拟机VMware中安装win7&#xff0c;题主先在网上下载了windows7 professional版本的镜像&#xff0c;在vmware中安装vmtools时报错&#xff0c;信息如下 &#xff08;安装程序无法继续&#xff0c;本程序需要您将此虚拟机上安装的操作系统更新到SP1&#xff09; 然后就…

7.抽象工厂(Abstract Factory)

抽象工厂与工厂方法极其类似&#xff0c;都是绕开new的&#xff0c;但是有些许不同。 动机 在软件系统中&#xff0c;经常面临着“一系列相互依赖的对象”的创建工作&#xff1b;同时&#xff0c;由于需求的变化&#xff0c;往往存在更多系列对象的创建工作。 假设案例 假设…

电路研究9.2.3——合宙Air780EP中FTP——FTPGET 命令使用方法研究

怎么说呢&#xff0c;之前也是看的&#xff0c;但是也很迷茫&#xff0c;感觉上虽然是对的&#xff0c;但是无法联系到应用里面&#xff0c;今天研究一下FTP 命令使用方法吧。 15.29 使用方法举例 这里发现下面那些看的不懂呢&#xff0c;于是就返回FTP的应用了。 9.5.4 FTP 应…

高精度加法乘法

高精度加法&乘法都是把数字转化成数组进行运算&#xff0c;存储 高精度加法 建议多在纸上画画&#xff0c;梳理思路 代码实现 输入字符串 //初始化数组存储 int a[250]{0}; int b[250]{0}; int c[251]{0}; //定义字符串&#xff0c;输入字符串 string s1,s2; getline(c…

【C++】STL介绍 + string类使用介绍 + 模拟实现string类

目录 前言 一、STL简介 二、string类 1.为什么学习string类 2.标准库中的string类 3.auto和范围for 4.迭代器 5.string类的常用接口说明 三、模拟实现 string类 前言 本文带大家入坑STL&#xff0c;学习第一个容器string。 一、STL简介 在学习C数据结构和算法前&#xff0c;我…

数据结构的队列

一.队列 1.队列&#xff08;Queue&#xff09;的概念就是先进先出。 2.队列的用法&#xff0c;红色框和绿色框为两组&#xff0c;offer为插入元素&#xff0c;poll为删除元素&#xff0c;peek为查看元素红色的也是一样的。 3.LinkedList实现了Deque的接口&#xff0c;Deque又…

【开源免费】基于SpringBoot+Vue.JS体育馆管理系统(JAVA毕业设计)

本文项目编号 T 165 &#xff0c;文末自助获取源码 \color{red}{T165&#xff0c;文末自助获取源码} T165&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

LabVIEW温度修正部件测试系统

LabVIEW温度修正部件测试系统 这个基于LabVIEW的温度修正部件测试系统旨在解决飞行器温度测量及修正电路的测试需求。该系统的意义在于提供一个可靠的测试平台&#xff0c;用于评估温度修正部件在实际飞行器环境中的性能表现&#xff0c;从而确保飞行器的安全性和可靠性。 系统…

vim的特殊模式-可视化模式

可视化模式&#xff1a;按 v进入可视化模式 选中 y复制 d剪切/删除 可视化块模式: ctrlv 选中 y复制 d剪切/删除 示例&#xff1a; &#xff08;vim可视化模式的进阶使用&#xff1a;vim可视化模式的进阶操作-CSDN博客&#xff09;

mysql重学(一)mysql语句执行流程

思考 一条查询语句如何执行&#xff1f;mysql语句中若列不存在&#xff0c;则在哪个阶段报错一条更新语句如何执行&#xff1f;redolog和binlog的区别&#xff1f;为什么要引入WAL什么是Changbuf&#xff1f;如何工作写缓冲一定好吗&#xff1f;什么情况会引发刷脏页删除语句会…

【Docker】Docker入门了解

文章目录 Docker 的核心概念Docker 常用命令示例&#xff1a;构建一个简单的 C 应用容器1. 创建 C 应用2. 创建 Dockerfile3. 构建镜像4. 运行容器 Docker 优势学习 Docker 的下一步 **一、Docker 是什么&#xff1f;****为什么 C 开发者需要 Docker&#xff1f;** **二、核心概…

使用langchain ollama gradio搭建一个本地基于deepseek r1的RAG问答系统

目录 简介 环境配置 具体实现 安装依赖 定义模型和prompt 加载检索文档 切割 向量存储 创建检索器 实例化 前端搭建 实现效果 小tips 简介 首先介绍一下使用的几个工具&#xff0c;模型和rag的步骤&#xff0c;注&#xff1a;这里只是简单描述一下&#xff0c;不展…

Python中的函数(下)

函数返回值 返回单个值 函数可以通过 return 语句返回一个值。一旦执行到 return 语句&#xff0c;函数就会停止执行&#xff0c;并将指定的值返回给调用者。例如&#xff1a; 返回多个值 实际上&#xff0c;Python函数只能返回一个值&#xff0c;但可以通过返回一个元组来模…

Spring Boot + Facade Pattern : 通过统一接口简化多模块业务

文章目录 Pre概述在编程中&#xff0c;外观模式是如何工作的&#xff1f;外观设计模式 UML 类图外观类和子系统的关系优点案例外观模式在复杂业务中的应用实战运用1. 项目搭建与基础配置2. 构建子系统组件航班服务酒店服务旅游套餐服务 3. 创建外观类4. 在 Controller 中使用外…

安卓(android)实现注册界面【Android移动开发基础案例教程(第2版)黑马程序员】

一、实验目的&#xff08;如果代码有错漏&#xff0c;可查看源码&#xff09; 1.掌握LinearLayout、RelativeLayout、FrameLayout等布局的综合使用。 2.掌握ImageView、TextView、EditText、CheckBox、Button、RadioGroup、RadioButton、ListView、RecyclerView等控件在项目中的…

Prompt提示词完整案例:让chatGPT成为“书单推荐”的高手

大家好&#xff0c;我是老六哥&#xff0c;我正在共享使用AI提高工作效率的技巧。欢迎关注我&#xff0c;共同提高使用AI的技能&#xff0c;让AI成功你的个人助理。 许多人可能会跟老六哥一样&#xff0c;有过这样的体验&#xff1a;当我们遇到一个能力出众或对事物有独到见解的…

智慧园区管理平台实现智能整合提升企业运营模式与管理效率

内容概要 在当今数字化的背景下&#xff0c;智慧园区管理平台正逐渐成为企业提升运营效率和管理模式的重要工具。这个平台汇聚了多种先进技术&#xff0c;旨在通过智能整合各类资源与信息&#xff0c;帮助企业实现全面的管理创新。 智慧园区管理平台不仅仅是一个数据处理工具…

Baklib如何提升企业知识管理效率与市场竞争力的五大对比分析

内容概要 在信息化时代&#xff0c;企业在知识管理方面面临着巨大的挑战与机遇。为了有效应对这些挑战&#xff0c;“Baklib”作为一个知识中台&#xff0c;通过其高度集成的数字化平台&#xff0c;为企业提供全方位的知识管理解决方案。特别是在以下五个领域&#xff0c;它展…