// Edge AI Gateway 使用示范 (Go 版本) // // 演示 Go 应用如何调用 Edge AI Gateway 的 OpenAI 兼容 API。 // // 运行:go run examples/demo_usage.go package main import ( "bufio" "encoding/json" "fmt" "io" "net/http" "strings" ) const ( BaseURL = "http://localhost:8080" APIKey = "test-key" ) func main() { // === 1. 非流式对话 === fmt.Println("=== 非流式对话 ===") resp := doPost(BaseURL+"/v1/chat/completions", map[string]any{ "model": "general-chat", "messages": []map[string]string{{"role": "user", "content": "你好,介绍一下你自己"}}, "stream": false, }) fmt.Printf("回复: %s\n", resp["choices"].([]any)[0].(map[string]any)["message"].(map[string]any)["content"]) fmt.Printf("模型: %s\n", resp["actual_model"]) fmt.Println() // === 2. 流式对话 (SSE) === fmt.Println("=== 流式对话 ===") doStream(BaseURL+"/v1/chat/completions", map[string]any{ "model": "fast-chat", "messages": []map[string]string{{"role": "user", "content": "写一个Go hello world"}}, "stream": true, }) fmt.Println() // === 3. 查看模型列表 === fmt.Println("=== 可用模型 ===") resp2 := doGet(BaseURL + "/v1/models") for _, m := range resp2["data"].([]any) { fmt.Printf(" - %s\n", m.(map[string]any)["id"]) } fmt.Println() // === 4. 会话管理 === fmt.Println("=== 会话管理 ===") sess := doPost(BaseURL+"/v1/sessions", map[string]any{ "application_id": "demo-app", "user_id": "user1", }) sessionID := sess["session_id"].(string) fmt.Printf("创建会话: %s\n\n", sessionID) // === 5. 错误处理 === fmt.Println("=== 错误处理 ===") // 无认证 resp3, _ := http.Get(BaseURL + "/v1/models") fmt.Printf("无认证: HTTP %d\n", resp3.StatusCode) resp3.Body.Close() // 缺少 model resp4 := doPost(BaseURL+"/v1/chat/completions", map[string]any{ "messages": []map[string]string{{"role": "user", "content": "hi"}}, }) if err, ok := resp4["error"]; ok { fmt.Printf("缺少model: %s\n", err.(map[string]any)["code"]) } fmt.Println("\n✅ 示范完成!") } func doPost(url string, body map[string]any) map[string]any { b, _ := json.Marshal(body) req, _ := http.NewRequest("POST", url, strings.NewReader(string(b))) req.Header.Set("Content-Type", "application/json") req.Header.Set("Authorization", "Bearer "+APIKey) resp, err := http.DefaultClient.Do(req) if err != nil { fmt.Printf("请求失败: %v\n", err) return nil } defer resp.Body.Close() data, _ := io.ReadAll(resp.Body) var result map[string]any json.Unmarshal(data, &result) return result } func doGet(url string) map[string]any { req, _ := http.NewRequest("GET", url, nil) req.Header.Set("Authorization", "Bearer "+APIKey) resp, err := http.DefaultClient.Do(req) if err != nil { fmt.Printf("请求失败: %v\n", err) return nil } defer resp.Body.Close() data, _ := io.ReadAll(resp.Body) var result map[string]any json.Unmarshal(data, &result) return result } func doStream(url string, body map[string]any) { b, _ := json.Marshal(body) req, _ := http.NewRequest("POST", url, strings.NewReader(string(b))) req.Header.Set("Content-Type", "application/json") req.Header.Set("Authorization", "Bearer "+APIKey) resp, err := http.DefaultClient.Do(req) if err != nil { fmt.Printf("请求失败: %v\n", err) return } defer resp.Body.Close() scanner := bufio.NewScanner(resp.Body) for scanner.Scan() { line := scanner.Text() if !strings.HasPrefix(line, "data: ") { continue } data := strings.TrimPrefix(line, "data: ") if data == "[DONE]" { return } var chunk map[string]any json.Unmarshal([]byte(data), &chunk) choices := chunk["choices"].([]any) delta := choices[0].(map[string]any)["delta"].(map[string]any) if content, ok := delta["content"]; ok { fmt.Print(content.(string)) } } if err := scanner.Err(); err != nil { fmt.Printf("\nstream error: %v\n", err) } }