120 lines
3.9 KiB
Python
120 lines
3.9 KiB
Python
"""实际宿主封装配合显式传输替身;不作为真实模型调用证据。"""
|
|
|
|
import asyncio
|
|
|
|
import pytest
|
|
|
|
from muse.任务运行.接口 import 模型协议错误, 模型请求
|
|
from muse.基础设施.宿主.直接调用 import 直接宿主
|
|
|
|
|
|
class 合成传输:
|
|
协议 = "anthropic"
|
|
|
|
def __init__(self):
|
|
self.收到 = []
|
|
|
|
def 准备(self, 请求, 总期限秒):
|
|
self.请求, self.期限 = 请求, 总期限秒
|
|
return self
|
|
|
|
async def 流(self):
|
|
请求, 总期限秒 = self.请求, self.期限
|
|
self.收到.append((请求, 总期限秒))
|
|
yield {
|
|
"type": "message_start",
|
|
"message": {"id": "m1", "model": "claude-opus-4-8", "usage": {"input_tokens": 1}},
|
|
}
|
|
yield {
|
|
"type": "content_block_start",
|
|
"index": 0,
|
|
"content_block": {"type": "text", "text": "{}"},
|
|
}
|
|
yield {
|
|
"type": "message_delta",
|
|
"delta": {"stop_reason": "end_turn"},
|
|
"usage": {"output_tokens": 1},
|
|
}
|
|
yield {"type": "message_stop"}
|
|
|
|
|
|
def test_直接宿主传递显式模型期限与推理等级__a64001() -> None:
|
|
传输 = 合成传输()
|
|
请求 = 模型请求(
|
|
"call-1",
|
|
"configured",
|
|
"claude-opus-4-8[1M]",
|
|
"系统说明",
|
|
"合成输入",
|
|
{"type": "object"},
|
|
1024,
|
|
30,
|
|
thinking="high",
|
|
)
|
|
结果 = asyncio.run(直接宿主(传输).调用(请求))
|
|
已发, 秒 = 传输.收到[0]
|
|
assert 已发["model"] == 请求.model and 秒 == 30
|
|
assert 已发["thinking"] == {"type": "adaptive"}
|
|
assert 已发["output_config"] == {"effort": "high"}
|
|
assert 结果.状态 == "completed" and 结果.实际模型 == "claude-opus-4-8"
|
|
|
|
|
|
def test_无工具直接宿主拒绝请求工具而不静默降级__a64002() -> None:
|
|
传输 = 合成传输()
|
|
请求 = 模型请求(
|
|
"call-1",
|
|
"configured",
|
|
"claude-opus-4-8[1M]",
|
|
"系统说明",
|
|
"合成输入",
|
|
{"type": "object"},
|
|
1024,
|
|
30,
|
|
工具=({"name": "read"},),
|
|
)
|
|
with pytest.raises(模型协议错误):
|
|
asyncio.run(直接宿主(传输).调用(请求))
|
|
assert not 传输.收到
|
|
|
|
|
|
def test_Pi真实事件保留工具身份并以已结算回合收尾__a64003():
|
|
import json
|
|
from pathlib import Path
|
|
|
|
from muse.任务运行.接口 import 模型用量, 模型结果
|
|
from muse.基础设施.宿主.Pi事件归一 import 归一事件, 检查会话结束
|
|
|
|
事件 = json.loads((Path(__file__).parents[1] / "夹具/Pi合成事件.json").read_text())
|
|
工具 = [v for e in 事件 for v in 归一事件(e) if v["type"] == "tool.completed"]
|
|
assert 工具 == [
|
|
{"type": "tool.completed", "call_id": "probe-call", "tool": "schema_read", "failed": False}
|
|
]
|
|
回合 = 模型结果(
|
|
"completed", '{"text":"合成工具已返回"}', "verified-upstream-model", 模型用量(1, 1)
|
|
)
|
|
assert 检查会话结束(事件, 0, 回合) is 回合
|
|
with pytest.raises(模型协议错误, match="结束"):
|
|
检查会话结束(事件[:-1], 0, 回合)
|
|
|
|
|
|
def test_Pi自动续跑或改写结果不能冒充完成__a64004():
|
|
from muse.任务运行.接口 import 模型结果
|
|
from muse.基础设施.宿主.Pi事件归一 import 检查会话结束
|
|
|
|
回合 = 模型结果("completed", "原始结果", "verified-upstream-model", None)
|
|
with pytest.raises(模型协议错误, match="未登记"):
|
|
检查会话结束([{"type": "auto_retry_start"}], 0, 回合)
|
|
事件 = [
|
|
{
|
|
"type": "message_end",
|
|
"message": {
|
|
"role": "assistant",
|
|
"stopReason": "stop",
|
|
"content": [{"type": "text", "text": "另一个结果"}],
|
|
},
|
|
},
|
|
{"type": "agent_settled"},
|
|
]
|
|
with pytest.raises(模型协议错误, match="回合"):
|
|
检查会话结束(事件, 0, 回合)
|