From 81c5f604cab52b434e13539c8642304b0a914480 Mon Sep 17 00:00:00 2001 From: cosmo Date: Fri, 17 May 2024 17:09:14 +0800 Subject: [PATCH] beta119 --- applogic/hunyuan.go | 266 ++++++++++++- applogic/rwkv.go | 39 +- applogic/tongyiqianwen.go | 4 +- config/config.go | 100 +++++ hunyuan/client.go | 256 +++++++++++-- hunyuan/errors.go | 6 +- hunyuan/models.go | 719 +++++++++++++++++++++++++++++++----- structs/struct.go | 7 +- template/config_template.go | 5 +- utils/utils.go | 11 + 10 files changed, 1257 insertions(+), 156 deletions(-) diff --git a/applogic/hunyuan.go b/applogic/hunyuan.go index 8168e87..2efd13a 100644 --- a/applogic/hunyuan.go +++ b/applogic/hunyuan.go @@ -114,9 +114,22 @@ func (app *App) ChatHandlerHunyuan(w http.ResponseWriter, r *http.Request) { } } } else { - history, err = prompt.GetMessagesFromFilename(promptstr) - if err != nil { - fmtf.Printf("prompt.GetMessagesFromFilename error: %v\n", err) + // 默认执行 正常提示词顺序 + if !config.GetEnhancedQA(promptstr) { + history, err = prompt.GetMessagesFromFilename(promptstr) + if err != nil { + fmtf.Printf("prompt.GetMessagesFromFilename error: %v\n", err) + } + } else { + // 只获取系统提示词 + systemMessage, err := prompt.GetFirstSystemMessageStruct(promptstr) + if err != nil { + fmt.Println("Error:", err) + } else { + // 如果找到system消息,将其添加到历史数组中 + history = append(history, systemMessage) + fmt.Println("Added system message back to history.") + } } } @@ -137,31 +150,38 @@ func (app *App) ChatHandlerHunyuan(w http.ResponseWriter, r *http.Request) { // 获取系统级预埋的系统自定义QA对 systemHistory, err := prompt.GetMessagesExcludingSystem(promptstr) if err != nil { - fmtf.Printf("Error getting system history: %v\n", err) + fmtf.Printf("Error getting system history: %v,promptstr[%v]\n", err, promptstr) return } // 处理增强QA逻辑 if config.GetEnhancedQA(promptstr) { - // 确保系统历史与用户或助手历史数量一致,如果不足,则补足空的历史记录 - // 因为最后一个成员让给当前QA,所以-1 - if len(systemHistory)-2 > len(userHistory) { - difference := len(systemHistory) - len(userHistory) + systemHistory, err := prompt.GetMessagesExcludingSystem(promptstr) + if err != nil { + fmt.Printf("Error getting system history: %v\n", err) + return + } + + // 计算需要补足的历史记录数量 + neededHistoryCount := len(systemHistory) - 2 // 最后两条留给当前QA处理 + if neededHistoryCount > len(userHistory) { + // 补足用户或助手历史 + difference := neededHistoryCount - len(userHistory) for i := 0; i < difference; i++ { - userHistory = append(userHistory, structs.Message{Text: "", Role: "user"}) - userHistory = append(userHistory, structs.Message{Text: "", Role: "assistant"}) + if i%2 != 0 { + userHistory = append(userHistory, structs.Message{Text: "", Role: "user"}) + } else { + userHistory = append(userHistory, structs.Message{Text: "", Role: "assistant"}) + } } } - // 如果系统历史中只有一个成员,跳过覆盖逻辑,留给后续处理 - if len(systemHistory) > 1 { - // 将系统历史(除最后2个成员外)附加到相应的用户或助手历史上,采用倒序方式处理最近的记录 - for i := 0; i < len(systemHistory)-2; i++ { - sysMsg := systemHistory[i] - index := len(userHistory) - len(systemHistory) + i - if index >= 0 && index < len(userHistory) && (userHistory[index].Role == "user" || userHistory[index].Role == "assistant") { - userHistory[index].Text += fmt.Sprintf(" (%s)", sysMsg.Text) - } + // 附加系统历史到用户或助手历史,除了最后两条 + for i := 0; i < len(systemHistory)-2; i++ { + sysMsg := systemHistory[i] + index := len(userHistory) - neededHistoryCount + i + if index >= 0 && index < len(userHistory) { + userHistory[index].Text += fmt.Sprintf(" (%s)", sysMsg.Text) } } } else { @@ -181,6 +201,16 @@ func (app *App) ChatHandlerHunyuan(w http.ResponseWriter, r *http.Request) { if config.GetHunyuanType() == 0 { // 构建 hunyuan 请求 request := hunyuan.NewChatProRequest() + // 配置块 + request.StreamModeration = new(bool) + *request.StreamModeration = config.GetHunyuanStreamModeration(promptstr) + request.Stream = new(bool) + *request.Stream = config.GetHunyuanStreamModeration(promptstr) + request.TopP = new(float64) + *request.TopP = config.GetTopPHunyuan(promptstr) + request.Temperature = new(float64) + *request.Temperature = config.GetTemperatureHunyuan(promptstr) + // 添加历史信息 for _, hMsg := range history { content := hMsg.Text // 创建新变量 @@ -335,9 +365,20 @@ func (app *App) ChatHandlerHunyuan(w http.ResponseWriter, r *http.Request) { fmtf.Fprintf(w, "data: %s\n\n", string(finalResponseJSON)) flusher.Flush() } - } else { + } else if config.GetHunyuanType() == 1 { // 构建 hunyuan 标准版请求 request := hunyuan.NewChatStdRequest() + + // 配置块 + request.StreamModeration = new(bool) + *request.StreamModeration = config.GetHunyuanStreamModeration(promptstr) + request.Stream = new(bool) + *request.Stream = config.GetHunyuanStreamModeration(promptstr) + request.TopP = new(float64) + *request.TopP = config.GetTopPHunyuan(promptstr) + request.Temperature = new(float64) + *request.Temperature = config.GetTemperatureHunyuan(promptstr) + // 添加历史信息 for _, hMsg := range history { content := hMsg.Text // 创建新变量 @@ -493,6 +534,191 @@ func (app *App) ChatHandlerHunyuan(w http.ResponseWriter, r *http.Request) { flusher.Flush() } + } else if config.GetHunyuanType() == 2 || config.GetHunyuanType() == 3 || config.GetHunyuanType() == 4 || config.GetHunyuanType() == 5 { + // 构建 hunyuan 请求 + request := hunyuan.NewChatCompletionsRequest() + // 添加历史信息 + for _, hMsg := range history { + content := hMsg.Text // 创建新变量 + role := hMsg.Role // 创建新变量 + hunyuanMsg := hunyuan.Message{ + Content: &content, // 引用新变量的地址 + Role: &role, // 引用新变量的地址 + } + request.Messages = append(request.Messages, &hunyuanMsg) + } + + // 添加当前用户消息 + currentUserContent := msg.Text // 创建新变量 + currentUserRole := msg.Role // 创建新变量 + currentUserMsg := hunyuan.Message{ + Content: ¤tUserContent, // 引用新变量的地址 + Role: ¤tUserRole, // 引用新变量的地址 + } + request.Messages = append(request.Messages, ¤tUserMsg) + + // 获取HunyuanType并设置对应的Model + switch config.GetHunyuanType() { + case 2: + request.Model = new(string) + *request.Model = "hunyuan-lite" + case 3: + request.Model = new(string) + *request.Model = "hunyuan-standard" + case 4: + request.Model = new(string) + *request.Model = "hunyuan-standard-256K" + case 5: + request.Model = new(string) + *request.Model = "hunyuan-pro" + default: + request.Model = new(string) + *request.Model = "default-value" + } + fmtf.Printf("请求的混元模型类型:%v", *request.Model) + request.StreamModeration = new(bool) + *request.StreamModeration = config.GetHunyuanStreamModeration(promptstr) + request.Stream = new(bool) + *request.Stream = config.GetHunyuanStreamModeration(promptstr) + request.TopP = new(float64) + *request.TopP = config.GetTopPHunyuan(promptstr) + request.Temperature = new(float64) + *request.Temperature = config.GetTemperatureHunyuan(promptstr) + + // 打印请求以进行调试 + utils.PrintChatCompletionsRequest(request) + + // 发送请求并获取响应 + response, err := app.Client.ChatCompletions(request) + if err != nil { + http.Error(w, fmtf.Sprintf("hunyuanapi返回错误: %v", err), http.StatusInternalServerError) + return + } + if !config.GetuseSse(promptstr) { + // 解析响应 + var responseTextBuilder strings.Builder + var totalUsage structs.UsageInfo + for event := range response.BaseSSEResponse.Events { + if event.Err != nil { + http.Error(w, fmtf.Sprintf("接收事件时发生错误: %v", event.Err), http.StatusInternalServerError) + return + } + + // 解析事件数据 + var eventData map[string]interface{} + if err := json.Unmarshal(event.Data, &eventData); err != nil { + http.Error(w, fmtf.Sprintf("解析事件数据出错: %v", err), http.StatusInternalServerError) + return + } + + // 使用extractEventDetails函数提取信息 + responseText, usageInfo := utils.ExtractEventDetails(eventData) + responseTextBuilder.WriteString(responseText) + totalUsage.PromptTokens += usageInfo.PromptTokens + totalUsage.CompletionTokens += usageInfo.CompletionTokens + } + // 现在responseTextBuilder中的内容是所有AI助手回复的组合 + responseText := responseTextBuilder.String() + + assistantMessageID, err := app.addMessage(structs.Message{ + ConversationID: msg.ConversationID, + ParentMessageID: userMessageID, + Text: responseText, + Role: "assistant", + }) + + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + // 构造响应 + responseMap := map[string]interface{}{ + "response": responseText, + "conversationId": msg.ConversationID, + "messageId": assistantMessageID, + "details": map[string]interface{}{ + "usage": totalUsage, + }, + } + + json.NewEncoder(w).Encode(responseMap) + } else { + // 设置SSE相关的响应头部 + w.Header().Set("Content-Type", "text/event-stream") + w.Header().Set("Cache-Control", "no-cache") + w.Header().Set("Connection", "keep-alive") + + flusher, ok := w.(http.Flusher) + if !ok { + http.Error(w, "Streaming unsupported!", http.StatusInternalServerError) + return + } + + var responseTextBuilder strings.Builder + var totalUsage structs.UsageInfo + + for event := range response.BaseSSEResponse.Events { + if event.Err != nil { + fmtf.Fprintf(w, "data: %s\n\n", fmtf.Sprintf("接收事件时发生错误: %v", event.Err)) + flusher.Flush() + continue + } + + // 解析事件数据和提取信息 + var eventData map[string]interface{} + if err := json.Unmarshal(event.Data, &eventData); err != nil { + fmtf.Fprintf(w, "data: %s\n\n", fmtf.Sprintf("解析事件数据出错: %v", err)) + flusher.Flush() + continue + } + + responseText, usageInfo := utils.ExtractEventDetails(eventData) + responseTextBuilder.WriteString(responseText) + totalUsage.PromptTokens += usageInfo.PromptTokens + totalUsage.CompletionTokens += usageInfo.CompletionTokens + + // 发送当前事件的响应数据,但不包含assistantMessageID + //fmtf.Printf("发送当前事件的响应数据,但不包含assistantMessageID\n") + tempResponseMap := map[string]interface{}{ + "response": responseText, + "conversationId": msg.ConversationID, + "details": map[string]interface{}{ + "usage": usageInfo, + }, + } + tempResponseJSON, _ := json.Marshal(tempResponseMap) + fmtf.Fprintf(w, "data: %s\n\n", string(tempResponseJSON)) + flusher.Flush() + } + + // 处理完所有事件后,生成并发送包含assistantMessageID的最终响应 + responseText := responseTextBuilder.String() + fmtf.Printf("处理完所有事件后,生成并发送包含assistantMessageID的最终响应:%v\n", responseText) + assistantMessageID, err := app.addMessage(structs.Message{ + ConversationID: msg.ConversationID, + ParentMessageID: userMessageID, + Text: responseText, + Role: "assistant", + }) + + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + finalResponseMap := map[string]interface{}{ + "response": responseText, + "conversationId": msg.ConversationID, + "messageId": assistantMessageID, + "details": map[string]interface{}{ + "usage": totalUsage, + }, + } + finalResponseJSON, _ := json.Marshal(finalResponseMap) + fmtf.Fprintf(w, "data: %s\n\n", string(finalResponseJSON)) + flusher.Flush() + } } } diff --git a/applogic/rwkv.go b/applogic/rwkv.go index acc3af3..543fd90 100644 --- a/applogic/rwkv.go +++ b/applogic/rwkv.go @@ -128,7 +128,7 @@ func (app *App) ChatHandlerRwkv(w http.ResponseWriter, r *http.Request) { } } else { // 只获取系统提示词 - systemMessage, err := prompt.FindFirstSystemMessage(history) + systemMessage, err := prompt.GetFirstSystemMessageStruct(promptstr) if err != nil { fmt.Println("Error:", err) } else { @@ -162,25 +162,32 @@ func (app *App) ChatHandlerRwkv(w http.ResponseWriter, r *http.Request) { // 处理增强QA逻辑 if config.GetEnhancedQA(promptstr) { - // 确保系统历史与用户或助手历史数量一致,如果不足,则补足空的历史记录 - // 因为最后一个成员让给当前QA,所以-1 - if len(systemHistory)-2 > len(userHistory) { - difference := len(systemHistory) - len(userHistory) + systemHistory, err := prompt.GetMessagesExcludingSystem(promptstr) + if err != nil { + fmt.Printf("Error getting system history: %v\n", err) + return + } + + // 计算需要补足的历史记录数量 + neededHistoryCount := len(systemHistory) - 2 // 最后两条留给当前QA处理 + if neededHistoryCount > len(userHistory) { + // 补足用户或助手历史 + difference := neededHistoryCount - len(userHistory) for i := 0; i < difference; i++ { - userHistory = append(userHistory, structs.Message{Text: "", Role: "user"}) - userHistory = append(userHistory, structs.Message{Text: "", Role: "assistant"}) + if i%2 != 0 { + userHistory = append(userHistory, structs.Message{Text: "", Role: "user"}) + } else { + userHistory = append(userHistory, structs.Message{Text: "", Role: "assistant"}) + } } } - // 如果系统历史中只有一个成员,跳过覆盖逻辑,留给后续处理 - if len(systemHistory) > 1 { - // 将系统历史(除最后2个成员外)附加到相应的用户或助手历史上,采用倒序方式处理最近的记录 - for i := 0; i < len(systemHistory)-2; i++ { - sysMsg := systemHistory[i] - index := len(userHistory) - len(systemHistory) + i - if index >= 0 && index < len(userHistory) && (userHistory[index].Role == "user" || userHistory[index].Role == "assistant") { - userHistory[index].Text += fmt.Sprintf(" (%s)", sysMsg.Text) - } + // 附加系统历史到用户或助手历史,除了最后两条 + for i := 0; i < len(systemHistory)-2; i++ { + sysMsg := systemHistory[i] + index := len(userHistory) - neededHistoryCount + i + if index >= 0 && index < len(userHistory) { + userHistory[index].Text += fmt.Sprintf(" (%s)", sysMsg.Text) } } } else { diff --git a/applogic/tongyiqianwen.go b/applogic/tongyiqianwen.go index 8277437..c068672 100644 --- a/applogic/tongyiqianwen.go +++ b/applogic/tongyiqianwen.go @@ -138,7 +138,7 @@ func (app *App) ChatHandlerTyqw(w http.ResponseWriter, r *http.Request) { } } } - // TODO: msgid是空的开始第一句也要处理 插入 + // 获取历史信息 if msg.ParentMessageID != "" { userhistory, err := app.getHistory(msg.ConversationID, msg.ParentMessageID) @@ -159,6 +159,8 @@ func (app *App) ChatHandlerTyqw(w http.ResponseWriter, r *http.Request) { fmtf.Printf("Error getting system history: %v,promptstr[%v]\n", err, promptstr) return } + + // 处理增强QA逻辑 if config.GetEnhancedQA(promptstr) { systemHistory, err := prompt.GetMessagesExcludingSystem(promptstr) if err != nil { diff --git a/config/config.go b/config/config.go index a7368bc..c87ae21 100644 --- a/config/config.go +++ b/config/config.go @@ -1229,6 +1229,10 @@ func getRwkvMaxTokensInternal(options ...string) int { return getRwkvMaxTokensInternal() // 递归调用内部函数,不传递任何参数 } + if maxTokens == 0 { + return getRwkvMaxTokensInternal() // 递归调用内部函数,不传递任何参数 + } + return maxTokens } @@ -2738,3 +2742,99 @@ func getGroupHintWordsInternal(options ...string) []string { return hintWords } + +// 获取HunyuanStreamModeration值 +func GetHunyuanStreamModeration(options ...string) bool { + mu.Lock() + defer mu.Unlock() + return getHunyuanStreamModerationInternal(options...) +} + +// 内部逻辑执行函数,不处理锁,可以安全地递归调用 +func getHunyuanStreamModerationInternal(options ...string) bool { + if len(options) == 0 || options[0] == "" { + if instance != nil { + return instance.Settings.HunyuanStreamModeration + } + return false + } + + basename := options[0] + valueInterface, err := prompt.GetSettingFromFilename(basename, "HunyuanStreamModeration") + if err != nil { + log.Println("Error retrieving HunyuanStreamModeration:", err) + return getHunyuanStreamModerationInternal() + } + + value, ok := valueInterface.(bool) + if !ok || !value { + log.Println("Fetching default HunyuanStreamModeration") + return getHunyuanStreamModerationInternal() + } + + return value +} + +// 获取TopPHunyuan值 +func GetTopPHunyuan(options ...string) float64 { + mu.Lock() + defer mu.Unlock() + return getTopPHunyuanInternal(options...) +} + +// 内部逻辑执行函数,不处理锁,可以安全地递归调用 +func getTopPHunyuanInternal(options ...string) float64 { + if len(options) == 0 || options[0] == "" { + if instance != nil { + return instance.Settings.TopPHunyuan + } + return 0.0 + } + + basename := options[0] + valueInterface, err := prompt.GetSettingFromFilename(basename, "TopPHunyuan") + if err != nil { + log.Println("Error retrieving TopPHunyuan:", err) + return getTopPHunyuanInternal() + } + + value, ok := valueInterface.(float64) + if !ok || value == 0.0 { + log.Println("Fetching default TopPHunyuan") + return getTopPHunyuanInternal() + } + + return value +} + +// 获取TemperatureHunyuan值 +func GetTemperatureHunyuan(options ...string) float64 { + mu.Lock() + defer mu.Unlock() + return getTemperatureHunyuanInternal(options...) +} + +// 内部逻辑执行函数,不处理锁,可以安全地递归调用 +func getTemperatureHunyuanInternal(options ...string) float64 { + if len(options) == 0 || options[0] == "" { + if instance != nil { + return instance.Settings.TemperatureHunyuan + } + return 0.0 + } + + basename := options[0] + valueInterface, err := prompt.GetSettingFromFilename(basename, "TemperatureHunyuan") + if err != nil { + log.Println("Error retrieving TemperatureHunyuan:", err) + return getTemperatureHunyuanInternal() + } + + value, ok := valueInterface.(float64) + if !ok || value == 0.0 { + log.Println("Fetching default TemperatureHunyuan") + return getTemperatureHunyuanInternal() + } + + return value +} diff --git a/hunyuan/client.go b/hunyuan/client.go index 45501b1..e1c9bc0 100644 --- a/hunyuan/client.go +++ b/hunyuan/client.go @@ -45,6 +45,90 @@ func NewClient(credential common.CredentialIface, region string, clientProfile * return } +func NewChatCompletionsRequest() (request *ChatCompletionsRequest) { + request = &ChatCompletionsRequest{ + BaseRequest: &tchttp.BaseRequest{}, + } + + request.Init().WithApiInfo("hunyuan", APIVersion, "ChatCompletions") + + return +} + +func NewChatCompletionsResponse() (response *ChatCompletionsResponse) { + response = &ChatCompletionsResponse{} + return + +} + +// ChatCompletions +// 腾讯混元大模型是由腾讯研发的大语言模型,具备强大的中文创作能力,复杂语境下的逻辑推理能力,以及可靠的任务执行能力。本接口支持流式或非流式调用,当使用流式调用时为 SSE 协议。 +// +// 1. 本接口暂不支持返回图片内容。 +// +// 2. 默认每种模型单账号限制并发数为 5 路,如您有提高并发限制的需求请 [联系我们](https://cloud.tencent.com/act/event/Online_service) 。 +// +// 3. 请使用 SDK 调用本接口,每种开发语言的 SDK Git 仓库 examples/hunyuan/v20230901/ 目录下有提供示例供参考。SDK 链接在文档下方 “**开发者资源 - SDK**” 部分提供。 +// +// 可能返回的错误码: +// +// FAILEDOPERATION_ENGINEREQUESTTIMEOUT = "FailedOperation.EngineRequestTimeout" +// FAILEDOPERATION_ENGINESERVERERROR = "FailedOperation.EngineServerError" +// FAILEDOPERATION_ENGINESERVERLIMITEXCEEDED = "FailedOperation.EngineServerLimitExceeded" +// FAILEDOPERATION_FREERESOURCEPACKEXHAUSTED = "FailedOperation.FreeResourcePackExhausted" +// FAILEDOPERATION_RESOURCEPACKEXHAUSTED = "FailedOperation.ResourcePackExhausted" +// FAILEDOPERATION_SERVICENOTACTIVATED = "FailedOperation.ServiceNotActivated" +// FAILEDOPERATION_SERVICESTOP = "FailedOperation.ServiceStop" +// FAILEDOPERATION_SERVICESTOPARREARS = "FailedOperation.ServiceStopArrears" +// INTERNALERROR = "InternalError" +// INVALIDPARAMETER = "InvalidParameter" +// INVALIDPARAMETERVALUE = "InvalidParameterValue" +// INVALIDPARAMETERVALUE_MODEL = "InvalidParameterValue.Model" +// LIMITEXCEEDED = "LimitExceeded" +func (c *Client) ChatCompletions(request *ChatCompletionsRequest) (response *ChatCompletionsResponse, err error) { + return c.ChatCompletionsWithContext(context.Background(), request) +} + +// ChatCompletions +// 腾讯混元大模型是由腾讯研发的大语言模型,具备强大的中文创作能力,复杂语境下的逻辑推理能力,以及可靠的任务执行能力。本接口支持流式或非流式调用,当使用流式调用时为 SSE 协议。 +// +// 1. 本接口暂不支持返回图片内容。 +// +// 2. 默认每种模型单账号限制并发数为 5 路,如您有提高并发限制的需求请 [联系我们](https://cloud.tencent.com/act/event/Online_service) 。 +// +// 3. 请使用 SDK 调用本接口,每种开发语言的 SDK Git 仓库 examples/hunyuan/v20230901/ 目录下有提供示例供参考。SDK 链接在文档下方 “**开发者资源 - SDK**” 部分提供。 +// +// 可能返回的错误码: +// +// FAILEDOPERATION_ENGINEREQUESTTIMEOUT = "FailedOperation.EngineRequestTimeout" +// FAILEDOPERATION_ENGINESERVERERROR = "FailedOperation.EngineServerError" +// FAILEDOPERATION_ENGINESERVERLIMITEXCEEDED = "FailedOperation.EngineServerLimitExceeded" +// FAILEDOPERATION_FREERESOURCEPACKEXHAUSTED = "FailedOperation.FreeResourcePackExhausted" +// FAILEDOPERATION_RESOURCEPACKEXHAUSTED = "FailedOperation.ResourcePackExhausted" +// FAILEDOPERATION_SERVICENOTACTIVATED = "FailedOperation.ServiceNotActivated" +// FAILEDOPERATION_SERVICESTOP = "FailedOperation.ServiceStop" +// FAILEDOPERATION_SERVICESTOPARREARS = "FailedOperation.ServiceStopArrears" +// INTERNALERROR = "InternalError" +// INVALIDPARAMETER = "InvalidParameter" +// INVALIDPARAMETERVALUE = "InvalidParameterValue" +// INVALIDPARAMETERVALUE_MODEL = "InvalidParameterValue.Model" +// LIMITEXCEEDED = "LimitExceeded" +func (c *Client) ChatCompletionsWithContext(ctx context.Context, request *ChatCompletionsRequest) (response *ChatCompletionsResponse, err error) { + if request == nil { + request = NewChatCompletionsRequest() + } + + if c.GetCredential() == nil { + return nil, errors.New("ChatCompletions require credential") + } + + request.SetContext(ctx) + + response = NewChatCompletionsResponse() + err = c.Send(request, response) + return +} + func NewChatProRequest() (request *ChatProRequest) { request = &ChatProRequest{ BaseRequest: &tchttp.BaseRequest{}, @@ -62,13 +146,15 @@ func NewChatProResponse() (response *ChatProResponse) { } // ChatPro -// 腾讯混元大模型高级版是由腾讯研发的大语言模型,具备强大的中文创作能力,复杂语境下的逻辑推理能力,以及可靠的任务执行能力。本接口为SSE协议。 +// 注意:本接口将于 5 月 15 日下线;下线后将不再提供文档指引,接口本身可继续调用,建议使用 [hunyuan](https://cloud.tencent.com/document/api/1729/105701) 接入。 // -// 1.本接口暂不支持返回图片内容。 +// 腾讯混元大模型(hunyuan-pro)是由腾讯研发的大语言模型,具备强大的中文创作能力,复杂语境下的逻辑推理能力,以及可靠的任务执行能力。本接口支持流式或非流式调用,当使用流式调用时为 SSE 协议。 // -// 2.默认单账号限制并发数为5路,如您有提高并发限制的需求请 [联系我们](https://cloud.tencent.com/act/event/Online_service) 。 +// 1. 本接口暂不支持返回图片内容。 // -// 3.请使用SDK调用本接口 ,SDK GitHub仓库examples/hunyuan/v20230901/目录有提供[参考示例](https://github.com/TencentCloud/tencentcloud-sdk-python/blob/master/examples/hunyuan/v20230901/chat_std.py)。 +// 2. 默认单账号限制并发数为 5 路,如您有提高并发限制的需求请 [联系我们](https://cloud.tencent.com/act/event/Online_service) 。 +// +// 3. 请使用 SDK 调用本接口,每种开发语言的 SDK Git 仓库 examples/hunyuan/v20230901/ 目录下有提供示例供参考。SDK 链接在文档下方 “**开发者资源 - SDK**” 部分提供。 // // 可能返回的错误码: // @@ -83,19 +169,20 @@ func NewChatProResponse() (response *ChatProResponse) { // INTERNALERROR = "InternalError" // INVALIDPARAMETERVALUE = "InvalidParameterValue" // LIMITEXCEEDED = "LimitExceeded" -// UNSUPPORTEDOPERATION_NONWHITELISTACCOUNT = "UnsupportedOperation.NonWhitelistAccount" func (c *Client) ChatPro(request *ChatProRequest) (response *ChatProResponse, err error) { return c.ChatProWithContext(context.Background(), request) } // ChatPro -// 腾讯混元大模型高级版是由腾讯研发的大语言模型,具备强大的中文创作能力,复杂语境下的逻辑推理能力,以及可靠的任务执行能力。本接口为SSE协议。 +// 注意:本接口将于 5 月 15 日下线;下线后将不再提供文档指引,接口本身可继续调用,建议使用 [hunyuan](https://cloud.tencent.com/document/api/1729/105701) 接入。 +// +// 腾讯混元大模型(hunyuan-pro)是由腾讯研发的大语言模型,具备强大的中文创作能力,复杂语境下的逻辑推理能力,以及可靠的任务执行能力。本接口支持流式或非流式调用,当使用流式调用时为 SSE 协议。 // -// 1.本接口暂不支持返回图片内容。 +// 1. 本接口暂不支持返回图片内容。 // -// 2.默认单账号限制并发数为5路,如您有提高并发限制的需求请 [联系我们](https://cloud.tencent.com/act/event/Online_service) 。 +// 2. 默认单账号限制并发数为 5 路,如您有提高并发限制的需求请 [联系我们](https://cloud.tencent.com/act/event/Online_service) 。 // -// 3.请使用SDK调用本接口 ,SDK GitHub仓库examples/hunyuan/v20230901/目录有提供[参考示例](https://github.com/TencentCloud/tencentcloud-sdk-python/blob/master/examples/hunyuan/v20230901/chat_std.py)。 +// 3. 请使用 SDK 调用本接口,每种开发语言的 SDK Git 仓库 examples/hunyuan/v20230901/ 目录下有提供示例供参考。SDK 链接在文档下方 “**开发者资源 - SDK**” 部分提供。 // // 可能返回的错误码: // @@ -110,7 +197,6 @@ func (c *Client) ChatPro(request *ChatProRequest) (response *ChatProResponse, er // INTERNALERROR = "InternalError" // INVALIDPARAMETERVALUE = "InvalidParameterValue" // LIMITEXCEEDED = "LimitExceeded" -// UNSUPPORTEDOPERATION_NONWHITELISTACCOUNT = "UnsupportedOperation.NonWhitelistAccount" func (c *Client) ChatProWithContext(ctx context.Context, request *ChatProRequest) (response *ChatProResponse, err error) { if request == nil { request = NewChatProRequest() @@ -144,13 +230,15 @@ func NewChatStdResponse() (response *ChatStdResponse) { } // ChatStd -// 腾讯混元大模型标准版是由腾讯研发的大语言模型,具备强大的中文创作能力,复杂语境下的逻辑推理能力,以及可靠的任务执行能力。本接口为SSE协议。 +// 注意:本接口将于 5 月 15 日下线;下线后将不再提供文档指引,接口本身可继续调用,建议使用 [hunyuan](https://cloud.tencent.com/document/api/1729/105701) 接入。 // -// 1.本接口暂不支持返回图片内容。 +// 腾讯混元大模型标准版是由腾讯研发的大语言模型,具备强大的中文创作能力,复杂语境下的逻辑推理能力,以及可靠的任务执行能力。本接口支持流式或非流式调用,当使用流式调用时为 SSE 协议。 // -// 2.默认单账号限制并发数为5路,如您有提高并发限制的需求请 [联系我们](https://cloud.tencent.com/act/event/Online_service) 。 +// 1. 本接口暂不支持返回图片内容。 // -// 3.请使用SDK调用本接口 ,SDK GitHub仓库examples/hunyuan/v20230901/目录有提供[参考示例](https://github.com/TencentCloud/tencentcloud-sdk-python/blob/master/examples/hunyuan/v20230901/chat_std.py)。 +// 2. 默认单账号限制并发数为 5 路,如您有提高并发限制的需求请 [联系我们](https://cloud.tencent.com/act/event/Online_service) 。 +// +// 3. 请使用 SDK 调用本接口,每种开发语言的 SDK Git 仓库 examples/hunyuan/v20230901/ 目录下有提供示例供参考。SDK 链接在文档下方 “**开发者资源 - SDK**” 部分提供。 // // 可能返回的错误码: // @@ -166,19 +254,20 @@ func NewChatStdResponse() (response *ChatStdResponse) { // INVALIDPARAMETER = "InvalidParameter" // INVALIDPARAMETERVALUE = "InvalidParameterValue" // LIMITEXCEEDED = "LimitExceeded" -// UNSUPPORTEDOPERATION_NONWHITELISTACCOUNT = "UnsupportedOperation.NonWhitelistAccount" func (c *Client) ChatStd(request *ChatStdRequest) (response *ChatStdResponse, err error) { return c.ChatStdWithContext(context.Background(), request) } // ChatStd -// 腾讯混元大模型标准版是由腾讯研发的大语言模型,具备强大的中文创作能力,复杂语境下的逻辑推理能力,以及可靠的任务执行能力。本接口为SSE协议。 +// 注意:本接口将于 5 月 15 日下线;下线后将不再提供文档指引,接口本身可继续调用,建议使用 [hunyuan](https://cloud.tencent.com/document/api/1729/105701) 接入。 +// +// 腾讯混元大模型标准版是由腾讯研发的大语言模型,具备强大的中文创作能力,复杂语境下的逻辑推理能力,以及可靠的任务执行能力。本接口支持流式或非流式调用,当使用流式调用时为 SSE 协议。 // -// 1.本接口暂不支持返回图片内容。 +// 1. 本接口暂不支持返回图片内容。 // -// 2.默认单账号限制并发数为5路,如您有提高并发限制的需求请 [联系我们](https://cloud.tencent.com/act/event/Online_service) 。 +// 2. 默认单账号限制并发数为 5 路,如您有提高并发限制的需求请 [联系我们](https://cloud.tencent.com/act/event/Online_service) 。 // -// 3.请使用SDK调用本接口 ,SDK GitHub仓库examples/hunyuan/v20230901/目录有提供[参考示例](https://github.com/TencentCloud/tencentcloud-sdk-python/blob/master/examples/hunyuan/v20230901/chat_std.py)。 +// 3. 请使用 SDK 调用本接口,每种开发语言的 SDK Git 仓库 examples/hunyuan/v20230901/ 目录下有提供示例供参考。SDK 链接在文档下方 “**开发者资源 - SDK**” 部分提供。 // // 可能返回的错误码: // @@ -194,7 +283,6 @@ func (c *Client) ChatStd(request *ChatStdRequest) (response *ChatStdResponse, er // INVALIDPARAMETER = "InvalidParameter" // INVALIDPARAMETERVALUE = "InvalidParameterValue" // LIMITEXCEEDED = "LimitExceeded" -// UNSUPPORTEDOPERATION_NONWHITELISTACCOUNT = "UnsupportedOperation.NonWhitelistAccount" func (c *Client) ChatStdWithContext(ctx context.Context, request *ChatStdRequest) (response *ChatStdResponse, err error) { if request == nil { request = NewChatStdRequest() @@ -230,7 +318,7 @@ func NewGetEmbeddingResponse() (response *GetEmbeddingResponse) { } // GetEmbedding -// 腾讯混元-Embedding接口,可以将文本转化为高质量的向量数据。 +// 腾讯混元 Embedding 接口,可以将文本转化为高质量的向量数据。 // // 可能返回的错误码: // @@ -243,7 +331,7 @@ func (c *Client) GetEmbedding(request *GetEmbeddingRequest) (response *GetEmbedd } // GetEmbedding -// 腾讯混元-Embedding接口,可以将文本转化为高质量的向量数据。 +// 腾讯混元 Embedding 接口,可以将文本转化为高质量的向量数据。 // // 可能返回的错误码: // @@ -316,3 +404,127 @@ func (c *Client) GetTokenCountWithContext(ctx context.Context, request *GetToken err = c.Send(request, response) return } + +func NewQueryHunyuanImageJobRequest() (request *QueryHunyuanImageJobRequest) { + request = &QueryHunyuanImageJobRequest{ + BaseRequest: &tchttp.BaseRequest{}, + } + + request.Init().WithApiInfo("hunyuan", APIVersion, "QueryHunyuanImageJob") + + return +} + +func NewQueryHunyuanImageJobResponse() (response *QueryHunyuanImageJobResponse) { + response = &QueryHunyuanImageJobResponse{ + BaseResponse: &tchttp.BaseResponse{}, + } + return + +} + +// QueryHunyuanImageJob +// 混元生图接口基于混元大模型,将根据输入的文本描述,智能生成与之相关的结果图。分为提交任务和查询任务2个接口。 +// +// 提交任务:输入文本等,提交一个混元生图异步任务,获得任务 ID。 +// +// 查询任务:根据任务 ID 查询任务的处理状态、处理结果,任务处理完成后可获得生成图像结果。 +// +// 并发任务数(并发)说明:并发任务数指能同时处理的任务数量。混元生图默认提供1个并发任务数,代表最多能同时处理1个已提交的任务,上一个任务处理完毕后才能开始处理下一个任务。 +// +// 可能返回的错误码: +// +// FAILEDOPERATION = "FailedOperation" +func (c *Client) QueryHunyuanImageJob(request *QueryHunyuanImageJobRequest) (response *QueryHunyuanImageJobResponse, err error) { + return c.QueryHunyuanImageJobWithContext(context.Background(), request) +} + +// QueryHunyuanImageJob +// 混元生图接口基于混元大模型,将根据输入的文本描述,智能生成与之相关的结果图。分为提交任务和查询任务2个接口。 +// +// 提交任务:输入文本等,提交一个混元生图异步任务,获得任务 ID。 +// +// 查询任务:根据任务 ID 查询任务的处理状态、处理结果,任务处理完成后可获得生成图像结果。 +// +// 并发任务数(并发)说明:并发任务数指能同时处理的任务数量。混元生图默认提供1个并发任务数,代表最多能同时处理1个已提交的任务,上一个任务处理完毕后才能开始处理下一个任务。 +// +// 可能返回的错误码: +// +// FAILEDOPERATION = "FailedOperation" +func (c *Client) QueryHunyuanImageJobWithContext(ctx context.Context, request *QueryHunyuanImageJobRequest) (response *QueryHunyuanImageJobResponse, err error) { + if request == nil { + request = NewQueryHunyuanImageJobRequest() + } + + if c.GetCredential() == nil { + return nil, errors.New("QueryHunyuanImageJob require credential") + } + + request.SetContext(ctx) + + response = NewQueryHunyuanImageJobResponse() + err = c.Send(request, response) + return +} + +func NewSubmitHunyuanImageJobRequest() (request *SubmitHunyuanImageJobRequest) { + request = &SubmitHunyuanImageJobRequest{ + BaseRequest: &tchttp.BaseRequest{}, + } + + request.Init().WithApiInfo("hunyuan", APIVersion, "SubmitHunyuanImageJob") + + return +} + +func NewSubmitHunyuanImageJobResponse() (response *SubmitHunyuanImageJobResponse) { + response = &SubmitHunyuanImageJobResponse{ + BaseResponse: &tchttp.BaseResponse{}, + } + return + +} + +// SubmitHunyuanImageJob +// 混元生图接口基于混元大模型,将根据输入的文本描述,智能生成与之相关的结果图。分为提交任务和查询任务2个接口。 +// +// 提交任务:输入文本等,提交一个混元生图异步任务,获得任务 ID。 +// +// 查询任务:根据任务 ID 查询任务的处理状态、处理结果,任务处理完成后可获得生成图像结果。 +// +// 并发任务数(并发)说明:并发任务数指能同时处理的任务数量。混元生图默认提供1个并发任务数,代表最多能同时处理1个已提交的任务,上一个任务处理完毕后才能开始处理下一个任务。 +// +// 可能返回的错误码: +// +// FAILEDOPERATION = "FailedOperation" +func (c *Client) SubmitHunyuanImageJob(request *SubmitHunyuanImageJobRequest) (response *SubmitHunyuanImageJobResponse, err error) { + return c.SubmitHunyuanImageJobWithContext(context.Background(), request) +} + +// SubmitHunyuanImageJob +// 混元生图接口基于混元大模型,将根据输入的文本描述,智能生成与之相关的结果图。分为提交任务和查询任务2个接口。 +// +// 提交任务:输入文本等,提交一个混元生图异步任务,获得任务 ID。 +// +// 查询任务:根据任务 ID 查询任务的处理状态、处理结果,任务处理完成后可获得生成图像结果。 +// +// 并发任务数(并发)说明:并发任务数指能同时处理的任务数量。混元生图默认提供1个并发任务数,代表最多能同时处理1个已提交的任务,上一个任务处理完毕后才能开始处理下一个任务。 +// +// 可能返回的错误码: +// +// FAILEDOPERATION = "FailedOperation" +func (c *Client) SubmitHunyuanImageJobWithContext(ctx context.Context, request *SubmitHunyuanImageJobRequest) (response *SubmitHunyuanImageJobResponse, err error) { + if request == nil { + request = NewSubmitHunyuanImageJobRequest() + } + + if c.GetCredential() == nil { + return nil, errors.New("SubmitHunyuanImageJob require credential") + } + + request.SetContext(ctx) + + response = NewSubmitHunyuanImageJobResponse() + err = c.Send(request, response) + return +} diff --git a/hunyuan/errors.go b/hunyuan/errors.go index 6bd7ab4..d284c66 100644 --- a/hunyuan/errors.go +++ b/hunyuan/errors.go @@ -53,9 +53,9 @@ const ( // 参数取值错误。 INVALIDPARAMETERVALUE = "InvalidParameterValue" + // 模型不存在。 + INVALIDPARAMETERVALUE_MODEL = "InvalidParameterValue.Model" + // 超过配额限制。 LIMITEXCEEDED = "LimitExceeded" - - // 非白名单帐号,请前往控制台申请试用。 - UNSUPPORTEDOPERATION_NONWHITELISTACCOUNT = "UnsupportedOperation.NonWhitelistAccount" ) diff --git a/hunyuan/models.go b/hunyuan/models.go index 82e3e97..0f9a653 100644 --- a/hunyuan/models.go +++ b/hunyuan/models.go @@ -20,26 +20,225 @@ import ( "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/json" ) +// Predefined struct for user +type ChatCompletionsRequestParams struct { + // 模型名称,可选值包括 hunyuan-lite、hunyuan-standard、hunyuan-standard-256K、hunyuan-pro。 + // 各模型介绍请阅读 [产品概述](https://cloud.tencent.com/document/product/1729/104753) 中的说明。 + // + // 注意: + // 不同的模型计费不同,请根据 [购买指南](https://cloud.tencent.com/document/product/1729/97731) 按需调用。 + Model *string `json:"Model,omitnil,omitempty" name:"Model"` + + // 聊天上下文信息。 + // 说明: + // 1. 长度最多为 40,按对话时间从旧到新在数组中排列。 + // 2. Message.Role 可选值:system、user、assistant。 + // 其中,system 角色可选,如存在则必须位于列表的最开始。user 和 assistant 需交替出现(一问一答),以 user 提问开始和结束,且 Content 不能为空。Role 的顺序示例:[system(可选) user assistant user assistant user ...]。 + // 3. Messages 中 Content 总长度不能超过模型输入长度上限(可参考 [产品概述](https://cloud.tencent.com/document/product/1729/104753) 文档),超过则会截断最前面的内容,只保留尾部内容。 + Messages []*Message `json:"Messages,omitnil,omitempty" name:"Messages"` + + // 流式调用开关。 + // 说明: + // 1. 未传值时默认为非流式调用(false)。 + // 2. 流式调用时以 SSE 协议增量返回结果(返回值取 Choices[n].Delta 中的值,需要拼接增量数据才能获得完整结果)。 + // 3. 非流式调用时: + // 调用方式与普通 HTTP 请求无异。 + // 接口响应耗时较长,**如需更低时延建议设置为 true**。 + // 只返回一次最终结果(返回值取 Choices[n].Message 中的值)。 + // + // 注意: + // 通过 SDK 调用时,流式和非流式调用需用**不同的方式**获取返回值,具体参考 SDK 中的注释或示例(在各语言 SDK 代码仓库的 examples/hunyuan/v20230901/ 目录中)。 + Stream *bool `json:"Stream,omitnil,omitempty" name:"Stream"` + + // 流式输出审核开关。 + // 说明: + // 1. 当使用流式输出(Stream 字段值为 true)时,该字段生效。 + // 2. 输出审核有流式和同步两种模式,**流式模式首包响应更快**。未传值时默认为流式模式(true)。 + // 3. 如果值为 true,将对输出内容进行分段审核,审核通过的内容流式输出返回。如果出现审核不过,响应中的 FinishReason 值为 sensitive。 + // 4. 如果值为 false,则不使用流式输出审核,需要审核完所有输出内容后再返回结果。 + // + // 注意: + // 当选择流式输出审核时,可能会出现部分内容已输出,但中间某一段响应中的 FinishReason 值为 sensitive,此时说明安全审核未通过。如果业务场景有实时文字上屏的需求,需要自行撤回已上屏的内容,并建议自定义替换为一条提示语,如 “这个问题我不方便回答,不如我们换个话题试试”,以保障终端体验。 + StreamModeration *bool `json:"StreamModeration,omitnil,omitempty" name:"StreamModeration"` + + // 说明: + // 1. 影响输出文本的多样性,取值越大,生成文本的多样性越强。 + // 2. 默认 1.0,取值区间为 [0.0, 1.0]。 + // 3. 非必要不建议使用,不合理的取值会影响效果。 + TopP *float64 `json:"TopP,omitnil,omitempty" name:"TopP"` + + // 说明: + // 1. 较高的数值会使输出更加随机,而较低的数值会使其更加集中和确定。 + // 2. 默认 1.0,取值区间为 [0.0, 2.0]。 + // 3. 非必要不建议使用,不合理的取值会影响效果。 + Temperature *float64 `json:"Temperature,omitnil,omitempty" name:"Temperature"` +} + +type ChatCompletionsRequest struct { + *tchttp.BaseRequest + + // 模型名称,可选值包括 hunyuan-lite、hunyuan-standard、hunyuan-standard-256K、hunyuan-pro。 + // 各模型介绍请阅读 [产品概述](https://cloud.tencent.com/document/product/1729/104753) 中的说明。 + // + // 注意: + // 不同的模型计费不同,请根据 [购买指南](https://cloud.tencent.com/document/product/1729/97731) 按需调用。 + Model *string `json:"Model,omitnil,omitempty" name:"Model"` + + // 聊天上下文信息。 + // 说明: + // 1. 长度最多为 40,按对话时间从旧到新在数组中排列。 + // 2. Message.Role 可选值:system、user、assistant。 + // 其中,system 角色可选,如存在则必须位于列表的最开始。user 和 assistant 需交替出现(一问一答),以 user 提问开始和结束,且 Content 不能为空。Role 的顺序示例:[system(可选) user assistant user assistant user ...]。 + // 3. Messages 中 Content 总长度不能超过模型输入长度上限(可参考 [产品概述](https://cloud.tencent.com/document/product/1729/104753) 文档),超过则会截断最前面的内容,只保留尾部内容。 + Messages []*Message `json:"Messages,omitnil,omitempty" name:"Messages"` + + // 流式调用开关。 + // 说明: + // 1. 未传值时默认为非流式调用(false)。 + // 2. 流式调用时以 SSE 协议增量返回结果(返回值取 Choices[n].Delta 中的值,需要拼接增量数据才能获得完整结果)。 + // 3. 非流式调用时: + // 调用方式与普通 HTTP 请求无异。 + // 接口响应耗时较长,**如需更低时延建议设置为 true**。 + // 只返回一次最终结果(返回值取 Choices[n].Message 中的值)。 + // + // 注意: + // 通过 SDK 调用时,流式和非流式调用需用**不同的方式**获取返回值,具体参考 SDK 中的注释或示例(在各语言 SDK 代码仓库的 examples/hunyuan/v20230901/ 目录中)。 + Stream *bool `json:"Stream,omitnil,omitempty" name:"Stream"` + + // 流式输出审核开关。 + // 说明: + // 1. 当使用流式输出(Stream 字段值为 true)时,该字段生效。 + // 2. 输出审核有流式和同步两种模式,**流式模式首包响应更快**。未传值时默认为流式模式(true)。 + // 3. 如果值为 true,将对输出内容进行分段审核,审核通过的内容流式输出返回。如果出现审核不过,响应中的 FinishReason 值为 sensitive。 + // 4. 如果值为 false,则不使用流式输出审核,需要审核完所有输出内容后再返回结果。 + // + // 注意: + // 当选择流式输出审核时,可能会出现部分内容已输出,但中间某一段响应中的 FinishReason 值为 sensitive,此时说明安全审核未通过。如果业务场景有实时文字上屏的需求,需要自行撤回已上屏的内容,并建议自定义替换为一条提示语,如 “这个问题我不方便回答,不如我们换个话题试试”,以保障终端体验。 + StreamModeration *bool `json:"StreamModeration,omitnil,omitempty" name:"StreamModeration"` + + // 说明: + // 1. 影响输出文本的多样性,取值越大,生成文本的多样性越强。 + // 2. 默认 1.0,取值区间为 [0.0, 1.0]。 + // 3. 非必要不建议使用,不合理的取值会影响效果。 + TopP *float64 `json:"TopP,omitnil,omitempty" name:"TopP"` + + // 说明: + // 1. 较高的数值会使输出更加随机,而较低的数值会使其更加集中和确定。 + // 2. 默认 1.0,取值区间为 [0.0, 2.0]。 + // 3. 非必要不建议使用,不合理的取值会影响效果。 + Temperature *float64 `json:"Temperature,omitnil,omitempty" name:"Temperature"` +} + +func (r *ChatCompletionsRequest) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +// FromJsonString It is highly **NOT** recommended to use this function +// because it has no param check, nor strict type check +func (r *ChatCompletionsRequest) FromJsonString(s string) error { + f := make(map[string]interface{}) + if err := json.Unmarshal([]byte(s), &f); err != nil { + return err + } + delete(f, "Model") + delete(f, "Messages") + delete(f, "Stream") + delete(f, "StreamModeration") + delete(f, "TopP") + delete(f, "Temperature") + if len(f) > 0 { + return tcerr.NewTencentCloudSDKError("ClientError.BuildRequestError", "ChatCompletionsRequest has unknown keys!", "") + } + return json.Unmarshal([]byte(s), &r) +} + +// Predefined struct for user +type ChatCompletionsResponseParams struct { + // Unix 时间戳,单位为秒。 + Created *int64 `json:"Created,omitnil,omitempty" name:"Created"` + + // Token 统计信息。 + // 按照总 Token 数量计费。 + Usage *Usage `json:"Usage,omitnil,omitempty" name:"Usage"` + + // 免责声明。 + Note *string `json:"Note,omitnil,omitempty" name:"Note"` + + // 本轮对话的 ID。 + Id *string `json:"Id,omitnil,omitempty" name:"Id"` + + // 回复内容。 + Choices []*Choice `json:"Choices,omitnil,omitempty" name:"Choices"` + + // 错误信息。 + // 如果流式返回中服务处理异常,返回该错误信息。 + // 注意:此字段可能返回 null,表示取不到有效值。 + ErrorMsg *ErrorMsg `json:"ErrorMsg,omitnil,omitempty" name:"ErrorMsg"` + + // 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。本接口为流式响应接口,当请求成功时,RequestId 会被放在 HTTP 响应的 Header "X-TC-RequestId" 中。 + RequestId *string `json:"RequestId,omitnil,omitempty" name:"RequestId"` +} + +type ChatCompletionsResponse struct { + tchttp.BaseSSEResponse `json:"-"` + Response *ChatCompletionsResponseParams `json:"Response"` +} + +func (r *ChatCompletionsResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +// FromJsonString It is highly **NOT** recommended to use this function +// because it has no param check, nor strict type check +func (r *ChatCompletionsResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + // Predefined struct for user type ChatProRequestParams struct { // 聊天上下文信息。 // 说明: - // 1.长度最多为40, 按对话时间从旧到新在数组中排列。 - // 2.Message的Role当前可选值:system、user、assistant,其中,system角色是可选的,如果存在,必须位于列表的最开始。user和assistant需要交替出现(一问一答),最后一个为user提问, 且Content不能为空。 - // 3.Messages中Content总长度不超过16000 token,超过则会截断最前面的内容,只保留尾部内容。建议不超过4000 token。 - Messages []*Message `json:"Messages,omitnil" name:"Messages"` + // 1. 长度最多为 40,按对话时间从旧到新在数组中排列。 + // 2. Message.Role 可选值:system、user、assistant。 + // 其中,system 角色可选,如存在则必须位于列表的最开始。user 和 assistant 需交替出现(一问一答),以 user 提问开始和结束,且 Content 不能为空。Role 的顺序示例:[system(可选) user assistant user assistant user ...]。 + // 3. Messages 中 Content 总长度不能超过 hunyuan-pro 模型输入长度上限(可参考 [产品概述](https://cloud.tencent.com/document/product/1729/104753) 文档),超过则会截断最前面的内容,只保留尾部内容。 + Messages []*Message `json:"Messages,omitnil,omitempty" name:"Messages"` + + // 说明: + // 1. 影响输出文本的多样性,取值越大,生成文本的多样性越强。 + // 2. 默认 1.0,取值区间为 [0.0, 1.0]。 + // 3. 非必要不建议使用,不合理的取值会影响效果。 + TopP *float64 `json:"TopP,omitnil,omitempty" name:"TopP"` // 说明: - // 1.影响输出文本的多样性,取值越大,生成文本的多样性越强。 - // 2.默认1.0,取值区间为[0.0, 1.0]。 - // 3.非必要不建议使用, 不合理的取值会影响效果。 - TopP *float64 `json:"TopP,omitnil" name:"TopP"` + // 1. 较高的数值会使输出更加随机,而较低的数值会使其更加集中和确定。 + // 2. 默认 1.0,取值区间为 [0.0, 2.0]。 + // 3. 非必要不建议使用,不合理的取值会影响效果。 + Temperature *float64 `json:"Temperature,omitnil,omitempty" name:"Temperature"` + // 流式调用开关。 // 说明: - // 1.较高的数值会使输出更加随机,而较低的数值会使其更加集中和确定。 - // 2.默认1.0,取值区间为[0.0,2.0]。 - // 3.非必要不建议使用,不合理的取值会影响效果。 - Temperature *float64 `json:"Temperature,omitnil" name:"Temperature"` + // 1. 未传值时默认为流式调用。 + // 2. 流式调用时以 SSE 协议增量返回结果。 + // 3. 非流式调用时接口响应耗时较长,非必要不建议使用。 + // 4. 非流式调用时只返回一次最终结果,调用方式与普通 HTTP 请求无异。 + // + // 注意: + // 通过 SDK 调用时,流式和非流式调用需要用**不同的方式**获取返回值,具体参考 SDK 中的注释或示例(在各语言 SDK 代码仓库的 examples/hunyuan/v20230901/ 目录中)。 + Stream *bool `json:"Stream,omitnil,omitempty" name:"Stream"` + + // 流式输出审核开关。 + // 说明: + // 1. 输出审核有流式和同步两种模式,**流式模式首包响应更快**。 + // 2. 当使用流式输出(Stream 字段值为 true)时,该字段生效。 + // 3. 如果值为 true,将对输出内容进行分段审核,审核通过的内容流式输出返回。如果出现审核不过,响应中的 FinishReason 值为 sensitive。 + // 4. 如果未传值或值为 false,则不使用流式输出审核,需要审核完所有输出内容后再返回结果。 + // + // 注意: + // 当选择流式输出审核时,可能会出现部分内容已输出,但中间某一段响应中的 FinishReason 值为 sensitive,此时说明安全审核未通过。如果业务场景有实时文字上屏的需求,需要自行撤回已上屏的内容,并建议自定义替换为一条提示语,如 “这个问题我不方便回答,不如我们换个话题试试”,以保障终端体验。 + StreamModeration *bool `json:"StreamModeration,omitnil,omitempty" name:"StreamModeration"` } type ChatProRequest struct { @@ -47,22 +246,45 @@ type ChatProRequest struct { // 聊天上下文信息。 // 说明: - // 1.长度最多为40, 按对话时间从旧到新在数组中排列。 - // 2.Message的Role当前可选值:system、user、assistant,其中,system角色是可选的,如果存在,必须位于列表的最开始。user和assistant需要交替出现(一问一答),最后一个为user提问, 且Content不能为空。 - // 3.Messages中Content总长度不超过16000 token,超过则会截断最前面的内容,只保留尾部内容。建议不超过4000 token。 - Messages []*Message `json:"Messages,omitnil" name:"Messages"` + // 1. 长度最多为 40,按对话时间从旧到新在数组中排列。 + // 2. Message.Role 可选值:system、user、assistant。 + // 其中,system 角色可选,如存在则必须位于列表的最开始。user 和 assistant 需交替出现(一问一答),以 user 提问开始和结束,且 Content 不能为空。Role 的顺序示例:[system(可选) user assistant user assistant user ...]。 + // 3. Messages 中 Content 总长度不能超过 hunyuan-pro 模型输入长度上限(可参考 [产品概述](https://cloud.tencent.com/document/product/1729/104753) 文档),超过则会截断最前面的内容,只保留尾部内容。 + Messages []*Message `json:"Messages,omitnil,omitempty" name:"Messages"` + + // 说明: + // 1. 影响输出文本的多样性,取值越大,生成文本的多样性越强。 + // 2. 默认 1.0,取值区间为 [0.0, 1.0]。 + // 3. 非必要不建议使用,不合理的取值会影响效果。 + TopP *float64 `json:"TopP,omitnil,omitempty" name:"TopP"` // 说明: - // 1.影响输出文本的多样性,取值越大,生成文本的多样性越强。 - // 2.默认1.0,取值区间为[0.0, 1.0]。 - // 3.非必要不建议使用, 不合理的取值会影响效果。 - TopP *float64 `json:"TopP,omitnil" name:"TopP"` + // 1. 较高的数值会使输出更加随机,而较低的数值会使其更加集中和确定。 + // 2. 默认 1.0,取值区间为 [0.0, 2.0]。 + // 3. 非必要不建议使用,不合理的取值会影响效果。 + Temperature *float64 `json:"Temperature,omitnil,omitempty" name:"Temperature"` + // 流式调用开关。 // 说明: - // 1.较高的数值会使输出更加随机,而较低的数值会使其更加集中和确定。 - // 2.默认1.0,取值区间为[0.0,2.0]。 - // 3.非必要不建议使用,不合理的取值会影响效果。 - Temperature *float64 `json:"Temperature,omitnil" name:"Temperature"` + // 1. 未传值时默认为流式调用。 + // 2. 流式调用时以 SSE 协议增量返回结果。 + // 3. 非流式调用时接口响应耗时较长,非必要不建议使用。 + // 4. 非流式调用时只返回一次最终结果,调用方式与普通 HTTP 请求无异。 + // + // 注意: + // 通过 SDK 调用时,流式和非流式调用需要用**不同的方式**获取返回值,具体参考 SDK 中的注释或示例(在各语言 SDK 代码仓库的 examples/hunyuan/v20230901/ 目录中)。 + Stream *bool `json:"Stream,omitnil,omitempty" name:"Stream"` + + // 流式输出审核开关。 + // 说明: + // 1. 输出审核有流式和同步两种模式,**流式模式首包响应更快**。 + // 2. 当使用流式输出(Stream 字段值为 true)时,该字段生效。 + // 3. 如果值为 true,将对输出内容进行分段审核,审核通过的内容流式输出返回。如果出现审核不过,响应中的 FinishReason 值为 sensitive。 + // 4. 如果未传值或值为 false,则不使用流式输出审核,需要审核完所有输出内容后再返回结果。 + // + // 注意: + // 当选择流式输出审核时,可能会出现部分内容已输出,但中间某一段响应中的 FinishReason 值为 sensitive,此时说明安全审核未通过。如果业务场景有实时文字上屏的需求,需要自行撤回已上屏的内容,并建议自定义替换为一条提示语,如 “这个问题我不方便回答,不如我们换个话题试试”,以保障终端体验。 + StreamModeration *bool `json:"StreamModeration,omitnil,omitempty" name:"StreamModeration"` } func (r *ChatProRequest) ToJsonString() string { @@ -80,36 +302,100 @@ func (r *ChatProRequest) FromJsonString(s string) error { delete(f, "Messages") delete(f, "TopP") delete(f, "Temperature") + delete(f, "Stream") + delete(f, "StreamModeration") if len(f) > 0 { return tcerr.NewTencentCloudSDKError("ClientError.BuildRequestError", "ChatProRequest has unknown keys!", "") } return json.Unmarshal([]byte(s), &r) } +// Predefined struct for user +type ChatProResponseParams struct { + // Unix 时间戳,单位为秒。 + Created *int64 `json:"Created,omitnil,omitempty" name:"Created"` + + // Token 统计信息。 + // 按照总 Token 数量计费。 + Usage *Usage `json:"Usage,omitnil,omitempty" name:"Usage"` + + // 免责声明。 + Note *string `json:"Note,omitnil,omitempty" name:"Note"` + + // 本轮对话的 ID。 + Id *string `json:"Id,omitnil,omitempty" name:"Id"` + + // 回复内容。 + Choices []*Choice `json:"Choices,omitnil,omitempty" name:"Choices"` + + // 错误信息。 + // 如果流式返回中服务处理异常,返回该错误信息。 + // 注意:此字段可能返回 null,表示取不到有效值。 + ErrorMsg *ErrorMsg `json:"ErrorMsg,omitnil,omitempty" name:"ErrorMsg"` + + // 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。本接口为流式响应接口,当请求成功时,RequestId 会被放在 HTTP 响应的 Header "X-TC-RequestId" 中。 + RequestId *string `json:"RequestId,omitnil,omitempty" name:"RequestId"` +} + type ChatProResponse struct { - tchttp.BaseSSEResponse + tchttp.BaseSSEResponse `json:"-"` + Response *ChatProResponseParams `json:"Response"` +} + +func (r *ChatProResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +// FromJsonString It is highly **NOT** recommended to use this function +// because it has no param check, nor strict type check +func (r *ChatProResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) } // Predefined struct for user type ChatStdRequestParams struct { // 聊天上下文信息。 // 说明: - // 1.长度最多为40, 按对话时间从旧到新在数组中排列。 - // 2.Message的Role当前可选值:user、assistant,其中,user和assistant需要交替出现(一问一答),最后一个为user提问, 且Content不能为空。 - // 3.Messages中Content总长度不超过16000 token,超过则会截断最前面的内容,只保留尾部内容。建议不超过4000 token。 - Messages []*Message `json:"Messages,omitnil" name:"Messages"` + // 1. 长度最多为 40,按对话时间从旧到新在数组中排列。 + // 2. Message 的 Role 当前可选值:user、assistant。 + // 其中,user 和 assistant 需交替出现(一问一答),以 user 提问开始和结束,且 Content 不能为空。Role 的顺序示例:[user assistant user assistant user ...]。 + // 3. Messages 中 Content 总长度不能超过 hunyuan-standard 模型输入长度上限(可参考 [产品概述](https://cloud.tencent.com/document/product/1729/104753) 文档),超过则会截断最前面的内容,只保留尾部内容。 + Messages []*Message `json:"Messages,omitnil,omitempty" name:"Messages"` + + // 说明: + // 1. 影响输出文本的多样性,取值越大,生成文本的多样性越强。 + // 2. 默认 1.0,取值区间为 [0.0, 1.0]。 + // 3. 非必要不建议使用,不合理的取值会影响效果。 + TopP *float64 `json:"TopP,omitnil,omitempty" name:"TopP"` // 说明: - // 1.影响输出文本的多样性,取值越大,生成文本的多样性越强。 - // 2.默认1.0,取值区间为[0.0, 1.0]。 - // 3.非必要不建议使用, 不合理的取值会影响效果。 - TopP *float64 `json:"TopP,omitnil" name:"TopP"` + // 1. 较高的数值会使输出更加随机,而较低的数值会使其更加集中和确定。 + // 2. 默认 1.0,取值区间为 [0.0, 2.0]。 + // 3. 非必要不建议使用,不合理的取值会影响效果。 + Temperature *float64 `json:"Temperature,omitnil,omitempty" name:"Temperature"` + // 流式调用开关。 // 说明: - // 1.较高的数值会使输出更加随机,而较低的数值会使其更加集中和确定。 - // 2.默认1.0,取值区间为[0.0,2.0]。 - // 3.非必要不建议使用,不合理的取值会影响效果。 - Temperature *float64 `json:"Temperature,omitnil" name:"Temperature"` + // 1. 未传值时默认为流式调用。 + // 2. 流式调用时以 SSE 协议增量返回结果。 + // 3. 非流式调用时接口响应耗时较长,非必要不建议使用。 + // 4. 非流式调用时只返回一次最终结果,调用方式与普通 HTTP 请求无异。 + // + // 注意: + // 通过 SDK 调用时,流式和非流式调用需要用**不同的方式**获取返回值,具体参考 SDK 中的注释或示例(在各语言 SDK 代码仓库的 examples/hunyuan/v20230901/ 目录中)。 + Stream *bool `json:"Stream,omitnil,omitempty" name:"Stream"` + + // 流式输出审核开关。 + // 说明: + // 1. 输出审核有流式和同步两种模式,**流式模式首包响应更快**。 + // 2. 当使用流式输出(Stream 字段值为 true)时,该字段生效。 + // 3. 如果值为 true,将对输出内容进行分段审核,审核通过的内容流式输出返回。如果出现审核不过,响应中的 FinishReason 值为 sensitive。 + // 4. 如果未传值或值为 false,则不使用流式输出审核,需要审核完所有输出内容后再返回结果。 + // + // 注意: + // 当选择流式输出审核时,可能会出现部分内容已输出,但中间某一段响应中的 FinishReason 值为 sensitive,此时说明安全审核未通过。如果业务场景有实时文字上屏的需求,需要自行撤回已上屏的内容,并建议自定义替换为一条提示语,如 “这个问题我不方便回答,不如我们换个话题试试”,以保障终端体验。 + StreamModeration *bool `json:"StreamModeration,omitnil,omitempty" name:"StreamModeration"` } type ChatStdRequest struct { @@ -117,22 +403,45 @@ type ChatStdRequest struct { // 聊天上下文信息。 // 说明: - // 1.长度最多为40, 按对话时间从旧到新在数组中排列。 - // 2.Message的Role当前可选值:user、assistant,其中,user和assistant需要交替出现(一问一答),最后一个为user提问, 且Content不能为空。 - // 3.Messages中Content总长度不超过16000 token,超过则会截断最前面的内容,只保留尾部内容。建议不超过4000 token。 - Messages []*Message `json:"Messages,omitnil" name:"Messages"` + // 1. 长度最多为 40,按对话时间从旧到新在数组中排列。 + // 2. Message 的 Role 当前可选值:user、assistant。 + // 其中,user 和 assistant 需交替出现(一问一答),以 user 提问开始和结束,且 Content 不能为空。Role 的顺序示例:[user assistant user assistant user ...]。 + // 3. Messages 中 Content 总长度不能超过 hunyuan-standard 模型输入长度上限(可参考 [产品概述](https://cloud.tencent.com/document/product/1729/104753) 文档),超过则会截断最前面的内容,只保留尾部内容。 + Messages []*Message `json:"Messages,omitnil,omitempty" name:"Messages"` + + // 说明: + // 1. 影响输出文本的多样性,取值越大,生成文本的多样性越强。 + // 2. 默认 1.0,取值区间为 [0.0, 1.0]。 + // 3. 非必要不建议使用,不合理的取值会影响效果。 + TopP *float64 `json:"TopP,omitnil,omitempty" name:"TopP"` // 说明: - // 1.影响输出文本的多样性,取值越大,生成文本的多样性越强。 - // 2.默认1.0,取值区间为[0.0, 1.0]。 - // 3.非必要不建议使用, 不合理的取值会影响效果。 - TopP *float64 `json:"TopP,omitnil" name:"TopP"` + // 1. 较高的数值会使输出更加随机,而较低的数值会使其更加集中和确定。 + // 2. 默认 1.0,取值区间为 [0.0, 2.0]。 + // 3. 非必要不建议使用,不合理的取值会影响效果。 + Temperature *float64 `json:"Temperature,omitnil,omitempty" name:"Temperature"` + // 流式调用开关。 // 说明: - // 1.较高的数值会使输出更加随机,而较低的数值会使其更加集中和确定。 - // 2.默认1.0,取值区间为[0.0,2.0]。 - // 3.非必要不建议使用,不合理的取值会影响效果。 - Temperature *float64 `json:"Temperature,omitnil" name:"Temperature"` + // 1. 未传值时默认为流式调用。 + // 2. 流式调用时以 SSE 协议增量返回结果。 + // 3. 非流式调用时接口响应耗时较长,非必要不建议使用。 + // 4. 非流式调用时只返回一次最终结果,调用方式与普通 HTTP 请求无异。 + // + // 注意: + // 通过 SDK 调用时,流式和非流式调用需要用**不同的方式**获取返回值,具体参考 SDK 中的注释或示例(在各语言 SDK 代码仓库的 examples/hunyuan/v20230901/ 目录中)。 + Stream *bool `json:"Stream,omitnil,omitempty" name:"Stream"` + + // 流式输出审核开关。 + // 说明: + // 1. 输出审核有流式和同步两种模式,**流式模式首包响应更快**。 + // 2. 当使用流式输出(Stream 字段值为 true)时,该字段生效。 + // 3. 如果值为 true,将对输出内容进行分段审核,审核通过的内容流式输出返回。如果出现审核不过,响应中的 FinishReason 值为 sensitive。 + // 4. 如果未传值或值为 false,则不使用流式输出审核,需要审核完所有输出内容后再返回结果。 + // + // 注意: + // 当选择流式输出审核时,可能会出现部分内容已输出,但中间某一段响应中的 FinishReason 值为 sensitive,此时说明安全审核未通过。如果业务场景有实时文字上屏的需求,需要自行撤回已上屏的内容,并建议自定义替换为一条提示语,如 “这个问题我不方便回答,不如我们换个话题试试”,以保障终端体验。 + StreamModeration *bool `json:"StreamModeration,omitnil,omitempty" name:"StreamModeration"` } func (r *ChatStdRequest) ToJsonString() string { @@ -150,75 +459,122 @@ func (r *ChatStdRequest) FromJsonString(s string) error { delete(f, "Messages") delete(f, "TopP") delete(f, "Temperature") + delete(f, "Stream") + delete(f, "StreamModeration") if len(f) > 0 { return tcerr.NewTencentCloudSDKError("ClientError.BuildRequestError", "ChatStdRequest has unknown keys!", "") } return json.Unmarshal([]byte(s), &r) } +// Predefined struct for user +type ChatStdResponseParams struct { + // Unix 时间戳,单位为秒。 + Created *int64 `json:"Created,omitnil,omitempty" name:"Created"` + + // Token 统计信息。 + // 按照总 Token 数量计费。 + Usage *Usage `json:"Usage,omitnil,omitempty" name:"Usage"` + + // 免责声明。 + Note *string `json:"Note,omitnil,omitempty" name:"Note"` + + // 本轮对话的 ID。 + Id *string `json:"Id,omitnil,omitempty" name:"Id"` + + // 回复内容。 + Choices []*Choice `json:"Choices,omitnil,omitempty" name:"Choices"` + + // 错误信息。 + // 如果流式返回中服务处理异常,返回该错误信息。 + // 注意:此字段可能返回 null,表示取不到有效值。 + ErrorMsg *ErrorMsg `json:"ErrorMsg,omitnil,omitempty" name:"ErrorMsg"` + + // 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。本接口为流式响应接口,当请求成功时,RequestId 会被放在 HTTP 响应的 Header "X-TC-RequestId" 中。 + RequestId *string `json:"RequestId,omitnil,omitempty" name:"RequestId"` +} + type ChatStdResponse struct { - tchttp.BaseSSEResponse + tchttp.BaseSSEResponse `json:"-"` + Response *ChatStdResponseParams `json:"Response"` +} + +func (r *ChatStdResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +// FromJsonString It is highly **NOT** recommended to use this function +// because it has no param check, nor strict type check +func (r *ChatStdResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) } type Choice struct { - // 流式结束标志位,为 stop 则表示尾包。 - FinishReason *string `json:"FinishReason,omitnil" name:"FinishReason"` + // 结束标志位,可能为 stop 或 sensitive。 + // stop 表示输出正常结束,sensitive 只在开启流式输出审核时会出现,表示安全审核未通过。 + FinishReason *string `json:"FinishReason,omitnil,omitempty" name:"FinishReason"` + + // 增量返回值,流式调用时使用该字段。 + // 注意:此字段可能返回 null,表示取不到有效值。 + Delta *Delta `json:"Delta,omitnil,omitempty" name:"Delta"` - // 返回值。 - Delta *Delta `json:"Delta,omitnil" name:"Delta"` + // 返回值,非流式调用时使用该字段。 + // 注意:此字段可能返回 null,表示取不到有效值。 + Message *Message `json:"Message,omitnil,omitempty" name:"Message"` } type Delta struct { // 角色名称。 - Role *string `json:"Role,omitnil" name:"Role"` + Role *string `json:"Role,omitnil,omitempty" name:"Role"` // 内容详情。 - Content *string `json:"Content,omitnil" name:"Content"` + Content *string `json:"Content,omitnil,omitempty" name:"Content"` } type EmbeddingData struct { // embedding 信息。 // 注意:此字段可能返回 null,表示取不到有效值。 - Embedding []*float64 `json:"Embedding,omitnil" name:"Embedding"` + Embedding []*float64 `json:"Embedding,omitnil,omitempty" name:"Embedding"` // 下标。 // 注意:此字段可能返回 null,表示取不到有效值。 - Index *int64 `json:"Index,omitnil" name:"Index"` + Index *int64 `json:"Index,omitnil,omitempty" name:"Index"` // embedding // 注意:此字段可能返回 null,表示取不到有效值。 - Object *string `json:"Object,omitnil" name:"Object"` + Object *string `json:"Object,omitnil,omitempty" name:"Object"` } type EmbeddingUsage struct { - // 输入Token数。 - PromptTokens *int64 `json:"PromptTokens,omitnil" name:"PromptTokens"` + // 输入 Token 数。 + PromptTokens *int64 `json:"PromptTokens,omitnil,omitempty" name:"PromptTokens"` - // 总Token数。 - TotalTokens *int64 `json:"TotalTokens,omitnil" name:"TotalTokens"` + // 总 Token 数。 + TotalTokens *int64 `json:"TotalTokens,omitnil,omitempty" name:"TotalTokens"` } type ErrorMsg struct { // 错误提示信息。 - Msg *string `json:"Msg,omitnil" name:"Msg"` + Msg *string `json:"Msg,omitnil,omitempty" name:"Msg"` // 错误码。 // 4000 服务内部异常。 // 4001 请求模型超时。 - Code *int64 `json:"Code,omitnil" name:"Code"` + Code *int64 `json:"Code,omitnil,omitempty" name:"Code"` } // Predefined struct for user type GetEmbeddingRequestParams struct { - // 输入文本。总长度不超过1024 个token, 超过则会截断最后面的内容。 - Input *string `json:"Input,omitnil" name:"Input"` + // 输入文本。总长度不超过 1024 个 Token,超过则会截断最后面的内容。 + Input *string `json:"Input,omitnil,omitempty" name:"Input"` } type GetEmbeddingRequest struct { *tchttp.BaseRequest - // 输入文本。总长度不超过1024 个token, 超过则会截断最后面的内容。 - Input *string `json:"Input,omitnil" name:"Input"` + // 输入文本。总长度不超过 1024 个 Token,超过则会截断最后面的内容。 + Input *string `json:"Input,omitnil,omitempty" name:"Input"` } func (r *GetEmbeddingRequest) ToJsonString() string { @@ -242,14 +598,14 @@ func (r *GetEmbeddingRequest) FromJsonString(s string) error { // Predefined struct for user type GetEmbeddingResponseParams struct { - // 返回的 embedding 信息。 - Data []*EmbeddingData `json:"Data,omitnil" name:"Data"` + // 返回的 Embedding 信息。当前不支持批量,所以数组元素数目为 1。 + Data []*EmbeddingData `json:"Data,omitnil,omitempty" name:"Data"` - // token 使用计数,按照总token数量收费。 - Usage *EmbeddingUsage `json:"Usage,omitnil" name:"Usage"` + // Token 使用计数,按照总 Token 数量收费。 + Usage *EmbeddingUsage `json:"Usage,omitnil,omitempty" name:"Usage"` - // 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 - RequestId *string `json:"RequestId,omitnil" name:"RequestId"` + // 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 + RequestId *string `json:"RequestId,omitnil,omitempty" name:"RequestId"` } type GetEmbeddingResponse struct { @@ -271,14 +627,14 @@ func (r *GetEmbeddingResponse) FromJsonString(s string) error { // Predefined struct for user type GetTokenCountRequestParams struct { // 输入文本 - Prompt *string `json:"Prompt,omitnil" name:"Prompt"` + Prompt *string `json:"Prompt,omitnil,omitempty" name:"Prompt"` } type GetTokenCountRequest struct { *tchttp.BaseRequest // 输入文本 - Prompt *string `json:"Prompt,omitnil" name:"Prompt"` + Prompt *string `json:"Prompt,omitnil,omitempty" name:"Prompt"` } func (r *GetTokenCountRequest) ToJsonString() string { @@ -303,16 +659,16 @@ func (r *GetTokenCountRequest) FromJsonString(s string) error { // Predefined struct for user type GetTokenCountResponseParams struct { // token计数 - TokenCount *int64 `json:"TokenCount,omitnil" name:"TokenCount"` + TokenCount *int64 `json:"TokenCount,omitnil,omitempty" name:"TokenCount"` // 字符计数 - CharacterCount *int64 `json:"CharacterCount,omitnil" name:"CharacterCount"` + CharacterCount *int64 `json:"CharacterCount,omitnil,omitempty" name:"CharacterCount"` // 切分后的列表 - Tokens []*string `json:"Tokens,omitnil" name:"Tokens"` + Tokens []*string `json:"Tokens,omitnil,omitempty" name:"Tokens"` - // 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 - RequestId *string `json:"RequestId,omitnil" name:"RequestId"` + // 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 + RequestId *string `json:"RequestId,omitnil,omitempty" name:"RequestId"` } type GetTokenCountResponse struct { @@ -333,19 +689,200 @@ func (r *GetTokenCountResponse) FromJsonString(s string) error { type Message struct { // 角色 - Role *string `json:"Role,omitnil" name:"Role"` + Role *string `json:"Role,omitnil,omitempty" name:"Role"` + + // 文本内容 + Content *string `json:"Content,omitnil,omitempty" name:"Content"` +} + +// Predefined struct for user +type QueryHunyuanImageJobRequestParams struct { + // 任务 ID。 + JobId *string `json:"JobId,omitnil,omitempty" name:"JobId"` +} + +type QueryHunyuanImageJobRequest struct { + *tchttp.BaseRequest + + // 任务 ID。 + JobId *string `json:"JobId,omitnil,omitempty" name:"JobId"` +} + +func (r *QueryHunyuanImageJobRequest) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +// FromJsonString It is highly **NOT** recommended to use this function +// because it has no param check, nor strict type check +func (r *QueryHunyuanImageJobRequest) FromJsonString(s string) error { + f := make(map[string]interface{}) + if err := json.Unmarshal([]byte(s), &f); err != nil { + return err + } + delete(f, "JobId") + if len(f) > 0 { + return tcerr.NewTencentCloudSDKError("ClientError.BuildRequestError", "QueryHunyuanImageJobRequest has unknown keys!", "") + } + return json.Unmarshal([]byte(s), &r) +} + +// Predefined struct for user +type QueryHunyuanImageJobResponseParams struct { + // 当前任务状态码: + // 1:等待中、2:运行中、4:处理失败、5:处理完成。 + JobStatusCode *string `json:"JobStatusCode,omitnil,omitempty" name:"JobStatusCode"` + + // 当前任务状态:排队中、处理中、处理失败或者处理完成。 + JobStatusMsg *string `json:"JobStatusMsg,omitnil,omitempty" name:"JobStatusMsg"` + + // 任务处理失败错误码。 + JobErrorCode *string `json:"JobErrorCode,omitnil,omitempty" name:"JobErrorCode"` + + // 任务处理失败错误信息。 + JobErrorMsg *string `json:"JobErrorMsg,omitnil,omitempty" name:"JobErrorMsg"` + + // 生成图 URL 列表,有效期1小时,请及时保存。 + ResultImage []*string `json:"ResultImage,omitnil,omitempty" name:"ResultImage"` + + // 结果 detail 数组,Success 代表成功。 + ResultDetails []*string `json:"ResultDetails,omitnil,omitempty" name:"ResultDetails"` + + // 对应 SubmitTextToImageProJob 接口中 Revise 参数。开启扩写时,返回扩写后的 prompt 文本。 如果关闭扩写,将直接返回原始输入的 prompt。 + RevisedPrompt []*string `json:"RevisedPrompt,omitnil,omitempty" name:"RevisedPrompt"` + + // 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 + RequestId *string `json:"RequestId,omitnil,omitempty" name:"RequestId"` +} - // 消息的内容 - Content *string `json:"Content,omitnil" name:"Content"` +type QueryHunyuanImageJobResponse struct { + *tchttp.BaseResponse + Response *QueryHunyuanImageJobResponseParams `json:"Response"` +} + +func (r *QueryHunyuanImageJobResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +// FromJsonString It is highly **NOT** recommended to use this function +// because it has no param check, nor strict type check +func (r *QueryHunyuanImageJobResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +// Predefined struct for user +type SubmitHunyuanImageJobRequestParams struct { + // 文本描述。 算法将根据输入的文本智能生成与之相关的图像。 不能为空,推荐使用中文。最多可传100个 utf-8 字符。 + Prompt *string `json:"Prompt,omitnil,omitempty" name:"Prompt"` + + // 绘画风格。 + // 请在 [混元生图风格列表](https://cloud.tencent.com/document/product/1729/105846) 中选择期望的风格,传入风格编号。 + // 不传默认不指定风格。 + Style *string `json:"Style,omitnil,omitempty" name:"Style"` + + // 生成图分辨率。 + // 支持生成以下分辨率的图片:768:768(1:1)、768:1024(3:4)、1024:768(4:3)、1024:1024(1:1)、720:1280(9:16)、1280:720(16:9)、768:1280(3:5)、1280:768(5:3),不传默认使用1024:1024。 + Resolution *string `json:"Resolution,omitnil,omitempty" name:"Resolution"` + + // 为生成结果图添加显式水印标识的开关,默认为1。 + // 1:添加。 + // 0:不添加。 + // 其他数值:默认按1处理。 + // 建议您使用显著标识来提示结果图使用了 AI 绘画技术,是 AI 生成的图片。 + LogoAdd *int64 `json:"LogoAdd,omitnil,omitempty" name:"LogoAdd"` + + // prompt 扩写开关。1为开启,0为关闭,不传默认开启。 + // 开启扩写后,将自动扩写原始输入的 prompt 并使用扩写后的 prompt 生成图片,返回生成图片结果时将一并返回扩写后的 prompt 文本。 + // 如果关闭扩写,将直接使用原始输入的 prompt 生成图片。 + // 建议开启,在多数场景下可提升生成图片效果、丰富生成图片细节。 + Revise *int64 `json:"Revise,omitnil,omitempty" name:"Revise"` +} + +type SubmitHunyuanImageJobRequest struct { + *tchttp.BaseRequest + + // 文本描述。 算法将根据输入的文本智能生成与之相关的图像。 不能为空,推荐使用中文。最多可传100个 utf-8 字符。 + Prompt *string `json:"Prompt,omitnil,omitempty" name:"Prompt"` + + // 绘画风格。 + // 请在 [混元生图风格列表](https://cloud.tencent.com/document/product/1729/105846) 中选择期望的风格,传入风格编号。 + // 不传默认不指定风格。 + Style *string `json:"Style,omitnil,omitempty" name:"Style"` + + // 生成图分辨率。 + // 支持生成以下分辨率的图片:768:768(1:1)、768:1024(3:4)、1024:768(4:3)、1024:1024(1:1)、720:1280(9:16)、1280:720(16:9)、768:1280(3:5)、1280:768(5:3),不传默认使用1024:1024。 + Resolution *string `json:"Resolution,omitnil,omitempty" name:"Resolution"` + + // 为生成结果图添加显式水印标识的开关,默认为1。 + // 1:添加。 + // 0:不添加。 + // 其他数值:默认按1处理。 + // 建议您使用显著标识来提示结果图使用了 AI 绘画技术,是 AI 生成的图片。 + LogoAdd *int64 `json:"LogoAdd,omitnil,omitempty" name:"LogoAdd"` + + // prompt 扩写开关。1为开启,0为关闭,不传默认开启。 + // 开启扩写后,将自动扩写原始输入的 prompt 并使用扩写后的 prompt 生成图片,返回生成图片结果时将一并返回扩写后的 prompt 文本。 + // 如果关闭扩写,将直接使用原始输入的 prompt 生成图片。 + // 建议开启,在多数场景下可提升生成图片效果、丰富生成图片细节。 + Revise *int64 `json:"Revise,omitnil,omitempty" name:"Revise"` +} + +func (r *SubmitHunyuanImageJobRequest) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +// FromJsonString It is highly **NOT** recommended to use this function +// because it has no param check, nor strict type check +func (r *SubmitHunyuanImageJobRequest) FromJsonString(s string) error { + f := make(map[string]interface{}) + if err := json.Unmarshal([]byte(s), &f); err != nil { + return err + } + delete(f, "Prompt") + delete(f, "Style") + delete(f, "Resolution") + delete(f, "LogoAdd") + delete(f, "Revise") + if len(f) > 0 { + return tcerr.NewTencentCloudSDKError("ClientError.BuildRequestError", "SubmitHunyuanImageJobRequest has unknown keys!", "") + } + return json.Unmarshal([]byte(s), &r) +} + +// Predefined struct for user +type SubmitHunyuanImageJobResponseParams struct { + // 任务 ID。 + JobId *string `json:"JobId,omitnil,omitempty" name:"JobId"` + + // 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 + RequestId *string `json:"RequestId,omitnil,omitempty" name:"RequestId"` +} + +type SubmitHunyuanImageJobResponse struct { + *tchttp.BaseResponse + Response *SubmitHunyuanImageJobResponseParams `json:"Response"` +} + +func (r *SubmitHunyuanImageJobResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +// FromJsonString It is highly **NOT** recommended to use this function +// because it has no param check, nor strict type check +func (r *SubmitHunyuanImageJobResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) } type Usage struct { - // 输入 token 数量。 - PromptTokens *int64 `json:"PromptTokens,omitnil" name:"PromptTokens"` + // 输入 Token 数量。 + PromptTokens *int64 `json:"PromptTokens,omitnil,omitempty" name:"PromptTokens"` - // 输出 token 数量。 - CompletionTokens *int64 `json:"CompletionTokens,omitnil" name:"CompletionTokens"` + // 输出 Token 数量。 + CompletionTokens *int64 `json:"CompletionTokens,omitnil,omitempty" name:"CompletionTokens"` - // 总 token 数量。 - TotalTokens *int64 `json:"TotalTokens,omitnil" name:"TotalTokens"` + // 总 Token 数量。 + TotalTokens *int64 `json:"TotalTokens,omitnil,omitempty" name:"TotalTokens"` } diff --git a/structs/struct.go b/structs/struct.go index 9e01676..a04e96e 100644 --- a/structs/struct.go +++ b/structs/struct.go @@ -264,8 +264,11 @@ type Settings struct { MdPromptKeyboardAtGroup bool `yaml:"mdPromptKeyboardAtGroup"` // 群内使用md能力模拟PromptKeyboard GroupHintWords []string `yaml:"groupHintWords"` - HunyuanType int `yaml:"hunyuanType"` - MaxTokensHunyuan int `yaml:"maxTokensHunyuan"` + HunyuanType int `yaml:"hunyuanType"` + MaxTokensHunyuan int `yaml:"maxTokensHunyuan"` + HunyuanStreamModeration bool `yaml:"hunyuanStreamModeration"` + TopPHunyuan float64 `yaml:"topPHunyuan"` + TemperatureHunyuan float64 `yaml:"temperatureHunyuan"` WenxinAccessToken string `yaml:"wenxinAccessToken"` WenxinApiPath string `yaml:"wenxinApiPath"` diff --git a/template/config_template.go b/template/config_template.go index 4c559a8..215e99a 100644 --- a/template/config_template.go +++ b/template/config_template.go @@ -99,7 +99,10 @@ settings: secretKey : "" region : "" #留空 maxTokensHunyuan : 4096 #最大上下文 - hunyuanType : 0 #0=高级版 1=标准版 价格差异10倍 + hunyuanType : 0 #0=高级版 1=标准版std 2=hunyuan-lite 3=hunyuan-standard 4=hunyuan-standard-256K 5=hunyuan-pro + hunyuanStreamModeration : false #是否采用流式审核 + topPHunyuan : 1.0 #累积概率最高的令牌进行采样的界限 + temperatureHunyuan : 1.0 #生成的随机性控制 #文心配置项 wenxinAccessToken : "" #请求百度access_token接口获取到的,有效期一个月,需要自己请求获取 diff --git a/utils/utils.go b/utils/utils.go index 37f798e..0c57b76 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -70,6 +70,17 @@ func PrintChatStdRequest(request *hunyuan.ChatStdRequest) { } +func PrintChatCompletionsRequest(request *hunyuan.ChatCompletionsRequest) { + + // 打印Messages + for i, msg := range request.Messages { + fmtf.Printf("Message %d:\n", i) + fmtf.Printf("Content: %s\n", *msg.Content) + fmtf.Printf("Role: %s\n", *msg.Role) + } + +} + // contains 检查一个字符串切片是否包含一个特定的字符串 func Contains(slice []string, item string) bool { for _, a := range slice {