openai-go通过SOCKS5代理调用外网大模型

首先通过Shadowscoks配置代理成功科学上网

(具体方式自己查找)

使用curl进行测试

Gemini示例

bash 复制代码
# !/bin/bash
curl --socks5 127.0.0.1:1080 "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent" \
  -H 'Content-Type: application/json' \
  -H 'X-goog-api-key: GEMINI_API_KEY' \
  -X POST \
  -d '{
    "contents": [
      {
        "parts": [
          {
            "text": "Introduce yourself"
          }
        ]
      }
    ]
  }'

Gork示例

bash 复制代码
# !/bin/bash
curl --socks5 127.0.0.1:1080 "https://api.x.ai/v1/chat/completions" \
   -H "Content-Type: application/json" \
   -H "Authorization: Bearer X_API_KEY" \
   -d '{
     "messages": [
       {
         "role": "system",
         "content": "You are a test assistant."
       },
       {
         "role": "user",
         "content": "Testing. Just say hi and hello world and nothing else."
       }
     ],
     "model": "grok-2-latest",
     "stream": false,
     "temperature": 0
   }'

使用go语言和openai-go

go 复制代码
package main

import (
	"context"
	"fmt"
	"log"
	"net"
	"net/http"
	"time"

	"github.com/openai/openai-go/v3"
	"github.com/openai/openai-go/v3/option"
	"golang.org/x/net/proxy"
)

// newHTTPClientWithSocks5 创建一个走 SOCKS5 代理的 http.Client
func newHTTPClientWithSocks5(proxyAddr string) (*http.Client, error) {
	dialer, err := proxy.SOCKS5("tcp", proxyAddr, nil, proxy.Direct)
	if err != nil {
		return nil, fmt.Errorf("create socks5 dialer: %w", err)
	}

	transport := &http.Transport{
		DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) {
			// 注意:dialer.Dial 的签名是不带 context 的,因此忽略 ctx 并直接调用它。
			return dialer.Dial(network, addr)
		},
	}

	return &http.Client{Transport: transport}, nil
}

func main() {
	// 1) 安全:不要在代码中硬编码 API Key。优先从环境变量读取。
	apiKey := "GEMINI_API_KEY" // 填写实际的GEMINI_API_KEY
	baseUrl := "https://generativelanguage.googleapis.com/v1beta"
	model := "gemini-2.0-flash"
        
	// apiKey := "X_API_KEY" // 填写实际的X_API_KEY
	// baseUrl := "https://api.x.ai/v1"
	// model := "grok-2-latest"
        
	// 2) SOCKS5 代理地址,也可从环境变量或配置文件读取
	socks5Addr := "127.0.0.1:1080"
	httpClient, err := newHTTPClientWithSocks5(socks5Addr)
	if err != nil {
		log.Fatalf("failed to create http client with socks5: %v", err)
	}

	client := openai.NewClient(
		option.WithAPIKey(apiKey),
		option.WithBaseURL(baseUrl),
		option.WithHTTPClient(httpClient),
	)

	// =============== 发起请求 ===============
	// 使用带超时的 context,避免网络请求无限期挂起
	ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second)
	defer cancel()

	chatCompletion, err := client.Chat.Completions.New(ctx, openai.ChatCompletionNewParams{
		Model: model,
		Messages: []openai.ChatCompletionMessageParamUnion{
			openai.UserMessage("请详细介绍一下你自己"),
		},
	})
	if err != nil {
		// 更友好的错误处理:记录并退出
		log.Fatalf("chat completion request failed: %v", err)
	}

	fmt.Println("Gemini Response:")
	if len(chatCompletion.Choices) == 0 {
		fmt.Println("no choices returned")
		return
	}
	fmt.Println(chatCompletion.Choices[0].Message.Content)
}
相关推荐
星辞树1 小时前
MIT 6.824 Lab 3 通关实录:从 Raft 到高可用 KV 存储
后端
世优科技虚拟人1 小时前
2026数字展厅设计核心关键,AI数字人交互大屏加速智慧展厅升级改造
人工智能·大模型·数字人·智慧展厅·展厅设计
艾莉丝努力练剑2 小时前
【Python基础:语法第一课】Python 基础语法详解:变量、类型、动态特性与运算符实战,构建完整的编程基础认知体系
大数据·人工智能·爬虫·python·pycharm·编辑器
q***33372 小时前
Spring Boot项目接收前端参数的11种方式
前端·spring boot·后端
MobotStone2 小时前
数字沟通之道
人工智能·算法
Together_CZ2 小时前
Cambrian-S: Towards Spatial Supersensing in Video——迈向视频中的空间超感知
人工智能·机器学习·音视频·spatial·cambrian-s·迈向视频中的空间超感知·supersensing
q***42822 小时前
SpringBoot Maven快速上手
spring boot·后端·maven
Victor3562 小时前
Redis(153)Redis的网络使用如何监控?
后端
码一行3 小时前
Eino AI 实战:解析 PDF 文件 & 实现 MCP Server
后端·go