mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-08-31 06:37:14 +00:00
Merge pull request #785 from RockChinQ/fix/msg-chain-compability
Fix: 修复 query.resp_messages 对插件reply的兼容性
This commit is contained in:
@@ -67,7 +67,7 @@ class Query(pydantic.BaseModel):
|
|||||||
use_funcs: typing.Optional[list[tools_entities.LLMFunction]] = None
|
use_funcs: typing.Optional[list[tools_entities.LLMFunction]] = None
|
||||||
"""使用的函数,由前置处理器阶段设置"""
|
"""使用的函数,由前置处理器阶段设置"""
|
||||||
|
|
||||||
resp_messages: typing.Optional[list[llm_entities.Message]] = []
|
resp_messages: typing.Optional[list[llm_entities.Message]] | typing.Optional[list[mirai.MessageChain]] = []
|
||||||
"""由Process阶段生成的回复消息对象列表"""
|
"""由Process阶段生成的回复消息对象列表"""
|
||||||
|
|
||||||
resp_message_chain: typing.Optional[list[mirai.MessageChain]] = None
|
resp_message_chain: typing.Optional[list[mirai.MessageChain]] = None
|
||||||
|
|||||||
@@ -163,13 +163,13 @@ class ContentFilterStage(stage.PipelineStage):
|
|||||||
)
|
)
|
||||||
elif stage_inst_name == 'PostContentFilterStage':
|
elif stage_inst_name == 'PostContentFilterStage':
|
||||||
# 仅处理 query.resp_messages[-1].content 是 str 的情况
|
# 仅处理 query.resp_messages[-1].content 是 str 的情况
|
||||||
if isinstance(query.resp_messages[-1].content, str):
|
if isinstance(query.resp_messages[-1], llm_entities.Message) and isinstance(query.resp_messages[-1].content, str):
|
||||||
return await self._post_process(
|
return await self._post_process(
|
||||||
query.resp_messages[-1].content,
|
query.resp_messages[-1].content,
|
||||||
query
|
query
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
self.ap.logger.debug(f"resp_messages[-1] 不是 str 类型,跳过内容过滤器检查。")
|
self.ap.logger.debug(f"resp_messages[-1] 不是 Message 类型或 query.resp_messages[-1].content 不是 str 类型,跳过内容过滤器检查。")
|
||||||
return entities.StageProcessResult(
|
return entities.StageProcessResult(
|
||||||
result_type=entities.ResultType.CONTINUE,
|
result_type=entities.ResultType.CONTINUE,
|
||||||
new_query=query
|
new_query=query
|
||||||
|
|||||||
@@ -42,12 +42,7 @@ class ChatMessageHandler(handler.MessageHandler):
|
|||||||
if event_ctx.event.reply is not None:
|
if event_ctx.event.reply is not None:
|
||||||
mc = mirai.MessageChain(event_ctx.event.reply)
|
mc = mirai.MessageChain(event_ctx.event.reply)
|
||||||
|
|
||||||
query.resp_messages.append(
|
query.resp_messages.append(mc)
|
||||||
llm_entities.Message(
|
|
||||||
role='plugin',
|
|
||||||
content=mc,
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
yield entities.StageProcessResult(
|
yield entities.StageProcessResult(
|
||||||
result_type=entities.ResultType.CONTINUE,
|
result_type=entities.ResultType.CONTINUE,
|
||||||
|
|||||||
@@ -48,12 +48,7 @@ class CommandHandler(handler.MessageHandler):
|
|||||||
if event_ctx.event.reply is not None:
|
if event_ctx.event.reply is not None:
|
||||||
mc = mirai.MessageChain(event_ctx.event.reply)
|
mc = mirai.MessageChain(event_ctx.event.reply)
|
||||||
|
|
||||||
query.resp_messages.append(
|
query.resp_messages.append(mc)
|
||||||
llm_entities.Message(
|
|
||||||
role='command',
|
|
||||||
content=str(mc),
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
yield entities.StageProcessResult(
|
yield entities.StageProcessResult(
|
||||||
result_type=entities.ResultType.CONTINUE,
|
result_type=entities.ResultType.CONTINUE,
|
||||||
|
|||||||
@@ -33,79 +33,48 @@ class ResponseWrapper(stage.PipelineStage):
|
|||||||
"""处理
|
"""处理
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if query.resp_messages[-1].role == 'command':
|
# 如果 resp_messages[-1] 已经是 MessageChain 了
|
||||||
# query.resp_message_chain.append(mirai.MessageChain("[bot] "+query.resp_messages[-1].content))
|
if isinstance(query.resp_messages[-1], mirai.MessageChain):
|
||||||
query.resp_message_chain.append(query.resp_messages[-1].get_content_mirai_message_chain(prefix_text='[bot] '))
|
query.resp_message_chain.append(query.resp_messages[-1])
|
||||||
|
|
||||||
yield entities.StageProcessResult(
|
yield entities.StageProcessResult(
|
||||||
result_type=entities.ResultType.CONTINUE,
|
result_type=entities.ResultType.CONTINUE,
|
||||||
new_query=query
|
new_query=query
|
||||||
)
|
)
|
||||||
elif query.resp_messages[-1].role == 'plugin':
|
|
||||||
# if not isinstance(query.resp_messages[-1].content, mirai.MessageChain):
|
|
||||||
# query.resp_message_chain.append(mirai.MessageChain(query.resp_messages[-1].content))
|
|
||||||
# else:
|
|
||||||
# query.resp_message_chain.append(query.resp_messages[-1].content)
|
|
||||||
query.resp_message_chain.append(query.resp_messages[-1].get_content_mirai_message_chain())
|
|
||||||
|
|
||||||
yield entities.StageProcessResult(
|
|
||||||
result_type=entities.ResultType.CONTINUE,
|
|
||||||
new_query=query
|
|
||||||
)
|
|
||||||
else:
|
else:
|
||||||
|
|
||||||
if query.resp_messages[-1].role == 'assistant':
|
if query.resp_messages[-1].role == 'command':
|
||||||
result = query.resp_messages[-1]
|
# query.resp_message_chain.append(mirai.MessageChain("[bot] "+query.resp_messages[-1].content))
|
||||||
session = await self.ap.sess_mgr.get_session(query)
|
query.resp_message_chain.append(query.resp_messages[-1].get_content_mirai_message_chain(prefix_text='[bot] '))
|
||||||
|
|
||||||
reply_text = ''
|
yield entities.StageProcessResult(
|
||||||
|
result_type=entities.ResultType.CONTINUE,
|
||||||
|
new_query=query
|
||||||
|
)
|
||||||
|
elif query.resp_messages[-1].role == 'plugin':
|
||||||
|
# if not isinstance(query.resp_messages[-1].content, mirai.MessageChain):
|
||||||
|
# query.resp_message_chain.append(mirai.MessageChain(query.resp_messages[-1].content))
|
||||||
|
# else:
|
||||||
|
# query.resp_message_chain.append(query.resp_messages[-1].content)
|
||||||
|
query.resp_message_chain.append(query.resp_messages[-1].get_content_mirai_message_chain())
|
||||||
|
|
||||||
if result.content is not None: # 有内容
|
yield entities.StageProcessResult(
|
||||||
reply_text = str(result.get_content_mirai_message_chain())
|
result_type=entities.ResultType.CONTINUE,
|
||||||
|
new_query=query
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
|
||||||
# ============= 触发插件事件 ===============
|
if query.resp_messages[-1].role == 'assistant':
|
||||||
event_ctx = await self.ap.plugin_mgr.emit_event(
|
result = query.resp_messages[-1]
|
||||||
event=events.NormalMessageResponded(
|
session = await self.ap.sess_mgr.get_session(query)
|
||||||
launcher_type=query.launcher_type.value,
|
|
||||||
launcher_id=query.launcher_id,
|
|
||||||
sender_id=query.sender_id,
|
|
||||||
session=session,
|
|
||||||
prefix='',
|
|
||||||
response_text=reply_text,
|
|
||||||
finish_reason='stop',
|
|
||||||
funcs_called=[fc.function.name for fc in result.tool_calls] if result.tool_calls is not None else [],
|
|
||||||
query=query
|
|
||||||
)
|
|
||||||
)
|
|
||||||
if event_ctx.is_prevented_default():
|
|
||||||
yield entities.StageProcessResult(
|
|
||||||
result_type=entities.ResultType.INTERRUPT,
|
|
||||||
new_query=query
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
if event_ctx.event.reply is not None:
|
|
||||||
|
|
||||||
query.resp_message_chain.append(mirai.MessageChain(event_ctx.event.reply))
|
reply_text = ''
|
||||||
|
|
||||||
else:
|
if result.content is not None: # 有内容
|
||||||
|
reply_text = str(result.get_content_mirai_message_chain())
|
||||||
query.resp_message_chain.append(result.get_content_mirai_message_chain())
|
|
||||||
|
|
||||||
yield entities.StageProcessResult(
|
|
||||||
result_type=entities.ResultType.CONTINUE,
|
|
||||||
new_query=query
|
|
||||||
)
|
|
||||||
|
|
||||||
if result.tool_calls is not None: # 有函数调用
|
|
||||||
|
|
||||||
function_names = [tc.function.name for tc in result.tool_calls]
|
|
||||||
|
|
||||||
reply_text = f'调用函数 {".".join(function_names)}...'
|
|
||||||
|
|
||||||
query.resp_message_chain.append(mirai.MessageChain([mirai.Plain(reply_text)]))
|
|
||||||
|
|
||||||
if self.ap.platform_cfg.data['track-function-calls']:
|
|
||||||
|
|
||||||
|
# ============= 触发插件事件 ===============
|
||||||
event_ctx = await self.ap.plugin_mgr.emit_event(
|
event_ctx = await self.ap.plugin_mgr.emit_event(
|
||||||
event=events.NormalMessageResponded(
|
event=events.NormalMessageResponded(
|
||||||
launcher_type=query.launcher_type.value,
|
launcher_type=query.launcher_type.value,
|
||||||
@@ -119,7 +88,6 @@ class ResponseWrapper(stage.PipelineStage):
|
|||||||
query=query
|
query=query
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
if event_ctx.is_prevented_default():
|
if event_ctx.is_prevented_default():
|
||||||
yield entities.StageProcessResult(
|
yield entities.StageProcessResult(
|
||||||
result_type=entities.ResultType.INTERRUPT,
|
result_type=entities.ResultType.INTERRUPT,
|
||||||
@@ -132,9 +100,52 @@ class ResponseWrapper(stage.PipelineStage):
|
|||||||
|
|
||||||
else:
|
else:
|
||||||
|
|
||||||
query.resp_message_chain.append(mirai.MessageChain([mirai.Plain(reply_text)]))
|
query.resp_message_chain.append(result.get_content_mirai_message_chain())
|
||||||
|
|
||||||
yield entities.StageProcessResult(
|
yield entities.StageProcessResult(
|
||||||
result_type=entities.ResultType.CONTINUE,
|
result_type=entities.ResultType.CONTINUE,
|
||||||
new_query=query
|
new_query=query
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if result.tool_calls is not None: # 有函数调用
|
||||||
|
|
||||||
|
function_names = [tc.function.name for tc in result.tool_calls]
|
||||||
|
|
||||||
|
reply_text = f'调用函数 {".".join(function_names)}...'
|
||||||
|
|
||||||
|
query.resp_message_chain.append(mirai.MessageChain([mirai.Plain(reply_text)]))
|
||||||
|
|
||||||
|
if self.ap.platform_cfg.data['track-function-calls']:
|
||||||
|
|
||||||
|
event_ctx = await self.ap.plugin_mgr.emit_event(
|
||||||
|
event=events.NormalMessageResponded(
|
||||||
|
launcher_type=query.launcher_type.value,
|
||||||
|
launcher_id=query.launcher_id,
|
||||||
|
sender_id=query.sender_id,
|
||||||
|
session=session,
|
||||||
|
prefix='',
|
||||||
|
response_text=reply_text,
|
||||||
|
finish_reason='stop',
|
||||||
|
funcs_called=[fc.function.name for fc in result.tool_calls] if result.tool_calls is not None else [],
|
||||||
|
query=query
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
if event_ctx.is_prevented_default():
|
||||||
|
yield entities.StageProcessResult(
|
||||||
|
result_type=entities.ResultType.INTERRUPT,
|
||||||
|
new_query=query
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
if event_ctx.event.reply is not None:
|
||||||
|
|
||||||
|
query.resp_message_chain.append(mirai.MessageChain(event_ctx.event.reply))
|
||||||
|
|
||||||
|
else:
|
||||||
|
|
||||||
|
query.resp_message_chain.append(mirai.MessageChain([mirai.Plain(reply_text)]))
|
||||||
|
|
||||||
|
yield entities.StageProcessResult(
|
||||||
|
result_type=entities.ResultType.CONTINUE,
|
||||||
|
new_query=query
|
||||||
|
)
|
||||||
|
|||||||
@@ -96,7 +96,16 @@ class Message(pydantic.BaseModel):
|
|||||||
if ce.type == 'text':
|
if ce.type == 'text':
|
||||||
mc.append(mirai.Plain(ce.text))
|
mc.append(mirai.Plain(ce.text))
|
||||||
elif ce.type == 'image':
|
elif ce.type == 'image':
|
||||||
mc.append(mirai.Image(url=ce.image_url))
|
if ce.image_url.url.startswith("http"):
|
||||||
|
mc.append(mirai.Image(url=ce.image_url.url))
|
||||||
|
else: # base64
|
||||||
|
|
||||||
|
b64_str = ce.image_url.url
|
||||||
|
|
||||||
|
if b64_str.startswith("data:"):
|
||||||
|
b64_str = b64_str.split(",")[1]
|
||||||
|
|
||||||
|
mc.append(mirai.Image(base64=b64_str))
|
||||||
|
|
||||||
# 找第一个文字组件
|
# 找第一个文字组件
|
||||||
if prefix_text:
|
if prefix_text:
|
||||||
|
|||||||
Reference in New Issue
Block a user