|
@@ -5,7 +5,9 @@ import (
|
|
|
"encoding/json"
|
|
|
"errors"
|
|
|
"fmt"
|
|
|
+ "github.com/golang-module/carbon/v2"
|
|
|
"github.com/imroc/req/v3"
|
|
|
+ "github.com/liujiawm/gocalendar"
|
|
|
"github.com/suyuan32/simple-admin-common/i18n"
|
|
|
"github.com/suyuan32/simple-admin-job/ent/task"
|
|
|
"github.com/suyuan32/simple-admin-job/internal/enum/taskresult"
|
|
@@ -64,6 +66,14 @@ func (l *SayMorningHandler) ProcessTask(ctx context.Context, t *asynq.Task) erro
|
|
|
|
|
|
for _, v := range p {
|
|
|
|
|
|
+ if v.Msg == "" {
|
|
|
+ v.Msg, _ = l.GetMorningMsg()
|
|
|
+ if v.Msg == "" {
|
|
|
+ logx.Error("failed to get morning msg")
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
logx.Info("send text message", logx.Field("wxid", v.Wxid), logx.Field("msg", v.Msg))
|
|
|
|
|
|
resp, err := client.R().SetBody(&SendTextMsgReq{
|
|
@@ -94,3 +104,110 @@ func (l *SayMorningHandler) ProcessTask(ctx context.Context, t *asynq.Task) erro
|
|
|
|
|
|
return nil
|
|
|
}
|
|
|
+
|
|
|
+// 通过openai获取早安问候语
|
|
|
+func (l *SayMorningHandler) GetMorningMsg() (helloStr string, err error) {
|
|
|
+ client := req.C().DevMode()
|
|
|
+ client.SetCommonRetryCount(2).
|
|
|
+ SetCommonRetryBackoffInterval(1*time.Second, 5*time.Second).
|
|
|
+ SetCommonRetryFixedInterval(2 * time.Second).SetTimeout(30 * time.Second)
|
|
|
+
|
|
|
+ type OpenAIChatCompletionsMsg struct {
|
|
|
+ Role string `json:"role"`
|
|
|
+ Content string `json:"content"`
|
|
|
+ }
|
|
|
+
|
|
|
+ type OpenAIChatCompletionsReq struct {
|
|
|
+ Model string `json:"model"`
|
|
|
+ Messages []OpenAIChatCompletionsMsg `json:"messages"`
|
|
|
+ }
|
|
|
+
|
|
|
+ systemMsg := OpenAIChatCompletionsMsg{
|
|
|
+ Role: "system",
|
|
|
+ Content: "您是一个特别会打招呼的客服助手,你每天都会根据当前日期和当天的情况采用不同问候,问候分为以下类型,你会在不同的时间选择不同类型的问候\n节日问候\n节气问候\n普通问候(利用中国传统文化元素,如诗词、语等)\n\n然后紧接着,你会进行自我价值介绍,突出了客服助手的在线服务、专业解答以及随时待命的特点,同时也表达了对客户的关心与回应的承诺。\n\n\n生成规则如下:\n当天是节日或者节气时生成节日或节气相关的问候语\n当天既不是节日也不是节气时生成普通问候语\n当节日和节气是同一天时优先生成节日的问候\n\n问候语和自我价值介绍组成一条完整的打招呼话术\n问候语后加{太阳}的表情\n自我价值介绍后加{咖啡}的表情\n\n话术最后,以 ”你可以随时@我“ 做为结尾\n\n你只需要回复最终生成的话术,不需要回复其他任何东西,不需要前后上下文\n\n",
|
|
|
+ }
|
|
|
+
|
|
|
+ now := carbon.SetTimezone(carbon.Shanghai).Now()
|
|
|
+ c := gocalendar.NewCalendar(gocalendar.CalendarConfig{
|
|
|
+ TimeZoneName: "Asia/Shanghai",
|
|
|
+ SolarTerms: true,
|
|
|
+ Lunar: true,
|
|
|
+ HeavenlyEarthly: true,
|
|
|
+ StarSign: true,
|
|
|
+ })
|
|
|
+ items := c.GenerateWithDate(now.Year(), now.Month(), now.Day())
|
|
|
+ ask := "今天是 " + now.ToDateString()
|
|
|
+ for _, item := range items {
|
|
|
+ if item.IsToday == 1 {
|
|
|
+ ask += ", " + item.LunarDate.String()
|
|
|
+ //ask += ", " + item.StarSign.Name + "座"
|
|
|
+
|
|
|
+ if item.SolarTerm != nil {
|
|
|
+ ask += ", " + item.SolarTerm.Name
|
|
|
+ }
|
|
|
+
|
|
|
+ if len(item.Festival.Show) > 0 {
|
|
|
+ for _, f := range item.Festival.Show {
|
|
|
+ ask += ", " + f
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if len(item.Festival.Secondary) > 0 {
|
|
|
+ for _, f := range item.Festival.Secondary {
|
|
|
+ ask += ", " + f
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ userMsg := OpenAIChatCompletionsMsg{
|
|
|
+ Role: "user",
|
|
|
+ Content: ask,
|
|
|
+ }
|
|
|
+
|
|
|
+ helloReq := OpenAIChatCompletionsReq{
|
|
|
+ Model: "gpt-4-turbo-preview",
|
|
|
+ Messages: []OpenAIChatCompletionsMsg{systemMsg, userMsg},
|
|
|
+ }
|
|
|
+
|
|
|
+ type OpenAIChatCompletionsResp struct {
|
|
|
+ ID string `json:"id"`
|
|
|
+ Object string `json:"object"`
|
|
|
+ Created int `json:"created"`
|
|
|
+ Model string `json:"model"`
|
|
|
+ Choices []struct {
|
|
|
+ Index int `json:"index"`
|
|
|
+ Message struct {
|
|
|
+ Role string `json:"role"`
|
|
|
+ Content string `json:"content"`
|
|
|
+ } `json:"message"`
|
|
|
+ Logprobs interface{} `json:"logprobs"`
|
|
|
+ FinishReason string `json:"finish_reason"`
|
|
|
+ } `json:"choices"`
|
|
|
+ Usage struct {
|
|
|
+ PromptTokens int `json:"prompt_tokens"`
|
|
|
+ CompletionTokens int `json:"completion_tokens"`
|
|
|
+ TotalTokens int `json:"total_tokens"`
|
|
|
+ } `json:"usage"`
|
|
|
+ SystemFingerprint string `json:"system_fingerprint"`
|
|
|
+ }
|
|
|
+
|
|
|
+ var helloResp OpenAIChatCompletionsResp
|
|
|
+
|
|
|
+ resp, err := client.R().
|
|
|
+ SetHeader("Content-Type", "application/json").
|
|
|
+ SetHeader("Authorization", "Bearer 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").
|
|
|
+ SetBody(&helloReq).
|
|
|
+ SetSuccessResult(&helloResp).
|
|
|
+ Post("https://api.openai.com/v1/chat/completions")
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ if resp.IsSuccessState() { // Status code is between 200 and 299.
|
|
|
+ helloStr = helloResp.Choices[0].Message.Content
|
|
|
+ return
|
|
|
+ } else {
|
|
|
+ err = errors.New("failed to get morning msg")
|
|
|
+ return
|
|
|
+ }
|
|
|
+}
|