| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049 |
- <!doctype html>
- <html lang="zh-CN">
- <head>
- <meta charset="utf-8" />
- <meta name="viewport" content="width=device-width, initial-scale=1" />
- <title>医梦 × 深信服 FastGPT 医疗智能体联合方案</title>
- <style>
- :root {
- --cyan: #3ad4d8;
- --indigo: #2b1f99;
- --ink: #17202a;
- --muted: #5f6b7a;
- --line: #dce5ee;
- --soft: #f4f8fb;
- --paper: #ffffff;
- --warn: #dc2626;
- --warn-soft: #fff5f5;
- --green: #1a8f92;
- --green-soft: #eefbfc;
- --orange: #2b1f99;
- --orange-soft: #f4f8fb;
- --shadow: 0 20px 50px rgba(23, 32, 42, 0.08);
- }
- * { box-sizing: border-box; margin: 0; }
- html, body {
- min-height: 100vh;
- font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Helvetica Neue", sans-serif;
- background: linear-gradient(135deg, #f0f4f8 0%, #f8fafc 48%, #f0f4f8 100%);
- color: var(--ink);
- -webkit-font-smoothing: antialiased;
- }
- body { display: flex; justify-content: center; padding: 5px 12px; overflow: hidden; }
- .stage {
- width: min(1320px, calc(100vw - 40px));
- height: calc(100vh - 10px);
- min-height: 0;
- background: rgba(255,255,255,0.92);
- border-radius: 28px;
- box-shadow: var(--shadow);
- border: 1px solid rgba(43, 31, 153, 0.08);
- overflow: hidden;
- position: relative;
- backdrop-filter: blur(18px);
- }
- .stage::before {
- content: ""; position: absolute; left: 0; top: 0; bottom: 0;
- width: 5px;
- background: linear-gradient(180deg, var(--cyan) 0%, var(--indigo) 100%);
- z-index: 5; border-radius: 28px 0 0 28px;
- }
- /* ── Top bar ── */
- .topbar {
- padding: 18px 34px 0 46px;
- display: flex; justify-content: space-between; gap: 24px; align-items: flex-start;
- }
- .kicker {
- display: flex; align-items: center; gap: 10px; margin-bottom: 6px;
- color: var(--muted); font-weight: 600; font-size: 13px;
- }
- .dot-row { display: flex; gap: 7px; margin-right: 16px; }
- .dot-row span { width: 7px; height: 7px; border-radius: 50%; }
- .dot-row span:nth-child(1) { background: var(--cyan); }
- .dot-row span:nth-child(2) { background: var(--indigo); }
- .dot-row span:nth-child(3) { background: var(--green); }
- h1 {
- margin: 0; font-size: clamp(24px, 2.7vw, 36px); line-height: 1.1;
- letter-spacing: 0; color: #0d172a; max-width: 820px; font-weight: 650;
- }
- .term {
- display: inline-block; padding: 4px 13px 6px; border-radius: 11px;
- background: rgba(43, 31, 153, 0.08); color: var(--indigo);
- font-family: "JetBrains Mono", Menlo, monospace;
- font-size: 0.82em; vertical-align: 2px; white-space: nowrap; font-weight: 600;
- }
- .meeting-card {
- flex: 0 0 270px; background: var(--indigo); color: #fff; border-radius: 18px;
- padding: 14px 18px; min-height: 104px; position: relative; overflow: hidden;
- }
- .meeting-card::after {
- content: ""; position: absolute; width: 140px; height: 140px; border-radius: 50%;
- background: rgba(255,255,255,0.07); right: -50px; bottom: -66px;
- }
- .meeting-card strong { display: block; font-size: 18px; margin-bottom: 6px; position: relative; z-index: 1; }
- .meeting-card span { display: block; color: rgba(255,255,255,0.78); font-size: 13px; line-height: 1.42; position: relative; z-index: 1; }
- /* ── Tabs ── */
- .tabs {
- display: grid; grid-template-columns: repeat(8, minmax(0, 1fr)); gap: 8px;
- padding: 16px 34px 0 46px;
- }
- .tab {
- border: 1px solid var(--line); background: rgba(255,255,255,0.7);
- color: #435166; border-radius: 11px; padding: 8px 6px; font-size: 12px;
- font-weight: 700; cursor: pointer; transition: all 180ms ease; white-space: nowrap;
- text-align: center;
- }
- .tab:hover { transform: translateY(-1px); }
- .tab.active {
- background: rgba(43, 31, 153, 0.08); border-color: rgba(43, 31, 153, 0.25);
- color: var(--indigo); box-shadow: 0 8px 20px rgba(43,31,153,0.06);
- }
- /* ── Content ── */
- .content {
- padding: 18px 34px 24px 46px;
- position: relative;
- height: calc(100% - 150px);
- display: flex;
- align-items: stretch;
- }
- .scene { display: none; min-height: 0; width: 100%; animation: fadeUp 300ms ease both; }
- .scene.active {
- display: flex;
- flex-direction: column;
- justify-content: center;
- }
- @keyframes fadeUp { from { opacity: 0; transform: translateY(14px); } to { opacity: 1; transform: translateY(0); } }
- /* ── Quote ── */
- .quote {
- text-align: center; font-size: clamp(21px, 2.35vw, 32px); line-height: 1.18;
- font-weight: 700; color: #0d172a; margin: 0 auto 16px; max-width: 1080px;
- }
- .quote .c-cyan { color: var(--cyan); }
- .quote .c-indigo { color: var(--indigo); }
- /* ── Split layout (2-col / 3-col) ── */
- .split2 { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; margin-top: 10px; align-items: stretch; }
- .split3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; margin-top: 10px; align-items: stretch; }
- .split4 { display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px; margin-top: 10px; }
- .split2-1 { display: grid; grid-template-columns: 1fr 1.18fr; gap: 14px; margin-top: 10px; align-items: stretch; }
- .overview-layout { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; margin-top: 10px; align-items: stretch; }
- /* ── Cards ── */
- .card {
- border: 1px solid var(--line); border-radius: 20px; background: rgba(255,255,255,0.9);
- padding: 16px 18px; position: relative; overflow: hidden;
- }
- .card.indigo { border-color: rgba(43,31,153,0.18); background: rgba(43,31,153,0.03); }
- .card.cyan { border-color: rgba(58,212,216,0.30); background: rgba(58,212,216,0.05); }
- .card.warn { border-color: rgba(220,38,38,0.24); background: var(--warn-soft); }
- .card.green { border-color: rgba(58,212,216,0.28); background: var(--green-soft); }
- .overview-card {
- background: rgba(255,255,255,0.94);
- border-color: rgba(43,31,153,0.12);
- box-shadow: 0 18px 44px rgba(23,32,42,0.055);
- min-height: 430px;
- display: flex;
- flex-direction: column;
- }
- .overview-card::before {
- content: ""; position: absolute; left: 0; right: 0; top: 0; height: 5px;
- background: var(--cyan);
- }
- .overview-card.mode::before { background: var(--indigo); }
- .overview-head { min-height: 74px; }
- .overview-body { flex: 1; display: flex; flex-direction: column; }
- .overview-card table { margin-top: 0; }
- .overview-footer {
- height: 62px;
- display: flex;
- flex-direction: column;
- justify-content: center;
- border-radius: 14px;
- padding: 9px 14px;
- margin-top: auto;
- border: 1px solid rgba(43,31,153,0.14);
- background: rgba(43,31,153,0.035);
- color: #26313d;
- font-size: 13px;
- line-height: 1.34;
- font-weight: 500;
- }
- .overview-footer strong {
- display: block;
- color: var(--indigo);
- font-weight: 680;
- margin-bottom: 4px;
- }
- .overview-footer.cyan {
- border-color: rgba(58,212,216,0.28);
- background: rgba(58,212,216,0.065);
- color: #1a5c5e;
- }
- .overview-footer.cyan strong { color: #116b6f; }
- .card h3 { font-size: 22px; font-weight: 650; color: var(--ink); margin-bottom: 8px; line-height: 1.18; }
- .card .tag {
- display: inline-flex; padding: 4px 10px; border-radius: 999px; font-size: 12px; font-weight: 700;
- margin-bottom: 8px;
- }
- .tag.indigo { background: rgba(43,31,153,0.1); color: var(--indigo); }
- .tag.cyan { background: rgba(58,212,216,0.15); color: #1a6b6e; }
- .tag.green { background: rgba(58,212,216,0.14); color: #1a6b6e; }
- .tag.orange { background: rgba(43,31,153,0.08); color: var(--orange); }
- /* ── Lists ── */
- .items { list-style: none; padding: 0; display: grid; gap: 6px; }
- .items li {
- display: flex; gap: 8px; align-items: flex-start; font-size: 14px; line-height: 1.35;
- color: #26313d; font-weight: 500; padding: 6px 0;
- }
- .check, .cross, .lock-icon {
- min-width: 19px; height: 19px; border-radius: 50%; display: inline-flex;
- align-items: center; justify-content: center; color: #fff; font-size: 11px; font-weight: 800; margin-top: 1px;
- }
- .check { background: var(--green); }
- .cross { background: var(--warn); }
- .lock-icon { background: var(--indigo); }
- /* ── Table ── */
- table {
- width: 100%; border-collapse: separate; border-spacing: 0; font-size: 15px;
- border: 1px solid var(--line); border-radius: 18px; overflow: hidden;
- background: rgba(255,255,255,0.92); margin-top: 18px;
- }
- th, td { padding: 7px 12px; text-align: left; border-bottom: 1px solid var(--line); vertical-align: middle; line-height: 1.22; }
- th { color: var(--indigo); font-size: 13px; font-weight: 650; background: rgba(58,212,216,0.08); }
- tr:last-child td { border-bottom: 0; }
- td { color: #26313d; font-weight: 420; }
- td.own { color: var(--indigo); font-weight: 600; white-space: nowrap; }
- td.own.emoon {
- color: #116b6f; background: rgba(58,212,216,0.08);
- border-left: 3px solid rgba(58,212,216,0.65);
- }
- td.own.sangfor {
- color: var(--indigo); background: rgba(43,31,153,0.055);
- border-left: 3px solid rgba(43,31,153,0.55);
- }
- td.dim { color: var(--muted); }
- /* ── Flow chain ── */
- .chain { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 10px; margin-top: 20px; align-items: stretch; }
- .step {
- border: 1px solid var(--line); background: rgba(255,255,255,0.92); border-radius: 18px;
- padding: 12px 12px; min-height: 112px; position: relative; display: flex; flex-direction: column; gap: 5px;
- }
- .step .idx { color: var(--cyan); font-size: 15px; font-weight: 700; }
- .step strong { color: var(--ink); font-size: 16px; line-height: 1.2; font-weight: 650; }
- .step span { color: var(--muted); font-size: 12px; line-height: 1.32; }
- /* ── Boundary cards ── */
- .bcard {
- border-radius: 18px; padding: 20px 22px; min-height: 130px;
- border: 1px solid rgba(43,31,153,0.16); background: rgba(255,255,255,0.88);
- font-size: 15px; line-height: 1.4;
- }
- .bcard strong { display: block; color: var(--indigo); font-size: 20px; font-weight: 650; margin-bottom: 8px; }
- /* ── Value layout ── */
- .value-layout { display: grid; grid-template-columns: 330px 1fr; gap: 14px; margin-top: 10px; align-items: stretch; }
- .value-menu { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; }
- .value-btn {
- border: 1px solid var(--line); background: #fff; border-radius: 12px; padding: 9px;
- text-align: left; min-height: 64px; cursor: pointer; transition: all 180ms ease;
- font-size: 12px; font-weight: 600; color: #26313d; line-height: 1.22;
- display: grid; grid-template-columns: 28px 1fr; gap: 8px; align-items: center;
- }
- .value-btn:hover { transform: translateY(-1px); }
- .value-index {
- width: 28px; height: 28px; border-radius: 9px; display: inline-flex; align-items: center; justify-content: center;
- background: rgba(58,212,216,0.12); color: #126b70; font-weight: 720; font-size: 12px;
- }
- .value-label { display: block; }
- .value-btn.active {
- border-color: rgba(43,31,153,0.38); box-shadow: 0 16px 34px rgba(43,31,153,0.11);
- background: rgba(43,31,153,0.035); color: var(--indigo);
- }
- .value-btn.active .value-index { background: var(--indigo); color: #fff; }
- .value-detail {
- border-radius: 18px; background: #fff; color: var(--ink); padding: 22px 24px 22px 30px;
- min-height: 360px; position: relative; overflow: hidden;
- border: 1px solid rgba(43,31,153,0.16);
- box-shadow: 0 22px 50px rgba(23,32,42,0.07);
- }
- .value-detail::before {
- content: ""; position: absolute; left: 0; top: 0; bottom: 0; width: 7px;
- background: var(--cyan);
- }
- .value-detail::after {
- content: none;
- }
- .value-detail h2 { margin: 0 0 10px; font-size: 25px; line-height: 1.18; max-width: 700px; position: relative; z-index: 1; font-weight: 650; color: var(--indigo); }
- .value-detail p { margin: 0 0 14px; font-size: 15px; line-height: 1.42; color: #4c5968; position: relative; z-index: 1; font-weight: 450; }
- .value-points { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; position: relative; z-index: 1; }
- .value-point {
- min-height: 58px; background: rgba(58,212,216,0.07); border: 1px solid rgba(58,212,216,0.22);
- border-radius: 12px; padding: 10px 12px; font-size: 13px; line-height: 1.3; font-weight: 500; color: #22313d;
- }
- .value-point:nth-child(even) { background: rgba(43,31,153,0.035); border-color: rgba(43,31,153,0.14); }
- /* ── Architecture diagram ── */
- .arch { display: grid; grid-template-columns: 1fr 46px 1fr 46px 1fr 46px 1fr; align-items: center; gap: 0; margin-top: 16px; }
- .node {
- min-height: 96px; border: 1px solid var(--line); border-radius: 18px;
- background: rgba(255,255,255,0.92); padding: 14px 12px;
- display: flex; flex-direction: column; justify-content: center; text-align: center;
- }
- .node strong { color: var(--ink); font-size: 18px; font-weight: 650; margin-bottom: 5px; }
- .node span { color: var(--muted); font-size: 13px; line-height: 1.25; }
- .arrow { text-align: center; font-size: 36px; line-height: 1; color: var(--cyan); font-weight: 300; }
- .under-arch { margin-top: 20px; display: grid; grid-template-columns: 1.4fr 0.9fr 1fr; gap: 18px; align-items: center; }
- .gateway { border: 1px solid rgba(43,31,153,0.2); background: rgba(43,31,153,0.03); border-radius: 20px; padding: 20px; text-align: center; }
- .gateway strong { color: var(--indigo); font-size: 24px; font-weight: 650; }
- /* ── Guardrails ── */
- .guardrails { margin-top: 20px; display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; }
- .guard {
- border-radius: 16px; border: 1px solid rgba(43,31,153,0.16); padding: 16px 18px;
- color: var(--indigo); background: rgba(255,255,255,0.82); font-size: 17px; font-weight: 600; text-align: center;
- }
- /* ── Bottom line ── */
- .bottom-line {
- margin-top: 14px; border-radius: 16px; background: rgba(43,31,153,0.04);
- border: 1px solid rgba(43,31,153,0.12); padding: 13px 18px;
- display: flex; align-items: center; justify-content: space-between; gap: 20px;
- }
- .bottom-line strong { font-size: 18px; line-height: 1.25; color: var(--ink); }
- .bottom-line span { color: var(--muted); font-size: 13px; line-height: 1.35; font-weight: 450; max-width: 420px; }
- /* ── FAQ ── */
- .faq-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; margin-top: 16px; }
- .faq-item { border: 1px solid var(--line); border-radius: 16px; background: #fff; padding: 16px 18px; }
- .faq-item .q { font-size: 15px; font-weight: 700; color: var(--indigo); margin-bottom: 6px; }
- .faq-item .a { font-size: 14px; color: var(--muted); line-height: 1.45; }
- /* ── Phase cards ── */
- .phase-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; margin-top: 10px; }
- .phase {
- border: 1px solid var(--line); border-radius: 18px; background: rgba(255,255,255,0.9);
- padding: 14px 13px; min-height: 174px;
- }
- .phase .num { display: inline-flex; width: 32px; height: 32px; border-radius: 10px; align-items: center; justify-content: center; background: var(--indigo); color: #fff; font-weight: 800; margin-bottom: 10px; font-size: 16px; }
- .phase h3 { font-size: 16px; font-weight: 650; color: var(--ink); margin-bottom: 6px; }
- .phase p { font-size: 12px; color: var(--muted); line-height: 1.32; }
- /* ── Golden quotes ── */
- .golden { margin-top: 10px; display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
- .gq { border-radius: 12px; padding: 10px 12px; font-size: 13px; font-weight: 600; line-height: 1.25; text-align: center; display: flex; align-items: center; justify-content: center; }
- .gq:nth-child(odd) { background: rgba(58,212,216,0.1); color: #1a5c5e; border: 1px solid rgba(58,212,216,0.2); }
- .gq:nth-child(even) { background: rgba(43,31,153,0.06); color: var(--indigo); border: 1px solid rgba(43,31,153,0.12); }
- /* ── Check table ── */
- .checklist { margin-top: 10px; display: grid; grid-template-columns: 1fr 1fr; gap: 9px; }
- .cl-item { border: 1px solid var(--line); border-radius: 14px; background: #fff; padding: 10px 12px; display: flex; gap: 8px; align-items: flex-start; }
- .cl-item .num { min-width: 28px; height: 28px; border-radius: 8px; background: rgba(43,31,153,0.08); color: var(--indigo); display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: 14px; }
- .cl-item div { font-size: 13px; line-height: 1.3; color: #26313d; }
- /* ── Section label ── */
- .sect { font-size: 16px; font-weight: 700; color: var(--indigo); margin: 14px 0 8px; display: flex; align-items: center; gap: 8px; }
- .sect::before { content: ""; width: 4px; height: 18px; border-radius: 2px; background: var(--cyan); }
- /* ── Highlight box ── */
- .hl-box { border-radius: 14px; padding: 12px 15px; margin-top: 10px; border: 1px solid rgba(58,212,216,0.3); background: var(--green-soft); font-size: 13px; line-height: 1.35; color: #1a5c5e; font-weight: 500; }
- .hl-box.warn { border-color: rgba(220,38,38,0.22); background: var(--warn-soft); color: #991b1b; }
- .hl-box.indigo { border-color: rgba(43,31,153,0.14); background: rgba(43,31,153,0.03); color: var(--ink); }
- /* ── Mini flow ── */
- .mini-flow { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin: 12px 0; font-size: 14px; color: var(--muted); }
- .mini-flow .mf-node { padding: 6px 10px; border-radius: 8px; background: rgba(255,255,255,0.9); border: 1px solid var(--line); font-weight: 500; color: #26313d; white-space: nowrap; }
- .mini-flow .mf-arrow { color: var(--cyan); font-weight: 600; }
- .vertical-flow { display: grid; gap: 7px; margin-top: 12px; justify-items: stretch; }
- .vertical-flow .vf-node {
- border: 1px solid var(--line); background: rgba(255,255,255,0.92); border-radius: 12px;
- padding: 8px 12px; text-align: center; font-size: 13px; font-weight: 560;
- color: #26313d; line-height: 1.25;
- }
- .vertical-flow .vf-node.primary {
- border-color: rgba(43,31,153,0.25); background: rgba(43,31,153,0.035); color: var(--indigo);
- }
- .vertical-flow .vf-arrow { color: var(--cyan); text-align: center; font-size: 18px; line-height: 1; }
- .mcp-lane {
- display: grid;
- grid-template-columns: 58px 1fr;
- gap: 10px;
- align-items: stretch;
- margin-top: 12px;
- }
- .mcp-lane-label {
- writing-mode: vertical-rl;
- text-orientation: mixed;
- display: flex;
- align-items: center;
- justify-content: center;
- border: 1px solid rgba(43,31,153,0.18);
- background: rgba(43,31,153,0.045);
- color: var(--indigo);
- border-radius: 14px;
- font-size: 13px;
- font-weight: 680;
- letter-spacing: 0;
- }
- .mcp-lane .vertical-flow { margin-top: 0; }
- .risk-flow { display: grid; gap: 8px; margin: 12px 0; }
- .risk-flow .risk-node {
- background: rgba(220,38,38,0.045); border: 1px dashed rgba(220,38,38,0.28);
- border-radius: 12px; padding: 9px 12px; text-align: center; font-size: 13px;
- line-height: 1.35; color: #7f1d1d; font-weight: 560;
- }
- .risk-flow .risk-arrow { text-align: center; color: var(--warn); font-size: 20px; line-height: 1; }
- .risk-points { display: grid; gap: 8px; margin-top: 12px; }
- .risk-point {
- border: 1px solid rgba(220,38,38,0.18); background: rgba(255,255,255,0.78);
- border-radius: 12px; padding: 10px 12px; color: #7f1d1d;
- font-size: 13px; line-height: 1.38; font-weight: 500;
- }
- .risk-point strong { display: block; color: var(--warn); margin-bottom: 3px; font-weight: 650; }
- .status-table { display: grid; gap: 7px; margin-top: 12px; }
- .status-row {
- display: grid; grid-template-columns: 68px 1fr; gap: 8px; align-items: stretch;
- border: 1px solid rgba(58,212,216,0.22); background: rgba(255,255,255,0.78);
- border-radius: 12px; padding: 8px;
- }
- .status-row strong {
- display: flex; align-items: center; justify-content: center; color: #1a6b6e;
- background: rgba(58,212,216,0.12); border-radius: 9px; font-size: 12px; font-weight: 650;
- }
- .status-row span { color: #26313d; font-size: 13px; line-height: 1.35; font-weight: 520; }
- .compact-line { padding: 12px 16px; margin-top: 12px; }
- .compact-line strong { font-size: 17px; }
- .compact-line span { font-size: 13px; max-width: 560px; }
- @media (min-width: 1600px) and (min-height: 1000px) {
- body { padding: 8px 18px; }
- .stage { width: min(1500px, calc(100vw - 56px)); height: calc(100vh - 16px); }
- .topbar { padding: 24px 44px 0 58px; }
- .tabs { padding: 20px 44px 0 58px; gap: 10px; }
- .tab { padding: 10px 8px; font-size: 13px; border-radius: 13px; }
- h1 { font-size: clamp(28px, 2.25vw, 38px); line-height: 1.12; max-width: 1060px; }
- .meeting-card { flex-basis: 300px; min-height: 112px; padding: 17px 21px; }
- .meeting-card strong { font-size: 20px; }
- .meeting-card span { font-size: 14px; line-height: 1.55; }
- .content { height: calc(100% - 172px); padding: 26px 44px 34px 58px; }
- .scene.active { justify-content: center; gap: 18px; }
- .quote {
- font-size: clamp(28px, 2.25vw, 38px);
- line-height: 1.26;
- margin-bottom: 18px;
- max-width: 1360px;
- }
- .split2 { gap: 24px; margin-top: 12px; }
- .split3 { gap: 20px; margin-top: 12px; }
- .split2-1 { gap: 24px; margin-top: 12px; }
- .overview-layout { gap: 24px; margin-top: 12px; }
- .overview-card { min-height: 480px; padding: 20px 24px; }
- .overview-head { min-height: 72px; }
- .overview-card table { font-size: 13.2px; }
- .overview-card th, .overview-card td { padding: 5px 9px; line-height: 1.18; }
- .overview-footer { height: 64px; padding: 9px 14px; font-size: 13px; line-height: 1.34; margin-top: auto; }
- .card { padding: 24px 26px; border-radius: 22px; }
- .card h3 { font-size: 25px; line-height: 1.25; margin-bottom: 12px; }
- .card .tag { font-size: 13px; padding: 6px 12px; margin-bottom: 12px; }
- .items { gap: 9px; }
- .items li { font-size: 15.5px; line-height: 1.58; padding: 7px 0; gap: 10px; }
- table { font-size: 16px; margin-top: 20px; }
- th, td { padding: 10px 14px; line-height: 1.36; }
- th { font-size: 14px; }
- .hl-box { font-size: 15px; line-height: 1.55; padding: 15px 18px; margin-top: 14px; }
- .bottom-line { padding: 17px 22px; margin-top: 20px; }
- .bottom-line strong { font-size: 20px; line-height: 1.35; }
- .bottom-line span { font-size: 14.5px; line-height: 1.48; max-width: 520px; }
- .golden { gap: 12px; margin-top: 18px; }
- .gq { padding: 14px 16px; font-size: 15px; line-height: 1.35; }
- .arch { margin-top: 18px; }
- .node { min-height: 112px; padding: 16px 14px; }
- .node strong { font-size: 19px; }
- .node span { font-size: 14px; line-height: 1.38; }
- .under-arch { margin-top: 22px; gap: 20px; }
- .gateway { padding: 22px; }
- .vertical-flow { gap: 10px; margin-top: 18px; }
- .vertical-flow .vf-node { padding: 11px 14px; font-size: 14.5px; line-height: 1.42; }
- .vertical-flow .vf-arrow { font-size: 20px; }
- .risk-flow { gap: 10px; margin: 16px 0; }
- .risk-flow .risk-node { padding: 12px 14px; font-size: 14.5px; line-height: 1.48; }
- .risk-point { padding: 12px 14px; font-size: 14px; line-height: 1.48; }
- .split3 > .card { min-height: 355px; }
- .status-table { gap: 9px; margin-top: 16px; }
- .status-row { grid-template-columns: 76px 1fr; padding: 10px; }
- .status-row strong { font-size: 13px; }
- .status-row span { font-size: 14.2px; line-height: 1.45; }
- .compact-line { padding: 13px 18px; margin-top: 14px; }
- .compact-line strong { font-size: 18px; }
- .compact-line span { font-size: 13.5px; line-height: 1.42; max-width: 620px; }
- .arch-layout .card { padding: 21px 24px; }
- .arch-layout .card h3 { font-size: 23px; margin-bottom: 10px; }
- .arch-layout .node { min-height: 94px; padding: 12px 10px; }
- .arch-layout .node strong { font-size: 18px; }
- .arch-layout .node span { font-size: 13px; line-height: 1.32; }
- .arch-layout .vertical-flow { gap: 7px; margin-top: 13px; }
- .arch-layout .vertical-flow .vf-node { padding: 8px 12px; font-size: 13.5px; line-height: 1.32; }
- .arch-layout .vertical-flow .vf-arrow { font-size: 18px; }
- .arch-layout .mcp-lane { grid-template-columns: 58px 1fr; gap: 10px; margin-top: 13px; }
- .arch-layout .mcp-lane .vertical-flow { margin-top: 0; }
- .arch-layout .under-arch { margin-top: 15px; gap: 14px; }
- .arch-layout .gateway { padding: 16px; }
- .arch-layout .gateway strong { font-size: 22px; }
- .arch-layout .risk-flow { gap: 7px; margin: 12px 0; }
- .arch-layout .risk-flow .risk-node { padding: 9px 12px; font-size: 13.5px; line-height: 1.38; }
- .arch-layout .risk-point { padding: 9px 12px; font-size: 13.2px; line-height: 1.38; }
- .arch-layout .hl-box { padding: 11px 14px; font-size: 13.8px; line-height: 1.42; }
- .bcard { padding: 24px 26px; font-size: 16px; line-height: 1.55; }
- .value-layout { grid-template-columns: 390px 1fr; gap: 24px; margin-top: 12px; }
- .value-menu { gap: 10px; }
- .value-btn { min-height: 82px; padding: 13px 14px; font-size: 14px; line-height: 1.38; border-radius: 14px; grid-template-columns: 34px 1fr; gap: 10px; }
- .value-index { width: 34px; height: 34px; border-radius: 11px; font-size: 13px; }
- .value-detail { min-height: 500px; padding: 34px 38px 34px 46px; border-radius: 22px; }
- .value-detail h2 { font-size: 31px; line-height: 1.25; margin-bottom: 18px; max-width: 820px; }
- .value-detail p { font-size: 17px; line-height: 1.68; margin-bottom: 22px; }
- .value-points { gap: 12px; }
- .value-point { min-height: 84px; padding: 15px 17px; font-size: 15px; line-height: 1.5; }
- .chain { gap: 14px; margin-top: 18px; }
- .step { min-height: 126px; padding: 16px 15px; gap: 8px; }
- .step strong { font-size: 17px; line-height: 1.28; }
- .step span { font-size: 13.5px; line-height: 1.45; }
- .phase-grid { gap: 16px; margin-top: 14px; }
- .phase { min-height: 220px; padding: 20px 18px; }
- .phase h3 { font-size: 18px; line-height: 1.35; margin-bottom: 8px; }
- .phase p { font-size: 13.5px; line-height: 1.5; }
- .checklist { gap: 12px; margin-top: 14px; }
- .cl-item { padding: 13px 15px; gap: 10px; }
- .cl-item div { font-size: 14px; line-height: 1.45; }
- .module-layout .card { padding: 21px 22px; }
- .module-layout .card h3 { font-size: 23px; margin-bottom: 9px; }
- .module-layout .sect { margin: 10px 0 6px; font-size: 15px; }
- .module-layout .items { gap: 5px; }
- .module-layout .items li { font-size: 14px; line-height: 1.35; padding: 4px 0; }
- .module-layout .vertical-flow { gap: 7px; margin-top: 12px; }
- .module-layout .vertical-flow .vf-node { padding: 8px 12px; font-size: 13.5px; line-height: 1.28; }
- .module-layout .vertical-flow .vf-arrow { font-size: 16px; }
- .module-layout table { margin-top: 8px; font-size: 13.5px; }
- .module-layout th, .module-layout td { padding: 6px 8px; line-height: 1.22; }
- .module-layout .mini-flow { margin-top: 8px; gap: 5px; font-size: 12.5px; }
- .module-layout .mf-node { padding: 5px 7px; }
- .module-layout .hl-box { padding: 10px 12px; font-size: 13.2px; line-height: 1.34; margin-top: 9px; }
- .landing-grid { gap: 12px; margin-top: 8px; }
- .landing-grid .phase { min-height: 188px; padding: 15px 14px; }
- .landing-grid .phase .num { width: 28px; height: 28px; font-size: 14px; margin-bottom: 7px; }
- .landing-grid .phase h3 { font-size: 16px; margin-bottom: 5px; }
- .landing-grid .phase p { font-size: 12.5px; line-height: 1.38; }
- .landing-checklist { gap: 9px; margin-top: 10px; }
- .landing-checklist .cl-item { padding: 9px 11px; }
- .landing-checklist .cl-item div { font-size: 12.8px; line-height: 1.32; }
- .landing-sample { padding: 11px 14px; font-size: 13.2px; line-height: 1.38; margin-top: 10px; }
- .faq-grid { gap: 18px; margin-top: 18px; }
- .faq-item { padding: 20px 22px; }
- .faq-item .q { font-size: 16px; margin-bottom: 10px; }
- .faq-item .a { font-size: 15px; line-height: 1.55; }
- }
- </style>
- </head>
- <body>
- <div class="stage">
- <div class="topbar">
- <div>
- <div class="kicker"><span class="dot-row"><span></span><span></span><span></span></span>医梦 × 深信服 FastGPT 医疗智能体联合方案</div>
- <h1><span class="term">FastGPT</span> AI 能力底座 + <span class="term">医梦</span> 医疗智能体控制层</h1>
- </div>
- <div class="meeting-card">
- <strong>今日目标</strong>
- <span>展示联合方案全景:<br/>FastGPT 承载 AI 能力底座,医梦承接医疗智能体落地闭环。</span>
- </div>
- </div>
- <!-- 8 Tabs -->
- <div class="tabs" id="tabBar"></div>
- <!-- Content scenes -->
- <section class="content" id="sceneContainer"></section>
- </div>
- <script>
- // ═══════════════════════════════════════════
- // DATA
- // ═══════════════════════════════════════════
- const TAB_LABELS = ['① 总判断','② 技术架构','③ 协作边界','④ 模块分工','⑤ 业务流程','⑥ 八大价值','⑦ 落地途径','⑧ 协作原则'];
- const values = [
- { title:'1. 从通用Agent平台变成医疗可交付系统',
- text:'FastGPT 已经能搭 Agent,但医院买的不是“会生成回答”的平台,而是能进业务系统、能被医生确认、能被患者理解、能被甲方验收的场景。医梦补的是医疗 Agent 落地最后一公里,但这一公里工作非常多、非常碎。',
- points:['把报告解读、慢病、挂号导诊拆成可交付场景','设计任务状态机、确认点、异常兜底和验收指标','推动医院及厂商完成接口、数据、权限和流程整合','把 Demo 变成医院可上线、可验收、可复制的场景包'] },
- { title:'2. 掌握医疗业务接口语义',
- text:'医院接口不是普通 REST API。HIS、LIS、EMR、慢病和物联系统背后都有业务状态、权限规则、厂商差异和审计责任。医梦的价值是把这些“医院黑盒接口”翻译成 FastGPT 可安全调用的医疗工具。',
- points:['查报告要判断审核、作废、危急值、可见范围','锁号要处理身份、重复锁号、超时释放、支付补偿','慢病任务要区分草案、医生确认、居民下发','医梦 MCP Gateway 把非标接口封装成受控标准工具'] },
- { title:'3. 负责医疗安全边界',
- text:'医疗输出不是越完整越好,也不是越像医生越好。患者端不能自动诊断、不能自动开药、不能制造恐慌;医生端又要保留专业结构和依据。这里需要一层医疗安全规则,而不是只靠 Prompt。',
- points:['禁止自动诊断、自动处方和越权建议','患者端做通俗化和风险提示,医生端保留专业摘要','危急值、用药、高风险内容进入医生确认或转人工','输出做 Schema 校验、风险分层和审计留痕'] },
- { title:'4. 拥有医疗知识库工程能力',
- text:'FastGPT 可以跑知识库,但医疗知识库的难点在“怎么拆、怎么写、谁审核、怎么迭代”。上传指南只能得到泛泛回答,真正可用的知识库要被拆成医学规则、患者表达、医生模板、禁止表达和反馈优化池。',
- points:['血常规拆成指标解释、异常组合、风险分层、趋势分析','慢病拆成饮食、运动、用药、复诊、危险信号规则','维护患者端表达、医生端模板、禁止表达和审核流程','医梦维护源资产,审核后同步 FastGPT 运行副本'] },
- { title:'5. 设计医生反馈闭环',
- text:'医疗场景里,点赞点踩不够。真正有价值的是医生有没有采纳、改了哪句话、哪个指标解释错了、是否漏了异常、是否有风险。医梦把这些反馈结构化,才能持续优化知识库和流程。',
- points:['记录采纳率、修改率、风险标注和错误类型','反馈关联指标、文本段落、知识条目、模型和流程版本','医生修正文案进入知识库源资产和 Prompt 优化池','形成医疗场景 Benchmark,支撑专病和持续运营'] },
- { title:'6. 用Card Runtime承接关键动作',
- text:'医疗 Agent 不能只输出一段聊天文本。挂号、报告解读、慢病任务、随访计划都需要卡片承接,因为卡片能表达状态、确认动作、过期时间、审计记录和后续写操作。',
- points:['报告异常摘要卡、患者通俗解读卡、医生反馈卡','慢病任务草案卡、医生审核卡、随访风险提醒卡','卡片动作绑定幂等、过期、审计和状态流转','医生或患者确认后,才进入医院系统写操作'] },
- { title:'7. 包装成甲方可采购的场景包',
- text:'医院不会采购“一个很强的 Workflow 节点”,医院采购的是报告解读、慢病管理、导诊分诊这类明确场景。医梦把平台能力翻译成医院能理解、能试点、能验收、能复制的场景包。',
- points:['每个场景包包含流程、工具、知识库、卡片和风险规则','提供 Prompt 模板、Card Schema、测试用例和验收指标','定义解析成功率、医生采纳率、严重错误率、追溯能力','把平台能力变成可采购、可交付、可复制的方案'] },
- { title:'8. 补齐医疗商业化计量',
- text:'Token 和调用量只能说明 AI 成本,不能说明医疗服务价值。医院项目后续要运营,就要按医院、科室、医生、患者端、报告类型、场景包、采纳率和质量评分计量。',
- points:['按医院、科室、医生、患者端和医生端统计','按智能体、设备、报告类型、任务类型归因','结合采纳率、修改率、任务生成量和服务包转化','支撑能力值、场景包授权、知识库建设和运营服务费'] }
- ];
- // ═══════════════════════════════════════════
- // RENDER
- // ═══════════════════════════════════════════
- function h(tag, attrs, ...children) {
- const el = document.createElement(tag);
- if (attrs) Object.entries(attrs).forEach(([k,v]) => { if (v !== undefined) el.setAttribute(k,v); });
- children.forEach(c => { if (c != null) el.append(typeof c === 'string' ? document.createTextNode(c) : c); });
- return el;
- }
- function renderTabBar() {
- const bar = document.getElementById('tabBar');
- bar.innerHTML = TAB_LABELS.map((l,i) =>
- `<button class="tab${i===0?' active':''}" data-idx="${i}">${l}</button>`
- ).join('');
- bar.querySelectorAll('.tab').forEach(btn => {
- btn.addEventListener('click', () => showScene(Number(btn.dataset.idx)));
- });
- }
- function renderScenes() {
- const container = document.getElementById('sceneContainer');
- const scenes = [
- scene01(), scene02(), scene03(), scene04(),
- scene05(), scene06(), scene07(), scene08()
- ];
- scenes.forEach((html, i) => {
- const article = document.createElement('article');
- article.id = 'scene-' + i;
- article.className = 'scene' + (i === 0 ? ' active' : '');
- article.innerHTML = html;
- container.appendChild(article);
- });
- // Init value panel in scene 5
- initValuePanel();
- }
- /* ── Scene 1: 总判断 ── */
- function scene01() {
- return `
- <div class="quote">先把合作全景说清楚:<span class="c-indigo">医梦负责医疗控制层</span>,<span class="c-cyan">深信服负责 AI 与基础设施底座</span></div>
- <div class="overview-layout">
- <div class="card overview-card">
- <div class="overview-head">
- <span class="tag cyan">能力边界全景图</span>
- <h3>从入口到算力的分层协作</h3>
- </div>
- <div class="overview-body">
- <table style="font-size:14px">
- <colgroup>
- <col style="width:30%">
- <col style="width:52%">
- <col style="width:18%">
- </colgroup>
- <thead><tr><th>模块</th><th>产品 / 能力</th><th>主责</th></tr></thead>
- <tbody>
- <tr><td>客户端</td><td>统一入口、智能体入口能力增强</td><td class="own emoon">医梦</td></tr>
- <tr><td>权限、路由、CARD</td><td>AI 中台:身份权限、场景路由、医疗卡片</td><td class="own emoon">医梦</td></tr>
- <tr><td rowspan="3">智能体构建客户端</td><td>Workflow Build Service:医疗流程设计、确认点、输出结构</td><td class="own emoon">医梦</td></tr>
- <tr><td>Workflow Panel:工作流画布面板</td><td class="own sangfor">深信服</td></tr>
- <tr><td>FastGPT:模型、RAG、工具调用能力</td><td class="own sangfor">深信服</td></tr>
- <tr><td>智能体构建服务端</td><td>MCP Server、医疗工具网关、知识库源资产</td><td class="own emoon">医梦</td></tr>
- <tr><td>负载均衡</td><td>AGI 调度、平台运行、资源编排</td><td class="own sangfor">深信服</td></tr>
- <tr><td>GPU</td><td>超融合、算力、安全、私有化部署</td><td class="own sangfor">深信服</td></tr>
- </tbody>
- </table>
- <div class="overview-footer cyan"><strong>分工原则</strong>医梦承接医疗控制层和医院侧复杂度;深信服承接 FastGPT、AGI 调度、算力和私有化底座。</div>
- </div>
- </div>
- <div class="card overview-card mode">
- <div class="overview-head">
- <span class="tag indigo">合作模式</span>
- <h3>FastGPT 进入医疗场景,需要医疗控制层承接</h3>
- </div>
- <div class="overview-body">
- <ul class="items" style="margin-top:0">
- <li><span class="check">✓</span> 医梦承接统一入口、身份权限、场景路由和 Card 交互,保证医患端体验一致。</li>
- <li><span class="check">✓</span> 医梦定义医疗 Workflow、MCP Server、医院接口语义和知识库源资产。</li>
- <li><span class="check">✓</span> 深信服提供 FastGPT、AGI 调度、GPU、超融合、安全和私有化平台能力。</li>
- <li><span class="check">✓</span> FastGPT 不直接面对医院业务,而是通过医梦医疗控制层执行 AI 子流程。</li>
- </ul>
- <div class="overview-footer"><strong>适配原则</strong>医梦已有自研 AI 引擎并支持 Dify;本次联合方案优先适配 FastGPT。</div>
- </div>
- </div>
- </div>
- <div class="bottom-line" style="margin-top:18px">
- <strong>一句话:深信服提供 AI 运行底座与基础设施,医梦提供医疗智能体控制层</strong>
- <span>医疗场景不是只搭通用引擎,还需要权限、脱敏、审计、安全、医生确认、患者端表达和业务状态闭环。</span>
- </div>
- <div class="golden" style="margin-top:16px">
- <div class="gq">"FastGPT 承载 AI 子流程,医梦承接医疗主流程"</div>
- <div class="gq">"深信服保持平台通用性,医梦承接医疗行业复杂度"</div>
- </div>`;
- }
- /* ── Scene 2: 技术架构 ── */
- function scene02() {
- return `
- <div class="quote">用户入口、医院系统与 FastGPT 通过<span class="c-indigo">医梦医疗控制层</span>完成协作</div>
- <div class="split2 arch-layout">
- <div class="card green">
- <span class="tag green">✓ 推荐架构</span>
- <h3>医梦承接医疗主链路,FastGPT 承接 AI 子流程</h3>
- <div class="arch" style="grid-template-columns:1fr 40px 1fr 40px 1fr 40px 1fr;margin-top:14px">
- <div class="node"><strong>用户入口</strong><span>患者端/医生端/设备端</span></div>
- <div class="arrow" style="font-size:28px">→</div>
- <div class="node" style="border-color:rgba(43,31,153,0.25);background:rgba(43,31,153,0.03)"><strong>医梦统一入口</strong><span>身份·权限·场景判断</span></div>
- <div class="arrow" style="font-size:28px">→</div>
- <div class="node" style="border-color:rgba(43,31,153,0.25);background:rgba(43,31,153,0.03)"><strong>医梦控制层</strong><span>状态机·安全·Card</span></div>
- <div class="arrow" style="font-size:28px">→</div>
- <div class="node"><strong>FastGPT</strong><span>LLM·RAG·Workflow</span></div>
- </div>
- <div class="mcp-lane">
- <div class="mcp-lane-label">MCP 流程</div>
- <div class="vertical-flow">
- <div class="vf-node primary">医梦控制层</div>
- <div class="vf-arrow">↓</div>
- <div class="vf-node primary">医梦 MCP Gateway</div>
- <div class="vf-arrow">↓</div>
- <div class="vf-node">医院系统 HIS / LIS / EMR / 慢病 / 物联</div>
- <div class="vf-arrow">↓</div>
- <div class="vf-node primary">受控结果回传</div>
- </div>
- </div>
- <div class="under-arch" style="grid-template-columns:1fr 1fr">
- <div class="gateway"><strong>FastGPT Adapter</strong><br/><span style="font-size:14px;color:var(--muted)">标准输入输出、traceId、错误降级</span></div>
- <div class="node"><strong>医院系统</strong><span>HIS·LIS·EMR·慢病·物联</span></div>
- </div>
- <div class="hl-box" style="margin-top:14px">协作原则:用户体验、医疗业务状态和医院系统连接由医梦承接;FastGPT 通过标准 Adapter / Tool API 执行 AI 子流程。</div>
- </div>
- <div class="card warn">
- <span class="tag" style="background:rgba(220,38,38,0.10);color:var(--warn)">不推荐</span>
- <h3>FastGPT 直接承接医疗业务</h3>
- <div class="risk-flow">
- <div class="risk-node">用户端 / 医生端 / 医院系统</div>
- <div class="risk-arrow">↓</div>
- <div class="risk-node">通用 AI 平台直接面对医疗业务</div>
- <div class="risk-arrow">↓</div>
- <div class="risk-node">医疗状态、接口权限、医生反馈、患者输出分散处理</div>
- </div>
- <div class="hl-box warn"><strong>不推荐原因:</strong>医院接口差异、写操作审计、患者端安全表达、医生反馈闭环和知识库版本治理会被拆散,平台会被迫进入大量医疗实施细节,复制效率下降。</div>
- <div class="risk-points">
- <div class="risk-point"><strong>接口风险</strong>每家医院 HIS、LIS、EMR 和慢病系统差异很大,平台会从通用产品被拉进项目实施细节。</div>
- <div class="risk-point"><strong>医疗风险</strong>患者端表达、危急值、用药建议、医生确认点如果分散处理,安全责任和审计链路会变得不清晰。</div>
- <div class="risk-point"><strong>复制风险</strong>医生反馈、知识库版本和场景验收无法沉淀成统一闭环,后续医院复制成本会持续升高。</div>
- </div>
- </div>
- </div>`;
- }
- /* ── Scene 3: 协作边界 ── */
- function scene03() {
- return `
- <div class="quote">医疗项目需要清晰的<span class="c-indigo">数据、写操作、业务状态</span>协作边界</div>
- <div class="split3">
- <div class="card indigo">
- <span class="tag indigo">边界一</span>
- <h3>医疗数据安全</h3>
- <p style="color:var(--muted);font-size:15px;line-height:1.45;margin-bottom:10px">医疗数据包含患者身份、检验报告、诊断记录、病历、慢病标签、用药信息、物联数据、医生反馈,需要由医疗控制层统一做权限、脱敏和审计。</p>
- <div class="vertical-flow">
- <div class="vf-node">医院系统 HIS / LIS / EMR / 慢病 / 物联</div>
- <div class="vf-arrow">↓</div>
- <div class="vf-node primary">医梦 MCP Gateway</div>
- <div class="vf-arrow">↓</div>
- <div class="vf-node primary">权限校验 · 数据裁剪 · 脱敏 · 场景判断</div>
- <div class="vf-arrow">↓</div>
- <div class="vf-node">FastGPT 仅接收本次任务所需上下文</div>
- </div>
- <ul class="items" style="margin-top:8px">
- <li><span class="lock-icon">🔒</span> 权限校验 → 数据最小化 → 脱敏 → 场景判断 → 审计记录 → 风险分层</li>
- </ul>
- </div>
- <div class="card orange" style="border-color:rgba(43,31,153,0.14);background:var(--orange-soft)">
- <span class="tag orange">边界二</span>
- <h3>医疗写操作受控</h3>
- <p style="color:var(--muted);font-size:15px;line-height:1.45;margin-bottom:10px">挂号锁号、创建挂号订单、发起支付、建档、写入 EMR、发布慢病任务、创建随访计划等动作,应通过医梦控制层完成确认、幂等和审计。</p>
- <div class="vertical-flow">
- <div class="vf-node">FastGPT 生成候选建议</div>
- <div class="vf-arrow">↓</div>
- <div class="vf-node primary">医梦控制层校验场景、权限和风险</div>
- <div class="vf-arrow">↓</div>
- <div class="vf-node primary">Card Runtime 完成医生/患者确认</div>
- <div class="vf-arrow">↓</div>
- <div class="vf-node primary">MCP Gateway 执行幂等与审计</div>
- <div class="vf-arrow">↓</div>
- <div class="vf-node">医院系统写入或状态变更</div>
- </div>
- </div>
- <div class="card cyan">
- <span class="tag cyan">边界三</span>
- <h3>医疗业务状态在医梦</h3>
- <p style="color:var(--muted);font-size:15px;line-height:1.45;margin-bottom:10px">报告解读不是一次AI调用,而是完整状态流:</p>
- <div class="status-table">
- <div class="status-row"><strong>取数</strong><span>报告待查询 → OCR解析中</span></div>
- <div class="status-row"><strong>理解</strong><span>结构化完成 → 异常识别完成</span></div>
- <div class="status-row"><strong>输出</strong><span>医生端解读完成 → 患者端解读完成</span></div>
- <div class="status-row"><strong>闭环</strong><span>反馈待提交 → 知识库待优化</span></div>
- </div>
- <p style="color:var(--muted);font-size:14px;margin-top:10px">这些状态由医梦控制层统一管理,并把适合 AI 处理的子任务交给 FastGPT 执行。</p>
- </div>
- </div>
- <div class="bottom-line compact-line">
- <strong>FastGPT 承接 AI 子流程,医梦承接医疗主流程</strong>
- <span>三条边界的本质:医疗数据、写操作和业务状态需要在医疗控制层闭环;深信服侧 FastGPT 聚焦模型、RAG、Workflow 和工具调用运行。</span>
- </div>`;
- }
- /* ── Scene 4: 模块分工 ── */
- function scene04() {
- return `
- <div class="quote">三层边界:<span class="c-cyan">Workflow</span> · <span class="c-indigo">MCP/Tool</span> · 知识库</div>
- <div class="split3 module-layout">
- <div class="card">
- <span class="tag indigo">Workflow 怎么分</span>
- <h3>引擎 vs 设计</h3>
- <div class="sect" style="margin-top:12px">深信服 — Workflow 引擎</div>
- <ul class="items">
- <li><span class="check">✓</span> Workflow 画布、节点运行</li>
- <li><span class="check">✓</span> RAG节点、LLM节点、OCR节点</li>
- <li><span class="check">✓</span> 工具调用节点、运行日志、版本发布</li>
- </ul>
- <div class="sect">医梦 — 医疗 Workflow 设计</div>
- <ul class="items">
- <li><span class="check">✓</span> 中医舌诊流程、检验报告解读流程</li>
- <li><span class="check">✓</span> 分诊问诊、挂号槽位补全流程</li>
- <li><span class="check">✓</span> 医生确认点、患者确认点、高风险转人工点</li>
- <li><span class="check">✓</span> 卡片输出结构、医疗安全规则、验收用例</li>
- </ul>
- <div class="hl-box" style="margin-top:10px">"Workflow引擎用你们的,医疗Workflow的业务设计、模板和验收标准由医梦提供。"</div>
- </div>
- <div class="card">
- <span class="tag cyan">MCP / Tool 怎么分</span>
- <h3>调用能力 vs 工具语义</h3>
- <div class="vertical-flow">
- <div class="vf-node">FastGPT Workflow</div>
- <div class="vf-arrow">↓</div>
- <div class="vf-node">Tool Runtime</div>
- <div class="vf-arrow">↓</div>
- <div class="vf-node primary">医梦受控 API</div>
- <div class="vf-arrow">↓</div>
- <div class="vf-node primary">MCP Gateway</div>
- <div class="vf-arrow">↓</div>
- <div class="vf-node">医院系统</div>
- </div>
- <div class="hl-box indigo" style="margin-top:10px;font-size:14px">
- 协作原则:<br/>
- • 医院业务接口由医梦封装为受控工具<br/>
- • FastGPT 通过标准 Tool API 调用医疗能力<br/>
- • 医院接口账号、密钥和写权限由医梦控制层统一治理
- </div>
- </div>
- <div class="card">
- <span class="tag green">知识库怎么分</span>
- <h3>源资产 vs 运行副本</h3>
- <table style="margin-top:12px;font-size:14px">
- <thead><tr><th>内容</th><th>医梦</th><th>深信服</th></tr></thead>
- <tbody>
- <tr><td>源文件</td><td class="own">主责维护</td><td class="dim">接收运行副本</td></tr>
- <tr><td>医学规则</td><td class="own">主责维护</td><td class="dim">配合运行</td></tr>
- <tr><td>医生审核</td><td class="own">负责</td><td class="dim">配合</td></tr>
- <tr><td>向量化</td><td class="dim">提供源数据</td><td class="own">负责</td></tr>
- <tr><td>RAG检索</td><td class="dim">定义规则</td><td class="own">负责运行</td></tr>
- <tr><td>反馈迭代</td><td class="own">负责</td><td class="dim">接收新版本</td></tr>
- </tbody>
- </table>
- <div class="mini-flow" style="margin-top:10px">
- <span class="mf-node" style="border-color:rgba(43,31,153,0.25);background:rgba(43,31,153,0.03)">医梦维护源文件</span><span class="mf-arrow">→</span><span class="mf-node" style="border-color:rgba(43,31,153,0.25);background:rgba(43,31,153,0.03)">医学审核</span><span class="mf-arrow">→</span><span class="mf-node">发布版本</span><span class="mf-arrow">→</span><span class="mf-node">同步FastGPT</span><span class="mf-arrow">→</span><span class="mf-node">RAG检索</span><span class="mf-arrow">→</span><span class="mf-node" style="border-color:rgba(43,31,153,0.25);background:rgba(43,31,153,0.03)">医生反馈回医梦</span>
- </div>
- </div>
- </div>
- <div class="bottom-line compact-line">
- <strong>FastGPT 做知识库运行平台,医梦做医疗知识库源资产</strong>
- <span>医梦负责知识怎么拆、怎么写、怎么审核、怎么版本化、怎么根据医生反馈迭代;深信服负责向量化、检索和运行能力。</span>
- </div>`;
- }
- /* ── Scene 5: 业务流程 ── */
- function scene05() {
- return `
- <div class="quote">三条关键业务链路:医疗智能体不是聊天机器人,是<span class="c-indigo">可控的任务系统</span></div>
- <div class="split3" style="margin-top:12px">
- <div class="card indigo">
- <span class="tag indigo">链路一</span>
- <h3>中医舌诊智能体</h3>
- <div class="chain" style="grid-template-columns:repeat(3,1fr);margin-top:10px">
- <div class="step"><span class="idx">采集阶段</span><strong>舌象上传</strong><span>患者信息、主诉、舌象图片、项目编码统一入库</span></div>
- <div class="step"><span class="idx">诊断阶段</span><strong>AI辨识</strong><span>舌色、舌苔、舌形、关键特征、证候建议结构化输出</span></div>
- <div class="step"><span class="idx">交付阶段</span><strong>H5展示</strong><span>诊断详情、历史记录、医生查看、健康建议闭环</span></div>
- </div>
- <div class="hl-box" style="margin-top:10px;font-size:14px">
- <strong>关键协作点:</strong>医梦将患者基础信息、历史诊断、舌象图片和证候知识封装为标品 MCP Server,供 FastGPT 受控调用。
- </div>
- </div>
- <div class="card cyan">
- <span class="tag cyan">链路二</span>
- <h3>分诊挂号智能体</h3>
- <div class="chain" style="grid-template-columns:repeat(3,1fr);margin-top:10px">
- <div class="step"><span class="idx">识别阶段</span><strong>症状分诊</strong><span>主诉、年龄、性别、时间、部位和伴随症状结构化</span></div>
- <div class="step"><span class="idx">推荐阶段</span><strong>科室医生</strong><span>匹配科室、医生、号源、就诊时间并补充追问</span></div>
- <div class="step"><span class="idx">执行阶段</span><strong>挂号确认</strong><span>患者确认后锁号、订单、支付和成功卡片闭环</span></div>
- </div>
- <div class="hl-box warn" style="margin-top:10px;font-size:14px">
- <strong>关键协作点:</strong>医梦负责医院号源、锁号、订单和支付确认;FastGPT 负责意图理解、追问和推荐理由生成。
- </div>
- </div>
- <div class="card" style="border-color:rgba(43,31,153,0.14);background:var(--orange-soft)">
- <span class="tag orange">链路三</span>
- <h3>检验报告解读智能体</h3>
- <div class="chain" style="grid-template-columns:repeat(3,1fr);margin-top:10px">
- <div class="step"><span class="idx">取数阶段</span><strong>报告获取</strong><span>LIS报告、指标、参考区间、历史趋势和权限校验</span></div>
- <div class="step"><span class="idx">理解阶段</span><strong>异常解读</strong><span>异常组合、风险分层、医生端摘要和患者端表达</span></div>
- <div class="step"><span class="idx">闭环阶段</span><strong>反馈迭代</strong><span>医生采纳、修正、风险标注回流知识库源资产</span></div>
- </div>
- <div class="hl-box warn" style="margin-top:10px;font-size:14px">
- <strong>关键协作点:</strong>医梦负责 LIS 对接、权限脱敏和医患端差异化输出;FastGPT 负责结构化解读和语言生成。
- </div>
- </div>
- </div>
- <div class="bottom-line" style="margin-top:18px">
- <strong>通用平台链路:输入→意图→工具→回答</strong>
- <span>医梦控制层负责场景判断、权限、状态、卡片和医生确认;MCP Gateway 负责把患者基础信息、历史诊断、报告、号源等医院接口封装为受控工具。</span>
- </div>`;
- }
- /* ── Scene 6: 八大价值 ── */
- function scene06() {
- return `
- <div class="quote">医梦把 FastGPT 从"通用 Agent 平台"变成"<span class="c-indigo">医疗可交付系统</span>"</div>
- <div class="value-layout">
- <div class="value-menu" id="valueMenu"></div>
- <div class="value-detail">
- <h2 id="valueTitle"></h2>
- <p id="valueText"></p>
- <div class="value-points" id="valuePoints"></div>
- </div>
- </div>`;
- }
- function initValuePanel() {
- const menu = document.getElementById('valueMenu');
- const title = document.getElementById('valueTitle');
- const text = document.getElementById('valueText');
- const points = document.getElementById('valuePoints');
- if (!menu) return;
- let idx = 0;
- function setValue(i) {
- idx = i;
- const v = values[i];
- menu.querySelectorAll('.value-btn').forEach((b,j) => b.classList.toggle('active', j===i));
- title.textContent = v.title;
- text.textContent = v.text;
- points.innerHTML = v.points.map(p => `<div class="value-point">${p}</div>`).join('');
- }
- menu.innerHTML = values.map((v,i) =>
- `<button class="value-btn${i===0?' active':''}" data-idx="${i}"><span class="value-index">${String(i + 1).padStart(2,'0')}</span><span class="value-label">${v.title.replace(/^\d+\.\s*/,'')}</span></button>`
- ).join('');
- menu.querySelectorAll('.value-btn').forEach(b => {
- b.addEventListener('click', () => setValue(Number(b.dataset.idx)));
- });
- setValue(0);
- }
- /* ── Scene 7: 落地途径 ── */
- function scene07() {
- return `
- <div class="quote">落地策略:先用<span class="c-cyan">中医舌诊智能体</span>跑通联合样板</div>
- <div class="phase-grid landing-grid">
- <div class="phase">
- <span class="num">1</span>
- <h3>舌诊现有链路盘点</h3>
- <p>基于 emoon-tongue 已有 H5、内外部接口、签名校验、图片上传、患者信息、诊断详情和历史记录,快速确认可演示闭环。</p>
- <div style="margin-top:8px;font-size:13px;color:var(--muted)">交付:舌诊能力清单 · H5样板入口 · API清单 · 演示数据</div>
- </div>
- <div class="phase">
- <span class="num">2</span>
- <h3>FastGPT 适配舌诊</h3>
- <p>把患者基础信息、历史诊断、舌象图片和证候知识封装为标品 MCP Server,供 FastGPT 通过 MCP Gateway 受控调用。</p>
- <div style="margin-top:8px;font-size:13px;color:var(--muted)">交付:舌诊 MCP Server · FastGPT Adapter · 证候知识运行副本 · 输出Schema</div>
- </div>
- <div class="phase">
- <span class="num">3</span>
- <h3>医生端审核闭环</h3>
- <p>把舌诊结果封装为医生可读卡片,支持确认、修正、采纳和反馈,让 AI 输出进入医疗控制层而不是直接面向患者。</p>
- <div style="margin-top:8px;font-size:13px;color:var(--muted)">交付:医生审核卡 · 舌象详情卡 · 反馈字段 · 版本追溯</div>
- </div>
- <div class="phase">
- <span class="num">4</span>
- <h3>复制到多产品矩阵</h3>
- <p>以舌诊为首个成熟样板,再复制到分诊挂号、检验报告解读、慢病随访和院内智能服务,形成联合场景包。</p>
- <div style="margin-top:8px;font-size:13px;color:var(--muted)">交付:舌诊场景包 · 复制模板 · 联合方案PPT · 商务授权清单</div>
- </div>
- </div>
- <div class="sect">联合对接工作包</div>
- <div class="checklist landing-checklist">
- <div class="cl-item"><span class="num">1</span><div>舌诊 H5:复用现有页面入口,支持 projectId、patientId 直达详情。</div></div>
- <div class="cl-item"><span class="num">2</span><div>图片与记录:复用上传、MinIO、落盘路径、上传状态和推理状态。</div></div>
- <div class="cl-item"><span class="num">3</span><div>安全接口:保留内网快速演示接口和外部签名接口,适配医院集成。</div></div>
- <div class="cl-item"><span class="num">4</span><div>标品 MCP Server:封装患者基础信息、历史诊断、舌象图片和证候知识,供 FastGPT 受控调用。</div></div>
- <div class="cl-item"><span class="num">5</span><div>证候知识资产:医梦维护舌象证候关联、互斥规则和医生审核版本。</div></div>
- <div class="cl-item"><span class="num">6</span><div>医生反馈:采纳、修正、风险标注回流医梦知识库源资产。</div></div>
- <div class="cl-item"><span class="num">7</span><div>场景验收:围绕图片有效率、诊断结构完整率、医生采纳率建立指标。</div></div>
- <div class="cl-item"><span class="num">8</span><div>联合复制:舌诊样板跑通后,扩展分诊挂号、检验报告和慢病随访。</div></div>
- </div>
- <div class="hl-box landing-sample"><strong>首个联合样板:</strong>患者完成舌象采集 → 医梦 MCP Server 提供患者信息、历史诊断和舌象上下文 → FastGPT 生成解释与调理建议 → 医梦封装 H5/医生审核卡 → 医生反馈进入证候知识库迭代。</div>`;
- }
- /* ── Scene 8: 协作原则 ── */
- function scene08() {
- return `
- <div class="quote">双方各守优势,共同复制<span class="c-indigo">医疗AI联合解决方案</span></div>
- <div class="split2" style="margin-top:10px">
- <div class="card green">
- <span class="tag green">医梦主责</span>
- <h3>医疗智能体控制层</h3>
- <ul class="items" style="margin-top:8px">
- <li><span class="check">✓</span> 统一入口、身份权限、场景路由和医患端体验</li>
- <li><span class="check">✓</span> MCP Gateway 对接 HIS、LIS、EMR、慢病、物联</li>
- <li><span class="check">✓</span> 医疗任务状态、写操作确认、Card Runtime 和审计</li>
- <li><span class="check">✓</span> 知识库源资产、医疗模板、医生反馈和场景包</li>
- </ul>
- </div>
- <div class="card indigo">
- <span class="tag indigo">深信服主责</span>
- <h3>FastGPT AI 能力底座</h3>
- <ul class="items" style="margin-top:8px">
- <li><span class="check">✓</span> FastGPT 提供智能体构建、Workflow、Tool Runtime 和运行编排</li>
- <li><span class="check">✓</span> FastGPT 承载 RAG、向量化、检索、OCR、多模态和模型调用</li>
- <li><span class="check">✓</span> 深信服提供 GPU、超融合、私有化部署、安全和平台运维能力</li>
- <li><span class="check">✓</span> 平台日志、模型消耗、运行观测和知识库运行副本</li>
- </ul>
- </div>
- </div>
- <div class="sect">常见问题答疑</div>
- <div class="faq-grid">
- <div class="faq-item"><div class="q">Q: FastGPT 与医梦 MCP Gateway 如何协作?</div><div class="a">FastGPT 通过标准 Tool API 发起 AI 子流程所需调用;医梦 MCP Gateway 负责医院系统适配、权限校验、脱敏、幂等、审计和医疗工具语义。</div></div>
- <div class="faq-item"><div class="q">Q: 医梦为什么要掌握知识库和患者端输出?</div><div class="a">医梦维护医学知识源资产、审核流程、患者端表达、医生端模板和反馈迭代;FastGPT 承载运行副本、向量化、检索和 RAG 执行。</div></div>
- </div>
- <div class="bottom-line" style="margin-top:14px">
- <strong>深信服守住平台能力,医梦守住医疗闭环,双方才能形成可复制的医疗AI联合解决方案</strong>
- <span>联合方案的核心是 AI 能力底座 + 医疗控制层:一方提供通用 AI 运行能力,一方提供医疗行业落地能力。</span>
- </div>`;
- }
- // ═══════════════════════════════════════════
- // TAB SWITCHING
- // ═══════════════════════════════════════════
- let current = 0;
- function showScene(index) {
- current = index;
- document.querySelectorAll('.tab').forEach((t,i) => t.classList.toggle('active', i===index));
- document.querySelectorAll('.scene').forEach((s,i) => s.classList.toggle('active', i===index));
- }
- document.addEventListener('keydown', e => {
- const total = TAB_LABELS.length;
- if (e.key === 'ArrowRight') showScene((current+1) % total);
- if (e.key === 'ArrowLeft') showScene((current-1+total) % total);
- });
- // ═══════════════════════════════════════════
- // INIT
- // ═══════════════════════════════════════════
- renderTabBar();
- renderScenes();
- </script>
- </body>
- </html>
|