From 5e7f34652a84ffa5c383fe1ce3f471d28819d105 Mon Sep 17 00:00:00 2001 From: ArvinLovegood Date: Thu, 3 Jul 2025 14:25:30 +0800 Subject: [PATCH] =?UTF-8?q?feat(frontend):=E5=A2=9E=E5=8A=A0AI=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E5=B7=A5=E5=85=B7=E8=B0=83=E7=94=A8=E5=BC=80=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在市场和股票组件中添加启用/禁用 AI 函数工具调用的开关 - 修改相关函数以支持 enableTools 参数,控制是否启用工具调用 - 优化 AI 总结新闻和聊天流函数,根据 enableTools 决定是否使用工具 --- app.go | 35 +++++++++++++++++++++++------- backend/data/openai_api.go | 27 ++++++++++++++++------- frontend/src/components/market.vue | 16 ++++++++++++-- frontend/src/components/stock.vue | 16 ++++++++++++-- frontend/wailsjs/go/main/App.d.ts | 4 ++-- frontend/wailsjs/go/main/App.js | 8 +++---- 6 files changed, 80 insertions(+), 26 deletions(-) diff --git a/app.go b/app.go index 78c900e..24961f5 100644 --- a/app.go +++ b/app.go @@ -60,13 +60,21 @@ func AddTools(tools []data.Tool) []data.Tool { Type: "function", Function: data.ToolFunction{ Name: "SearchStockByIndicators", - Description: "根据自然语言筛选股票,返回自然语言选股条件要求的股票所有相关数据。输入股票名称可以获取当前股票最新的股价交易数据和基础财务指标信息,多个股票名称使用,分隔", + Description: "根据自然语言筛选股票,返回自然语言选股条件要求的股票所有相关数据。输入股票名称可以获取当前股票最新的股价交易数据和基础财务指标信息,多个股票名称使用,分隔。工具限制:不允许并行调用", Parameters: data.FunctionParameters{ Type: "object", Properties: map[string]any{ "words": map[string]any{ - "type": "string", - "description": "选股自然语言,并且条件使用;分隔,或者条件使用,分隔。例1:创新药;PE<30;净利润增长率>50%。 例2:上证指数,科创50。 例3:长电科技,上海贝岭", + "type": "string", + "description": "选股自然语言。" + + "例1:创新药,半导体;PE<30;净利润增长率>50%。 " + + "例2:上证指数,科创50。 " + + "例3:长电科技,上海贝岭。" + + "例4:长电科技,上海贝岭;KDJ,MACD,RSI,BOLL,主力净流入/流出" + + "例5:换手率大于3%小于25%.量比1以上. 10日内有过涨停.股价处于峰值的二分之一以下.流通股本<100亿.当日和连续四日净流入;股价在20日均线以上.分时图股价在均线之上.热门板块下涨幅领先的A股. 当日量能20000手以上.沪深个股.近一年市盈率波动小于150%.MACD金叉;不要ST股及不要退市股,非北交所,每股收益>0。" + + "例6:沪深主板.流通市值小于100亿.市值大于10亿.60分钟dif大于dea.60分钟skdj指标k值大于d值.skdj指标k值小于90.换手率大于3%.成交额大于1亿元.量比大于2.涨幅大于2%小于7%.股价大于5小于50.创业板.10日均线大于20日均线;不要ST股及不要退市股;不要北交所;不要科创板;不要创业板。" + + "例7:股价在20日线上,一月之内涨停次数>=1,量比大于1,换手率大于3%,流通市值大于 50亿小于200亿。" + + "例8:基本条件:前期有爆量,回调到 10 日线,当日是缩量阴线,均线趋势向上。;优选条件:一月之内涨停次数>=1", }, }, Required: []string{"words"}, @@ -78,7 +86,7 @@ func AddTools(tools []data.Tool) []data.Tool { Type: "function", Function: data.ToolFunction{ Name: "GetStockKLine", - Description: "获取股票日K线数据", + Description: "获取股票日K线数据。工具限制:不允许并行调用", Parameters: data.FunctionParameters{ Type: "object", Properties: map[string]any{ @@ -795,8 +803,13 @@ func (a *App) SendDingDingMessageByType(message string, stockCode string, msgTyp return data.NewDingDingAPI().SendDingDingMessage(message) } -func (a *App) NewChatStream(stock, stockCode, question string, sysPromptId *int) { - msgs := data.NewDeepSeekOpenAi(a.ctx).NewChatStream(stock, stockCode, question, sysPromptId, a.AiTools) +func (a *App) NewChatStream(stock, stockCode, question string, sysPromptId *int, enableTools bool) { + var msgs <-chan map[string]any + if enableTools { + msgs = data.NewDeepSeekOpenAi(a.ctx).NewChatStream(stock, stockCode, question, sysPromptId, a.AiTools) + } else { + msgs = data.NewDeepSeekOpenAi(a.ctx).NewChatStream(stock, stockCode, question, sysPromptId, []data.Tool{}) + } for msg := range msgs { runtime.EventsEmit(a.ctx, "newChatStream", msg) } @@ -1176,8 +1189,14 @@ func (a *App) GlobalStockIndexes() map[string]any { return data.NewMarketNewsApi().GlobalStockIndexes(30) } -func (a *App) SummaryStockNews(question string, sysPromptId *int) { - msgs := data.NewDeepSeekOpenAi(a.ctx).NewSummaryStockNewsStreamWithTools(question, sysPromptId, a.AiTools) +func (a *App) SummaryStockNews(question string, sysPromptId *int, enableTools bool) { + var msgs <-chan map[string]any + if enableTools { + msgs = data.NewDeepSeekOpenAi(a.ctx).NewSummaryStockNewsStreamWithTools(question, sysPromptId, a.AiTools) + } else { + msgs = data.NewDeepSeekOpenAi(a.ctx).NewSummaryStockNewsStream(question, sysPromptId) + } + for msg := range msgs { runtime.EventsEmit(a.ctx, "summaryStockNews", msg) } diff --git a/backend/data/openai_api.go b/backend/data/openai_api.go index 23a0430..a2eecdc 100644 --- a/backend/data/openai_api.go +++ b/backend/data/openai_api.go @@ -718,13 +718,24 @@ func AskAi(o OpenAi, err error, messages []map[string]interface{}, ch chan map[s for _, choice := range streamResponse.Choices { if content := choice.Delta.Content; content != "" { //ch <- content - ch <- map[string]any{ - "code": 1, - "question": question, - "chatId": streamResponse.Id, - "model": streamResponse.Model, - "content": content, - "time": time.Now().Format(time.DateTime), + if content == "###" || content == "##" || content == "#" { + ch <- map[string]any{ + "code": 1, + "question": question, + "chatId": streamResponse.Id, + "model": streamResponse.Model, + "content": "\r\n" + content, + "time": time.Now().Format(time.DateTime), + } + } else { + ch <- map[string]any{ + "code": 1, + "question": question, + "chatId": streamResponse.Id, + "model": streamResponse.Model, + "content": content, + "time": time.Now().Format(time.DateTime), + } } //logger.SugaredLogger.Infof("Content data: %s", content) @@ -866,7 +877,7 @@ func AskAiWithTools(o OpenAi, err error, messages []map[string]interface{}, ch c //ch <- content //logger.SugaredLogger.Infof("Content data: %s", content) - if content == "###" { + if content == "###" || content == "##" || content == "#" { currentAIContent.WriteString("\r\n" + content) ch <- map[string]any{ "code": 1, diff --git a/frontend/src/components/market.vue b/frontend/src/components/market.vue index 44eb20c..f8e98f8 100644 --- a/frontend/src/components/market.vue +++ b/frontend/src/components/market.vue @@ -70,6 +70,7 @@ const nowTab = ref("市场快讯") const indexInterval = ref(null) const indexIndustryRank = ref(null) const stockCode= ref('') +const enableTools= ref(true) function getIndex() { GlobalStockIndexes().then((res) => { @@ -186,7 +187,7 @@ function reAiSummary() { aiSummary.value = "" summaryModal.value = true loading.value = true - SummaryStockNews(question.value, sysPromptId.value) + SummaryStockNews(question.value, sysPromptId.value,enableTools.value) } function getAiSummary() { @@ -211,7 +212,7 @@ function getAiSummary() { aiSummaryTime.value = "" aiSummary.value = "" modelName.value = "" - SummaryStockNews(question.value, sysPromptId.value) + //SummaryStockNews(question.value, sysPromptId.value,enableTools.value) } }) } @@ -615,6 +616,17 @@ function ReFlesh(source) {