田拍拍 管理后台
活跃用户
{{ stats.dau.reduce((s, d) => s + d.dau, 0) }}
人 · {{ stats.range }}
任务创建
{{ stats.eventCounts.task_created || 0 }}
完成率
{{ stats.completionRate }}%
{{ stats.eventCounts.task_completed || 0 }} / {{ stats.eventCounts.task_created || 0 }}
未读反馈
{{ stats.feedbackOpen }}

📅 每日活跃用户

暂无数据
日期活跃用户数
{{ d.day }} {{ d.dau }}

🚪 用户在哪一步退出 (放弃步骤分布)

暂无放弃记录
步骤放弃次数
{{ stepName(row.step) }} {{ row.count }}

⚠️ 最近错误 ({{ stats?.recentErrors?.length || 0 }})

没有错误,😎
时间用户错误
{{ formatTime(e.created_at) }} {{ e.user_id || '-' }} {{ e.payload?.msg || '-' }}
加载中...
暂无 Provider
说明: 在这里配置每个模型厂商的 API Key 和 Endpoint。 后端调用时优先读 DB 配置, 缺失时回退到 env 变量。修改后立即生效, 无需重新部署。
内置 (system) Provider 不可删除, 可禁用; 自定义 Provider 可随时删除。
接入任何 OpenAI 兼容的厂商 (硅基流动 / 智谱 / 月之暗面 / 自部署模型...)
新建 Provider
{{ p.display_name }} [{{ p.name }}] system custom
通义千问默认: https://dashscope.aliyuncs.com/compatible-mode/v1
当前: {{ p.api_key_masked }}
独立 ping: 用 available_models 第一个模型发"你好"验 Key
{{ providerTestResult[p.name] }}
说明: 业务流程分 4 步:
diagnose-identify 品种识别 → ② growth-stage-infer 生长期推断 → ③ diagnose-analyze 病害诊断 (默认双专家会诊) → ④ report 报告生成
每个 task 三段式: 🟢 当前生效 / 📝 草稿 / 📜 历史。 修改提示词必须走 "复制为草稿 → 编辑 → 测试 → 激活" 流程。
📌 提示词模板可用占位符 {{ var }}

提示词里写 {{ crop }} 这样的占位符, 后端调 LLM 时会替换为真实业务数据。

Task 输入占位符 输出 JSON 字段
diagnose-identify (无变量 · 仅图片) crop + scientific_name (拉丁学名)
crop_confidence (0-100)
notes
growth-stage-infer {{ crop }} {{ location }} {{ date }} {{ weather }} growth_stage
confidence
derivation (推断依据)
diagnose-analyze {{ crop }} {{ growth_stage }}
+ 10 张图
disease { has, conclusion, confidence_stars(1-3), reasoning }
pest {...同上}
nutrition { conclusion, confidence_stars, reasoning, elements }
report {{ identify_results }} {{ growth_stage_result }} {{ analyze_results }} {{ location }} {{ weather }} {{ symptom_duration }} {{ kb_candidates }} 完整报告: crop, growth_stage, overall_confidence, consultation {disease/pest/nutrition×experts}, treatment {sections, agricultural_practices}
加载中...

{{ taskTitle(bundle.task) }} {{ bundle.task }}

并行成员 (跨 active/archived 都可勾选):

🟢 当前生效

⚠️ 这个 task 没有 active 版本。请从历史选一个"重新激活"或新建草稿激活。
v{{ bundle.active.version_no }} {{ bundle.active.name || '(未命名)' }} {{ bundle.active.expert_name }} · {{ bundle.active.role }} 激活于 {{ formatTime(bundle.active.activated_at) }}
Provider: {{ bundle.active.provider }} · Model: {{ bundle.active.model }} · Temp: {{ bundle.active.temperature }} · MaxTok: {{ bundle.active.max_tokens }}
取图步骤: [{{ (bundle.active.input_steps || []).join(', ') }}]
备注: {{ bundle.active.notes }}
👁 查看完整 Prompt
{{ bundle.active.system_prompt }}
{{ bundle.active.user_prompt_tpl }}

📝 草稿 ({{ bundle.drafts.length }})

无草稿
v{{ v.version_no }} 草稿 💾 保存中... 💾 已保存 ✓
可选: {{ getProviderModels(v.provider).join(' / ') || '未配置' }}
1=农田全景 2=病株全貌 3=病斑×3 4=叶背 5=顶叶 6=果实 7=虫害×3 8=健康株
{{ testResult2[v.id] }}

📜 历史版本 ({{ bundle.archived.length }})

还没有归档版本
v{{ v.version_no }} {{ v.name || '(未命名)' }} {{ v.expert_name }} · {{ v.role }} 归档于 {{ v.archived_at ? formatTime(v.archived_at) : '—' }}
{{ v.provider }} / {{ v.model }} · Temp {{ v.temperature }}
{{ v.notes }}
👁 查看完整 Prompt
{{ v.system_prompt }}
{{ v.user_prompt_tpl }}
加载中...
时间 Task Provider Model 耗时 Tokens (入/出/总) 图数 错误
{{ formatTime(call.created_at) }} {{ call.task }} {{ call.provider }} {{ call.model }} {{ call.latency_ms }}ms {{ call.prompt_tokens || '-' }}/{{ call.completion_tokens || '-' }}/{{ call.total_tokens || '-' }} {{ call.images_count }} {{ call.error || '-' }}