mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-09-09 01:16:50 +08:00
v2.8.6
- 增加全局智能助手设置,开启后所有消息通过智能助手回答而无需使用 `/ai` 指令 - 问题修复与细节优化
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
"""查询媒体库工具"""
|
"""查询媒体库工具"""
|
||||||
|
|
||||||
import json
|
import json
|
||||||
from typing import Optional, List, Type
|
from typing import Optional, Type
|
||||||
|
|
||||||
from pydantic import BaseModel, Field
|
from pydantic import BaseModel, Field
|
||||||
|
|
||||||
@@ -9,7 +9,6 @@ from app.agent.tools.base import MoviePilotTool
|
|||||||
from app.chain.mediaserver import MediaServerChain
|
from app.chain.mediaserver import MediaServerChain
|
||||||
from app.core.context import MediaInfo
|
from app.core.context import MediaInfo
|
||||||
from app.log import logger
|
from app.log import logger
|
||||||
from app.schemas import MediaServerItem
|
|
||||||
from app.schemas.types import MediaType
|
from app.schemas.types import MediaType
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -35,8 +35,6 @@ class SearchPersonCreditsTool(MoviePilotTool):
|
|||||||
logger.info(f"执行工具: {self.name}, 参数: person_id={person_id}, source={source}, page={page}")
|
logger.info(f"执行工具: {self.name}, 参数: person_id={person_id}, source={source}, page={page}")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
medias = None
|
|
||||||
|
|
||||||
# 根据source选择相应的chain
|
# 根据source选择相应的chain
|
||||||
if source.lower() == "tmdb":
|
if source.lower() == "tmdb":
|
||||||
tmdb_chain = TmdbChain()
|
tmdb_chain = TmdbChain()
|
||||||
|
|||||||
@@ -64,7 +64,8 @@ class SearchWebTool(MoviePilotTool):
|
|||||||
logger.error(f"搜索网络内容失败: {e}", exc_info=True)
|
logger.error(f"搜索网络内容失败: {e}", exc_info=True)
|
||||||
return error_message
|
return error_message
|
||||||
|
|
||||||
async def _search_duckduckgo_api(self, query: str, max_results: int) -> list:
|
@staticmethod
|
||||||
|
async def _search_duckduckgo_api(query: str, max_results: int) -> list:
|
||||||
"""
|
"""
|
||||||
使用DuckDuckGo API进行搜索
|
使用DuckDuckGo API进行搜索
|
||||||
|
|
||||||
@@ -143,7 +144,8 @@ class SearchWebTool(MoviePilotTool):
|
|||||||
logger.warning(f"DuckDuckGo API搜索失败: {e}")
|
logger.warning(f"DuckDuckGo API搜索失败: {e}")
|
||||||
return []
|
return []
|
||||||
|
|
||||||
def _format_and_truncate_results(self, results: list, max_results: int) -> dict:
|
@staticmethod
|
||||||
|
def _format_and_truncate_results(results: list, max_results: int) -> dict:
|
||||||
"""
|
"""
|
||||||
格式化并裁剪搜索结果以避免占用过多上下文
|
格式化并裁剪搜索结果以避免占用过多上下文
|
||||||
|
|
||||||
|
|||||||
+14
-8
@@ -164,19 +164,15 @@ class MessageChain(ChainBase):
|
|||||||
)
|
)
|
||||||
# 处理消息
|
# 处理消息
|
||||||
if text.startswith('CALLBACK:'):
|
if text.startswith('CALLBACK:'):
|
||||||
# 处理按钮回调(适配支持回调的渠道)
|
# 处理按钮回调(适配支持回调的渠),优先级最高
|
||||||
if ChannelCapabilityManager.supports_callbacks(channel):
|
if ChannelCapabilityManager.supports_callbacks(channel):
|
||||||
self._handle_callback(text=text, channel=channel, source=source,
|
self._handle_callback(text=text, channel=channel, source=source,
|
||||||
userid=userid, username=username,
|
userid=userid, username=username,
|
||||||
original_message_id=original_message_id, original_chat_id=original_chat_id)
|
original_message_id=original_message_id, original_chat_id=original_chat_id)
|
||||||
else:
|
else:
|
||||||
logger.warning(f"渠道 {channel.value} 不支持回调,但收到了回调消息:{text}")
|
logger.warning(f"渠道 {channel.value} 不支持回调,但收到了回调消息:{text}")
|
||||||
elif text.startswith('/ai') or text.startswith('/AI'):
|
elif text.startswith('/') and not text.lower().startswith('/ai'):
|
||||||
# AI智能体处理
|
# 执行特定命令命令(但不是/ai)
|
||||||
self._handle_ai_message(text=text, channel=channel, source=source,
|
|
||||||
userid=userid, username=username)
|
|
||||||
elif text.startswith('/'):
|
|
||||||
# 执行命令
|
|
||||||
self.eventmanager.send_event(
|
self.eventmanager.send_event(
|
||||||
EventType.CommandExcute,
|
EventType.CommandExcute,
|
||||||
{
|
{
|
||||||
@@ -186,7 +182,17 @@ class MessageChain(ChainBase):
|
|||||||
"source": source
|
"source": source
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
elif text.isdigit():
|
elif text.lower().startswith('/ai'):
|
||||||
|
# 用户指定AI智能体消息响应
|
||||||
|
self._handle_ai_message(text=text, channel=channel, source=source,
|
||||||
|
userid=userid, username=username)
|
||||||
|
elif settings.AI_AGENT_ENABLE and settings.AI_AGENT_GLOBAL:
|
||||||
|
# 普通消息,全局智能体响应
|
||||||
|
self._handle_ai_message(text=text, channel=channel, source=source,
|
||||||
|
userid=userid, username=username)
|
||||||
|
else:
|
||||||
|
# 非智能体普通消息响应
|
||||||
|
if text.isdigit():
|
||||||
# 用户选择了具体的条目
|
# 用户选择了具体的条目
|
||||||
# 缓存
|
# 缓存
|
||||||
cache_data: dict = user_cache.get(userid).copy()
|
cache_data: dict = user_cache.get(userid).copy()
|
||||||
|
|||||||
@@ -411,6 +411,8 @@ class ConfigModel(BaseModel):
|
|||||||
# ==================== AI智能体配置 ====================
|
# ==================== AI智能体配置 ====================
|
||||||
# AI智能体开关
|
# AI智能体开关
|
||||||
AI_AGENT_ENABLE: bool = False
|
AI_AGENT_ENABLE: bool = False
|
||||||
|
# 合局AI智能体
|
||||||
|
AI_AGENT_GLOBAL: bool = False
|
||||||
# LLM提供商 (openai/google/deepseek)
|
# LLM提供商 (openai/google/deepseek)
|
||||||
LLM_PROVIDER: str = "deepseek"
|
LLM_PROVIDER: str = "deepseek"
|
||||||
# LLM模型名称
|
# LLM模型名称
|
||||||
|
|||||||
+2
-2
@@ -1,2 +1,2 @@
|
|||||||
APP_VERSION = 'v2.8.5'
|
APP_VERSION = 'v2.8.6'
|
||||||
FRONTEND_VERSION = 'v2.8.5'
|
FRONTEND_VERSION = 'v2.8.6'
|
||||||
|
|||||||
Reference in New Issue
Block a user