chore: 规范标点

This commit is contained in:
pluv committed 2026-10-03 14:43:43 +08:00
1 parent e54390a9f8
commit 15e79887fa
84 files changed
+5439 -5398

No files matched your search

+14 -14
View File
@@ -1,8 +1,8 @@
#!/usr/bin/env python3
"""repl_drive.py - 用 pty 驱动 ligent 的 REPL,跑多轮对话并打印全部输出。
"""repl_drive.py - 用 pty 驱动 ligent 的 REPL, 跑多轮对话并打印全部输出.
交互式行为(多轮上下文、/命令、行编辑)没法用管道测 —— 管道模式会把
整段 stdin 当成一个任务。所以这里开一个伪终端,逐条发送提示词。
交互式行为 (多轮上下文、/命令、行编辑)没法用管道测 —— 管道模式会把
整段 stdin 当成一个任务. 所以这里开一个伪终端, 逐条发送提示词.
用法:
repl_drive.py --bin ./ligent --base-url URL --prompt "第一轮" --prompt "第二轮"
@@ -24,25 +24,25 @@ def drive(binary, args, prompts, wait_per_prompt=2.0, quiet_after=1.5,
os._exit(127)
out = bytearray()
# 行编辑器每次回到提示符都会打开括号粘贴,所以这个序列就是"轮到用户输入了"
# 的信号。用它做同步点,比"等输出安静下来"可靠也快得多。
# 行编辑器每次回到提示符都会打开括号粘贴, 所以这个序列就是"轮到用户输入了"
# 的信号. 用它做同步点, 比"等输出安静下来"可靠也快得多.
PROMPT_READY = b"\x1b[?2004h"
ready_seen = 0
tail = b""
def note(chunk):
# 标记可能被 read 切断,所以要连着上一块的尾巴一起找
# 标记可能被 read 切断, 所以要连着上一块的尾巴一起找
nonlocal tail, ready_seen
buf = tail + chunk
ready_seen += buf.count(PROMPT_READY)
tail = buf[-(len(PROMPT_READY) - 1):]
def drain(timeout, idle=0.5, until_ready=False):
"""等到"回到提示符"(until_ready),或者输出彻底安静下来。
"""等到"回到提示符" (until_ready), 或者输出彻底安静下来.
必须按标记等,不能只按安静等:等待动画每 250ms 画一帧,pty 永远
不会安静超过 idle,于是每次都要白等满 timeout —— 而 mock 其实几
毫秒就答复了。这是整个 e2e 从 126 秒掉下来的关键。
必须按标记等, 不能只按安静等:等待动画每 250ms 画一帧, pty 永远
不会安静超过 idle, 于是每次都要白等满 timeout —— 而 mock 其实几
毫秒就答复了. 这是整个 e2e 从 126 秒掉下来的关键.
"""
want = ready_seen + 1 if until_ready else None
deadline = time.time() + timeout
@@ -67,7 +67,7 @@ def drive(binary, args, prompts, wait_per_prompt=2.0, quiet_after=1.5,
drain(quiet_after, until_ready=True) # 等横幅画完、第一次回到提示符
if raw_keys is not None:
# 逐字节发送原始按键序列(用于测方向键等编辑行为)
# 逐字节发送原始按键序列 (用于测方向键等编辑行为)
for chunk, pause in raw_keys:
os.write(fd, chunk if isinstance(chunk, bytes) else chunk.encode("utf-8"))
drain(pause)
@@ -112,11 +112,11 @@ def main():
ap.add_argument("--extra", action="append", default=[])
ap.add_argument("--wait", type=float, default=2.0)
ap.add_argument("--keys", action="append", default=[],
help="原始按键序列(支持 \\x1b 转义),按顺序发送")
help="原始按键序列 (支持 \\x1b 转义), 按顺序发送")
a = ap.parse_args()
# --no-history:被驱动的实例不该往用户真实的 ligent.history 里写测试垃圾。
# 需要历史的调用方用 --extra=--history PATH(排在后面,会覆盖这一条)。
# --no-history:被驱动的实例不该往用户真实的 ligent.history 里写测试垃圾.
# 需要历史的调用方用 --extra=--history PATH (排在后面, 会覆盖这一条).
args = ["--api-key", a.api_key, "--base-url", a.base_url, "--no-color",
"--no-confirm", "--no-auto-save", "--no-history"] + a.extra
if a.keys: