• 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
  • 相关阅读:
    MySQL 中索引是如何实现的,有哪些类型的索引,如何进行优化索引
    排序算法总结
    客服聊天配置遗漏
    ubunbtu下基于c++实现MQTT客户端通信
    力扣打卡之单调栈问题
    图像处理之图像统计特性
    Chrome谷歌浏览器加载ActiveX控件之allWebDesktop控件介绍
    手把手写深度学习(17):用LSTM为图片生成文字描述(Image-to-text任务)
    AWS无服务器 应用程序开发—第十六章 CI/CD CodeBuild
    概率dp专题
  • 原文地址:https://blog.csdn.net/hjx_dou/article/details/138171777