llama.cpp b11401修复路由器子进程日志颜色与控制命令混杂问题
该版本将路由器子进程的状态命令与其日志从同一条管道拆开:子进程stdout专用于命令,其余输出重定向到stderr;同时让日志行自带颜色重置、在Windows控制台启用ANSI颜色。
AI解读:原先路由器子进程的状态命令和日志共用一条管道,路由器需靠行前缀从日志流中辨认命令;命令前若有未终止的写入,路由器就会漏掉该命令。
改动后子进程保留stdout用于命令,其余原本写到stdout的内容改写到stderr;路由器分别读取两条管道,从stdout处理命令、把stderr作为日志转发,并对命令管道上出现的其他行发出警告。
日志颜色方面,颜色重置原本写在行尾换行符之后,会跑到下一行行首;在路由器子进程的共享管道上,它会落在下一条状态命令前面导致命令被漏读,为规避而加的空行则表现为每次进度更新都出现空日志行。现在重置移到换行符之前,每行自成一体。
路由器会把自身生效的颜色设置传给子进程(子进程输出进入路由器的终端),在重载时比较预设则排除该选项。
Windows支持方面,Windows控制台仅在虚拟终端模式下渲染ANSI序列,此前没有为logger打开该模式,导致llama-server在Windows 10控制台打印原始转义码,而启用控制台代码的llama-cli能显示颜色;现在logger在开启颜色时对stdout和stderr启用虚拟终端模式,控制台无法渲染时保持关闭,管道和文件按原样接收序列。
llama.cpp发布b11401,改动集中在日志与server的路由器模式,来自PR #29895(作者含Xuan-Son Nguyen)。
据发布说明,该PR解决三件事:路由器子进程颜色重置位置错误、Windows控制台缺少ANSI颜色、子进程状态命令与日志共用管道。
命令与日志分开走两条管道
发布说明称,子进程原先在同一条管道上发送状态命令和日志,路由器必须靠行前缀从日志流中挑出命令;命令前若存在未终止的写入,路由器就会漏掉该命令。
按提交信息,本次改动落实了spawn处要求拆分stdout与stderr的TODO:在任何写入发生前,子进程保留stdout用于命令,并把它写到stdout的其余内容指向stderr;路由器读取两条管道,从stdout处理命令、把stderr作为日志转发,并对命令管道上出现的任何其他行给出警告。
日志颜色与Windows控制台
发布说明解释,日志器原本把颜色重置写在行尾换行之后,于是重置会开启下一行;在路由器子进程的共享管道上,它会落在下一条状态命令前面,路由器因此漏读该命令,而为绕过问题加入的换行表现为每次进度更新都多出一行空日志。现在重置移到行尾换行之前,每行自成一体,命令恢复为普通框架。
路由器把自身生效的颜色设置传给子进程(其输出最终进入路由器的终端),并在重载时比较预设时排除该选项。
关于Windows:Windows控制台只有在虚拟终端模式下才渲染ANSI序列,此前没有为logger开启该模式,因此llama-server在Windows 10控制台打印原始转义码,而自带控制台代码的llama-cli能显示颜色。现在logger在启用颜色时对stdout和stderr打开虚拟终端模式,控制台无法渲染时则关闭颜色;管道和文件按原样接收这些序列。
代码结构上的调整
发布说明提到一处评审意见(来自ngxson)引发的改动:单一server_child现在在入口点最先创建,其构造函数保留stdout用于命令,使该流成为实例成员而非静态变量,init() 被移除;该实例被传递给server,而CLI入口点创建自己的实例。