配置参考¶
本页是配置项的唯一详细手册。所有运行时配置为 PHONE_AGENT_* 环境变量,优先级:CLI 参数 > shell
环境变量 > .env > 默认值。默认值与支持取值以 phone_agent/v2/config.py 为准,模板与逐项注释见
.env.example。
配置层级与装配¶
| 层 | 来源 | 说明 |
|---|---|---|
| 1 | CLI 参数 | 只覆盖少量运行控制项(设备、步数、安全模式、语言等),最强 |
| 2 | shell 环境变量 | 显式导出的 PHONE_AGENT_* |
| 3 | .env |
仓库根的 .env;只填充未导出的键,不覆盖已存在的 shell 环境变量 |
| 4 | 默认值 | v2/config.py 中的声明 |
模型层在环境变量之下再叠一层单层 models.json:PHONE_AGENT_MODELS_FILE 显式指定的文件优先,否则读运行目录下的 .taskwizard.models.json。它只为声明式提供方、模型条目与可选 roles 段服务,不是通用配置层。
装配时的容错与失败边界:
- 可见失败:显式的未知 provider、无法构建的显式引用不会静默改走其它网关——只有显式配置
PHONE_AGENT_FALLBACK_MODEL时才按该备用降级一次(首选构建失败时降级一次;调用在传输自身重试耗尽后仍失败时再经备用调用一次,同目标不重复); - 逐项跳过:声明文件缺失、损坏或部分条目坏时跳过该项并记录结构化的
declaration_warnings(来源、范围、名称、错误;脱敏且有长度上限),run 内另落models_declaration_warningtrace 事件;env 合成的 gateway 始终可用; - 严格解析:
load_raw_document/parse_models_document保留完整校验语义,显式校验路径仍 fail-closed 报配置错误;拼写错误的新协议/缓存声明会阻止选择受影响的 provider/model,避免被跳过后静默按默认值执行; - 窗口绑定:构建器把声明或探测到的
contextWindow私有绑定到实际模型对象,主模型与备用模型的最终准入使用该上界;已知的实际容量只允许被收紧,不能被较大的覆盖值放宽。未知 serializer 的输出上限报告为 unknown,不从maxTokens猜一个值。
模型¶
| 变量 | 类型 | 默认值 | 说明 |
|---|---|---|---|
PHONE_AGENT_BASE_URL |
url | http://localhost:8000/v1 |
OpenAI-compatible 网关地址;默认面向本地无鉴权网关,正式部署按需指定 |
PHONE_AGENT_MODEL |
str | autoglm-phone-9b |
主模型 id,需视觉多模态能力;正式部署按需指定 |
PHONE_AGENT_API_KEY |
str | EMPTY |
网关 API key;本地无鉴权网关可用默认值 |
PHONE_AGENT_MODEL_TIMEOUT |
float | 180.0 |
单次模型请求超时(秒) |
PHONE_AGENT_MODEL_MAX_RETRIES |
int | 2 |
模型请求重试次数 |
PHONE_AGENT_TEMPERATURE |
float | 不发送 | 采样参数;网关限制固定值时在此覆盖 |
PHONE_AGENT_TOP_P |
float | 不发送 | 同上 |
PHONE_AGENT_FREQUENCY_PENALTY |
float | 不发送 | 同上 |
PHONE_AGENT_STREAMING |
off/on |
off |
模型流式。off 保持历史非流式调用路径不变;on 时按各协议正式参数(streaming)构建模型,SDK 自行流式接收并聚合成完整消息——headless、各 aux 角色与 Web 都生效,Web 控制台只是在同一事件接缝上增量观察(见控制台)。不改变动作序列、安全策略、重试与 usage 计账;可用性 fallback 按其自身模型声明 + 全局配置构建,不继承首选角色覆盖。优先级:roles.<role>.streaming > 模型条目 streaming > 本开关 |
PHONE_AGENT_HTTP_HEADERS |
str | 无 | 附加请求头,格式 K1=V1;K2=V2 |
PHONE_AGENT_USER_AGENT |
str | 内置浏览器式 UA | 覆盖默认 User-Agent;网关在 Cloudflare 后时不要清空 |
PHONE_AGENT_CF_ACCESS_CLIENT_ID |
str | 无 | Cloudflare Access 客户端 id;与 secret 必须成对配置 |
PHONE_AGENT_CF_ACCESS_CLIENT_SECRET |
str | 无 | Cloudflare Access 客户端 secret |
PHONE_AGENT_VERIFIER_MODEL / PHONE_AGENT_MEMORY_MODEL / PHONE_AGENT_SAFETY_REVIEWER_MODEL 见下方
对应章节,都是“缺省回落”型可选项,不需要为了跑通任务而设置。
多提供方(models.json)¶
默认零配置:所有角色走上面的网关。声明额外提供方/模型时使用单层 models.json(运行目录下的 .taskwizard.models.json,PHONE_AGENT_MODELS_FILE 显式指定时优先),各角色模型变量随即可写成 provider:model 路由到第二模型。
| 变量 | 类型 | 默认值 | 说明 |
|---|---|---|---|
PHONE_AGENT_MODELS_FILE |
path | 无 | 显式指定 models.json,优先级最高 |
PHONE_AGENT_THINKING |
off/minimal/low/medium/high |
不发送 | 思考级别;按端点声明的 thinking 映射翻译为原生配置,不支持的静默省略 |
条目字段、合并与容错、--list-models 与 thinking 翻译细节见模型提供方与路由。
请求协议与可选缓存¶
compat 可写在 provider 或模型条目上,模型只覆盖明确设置的字段。requestApi 选择 OpenAI family 的请求格式
(auto/chat/responses),cachePolicy 默认 off、stable-prefix 显式启用原生缓存标记;冲突与不支持的
组合可见失败,拼写错误会阻止选择受影响的 provider/model。字段语义、示例与缓存准备规则见
模型提供方与路由。
流式决策(streaming)¶
有效决策 = roles.<role>.streaming > 模型条目(含 modelOverrides)streaming > 全局 PHONE_AGENT_STREAMING
(默认 off)。off/未声明不下发参数;有效决策翻译为三种 transport 各自的 streaming 参数,SDK 聚合同一条
完整消息,工具只从聚合消息执行一次,Web 只挂观察者;可用性 fallback 按自身声明与全局配置构建,不继承首选角色
覆盖。细节见模型提供方与路由。
roles 段(每角色调用配置)¶
顶层可选 roles 段,键为角色名(actor/memory/verifier/safety_reviewer/distill),值为该角色的
model、samplingParams、thinking、streaming 覆盖;模型引用优先级、回落链与构建期降级见
模型提供方与路由。
可用性 fallback¶
| 变量 | 类型 | 默认值 | 说明 |
|---|---|---|---|
PHONE_AGENT_FALLBACK_MODEL |
str | 无 | actor 的可选备用目标(provider:model 或默认 gateway 上的裸模型名);缺省、同目标或不可构建时不启用。构建失败降级一次,调用失败在传输重试耗尽后再经备用调用一次,降级写 model_fallback 审计;其余角色仅构建期降一跳。细节见模型提供方与路由 |
运行控制¶
| 变量 | 类型 | 默认值 | 说明 |
|---|---|---|---|
PHONE_AGENT_DEVICE_ID |
str | 自动识别 | ADB 设备序列号;多设备时必填 |
PHONE_AGENT_LANG |
cn/en |
cn |
提示词语言;zh / zh-cn / zh_cn / chinese 同样按中文处理,其余值按英文 |
PHONE_AGENT_MAX_STEPS |
int | 100 |
单轮最大模型调用数;仅作失控保险丝,非成本手段 |
PHONE_AGENT_MAX_HITL_RESUMES |
int | 20 |
人工中断恢复次数上限 |
预算与上下文压缩¶
| 变量 | 类型 | 默认值 | 说明 |
|---|---|---|---|
PHONE_AGENT_TOKEN_BUDGET |
int | 1000000 |
单轮累计 input+output token 阈值,达到后停止;已发有效 finish 复核包有一次确认续办机会(见下文) |
PHONE_AGENT_TOKEN_WARN_REMAINING |
int | 100000 |
剩余低于该值时向模型注入一次余量提醒 |
PHONE_AGENT_COMPACT |
bool | true |
auto-compact 总开关 |
PHONE_AGENT_COMPACT_WARN_RATIO |
float | 0.75 |
上下文占窗口比例达到此值时提醒模型收敛 |
PHONE_AGENT_COMPACT_TRIGGER_RATIO |
float | 0.92 |
达到此值时生成 handoff 摘要并折叠历史 |
PHONE_AGENT_CONTEXT_WORK_TARGET |
int | 32000 |
完整模型输入的软工作目标,含工具、任务板、历史与图片;0 只关闭该目标,物理窗口与 T1/T2 仍有效 |
PHONE_AGENT_COMPACT_TARGET_RATIO |
float | 0.7 |
压缩后的软工作目标比例,必须大于 0、小于 1;保护内容无法达到软目标时不强行删除,物理容量风险仍可转为容量修复 |
PHONE_AGENT_COMPACT_SUMMARY_TOKENS |
int | 2000 |
摘要表达及接受上限;超长摘要不提交,不是价格预算 |
PHONE_AGENT_COMPACT_MIN_REDUCTION_TOKENS |
int | 1000 |
普通工作压缩至少释放的输入 tokens,与相对门槛同时满足;已超物理容量且恢复准入的正净缩减修复除外 |
PHONE_AGENT_COMPACT_MIN_REDUCTION_RATIO |
float | 0.1 |
普通工作压缩至少释放原输入的比例;不得大于等于 1 |
PHONE_AGENT_COMPACT_SCHEMA_RESERVE |
int | 3000 |
T1/T2 比较时为随每轮请求发送的序列化工具 schema 预留的 token 数(估算不可见部分) |
PHONE_AGENT_COMPACT_OUTPUT_RESERVE |
int | 2000 |
T1/T2 比较时为下一轮回复预留的 token 数 |
PHONE_AGENT_BOUNDARY_COMPACT |
off/shadow/on |
shadow |
边界感知折叠档位:路线项 in_progress → completed 即一个折叠边界。shadow 只计算并记录决策、上下文一字不改;on 才允许每个边界请求一次折叠;off 不装配该能力。T1/T2 容量触发始终优先。依赖 compact 实例;compact 关闭时本能力静默不装配(状态按 deps 推导为 pending、missing_deps=compact,自身取 off 时为 off) |
PHONE_AGENT_BOUNDARY_COMPACT_STEPS_PER_ITEM |
int | 4 |
每条路线项平均步数的保守先验,只在完成项样本不足时使用;小样本判据见 PHONE_AGENT_BOUNDARY_COMPACT_SAMPLE_GUARD_ITEMS |
PHONE_AGENT_BOUNDARY_COMPACT_SAMPLE_GUARD_ITEMS |
int | 2 |
完成项数达到该值才改用本 run 实测均值代替先验 |
PHONE_AGENT_BOUNDARY_COMPACT_MIN_HORIZON_STEPS |
int | 2 |
预计剩余步数低于此值就不折叠(没有足够步数摊平改写成本) |
PHONE_AGENT_BOUNDARY_COMPACT_MIN_SPAN_TOKENS |
int | 1500 |
可折叠区间的最低 token 估算,低于它就省不掉一次摘要调用 |
PHONE_AGENT_BOUNDARY_COMPACT_MIN_NET_RATIO |
float | 1.5 |
收益/成本达到此倍数即触发折叠(≥,等于也算达到);倍数大于 1 时「刚好不亏」仍不折 |
PHONE_AGENT_CONTEXT_WINDOW |
int | 按实际构建的 actor 推断,兜底 256000 |
用于窗口规划;最终请求准入只能收紧已知实际模型的窗口声明,不能放大。未设置时按实际构建的 actor(含构建降级目标)推断;旧自定义 Provider 没有新 support 时也保留 ModelSpec 的已知窗口,备用模型按自己的声明检查 |
PHONE_AGENT_MEMORY_MODEL |
str | 主模型 | compact 摘要与 --distill 的两次调用(候选抽取 + 自评分)共用的模型;缺省回落到主模型,roles.distill.model 优先于本键 |
PHONE_AGENT_IMAGE_KEEP |
int | 2 |
历史中保留的含图消息数 |
PHONE_AGENT_OBS_MARKS_KEEP |
int | 2 |
历史中保留完整 marks 摘要的观测数 |
PHONE_AGENT_SIBLING_RECEIPTS |
on/off |
on |
同一轮多个观测类工具时,非最后一个只回紧凑文本回执(screen#N + marks 数 + 结构差分),不附图与 marks 摘要;该轮最后一个观测仍附完整截图与摘要。只改呈现,不跳过观测;off 时每条观测都附完整截图与 marks 摘要(见同轮中间步骤回执) |
预算契约¶
成本以 token 计,累计 usage_metadata 的 input + output;没有 usage 时回退到本地启发式估算:CJK 字符按约 1 token/字、其余文本按 len // 4,每张图片按 1500 token,工具调用参数与未识别的非空 additional_kwargs 也计入。用量台账跨压缩持续累加,因此压缩不会重置预算。
Token 预算在模型调用边界检查,已发生的调用与验收用量仍完整累计,因此最终用量可以超过阈值;达到阈值后以 token_budget_exhausted 停止本轮。
唯一续办例外:若达到阈值时已有由成功观测产生的 finish 复核包,且屏幕序号、原始目标与关闭且合法的任务板仍匹配,本 run 最多再给模型一次真实回复机会,处理该复核包的 finish(confirm=true);不增加 MAX_STEPS、不自动完成。这份续办额度只覆盖该响应中的一次有效确认,其他工具操作返回 error-status 未执行回执。以下情况不补发额度:重复复核、确认被拒、人工中断恢复、复核后再次委托执行普通工具(即使命令可能已派发但回执失败、没有新观测);续办响应中被预算直接拒绝、未委托执行的普通工具也不会撤销同响应的合法确认机会。FINISH_VERIFY=off 不使用这份续办额度。独立验收器的拒绝与故障 skipped 语义保持原样,人工控制、PHONE_AGENT_MAX_STEPS(loop_fuse 保险丝)与已接受的终局优先。
压缩契约¶
工作目标不改变 contextWindow。每轮先清理旧图/marks,再按实际模型的可选 context support 估算;provider 已计入工具定义时不重复加 schema reserve。未知/native 内容使用明确的启发式估算,不视为零成本;这不等同于真实 provider tokenizer。
语义压缩只归并完整的已闭合 AI/工具组,保留原始任务、当前 TaskDoc、最新完整组、活跃图/marks 和 opaque 依赖;不截 HTML 调用参数。摘要模型输入过长时按完整组分段后合并,单组装不下则跳过。单次压缩最多 8 次逻辑摘要调用(含本层重试/合并,不包含 SDK 内部 HTTP 重试);每次调用前检查已有 run token 预算,耗尽后不再付摘要调用。失败、超长或净缩减不足时保留已经完成必要图像清理的基线,不提交部分摘要。最终发送前还需对实际模型、最新 pins 与工具定义做容量准入,不能在 fallback 内单独截断一份临时历史。已超物理窗口的请求只要正净缩减并恢复准入,就不会被普通软收益门槛拒绝。
软目标不能阻止合法的物理容量修复。例如最新必留 HTML 组大于 32k 的低水位、但仍能放进实际模型窗口时,接近/超过物理阈值的请求会按物理目标重新规划;完整工具组、原生依赖与观测仍保留。压缩完成但软目标未达到会记录 soft_target_unattainable,不冒充已达到 32k。
原生签名可位于标准 text/image block 的嵌套 extras 中,估算与保护会递归识别。普通 SDK function-call id 对照表不因此永久占住压缩边界。若自定义 Provider 把原生签名放在必须移除的旧图片或 OBS marks 块上,当前没有可验证的合法重放投影:micro 在改任何消息前预检并报告 native_context_pruning_conflict,不会搬动签名或保留额外旧图。最新 K 的签名块保持原样;同消息其他文本块有签名不妨碍无签名旧图清理。
未识别的非空 additional_kwargs 默认作为可能的 Provider 续接载荷保留,并作非零序列化估算。只有已经被结构化调用表示覆盖的 tool_calls / function_call 和已确认的 __openai_function_call_ids__ 对照表属于例外;不能因为某个字段不在已知签名列表中,就认为可以丢弃。
边界触发的折叠(PHONE_AGENT_BOUNDARY_COMPACT,默认 shadow):模型拥有计划,所以它的路线项迁移就是折叠边界——一次提交的 in_progress → completed(P0 #11 保证的唯一完成路径)发 taskdoc/completed,boundary_compact 能力在下一个 model/pre_request 检查点做机械判断:horizon = 未完成路线项数 × 每条路线项平均步数(完成项样本不足时用保守先验),收益 = (可折叠估算 token − 摘要 token) × horizon,成本 = 一次摘要调用(区间 token + PHONE_AGENT_COMPACT_SUMMARY_TOKENS);只有收益清晰超过成本的倍数才请求折叠,否则记录推迟原因。判断归 harness,编计划归模型:harness 不猜计划,模型也不决定何时改写历史。
折叠走 T2 同一条提交路径,因此全部闸门照旧:保护组(含 TaskDoc pin、最新完整观测、原生签名)、最小折叠规模、摘要预算、净缩减阈值、失败保留基线;差异只在接受规则——边界折叠是经济赌注而非容量修复,必须放得下且确实净缩减,但不要求达到容量路径的低水位目标。切点按边界对齐:边界之后的步数逐字保留,只折叠刚完成的这段。窗口压力仍归 T2:本能力只在容量折叠无事可做的检查点上动作,一个边界至多一次决策;若本 pass 的容量折叠已经提交,该 armed boundary 直接作废(不记决策,只记 boundary_compact_skipped),shadow 与 on 判定同一件事、只差是否落地。
摘要逐字命中影子指标:每次成功折叠在提交前机械统计摘要里的实质行(归一化后 ≥ 12 字符、非 # 开头、至多 40 条)有多少能在被折叠的历史中逐字命中,落 compact_summary_quote_check trace 事件(计数、命中率与有界样本,遵守截断与脱敏)。纯观察:任何闸门都不读它,指标自身报错也不影响折叠;折叠被既有原因中止时不发事件。标定口径:迭代折叠时上一份 [COMPACT_SUMMARY] 的原文不在本次 haystack 里,忠实搬运的句子因此计为 miss——hit_rate 读作「逐字搬运率」而非幻觉计量;样本字段是 miss_samples(未命中样本)。
消息协议契约:model/pre_request 监听器是纯的全消息列表变换——不得返回 RemoveMessage,也不返回 jump_to 做流程控制。监听器改动了列表时,由桥接中间件统一铸出唯一合法的 [RemoveMessage(REMOVE_ALL), *result] 形态交给下游。
界面落地(Grounding)¶
| 变量 | 类型 | 默认值 | 说明 |
|---|---|---|---|
PHONE_AGENT_GROUNDING_PROVIDER |
hybrid/accessibility/locateanything |
hybrid |
locate 工具的视觉 provider 档位。观测 marks 恒由控件树产出,与本键无关;hybrid / locateanything 构建 LocateAnything 视觉 provider,accessibility 不构建——该档下 locate 报 provider_unavailable |
PHONE_AGENT_ACCESSIBILITY_TIMEOUT |
float | 12.0 |
控件树抓取超时(秒)。uiautomator dump 内部的 waitForIdle 硬编码等待在页面跳转后的忙乱期会久留,超时过短会把这次 dump 打断成 provider_error,故默认放宽到 12.0 |
PHONE_AGENT_ACCESSIBILITY_MAX_MARKS |
int | 80 |
单次观测最多输出的 mark 数 |
PHONE_AGENT_OBSERVE_RETRY_MAX_LOOPS |
int | 1 |
不稳定 marks dump(timeout / provider_error / accessibility_xml_parse_error)的额外整轮重采上限;总轮数 = 1 + 本值,0 表示单轮不重试。默认 1 即「最多 2 轮」 |
PHONE_AGENT_OBSERVE_RETRY_BACKOFF_S |
float | 2.0 |
marks dump 失败后、下一轮开始前的退避秒数,用来错开页面跳转后的忙乱窗口;重试是整轮重采(含截图),不单独重采 marks |
PHONE_AGENT_MARKS_WINDOWED |
auto/on/off |
auto |
窗口感知 marks(纯展示层)。auto 先试 uiautomator dump --windows,不支持则回退 legacy 单根 dump;on 强制 --windows(不支持报错可见);off 只跑 legacy 单根 dump。分组条件是出现多个不同窗口或存在真窗口证据(layer/type),否则平铺渲染——legacy 单根 dump 的多个顶层 node 会各生成一个弱窗口,因此同样按分组渲染并输出 op= 字段。仅影响分组/标注/渲染,寻址/执行/安全门/折叠/locate 不变,op=blocked 仅展示不拦截。CLI 覆盖旗标 --marks-windowed(优先级高于本键) |
PHONE_AGENT_LOCATEANYTHING_MODEL |
path | models/LocateAnything-3B-4bit |
本地视觉定位模型路径;留空时按该默认路径加载,路径不存在时视觉定位不可用 |
PHONE_AGENT_LOCATEANYTHING_MAX_SIZE |
int | 960 |
视觉定位 provider 自身输入图的最长边上限(模型侧档位)。与工具侧 LOCATE_MAX_SIZE 独立 |
PHONE_AGENT_LOCATE_MAX_SIZE |
int | 0 |
locate 工具输入图最长边;0 = 原图 |
PHONE_AGENT_SCOPE_PADDING_RATIO |
float | 0.05 |
scope 区域裁剪的边缘扩展比例 |
PHONE_AGENT_LOCATEANYTHING_CONTEXT_MAX_CHARS |
int | 200 |
locate 指令中单字段提示长度上限 |
PHONE_AGENT_PARALLEL_TOOL_CALLS |
bool | false |
仅 provider hint:默认向 OpenAI 兼容传输发送 parallel_tool_calls=false(provider 声明不支持该参数时不发送),设 true 则不发送该 hint(仅供拒绝该参数的网关使用)。两种取值都不解除单批执行(工具调用仍由 admission 串行) |
观测¶
| 变量 | 类型 | 默认值 | 说明 |
|---|---|---|---|
PHONE_AGENT_OBSERVE_SETTLE_MS |
int | 300 |
每次观测采样前的静置毫秒数;0 关闭。应对加载延迟的页面 |
PHONE_AGENT_BLACK_SCREEN_DETECT |
on/off |
on |
全黑截图判定为 FLAG_SECURE 保护屏,不下发黑图;只认 off,写 false/0 会静默回落默认 on |
安全与验收¶
| 变量 | 类型 | 默认值 | 说明 |
|---|---|---|---|
PHONE_AGENT_SAFETY_MODE |
off/wary/hard/reviewer |
wary |
执行类动作门控,详见安全模式 |
PHONE_AGENT_SAFETY_REVIEWER_MODEL |
str | 回落 VERIFIER_MODEL |
reviewer 档的风险精排模型;两者皆空(且 models.json roles 未指定)时精排不可用,该档按 fail-closed 预警处理——不回落主模型 |
PHONE_AGENT_FINISH_VERIFY |
off/auto/always |
auto |
finish 独立验收器触发策略;off 退化为单段落定。验收器故障 fail-open:放行并在审计记 skipped,绝不记 pass |
PHONE_AGENT_FINISH_VERIFY_K |
int | 1 |
no-op:无消费方,任何取值行为相同——验收器恒取一次新观测的当前帧,K>1 所需的历史帧保留未接 |
PHONE_AGENT_VERIFIER_MODEL |
str | 主模型 | 验收器模型 |
记忆¶
App-KB¶
| 变量 | 类型 | 默认值 | 说明 |
|---|---|---|---|
PHONE_AGENT_APP_KB |
bool | true |
App-KB 总开关(同步/读取/写回/注入) |
PHONE_AGENT_MEMORY_DIR |
path | memory |
记忆根目录;EXPERIENCE_DIR / LESSONS_DIR / VEC_DB / RUNS_DIR 可各自独立覆盖 |
PHONE_AGENT_APP_LIST_MAX |
int | 40 |
注入提示词的应用名数量上限 |
PHONE_AGENT_DREAM |
off/auto/manual |
manual |
记忆整理时机;manual 仅 --dream |
PHONE_AGENT_IMPLICIT_ALIAS |
bool | true |
隐式纠正:叫法失败→候选包名成功时自动记别名 |
PHONE_AGENT_ALIAS_OVERWRITE |
bool | true |
dream 是否从同 run 的“开错并秒退→随后成功”证据覆盖错误 learned 别名 |
PHONE_AGENT_ALIAS_OVERWRITE_NOTES |
comma-separated str | 开错,不对,不是,错了,wrong app |
模型明确自述开错应用的匹配词表;事件只落命中的词,不落完整 note |
手工纠正可用 main_v2.py --learn-alias "名称=包名" 写入最高信任的全局 user 别名;即使包未安装也会在警告后保存。main_v2.py --forget-alias "名称" 只删除该名称的全局 user / learned 条目,不影响设备清单。两者都会把实际变更追加到 memory/app_kb/events.jsonl。
App 名解析¶
| 变量 | 类型 | 默认值 | 说明 |
|---|---|---|---|
PHONE_AGENT_RESOLVER_DECISION_MODE |
enum | typed |
typed 使用证据类型化三态决策;legacy 回退旧 score 阈值决策 |
PHONE_AGENT_RESOLVER_MIN_SCORE |
float | 0.90 |
legacy 模式 top1 成为 resolved 的最低综合分;typed 模式只作为弱候选展示阈值 |
PHONE_AGENT_RESOLVER_MARGIN |
float | 0.08 |
legacy 模式 top1 相对 top2 的最小领先分差;不足则 ambiguous |
PHONE_AGENT_RESOLVER_TYPED_MARGIN |
float | 0.08 |
typed 模式强证据 top1 相对 top2 的最小 rank_score 分差;不足则 ambiguous |
PHONE_AGENT_RESOLVER_TOP_K |
int | 10 |
结构化结果、trace 与失败回执最多保留的排序候选数 |
PHONE_AGENT_RESOLVER_LEXICAL |
bool | true |
启用归一化变体、字符 bigram/trigram 与 difflib 候选路 |
PHONE_AGENT_RESOLVER_PINYIN |
bool | true |
启用全拼与首字母候选路;pypinyin 不可用时 fail-open 跳过 |
PHONE_AGENT_RESOLVER_EMBED |
bool | true |
启用 vec.db App alias 向量候选路;索引/模型不可用时 fail-open 跳过 |
PHONE_AGENT_RESOLVER_PACKAGE_SEGMENT_MIN_LEN |
int | 4 |
包名分段强证据的最小段长 |
PHONE_AGENT_RESOLVER_PACKAGE_SEGMENT_STOPWORDS |
csv | com,org,net,android,example,app,mobile,free,debug,release |
包名按 ./_/-/camelCase 切段后过滤的无意义段 |
PHONE_AGENT_RESOLVER_AUTO_MATCH_TYPES |
csv | exact_alias,exact_label,exact_package,exact_package_segment,registered_containment |
typed 模式允许自动 resolved 的强证据类型 |
PHONE_AGENT_RESOLVER_CLARIFY_MATCH_TYPES |
csv | fuzzy,pinyin_full,pinyin_initials,embedding |
typed 模式只用于澄清/候选展示、不会单独自动 resolved 的弱证据类型 |
PHONE_AGENT_RESOLVER_W_SIM |
float | 0.8 |
综合分中的相似度权重 |
PHONE_AGENT_RESOLVER_W_PRIOR |
float | 0.2 |
综合分中的 App-KB 先验权重 |
rank_score = W_SIM * sim + W_PRIOR * prior。在 typed 模式下它只用于排序、margin、回执和 trace,不单独赋予执行 authority。exact_package_segment 只接受完整分段相等,例如 Firefox 匹配 org.mozilla.firefox,但 fox 不匹配;PiliPlus 匹配 com.example.piliplus,但 plus 不匹配。名称候选胜出后仍须通过设备安装事实和 launch policy;解析配置不能扩大启动权限。
经验与回想¶
| 变量 | 类型 | 默认值 | 说明 |
|---|---|---|---|
PHONE_AGENT_EXPERIENCE |
on/off |
on |
episode 档案记录开关(observe-only);只认 off,写 false/0 会静默回落默认 on |
PHONE_AGENT_EXPERIENCE_DIR |
path | memory/experience |
档案目录 |
PHONE_AGENT_EPISODE_KEEP |
int | 500 |
保留的完整档案数;更老的归档为聚合统计 |
PHONE_AGENT_EPISODE_ARCHIVE_DAYS |
int | 90 |
超过该天数的档案在 dream 时归档 |
PHONE_AGENT_MEMORY_RAG |
off/shadow/on |
shadow |
语义回想档位;shadow 只观测不注入;on 只注入可注入 lesson(approved / auto_approved,两类皆可),不注入召回 episode;proposed/needs_review/revoked 永不注入 |
PHONE_AGENT_EMBED_MODEL |
str | Qwen/Qwen3-Embedding-0.6B |
本地嵌入模型(MLX) |
PHONE_AGENT_EMBED_DIM |
int | 1024 |
嵌入向量维度 |
PHONE_AGENT_VEC_DB |
path | memory/vec.db |
向量索引文件;run 结束增量更新,dream 对账 |
PHONE_AGENT_INDEX_MIN_STEPS |
int | 2 |
episode 索引质量闸门;更短的 run 只留档,alias 不受影响 |
PHONE_AGENT_RECALL_TOP_K |
int | 1 |
episode 语义榜名额;app mention 独立返回、不占名额 |
PHONE_AGENT_RECALL_MIN_SCORE |
float | 0.50 |
episode 语义榜的起始门槛(基于实测噪音分布,可按部署重标定);app mention 走独立确定性榜,不占名额 |
PHONE_AGENT_RECALL_DECAY_LAMBDA |
float | 0.02 |
时间衰减速率(按天),只用于语义同分决胜 |
PHONE_AGENT_EVOLUTION |
off/manual |
manual |
经验提炼开关;manual 由 --distill 触发 |
PHONE_AGENT_LESSONS_DIR |
path | memory/lessons |
经验库存储目录 |
PHONE_AGENT_LESSON_INJECT_MAX |
int | 3 |
单次注入的经验条数上限 |
PHONE_AGENT_LESSON_INJECT_TOKENS |
int | 800 |
注入内容的 token 上限 |
PHONE_AGENT_FOREGROUND_EVENT_BLOCKED_PACKAGES |
csv | 空 | app/launched 进场注入的前台包过滤补充名单;叠加内建系统包名单 |
观测存档与召回¶
| 变量 | 类型 | 默认值 | 说明 |
|---|---|---|---|
PHONE_AGENT_OBS_ARCHIVE |
off/on |
off |
观测存档能力:把每次提交成功观测的 [OBS] 文本(纯文本,无截图/base64)存到本地并挂载只读 recall_screen / search_screens;见观测存档与召回 |
PHONE_AGENT_OBS_ARCHIVE_DIR |
path | memory/obs_archive |
存档根目录;每 run 一个 <run_id>.jsonl(追加式真相)与可重建的 <run_id>.db(FTS5 索引) |
PHONE_AGENT_OBS_ARCHIVE_KEEP_RUNS |
int | 20 |
保留的 run 数上限(≥ 1,总计含当前 run:当前 run 永不删除,更早的按 mtime 淘汰);更老的 jsonl 与其索引在下次写入时删除 |
任务板与记录¶
| 变量 | 类型 | 默认值 | 说明 |
|---|---|---|---|
PHONE_AGENT_TASKDOC |
bool | true |
TaskDoc 任务板开关 |
PHONE_AGENT_TASKDOC_NUDGE_STEPS |
int | 5 |
no-op:停滞轻推不产生行为,该键仅为 env 兼容保留 |
PHONE_AGENT_TRACE |
bool | true |
JSONL trace 开关(脱敏,不含截图) |
PHONE_AGENT_TRACE_DIR |
path | .traces |
trace 目录 |
PHONE_AGENT_DIAG_EVIDENCE |
bool | false |
诊断证据流(live-diagnosis 用;生产默认关闭、零成本) |
PHONE_AGENT_DIAG_EVIDENCE_DIR |
path | outputs/live-diagnosis/.evidence |
诊断证据流目录 |
PHONE_AGENT_DIAG_UNREDACTED |
bool | false |
本机诊断全保真模式(仅影响证据流,生产 trace 始终脱敏) |
PHONE_AGENT_RUNS_DIR |
path | memory/runs |
runner 子进程运行目录(事件/控制通道) |
PHONE_AGENT_DELIVERABLE |
on/off |
on |
run 级 HTML 产出物能力(write_document/update_document);只认 off,写 false/0 会静默回落默认 on |
PHONE_AGENT_DELIVERABLE_DIR |
path | outputs/deliverables |
产出物目录;文件固定为 <run_id>.html,上限 256 KiB |
插件¶
| 变量 | 类型 | 默认值 | 说明 |
|---|---|---|---|
PHONE_AGENT_PLUGINS |
bool | true |
外部插件总开关;false 关闭全部插件,内建能力不受影响 |
PHONE_AGENT_PLUGIN_MANIFEST |
path | <repo>/.taskwizard.toml |
项目级插件清单路径覆盖 |
PHONE_AGENT_PLUGIN_INDEX |
str | plugins/index.json |
plugin search 索引源(URL 或本地 json) |
保留库直读键¶
phone_agent/adb/、phone_agent/grounding/ 与 phone_agent/config/ 是保留库:下列键在调用点直接读 env,不经
V2Config,因此不进 CLI/env 解析链;取值与默认值以对应模块为准。
| 变量 | 类型 | 默认值 | 说明 |
|---|---|---|---|
PHONE_AGENT_SCREENSHOT_FORMAT |
jpeg/png |
jpeg |
模型输入图的编码格式;非 jpg/jpeg 值按 PNG 保存 |
PHONE_AGENT_SCREENSHOT_JPEG_QUALITY |
int | 80 |
JPEG 质量,钳制在 1-95;非法值回落 80 |
PHONE_AGENT_SCREENSHOT_USE_EXEC_OUT |
on/off |
on |
截图走 adb exec-out screencap -p 单次往返(PNG 直读 stdout);只有 1/true/yes/on 视为开,其余取值回退 legacy 三往返路径(设备端写文件 + pull + rm)。老设备不支持 exec-out 时设 off |
PHONE_AGENT_LOCATEANYTHING_STRUCTURE_MODE |
off/target/screen |
off |
视觉定位的结构化提示档位;非法值回落 off |
PHONE_AGENT_GROUNDING_MAX_SIZE |
int | 960 |
视觉定位输入图最长边的兜底别名;v2 session 恒先提供 PHONE_AGENT_LOCATEANYTHING_MAX_SIZE 的值,故本键在 v2 路径不生效 |
PHONE_AGENT_LOCATEANYTHING_MAX_VISUAL_CANDIDATES |
int | 30 |
单次结构化的视觉候选上限 |
PHONE_AGENT_LOCATEANYTHING_VISUAL_CATEGORY_BUDGET |
int | 5 |
单类视觉候选配额 |
PHONE_AGENT_LOCATEANYTHING_MAX_STRUCTURE_CALLS |
int | 5 |
单次结构化的模型调用次数上限 |
PHONE_AGENT_TAP_DELAY / PHONE_AGENT_DOUBLE_TAP_DELAY / PHONE_AGENT_LONG_PRESS_DELAY / PHONE_AGENT_SWIPE_DELAY / PHONE_AGENT_BACK_DELAY / PHONE_AGENT_HOME_DELAY / PHONE_AGENT_LAUNCH_DELAY |
float | 0.3 |
各动作执行后的等待秒数;由 DeviceTimingConfig 读入,被 phone_agent/adb/device.py 的各动作消费。慢设备可调高 |
PHONE_AGENT_DOUBLE_TAP_INTERVAL |
float | 0.1 |
双击两次点击之间的间隔 |
PHONE_AGENT_ADB_RESTART_DELAY |
float | 2.0 |
切到 TCP/IP 模式后的等待秒数 |
PHONE_AGENT_SERVER_RESTART_DELAY |
float | 1.0 |
重启 ADB server 前后的等待秒数 |
PHONE_AGENT_SCREENSHOT_FORMAT 与 PHONE_AGENT_SCREENSHOT_JPEG_QUALITY 决定模型实际看到的图(编码与压缩强度);
token 估算仍按预算契约的固定口径,不随这两项变化。
保留但无读取方的字段
PHONE_AGENT_BUDGET_WARN_RATIO(模型调用预算阈值)的字段无读取方,仅为 env 兼容保留;成本控制请使用
PHONE_AGENT_TOKEN_BUDGET 与 PHONE_AGENT_TOKEN_WARN_REMAINING。PHONE_AGENT_TASKDOC_NUDGE_STEPS
见上表,为 no-op。PHONE_AGENT_LOCATE_LA_MAX_SIZE 同样无读取方(resolve_locate_la_max_size 没有调用方),
locate 工具的输入档位用 PHONE_AGENT_LOCATE_MAX_SIZE。PHONE_AGENT_KEYBOARD_SWITCH_DELAY /
PHONE_AGENT_TEXT_CLEAR_DELAY / PHONE_AGENT_TEXT_INPUT_DELAY / PHONE_AGENT_KEYBOARD_RESTORE_DELAY
被 phone_agent/config/timing.py 读入 ActionTimingConfig,但该配置的字段无读取方,其取值不影响行为。