# lishuangqiang/ai-meeting architecture

> Architecture diagram of the GitHub repository lishuangqiang/ai-meeting, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-29). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/lishuangqiang/ai-meeting
- Repository: https://github.com/lishuangqiang/ai-meeting

## Overview

码上面试平台是一个模块化单体后端，提供简历驱动的模拟面试、AI 对话、工作流智能体、语音媒体能力及用户认证。主流程从简历上传与解析、题目生成，进入多轮提问和答题评估，再形成面试记录与复盘；会话运行态支持恢复。README 描述了模型、工作流和语音集成能力；部分实现未采样，相关连线仅按文档明确的职责呈现。

Main entry points: [`admin/src/main/java/com/hewei/hzyjy/xunzhi/interview/api/InterviewSessionController.java`](https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/interview/api/InterviewSessionController.java) (面试接口), [`admin/src/main/java/com/hewei/hzyjy/xunzhi/interview/flow/answer/InterviewAnswerPipeline.java`](https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/interview/flow/answer/InterviewAnswerPipeline.java) (答题评估流程), [`admin/src/main/java/com/hewei/hzyjy/xunzhi/agent/api/AgentController.java`](https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/agent/api/AgentController.java) (智能体接口), [`admin/src/main/java/com/hewei/hzyjy/xunzhi/interview/application/runtime/InterviewSessionRuntimeRehydrateService.java`](https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/interview/application/runtime/InterviewSessionRuntimeRehydrateService.java) (运行态恢复)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_interview["模拟面试"]
  node_interview_api["面试接口"]
  node_resume["简历解析出题"]
  node_sessions["会话管理"]
  node_answer_orchestrator["答题编排"]
  node_answer_pipeline["答题评估流程"]
  node_followup_rules["追问裁决"]
  node_runtime_restore["运行态恢复"]
  node_runtime_snapshot["状态快照与回放"]
  node_interview_reports["记录与雷达报告"]
  node_interview_store[("面试数据存储")]
end

subgraph group_assistant["AI 对话"]
  node_ai_api["AI 对话接口"]
  node_ai_handler_factory["模型处理器选择"]
  node_ai_handler["统一模型处理器"]
  node_ai_messages["对话消息持久化"]
end

subgraph group_agents["智能体"]
  node_agent_api["智能体接口"]
  node_agent_properties["智能体配置"]
  node_agent_resolver["业务智能体解析"]
  node_agent_files["智能体会话附件"]
end

subgraph group_media["语音媒体"]
  node_media_ws["语音 WebSocket"]
  node_xunfei_audio["讯飞实时转写"]
end

subgraph group_identity["身份与权限"]
  node_auth_ws["WebSocket 鉴权"]
  node_login_sessions["登录会话"]
  node_current_user["当前用户服务"]
end

node_candidate(("候选人"))
node_redis[("Redis")]
node_mongodb[("MongoDB")]
node_model_provider{{"兼容模型服务"}}
node_workflow_provider{{"星云工作流服务"}}
node_xunfei{{"讯飞语音服务"}}

node_candidate -->|"发起面试请求"| node_interview_api
node_interview_api -->|"创建与管理"| node_sessions
node_interview_api -->|"上传简历"| node_resume
node_resume -->|"请求出题智能体"| node_agent_resolver
node_agent_resolver -->|"调用工作流"| node_workflow_provider
node_interview_api -->|"提交回答"| node_answer_orchestrator
node_answer_orchestrator -->|"执行答题流程"| node_answer_pipeline
node_answer_pipeline -->|"请求评分与追问"| node_agent_resolver
node_answer_pipeline -->|"裁决追问"| node_followup_rules
node_answer_pipeline -->|"确保运行态"| node_runtime_restore
node_runtime_restore -->|"恢复或保存状态"| node_runtime_snapshot
node_runtime_snapshot -->|"读写快照与回合"| node_mongodb
node_runtime_restore -->|"读写运行缓存"| node_redis
node_sessions -->|"读写会话"| node_interview_store
node_interview_api -->|"查询面试报告"| node_interview_reports
node_candidate -->|"发送对话"| node_ai_api
node_ai_api -->|"选择处理器"| node_ai_handler_factory
node_ai_handler_factory -->|"分派请求"| node_ai_handler
node_ai_handler -->|"流式模型调用"| node_model_provider
node_ai_api -->|"持久化与回溯消息"| node_ai_messages
node_ai_messages -->|"读写消息"| node_mongodb
node_candidate -->|"管理或对话"| node_agent_api
node_agent_api -->|"维护配置"| node_agent_properties
node_agent_api -->|"上传附件"| node_agent_files
node_agent_api -->|"发起工作流对话"| node_workflow_provider
node_candidate -->|"建立语音连接"| node_media_ws
node_media_ws -->|"校验连接身份"| node_auth_ws
node_media_ws -->|"转发音频流"| node_xunfei_audio
node_xunfei_audio -->|"实时识别"| node_xunfei
node_login_sessions -->|"验证令牌"| node_current_user

click node_interview_api "https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/interview/api/InterviewSessionController.java"
click node_resume "https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/interview/flow/extraction/InterviewQuestionExtractionService.java"
click node_sessions "https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/interview/service/InterviewSessionService.java"
click node_answer_orchestrator "https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/interview/flow/session/InterviewAgentOrchestrationService.java"
click node_answer_pipeline "https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/interview/flow/answer/InterviewAnswerPipeline.java"
click node_followup_rules "https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/interview/application/rule/InterviewFollowUpRuleService.java"
click node_runtime_restore "https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/interview/application/runtime/InterviewSessionRuntimeRehydrateService.java"
click node_runtime_snapshot "https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/interview/application/runtime/InterviewSessionRuntimeSnapshotService.java"
click node_interview_reports "https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/interview/flow/report/InterviewRecordServiceImpl.java"
click node_interview_store "https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/interview/dao/repository/InterviewSessionRepository.java"
click node_ai_api "https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/ai/api/AiMessageController.java"
click node_ai_handler_factory "https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/ai/service/chat/AiChatHandlerFactory.java"
click node_ai_handler "https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/ai/service/chat/UniversalAiChatHandler.java"
click node_ai_messages "https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/ai/infrastructure/persistence/AiMessageMongoPersistencePort.java"
click node_agent_api "https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/agent/api/AgentController.java"
click node_agent_properties "https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/agent/service/AgentPropertiesService.java"
click node_agent_resolver "https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/agent/application/BusinessAgentResolver.java"
click node_agent_files "https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/agent/service/AgentFileAssetService.java"
click node_media_ws "https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/common/config/WebSocketConfig.java"
click node_xunfei_audio "https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/media/infrastructure/integration/XunfeiAudioService.java"
click node_auth_ws "https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/auth/infrastructure/websocket/SaTokenWebSocketAuthService.java"
click node_login_sessions "https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/auth/infrastructure/satoken/SaTokenLoginSessionService.java"
click node_current_user "https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/auth/application/CurrentUserService.java"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_interview_api,node_resume,node_sessions,node_answer_orchestrator,node_answer_pipeline,node_followup_rules,node_runtime_restore,node_runtime_snapshot,node_interview_reports,node_interview_store toneBlue
class node_ai_api,node_ai_handler_factory,node_ai_handler,node_ai_messages,node_redis,node_mongodb toneAmber
class node_agent_api,node_agent_properties,node_agent_resolver,node_agent_files toneMint
class node_media_ws,node_xunfei_audio toneRose
class node_auth_ws,node_login_sessions,node_current_user,node_candidate,node_model_provider,node_workflow_provider,node_xunfei toneIndigo
```

## Components

### 模拟面试

- [面试接口](https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/interview/api/InterviewSessionController.java): `admin/src/main/java/com/hewei/hzyjy/xunzhi/interview/api/InterviewSessionController.java`
- [简历解析出题](https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/interview/flow/extraction/InterviewQuestionExtractionService.java): `admin/src/main/java/com/hewei/hzyjy/xunzhi/interview/flow/extraction/InterviewQuestionExtractionService.java`
- [会话管理](https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/interview/service/InterviewSessionService.java): `admin/src/main/java/com/hewei/hzyjy/xunzhi/interview/service/InterviewSessionService.java`
- [答题编排](https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/interview/flow/session/InterviewAgentOrchestrationService.java): `admin/src/main/java/com/hewei/hzyjy/xunzhi/interview/flow/session/InterviewAgentOrchestrationService.java`
- [答题评估流程](https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/interview/flow/answer/InterviewAnswerPipeline.java): `admin/src/main/java/com/hewei/hzyjy/xunzhi/interview/flow/answer/InterviewAnswerPipeline.java`
- [追问裁决](https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/interview/application/rule/InterviewFollowUpRuleService.java): `admin/src/main/java/com/hewei/hzyjy/xunzhi/interview/application/rule/InterviewFollowUpRuleService.java`
- [运行态恢复](https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/interview/application/runtime/InterviewSessionRuntimeRehydrateService.java): `admin/src/main/java/com/hewei/hzyjy/xunzhi/interview/application/runtime/InterviewSessionRuntimeRehydrateService.java`
- [状态快照与回放](https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/interview/application/runtime/InterviewSessionRuntimeSnapshotService.java): `admin/src/main/java/com/hewei/hzyjy/xunzhi/interview/application/runtime/InterviewSessionRuntimeSnapshotService.java`
- [记录与雷达报告](https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/interview/flow/report/InterviewRecordServiceImpl.java): `admin/src/main/java/com/hewei/hzyjy/xunzhi/interview/flow/report/InterviewRecordServiceImpl.java`
- [面试数据存储](https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/interview/dao/repository/InterviewSessionRepository.java): `admin/src/main/java/com/hewei/hzyjy/xunzhi/interview/dao/repository/InterviewSessionRepository.java`

### AI 对话

- [AI 对话接口](https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/ai/api/AiMessageController.java): `admin/src/main/java/com/hewei/hzyjy/xunzhi/ai/api/AiMessageController.java`
- [模型处理器选择](https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/ai/service/chat/AiChatHandlerFactory.java): `admin/src/main/java/com/hewei/hzyjy/xunzhi/ai/service/chat/AiChatHandlerFactory.java`
- [统一模型处理器](https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/ai/service/chat/UniversalAiChatHandler.java): `admin/src/main/java/com/hewei/hzyjy/xunzhi/ai/service/chat/UniversalAiChatHandler.java`
- [对话消息持久化](https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/ai/infrastructure/persistence/AiMessageMongoPersistencePort.java): `admin/src/main/java/com/hewei/hzyjy/xunzhi/ai/infrastructure/persistence/AiMessageMongoPersistencePort.java`

### 智能体

- [智能体接口](https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/agent/api/AgentController.java): `admin/src/main/java/com/hewei/hzyjy/xunzhi/agent/api/AgentController.java`
- [智能体配置](https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/agent/service/AgentPropertiesService.java): `admin/src/main/java/com/hewei/hzyjy/xunzhi/agent/service/AgentPropertiesService.java`
- [业务智能体解析](https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/agent/application/BusinessAgentResolver.java): `admin/src/main/java/com/hewei/hzyjy/xunzhi/agent/application/BusinessAgentResolver.java`
- [智能体会话附件](https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/agent/service/AgentFileAssetService.java): `admin/src/main/java/com/hewei/hzyjy/xunzhi/agent/service/AgentFileAssetService.java`

### 语音媒体

- [语音 WebSocket](https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/common/config/WebSocketConfig.java): `admin/src/main/java/com/hewei/hzyjy/xunzhi/common/config/WebSocketConfig.java`
- [讯飞实时转写](https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/media/infrastructure/integration/XunfeiAudioService.java): `admin/src/main/java/com/hewei/hzyjy/xunzhi/media/infrastructure/integration/XunfeiAudioService.java`

### 身份与权限

- [WebSocket 鉴权](https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/auth/infrastructure/websocket/SaTokenWebSocketAuthService.java): `admin/src/main/java/com/hewei/hzyjy/xunzhi/auth/infrastructure/websocket/SaTokenWebSocketAuthService.java`
- [登录会话](https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/auth/infrastructure/satoken/SaTokenLoginSessionService.java): `admin/src/main/java/com/hewei/hzyjy/xunzhi/auth/infrastructure/satoken/SaTokenLoginSessionService.java`
- [当前用户服务](https://github.com/lishuangqiang/ai-meeting/blob/main/admin/src/main/java/com/hewei/hzyjy/xunzhi/auth/application/CurrentUserService.java): `admin/src/main/java/com/hewei/hzyjy/xunzhi/auth/application/CurrentUserService.java`

### Other components

- **候选人**
- **Redis**
- **MongoDB**
- **兼容模型服务**
- **星云工作流服务**
- **讯飞语音服务**

## Connections

- 候选人 → 面试接口: 发起面试请求
- 面试接口 → 会话管理: 创建与管理
- 面试接口 → 简历解析出题: 上传简历
- 简历解析出题 → 业务智能体解析: 请求出题智能体
- 业务智能体解析 → 星云工作流服务: 调用工作流
- 面试接口 → 答题编排: 提交回答
- 答题编排 → 答题评估流程: 执行答题流程
- 答题评估流程 → 业务智能体解析: 请求评分与追问
- 答题评估流程 → 追问裁决: 裁决追问
- 答题评估流程 → 运行态恢复: 确保运行态
- 运行态恢复 → 状态快照与回放: 恢复或保存状态
- 状态快照与回放 → MongoDB: 读写快照与回合
- 运行态恢复 → Redis: 读写运行缓存
- 会话管理 → 面试数据存储: 读写会话
- 面试接口 → 记录与雷达报告: 查询面试报告
- 候选人 → AI 对话接口: 发送对话
- AI 对话接口 → 模型处理器选择: 选择处理器
- 模型处理器选择 → 统一模型处理器: 分派请求
- 统一模型处理器 → 兼容模型服务: 流式模型调用
- AI 对话接口 → 对话消息持久化: 持久化与回溯消息
- 对话消息持久化 → MongoDB: 读写消息
- 候选人 → 智能体接口: 管理或对话
- 智能体接口 → 智能体配置: 维护配置
- 智能体接口 → 智能体会话附件: 上传附件
- 智能体接口 → 星云工作流服务: 发起工作流对话
- 候选人 → 语音 WebSocket: 建立语音连接
- 语音 WebSocket → WebSocket 鉴权: 校验连接身份
- 语音 WebSocket → 讯飞实时转写: 转发音频流
- 讯飞实时转写 → 讯飞语音服务: 实时识别
- 登录会话 → 当前用户服务: 验证令牌
