38 lines
1.5 KiB
C
38 lines
1.5 KiB
C
/* spinner.h - 等待指示器
|
|
*
|
|
* 存在的意义: 模型不输出思考过程是好事, 但等待期间屏幕上什么都没有,
|
|
* 和"卡死了"看起来一模一样. 一个灰色的动画能把这个歧义消掉.
|
|
*
|
|
* 分两段显示, 因为这两种等待的性质不一样:
|
|
* 刚发出请求、还没收到任何东西 → "等待响应" (卡在网络或排队)
|
|
* 开始收到思维链 → "思考中" (模型确实在推理)
|
|
* 一收到正文就停 —— 那时已经有东西可看了.
|
|
*
|
|
* 输出走 stderr, 且只在 stderr 是终端时才启用, 所以不会污染管道输出.
|
|
*/
|
|
#ifndef LIGENT_SPINNER_H
|
|
#define LIGENT_SPINNER_H
|
|
|
|
#include "util.h" /* LIGENT_PRINTF */
|
|
|
|
/* enabled = 0 时所有接口都变成空操作 */
|
|
void spinner_init(int enabled);
|
|
|
|
/* 开始转动. 已在转则忽略 (幂等) */
|
|
void spinner_start(const char *label);
|
|
|
|
/* 换标签 (例如从"等待响应"切到"思考中").
|
|
* 标签真的变了才重置计时, 所以每来一片思维链都调用它也没问题.
|
|
* 未在转时只记下标签, 什么都不打印. */
|
|
void spinner_set_label(const char *label);
|
|
|
|
/* 停止并擦掉那一行. 未在转则忽略 (幂等).
|
|
* 流式输出开始前必须先调用它, 否则内容会和动画抢同一行. */
|
|
void spinner_stop(void);
|
|
|
|
/* 在动画中间插一条提示 (例如"稍后重试"): 先停并清行, 打印, 再继续转.
|
|
* 未在转时就是普通打印. */
|
|
void spinner_notice(const char *fmt, ...) LIGENT_PRINTF(1, 2);
|
|
|
|
#endif /* LIGENT_SPINNER_H */
|