当前位置: 首页 > 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.dtcms.com/a/347234.html

相关文章:

  • 金山办公的服务端开发工程师-25届春招笔试编程题
  • 密码实现安全基础篇 . KAT(已知答案测试)技术解析与实践
  • 微服务的编程测评系统15-头像上传-OSS
  • Ceph OSD 硬盘重连导致设备名变化
  • 访问网络附加存储
  • `strcat` 字符串连接函数
  • 一文学会vue的动态权限控制
  • 3.Shell 变量入门:变量定义、赋值、取值($var)及环境变量与局部变量区别详解
  • PYTHON让繁琐的工作自动化-列表
  • 07_模块和包
  • UNet改进(34):ACmix-UNet混合架构的PyTorch
  • 动手学深度学习(pytorch版):第六章节—卷积神经网络(1)从全连接层到卷积
  • 避开MES实施的“坑”:详解需求、开发、上线决胜点
  • 自动化知识工作AI代理的工程与产品实现
  • Node.js 和 Express 面试问题总结
  • Ubuntu通过 systemd 管理 gpt4free,需为其创建 g4f.service 文件,定义服务的启动、停止等操作(未实践)
  • Java基础 8.23
  • 【8位数取中间4位数】2022-10-23
  • LangChain4J-基础(整合Spring、RAG、MCP、向量数据库、提示词、流式输出)
  • QT-常用类
  • 【GPT入门】第57课 详解 LLamaFactory 与 XTuner 实现大模型多卡分布式训练的方案与实践
  • calchash.exe和chckhash.exe计算pe文件hash值的两个实用小工具
  • 【Linux系统】命名管道与共享内存
  • 结构化数据与非结构化数据的区别、特点和应用场景
  • Games 101 第四讲 Transformation Cont(视图变换和投影变换)
  • Java22 stream 新特性 窗口算子:GathererOp 和 GatherSink
  • Flink2.0学习笔记:使用HikariCP 自定义sink实现数据库连接池化
  • 权限管理模块
  • 用 Ansible 优雅部署 Kubernetes 1.33.3(RedHat 10)
  • 第一章:启航篇 —— 新晋工程师的生存与扎根 (1)