- MoviePilot助手增加了多个智能体工具,大幅提升智能体能力
- 智能体对话支持上下文记忆,发送 `/clear_session` 指令或超过15分钟没动作将清除记忆
This commit is contained in:
jxxghp
2025-11-18 12:52:58 +08:00
parent ed73cfdcc7
commit 65ceff9824
3 changed files with 16 additions and 22 deletions

View File

@@ -50,11 +50,6 @@ class GetRecommendationsTool(MoviePilotTool):
media_type: Optional[str] = "all", limit: Optional[int] = 20, **kwargs) -> str: media_type: Optional[str] = "all", limit: Optional[int] = 20, **kwargs) -> str:
logger.info(f"执行工具: {self.name}, 参数: source={source}, media_type={media_type}, limit={limit}") logger.info(f"执行工具: {self.name}, 参数: source={source}, media_type={media_type}, limit={limit}")
try: try:
name_dicts = {
"tmdb_trending": "TMDB 热门推荐",
"douban_hot": "豆瓣热门推荐",
"bangumi_calendar": "番组计划推荐"
}
recommend_chain = RecommendChain() recommend_chain = RecommendChain()
results = [] results = []
if source == "tmdb_trending": if source == "tmdb_trending":

View File

@@ -5,7 +5,6 @@ from typing import Optional, Type
import jieba import jieba
from pydantic import BaseModel, Field from pydantic import BaseModel, Field
from sqlalchemy.ext.asyncio import AsyncSession
from app.agent.tools.base import MoviePilotTool from app.agent.tools.base import MoviePilotTool
from app.db import AsyncSessionFactory from app.db import AsyncSessionFactory
@@ -17,7 +16,8 @@ class QueryTransferHistoryInput(BaseModel):
"""查询整理历史记录工具的输入参数模型""" """查询整理历史记录工具的输入参数模型"""
explanation: str = Field(..., description="Clear explanation of why this tool is being used in the current context") explanation: str = Field(..., description="Clear explanation of why this tool is being used in the current context")
title: Optional[str] = Field(None, description="Search by title (optional, supports partial match)") title: Optional[str] = Field(None, description="Search by title (optional, supports partial match)")
status: Optional[str] = Field("all", description="Filter by status: 'success' for successful transfers, 'failed' for failed transfers, 'all' for all records (default: 'all')") status: Optional[str] = Field("all",
description="Filter by status: 'success' for successful transfers, 'failed' for failed transfers, 'all' for all records (default: 'all')")
page: Optional[int] = Field(1, description="Page number for pagination (default: 1, each page contains 30 records)") page: Optional[int] = Field(1, description="Page number for pagination (default: 1, each page contains 30 records)")
@@ -31,9 +31,9 @@ class QueryTransferHistoryTool(MoviePilotTool):
title = kwargs.get("title") title = kwargs.get("title")
status = kwargs.get("status", "all") status = kwargs.get("status", "all")
page = kwargs.get("page", 1) page = kwargs.get("page", 1)
parts = ["正在查询整理历史"] parts = ["正在查询整理历史"]
if title: if title:
parts.append(f"标题: {title}") parts.append(f"标题: {title}")
if status != "all": if status != "all":
@@ -41,7 +41,7 @@ class QueryTransferHistoryTool(MoviePilotTool):
parts.append(f"状态: {status_map.get(status, status)}") parts.append(f"状态: {status_map.get(status, status)}")
if page > 1: if page > 1:
parts.append(f"{page}") parts.append(f"{page}")
return " | ".join(parts) if len(parts) > 1 else parts[0] return " | ".join(parts) if len(parts) > 1 else parts[0]
async def run(self, title: Optional[str] = None, async def run(self, title: Optional[str] = None,
@@ -56,14 +56,14 @@ class QueryTransferHistoryTool(MoviePilotTool):
status_bool = True status_bool = True
elif status == "failed": elif status == "failed":
status_bool = False status_bool = False
# 处理页码参数 # 处理页码参数
if page is None or page < 1: if page is None or page < 1:
page = 1 page = 1
# 每页记录数 # 每页记录数
count = 30 count = 30
# 获取数据库会话 # 获取数据库会话
async with AsyncSessionFactory() as db: async with AsyncSessionFactory() as db:
# 处理标题搜索 # 处理标题搜索
@@ -84,10 +84,10 @@ class QueryTransferHistoryTool(MoviePilotTool):
db, page=page, count=count, status=status_bool db, page=page, count=count, status=status_bool
) )
total = await TransferHistory.async_count(db, status=status_bool) total = await TransferHistory.async_count(db, status=status_bool)
if not result: if not result:
return "未找到相关整理历史记录" return "未找到相关整理历史记录"
# 转换为字典格式,只保留关键信息 # 转换为字典格式,只保留关键信息
simplified_records = [] simplified_records = []
for record in result: for record in result:
@@ -118,17 +118,16 @@ class QueryTransferHistoryTool(MoviePilotTool):
if record.doubanid: if record.doubanid:
simplified["doubanid"] = record.doubanid simplified["doubanid"] = record.doubanid
simplified_records.append(simplified) simplified_records.append(simplified)
result_json = json.dumps(simplified_records, ensure_ascii=False, indent=2) result_json = json.dumps(simplified_records, ensure_ascii=False, indent=2)
# 计算总页数 # 计算总页数
total_pages = (total + count - 1) // count if total > 0 else 1 total_pages = (total + count - 1) // count if total > 0 else 1
# 构建分页信息 # 构建分页信息
pagination_info = f"{page}/{total_pages} 页,共 {total} 条记录(每页 {count} 条)" pagination_info = f"{page}/{total_pages} 页,共 {total} 条记录(每页 {count} 条)"
return f"{pagination_info}\n\n{result_json}" return f"{pagination_info}\n\n{result_json}"
except Exception as e: except Exception as e:
logger.error(f"查询整理历史记录失败: {e}", exc_info=True) logger.error(f"查询整理历史记录失败: {e}", exc_info=True)
return f"查询整理历史记录时发生错误: {str(e)}" return f"查询整理历史记录时发生错误: {str(e)}"

View File

@@ -1,2 +1,2 @@
APP_VERSION = 'v2.8.2' APP_VERSION = 'v2.8.3'
FRONTEND_VERSION = 'v2.8.2' FRONTEND_VERSION = 'v2.8.3'