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

用 Go + GitHub Models API 打造一个免费的 ChatBot

用 Go + GitHub Models API 打造一个免费的 ChatBot


需求

  • 在终端里运行一个小程序
  • 给它一段输入,它能调用大模型并返回结果

为什么选择 GitHub Models API

  • 免费:GitHub 提供免费额度(只需申请一个 token)。
  • 兼容 OpenAI 格式:请求方式几乎和 OpenAI 一模一样。
  • 安全可靠:用的是 GitHub 官方 API,不怕跑路。

准备工作

1. 获取 GitHub Token

进入 GitHub 设置 → 选择 Generate new token (classic)

  • Token 名称:随便起,比如 ChatBoy API
  • 权限:勾选 models:read
  • 生成后复制保存(只显示一次!)

2. 配置环境变量

可以写到 .env 文件里:

GITHUB_TOKEN=你的token

或者在 PowerShell 里:

$env:GITHUB_TOKEN="你的token"

代码实现

最终我写了一个 chatboy 小程序:

// main.go
package mainimport ("bufio""bytes""context""encoding/json""fmt""net/http""os""strings"
)// 消息结构
type Message struct {Role    string `json:"role"`Content string `json:"content"`
}// GitHub Models API 响应结构
type GitHubModelsResponse struct {Choices []struct {Message Message `json:"message"`} `json:"choices"`Error struct {Message string `json:"message"`} `json:"error"`
}// 加载 .env 文件
func loadEnvFile(filename string) error {file, err := os.Open(filename)if err != nil {return err}defer file.Close()scanner := bufio.NewScanner(file)for scanner.Scan() {line := strings.TrimSpace(scanner.Text())if line == "" || strings.HasPrefix(line, "#") {continue}parts := strings.SplitN(line, "=", 2)if len(parts) == 2 {key := strings.TrimSpace(parts[0])value := strings.TrimSpace(parts[1])if len(value) >= 2 && ((value[0] == '"' && value[len(value)-1] == '"') || (value[0] == '\'' && value[len(value)-1] == '\'')) {value = value[1 : len(value)-1]}os.Setenv(key, value)}}return scanner.Err()
}// GitHub Models API 调用
func callGitHubModels(message, apiKey string) error {fmt.Println("🐙 使用 GitHub Models API")url := "https://models.github.ai/inference/chat/completions"reqBody := map[string]interface{}{"model": "openai/gpt-4o-mini", // 免费高质量模型"messages": []Message{{Role: "user", Content: message},},"max_tokens":  200,"temperature": 0.7,}body, _ := json.Marshal(reqBody)req, _ := http.NewRequestWithContext(context.Background(), "POST", url, bytes.NewBuffer(body))req.Header.Set("Content-Type", "application/json")req.Header.Set("Authorization", "Bearer "+apiKey)resp, err := http.DefaultClient.Do(req)if err != nil {return err}defer resp.Body.Close()if resp.StatusCode != 200 {return fmt.Errorf("API 响应错误: HTTP %d", resp.StatusCode)}var result GitHubModelsResponse_ = json.NewDecoder(resp.Body).Decode(&result)if result.Error.Message != "" {return fmt.Errorf("API 错误: %s", result.Error.Message)}if len(result.Choices) > 0 {fmt.Println("🤖 AI回复:", result.Choices[0].Message.Content)return nil}return fmt.Errorf("未收到有效响应")
}func main() {fmt.Println("🎯 ChatBoy - GitHub Models 版本")loadEnvFile(".env")githubToken := os.Getenv("GITHUB_TOKEN")if githubToken == "" {fmt.Println("❌ 未找到 GITHUB_TOKEN 环境变量")os.Exit(1)}message := "你好!请用中文简单介绍一下你自己。"fmt.Printf("💬 测试消息: %s\n", message)if err := callGitHubModels(message, githubToken); err != nil {fmt.Println("❌ API 调用失败:", err)os.Exit(1)}fmt.Println("🎉 测试成功!")
}

运行:

go mod init chatboy
go mod tidy
go run main.go

效果

终端输出大概是这样:

🎯 ChatBoy - GitHub Models 版本
💬 测试消息: 你好!请用中文简单介绍一下你自己。
🐙 使用 GitHub Models API
🤖 AI回复: 你好,我是一个由 GitHub 提供的 AI 模型,可以帮助回答问题、生成文本和协助开发任务。
🎉 测试成功!

http://www.xdnf.cn/news/1353475.html

相关文章:

  • 全面解析JVM预热:原理、价值与实践指南
  • MYSQL-约束
  • 【数据结构】线性表——链表
  • 微服务的编程测评系统15-头像上传-OSS
  • 高阶数据结构---ST表
  • kafaka知识要点
  • VLOOKUP专题训练
  • UE C++ 堆化
  • windows中bat脚本的一些操作(三)
  • 算法第五十五天:图论part05(第十一章)
  • 图论与最短路学习笔记
  • 【数据结构】跳表的概率模型详解与其 C 代码实现
  • 深度学习开篇
  • `strlen` 字符串长度函数
  • python 字典有序性的实现和OrderedDict
  • 计算机网络 各版本TLS握手的详细过程
  • 电脑零广告快响应提速(一)之卸载搜狗输入法使用RIME—东方仙盟
  • python re模块常用方法
  • MySQL详细介绍指南
  • 蓝牙aoa仓库管理系统功能介绍
  • [e3nn] 归一化 | BatchNorm normalize2mom
  • 【技术突破】动态目标误检率↓83.5%!陌讯多模态融合算法在智慧城管的实战优化
  • 基于电力电子变压器的高压脉冲电源方案复现
  • 使用 Certbot 申请 Apache 证书配置棘手问题
  • 【数据结构】计数排序:有时比快排还快的整数排序法
  • Ubuntu 操作系统深度解析:从入门到精通(2025 最新版)
  • Java JVM 超级详细指南
  • 在Linux环境中为Jupyter Lab安装Node.js环境
  • 云计算之云主机Linux是什么?有何配置?如何选?
  • JavaSpring+mybatis+Lombok,实现java架构[保姆教程]