diff --git a/backend/data/openai_api.go b/backend/data/openai_api.go index 241d9f2..eeaf0cb 100644 --- a/backend/data/openai_api.go +++ b/backend/data/openai_api.go @@ -125,13 +125,6 @@ func (o OpenAi) NewChatStream(stock, stockCode string) <-chan string { ch := make(chan string) go func() { defer close(ch) - client := resty.New() - client.SetBaseURL(o.BaseUrl) - client.SetHeader("Authorization", "Bearer "+o.ApiKey) - client.SetHeader("Content-Type", "application/json") - client.SetRetryCount(3) - client.SetTimeout(time.Second * 60) - msg := []map[string]interface{}{ { "role": "system", @@ -142,7 +135,7 @@ func (o OpenAi) NewChatStream(stock, stockCode string) <-chan string { } wg := &sync.WaitGroup{} - wg.Add(2) + wg.Add(4) go func() { defer wg.Done() @@ -168,33 +161,38 @@ func (o OpenAi) NewChatStream(stock, stockCode string) <-chan string { } }() - //go func() { - // defer wg.Done() - // messages := SearchStockInfo(stock, "depth") - // for _, message := range *messages { - // msg = append(msg, map[string]interface{}{ - // "role": "assistant", - // "content": message, - // }) - // } - //}() - //go func() { - // defer wg.Done() - // messages := SearchStockInfo(stock, "telegram") - // for _, message := range *messages { - // msg = append(msg, map[string]interface{}{ - // "role": "assistant", - // "content": message, - // }) - // } - //}() + go func() { + defer wg.Done() + messages := SearchStockInfo(stock, "depth") + for _, message := range *messages { + msg = append(msg, map[string]interface{}{ + "role": "assistant", + "content": message, + }) + } + }() + go func() { + defer wg.Done() + messages := SearchStockInfo(stock, "telegram") + for _, message := range *messages { + msg = append(msg, map[string]interface{}{ + "role": "assistant", + "content": message, + }) + } + }() wg.Wait() msg = append(msg, map[string]interface{}{ "role": "user", "content": stock + "分析和总结", }) - + client := resty.New() + client.SetBaseURL(o.BaseUrl) + client.SetHeader("Authorization", "Bearer "+o.ApiKey) + client.SetHeader("Content-Type", "application/json") + client.SetRetryCount(3) + client.SetTimeout(1 * time.Minute) resp, err := client.R(). SetDoNotParseResponse(true). SetBody(map[string]interface{}{ @@ -207,6 +205,7 @@ func (o OpenAi) NewChatStream(stock, stockCode string) <-chan string { Post("/chat/completions") if err != nil { + logger.SugaredLogger.Infof("Stream error : %s", err.Error()) ch <- err.Error() return } @@ -228,26 +227,32 @@ func (o OpenAi) NewChatStream(stock, stockCode string) <-chan string { Content string `json:"content"` ReasoningContent string `json:"reasoning_content"` } `json:"delta"` + FinishReason string `json:"finish_reason"` } `json:"choices"` } if err := json.Unmarshal([]byte(data), &streamResponse); err == nil { for _, choice := range streamResponse.Choices { - txt := "" if content := choice.Delta.Content; content != "" { - txt = content - logger.SugaredLogger.Infof("Content data: %s", txt) + ch <- content + logger.SugaredLogger.Infof("Content data: %s", content) } if reasoningContent := choice.Delta.ReasoningContent; reasoningContent != "" { - txt = reasoningContent - logger.SugaredLogger.Infof("ReasoningContent data: %s", txt) + ch <- reasoningContent + logger.SugaredLogger.Infof("ReasoningContent data: %s", reasoningContent) + } + if choice.FinishReason == "stop" { + return } - ch <- txt } } else { logger.SugaredLogger.Infof("Stream data error : %s", err.Error()) + ch <- err.Error() } + } else { + ch <- line } + } }() return ch @@ -379,7 +384,7 @@ func GetTelegraphList() *[]string { } var telegraph []string document.Find("div.telegraph-content-box").Each(func(i int, selection *goquery.Selection) { - //logger.SugaredLogger.Info(selection.Text()) + logger.SugaredLogger.Info(selection.Text()) telegraph = append(telegraph, selection.Text()) }) return &telegraph diff --git a/backend/data/stock_data_api.go b/backend/data/stock_data_api.go index 6ff9ab4..cc05ce9 100644 --- a/backend/data/stock_data_api.go +++ b/backend/data/stock_data_api.go @@ -585,8 +585,8 @@ func SearchStockInfo(stock, msgType string) *[]string { err := chromedp.Run(ctx, chromedp.Navigate(url), // 等待页面加载完成,可以根据需要调整等待时间 - chromedp.Sleep(3*time.Second), - //chromedp.WaitVisible("a.search-content", chromedp.ByQuery), + //chromedp.Sleep(3*time.Second), + chromedp.WaitVisible(".search-content", chromedp.ByQuery), chromedp.OuterHTML("html", &htmlContent, chromedp.ByQuery), ) if err != nil { @@ -599,11 +599,11 @@ func SearchStockInfo(stock, msgType string) *[]string { return &[]string{} } var messages []string - document.Find("a.search-content").Each(func(i int, selection *goquery.Selection) { + document.Find(".search-content").Each(func(i int, selection *goquery.Selection) { text := strutil.RemoveNonPrintable(selection.Text()) if strings.Contains(text, stock) { messages = append(messages, text) - logger.SugaredLogger.Infof("搜索到消息: %s", text) + logger.SugaredLogger.Infof("搜索到消息-%s: %s", msgType, text) } }) return &messages diff --git a/backend/data/stock_data_api_test.go b/backend/data/stock_data_api_test.go index 62dd016..f84af2d 100644 --- a/backend/data/stock_data_api_test.go +++ b/backend/data/stock_data_api_test.go @@ -3,7 +3,6 @@ package data import ( "encoding/json" "fmt" - "github.com/PuerkitoBio/goquery" "github.com/duke-git/lancet/v2/convertor" "github.com/duke-git/lancet/v2/strutil" "github.com/go-resty/resty/v2" @@ -21,29 +20,12 @@ import ( //----------------------------------------------------------------------------------- func TestGetTelegraph(t *testing.T) { - url := "https://www.cls.cn/telegraph" - response, err := resty.New().R(). - SetHeader("Referer", "https://www.cls.cn/"). - SetHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 Edg/117.0.2045.60"). - Get(fmt.Sprintf(url)) - if err != nil { - return - } - logger.SugaredLogger.Info(string(response.Body())) - document, err := goquery.NewDocumentFromReader(strings.NewReader(string(response.Body()))) - if err != nil { - return - } - document.Find("div.telegraph-content-box").Each(func(i int, selection *goquery.Selection) { - text := selection.Text() - logger.SugaredLogger.Info(text) - - }) + GetTelegraphList() } func TestGetTelegraphSearch(t *testing.T) { //url := "https://www.cls.cn/searchPage?keyword=%E9%97%BB%E6%B3%B0%E7%A7%91%E6%8A%80&type=telegram" - messages := SearchStockInfo("闻泰科技", "depth") + messages := SearchStockInfo("闻泰科技", "telegram") for _, message := range *messages { logger.SugaredLogger.Info(message) }