77 lines
2.5 KiB
Python
77 lines
2.5 KiB
Python
"""
|
||
MaiSaka - Reply 回复生成器
|
||
根据想法和上下文生成口语化回复。
|
||
"""
|
||
|
||
from typing import Optional
|
||
from .llm_service import MaiSakaLLMService
|
||
|
||
|
||
def format_chat_history(messages: list) -> str:
|
||
"""将聊天消息列表格式化为可读文本。"""
|
||
parts: list[str] = []
|
||
for msg in messages:
|
||
role = msg.get("role", "?")
|
||
content = msg.get("content", "") or ""
|
||
if role == "system":
|
||
parts.append(f"[系统] {content[:500]}")
|
||
elif role == "user":
|
||
parts.append(f"[用户] {content[:500]}")
|
||
elif role == "assistant":
|
||
if content:
|
||
parts.append(f"[助手思考] {content[:500]}")
|
||
for tc in msg.get("tool_calls", []):
|
||
func = tc.get("function", {})
|
||
name = func.get("name", "?")
|
||
args = func.get("arguments", "")
|
||
if isinstance(args, str) and len(args) > 200:
|
||
args = args[:200] + "..."
|
||
parts.append(f"[助手调用 {name}] {args}")
|
||
elif role == "tool":
|
||
parts.append(f"[工具结果] {content[:300]}")
|
||
return "\n".join(parts)
|
||
|
||
|
||
class Replyer:
|
||
"""
|
||
回复生成器。
|
||
|
||
根据给定的想法(reason)和对话上下文,生成符合人设的口语化回复。
|
||
"""
|
||
|
||
def __init__(self, llm_service: Optional[MaiSakaLLMService] = None):
|
||
"""
|
||
初始化回复器。
|
||
|
||
Args:
|
||
llm_service: LLM 服务实例,如果为 None 则需要在调用前设置
|
||
"""
|
||
self._llm_service = llm_service
|
||
self._enabled = True
|
||
|
||
def set_llm_service(self, llm_service: MaiSakaLLMService) -> None:
|
||
"""设置 LLM 服务"""
|
||
self._llm_service = llm_service
|
||
|
||
def set_enabled(self, enabled: bool) -> None:
|
||
"""启用/禁用回复功能"""
|
||
self._enabled = enabled
|
||
|
||
async def reply(self, reason: str, chat_history: list) -> str:
|
||
"""
|
||
根据想法和上下文生成回复。
|
||
|
||
Args:
|
||
reason: 想要回复的方式、想法、内容(不包含具体回复内容)
|
||
chat_history: 对话历史上下文
|
||
|
||
Returns:
|
||
生成的回复内容,失败时返回默认回复
|
||
"""
|
||
if not self._enabled or not reason or self._llm_service is None:
|
||
return "..."
|
||
|
||
# 直接使用 LLM 服务的 generate_reply 方法
|
||
# 该方法使用主项目的 replyer 模型配置
|
||
return await self._llm_service.generate_reply(reason, chat_history)
|