UI③:LLM 工具改为大模型驱动的系统内通用工具 —— 不是模型实例

五件真实存在的:案例决断(loop-turn)/ 步内生成(flow-step)/ 叙述性小结 /
蒸馏归纳 / 连通探针,各标算谁的账。模型实例退成尾注:模型是发动机,这些是装在上面的件。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
This commit is contained in:
2026-07-28 02:36:57 +08:00
co-authored by Claude Fable 5
parent ec0b78c550
commit 5a8589046b
2 changed files with 72 additions and 21 deletions
@@ -2,12 +2,12 @@
* feature `gov-tool` —— 工具箱:**系统能对世界做什么**,一屏四段。
*
* 功能工具 · 已注册的调用契约(读类自由调,写类登记意向)
* LLM 工具 · 模型实例(活动只见逻辑名,不触厂商与密钥)
* LLM 工具 · 大模型驱动的系统内通用工具(**不是模型**;模型在系统区绑)
* 人类工具 · 工单两模式 + 对话卡三族(调人也是调工具,只是被调的是人)
* 接入 · 导入自定义工具(与第一方同门两审)/ 连接 MCP
*
* 三类工具并列不是编排:它是「一件事能交给谁办」的全集 ——
* 交给系统(功能工具)、交给模型(LLM)、交给人(人类工具)。少列一类,活动就以为自己没得选。
* 交给系统(功能工具)、交给模型(LLM 工具)、交给人(人类工具)。少列一类,活动就以为自己没得选。
*
* 自 `~/coding/JCAI_PRD/governance/_components/Governance.tsx` 平移:
* 类名(`g-*` + 色调 `t-*`)与文案沿用;设计台以**卡片**为基调(运营台才以列表为主)。
@@ -74,6 +74,51 @@ const HUMAN_TOOLS = [
},
] as const;
/**
* LLM 工具目录 —— 系统内**由大模型驱动**的通用工具(不是模型本身)。
*
* 模型是发动机,这些是装在发动机上的件:每一件都有明确的入、出与算账口径。
* 它们不在工具目录里注册 —— 与人类工具一样,是基座给的能力,不是谁装上来的。
* 跑在哪个模型上由系统区的四元绑定决定(活动只见逻辑名,不触厂商与密钥)。
*/
const LLM_TOOLS = [
{
name: '案例决断',
mode: 'loop-turn',
ico: 'rotate-ccw',
desc: '案例活动每一拍:读「当下可为 ∩ 目标所需」,从 调工具 / 调人 / 立监听 里选一个行动',
cost: '活动预算',
},
{
name: '步内生成',
mode: 'flow-step',
ico: 'list-checks',
desc: '标准活动的 llm 步:模板 + 出参 schema → 结构化产出;出参必过 schema 校验,不合即不算数',
cost: '活动预算',
},
{
name: '叙述性小结',
mode: 'system-use',
ico: 'file-text',
desc: '任务日志 → 200 字阶段小结,只陈述日志里有的事实、不推测',
cost: '系统账',
},
{
name: '蒸馏归纳',
mode: 'system-use',
ico: 'layers',
desc: '终态封卷时从任务记忆归纳活动记忆条目:四层归位 + 证据链必挂',
cost: '系统账',
},
{
name: '连通探针',
mode: 'probe',
ico: 'plug',
desc: '试一次端点与鉴权,回延迟 —— 绑完模型先探一下,别等活动跑起来才发现调不通',
cost: '系统账',
},
] as const;
export function ToolsHome({ nav }: HomeProps) {
const tools = useGovTools();
const llm = useGovLlm();
@@ -131,39 +176,40 @@ export function ToolsHome({ nav }: HomeProps) {
)}
</Sec>
<Sec ico="cpu" title="LLM 工具" extra="调模型经模型网关一缝 · 活动只见逻辑名,四元绑定在系统区">
<Sec ico="cpu" title="LLM 工具" extra="大模型驱动的系统内通用工具 · 调模型经模型网关一缝">
<div className="g-shelf">
{(llm.data?.instances ?? []).map((m) => (
<button
key={m.id}
className={'g-tile t-' + (m.enabled ? 'auto' : 'mute')}
onClick={() => nav.jump('system', 'llm', { k: 'llm', id: m.id })}
>
{LLM_TOOLS.map((t) => (
<div key={t.name} className="g-tile t-auto">
<span className="g-tile-h">
<span className="g-tile-i">
<Ico name="cpu" s={16} />
<Ico name={t.ico} s={16} />
</span>
<span className="g-tile-t">
<b>{m.name}</b>
<em>{m.provider}</em>
<b>{t.name}</b>
<em>{t.mode}</em>
</span>
<St tone={m.apiKeyBound ? 'ok' : 'danger'} ico={m.apiKeyBound ? 'circle-check' : 'alert-circle'}>
{m.apiKeyBound ? '已绑密钥' : '未绑密钥'}
<St tone="ok" ico="circle-check">
内置
</St>
</span>
<span className="g-tile-m">
<span className="g-tile-d">型号 {m.model}</span>
<span className="g-tile-d">{t.desc}</span>
</span>
<span className="g-tile-f">
{m.systemUse && <Chip tone="brand">系统用途</Chip>}
<span className="r">{m.enabled ? '启用中' : '已停用'}</span>
<Chip tone={t.cost === '系统账' ? 'mute' : 'auto'} ico="coins">
计量入{t.cost}
</Chip>
</span>
</button>
</div>
))}
{(llm.data?.instances ?? []).length === 0 && (
<Clear>还没有绑定模型 —— 去系统区加一个实例,活动才有模型可用。</Clear>
)}
</div>
<Note>
这些是<b>工具</b>,不是模型 —— 模型是它们跑在上面的发动机。
当前绑了 {(llm.data?.instances ?? []).length} 个模型实例(
{(llm.data?.instances ?? []).map((m) => m.name).join(' · ') || '尚未绑定'});
换厂商、换型号只改<button className="g-link" onClick={() => nav.jump('system', 'llm')}>系统区的四元绑定</button>,
这些工具与活动一行都不动。
</Note>
</Sec>
<Sec ico="hand" title="人类工具" extra="调人也是调工具 · 打扰上限在契约授权边界,由 Harness 强制">