Browse Source

智能选址agent修改

liutao 1 month ago
parent
commit
979798cc9b

+ 17 - 91
aiAgent_gd/agent_config.py

@@ -1,103 +1,33 @@
-from qwen_agent.sub_agent.gis.gis_geometry_agent import GisGeometryAgent
 from qwen_agent.sub_agent.gis.gis_geocoder_agent import GisGeocoderAgent
-from qwen_agent.sub_agent.gis.gis_surrounding_facilities_query_agent import GisSurroundingFacilitiesQueryAgent
-from qwen_agent.sub_agent.gis.spatial_analysis_agent import SpatialAnalysisAgent
-from qwen_agent.sub_agent.sql.trade_sql_agent import TradeSqlAgent
 from qwen_agent.sub_agent.summary_agent import SummaryAgent
 from qwen_agent.sub_agent.ChartAgent import ChartAgent
 from qwen_agent.sub_agent.sql.land_site_selection_sql_agent import LandSiteSelectionSqlAgent
-from qwen_agent.sub_agent.sql.land_find_sql_agent import LandFindSqlAgent
 from qwen_agent.sub_agent.sql.land_supply_sql_agent import LandSupplySqlAgent
 from qwen_agent.sub_agent.sql.land_use_sql_agent import LandUseSqlAgent
-from qwen_agent.sub_agent.sql.land_approval_sql_agent import LandApprovalSqlAgent
-from qwen_agent.sub_agent.sql.kfq_eval_sql_agent import KfqEvalSqlAgent
-from qwen_agent.sub_agent.ReportAgent import ReportAgent
-from qwen_agent.sub_agent.doc.notice_agent import NoticeAgent
-from qwen_agent.sub_agent.doc.work_summary_agent import WorkSummaryAgent
-from qwen_agent.sub_agent.doc.share_agent import ShareAgent
-from qwen_agent.sub_agent.doc.leader_agent import LeaderAgent
-from qwen_agent.sub_agent.doc.personal_agent import PersonalAgent
-from qwen_agent.sub_agent.doc.work_plan_agent import WorkPLanAgent
-from qwen_agent.sub_agent.doc.search_report_agent import SearchReportAgent
-from qwen_agent.sub_agent.doc.material_agent import MaterialAgent
-from qwen_agent.sub_agent.doc.polish_agent import PolishAgent
-from qwen_agent.sub_agent.doc.expand_write_agent import ExpandWriteAgent
-from qwen_agent.sub_agent.doc.continue_write_agent import ContinueWriteAgent
-from qwen_agent.sub_agent.doc.error_check_agent import ErrorCheckAgent
-from qwen_agent.sub_agent.doc.sensitive_check_agent import SensitiveCheckAgent
+
 from qwen_agent.sub_agent.gis.gis_layer_operation import GisLayerOperationAgent
 ActionDict = {
     "generate_chart": ChartAgent,
     "summary": SummaryAgent,
     "LandSiteSelectionSqlAgent": LandSiteSelectionSqlAgent,
-    "LandFindSqlAgent": LandFindSqlAgent,
-    "LandApprovalSqlAgent": LandApprovalSqlAgent,
     "LandSupplySqlAgent": LandSupplySqlAgent,
     "LandUseSqlAgent": LandUseSqlAgent,
-    "KfqEvalSqlAgent": KfqEvalSqlAgent,
-    "TradeSqlAgent": TradeSqlAgent,
-    "ReportAgent": ReportAgent,
-    "SpatialAnalysisAgent": SpatialAnalysisAgent,
-    "GisGeometryAgent": GisGeometryAgent,
     "GisGeocoderAgent": GisGeocoderAgent,
-    "GisSurroundingFacilitiesQueryAgent": GisSurroundingFacilitiesQueryAgent,
-    "NoticeAgent": NoticeAgent,
-    "WorkSummaryAgent": WorkSummaryAgent,
-    "ShareAgent": ShareAgent,
-    "LeaderAgent": LeaderAgent,
-    "PersonalAgent": PersonalAgent,
-    "WorkPLanAgent": WorkPLanAgent,
-    "SearchReportAgent": SearchReportAgent,
-    "MaterialAgent": MaterialAgent,
-    "PolishAgent": PolishAgent,
-    "ExpandWriteAgent": ExpandWriteAgent,
-    "ContinueWriteAgent": ContinueWriteAgent,
-    "ErrorCheckAgent": ErrorCheckAgent,
-    "SensitiveCheckAgent": SensitiveCheckAgent,
     "GisLayerOperationAgent":GisLayerOperationAgent
 }
 
 AgentCNNameDict = {
     "generate_chart": "图表生成",
-    "gis_planner": "空间分析",
-    "SpatialAnalysisAgent": "空间分析和图层查询",
     "GisGeometryAgent": "Gis 基础操作",
-    "GisGeocoderAgent": "Gis 地理编码",
-    "GisSurroundingFacilitiesQueryAgent": "周边设施查询",
     "summary": "总结摘要",
     "plan_dispatcher": "任务分发",
     "Chat": "聊天机器人",
-    "KnowledgeChat": "知识库问答",
     "LandSiteSelectionSqlAgent": "智能选址",
     "LandFindSqlAgent": "找图找数",
-    "KfqEvalSqlAgent": "园区及开发区评价查询",
     "LandSupplySqlAgent": "供地合同信息查询",
-    "LandUseSqlAgent": "土地利用现状信息查询",
-    "LandApprovalSqlAgent": "土地报批项目信息查询",
-    "ReportAgent": "分析报告生成",
     "land_site_selection_planner": "地块智能选址plan",
     "land_find_planner": "找图找数plan",
     "land_supply_planner": "企业信息查询plan",
-    "land_use_planner": "地利用现状信息查询plan",
-    "land_approval_planner": "土地报批项目查询plan",
-    "kfq_eval_planner": "园区及开发区评价查询plan",
-    "TradeSqlAgent": "土地公开交易信息查询",
-    "landtrade_planner": "土地公开交易信息查询plan",
-    "report_planner": "分析报告生成plan",
-    "doc_write_planner": "用于公文生成,并可以对文字进行润色、扩写、续写,还能检查文章的内容是否有错误、是否包含敏感词的plan",
-    "NoticeAgent": "用于生成通知报告的Agent",
-    "WorkSummaryAgent": "用于生成工作总结的Agent",
-    "ShareAgent": "用于生成心得体会的Agent",
-    "LeaderAgent": "用于生成领导讲话的Agent",
-    "PersonalAgent": "用于生成个人讲话的Agent",
-    "WorkPLanAgent": "用于生成工作方案的Agent",
-    "SearchReportAgent": "用于生成调研报告的Agent",
-    "MaterialAgent": "用于生成宣传材料的Agent",
-    "PolishAgent": "用于文章润色的Agent",
-    "ExpandWriteAgent": "用于文章扩写的Agent",
-    "ContinueWriteAgent": "用于文章续写的Agent",
-    "ErrorCheckAgent": "用于检查文章内容是否有错误的Agent",
-    "SensitiveCheckAgent": "用于文章内敏感词检查的Agent",
     "layer_operation_planner": "用于GIS图层控制系统的Agent",
     "GisLayerOperationAgent": "Gis 图层控制",
 }
@@ -166,6 +96,22 @@ LLMDict_GPT4 = {
 
 }
 
+LLMDict_DS_R1_21B = {
+    "plan_dispatcher": 'DeepSeek-R1-Distill-Qwen-32B',
+    "generate_chart": 'DeepSeek-R1-Distill-Qwen-32B',
+    "summary": 'DeepSeek-R1-Distill-Qwen-32B',
+    "planner": "DeepSeek-R1-Distill-Qwen-32B",
+    "show_case": "DeepSeek-R1-Distill-Qwen-32B",
+    "Chat": "DeepSeek-R1-Distill-Qwen-32B",
+    "LandSupplySqlAgent": "DeepSeek-R1-Distill-Qwen-32B",
+    # 智能选址
+    "LandSiteSelectionSqlAgent": "DeepSeek-R1-Distill-Qwen-32B",
+    # 找图找数
+    "LandFindSqlAgent": "DeepSeek-R1-Distill-Qwen-32B",
+    "GisGeocoderAgent": "DeepSeek-R1-Distill-Qwen-32B",
+    "GisLayerOperationAgent": "DeepSeek-R1-Distill-Qwen-32B"
+}
+
 LLMDict_Qwen_72B_1211 = {
     "plan_dispatcher": 'qwen2.5-instruct',
     "generate_chart": 'qwen2.5-instruct',
@@ -174,32 +120,12 @@ LLMDict_Qwen_72B_1211 = {
     "show_case": "qwen2.5-instruct",
     "Chat": "qwen2.5-instruct",
     "LandSupplySqlAgent": "qwen2.5-instruct",
-    "TradeSqlAgent": "qwen2.5-instruct",
-    "LandUseSqlAgent": "qwen2.5-instruct",
-    "KfqEvalSqlAgent": "qwen2.5-instruct",
-    "LandApprovalSqlAgent": "qwen2.5-instruct",
-    "ReportAgent": "qwen2.5-instruct",
     # 智能选址
     "LandSiteSelectionSqlAgent": "qwen2.5-instruct",
     # 找图找数
     "LandFindSqlAgent": "qwen2.5-instruct",
     # 空间分析
     "SpatialAnalysisAgent": "qwen2.5-instruct",
-    "GisGeometryAgent": "qwen2.5-instruct",
     "GisGeocoderAgent": "qwen2.5-instruct",
-    "GisSurroundingFacilitiesQueryAgent": "qwen2.5-instruct",
-    "NoticeAgent": "qwen2.5-instruct",
-    "WorkSummaryAgent": "qwen2.5-instruct",
-    "ShareAgent": "qwen2.5-instruct",
-    "LeaderAgent": "qwen2.5-instruct",
-    "PersonalAgent": "qwen2.5-instruct",
-    "WorkPLanAgent": "qwen2.5-instruct",
-    "SearchReportAgent": "qwen2.5-instruct",
-    "MaterialAgent": "qwen2.5-instruct",
-    "PolishAgent": "qwen2.5-instruct",
-    "ExpandWriteAgent": "qwen2.5-instruct",
-    "ContinueWriteAgent": "qwen2.5-instruct",
-    "ErrorCheckAgent": "qwen2.5-instruct",
-    "SensitiveCheckAgent": "qwen2.5-instruct",
     "GisLayerOperationAgent": "qwen2.5-instruct"
 }

+ 0 - 2
aiAgent_gd/qwen_agent/planning/plans/land_site_selection_plan.py

@@ -6,7 +6,6 @@ from qwen_agent.memory.plan_memory import PlanExampleRetrieval
 actions_list = {
     "GisGeocoderAgent": "用于获取用户问题中详细地址的坐标点",
     "LandSiteSelectionSqlAgent": "用于查询出让地块表的Agent",
-    # "GisSurroundingFacilitiesQueryAgent": "对表查询的结果进行周边设施的查询",
     "summary": "对表查询的结果,进行总结摘要,提炼用户关注的信息",
 }
 
@@ -26,7 +25,6 @@ Plan: 生成的计划,包含函数名和执行的目标。以JSON格式返回
 举例:
 {example_list}
 
-注意0:如果用户需要生成图表,那么最后一步请调用[generate_chart]这个action,针对用户Question和查询数据库结果生成options;
 注意1:最后一步必须调用[summary]这个action,针对用户Question和查询数据库结果进行总结摘要,提取用户关注信息;
 注意2:如果出现SUM函数,必须使用:: FLOAT将返回结果转换为float类型
 注意3:如果详细坐标点是‘萧山机场’,‘萧山国际机场’,‘杭州萧山机场’,使用固定的坐标数据POINT(120.42827489304307 30.23751646603668),不使用[GisGeocoderAgent]接口进行查询

+ 2 - 4
aiAgent_gd/qwen_agent/planning/plans/land_use_plan.py

@@ -5,7 +5,6 @@ from qwen_agent.memory.plan_memory import PlanExampleRetrieval
 
 actions_list = {
     "LandUseSqlAgent": "用于查询土地利用现状的Agent",
-    "generate_chart": "可以对数据分析模块SQL_bidding_database的结果,进行图表绘制",
     "summary": "对供地合同表的结果,进行总结摘要,提炼用户关注的信息",
 }
 
@@ -18,16 +17,15 @@ PROMPT_TEMPLATE = """
 
 请依据参考资料,制定计划完成用户需求,按照如下格式返回:
 Question: 用户针区域土地利用现状问题的提问
-Thought: 生成Plan的思考过程,如果提到多个区域名称,需要多次调用[LandSupplySqlAgent]接口,给用户一些依据。
+Thought: 生成Plan的思考过程,如果提到多个区域名称,需要多次调用[LandUseSqlAgent]接口,给用户一些依据。
 Plan: 生成的计划,包含函数名和执行的目标。以JSON格式返回,所有的Action会以执行的先后顺序保存在list中,例如:
 [{{"action_name": 第一步执行的Action名字, "instruction": 执行需要达到的预期,请给出详细有效的指示}}, {{"action_name": 第二步执行的Action名字, "instruction": 执行需要达到的预期,请给出详细有效的指示}}]
 
 举例:
 {example_list}
 
-注意0:如果用户需要生成图表,比如:柱状图,折线图,饼图(占比图)等图表,那么最后一步请调用[generate_chart]这个action,针对用户Question和查询数据库结果生成options;
 注意1:最后一步必须调用[summary]这个action,针对用户Question和查询数据库结果进行总结摘要,提取用户关注信息;
-注意2:这里是一个土地市场交易分析模块,通常用户Question中会包含需要了解的目标区域的名称、分析时间、分析目标等,而[LandSupplySqlAgent]这个接口只能每次一个区域的特地的交易信息。请你在生成执行计划时,调用多次[LandSupplySqlAgent],每次查询不通区域的交易情况。
+注意2:这里是一个土地市场交易分析模块,通常用户Question中会包含需要了解的目标区域的名称、分析时间、分析目标等,而[LandUseSqlAgent]这个接口只能每次一个区域的特地的交易信息。请你在生成执行计划时,调用多次[LandUseSqlAgent],每次查询不通区域的交易情况。
 注意3:如果出现SUM函数,必须使用:: FLOAT将返回结果转换为float类型
 
 """

+ 0 - 1
aiAgent_gd/qwen_agent/planning/plans/layer_operation_plan.py

@@ -1,7 +1,6 @@
 import json
 
 from qwen_agent.planning.planner import Planner
-from qwen_agent.memory.plan_memory import PlanExampleRetrieval
 
 actions_list = {
     "GisLayerOperationAgent": "用户控制图层的打开和关闭",

+ 4 - 5
aiAgent_gd/qwen_agent/sub_agent/sql/land_site_selection_sql_agent.py

@@ -78,11 +78,10 @@ class LandSiteSelectionSqlAgent(BaseSubAgent):
         注意7: 查询出地块。必须要对ydmj进行desc排序。查询地块有数量限制时,比如'1宗','一宗','1块',使用limit 1语句;未限定时,只查询5宗,使用limit 5语句
         注意8: 问题中设计具体的地点时,需要使用round(st_distance(st_geometryfromtext('具体地点的wkt', 4490)::geography,shape::geography)::numeric,0)获取其distance, 如果问题未指定范围则使用 distance <= 5000 来限制在地点5公里内,并对其排序
         注意9: 查询语句select种只包含id字段
-        注意10: 只准生成查询 的sql 语句,不可生成任何 修改数据的语句, 比如:update, delete, insert, truncate 等
-        注意11:当用户问题中的数据源是‘控制性详细规划表’,用地性质是"工业用地"时,去掉"用地",使用ydxz进行模糊查询,比如ydxz like '%工业%',工业用地没有二级分类
-        注意12:数据表的schema是sde
-        注意13:where条件种需要加上shape is not null,过滤掉所有空图形
-        注意14:查询数据表是公告地块表时,where条件种需要加上sfsj=1,表示只查询已上架的地块
+        注意10: 只准生成查询的sql 语句,不可生成任何修改数据的语句, 比如:update, delete, insert, truncate 等
+        注意11:当用户问题中的数据源是‘控制性详细规划表’,用地性质是"工业用地"时,去掉"用地",使用ydxz进行模糊查询,比如ydxz like '%工业%'
+        注意12:where条件种需要加上shape is not null,过滤掉所有空图形
+        注意13:查询数据表是公告地块表时,where条件种需要加上sfsj=1,表示只查询已上架的地块
         
         """
         self.retriever = SqlRetriever(query_type='land_site_selection')

+ 0 - 212
aiAgent_gd/qwen_agent/sub_agent/sql/land_supply_sql_agent.py.backup20240513

@@ -1,212 +0,0 @@
-from qwen_agent.actions.base import Action
-from qwen_agent.memory.SqlMemory import SqlRetriever
-from qwen_agent.tools.tools import tools_list, modify_sql, async_db
-# from qwen_agent.agents.plugin import call_plugin
-from qwen_agent.tools.tools import call_plugin
-import copy
-import re
-from pydantic import BaseModel, Field
-import time
-from typing import Dict, List, Literal, Optional, Union
-import json
-import openai
-from qwen_agent.sub_agent.BaseSubAgent import BaseSubAgent
-from qwen_agent.messages.context_message import ChatResponseChoice, ChatResponseStreamChoice
-from tabulate import tabulate
-import traceback
-
-
-class LandSupplySqlAgent(BaseSubAgent):
-    def __init__(self, llm=None, llm_name=None, stream=False, name='LandSupplySqlAgent'):
-        super(LandSupplySqlAgent, self).__init__(llm, llm_name, stream, name=name)
-        # self.llm_name = 'Code'
-        # self.llm_name = llm.model
-        self.llm = llm
-        self.tool_list = [{
-            'name_for_human': '查询土地供应信息数据库',
-            'name_for_model': 'TenderResultSqlAgent',
-            'description_for_model': """
-            当需要连接PostgreSQL数据库并执行一段sql时,请使用此功能。
-        """
-                                     + ' Format the arguments as a JSON object.',
-            'parameters': [{'name': 'sql_code', 'type': 'string',
-                            'description': '合法的PostgreSQL查询语言。不接受【select *】,必须使用【select xxx,yyy】'}]
-        }]
-        self.SubAgent_Summary_Prompt = "通过查询数据库,检索数据库得到的信息为:\n{obs}\n"
-        self.SubAgent_PROMPT = """你是一个PostgreSQL专家,当前需要根据用户问题和上下文,生成语法正确的PostgreSQL查询语句。'
-         #数据库表的表名和表结构如下:
-        `nrllm.land_supply`(
-            `land_id` COMMENTS '地块id',
-            `region_code` COMMENTS '行政区代码',
-            `region_name` COMMENTS '地块id',
-            `dkbh` COMMENTS '行政区名称',
-            `province` COMMENTS '所属省 用来指定省份',
-            `city` COMMENTS '所属地级市 用来指定地级市',
-            `county` COMMENTS '所属区县 用来指定区县',
-            `land_name` COMMENTS '地块名称',
-            `amount` COMMENTS '出让金额(万元)',
-            `land_area` COMMENTS '地块出让面积',
-            `sell_date` COMMENTS '出让日期',
-            `land_use_type` COMMENTS '土地用途 05开头的代表商业用地,06开头的代表工业用地,07开头的代表住宅用地,12开头的代表其他用地',
-            `is_sampleplot` COMMENTS '是否标准地',
-            `industry` COMMENTS '所属行业',
-            `land_supply_type` COMMENTS '土地供应类型, 2 为招拍挂出让,3 为协议出让'
-        )
-
-       `nrllm.land_supply_structure`(
-            `land_id` COMMENTS '地块id',
-            `region_code` COMMENTS '行政区代码',
-            `region_name` COMMENTS '地块id',
-            `dkbh` COMMENTS '行政区名称',
-            `province` COMMENTS '所属省 用来指定省份',
-            `city` COMMENTS '所属地级市 用来指定地级市',
-            `county` COMMENTS '所属区县 用来指定区县',
-            `land_name` COMMENTS '地块名称',
-            `amount` COMMENTS '出让金额(万元)',
-            `land_area` COMMENTS '地块出让面积',
-            `sell_date` COMMENTS '出让日期',
-            `land_use_type` COMMENTS '土地用途 05开头的代表商业用地,06开头的代表工业用地,07开头的代表住宅用地,12开头的代表其他用地',
-            `land_use_type_alias_cn` COMMENTS '土地用途中文名称,如:商业用地, 工业用地, 住宅用地,其他用地等',
-            `is_sampleplot` COMMENTS '是否标准地',
-            `industry` COMMENTS '所属行业',
-            `land_supply_type` COMMENTS '土地供应类型, 2 为招拍挂出让,3 为协议出让'
-        )
-
-        有几个注意事项:
-        注意0:请仔细区分"去年","今年","N年前","近三年"等时间关键词,必须使用to_char(sell_date,'yyyy') as nf,具体去年、今年等使用to_char(CURRENT_DATE - INTERVAL '1 year', 'YYYY')、to_char(CURRENT_DATE, 'YYYY'),如果提到了近三年、近五年时候查询是请使用to_char(sell_date,'yyyy') > to_char(CURRENT_DATE - INTERVAL '3 year', 'YYYY')、to_char(sell_date,'yyyy') > to_char(CURRENT_DATE - INTERVAL '5 year', 'YYYY'),并且要使用group by to_char(sell_date,'yyyy') 来区分不同年份的数据,所用的group by字段必须出现在查询返回字段中,且必须用order by to_char(sell_date,'yyyy');
-        注意1: 当土地用途为工业用地时,需要指定是否标准地 为 是
-        注意2: 统计出让面积的时候,需要统计的是 土地供应类型为招拍挂出让和协议出让的土地
-        注意3: 查询地区条件时,查询**省时请使用 province 字段,查询**市时请使用 city 字段, 查询**区县时请使用 county 字段,区县为**时请使用 county 字段
-        注意4: 统计土地用途分类时,只取land_use_type前两位并将转换为对应的中文含义,05开头的代表商业用地,06开头的代表工业用地,07开头的代表住宅用地,12开头的代表其他用地
-        注意5: 环比是指指定月份的数据比较指定月份上一个月份的数据,并统计他的增量百分比,同比是指指定月份的数据与去年同一个月份的数据进行比较,并统计他的增量百分比
-        注意6: 统计面积时候,无指定单位的情况下,请默认转换为亩并四舍五入成整数,平方米转换为亩请乘以0.0015
-        注意7: 住宅用地 为 land_use_type 字段中值为07开头的数据,细分的类型分为 
-                用于安置的商品住房用地 为 0710, 
-                保障性租赁住房出让金 为 0706,
-                公共租赁住房 为 0705、077和07010101三个值中的任意一个,
-                经济适用住房 为 0704、074和07010103三个值中的任意一个
-                普通商品住房 为 0703、07010201、071和072四个值中的任意一个
-                租赁型商品住房 为 0708和07010202两个值中的任意一个
-                共有产权住房 为 0709和07010203两个值中的任意一个
-                其他类型 为不在上面的类型的数据
-        注意8: 当查询土地供应结构时、 工业用地出让情况、住宅用地出让情况、商业用地出让情况或者标准地供应情况的时候,请使用 nrllm.land_supply_structure 表,只需要统计商服用地,工矿仓储用地 和住宅用地,其他的类型请归类为基础设施用地, 其他情况下请使用 nrllm.land_supply 表
-        注意9: 计算同比或者环比数据指的计算按月统计面积时,需要将sell_date 转换为 to_char(sell_date, 'yyyy-MM') 
-        注意10: 获取近几年浙江省供地同比和环比增长率,使用limit 12 返回近12个月的同比和环比增长率
-    
-        ```
-
-        以下是可供参考的SQL写法(仅供参考,也可自由发挥):
-        ```
-        {refs}
-        ```
-        """
-        self.retriever = SqlRetriever(query_type='land_supply')
-
-    async def run(self, plan_context, messages=[]):
-        if not plan_context.has_sql_data:
-            query = plan_context.get_context(add_plan_msg=False)
-        else:
-            query = plan_context.get_context(add_plan_msg=False, add_sql_code=True)
-        print(f'query for sql: {query}')
-        if self.retriever:
-            self.SubAgent_PROMPT = self.SubAgent_PROMPT.format(refs='\n'.join(
-                [f"{i}\t{n}:{q}" for i, (n, q) in enumerate(self.retriever.get_relevant_documents(query, top_k=2))]))
-        # print('Examples:','\n'.join([f"{i}\t{n}:{q}" for i,(n,q) in enumerate(self.retriever.get_relevant_documents(plan_context.user_request,top_k=5))]))
-        # local_message, is_success = self._core(query,messages)
-        async for msg in self._core(query, messages):
-            yield msg
-            if isinstance(msg, ChatResponseChoice):
-                self.exec_res = "\n" + msg.content + "\n"
-
-        self.sql_code = None
-        plan_context.has_search_db = True
-        if self.is_success:
-
-            sql_json_res = json.loads(self.exec_res.replace('\n', '').lstrip('```json').rstrip('```'))
-
-            # print("sql_json_res:",sql_json_res)
-            # headers = sql_json_res.keys()
-            # result = zip(*sql_json_res.values())
-            headers = list(sql_json_res[0].keys())
-            exec_res = copy.deepcopy(sql_json_res)
-            if 'bid' in headers:
-                headers.remove('bid')
-                for row in exec_res:
-                    row.pop('bid')
-                self.exec_res = f"\n```json\n{json.dumps(exec_res, ensure_ascii=False)}\n```\n"
-                print("sql exec res:", self.exec_res)
-
-            result = []
-            for row in sql_json_res:
-                result.append([])
-                for head, value in row.items():
-                    if head in ('中标单位', '招标单位', '代理单位'):
-                        value = ", ".join(
-                            f"[{name}](/package2/pages/companyDetail/index?companyName={name})" for name in
-                            value.split(' '))
-                    if head == '标题':
-                        value = f"[{value}](/package2/pages/bidDetail/index?md5Id={row.get('bid', '')})"
-                    if head != 'bid':
-                        result[-1].append(value)
-
-            markdown_table = tabulate(result, headers, tablefmt="pipe")
-            print(markdown_table)
-            yield ChatResponseChoice(role='info', content=self.SubAgent_Summary_Prompt.format(obs=markdown_table))
-
-            plan_context.has_sql_data = True
-            # if self.plugin_args:
-            #     self.sql_code = json.loads(self.plugin_args)['sql_code']
-            print('sql plugin args:', self.plugin_args)
-        else:
-            self.empty_data = True
-            self.exec_res = "在数据库中,未查询到相关信息。"
-            yield ChatResponseChoice(role='info', content="在数据库中,未查询到相关信息。")
-
-    def modify_sql(self, sql_query):
-        sql_query = sql_query.replace('`', '')
-        # 使用正则表达式寻找 GROUP BY 和其后面的内容,直到遇到 HAVING, ORDER BY 或者字符串结束
-        match = re.search(r'(GROUP BY|group by)(.*?)(order by|having|HAVING|ORDER BY|;|$)', sql_query, re.IGNORECASE)
-        target_table = "agent_bidding_history_detail_all"
-        # 如果找到匹配项
-        if match:
-            # 提取 GROUP BY 后面的字段,去掉多余的空格,并分割成列表
-            fields = match.group(2).strip().split(',')
-            for field in fields:
-                if field.strip() == '招标单位':
-                    target_table = 'agent_bidding_history_detail_by_ifb_new'
-                    break
-                elif field.strip() == '中标单位':
-                    target_table = 'agent_bidding_history_detail_by_wtb_new'
-                    break
-                elif field.strip() == '招标产品':
-                    target_table = 'agent_bidding_history_detail_by_prod_new'
-                    break
-        sql_query = sql_query.replace('agent_bidding_history_detail_all', target_table)
-        match = re.search(r'(SELECT|select)(.*?)(from|FROM)', sql_query, re.IGNORECASE)
-        if match:
-            if '标题' in match.group(2) and 'bid' not in match.group(2):
-                sql_query = sql_query.replace('标题', 'bid, 标题')
-        return sql_query
-
-    async def run_function(self, plugin_args):
-        plugin_args = self.parse_parameter(plugin_args)
-        try:
-            sql_to_execute = plugin_args.strip()
-            if not sql_to_execute.lower().startswith('select'):
-                sql_to_execute = sql_to_execute.replace('json', '')
-                sql_to_execute = json.loads(plugin_args)['sql_code']
-            sql_to_execute = self.modify_sql(sql_to_execute)
-            print(f"sql_to_execute:{sql_to_execute}")
-            self.sql_code = sql_to_execute
-            a = time.time()
-            res_tuples = await async_db.run(sql_to_execute)
-            print('SQL Time Cost:', time.time() - a)
-            result, success = res_tuples
-            if success and len(result) == 0:
-                return '暂未查询到相关信息,可能是字段错误,请尝试调整查询条件,例如(1)where条件中修改‘招标类型’;(2)where条件中修改‘招标单位’或者“中标单位”;(3)注意在查询省市的时候是否使用了LIKE查询;', plugin_args, False
-            return f"```json\n{result}\n```", plugin_args, success
-        except:
-            traceback.print_exc()
-            return f"ERROR:{traceback.format_exc()}", plugin_args, False
-
-