| AI 对话发送图片/语音 |
上传媒体消息 |
POST |
/api/media |
前端交互与展示模块 |
对象存储模块 |
multipart:file, media_type, idempotency_key;user_id 从访问令牌取得 |
media_id, message_id, source_url, processing_status |
请求文件流、MinIO、media_assets、conversation_messages |
是:媒体、消息、运行记录 |
否;“发送”本身是用户明确操作 |
新增 media_assets;调整消息表 |
后端先校验声明,再创建 uploading 记录;边读取边校验、计算 SHA-256 并写 MinIO;成功后创建 processing 消息并异步投递 OCR/ASR。接口不等待模型,不创建时间业务事实 |
| 聊天回看图片/音频 |
获取媒体内容 |
GET |
/api/media/{media_id}/content |
前端交互与展示模块 |
对象存储模块 |
path:media_id;header:Range? |
二进制流、Content-Type, Content-Length, ETag, Accept-Ranges |
media_assets、MinIO |
否 |
否 |
依赖新增 media_assets |
后端从登录态取得 user_id,校验归属后流式读取;图片支持私有缓存,音频支持 206 Range;不返回 MinIO 地址或密钥 |
| 识别失败后的用户操作 |
重试媒体识别 |
POST |
/api/media/{media_id}/recognition/retry |
前端交互与展示模块 |
OCR 识别模块 / ASR 语音识别模块 |
path:media_id;body:message_id, idempotency_key |
message_id, processing_status, accepted_at |
media_assets、conversation_messages、agent_run_records |
是:运行摘要、消息状态 |
否;点击重试即明确操作 |
消息表需 processing_status |
只允许 failed 且可重试的消息;按 modality 路由识别;创建新运行摘要,不重复创建媒体和消息,不直接触发业务写入 |
| 对话页轮询识别结果 |
查询媒体消息状态 |
GET |
/api/messages/{message_id} |
前端交互与展示模块 |
基础业务模块 |
path:message_id |
message_id, raw_content?, source_url, modality, processing_status, error_code? |
conversation_messages |
否 |
否 |
消息表需 media_id, processing_status 且 processing 时允许 raw_content 为空 |
基础业务模块按当前用户查询消息并返回;也可由消息推送模块通知。该接口只展示消息,不重新识别 |
| 注册页 |
注册用户 |
POST |
/api/auth/register |
前端交互与展示模块 |
用户账号模块 |
email, password, display_name?, timezone? |
user_id, business_user_id, access_token, expires_at |
请求数据、users |
是:用户记录 |
否;提交注册即明确操作 |
基础注册无缺口;刷新会话策略待定 |
规范邮箱、校验密码、生成业务用户 ID、哈希密码并通过全局数据模块保存;不返回密码哈希 |
| 登录页 |
用户登录 |
POST |
/api/auth/login |
前端交互与展示模块 |
用户账号模块 |
email, password |
user_id, business_user_id, access_token, expires_at |
请求数据、users、服务端 JWT 签名配置 |
否 |
否;提交登录即明确操作 |
无;不新增会话表 |
查询用户并验证密码哈希和状态,签发短期 access token;统一失败文案以避免账号枚举。token 不落库、不传给 Agent;到期后用户重新登录 |
| 个人主页 |
查询当前用户 |
GET |
/api/users/me |
前端交互与展示模块 |
用户账号模块 |
无;user_id 从访问令牌取得 |
id, business_user_id, email, display_name, timezone, status |
users |
否 |
否 |
无 |
依据认证用户查询并返回安全字段;不返回 password_hash |
| 设置页/母 AI 上下文 |
查询全局画像 |
GET |
/api/users/me/profile |
前端交互与展示模块 |
全局用户画像管理模块 |
无;user_id 从访问令牌取得 |
profile_data, version, source, updated_at |
user_profiles |
否 |
否 |
无 |
查询当前显式画像;无记录返回空画像;不基于行为静默推断 |
| 设置页保存画像 |
创建全局画像写入请求 |
PATCH |
/api/users/me/profile |
前端交互与展示模块 |
全局用户画像管理模块 |
base_version, profile_patch, idempotency_key |
write_request_id, payload_hash, preview, expires_at |
user_profiles、write_requests |
是:仅写候选请求 |
是 |
无 |
校验 patch 和 base_version,以 update_user_profile 创建写入候选;确认后才由全局数据模块落盘,本接口不直接修改画像 |
| 长目标拆分/重排 |
查询当前任务级画像 |
GET |
/api/long-goals/{long_goal_id}/task-profile |
前端交互与展示模块 |
任务级画像管理模块 |
path:long_goal_id |
current_snapshot?, recent_observations[], version |
long_goals、task_profile_snapshots、task_profile_observations |
否 |
否 |
无 |
校验目标归属,只返回当前目标的快照与观察;不跨目标合并 |
| 用户明确表达目标习惯 |
追加任务级观察 |
POST |
/api/long-goals/{long_goal_id}/task-profile/observations |
前端交互与展示模块 |
任务级画像管理模块 |
source, raw_text, structured_observation, source_message_id?, idempotency_key |
observation_id, created_at |
long_goals、task_profile_observations |
是:原始观察 |
否;原消息/表单是用户明确表达 |
建议补 idempotency_key 或来源唯一约束 |
校验目标归属和来源后只追加原始证据;不覆盖旧观察,也不直接生成生效快照 |
| AI 归纳任务画像 |
创建任务级画像写入请求 |
POST |
/api/long-goals/{long_goal_id}/task-profile/snapshot-request |
前端交互与展示模块 |
任务级画像管理模块 |
base_version, profile_summary, observation_ids, idempotency_key |
write_request_id, payload_hash, preview, expires_at |
当前快照、观察、write_requests |
是:仅写候选请求 |
是 |
无 |
将 LangGraph 工作流产生的结构化候选写入 write_requests;确认后插入新快照并切换 is_current;不在本接口直接生效 |
TimeFlow MVP 函数级接口设计
1. 模块职责说明
1.1 总体数据流
识别失败时,原图片或音频仍然保留在聊天窗口。消息状态改为
failed,用户可点击重试;每次重试产生新的agent_run_records,不重复创建聊天消息和媒体对象。1.2 数据库复用与新增
usersuser_profilesconversation_messagesmedia_id、processing_status,并允许处理中的媒体消息raw_content暂为空media_assetsagent_run_recordsmedia_recognitionstask_profile_observationstask_profile_snapshotswrite_requestsprofile_candidates表operation_confirmationsaudit_events1.3 核心边界
source_url是稳定的应用层地址,例如/api/media/{media_id}/content。model_input_url是 5 分钟左右有效的 MinIO 预签名 GET URL,只在后端内部生成,不返回客户端、不落库。conversation_messages保存母 AI 实际读取的raw_content;LangGraph 负责母 AI 工作流编排;详细模型日志可选进入 LangSmith 或同类平台。1.4 各模块职责边界
qwen3-vl-flash;返回原始文字、可选结构化提取和警告qwen3-asr-flash;返回转写文本、语言/时长等技术结果user_profiles;通过确认流程更新显式画像;向拆分、重排和复盘提供当前生效画像task_profile_observations;归纳任务级画像候选;通过确认流程生成新的task_profile_snapshots;查询当前快照1.5 URL 与资源标识定义
media_idobject_keyusers/{user_id}/2026/07/{media_id}.pngmedia_assetssource_url/api/media/{media_id}/contentmedia_id生成model_input_urlfile://...、content://...或 Web Blob URL公开 API 不返回
download_url、MinIO endpoint、bucket 或 object key。客户端请求source_url后,后端鉴权并从 MinIO 流式返回图片或音频。图片响应支持ETag和私有缓存;音频响应支持 HTTP Range。2. 前后端 API 表
/api/mediafile, media_type, idempotency_key;user_id从访问令牌取得media_id, message_id, source_url, processing_statusmedia_assets、conversation_messagesmedia_assets;调整消息表/api/media/{media_id}/contentmedia_id;header:Range?Content-Type, Content-Length, ETag, Accept-Rangesmedia_assets、MinIOmedia_assets/api/media/{media_id}/recognition/retrymedia_id;body:message_id, idempotency_keymessage_id, processing_status, accepted_atmedia_assets、conversation_messages、agent_run_recordsprocessing_status/api/messages/{message_id}message_idmessage_id, raw_content?, source_url, modality, processing_status, error_code?conversation_messagesmedia_id, processing_status且 processing 时允许 raw_content 为空/api/auth/registeremail, password, display_name?, timezone?user_id, business_user_id, access_token, expires_atusers/api/auth/loginemail, passworduser_id, business_user_id, access_token, expires_atusers、服务端 JWT 签名配置/api/users/meid, business_user_id, email, display_name, timezone, statususers/api/users/me/profileprofile_data, version, source, updated_atuser_profiles/api/users/me/profilebase_version, profile_patch, idempotency_keywrite_request_id, payload_hash, preview, expires_atuser_profiles、write_requestsupdate_user_profile创建写入候选;确认后才由全局数据模块落盘,本接口不直接修改画像/api/long-goals/{long_goal_id}/task-profilelong_goal_idcurrent_snapshot?, recent_observations[], versionlong_goals、task_profile_snapshots、task_profile_observations/api/long-goals/{long_goal_id}/task-profile/observationssource, raw_text, structured_observation, source_message_id?, idempotency_keyobservation_id, created_atlong_goals、task_profile_observationsidempotency_key或来源唯一约束/api/long-goals/{long_goal_id}/task-profile/snapshot-requestbase_version, profile_summary, observation_ids, idempotency_keywrite_request_id, payload_hash, preview, expires_atwrite_requestswrite_requests;确认后插入新快照并切换 is_current;不在本接口直接生效说明:画像确认可以复用系统级确认 API,不在成员 5 内重复设计。所有画像应用必须接收
write_request_id,不能只传is_confirmed=true。MVP 不提供/api/auth/refresh和服务端/api/auth/logout;用户退出登录由客户端删除本地 access token 完成。3. 模块对外函数表
user_id, file_stream, file_name, declared_content_type, declared_size?, media_type, idempotency_keyMediaMessageUploadDTOmedia_assets;调整消息表user_id, media_id, range_header?MediaContentStreamDTOmedia_assets、MinIO 对象media_assetsuser_id, media_id, expires_seconds=300ModelAccessURLDTOmedia_assetsmodel_input_url交给百炼;只在内存流转,不返回客户端、不落库user_id, media_id, write_request_idDeleteMediaResultDTOmedia_assets需软删除字段OCRRecognizeInputOCRRecognizeOutputqwen3-vl-flash,校验输出后保存 raw_content,再把消息交给 LangGraph;不直接写任务事实ASRRecognizeInputASRRecognizeOutputqwen3-asr-flash,保存转写文本并交给 LangGraph;不自动换模型、不理解业务意图RegisterUserRequestAuthResultDTOaccess_tokenAuthenticatedUserDTOuser_id, resource_type, resource_idOwnershipCheckDTOmedia_assets.user_iduser_idUserProfileDTOuser_profiles当前版本user_id, base_version, patch, idempotency_keyProfileWritePreviewDTOwrite_requestsuser_profilesuser_id, write_request_id, confirmation_idUserProfileDTOTaskProfileObservationInputTaskProfileObservationDTOuser_id, long_goal_idTaskProfileContextDTOTaskProfileInductionInputProfileWritePreviewDTO | NoCandidateDTOwrite_requestsuser_id, long_goal_id, write_request_id, confirmation_idTaskProfileSnapshotDTO4. 模块依赖函数表
access_token/user_idAuthenticatedUserDTOmedia_id, message_iduser_id, media_idModelAccessURLDTOmodel, messages, schemauser_id, media_idModelAccessURLDTOmodel, audio_url, asr_optionsagent_run_records追踪图片识别source_message_id, correlation_id, component_name, statusagent_run_idagent_run_records追踪语音识别source_message_id, correlation_id, component_name, statusagent_run_idmessage_id, statusmessage_id, statususer_id, patch, base_versionuser_id, long_goal_id5. 模块内部函数表
media_type, file_name, declared_type, declared_size?user_id, media_type, file_name, idempotency_keymedia_id, object_key, status=uploadingusers, media_assetsdetected_content_type, extensionfile_stream, max_bytes, object_keysize_bytes, sha256, etagmedia_id, size_bytes, sha256, etag, source_url, modalityMediaMessageUploadDTOmedia_assets, conversation_messagesmedia, range_header?media_assets、MinIO 对象model_input_url, extraction_mode, prompt_versionraw_content, extracted_fields, warningssize_bytes, duration?, content_typemedia_assets、ASR 上限language?, enable_itn, context_terms?asr_optionsqwen3-asr-flash参数;不注入完整画像或敏感信息message_id, raw_content, metadata, agent_run_idconversation_messages, agent_run_recordsmessage_id, raw_content, metadata, agent_run_idconversation_messages, agent_run_recordsemailpassword, password_hash?hash或boolcurrent_profile, patchobservations, long_goal_idconfirmed_request, current_snapshot6. Python 数据结构声明
file_stream和二进制响应不应塞进 Pydantic JSON 模型;由 Web 框架的 multipart 文件对象和流式响应对象承载。上面的 DTO 只描述元数据和跨模块契约。7. 数据库查缺补漏表
本表严格按协作协议检查“每个接口或函数需要什么数据、数据从哪里来、现有数据库是否支撑”。表中“写入”仅表示保存媒体、消息、运行摘要或候选请求;OCR/ASR 本身不会创建日程、待办、长目标等业务事实。
media_id, user_id, media_type, bucket_name, object_key, original_file_name, content_type, size_bytes, sha256, etag, status, idempotency_keymedia_assets,记录归属、对象键、校验结果、状态和软删除信息message_id, user_id, modality, media_id, source_url, processing_status, raw_content?conversation_messagesmedia_id, processing_status;允许 processing/failed 媒体消息 raw_content 为空,并增加状态 CHECKmedia_assets、MinIOmedia_assets后由后端动态生成稳定source_url或短期model_input_urlsource_message_id, correlation_id, component_name, function_name, status, error_code?, trace_id?agent_run_recordsagent_run_records、新增media_assetsagent_run_records;媒体规格来自新增表usersuser_id, business_user_id, status,以及 JWT 的sub, iat, exp, iss, audusers、服务端 JWT 签名配置auth_sessions;access token 不落库;到期后重新登录profile_data, version, source, updated_at;写请求和确认user_profiles, write_requests, operation_confirmationsupdate_user_profile确认链user_id, long_goal_id, source, raw_text, structured_observation, source_message_id, idempotency_keytask_profile_observationsidempotency_key和用户维度唯一约束,或对source_message_id建来源唯一约束task_profile_snapshots, task_profile_observations, write_requests, operation_confirmations7.1 已有结构可以直接复用
usersuser_profilesconversation_messagesagent_run_recordstask_profile_observationstask_profile_snapshotswrite_requestsupdate_user_profile、save_task_profile_snapshotoperation_confirmationsaudit_events7.2 画像部分不新增重复表
goal_scoped_profiles:复用task_profile_observations + task_profile_snapshots。profile_candidates:待确认画像内容放入write_requests.payload。user_profiles.source=user_form/user_explicit_input。operation_confirmations,与数据库触发器保持一致。task_profile_observations没有独立幂等键。若开放追加观察 API,建议新增idempotency_key及(user_id,idempotency_key)唯一约束;或者对带source_message_id的观察建立来源唯一约束,避免同一消息被重复归纳。7.3 百炼调用约束
7.3.1 OCR
model="qwen3-vl-flash"。model_input_url。null或 warning;禁止补造。plain_text返回文本;timeflow_input可附带时间、地点、人物和行动项候选,但仍不是业务事实。7.3.2 ASR
model="qwen3-asr-flash"。language;未知或中英混合时不传。enable_itn默认开启。context_terms仅允许有限实体词,不注入完整画像或敏感信息。7.3.3 密钥与可观测性
7.4 写入与确认规则
write_requests。raw_content生成 Schedule/Todo/Goal/Task 等候选后,仍必须走write_requests → operation_confirmations → assert_confirmed_write。write_action=update_user_profile。task_profile_observations是用户明确表达的原始记录,可追加保存;AI 派生的task_profile_snapshots必须使用write_action=save_task_profile_snapshot并关联确认记录。media_assets与 MinIO 无法共享 PostgreSQL 事务,必须使用状态机和孤儿对象扫描保证最终一致性。8. 风险说明
8.1 关键失败处理
(user_id, upload_idempotency_key)返回原结果,避免重复文件和消息8.2 风险与控制
source_url只保存应用层地址;model_input_url仅内存使用agent_run_records追踪;可选接入 LangSmithusers.status(user_id,long_goal_id)8.3 验收清单
POST /api/media使用流式上传,上传时统计大小、检测文件头并计算 SHA-256。media_assets能区分 uploading、uploaded、failed、deleted。conversation_messages能表示处理中、成功和失败,且 processing 媒体消息允许 raw_content 为空。media_recognitions;每次识别和重试使用agent_run_records。qwen3-vl-flash,输出经 Schema 校验。qwen3-asr-flash,严格执行 5 分钟/10MB 上限。user_profiles和确认链。save_task_profile_snapshot确认请求。auth_sessions。/api/auth/refresh和服务端单会话撤销;退出登录由客户端删除本地 token。8.4 外部能力依据
qwen3-asr-flash支持短音频同步识别,规格不超过 5 分钟、10MB。https://help.aliyun.com/zh/model-studio/qwen-asr-api-reference
https://help.aliyun.com/zh/model-studio/asr-model/
https://help.aliyun.com/zh/model-studio/vision-model/
https://help.aliyun.com/zh/model-studio/vision
https://docs.min.io/aistor/developers/sdk/python/api/