技术路线
按工作台 index.html 自上而下各区块,对应前端事件、HTTP 接口与服务层实现。
1. 页面骨架与静态资源
| 工作台对应 | 整页 docs-shell;三栏 doc-layout(左站点、中主栏、右本页目录) |
|---|---|
| 实现 | web/index.html 结构;样式 web/styles.css;逻辑 web/app.js;主题 web/docs-theme.js(本页仅加载主题脚本) |
| Flask 下发 | api_server.py:GET / 返回 index.html;GET /styles.css、GET /app.js 与根路径相对引用对齐 |
2. 顶下工具带(检索增强 · 会话指标)
| DOM | #useRag 复选框;#metricTotal、#metricHigh 数值 |
|---|---|
| 实现 | app.js 中 refreshToolbarMetrics():GET /api/performance,取 performance.total 与风险计数中高/紧急之和写入工具带 |
| 服务端 | api_server.py → build_performance_overview(session_store)(src/services/workbench_service.py) |
3. 语音接警(内部流水线)
| DOM | 警情编号/补充字、#ingestAudioFile、#ingestVoiceWorkbenchHint |
|---|---|
| 鉴权 | 若需 Bearer:可将令牌写入 localStorage.plice_internal_token(本页已不提供输入框),或由网关注入;请求头由 internalAuthOnlyHeaders() / internalRequestHeaders() 附带 Authorization、X-Caller-Service、X-Request-Id |
| 主流程 | initWorkbenchVoice() → 选文件后 runVoiceWorkbenchPipeline():POST /internal/v1/uploads(multipart/form-data,含 auto_process、auto_analyze、use_rag 及接警字段)→ 轮询 GET /internal/v1/media-jobs/{id} → 若有 analyze_job_id 则轮询 GET /internal/v1/jobs/{id} → applyLatestInternalAnalysis() 调 GET …/incidents/{id}/analyze/latest 取结构化结果并复用 renderAnalyzeResultFromApi() |
| 说明 | 工作台不展示 Canonical JSON;流程末仍会 GET /internal/v1/incidents/{id} 取 ASR 等字段回填报警原文。对接排错可直接调该 API。 |
| 后端入口 | api_server.py 注册 build_internal_blueprint(_ingest_service),前缀 /internal/v1(src/adapters/http/blueprint.py + IngestService) |
4. 警情输入与研判记录
| DOM | #exampleSelect、#alarmText、#analyzeBtn、#analyzeHint、#historyList |
|---|---|
| 文字研判 | 点击「开始研判」→ POST /api/analyze,JSON 体 { alarm_text, use_rag };成功则 renderAnalyzeResultFromApi() 更新摘要/风险/法律依据等,并 renderHistory() |
| 服务端 | analyze_alarm_with_bukong() → record_analysis();可选内联布控写入会话;snapshot_bukong_to_session();返回 markdown、bukong、officer_brief、history(接口仍可能含 disposal_nav,工作台页不展示) |
| 历史列表 | GET /api/history;refreshHistory() 在首屏与研判成功后调用 |
5. 研判结果、关键信息、法律依据
| DOM | #resultMeta、#missingHint、#workBukongHint、#summaryBox、#suggestionBox、#keyInfoBox、#work-bukong-output / #bukongBox、#lawBox |
|---|---|
| 实现 | renderAnalyzeResultFromApi() 拼表与摘要;renderKeyInfo();mergeBukongFromAnalyze() 根据 bukong 回填表单并写入 #bukongBox;接口 markdown 已含布控(merge_incident_and_bukong_markdown) |
| 数据形状 | 与 services/workbench_service 中研判结构化字段一致(警情类型、风险、摘要、处置建议、法律依据、关键信息等) |
研判记录总览(/judgments)
| 页面 | web/judgments.html、web/judgments.js;左侧窄栏为条目列表,右侧为与研判专页相同的 presentation 布局(共用 ar-presentation-render.js) |
|---|---|
| 列表数据 | GET /api/history?limit=120;前端将返回的 history 逆序后渲染为可点击条目 |
| 详情数据 | 点击条目后 GET /api/analysis-presentation/<analysis_id>,响应含 presentation、analysis_id、user_feedback,由 window.pliceArPresentation.renderAnalysisPresentation() 写入右侧 DOM |
研判专页置信度(模型自评 + 规则校准)
专页与总览右侧仅展示「置信度 N%」,不在界面展示下列长说明;数据仍写入 presentation.ai.confidence_provenance 供排障与审计。
| 实现 | src/services/analysis_confidence.py → build_confidence_bundle();研判落库时经 attach_confidence_bundle() 写入 result,再进入 presentation |
|---|---|
| 正常路径 |
方法 model_calibrated_blend:取模型自评分 analysis_confidence(整数 1–100)与规则校准分(考察关键信息完整度、报警原文长度、规程检索上下文、摘要/处置建议/法律依据等信号),按权重
0.42(模型)+ 0.58(规则)加权后取整并限制在约 22–96 区间。面向用户的原文案形如:「综合模型自评(例如 85%)与规则信号(例如 80%)加权得到;规则侧考察关键信息完整度、规程上下文与输出充实度。」(百分数为当次计算值,非固定)
|
| 模型说明 | 若模型返回 confidence_rationale,会写入 confidence_provenance.model_rationale;历史上前端曾将其以「(模型说明:…)」拼在置信度说明后,现已不在界面展示 |
| 无自评 | 方法 calibration_only:模型未输出 analysis_confidence 时,展示分为规则校准分;原文案说明以规则信号为主(关键信息、规程检索、摘要建议等) |
| 解析失败 | 方法 parse_fallback:JSON 解析失败时置信度保守压低,原文案提示务必人工复核 |
6. 布控(研判同次输出 + 可选校正)
| DOM | 主区 #work-bukong-output;可选折叠 #work-bukong-adjust 内含 #incidentBg、#suspectDesc、.js-bukong-ex、#bukongBtn、#downloadBukongBtn |
|---|---|
| 会话回填 | loadWorkbenchBukongSnapshot() → GET /api/session-snapshot,与研判返回的 bukong 共用会话态 |
| 手动重算 | POST /api/bukong;成功后 mergeLatestMarkdownWithBukong() 更新主下载用 Markdown |
| 下载 | 主按钮 incident_analysis.md(研判+布控);bukong_plan.md 为仅布控 |
7. 复核与导出
| DOM | 单选 reviewChoice、#reviewNote、#saveReviewBtn、#downloadMdBtn、#downloadJsonBtn、#reviewHint |
|---|---|
| 保存复核 | POST /api/review,JSON 含 review_choice、review_note、analysis_id、可选 incident_type_override(人工校正类别)→ build_review_record()、save_review_record() |
| 导出 | 研判 Markdown 来自内存态 state.latestMarkdown;复核 JSON 由当前表单与 state.latestResult 组装,均用 downloadText() 本地下载 |
8. 性能统计(独立页 /performance)
| DOM | web/performance.html 中 #sec-perf-main:五卡、风险条、耗时表、复核分布表、#perfScoreTable;web/performance.js 绑定 #refreshPerfBtn |
|---|---|
| 数据拉取 | 工作台 refreshToolbarMetrics() 与性能页 performance.js 共用 GET /api/performance;响应含 performance、risk_counts、elapsed_trend、review_distribution、scorecard |
| 服务端 | build_performance_overview、build_elapsed_trend、build_review_distribution;scorecard 由 api_server._build_scorecard() 组装评审维度行与布控计数 |
9. 关键源码索引
- Flask 与 REST:
api_server.py - 会话与研判/布控/绩效:
src/services/workbench_service.py - 专网内部 API:
src/adapters/http/blueprint.py、src/adapters/ingest/service.py - 性能统计专页:
web/performance.html、web/performance.js - 规格说明:
docs-md/04-说明/PRIVATE_NETWORK_ADAPTER_SPEC.md