weicw
77378a2791
feat(ai): 助手页支持写作/生图等记录的历史列表与按类型筛选
...
- 三模式各自独立工作区:切模式不丢消息、草稿与当前记录
- 历史面板加类型徽标与筛选(全部/聊天/写作/图片/创意/活动策划),文案改「历史记录」
- 生成成功认领末帧 chatId 并刷新列表;聊天 __END__ 帧的 chatId 同样接受
- 生图回复支持多张  渲染
- 写作/图片记录支持「按原参数再来一次」(只回填、不自动发送)
- 三个独立页(文稿/创意/活动策划)加历史入口,/ai?type= 预置筛选
- 后台 aiChatList 加类型列与筛选;历史列表提示仅展示最近 30 条
2026-10-24 17:37:46 +08:00
weicw-dshsa
73155d0bd2
fix(manuscript): 稿件类型收敛到上游 doc_type 枚举
...
「公众号推文」「发言稿提纲」这几个模板点下去必定失败:前端把界面
标签原样当成 doc_type 下发,而上游工作流只认
新闻稿 / 活动总结 / 微信推文 / 通知公告,多给一个值就是一次
`doc_type in input form must be one of the following` 的报错,
学生侧只看到「生成失败,请稍后重试」。
- docTypeOptions 只保留上游有的四种(外加「自由创作」),
「宣传稿」「发言稿」「短视频脚本」一并删掉
- 「公众号推文」保留这个叫法,下发值改成「微信推文」
- 快捷模板「发言稿提纲」换成「通知公告」,并补对应示例内容
2026-10-23 14:20:48 +08:00
weicw-dshsa
cdf87197fb
fix(ai): 生成收尾不再只依赖 __END__,并清掉 WS 死代码
...
- handleGenerate 收尾改 try/catch/finally:loading 一定复位。原先只在收到
__END__ 帧时由 finishStream 复位,网关返回空流或上游中途报错时按钮会永久
停在加载态(issue 20)
- 提示按结果区分:没有正文 → 提示重试;正文是失败文案 → 报错;否则才是成功
- 删掉已不会调用的 WebSocket 栈:connectWebSocket / disconnectWebSocket /
wsConnected / webSocketRef / wsConnectPromiseRef / activeConversationId,
以及随之失效的 attachHeartbeat、buildWebSocketUrl、useUserStore 与
StreamResolver.reject
- 大纲页删掉早已无调用点的 parseOutline(SSE 改造后遗留)及其 import
2026-10-23 12:57:11 +08:00
weicw-dshsa
5073b2969a
refactor(ai): 稿件与大纲页文案去掉接口术语与多余提示
...
面向学生的页面不再暴露实现细节:
- 删除两页底部「提交说明」整块(含 `docType`/`inputs`、接口路径、
WebSocket 流式说明及对应样式)
- 稿件页删除 `user_content`、`files` 字段说明;大纲页不再把
conversationId/messageId 拼成「接口摘要」展示,随之删除
buildSummary、resultSummary 及摘要渲染
- 加载态由三段式压成一行,空态与附件说明各留一句人话
2026-10-23 12:23:32 +08:00
weicw-dshsa
6f7f2f0d9a
feat(ai): 后台 AI 链路改走 HTTP 流式,WS 地址与心跳收敛到 utils
...
写作 / 图片 / 大纲 / 稿件四条链路用普通 POST 时,生成期间链路上零字节,
会被 60s 空闲超时掐成 504(出图实测 58s 断开)。后端已给每条链路开
/stream(SSE,每 15s 一帧心跳),这里改成消费它。
- 新增 utils/ai-stream.ts:SSE 帧解析 + 末帧 {type:'final', result} 拆包;
runCreativeAssistantStream / runManuscriptGenStream 对外仍返回原来的 data,
页面渲染逻辑不动
- 新增 utils/chat-socket.ts:buildWebSocketUrl 统一拼 /api/chat/{userId}
(网关只放行 /api 前缀),attachHeartbeat 每 25s 发 ping 顶住代理空闲超时
- chatgpt 对话先试 WebSocket,握手失败落 /ai/chat/message/stream,
帧内容与 WS 完全一致,处理函数直接复用
- 四个页面删掉各自重复的 buildWebSocketUrl,统一从 utils 引入
2026-10-21 19:18:08 +08:00
weicw-dshsa
d8ef29afe7
feat(ai): 写作模式拆成自由创作与模板两条路(issue 18)
...
自由创作不再解析自然语言:原话整段作为 userContent 下发,docType 留空,由后端转
「AI 创意助手」。选了文体才提交 docType 等结构化条件,走「内容创作与宣传助手」。
- writing-params.ts 删掉 parseWritingRequest、字段别名表与字数兜底表,只留选项常量。
- chatgpt/index.vue:字数选择器只在选中文体后出现;撤掉图片比例选择器(上游开始
节点无比例变量,只能拼进 user_content,等于替上游写 prompt);结果不再用入参补标题。
- gxmu/manuscriptGen:新增「自由创作」入口与 freeContent 文本域,模板模式才展开活动
信息等可选项。
- 顺带删除 chatgpt/index.bak.vue 旧备份。
2026-10-21 12:39:54 +08:00
weicw-dshsa
623404ce9a
fix(ai): 失败态与整包 JSON 不再进 UI,兜底收敛到公共模块(issue 10)
...
admin 端原本**没有**任何 AI 结果兜底公共实现(src/utils/ 下零命中
pickDisplayable / isFailedPayload / FALLBACK_TEXT / FAILED_TEXT),
四个 AI 页面各写一份,且方向相反——都保留了「JSON.stringify 整包」兜底。
后果是解析不出内容时把内部标识符渲染给用户,实测:
{"answer":"","conversationId":"c1d2e3f4-…","messageId":"m1"}
改动:
- 新增 src/utils/ai-result.ts,从 tuanwei-uniapp/utils/ai-result.js 移植,
逐函数对齐语义(getPayloadStatus / isFailedPayload / isDisplayableAnswer /
pickDisplayable / resolveDisplayText / 两个文案常量)。原始报文只进
console.error,不进 UI。
- 四处整包 JSON 兜底全部替换为 resolveDisplayText,并删掉各自的
stringifyUnknown:oa/chatgpt(两处)、gxmu/manuscriptGen、
gxmu/activityOutlineGen。
- 四页正文候选改用 pickDisplayable(原 pickString 只判非空,
失败报文里 UUID 形状的 answer 会被当正文)。
- 失败态优先判定:isFailedPayload 为真时直接给 FAILED_TEXT,
不再走「主题 + 失败文案」的拼接。
- gxmu/creativeAssistant:删掉已无引用的 rawOutputsText(模板引用早被注释,
留下一个"看似有原始输出视图"的死代码),并给「未识别到输出字段」补可读文案。
评审跟进修掉的两个真缺陷:
- creativeAssistant 的兜底文案**原本不可达**:模板 a-empty 的
v-if="!loading && !hasAnyResult" 会遮蔽 v-else 里的 status-alert,
失败时 hasAnyResult 为假 → 用户仍看到「填写文本指令并上传附件后执行工作流」。
条件补上 && !workflowResponse。
- WS 路径不消费 reset:后端失败时带 reset:"true" 要求覆盖半截内容,
两个页面都忽略它,于是编辑器变成「半截正文 + 生成失败,请稍后重试」;
且 streamStarted 为真时会直接丢弃 HTTP 返回体,新加的 status 也就读不到。
appendOutlineChunk / appendAssistantChunk 增加 reset 参数并在
handleSocketMessage 里透传。
验证:
- .scratch/ai-assistant/verify-admin-ai-result.js 用项目自带 TypeScript
编译器转译后求值,并从真实 .vue 抽取 parseOutline / parseResult /
formatWritingResult 跑断言(验真实代码而非重写副本)→ 41/41 PASS。
- vue-tsc --noEmit 改动前后错误集合完全一致(1365 条全在 .bak 等预存文件),
本次改动的 4 个文件零错误。
- eslint:ai-result.ts 零问题;creativeAssistant 的未使用变量由 3 个降到 2 个。
2026-10-13 02:12:58 +08:00
b2894lxlx
019ed28d37
260720
2026-07-20 11:50:47 +08:00