diff --git a/dbm-ui/backend/db_monitor/views/callbacks/mysql.py b/dbm-ui/backend/db_monitor/views/callbacks/mysql.py index 7434abb6fb1..db57f334393 100644 --- a/dbm-ui/backend/db_monitor/views/callbacks/mysql.py +++ b/dbm-ui/backend/db_monitor/views/callbacks/mysql.py @@ -22,9 +22,7 @@ from backend.db_monitor.views.callbacks.base import AlarmCallback from backend.db_report.portrait import MysqlPortraitDimensionCode, ingest_summary from backend.db_report.portrait.exceptions import PortraitSDKBaseException -from backend.dbm_aiagent.agent.commands.commands import MySQLAlarmAnalyzerCommand from backend.dbm_aiagent.agent.constants import DBMAgentCode -from backend.dbm_aiagent.agent.handlers import AgentHandler logger = logging.getLogger("root") @@ -265,6 +263,10 @@ def call_mysql_alarm_analyzer(callback_data: dict, alarm_base_info: dict): return try: + # 延迟导入,避免监控策略视图在单测收集期强依赖 aidev Agent 包 + from backend.dbm_aiagent.agent.commands.commands import MySQLAlarmAnalyzerCommand + from backend.dbm_aiagent.agent.handlers import AgentHandler + # 调用 AI Agent 进行慢查询分析 user_prompt = extract_callback_key_info(callback_data) logger.info( @@ -325,6 +327,8 @@ def _call_agent_and_notify( timeout: Agent 调用超时时间(秒) """ try: + from backend.dbm_aiagent.agent.handlers import AgentHandler + logger.info(_("[{}] 告警触发 AI 分析,集群: {}").format(log_tag, cluster_domain)) agent_output = AgentHandler.ask_agent_with_content( agent_code=agent_code, diff --git a/dbm-ui/backend/db_monitor/views/callbacks/redis.py b/dbm-ui/backend/db_monitor/views/callbacks/redis.py index ce8a0a5106f..ad312a9ea05 100644 --- a/dbm-ui/backend/db_monitor/views/callbacks/redis.py +++ b/dbm-ui/backend/db_monitor/views/callbacks/redis.py @@ -227,6 +227,8 @@ def call_redis_alarm_correlation_analysis(callback_data: dict, alarm_base_info: return try: + from backend.dbm_aiagent.agent.handlers import AgentHandler + # 设置去重锁,防止后续同策略告警重复触发 cache.set(lock_key, 1, DEDUP_LOCK_TTL) @@ -235,8 +237,6 @@ def call_redis_alarm_correlation_analysis(callback_data: dict, alarm_base_info: "cluster_domains": list(cluster_domains), } - from backend.dbm_aiagent.agent.handlers import AgentHandler - result_summary = AgentHandler.ask_agent_with_command( command=RedisLatencyAlarmRootCauseCommand.command, command_params=correlation_input, diff --git a/dbm-ui/backend/db_periodic_task/local_tasks/ai_mysql_tasks/mysql_slowlog_analysis.py b/dbm-ui/backend/db_periodic_task/local_tasks/ai_mysql_tasks/mysql_slowlog_analysis.py index 9a9903ba51a..2b5a56958e4 100644 --- a/dbm-ui/backend/db_periodic_task/local_tasks/ai_mysql_tasks/mysql_slowlog_analysis.py +++ b/dbm-ui/backend/db_periodic_task/local_tasks/ai_mysql_tasks/mysql_slowlog_analysis.py @@ -15,6 +15,7 @@ from django.db.models import Count from django.utils import timezone +from backend import env from backend.db_meta.enums import ClusterType, InstanceRole, TenDBClusterSpiderRole from backend.db_periodic_task.local_tasks import register_periodic_task from backend.db_periodic_task.local_tasks.mysql_backup.check_ignore import CheckIgnore @@ -22,7 +23,6 @@ from backend.db_report.models.mysql_slowlog_ai_analysis import MysqlSlowlogAiAnalysis from backend.db_report.models.mysql_slowlog_detail import MysqlSlowlogDetail from backend.dbm_aiagent.agent.commands.commands import MySQLSlowLogCommand -from backend.dbm_aiagent.agent.handlers import AgentHandler logger = logging.getLogger("root") @@ -33,6 +33,10 @@ @register_periodic_task(run_every=crontab(minute=0)) def periodic_mysql_slowlog_ai_analysis(): """周期任务:从慢日志详情表中查询过去 1 小时内慢查询数量超过阈值的集群,进行 AI 分析""" + if not env.ENABLE_DBM_AI: + return + + from backend.dbm_aiagent.agent.handlers import AgentHandler now = timezone.now() time_window_start = now - timedelta(hours=1) diff --git a/dbm-ui/backend/db_periodic_task/local_tasks/ai_tasks/log_analysis.py b/dbm-ui/backend/db_periodic_task/local_tasks/ai_tasks/log_analysis.py index b6f64b6a866..60bf4291fd3 100644 --- a/dbm-ui/backend/db_periodic_task/local_tasks/ai_tasks/log_analysis.py +++ b/dbm-ui/backend/db_periodic_task/local_tasks/ai_tasks/log_analysis.py @@ -10,16 +10,21 @@ """ from celery.schedules import crontab +from backend import env from backend.db_periodic_task.constants import GET_AND_DELETE_SET_LUA from backend.db_periodic_task.local_tasks import register_periodic_task from backend.dbm_aiagent.agent.constants import FLOW_LOG_AI_ANALYSIS_KEY -from backend.dbm_aiagent.agent.services.log_analysis.tasks import pipeline_log_ai_analysis from backend.utils.redis import RedisConn @register_periodic_task(run_every=crontab(minute="*")) def periodic_pipeline_log_ai_analysis(): """周期任务错误日志AI分析""" + if not env.ENABLE_DBM_AI: + return + + from backend.dbm_aiagent.agent.services.log_analysis.tasks import pipeline_log_ai_analysis + script = RedisConn.register_script(GET_AND_DELETE_SET_LUA) task_list = script(keys=[FLOW_LOG_AI_ANALYSIS_KEY]) for root_id in task_list: diff --git a/dbm-ui/backend/db_periodic_task/local_tasks/mysql_cluster_skew/generate_report/tasks.py b/dbm-ui/backend/db_periodic_task/local_tasks/mysql_cluster_skew/generate_report/tasks.py index 56636b89829..886e018d79b 100644 --- a/dbm-ui/backend/db_periodic_task/local_tasks/mysql_cluster_skew/generate_report/tasks.py +++ b/dbm-ui/backend/db_periodic_task/local_tasks/mysql_cluster_skew/generate_report/tasks.py @@ -37,9 +37,6 @@ from backend.db_report.models.mysql_cluster_skew_report import MysqlClusterSkewReport from backend.db_report.portrait import MysqlPortraitDimensionCode, ingest_summary from backend.db_report.portrait.exceptions import PortraitSDKBaseException -from backend.dbm_aiagent.agent.constants import DBMAgentCode -from backend.dbm_aiagent.agent.handlers import AgentHandler -from backend.dbm_aiagent.mcp_tools.mysql.impl.query_cluster_skew_data import has_cluster_skew logger = logging.getLogger("celery.generate_mysql_skew_report") @@ -167,6 +164,10 @@ def generate_report(): @app.task def _generate_cluster_skew_report(cluster_type: str, domain: str, lock_key: str, bk_biz_id: int): + from backend.dbm_aiagent.agent.constants import DBMAgentCode + from backend.dbm_aiagent.agent.handlers import AgentHandler + from backend.dbm_aiagent.mcp_tools.mysql.impl.query_cluster_skew_data import has_cluster_skew + logger.info("generate %s skew report start: lock_key=%s", domain, lock_key) try: # 本地墙钟时间,不带时区,与 Doris detect_time、倾斜检测写入方式一致 diff --git a/dbm-ui/backend/db_periodic_task/local_tasks/mysql_config_ai_inspect/tasks.py b/dbm-ui/backend/db_periodic_task/local_tasks/mysql_config_ai_inspect/tasks.py index 3781240ebe5..f3474e19e46 100644 --- a/dbm-ui/backend/db_periodic_task/local_tasks/mysql_config_ai_inspect/tasks.py +++ b/dbm-ui/backend/db_periodic_task/local_tasks/mysql_config_ai_inspect/tasks.py @@ -28,7 +28,6 @@ from backend.db_report.portrait import MysqlPortraitDimensionCode, ingest_summary from backend.db_report.portrait.exceptions import PortraitSDKBaseException from backend.dbm_aiagent.agent.constants import DEFAULT_AGENT_CHAT_TIMEOUT, DBMAgentCode -from backend.dbm_aiagent.agent.handlers import AgentHandler logger = logging.getLogger("celery") @@ -215,6 +214,8 @@ def run_mysql_config_ai_inspect(row_id: int, lock_key: str): logger.info(_("配置巡检开始调用 agent: id={} domain={}").format(row.id, row.cluster_domain)) t_start = time.monotonic() try: + from backend.dbm_aiagent.agent.handlers import AgentHandler + res = AgentHandler.ask_agent_with_content( agent_code=DBMAgentCode.MYSQL_CONFIG_PERF_TUNER, content=str(content), diff --git a/dbm-ui/backend/dbm_aiagent/agent/builtin.py b/dbm-ui/backend/dbm_aiagent/agent/builtin.py index 7b3fc3b928b..f5def8e804c 100644 --- a/dbm-ui/backend/dbm_aiagent/agent/builtin.py +++ b/dbm-ui/backend/dbm_aiagent/agent/builtin.py @@ -14,6 +14,7 @@ from aidev_bkplugin.views.agent import AgentInfoViewSet from aidev_bkplugin.views.chat import ChatCompletionViewSet from aidev_bkplugin.views.chat_group import ChatGroupViewSet +from aidev_bkplugin.views.llm import LLMViewSet from aidev_bkplugin.views.session import ( ChatSessionContentFeedbackViewSet, ChatSessionContentViewSet, @@ -108,3 +109,7 @@ class AIChatGroupViewSet(AgentCodeResourceManagerMixin, ChatGroupViewSet): class AIChatSessionShareView(AgentCodeResourceManagerMixin, ChatSessionShareView): pass + + +class AILLMViewSet(AgentCodeResourceManagerMixin, LLMViewSet): + pass diff --git a/dbm-ui/backend/dbm_aiagent/agent/configs/manager.py b/dbm-ui/backend/dbm_aiagent/agent/configs/manager.py index ec97718a9c9..dbff1bb40f4 100644 --- a/dbm-ui/backend/dbm_aiagent/agent/configs/manager.py +++ b/dbm-ui/backend/dbm_aiagent/agent/configs/manager.py @@ -12,8 +12,8 @@ import logging from aidev_agent.enums import CredentialType -from aidev_agent.packages.resource_manager import AgentResourceManager from aidev_agent.pydantic_models import AgentConfig +from aidev_bkplugin.services.agent_builder import LLMOverrideResourceManager from aidev_bkplugin.services.agent_session import SessionManager from django.conf import settings from django.core.cache import cache @@ -52,15 +52,18 @@ } -class DBMAgentResourceManager(AgentResourceManager): +class DBMAgentResourceManager(LLMOverrideResourceManager): """DBM Agent配置管理器""" - def __init__(self, username="", agent_code: str = None, agent_secret: str = None): + def __init__(self, username="", agent_code: str = None, agent_secret: str = None, model: str = ""): + """ + :param model: 覆盖智能体发布时配置的 chat_model,为空时沿用平台配置 + """ agent_code = agent_code or settings.AGENT_APP_CODE agent_secret = agent_secret or settings.AGENT_APP_SECRET # TODO:这里不能传递真实的username,暂时为空 username = "" if username == DEFAULT_USERNAME else username - super().__init__(app_code=agent_code, app_secret=agent_secret, username=username) + super().__init__(app_code=agent_code, app_secret=agent_secret, username=username, model=model) @classmethod def set_backend_mcp_config(cls, agent_config: AgentConfig): @@ -159,18 +162,19 @@ def get_paas_sbx_client(self, executor_info: dict, **kwargs): return client -def build_resource_manager(agent_code, username) -> DBMAgentResourceManager: +def build_resource_manager(agent_code, username, model: str = "") -> DBMAgentResourceManager: """ 构建子智能体 resource-manager 如果没配置,则默认走主智能体调用(快捷指令路由) :param agent_code: 子智能体 code,未配置 token 时回退到主智能体 :param username: 用户名,用于用户态 access_token 注入(view 层透传) + :param model: 覆盖智能体发布时配置的 chat_model,为空时沿用平台配置 """ agent_token_config = SystemSettings.get_setting_value(key=SystemSettingsEnum.AGENT_TOKEN_CONFIG, default={}) agent_token = agent_token_config.get(agent_code, "") if not agent_token: - return DBMAgentResourceManager(username) - return DBMAgentResourceManager(username, agent_code, agent_token) + return DBMAgentResourceManager(username, model=model) + return DBMAgentResourceManager(username, agent_code, agent_token, model=model) def build_session_manager(agent_code, username) -> SessionManager: diff --git a/dbm-ui/backend/dbm_aiagent/agent/handlers.py b/dbm-ui/backend/dbm_aiagent/agent/handlers.py index 323bcb44f2f..6c1d6b28a2c 100644 --- a/dbm-ui/backend/dbm_aiagent/agent/handlers.py +++ b/dbm-ui/backend/dbm_aiagent/agent/handlers.py @@ -37,17 +37,25 @@ class AgentHandler: @staticmethod def __generate_session_code(): - """生成session_code""" + """生成session_code + + :return: uuid4 字符串,作为 aidev 平台会话的唯一标识 + """ return str(uuid.uuid4()) @staticmethod - def __build_resource_manager(agent_code, username) -> DBMAgentResourceManager: - """创建子智能体 resource manager""" - return build_resource_manager(agent_code, username) + def __build_resource_manager(agent_code, username, model: str = "") -> DBMAgentResourceManager: + """创建子智能体 resource manager + resource manager 决定了本次调用使用哪套 app 凭证、以谁的身份换取 access_token, + 以及最终装配 agent 时使用的模型配置。 + """ + return build_resource_manager(agent_code, username, model) @staticmethod def __build_session_manager(agent_code, username) -> SessionManager: - """创建session manager""" + """创建session manager + session manager 只负责会话及会话内容的增删查,不参与 agent 装配,因此无需模型信息。 + """ return build_session_manager(agent_code, username) @classmethod @@ -57,7 +65,15 @@ def __build_client(cls, agent_code, username): @classmethod def create_temporary_session(cls, username, agent_code): - """创建临时会话""" + """创建临时会话 + + 临时会话(is_temporary=True)不会出现在用户的会话列表中,适用于后台任务、 + 单次问答等不需要留存上下文的场景。 + + :param username: 会话归属的用户名 + :param agent_code: 会话使用的智能体 code + :return: 新建会话的 session_code + """ session_code = cls.__generate_session_code() # 创建临时会话 @@ -81,10 +97,27 @@ def create_chat_completion( stream: bool = False, timeout=DEFAULT_AGENT_CHAT_TIMEOUT, username=DEFAULT_USERNAME, + *, + model: str = "", ): - """获得本次对话内容,支持流式/非流式""" + """获得本次对话内容,支持流式/非流式 + + 以 session_code 为上下文装配 agent 并执行,会话历史由 SDK 从平台侧拉取, + 因此调用前需保证用户提问已写入该会话。 + + :param agent_code: 应答使用的智能体 code + :param session_code: 会话 code,agent 由此还原完整对话上下文 + :param session_content_id: 本轮用户提问的内容 ID。当前实现未使用(SDK 直接按 + session_code 拉取会话上下文),保留该参数用于调用链路追溯 + :param stream: 是否流式返回 + :param timeout: 单次对话的超时时间(秒) + :param username: 调用者用户名,决定 access_token 与工时归属 + :param model: 指定本次对话使用的 LLM,为空时使用智能体发布时配置的模型 + :return: 非流式返回 dict(含 choices/model/id/reference_doc);流式返回事件生成器 + """ execute_kwargs = ExecuteKwargs(stream=stream, invoke_timeout=timeout) - rm = cls.__build_resource_manager(agent_code, username) + # 模型覆盖挂在 resource manager 上,agent 装配时经 get_agent_config 生效 + rm = cls.__build_resource_manager(agent_code, username, model) sm = cls.__build_session_manager(agent_code, username) agent_instance = AgentBuilder( resource_manager=rm, @@ -104,8 +137,23 @@ def ask_agent_with_content( session_code=None, stream: bool = False, timeout=DEFAULT_AGENT_CHAT_TIMEOUT, + *, + model: str = "", ): - """根据agent直接内容询问agent""" + """根据agent直接内容询问agent + + 完整链路:准备会话 -> 写入用户提问 -> 触发 AI 应答。 + 未传 session_code 时会新建临时会话,即一次性问答;传入则在既有会话内追加提问。 + + :param agent_code: 目标智能体 code。非主智能体时按快捷指令语义记录,用于工时统计 + :param content: 用户提问内容 + :param username: 调用者用户名 + :param session_code: 复用的会话 code,为空时新建临时会话 + :param stream: 是否流式返回 + :param timeout: 单次对话的超时时间(秒) + :param model: 指定本次对话使用的 LLM,为空时使用智能体发布时配置的模型 + :return: 非流式返回 AI 回复正文字符串;流式返回 StreamingHttpResponse + """ # 创建临时会话 session_code = session_code or cls.create_temporary_session(username, agent_code) @@ -129,6 +177,7 @@ def ask_agent_with_content( stream=stream, timeout=timeout, username=username, + model=model, ) if stream and not isinstance(ai_response, dict): @@ -144,10 +193,26 @@ def ask_agent_with_content_in_session( username=DEFAULT_USERNAME, session_code=None, timeout=DEFAULT_AGENT_CHAT_TIMEOUT, + *, + model: str = "", ): - """根据agent直接内容询问agent, 连续对话""" + """根据agent直接内容询问agent, 连续对话 + + 与 ask_agent_with_content 的差别在于额外返回 session_code,调用方把它带入下一轮 + 即可延续上下文,实现多轮对话。仅支持非流式。 + + :param agent_code: 目标智能体 code + :param content: 用户提问内容 + :param username: 调用者用户名 + :param session_code: 复用的会话 code,为空时新建临时会话 + :param timeout: 单次对话的超时时间(秒) + :param model: 指定本次对话使用的 LLM,为空时使用智能体发布时配置的模型 + :return: (AI 回复正文, 本轮使用的 session_code) + """ session_code = session_code or cls.create_temporary_session(username, agent_code) - ai_response = cls.ask_agent_with_content(agent_code, content, username, session_code, timeout=timeout) + ai_response = cls.ask_agent_with_content( + agent_code, content, username, session_code, timeout=timeout, model=model + ) return ai_response, session_code @classmethod @@ -158,8 +223,24 @@ def ask_agent_with_command( username=DEFAULT_USERNAME, stream: bool = False, timeout=DEFAULT_AGENT_CHAT_TIMEOUT, + *, + model: str = "", ): - """根据快捷指令询问agent""" + """根据快捷指令询问agent + + 与 ask_agent_with_content 的差别在于提问内容不由调用方直接给出,而是把 command_params + 填入指令注册时声明的模板渲染得到;目标智能体也由指令自身声明,无需调用方指定。 + 每次调用都会新建临时会话,不支持多轮。 + + :param command: 快捷指令 code,须已注册到 CommandProcessor + :param command_params: 指令模板的填充参数,key 为模板变量名 + :param username: 调用者用户名 + :param stream: 是否流式返回 + :param timeout: 单次对话的超时时间(秒) + :param model: 指定本次对话使用的 LLM,为空时使用智能体发布时配置的模型 + :return: 非流式返回 AI 回复正文字符串;流式返回 StreamingHttpResponse + :raises ValueError: 指令未注册到 CommandProcessor + """ if command not in CommandProcessor._handlers: raise ValueError(f"Command {command} not found") command_handler = CommandProcessor._handlers[command] @@ -193,6 +274,7 @@ def ask_agent_with_command( stream=stream, timeout=timeout, username=username, + model=model, ) if stream and not isinstance(ai_response, dict): @@ -202,6 +284,13 @@ def ask_agent_with_command( @staticmethod def streaming_response(generator): + """将 agent 的流式输出包装为 SSE 响应 + + 关闭客户端缓存与 nginx 缓冲,避免 AI 回复被攒到最后一次性吐出。 + + :param generator: agent 执行产生的事件生成器 + :return: content-type 为 text/event-stream 的流式响应 + """ sr = StreamingHttpResponse(generator) sr.headers["Cache-Control"] = "no-cache" sr.headers["X-Accel-Buffering"] = "no" @@ -215,6 +304,8 @@ def compare_risk_reports( current_report: str, username=DEFAULT_USERNAME, agent_code: DBMAgentCode = DBMAgentCode.TASK_GUARDIAN, + *, + model: str = "", ) -> dict: """ 调用智能体比对两份风险报告是否描述同一风险问题 @@ -228,6 +319,7 @@ def compare_risk_reports( current_report: 本次的风险报告内容 username: 调用智能体的用户名 agent_code: 智能体代码,默认使用通用单据值守智能体,可传入对应DB组件的单据值守智能体 + model: 指定本次对话使用的 LLM,为空时使用智能体发布时配置的模型 Returns: dict: {"is_same_risk": bool, "reason": str} @@ -244,6 +336,7 @@ def compare_risk_reports( agent_code=agent_code, content=compare_prompt, username=username, + model=model, ) # 从返回中提取 JSON json_match = re.search(r'\{.*?"is_same_risk".*?}', ai_response, re.DOTALL) diff --git a/dbm-ui/backend/dbm_aiagent/agent/urls.py b/dbm-ui/backend/dbm_aiagent/agent/urls.py index 1a7bfbce3dc..a8dad068c9c 100644 --- a/dbm-ui/backend/dbm_aiagent/agent/urls.py +++ b/dbm-ui/backend/dbm_aiagent/agent/urls.py @@ -19,6 +19,7 @@ AIChatSessionContentViewSet, AIChatSessionShareView, AIChatSessionViewSet, + AILLMViewSet, ) from .services.log_analysis.views import AILogAnalysisViewSet @@ -32,6 +33,8 @@ router.register("session_feedback", AIChatSessionContentFeedbackViewSet, "chat_session_feedback") router.register("chat_group", AIChatGroupViewSet, "chat_group") router.register("share", AIChatSessionShareView, "share") +router.register("llms", AILLMViewSet, "llms") + # 日志分析 router.register("log", AILogAnalysisViewSet, "log_analysis") diff --git a/dbm-ui/backend/env/__init__.py b/dbm-ui/backend/env/__init__.py index 1ecb79aa1c5..dead49b6760 100644 --- a/dbm-ui/backend/env/__init__.py +++ b/dbm-ui/backend/env/__init__.py @@ -33,6 +33,8 @@ REDIS_PORT = get_type_env(key="REDIS_PORT", _type=int, default=6379) REDIS_PASSWORD = get_type_env(key="REDIS_PASSWORD", _type=str, default="") REDIS_URL = f"redis://{f':{REDIS_PASSWORD}@' if REDIS_PASSWORD else ''}{REDIS_HOST}:{REDIS_PORT}/1" +# aidev redis缓存配置 +MESSAGE_REDIS_URL = get_type_env(key="MESSAGE_REDIS_URL", _type=str, default=REDIS_URL) # Redis 开发最佳实践文档地址(内网iwiki),开源环境默认留空,内网环境通过环境变量 REDIS_DEV_BEST_PRACTICE_URL 配置 REDIS_DEV_BEST_PRACTICE_URL = get_type_env(key="REDIS_DEV_BEST_PRACTICE_URL", _type=str, default="") diff --git a/dbm-ui/backend/ticket/builders/__init__.py b/dbm-ui/backend/ticket/builders/__init__.py index 6272e154630..08c5448c675 100644 --- a/dbm-ui/backend/ticket/builders/__init__.py +++ b/dbm-ui/backend/ticket/builders/__init__.py @@ -26,8 +26,6 @@ from backend.db_meta.enums import MachineType, TenDBClusterSpiderRole from backend.db_meta.models import AppCache, Cluster, Machine, ProxyInstance, StorageInstance from backend.db_services.dbbase.constants import IpSource -from backend.dbm_aiagent.agent.constants import DBMAgentCode -from backend.dbm_aiagent.agent.handlers import AgentHandler from backend.iam_app.dataclass.actions import ActionEnum from backend.ticket.constants import TICKET_EXPIRE_DEFAULT_CONFIG, FlowRetryType, FlowType, TicketType from backend.ticket.exceptions import TicketResourceApplyException @@ -533,6 +531,9 @@ def ai_summary_details(cls, ticket: Ticket) -> Union[str, Dict]: if not env.ENABLE_DBM_AI: return ticket.details try: + from backend.dbm_aiagent.agent.constants import DBMAgentCode + from backend.dbm_aiagent.agent.handlers import AgentHandler + return AgentHandler.ask_agent_with_content( agent_code=DBMAgentCode.LOG_ANALYSIS, content=str(_("{} 总结需求摘要").format(ticket.details)), diff --git a/dbm-ui/config/default.py b/dbm-ui/config/default.py index ec5c0cc5845..5a4f4602712 100644 --- a/dbm-ui/config/default.py +++ b/dbm-ui/config/default.py @@ -164,9 +164,8 @@ "backend.dbm_aiagent.apps.SafeAidevBkpluginConfig", "backend.dbm_aiagent.apps.DbmAiagentConfig", ) - # 这两张表由 SDK 侧负责创建,dbm 不接管其 schema,故置空跳过该 app 的迁移。 - # 注:checkpoint 表的联合唯一索引在 utf8mb4 下,超过 InnoDB 单索引 3072 字节上限会导致迁移失败 - MIGRATION_MODULES = {"aidev_bkplugin": None} + # checkpoint / write 两张表的 schema 由 SDK 侧的 migration 维护,dbm 不生成也不修改其迁移文件。 + # MIGRATION_MODULES = {"aidev_bkplugin": None} # 中间件 MIDDLEWARE = ( diff --git a/dbm-ui/poetry.lock b/dbm-ui/poetry.lock index 59909178618..5202a2cb7aa 100644 --- a/dbm-ui/poetry.lock +++ b/dbm-ui/poetry.lock @@ -16,13 +16,13 @@ pydantic = ">=2.11.2" [[package]] name = "aidev-agent" -version = "2.1.0rc85" +version = "2.2.2rc28" description = "bkaidev agent builder" optional = false python-versions = "<3.12,>=3.11" files = [ - {file = "aidev_agent-2.1.0rc85-py3-none-any.whl", hash = "sha256:4496353a245b62a550a462b54b41c6b6e6d84849f87c48419c7d8d844df2d6ab"}, - {file = "aidev_agent-2.1.0rc85.tar.gz", hash = "sha256:1c27e6f3ddbe79590f5ce5b1660a44a010e765a148313901016307af9ee046ae"}, + {file = "aidev_agent-2.2.2rc28-py3-none-any.whl", hash = "sha256:c98aaff8c7f62d524c663b9fdd58a374d68b51caa2da8a4833f8bb6e8a2c8918"}, + {file = "aidev_agent-2.2.2rc28.tar.gz", hash = "sha256:862a0c6b3bca9da3fb05e11a990483d542123b0abfb9941bef454a2fefe69b36"}, ] [package.dependencies] @@ -47,30 +47,37 @@ mcp = "1.25.0" pika = ">=1.3.0" pyro4 = ">=4.82,<5.0" pytz = ">=2025.2,<2026.0" +redis = ">=5.3.1,<6.0.0" +requests = ">=2.28.0" +rstream = ">=0.40.1,<1.0.0" typing-extensions = ">=4.0.0" urllib3 = ">=2.6.3" werkzeug = ">=3.1.3,<4.0.0" wrapt = ">1,<2" [package.extras] +a2a = ["a2a-sdk (>=1.1.0)", "agent-client-protocol (>=0.10.1)"] opentelemetry = ["opentelemetry-api (==1.33.1)", "opentelemetry-exporter-otlp (==1.33.1)", "opentelemetry-exporter-otlp-proto-common (==1.33.1)", "opentelemetry-exporter-otlp-proto-grpc (==1.33.1)", "opentelemetry-exporter-otlp-proto-http (==1.33.1)", "opentelemetry-instrumentation (==0.54b1)", "opentelemetry-instrumentation-httpx (==0.54b1)", "opentelemetry-instrumentation-langchain (==0.38.10)", "opentelemetry-instrumentation-threading (==0.54b1)", "opentelemetry-sdk (==1.33.1)", "opentelemetry-semantic-conventions (==0.54b1)", "opentelemetry-semantic-conventions-ai (==0.4.3)"] [[package]] name = "aidev-bkplugin" -version = "2.1.0rc85" +version = "2.2.2rc28" description = "AiDev Agent Bkplugin builtin functions" optional = false python-versions = "<3.12,>=3.11" files = [ - {file = "aidev_bkplugin-2.1.0rc85-py3-none-any.whl", hash = "sha256:4ac47b7bee7f2e7ecc83f97ba4355dba76d468673c6b73c1930638f5f4fa67f1"}, - {file = "aidev_bkplugin-2.1.0rc85.tar.gz", hash = "sha256:a008795e4b7e81b6b67dbda63c7644ca24399cd7161e97149e78c3d470b3a13f"}, + {file = "aidev_bkplugin-2.2.2rc28-py3-none-any.whl", hash = "sha256:8c9440ecb518300b5e22965a741d50b2d1cc87c364f029788c10aa84143ff380"}, + {file = "aidev_bkplugin-2.2.2rc28.tar.gz", hash = "sha256:ed8d99de91b07fbda8b40759a4737cce3862248f618cb70b188abc31bd80a3d1"}, ] [package.dependencies] -aidev-agent = ">=2.1.0rc85" +aidev-agent = ">=2.2.2rc28" blueapps = ">=4.15.1,<5.0" django = ">=4.2.28,<5.0" +[package.extras] +opentelemetry = ["aidev-agent[opentelemetry] (>=2.2.2rc17)"] + [[package]] name = "aiohappyeyeballs" version = "2.6.1" @@ -3259,6 +3266,130 @@ files = [ {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, ] +[[package]] +name = "mmh3" +version = "5.2.1" +description = "Python extension for MurmurHash (MurmurHash3), a set of fast and robust hash functions." +optional = false +python-versions = ">=3.10" +files = [ + {file = "mmh3-5.2.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5d87a3584093e1a89987e3d36d82c98d9621b2cb944e22a420aa1401e096758f"}, + {file = "mmh3-5.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:30e4d2084df019880d55f6f7bea35328d9b464ebee090baa372c096dc77556fb"}, + {file = "mmh3-5.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0bbc17250b10d3466875a40a52520a6bac3c02334ca709207648abd3c223ed5c"}, + {file = "mmh3-5.2.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:76219cd1eefb9bf4af7856e3ae563d15158efa145c0aab01e9933051a1954045"}, + {file = "mmh3-5.2.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fb9d44c25244e11c8be3f12c938ca8ba8404620ef8092245d2093c6ab3df260f"}, + {file = "mmh3-5.2.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2d5d542bf2abd0fd0361e8017d03f7cb5786214ceb4a40eef1539d6585d93386"}, + {file = "mmh3-5.2.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:08043f7cb1fb9467c3fbbbaea7896986e7fbc81f4d3fd9289a73d9110ab6207a"}, + {file = "mmh3-5.2.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:add7ac388d1e0bf57259afbcf9ed05621a3bf11ce5ee337e7536f1e1aaf056b0"}, + {file = "mmh3-5.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:41105377f6282e8297f182e393a79cfffd521dde37ace52b106373bdcd9ca5cb"}, + {file = "mmh3-5.2.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3cb61db880ec11e984348227b333259994c2c85caa775eb7875decb3768db890"}, + {file = "mmh3-5.2.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e8b5378de2b139c3a830f0209c1e91f7705919a4b3e563a10955104f5097a70a"}, + {file = "mmh3-5.2.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e904f2417f0d6f6d514f3f8b836416c360f306ddaee1f84de8eef1e722d212e5"}, + {file = "mmh3-5.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f1fbb0a99125b1287c6d9747f937dc66621426836d1a2d50d05aecfc81911b57"}, + {file = "mmh3-5.2.1-cp310-cp310-win32.whl", hash = "sha256:b4cce60d0223074803c9dbe0721ad3fa51dafe7d462fee4b656a1aa01ee07518"}, + {file = "mmh3-5.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:6f01f044112d43a20be2f13a11683666d87151542ad627fe41a18b9791d2802f"}, + {file = "mmh3-5.2.1-cp310-cp310-win_arm64.whl", hash = "sha256:7501e9be34cb21e72fcfe672aafd0eee65c16ba2afa9dcb5500a587d3a0580f0"}, + {file = "mmh3-5.2.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:dae0f0bd7d30c0ad61b9a504e8e272cb8391eed3f1587edf933f4f6b33437450"}, + {file = "mmh3-5.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9aeaf53eaa075dd63e81512522fd180097312fb2c9f476333309184285c49ce0"}, + {file = "mmh3-5.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0634581290e6714c068f4aa24020acf7880927d1f0084fa753d9799ae9610082"}, + {file = "mmh3-5.2.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e080c0637aea036f35507e803a4778f119a9b436617694ae1c5c366805f1e997"}, + {file = "mmh3-5.2.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:db0562c5f71d18596dcd45e854cf2eeba27d7543e1a3acdafb7eef728f7fe85d"}, + {file = "mmh3-5.2.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d9f9a3ce559a5267014b04b82956993270f63ec91765e13e9fd73daf2d2738e"}, + {file = "mmh3-5.2.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:960b1b3efa39872ac8b6cc3a556edd6fb90ed74f08c9c45e028f1005b26aa55d"}, + {file = "mmh3-5.2.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d30b650595fdbe32366b94cb14f30bb2b625e512bd4e1df00611f99dc5c27fd4"}, + {file = "mmh3-5.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:82f3802bfc4751f420d591c5c864de538b71cea117fce67e4595c2afede08a15"}, + {file = "mmh3-5.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:915e7a2418f10bd1151b1953df06d896db9783c9cfdb9a8ee1f9b3a4331ab503"}, + {file = "mmh3-5.2.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:fc78739b5ec6e4fb02301984a3d442a91406e7700efbe305071e7fd1c78278f2"}, + {file = "mmh3-5.2.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:41aac7002a749f08727cb91babff1daf8deac317c0b1f317adc69be0e6c375d1"}, + {file = "mmh3-5.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9d8089d853c7963a8ce87fff93e2a67075c0bc08684a08ea6ad13577c38ffc38"}, + {file = "mmh3-5.2.1-cp311-cp311-win32.whl", hash = "sha256:baeb47635cb33375dee4924cd93d7f5dcaa786c740b08423b0209b824a1ee728"}, + {file = "mmh3-5.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:1e4ecee40ba19e6975e1120829796770325841c2f153c0e9aecca927194c6a2a"}, + {file = "mmh3-5.2.1-cp311-cp311-win_arm64.whl", hash = "sha256:c302245fd6c33d96bd169c7ccf2513c20f4c1e417c07ce9dce107c8bc3f8411f"}, + {file = "mmh3-5.2.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0cc21533878e5586b80d74c281d7f8da7932bc8ace50b8d5f6dbf7e3935f63f1"}, + {file = "mmh3-5.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4eda76074cfca2787c8cf1bec603eaebdddd8b061ad5502f85cddae998d54f00"}, + {file = "mmh3-5.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:eee884572b06bbe8a2b54f424dbd996139442cf83c76478e1ec162512e0dd2c7"}, + {file = "mmh3-5.2.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0d0b7e803191db5f714d264044e06189c8ccd3219e936cc184f07106bd17fd7b"}, + {file = "mmh3-5.2.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8e6c219e375f6341d0959af814296372d265a8ca1af63825f65e2e87c618f006"}, + {file = "mmh3-5.2.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:26fb5b9c3946bf7f1daed7b37e0c03898a6f062149127570f8ede346390a0825"}, + {file = "mmh3-5.2.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3c38d142c706201db5b2345166eeef1e7740e3e2422b470b8ba5c8727a9b4c7a"}, + {file = "mmh3-5.2.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50885073e2909251d4718634a191c49ae5f527e5e1736d738e365c3e8be8f22b"}, + {file = "mmh3-5.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b3f99e1756fc48ad507b95e5d86f2fb21b3d495012ff13e6592ebac14033f166"}, + {file = "mmh3-5.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:62815d2c67f2dd1be76a253d88af4e1da19aeaa1820146dec52cf8bee2958b16"}, + {file = "mmh3-5.2.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8f767ba0911602ddef289404e33835a61168314ebd3c729833db2ed685824211"}, + {file = "mmh3-5.2.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:67e41a497bac88cc1de96eeba56eeb933c39d54bc227352f8455aa87c4ca4000"}, + {file = "mmh3-5.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3d74a03fb57757ece25aa4b3c1c60157a1cece37a020542785f942e2f827eed5"}, + {file = "mmh3-5.2.1-cp312-cp312-win32.whl", hash = "sha256:7374d6e3ef72afe49697ecd683f3da12f4fc06af2d75433d0580c6746d2fa025"}, + {file = "mmh3-5.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:3a9fed49c6ce4ed7e73f13182760c65c816da006debe67f37635580dfb0fae00"}, + {file = "mmh3-5.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:bbfcb95d9a744e6e2827dfc66ad10e1020e0cac255eb7f85652832d5a264c2fc"}, + {file = "mmh3-5.2.1-cp313-cp313-android_21_arm64_v8a.whl", hash = "sha256:723b2681ed4cc07d3401bbea9c201ad4f2a4ca6ba8cddaff6789f715dd2b391e"}, + {file = "mmh3-5.2.1-cp313-cp313-android_21_x86_64.whl", hash = "sha256:3619473a0e0d329fd4aec8075628f8f616be2da41605300696206d6f36920c3d"}, + {file = "mmh3-5.2.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:e48d4dbe0f88e53081da605ae68644e5182752803bbc2beb228cca7f1c4454d6"}, + {file = "mmh3-5.2.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:a482ac121de6973897c92c2f31defc6bafb11c83825109275cffce54bb64933f"}, + {file = "mmh3-5.2.1-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:17fbb47f0885ace8327ce1235d0416dc86a211dcd8cc1e703f41523be32cfec8"}, + {file = "mmh3-5.2.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d51fde50a77f81330523562e3c2734ffdca9c4c9e9d355478117905e1cfe16c6"}, + {file = "mmh3-5.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:19bbd3b841174ae6ed588536ab5e1b1fe83d046e668602c20266547298d939a9"}, + {file = "mmh3-5.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:be77c402d5e882b6fbacfd90823f13da8e0a69658405a39a569c6b58fdb17b03"}, + {file = "mmh3-5.2.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:fd96476f04db5ceba1cfa0f21228f67c1f7402296f0e73fee3513aa680ad237b"}, + {file = "mmh3-5.2.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:707151644085dd0f20fe4f4b573d28e5130c4aaa5f587e95b60989c5926653b5"}, + {file = "mmh3-5.2.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3737303ca9ea0f7cb83028781148fcda4f1dac7821db0c47672971dabcf63593"}, + {file = "mmh3-5.2.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2778fed822d7db23ac5008b181441af0c869455b2e7d001f4019636ac31b6fe4"}, + {file = "mmh3-5.2.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d57dea657357230cc780e13920d7fa7db059d58fe721c80020f94476da4ca0a1"}, + {file = "mmh3-5.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:169e0d178cb59314456ab30772429a802b25d13227088085b0d49b9fe1533104"}, + {file = "mmh3-5.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7e4e1f580033335c6f76d1e0d6b56baf009d1a64d6a4816347e4271ba951f46d"}, + {file = "mmh3-5.2.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:2bd9f19f7f1fcebd74e830f4af0f28adad4975d40d80620be19ffb2b2af56c9f"}, + {file = "mmh3-5.2.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:c88653877aeb514c089d1b3d473451677b8b9a6d1497dbddf1ae7934518b06d2"}, + {file = "mmh3-5.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fceef7fe67c81e1585198215e42ad3fdba3a25644beda8fbdaf85f4d7b93175a"}, + {file = "mmh3-5.2.1-cp313-cp313-win32.whl", hash = "sha256:54b64fb2433bc71488e7a449603bf8bd31fbcf9cb56fbe1eb6d459e90b86c37b"}, + {file = "mmh3-5.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:cae6383181f1e345317742d2ddd88f9e7d2682fa4c9432e3a74e47d92dce0229"}, + {file = "mmh3-5.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:022aa1a528604e6c83d0a7705fdef0b5355d897a9e0fa3a8d26709ceaa06965d"}, + {file = "mmh3-5.2.1-cp314-cp314-android_24_arm64_v8a.whl", hash = "sha256:d771f085fcdf4035786adfb1d8db026df1eb4b41dac1c3d070d1e49512843227"}, + {file = "mmh3-5.2.1-cp314-cp314-android_24_x86_64.whl", hash = "sha256:7f196cd7910d71e9d9860da0ff7a77f64d22c1ad931f1dd18559a06e03109fc0"}, + {file = "mmh3-5.2.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:b1f12bd684887a0a5d55e6363ca87056f361e45451105012d329b86ec19dbe0b"}, + {file = "mmh3-5.2.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:d106493a60dcb4aef35a0fac85105e150a11cf8bc2b0d388f5a33272d756c966"}, + {file = "mmh3-5.2.1-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:44983e45310ee5b9f73397350251cdf6e63a466406a105f1d16cb5baa659270b"}, + {file = "mmh3-5.2.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:368625fb01666655985391dbad3860dc0ba7c0d6b9125819f3121ee7292b4ac8"}, + {file = "mmh3-5.2.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:72d1cc63bcc91e14933f77d51b3df899d6a07d184ec515ea7f56bff659e124d7"}, + {file = "mmh3-5.2.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e8b4b5580280b9265af3e0409974fb79c64cf7523632d03fbf11df18f8b0181e"}, + {file = "mmh3-5.2.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4cbbde66f1183db040daede83dd86c06d663c5bb2af6de1142b7c8c37923dd74"}, + {file = "mmh3-5.2.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8ff038d52ef6aa0f309feeba00c5095c9118d0abf787e8e8454d6048db2037fc"}, + {file = "mmh3-5.2.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a4130d0b9ce5fad6af07421b1aecc7e079519f70d6c05729ab871794eded8617"}, + {file = "mmh3-5.2.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f6e0bfe77d238308839699944164b96a2eeccaf55f2af400f54dc20669d8d5f2"}, + {file = "mmh3-5.2.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f963eafc0a77a6c0562397da004f5876a9bcf7265a7bcc3205e29636bc4a1312"}, + {file = "mmh3-5.2.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:92883836caf50d5255be03d988d75bc93e3f86ba247b7ca137347c323f731deb"}, + {file = "mmh3-5.2.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:57b52603e89355ff318025dd55158f6e71396c0f1f609d548e9ea9c94cc6ce0a"}, + {file = "mmh3-5.2.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:f40a95186a72fa0b67d15fef0f157bfcda00b4f59c8a07cbe5530d41ac35d105"}, + {file = "mmh3-5.2.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:58370d05d033ee97224c81263af123dea3d931025030fd34b61227a768a8858a"}, + {file = "mmh3-5.2.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7be6dfb49e48fd0a7d91ff758a2b51336f1cd21f9d44b20f6801f072bd080cdd"}, + {file = "mmh3-5.2.1-cp314-cp314-win32.whl", hash = "sha256:54fe8518abe06a4c3852754bfd498b30cc58e667f376c513eac89a244ce781a4"}, + {file = "mmh3-5.2.1-cp314-cp314-win_amd64.whl", hash = "sha256:3f796b535008708846044c43302719c6956f39ca2d93f2edda5319e79a29efbb"}, + {file = "mmh3-5.2.1-cp314-cp314-win_arm64.whl", hash = "sha256:cd471ede0d802dd936b6fab28188302b2d497f68436025857ca72cd3810423fe"}, + {file = "mmh3-5.2.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:5174a697ce042fa77c407e05efe41e03aa56dae9ec67388055820fb48cf4c3ba"}, + {file = "mmh3-5.2.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:0a3984146e414684a6be2862d84fcb1035f4984851cb81b26d933bab6119bf00"}, + {file = "mmh3-5.2.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:bd6e7d363aa93bd3421b30b6af97064daf47bc96005bddba67c5ffbc6df426b8"}, + {file = "mmh3-5.2.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:113f78e7463a36dbbcea05bfe688efd7fa759d0f0c56e73c974d60dcfec3dfcc"}, + {file = "mmh3-5.2.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7e8ec5f606e0809426d2440e0683509fb605a8820a21ebd120dcdba61b74ef7f"}, + {file = "mmh3-5.2.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22b0f9971ec4e07e8223f2beebe96a6cfc779d940b6f27d26604040dd74d3a44"}, + {file = "mmh3-5.2.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:85ffc9920ffc39c5eee1e3ac9100c913a0973996fbad5111f939bbda49204bb7"}, + {file = "mmh3-5.2.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7aec798c2b01aaa65a55f1124f3405804184373abb318a3091325aece235f67c"}, + {file = "mmh3-5.2.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:55dbbd8ffbc40d1697d5e2d0375b08599dae8746b0b08dea05eee4ce81648fac"}, + {file = "mmh3-5.2.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:6c85c38a279ca9295a69b9b088a2e48aa49737bb1b34e6a9dc6297c110e8d912"}, + {file = "mmh3-5.2.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:6290289fa5fb4c70fd7f72016e03633d60388185483ff3b162912c81205ae2cf"}, + {file = "mmh3-5.2.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:4fc6cd65dc4d2fdb2625e288939a3566e36127a84811a4913f02f3d5931da52d"}, + {file = "mmh3-5.2.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:623f938f6a039536cc02b7582a07a080f13fdfd48f87e63201d92d7e34d09a18"}, + {file = "mmh3-5.2.1-cp314-cp314t-win32.whl", hash = "sha256:29bc3973676ae334412efdd367fcd11d036b7be3efc1ce2407ef8676dabfeb82"}, + {file = "mmh3-5.2.1-cp314-cp314t-win_amd64.whl", hash = "sha256:28cfab66577000b9505a0d068c731aee7ca85cd26d4d63881fab17857e0fe1fb"}, + {file = "mmh3-5.2.1-cp314-cp314t-win_arm64.whl", hash = "sha256:dfd51b4c56b673dfbc43d7d27ef857dd91124801e2806c69bb45585ce0fa019b"}, + {file = "mmh3-5.2.1.tar.gz", hash = "sha256:bbea5b775f0ac84945191fb83f845a6fd9a21a03ea7f2e187defac7e401616ad"}, +] + +[package.extras] +benchmark = ["pymmh3 (==0.0.5)", "pyperf (==2.10.0)", "xxhash (==3.6.0)"] +docs = ["myst-parser (==5.0.0)", "shibuya (==2026.1.9)", "sphinx (==8.2.3)", "sphinx-copybutton (==0.5.2)"] +lint = ["actionlint-py (==1.7.11.24)", "clang-format (==22.1.0)", "codespell (==2.4.1)", "pylint (==4.0.5)", "ruff (==0.15.4)"] +plot = ["matplotlib (==3.10.8)", "pandas (==3.0.1)"] +test = ["pytest (==9.0.2)", "pytest-sugar (==1.1.1)"] +type = ["mypy (==1.19.1)"] + [[package]] name = "mock" version = "3.0.5" @@ -5667,6 +5798,21 @@ files = [ {file = "rpds_py-0.30.0.tar.gz", hash = "sha256:dd8ff7cf90014af0c0f787eea34794ebf6415242ee1d6fa91eaba725cc441e84"}, ] +[[package]] +name = "rstream" +version = "0.40.1" +description = "A python client for RabbitMQ Streams" +optional = false +python-versions = "<4.0,>=3.9" +files = [ + {file = "rstream-0.40.1-py3-none-any.whl", hash = "sha256:7e7d0ea9070b152ad0e4cfb2f55c471ea5c7812ab9f5c2f28d94c6283a4570cc"}, + {file = "rstream-0.40.1.tar.gz", hash = "sha256:33015d543b2598837933e0959265a98d8ce0a41ef8906a9c7b62d1a526d5f993"}, +] + +[package.dependencies] +mmh3 = ">=5.2.0,<6.0.0" +typing_extensions = ">=4.15.0,<5.0.0" + [[package]] name = "s3transfer" version = "0.14.0" @@ -7189,4 +7335,4 @@ cffi = ["cffi (>=1.17,<2.0)", "cffi (>=2.0.0b)"] [metadata] lock-version = "2.0" python-versions = ">=3.11.10,<3.12" -content-hash = "0c82a6bcba3c408669dbdd561114d18193a15552dcc9fdf59b318ee8564f2c4f" +content-hash = "38b9e03789859280e0ca584d3908ed82a74bd680c4e03a59bb507458719f3ecd" diff --git a/dbm-ui/pyproject.toml b/dbm-ui/pyproject.toml index 0f5783677c1..2c4a182ad5c 100644 --- a/dbm-ui/pyproject.toml +++ b/dbm-ui/pyproject.toml @@ -77,8 +77,8 @@ django-stubs-ext = "^5.2.7" bk-monitor-report = "^1.2.2" jsonref = "^1.1.0" networkx = "^3.6.1" -aidev-agent = "2.1.0rc85" -aidev-bkplugin = "2.1.0rc85" +aidev-agent = "2.2.2rc28" +aidev-bkplugin = "2.2.2rc28" langchain-mcp-adapters = "0.1.12" deprecated = "1.3.1" openai = "2.7.1"