diff --git a/README.md b/README.md index 0543742..53a5896 100644 --- a/README.md +++ b/README.md @@ -8,10 +8,14 @@ InsideGov 是一个面向政企互动研究与政策演示的多智能体实验 2. 政策兑现与承诺可信度; 3. 产业补贴、企业进入与产能演化。 +核心世界现已继续演化到**城市模仿、企业退出与政府救助**:竞争城市会观察成功项目并自主选择模仿策略,需求冲击后困难企业进入跨部门救助会商,可严格比较市场退出、无条件救助和附条件救助的就业—财政—效率权衡。见 [docs/DYNAMIC_COMPETITION.md](docs/DYNAMIC_COMPETITION.md)。 + 另有一个**独立的人才对接场景**(需求 ↔ 政策 ↔ 能力映射),把「沟通协商机制」建成可运行的 2x2 反事实实验:语言模式(官话/人话)× 中介平台(关/开)。见 [docs/TALENT_SCENARIO.md](docs/TALENT_SCENARIO.md)。 再有一个**政企协商机制实验室**(双边协商与共同问题建构):企业带着私有信息(真实需求 ≠ 第一轮表达)、政府带着有限认知进入协商,七种协商机制(自由/政策匹配/澄清优先/复述确认/约束先行/多方案/分阶段承诺)在完全相同的初始世界上反事实对比,产出帕累托前沿与 H1-H7 假设检验。见 [docs/NEGOTIATION_LAB.md](docs/NEGOTIATION_LAB.md)。 +低质项目识别已升级为**无答案标签的证据型尽调实验**:政府 Agent 自主选择调查顺序和最终处置,只能观察企业材料与独立核验证据;隐藏的多维项目状态仅用于生成证据和事后结算。前端可比较五种程序、多 seed、误签/误伤和阈值曲线。见 [docs/DUE_DILIGENCE_RESEARCH.md](docs/DUE_DILIGENCE_RESEARCH.md)。 + ## 设计原则 - **LLM 负责想,模拟器负责算**:认知策略可替换,财政、土地、合同、项目、产能等状态由确定性规则更新。 @@ -20,7 +24,7 @@ InsideGov 是一个面向政企互动研究与政策演示的多智能体实验 - **实验必须可复现**:种子、配置、干预和事件日志构成完整实验记录。 - **seed 生成世界,不是只生成噪声**:种子同时决定城市财政/产业禀赋、企业私有偏好、部门底线、信用先验和项目扰动。 - **三个场景共用一个世界**:招商、履约和产业演化不是三套脚本,而是一条因果链。 -- **组织而非个人是行动者**:不同部门拥有不同动作集并自主决定行动或等待;议程、会前沟通、联盟、风险政策、程序转换和行动顺序可以变化,财政、合同与生产边界仍保持刚性。 +- **组织而非个人是行动者**:不同部门拥有不同标准行为模板、职责能力、信息权限和禁止事项;Agent 可提出目录外行动并自主决定行动或等待,财政、合同与生产边界仍保持刚性。 ## 快速开始 @@ -89,7 +93,7 @@ tests/ 可复现性和关键约束测试 ## 当前能力 - 三座异质城市、招商局—财政局—市领导—企业董事会可执行 Agent 与供应商网络; -- **组织行动内核**:招商、财政、司法审查、园区、市领导、企业与产业基金拥有角色专属动作集;各部门自主争夺有限注意力,正式程序可启动、暂停、退回、恢复或重新议程化,企业可在任意轮次接受、还价、退出、等待或选址;前端完整回放模型选择、规则门与行动后复盘。 +- **组织行动内核**:招商、财政、司法审查、园区、市领导、企业与产业基金拥有角色专属标准行为模板,但模板不是行动上限;开放行动经能力、禁止事项和执行原语编译后进入世界。各部门自主争夺有限注意力,正式程序可启动、暂停、退回、恢复或重新议程化。 - **组织自主学习闭环**:组织保存跨季度计划树并比较候选策略;可提出目录外行动并接受职责和资源审查;上级政策、会议、竞争、财政、舆情和领导更替形成内生机会窗口;否决、协调和企业回应持续更新信任、策略偏好、组织惯例与可迁移教训。 - Agent 私有观察、记忆检索、结构化行动、事后复盘与财政否决协调; - 多维招商政策包和企业异质偏好; @@ -104,11 +108,11 @@ tests/ 可复现性和关键约束测试 - **P2 产品闭环**:历史季度复制、自然语言干预人工确认、证据约束的 Agent 访谈、HTML/JSON 自动报告、文本材料参数抽取与溯源。 - **真实案例校准**:合肥—蔚来公开参数卡,本级财政与三类联合产业基金分账结算,以及15%—35%财政空间敏感性。 - **人才对接场景**:企业需求向量化表达、政策工具包与语言模式(官话/人话)设计、人才解读协商(理解度/信任/覆盖度)、可选平台翻译撮合、合同分期兑现与知识外溢,以及 2x2 反事实矩阵。 -- **政企协商机制实验室**:企业双层需求(真实/表达错位)与政府信念分离、七种协商机制严格反事实对比、理解差距与语义/激励对齐度量、低质项目签约前识别(veto)、分阶段履约结算,以及多种子矩阵(均值/方差 + 帕累托前沿 + H1-H7 假设检验 + 语言探针)。 +- **政企协商机制实验室**:企业双层需求与政府信念分离、七种协商机制反事实对比;低质项目模块不读取答案标签,由资金/技术/市场/治理/交付证据驱动多 Agent 自主尽调,并报告假阳性、假阴性、Brier、阈值敏感性和分阶段承诺结果。 ## 产品文档 -完整的产品定位、目标用户、端到端流程、世界与 Agent 设计、功能需求、验收标准和版本路线见 [docs/PRODUCT.md](docs/PRODUCT.md)。组织行动的现实依据与编码边界见 [docs/research/organizational-behavior-evidence.md](docs/research/organizational-behavior-evidence.md),计划、开放行动、机会窗口和学习机制见 [docs/research/organization-autonomy-upgrade.md](docs/research/organization-autonomy-upgrade.md)。系统实现另见 [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md),研究机制与结论边界见 [docs/MODEL.md](docs/MODEL.md)。人才对接场景的设计理念、机制量化与实验结果见 [docs/TALENT_SCENARIO.md](docs/TALENT_SCENARIO.md);政企协商机制实验室的七机制设计、对齐度量、H1-H7 假设与帕累托结论见 [docs/NEGOTIATION_LAB.md](docs/NEGOTIATION_LAB.md)。 +完整的产品定位、目标用户、端到端流程、世界与 Agent 设计、功能需求、验收标准和版本路线见 [docs/PRODUCT.md](docs/PRODUCT.md)。组织行动的现实依据与编码边界见 [docs/research/organizational-behavior-evidence.md](docs/research/organizational-behavior-evidence.md),计划、开放行动、机会窗口和学习机制见 [docs/research/organization-autonomy-upgrade.md](docs/research/organization-autonomy-upgrade.md)。系统实现另见 [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md),研究机制与结论边界见 [docs/MODEL.md](docs/MODEL.md)。人才对接场景见 [docs/TALENT_SCENARIO.md](docs/TALENT_SCENARIO.md);政企协商机制见 [docs/NEGOTIATION_LAB.md](docs/NEGOTIATION_LAB.md);无答案标签尽调研究见 [docs/DUE_DILIGENCE_RESEARCH.md](docs/DUE_DILIGENCE_RESEARCH.md)。 ## 研究边界 diff --git a/apps/web/app/components/DueDiligenceLab.tsx b/apps/web/app/components/DueDiligenceLab.tsx new file mode 100644 index 0000000..e0401e7 --- /dev/null +++ b/apps/web/app/components/DueDiligenceLab.tsx @@ -0,0 +1,109 @@ +"use client"; + +import { useEffect, useMemo, useState } from "react"; +import { + api, + type DueDiligenceCase, + type DueDiligenceReport, +} from "../lib/api"; + +const decisions: Record = { + approve: "正式推进", + conditional_pilot: "可逆试点", + defer: "补证后再议", + reject: "签约前否决", +}; +const dimensionNames: Record = { + financing: "资金闭合", + technology: "技术成熟", + market: "市场验证", + governance: "治理信用", + execution: "交付能力", +}; + +export function DueDiligenceLab() { + const [report, setReport] = useState(null); + const [program, setProgram] = useState("adaptive_staged"); + const [seed, setSeed] = useState(3); + const [firmId, setFirmId] = useState("firm_risky"); + const [busy, setBusy] = useState(true); + const [error, setError] = useState(""); + + useEffect(() => { + let alive = true; + void api.dueDiligence() + .then((value) => { + if (!alive) return; + setReport(value); + setSeed(value.configuration.seeds[0]); + }) + .catch((caught) => alive && setError(String(caught))) + .finally(() => alive && setBusy(false)); + return () => { alive = false; }; + }, []); + + const run = useMemo( + () => report?.program_runs.find((item) => item.program === program && item.seed === seed), + [program, report, seed], + ); + const current = useMemo( + () => run?.cases.find((item) => item.firm_id === firmId) ?? run?.cases[0], + [firmId, run], + ); + const contrast = useMemo(() => { + if (!report) return []; + return ["light_screen", "independent_verification", "adaptive_staged"].map((id) => { + const row = report.program_runs.find((item) => item.program === id && item.seed === seed); + return row?.cases.find((item) => item.firm_id === "firm_risky"); + }).filter((item): item is DueDiligenceCase => Boolean(item)); + }, [report, seed]); + + if (busy) return
EVIDENCE-GATED DUE DILIGENCE

正在运行 5 种程序 × 8 个随机种子…

; + if (error || !report) return

研究矩阵未完成

{error}

; + + return ( +
+
+
UNKNOWN FIRM · NO ORACLE LABEL

面对没有答案标签的新企业,什么程序更有识别力?

{report.research_question}

+ Agent 看不到真实质量 ✓ +
+ +
+ {report.program_summary.map((item) => ( + + ))} +
+ +
+

同一企业、同一 Seed,只改变证据程序

+
+ {contrast.map((item) =>
{report.program_summary.find((row) => row.id === item.program)?.name}{decisions[item.decision]}

事前风险 {pct(item.estimated_failure_probability)} · 不确定性 {pct(item.uncertainty)}

{item.evidence.length} 项证据 / {item.elapsed_days} 天 / 成本 {item.diligence_cost.toFixed(2)}
)} +
+
+ +
+
+

证据链

+ {current?.evidence.map((item) => ( +
+ R{item.round}
{item.requested_by} · {dimensionNames[item.dimension]}{item.source_type}

{item.summary}

可靠度{pct(item.reliability)}材料主张{pct(item.claim_value)}核验观察{pct(item.observed_quality)} +
+ ))} +
+
+

Agent 自主性与规则边界

+
    {current?.agent_turns.map((turn, index) =>
  1. {index + 1}{String(turn.actor_id)}{String(turn.action_id)}{String(turn.rationale ?? "基于风险与信息价值选择下一步")}
  2. )}
+ {current &&
FINAL DECISION{decisions[current.decision]}

规则引擎没有替 Agent 判断项目好坏;只负责证据可见性、权限、硬红线和事后结算。

decision_used_hidden_label = {String(current.decision_used_hidden_label)}
} +
+
+ +

阈值不是答案:它改变误放与误伤的取舍

{report.threshold_curve.map((item) =>
{item.threshold.toFixed(2)}抓到 {pct(item.true_positive_rate)}
误伤 {pct(item.false_positive_rate)}
)}
+

{report.interpretation_boundary}

+
+ ); +} + +function pct(value: number) { return `${(value * 100).toFixed(0)}%`; } diff --git a/apps/web/app/components/DynamicCompetitionLab.tsx b/apps/web/app/components/DynamicCompetitionLab.tsx new file mode 100644 index 0000000..c2b453e --- /dev/null +++ b/apps/web/app/components/DynamicCompetitionLab.tsx @@ -0,0 +1,195 @@ +"use client"; + +import { useEffect, useMemo, useState } from "react"; +import { + api, + type DynamicCompetitionReport, + type DynamicRescueDecision, +} from "../lib/api"; + +const decisionNames: Record = { + market_exit: "市场退出", + unconditional_rescue: "无条件救助", + conditional_rescue: "附条件救助", + unconditional: "无条件救助", + conditional: "附条件救助", + reject_rescue: "拒绝救助", + aggressive_imitation: "激进模仿", + targeted_imitation: "定向模仿", + blocked: "被硬约束拦截", +}; + +export function DynamicCompetitionLab() { + const [report, setReport] = useState(null); + const [selected, setSelected] = useState("conditional"); + const [busy, setBusy] = useState(true); + const [error, setError] = useState(""); + + async function run() { + setBusy(true); + setError(""); + try { + setReport(await api.dynamicCompetition()); + } catch (caught) { + setError(String(caught)); + } finally { + setBusy(false); + } + } + + useEffect(() => { + let alive = true; + void api + .dynamicCompetition() + .then((result) => { + if (alive) setReport(result); + }) + .catch((caught) => { + if (alive) setError(String(caught)); + }) + .finally(() => { + if (alive) setBusy(false); + }); + return () => { + alive = false; + }; + }, []); + + const current = useMemo( + () => report?.variants.find((item) => item.id === selected), + [report, selected], + ); + const sampleRescue = current?.rescue_decisions.find( + (item) => item.decision !== "reject_rescue", + ) ?? current?.rescue_decisions[0]; + + if (busy) + return ( +
+ DYNAMIC COMPETITION · SAME SEED +

正在运行三种退出与救助制度…

+

共同随机种子、共同城市模仿、共同 Q10 需求冲击,仅改变救助制度。

+
+ ); + if (error || !report) + return ( +
+ DYNAMIC COMPETITION +

实验未完成

+

{error}

+ +
+ ); + + return ( +
+
+
+ DYNAMIC COMPETITION · SEED {report.seed} +

城市模仿 → 产能过剩 → 企业退出与政府救助

+

+ Q10 需求下降 {Math.abs(report.common_conditions.demand_shock * 100).toFixed(0)}%, + 三个世界只改变救助制度。 +

+
+ 24 季度真实规则推演 +
+ +
    + {report.causal_chain.map((item, index) => ( +
  1. + {index + 1} + {item} +
  2. + ))} +
+ +
+ {report.variants.map((variant) => ( + + ))} +
+ + {current && ( +
+
+

{current.name}:季度演化

+
+ {current.trajectory.map((item) => ( +
+ + Q{item.quarter} +
+ ))} +
+
+ 模仿项目 {current.final.imitation_projects} + 模仿产能 {current.final.imitation_capacity.toFixed(1)} + 期末总产能 {current.final.capacity.toFixed(1)} + 期末利用率 {(current.final.utilization * 100).toFixed(1)}% +
+
+
+

一次真实救助会商

+ {sampleRescue ? :

该制度下没有发生救助会商。

} +
+
+ )} + +
+ {Object.entries(report.headline_comparison).map(([key, value]) => ( +

{decisionNames[key] ?? key}{value}

+ ))} +
+

{report.interpretation_boundary}

+
+ ); +} + +function RescueMeeting({ decision }: { decision: DynamicRescueDecision }) { + return ( +
+
+ 企业申请 {decision.requested_amount.toFixed(1)} 亿 + 财政硬上限 {decision.finance_limit.toFixed(1)} 亿 + 最终执行 {decision.approved_amount.toFixed(1)} 亿 +
+ {decision.turns.map((turn, index) => ( +
+ {turn.actor_id} + {decisionNames[turn.act ?? ""] ?? turn.act} +

{turn.summary}

+
+ ))} +
+ RULE ENGINE SETTLEMENT +

+ 产能 {decision.capacity_before.toFixed(1)} → {decision.capacity_after.toFixed(1)}; + 岗位 {decision.jobs_before} → {decision.jobs_after}。 +

+
+
+ ); +} diff --git a/apps/web/app/components/ExperienceHome.tsx b/apps/web/app/components/ExperienceHome.tsx new file mode 100644 index 0000000..a4548e5 --- /dev/null +++ b/apps/web/app/components/ExperienceHome.tsx @@ -0,0 +1,489 @@ +"use client"; + +import { useEffect, useMemo, useState } from "react"; +import { + api, + type ConversationExperience, + type ConversationMechanism, + type DueDiligenceCase, + type DueDiligenceReport, + type DynamicCompetitionReport, + type StoryManifest, + type StoryView, + type World, +} from "../lib/api"; +import { PublicJobRoom, PublicTaskDock } from "./PublicJobExperience"; + +type SceneId = "coordination" | "diligence" | "rescue" | "conversation" | "story"; +type Audience = "government" | "enterprise" | "public"; +type Outcome = { + headline: string; + conclusion: string; + metrics: Array<{ label: string; value: string }>; + process: Array<{ actor: string; action: string; feedback: string; tone?: string }>; + findings: string[]; + governmentActions: string[]; + enterpriseActions: string[]; + publicSummary: string; + story: string[]; + boundary: string; + runtime: { + modelName: string; + decisions: number; + fallbacks: number; + }; +}; + +const scenes = [ + { + id: "coordination" as const, + index: "01", + eyebrow: "会商前预演", + title: "怎样让部门冲突更早暴露?", + description: "让招商、财政、市领导和企业在会前先走一遍,查看分歧在哪里出现、怎样重组政策包。", + users: "招商干部 · 财政部门 · 项目企业", + time: "真实 Agent · 数分钟", + accent: "mint", + }, + { + id: "diligence" as const, + index: "02", + eyebrow: "项目真实性", + title: "一家新企业到底靠不靠谱?", + description: "不预先告诉 Agent 答案,让它选择查资金、技术、客户还是信用,并比较不同尽调程序。", + users: "招商部门 · 基金团队 · 企业", + time: "真实 Agent · 数分钟", + accent: "amber", + }, + { + id: "rescue" as const, + index: "03", + eyebrow: "产业压力测试", + title: "需求下滑时,应该救还是退?", + description: "在完全相同的冲击下,对比市场退出、无条件救助和附条件救助的就业与财政后果。", + users: "政府决策者 · 企业 · 社会公众", + time: "真实 Agent · 长时推演", + accent: "blue", + }, + { + id: "conversation" as const, + index: "04", + eyebrow: "协商机制压力测试", + title: "同一句诉求,怎样问才不容易误签?", + description: "输入一条项目异动,切换确认、会商和条件承诺机制,看信息如何暴露、承诺如何形成。", + users: "政府部门 · 项目企业 · 研究教学", + time: "真实 Agent · 数分钟", + accent: "rose", + }, + { + id: "story" as const, + index: "05", + eyebrow: "第一人称组织博弈", + title: "如果你坐进会场,会先做什么?", + description: "选择招商、财政、市领导或园区角色。你发起一项行动,其他组织自主回应,规则结算真实后果。", + users: "干部培训 · 普通公众 · 比赛展示", + time: "每回合由 Agent 实时生成", + accent: "violet", + }, +]; + +const strategies: Record> = { + coordination: [ + { id: "formal", name: "正式程序", note: "按送审、审核、集体决策依次推进" }, + { id: "informal", name: "非正式协调", note: "先通过会前沟通和联盟降低阻力" }, + { id: "hybrid", name: "混合模式", note: "非正式探测边界,再进入正式审查" }, + ], + diligence: [ + { id: "light_screen", name: "轻量筛查", note: "主要依赖企业提交材料,快且便宜" }, + { id: "independent_verification", name: "独立核验", note: "逐项验证资金、技术、市场和信用" }, + { id: "adaptive_staged", name: "自适应+试点", note: "按信息价值调查,风险项目先做可逆试点" }, + ], + rescue: [ + { id: "market_exit", name: "允许市场退出", note: "不提供救助,接受短期就业冲击" }, + { id: "unconditional", name: "无条件救助", note: "优先稳就业,但财政承担全部风险" }, + { id: "conditional", name: "附条件救助", note: "救助换整改,并压缩低效产能" }, + ], + conversation: [], + story: [], +}; + +export function ExperienceHome({ onOpenResearch }: { onOpenResearch: () => void }) { + const [scene, setScene] = useState(null); + const [strategy, setStrategy] = useState(""); + const [outcome, setOutcome] = useState(null); + const [audience, setAudience] = useState("government"); + const [busy, setBusy] = useState(false); + const [error, setError] = useState(""); + const [activeJobId, setActiveJobId] = useState(null); + const [conversationResult, setConversationResult] = useState(null); + const [storyResult, setStoryResult] = useState(null); + const selectedScene = useMemo(() => scenes.find((item) => item.id === scene), [scene]); + + function enter(id: SceneId) { + setScene(id); + setStrategy(id === "coordination" ? "hybrid" : id === "diligence" ? "adaptive_staged" : id === "rescue" ? "conditional" : ""); + setOutcome(null); + setConversationResult(null); + setStoryResult(null); + setAudience("government"); + window.scrollTo({ top: 0, behavior: "smooth" }); + } + + async function run() { + if (!scene || !strategy) return; + setBusy(true); + setError(""); + setOutcome(null); + try { + if (scene === "coordination") { + const job = await api.createPublicJob("coordination", { process_mode: strategy, seed: 42 }); + setActiveJobId(job.id); + } else if (scene === "diligence") { + const job = await api.createPublicJob("diligence", { program: strategy, seed: 42 }); + setActiveJobId(job.id); + } else if (scene === "rescue") { + const job = await api.createPublicJob("dynamic_competition", { policy: strategy, seed: 42, quarters: 16 }); + setActiveJobId(job.id); + } + } catch (caught) { + setError(String(caught)); + } finally { + setBusy(false); + } + } + + async function openJobResult(job: import("../lib/api").PublicJob) { + if (job.scene === "coordination") { + const result = await api.getPublicJobResult(job.id); + const mode = String(job.config.process_mode ?? "hybrid"); + setScene("coordination"); setStrategy(mode); setOutcome(coordinationOutcome(result, mode)); + } else if (job.scene === "diligence") { + const result = await api.getPublicJobResult(job.id); + const program = String(job.config.program ?? "adaptive_staged"); + setScene("diligence"); setStrategy(program); setOutcome(diligenceOutcome(result, program)); + } else if (job.scene === "dynamic_competition") { + const result = await api.getPublicJobResult(job.id); + const policy = String(job.config.policy ?? "conditional"); + setScene("rescue"); setStrategy(policy); setOutcome(rescueOutcome(result, policy)); + } else if (job.scene === "conversation") { + setConversationResult(await api.getPublicJobResult(job.id)); + setScene("conversation"); + } else { + setStoryResult(await api.getPublicJobResult(job.id)); + setScene("story"); + } + setActiveJobId(null); + } + + if (activeJobId) { + return <> setActiveJobId(null)} onResult={openJobResult} onJobChanged={setActiveJobId} />; + } + + if (!scene) { + return ( + <>
+
+
内InsideGov把政策过程放到桌面上
+ +
+
+
+ AGENT-BASED POLICY SIMULATION +

先把问题
在现实发生前跑一遍。

+

InsideGov 让政府部门、企业和规则在同一个世界里真实互动。你不需要先理解模型,只需要选择一个正在面对的问题。

+ 选择我要解决的问题 ↓ +
+
+ 01

Agent 自主决策不是预写剧情

+ 02

规则确定结算财政、合同和产能可复核

+ 03

结果面向不同人政府、企业和公众各看各的

+
+
+
+
CHOOSE A QUESTION

你今天想先解决哪个问题?

每个入口都是一条完整体验,复杂参数留在过程背后。

+
+ {scenes.map((item) => ( + + ))} +
+
+
+ ONE ENGINE · DIFFERENT EXPERIENCES

底层是一套世界,用户只看与问题有关的那条线。

+
1选择问题→2选择策略→3观察过程→4获得自己的结果
+
+
InsideGov政策实验与组织行为研究工具,不构成现实政策预测。
+
+ ); + } + + if (scene === "conversation") { + return <> setScene(null)} onOpenResearch={onOpenResearch} />; + } + + if (scene === "story") { + return <> setScene(null)} onOpenResearch={onOpenResearch} />; + } + + return ( + <>
+
内InsideGov
+
+ {selectedScene?.eyebrow} · {selectedScene?.index}

{selectedScene?.title}

{selectedScene?.description}

+
  1. 选择策略
  2. 运行过程
  3. 查看结果
+
+ + {!outcome && !busy && ( +
+
STEP 1 / 3

这次想采用哪种处理方式?

我们只改变这一项,其他城市、企业和随机条件保持一致。

+
{strategies[scene].map((item) => )}
+ + {error &&

{error}

} +
+ )} + + {busy &&
内
DEEPSEEK AGENTS ARE RUNNING

各组织正在观察、行动和回应…

所有公众场景固定调用 LLM Agent;世界状态仍由 InsideGov 规则引擎逐步结算。

} + + {outcome && ( + <> +
+
STEP 2 / 3 · GENERATED PROCESS

这次推演实际发生了什么?

+
{outcome.process.map((item, index) =>
{index + 1}
{item.actor}{item.action}

{item.feedback}

)}
+
+
+
STEP 3 / 3

这份结果要给谁看?

+ item.id === strategy)?.name ?? strategy} /> +
+ + )} +
+ ); +} + +type SceneHeading = (typeof scenes)[number] | undefined; + +function ExperienceNav({ onBack, onOpenResearch }: { onBack: () => void; onOpenResearch: () => void }) { + return
内InsideGov
; +} + +function ConversationExperiencePanel({ selectedScene, initialResult, onStartJob, onBack, onOpenResearch }: { selectedScene: SceneHeading; initialResult: ConversationExperience | null; onStartJob: (jobId: string) => void; onBack: () => void; onOpenResearch: () => void }) { + const [mechanisms, setMechanisms] = useState([]); + const [selected, setSelected] = useState("M8"); + const [eventText, setEventText] = useState("企业融资计划反复调整,但尚未公开说明自筹资金缺口。"); + const [result, setResult] = useState(initialResult); + const [busy, setBusy] = useState(false); + const [error, setError] = useState(""); + + useEffect(() => { + void api.conversationMechanisms().then(setMechanisms).catch((caught) => setError(String(caught))); + }, []); + + async function run() { + setBusy(true); setError(""); setResult(null); + try { + const job = await api.createPublicJob("conversation", { mechanism_id: selected, event_text: eventText, seed: 42 }); + onStartJob(job.id); + } + catch (caught) { setError(String(caught)); } + finally { setBusy(false); } + } + + return
+ +
{selectedScene?.eyebrow} · {selectedScene?.index}

{selectedScene?.title}

{selectedScene?.description}

  1. 输入条件
  2. 机制运行
  3. 查看证据链
+ {!result && !busy ?
+
STEP 1 / 3

这次项目出现了什么新情况?

系统先把自然语言编译为知情方、可观察信号和透明的世界参数变化,不会直接让模型改数字。

+