mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-09-07 00:16:57 +08:00
Fix think tag streaming in agent output
This commit is contained in:
@@ -192,10 +192,11 @@ class _ThinkTagStripper:
|
|||||||
self.buffer = self.buffer[-i:]
|
self.buffer = self.buffer[-i:]
|
||||||
partial_match = True
|
partial_match = True
|
||||||
break
|
break
|
||||||
if not partial_match:
|
if partial_match:
|
||||||
on_output(self.buffer)
|
break
|
||||||
emitted = True
|
on_output(self.buffer)
|
||||||
self.buffer = ""
|
emitted = True
|
||||||
|
self.buffer = ""
|
||||||
else:
|
else:
|
||||||
end_idx = self.buffer.find("</think>")
|
end_idx = self.buffer.find("</think>")
|
||||||
if end_idx != -1:
|
if end_idx != -1:
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import langchain.agents as langchain_agents
|
|||||||
if not hasattr(langchain_agents, "create_agent"):
|
if not hasattr(langchain_agents, "create_agent"):
|
||||||
langchain_agents.create_agent = lambda *args, **kwargs: None
|
langchain_agents.create_agent = lambda *args, **kwargs: None
|
||||||
|
|
||||||
|
from app.agent import _ThinkTagStripper
|
||||||
from app.agent.callback import StreamingHandler
|
from app.agent.callback import StreamingHandler
|
||||||
from app.agent.middleware.subagents import is_subagent_stream_metadata
|
from app.agent.middleware.subagents import is_subagent_stream_metadata
|
||||||
from app.agent.tools.base import MoviePilotTool
|
from app.agent.tools.base import MoviePilotTool
|
||||||
@@ -17,6 +18,31 @@ from app.schemas.message import MessageResponse
|
|||||||
from app.schemas.types import MessageChannel, NotificationType
|
from app.schemas.types import MessageChannel, NotificationType
|
||||||
|
|
||||||
|
|
||||||
|
def test_think_tag_stripper_waits_for_partial_open_tag():
|
||||||
|
"""普通文本后出现不完整 think 开始标签时不应进入死循环。"""
|
||||||
|
stripper = _ThinkTagStripper()
|
||||||
|
outputs = []
|
||||||
|
|
||||||
|
emitted = stripper.process("你好<", outputs.append)
|
||||||
|
emitted_next = stripper.process("世界", outputs.append)
|
||||||
|
|
||||||
|
assert emitted is True
|
||||||
|
assert emitted_next is True
|
||||||
|
assert outputs == ["你好", "<世界"]
|
||||||
|
|
||||||
|
|
||||||
|
def test_think_tag_stripper_hides_split_think_tag_content():
|
||||||
|
"""think 标签被拆分到多个 token 时应继续隐藏思考内容。"""
|
||||||
|
stripper = _ThinkTagStripper()
|
||||||
|
outputs = []
|
||||||
|
|
||||||
|
stripper.process("回答前<", outputs.append)
|
||||||
|
stripper.process("thi", outputs.append)
|
||||||
|
stripper.process("nk>隐藏内容</think>回答后", outputs.append)
|
||||||
|
|
||||||
|
assert outputs == ["回答前", "回答后"]
|
||||||
|
|
||||||
|
|
||||||
class DummyTool(MoviePilotTool):
|
class DummyTool(MoviePilotTool):
|
||||||
"""用于流式输出测试的固定结果工具。"""
|
"""用于流式输出测试的固定结果工具。"""
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user