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
+5
View File
@@ -469,6 +469,11 @@
*/ */
.g-page > * { flex-shrink: 0; } .g-page > * { flex-shrink: 0; }
/* 正文里的行内跳转:看着是链接、按钮语义(可聚焦、可键盘触发) */
.g-link { border: 0; padding: 0; background: none; font: inherit; color: var(--brand); cursor: pointer; text-decoration: underline; text-underline-offset: 2px; }
.g-link:hover { color: var(--brand-deep); }
.g-link:focus-visible { outline: 2px solid var(--brand); outline-offset: 2px; border-radius: 3px; }
/* 蓝图因果链:四库节点卡以真箭头相连 —— 箭头编码真实依赖(流程包→活动→工具→数据),节点即入口 */ /* 蓝图因果链:四库节点卡以真箭头相连 —— 箭头编码真实依赖(流程包→活动→工具→数据),节点即入口 */
.g-chain { display: flex; align-items: stretch; gap: 0; margin-bottom: 14px; } .g-chain { display: flex; align-items: stretch; gap: 0; margin-bottom: 14px; }
.g-chain-node { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 8px; padding: 14px 16px; background: var(--card); border: 1px solid var(--cline); border-radius: 13px; box-shadow: var(--cshadow); text-align: left; font: inherit; color: var(--ink); cursor: pointer; transition: border-color var(--t-fast), transform var(--t-fast), box-shadow var(--t-fast); } .g-chain-node { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 8px; padding: 14px 16px; background: var(--card); border: 1px solid var(--cline); border-radius: 13px; box-shadow: var(--cshadow); text-align: left; font: inherit; color: var(--ink); cursor: pointer; transition: border-color var(--t-fast), transform var(--t-fast), box-shadow var(--t-fast); }
@@ -2,12 +2,12 @@
* feature `gov-tool` —— 工具箱:**系统能对世界做什么**,一屏四段。 * feature `gov-tool` —— 工具箱:**系统能对世界做什么**,一屏四段。
* *
* 功能工具 · 已注册的调用契约(读类自由调,写类登记意向) * 功能工具 · 已注册的调用契约(读类自由调,写类登记意向)
* LLM 工具 · 模型实例(活动只见逻辑名,不触厂商与密钥) * LLM 工具 · 大模型驱动的系统内通用工具(**不是模型**;模型在系统区绑)
* 人类工具 · 工单两模式 + 对话卡三族(调人也是调工具,只是被调的是人) * 人类工具 · 工单两模式 + 对话卡三族(调人也是调工具,只是被调的是人)
* 接入 · 导入自定义工具(与第一方同门两审)/ 连接 MCP * 接入 · 导入自定义工具(与第一方同门两审)/ 连接 MCP
* *
* 三类工具并列不是编排:它是「一件事能交给谁办」的全集 —— * 三类工具并列不是编排:它是「一件事能交给谁办」的全集 ——
* 交给系统(功能工具)、交给模型(LLM)、交给人(人类工具)。少列一类,活动就以为自己没得选。 * 交给系统(功能工具)、交给模型(LLM 工具)、交给人(人类工具)。少列一类,活动就以为自己没得选。
* *
* 自 `~/coding/JCAI_PRD/governance/_components/Governance.tsx` 平移: * 自 `~/coding/JCAI_PRD/governance/_components/Governance.tsx` 平移:
* 类名(`g-*` + 色调 `t-*`)与文案沿用;设计台以**卡片**为基调(运营台才以列表为主)。 * 类名(`g-*` + 色调 `t-*`)与文案沿用;设计台以**卡片**为基调(运营台才以列表为主)。
@@ -74,6 +74,51 @@ const HUMAN_TOOLS = [
}, },
] as const; ] 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) { export function ToolsHome({ nav }: HomeProps) {
const tools = useGovTools(); const tools = useGovTools();
const llm = useGovLlm(); const llm = useGovLlm();
@@ -131,39 +176,40 @@ export function ToolsHome({ nav }: HomeProps) {
)} )}
</Sec> </Sec>
<Sec ico="cpu" title="LLM 工具" extra="调模型经模型网关一缝 · 活动只见逻辑名,四元绑定在系统区"> <Sec ico="cpu" title="LLM 工具" extra="大模型驱动的系统内通用工具 · 调模型经模型网关一缝">
<div className="g-shelf"> <div className="g-shelf">
{(llm.data?.instances ?? []).map((m) => ( {LLM_TOOLS.map((t) => (
<button <div key={t.name} className="g-tile t-auto">
key={m.id}
className={'g-tile t-' + (m.enabled ? 'auto' : 'mute')}
onClick={() => nav.jump('system', 'llm', { k: 'llm', id: m.id })}
>
<span className="g-tile-h"> <span className="g-tile-h">
<span className="g-tile-i"> <span className="g-tile-i">
<Ico name="cpu" s={16} /> <Ico name={t.ico} s={16} />
</span> </span>
<span className="g-tile-t"> <span className="g-tile-t">
<b>{m.name}</b> <b>{t.name}</b>
<em>{m.provider}</em> <em>{t.mode}</em>
</span> </span>
<St tone={m.apiKeyBound ? 'ok' : 'danger'} ico={m.apiKeyBound ? 'circle-check' : 'alert-circle'}> <St tone="ok" ico="circle-check">
{m.apiKeyBound ? '已绑密钥' : '未绑密钥'} 内置
</St> </St>
</span> </span>
<span className="g-tile-m"> <span className="g-tile-m">
<span className="g-tile-d">型号 {m.model}</span> <span className="g-tile-d">{t.desc}</span>
</span> </span>
<span className="g-tile-f"> <span className="g-tile-f">
{m.systemUse && <Chip tone="brand">系统用途</Chip>} <Chip tone={t.cost === '系统账' ? 'mute' : 'auto'} ico="coins">
<span className="r">{m.enabled ? '启用中' : '已停用'}</span> 计量入{t.cost}
</Chip>
</span> </span>
</button>
))}
{(llm.data?.instances ?? []).length === 0 && (
<Clear>还没有绑定模型 —— 去系统区加一个实例,活动才有模型可用。</Clear>
)}
</div> </div>
))}
</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>
<Sec ico="hand" title="人类工具" extra="调人也是调工具 · 打扰上限在契约授权边界,由 Harness 强制"> <Sec ico="hand" title="人类工具" extra="调人也是调工具 · 打扰上限在契约授权边界,由 Harness 强制">