在Go中使用aiplatformpb GenerateContentRequest遇404错误如何解决?
Go调用Gemini Pro出现404错误的解决方法
使用Go 1.22.1和aiplatform 1.64包调用Gemini Pro时,遇到以下错误:
rpc error: code = Unimplemented desc = unexpected HTTP status code received from server: 404 (Not Found); transport: received unexpected content-type "text/html; charset=UTF-8"
问题代码(Go)
func googleGemini() string { ctx := context.Background() client, err := aiplatform.NewPredictionClient(ctx) if err != nil { log.Printf("[googleGemini] ERROR! %v", err) return "" } var parts []*aiplatformpb.Part parts = append(parts, &aiplatformpb.Part{ Data: &aiplatformpb.Part_Text{ Text: "Hello!", }, }) content := &aiplatformpb.Content{ Role: "user", Parts: parts, } // endpoint := "us-central1-aiplatform.googleapis.com" model := "gemini-1.0-pro-001" location := "us-central1" contentRequest := aiplatformpb.GenerateContentRequest{ Model: fmt.Sprintf( "projects/%s/locations/%s/publishers/google/models/%s", PROJECT_ID(), location, model), Contents: []*aiplatformpb.Content{content}, } resp, err := client.GenerateContent(ctx, &contentRequest) if err != nil { log.Printf("[googleGemini] ERROR! %v", err) return "" } return resp.Candidates[0].Content.Parts[0].GetText() }
可正常运行的curl命令
cat << EOF > request.json { "contents": [ { "role": "user", "parts": [ { "text": "Hello!" } ] } ] } EOF API_ENDPOINT="us-central1-aiplatform.googleapis.com" PROJECT_ID="$(gcloud config get project)" MODEL_ID="gemini-1.0-pro-001" LOCATION_ID="us-central1" curl \ -X POST \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Type: application/json" \ "https://${API_ENDPOINT}/v1/projects/${PROJECT_ID}/locations/${LOCATION_ID}/publishers/google/models/${MODEL_ID}:streamGenerateContent" -d '@request.json'
错误原因及修正
核心问题:未指定区域Endpoint
aiplatform.NewPredictionClient默认使用全局Endpoint(aiplatform.googleapis.com),但你的Gemini模型部署在us-central1区域,必须显式指定对应区域的Endpoint,否则请求会发送到错误地址导致404。
修正后的代码
func googleGemini() string { ctx := context.Background() // 显式配置区域Endpoint endpoint := "us-central1-aiplatform.googleapis.com:443" client, err := aiplatform.NewPredictionClient(ctx, option.WithEndpoint(endpoint)) if err != nil { log.Printf("[googleGemini] ERROR! %v", err) return "" } defer client.Close() // 确保客户端资源释放 var parts []*aiplatformpb.Part parts = append(parts, &aiplatformpb.Part{ Data: &aiplatformpb.Part_Text{ Text: "Hello!", }, }) content := &aiplatformpb.Content{ Role: "user", Parts: parts, } model := "gemini-1.0-pro-001" location := "us-central1" contentRequest := aiplatformpb.GenerateContentRequest{ Model: fmt.Sprintf( "projects/%s/locations/%s/publishers/google/models/%s", PROJECT_ID(), location, model), Contents: []*aiplatformpb.Content{content}, } resp, err := client.GenerateContent(ctx, &contentRequest) if err != nil { log.Printf("[googleGemini] ERROR! %v", err) return "" } return resp.Candidates[0].Content.Parts[0].GetText() }
关键修改点
- 添加
option.WithEndpoint(endpoint)参数创建客户端,指定us-central1区域的Endpoint - 增加
defer client.Close()语句,避免资源泄漏
内容的提问来源于stack exchange,提问作者Neil C. Obremski
相关产品推荐
相关产品推荐

