用 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 模型,可以帮助回答问题、生成文本和协助开发任务。
🎉 测试成功!
–