• golang调用阿里通义千问的接口


    有的项目可能需要用到直接外部调用阿里通义千问的接口。官方只有python和java的sdk。

    其实golang简单的调用也非常简单,就是一个封装的http调用,下面是具体的代码。

    注意提前申请apiKey.

    package tongyi
    
    import (
    	"bytes"
    	"context"
    	"encoding/json"
    	"fmt"
    	"net/http"
    )
    
    type TongYiClient struct {
    	apiKey string
    }
    
    type TongYiRsp struct {
    	Output struct {
    		Text         string `json:"text"`
    		FinishReason string `json:"finish_reason"`
    	} `json:"output"`
    	Usage struct {
    		OutputTokens int `json:"output_tokens"`
    		InputTokens  int `json:"input_tokens"`
    	} `json:"usage"`
    	RequestID string `json:"request_id"`
    }
    
    func NewTongYiClient(apiKey string) *TongYiClient {
    	return &TongYiClient{
    		apiKey: apiKey,
    	}
    }
    
    func (c *TongYiClient) GenerateText(ctx context.Context, prompt string, history ...map[string]string) (*TongYiRsp, error) {
    	// 构建请求数据
    	data := map[string]interface{}{
    		"model":      "qwen-turbo",
    		"parameters": map[string]interface{}{},
    		"input": map[string]interface{}{
    			"prompt":  prompt,
    			"history": history,
    		},
    	}
    
    	// 转换为JSON格式
    	payload, err := json.Marshal(data)
    	if err != nil {
    		return nil, err
    	}
    
    	// 构建请求
    	url := "https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation"
    	req, err := http.NewRequest("POST", url, bytes.NewBuffer(payload))
    	if err != nil {
    		return nil, err
    	}
    
    	// 设置请求头部
    	req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", c.apiKey))
    	req.Header.Set("Content-Type", "application/json")
    
    	// 发送请求
    	client := &http.Client{}
    	resp, err := client.Do(req)
    	if err != nil {
    		return nil, err
    	}
    	defer resp.Body.Close()
    
    	// 检查HTTP响应状态码是否为200
    	if resp.StatusCode != http.StatusOK {
    		var errorResponse struct {
    			Code      string `json:"code"`
    			Message   string `json:"message"`
    			RequestID string `json:"request_id"`
    		}
    
    		err = json.NewDecoder(resp.Body).Decode(&errorResponse)
    		if err != nil {
    			return nil, err
    		}
    
    		return nil, fmt.Errorf("API error: %s - %s", errorResponse.Code, errorResponse.Message)
    	}
    
    	// 读取响应数据
    	response := &TongYiRsp{}
    	err = json.NewDecoder(resp.Body).Decode(&response)
    	if err != nil {
    		return nil, err
    	}
    
    	// 提取生成的文本并返回
    	return response, nil
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
  • 相关阅读:
    【算法-动态规划】斐波那契第 n 项
    我的创作纪念日-从写作到阿里云专家博主的故事
    亿图导出word和PDF中清晰度保留方法
    【系统设计系列】 DNS和CDN
    celery笔记九之task运行结果查看
    RK3568 Android11 编译报错
    HarmonyOS NEXT应用开发—在Native侧实现进度通知功能
    鸿蒙HarmonyOS实战-工具安装和Helloworld案例
    flutter开发实战-Universal Links配置及flutter微信分享实现
    synchronized同步以及双重检索
  • 原文地址:https://blog.csdn.net/hjx_dou/article/details/138171777