# 配图功能优化

## 窄化mermaid图片
mermaid图片现在只支持生成流程图、层级图、职责关系图，删除对其他类型的支持

## 正文生成的配置弹窗进行改版
- “全文图片最大数量”改名为“AI生图上限”，且只在开启“使用AI生图”时显示
- “生成mermaid图片”改名为“使用mermaid生图”，并增加只在启用时才显示的“mermaid生图上限”。
  - 生图上限控制逻辑和AI生图上限一样
  - 上限默认值10
- 新增“生成html图片”，并增加只在启用时才显示的“html生图上限”和“高级设置”。
  - 上限默认值10
  - 这是一个新功能，先只增加配置页的UI，不实现具体功能，后续我会告诉你具体业务逻辑
  - 点击高级设置再弹出一个窗口，内容是一个textarea，用于设置html可生成的图表类型，默认是“甘特图、进度网络图、组织架构图、泳道图、RACI 职责矩阵、风险矩阵、系统架构与拓扑图、WBS 工作分解结构图、鱼骨图、柱状图、折线图、饼图”
- 去掉配置页的所有二级说明文字


## 编排和配图编排阶段改版
- 开始生成正文时的编排阶段，取消对AI图片和mermaid图片的编排
- 在所有正文生成完成之后，图片生成之前，增加一个图片编排阶段
  - 使用agent进行编排
    - 把生成好的正文组织好并导出成markdown文件
    - 把目录树导出成json文件
    - 让agent对读取全文markdown并生成编排结果，编排逻辑和现在正文编排时对图片的编排原则差不多
    - html图片的编排规则有些不同：
      - html编排需要agent根据配置阶段“生成html图片-高级配置”中配置的可生成图表类型来判断哪些小节要配一个什么图片
      - html图片允许跨多小节（但必须是连续的），所以html图片要有组的概念，可以是一组相邻的节点内容共同生成一张html图片
      - html图片也可以不跨多小节，是单节的
      - 如果是跨多小节的，还应该标记图片是应该插入到组小节的前面还是后面
        - 单节生成的图片默认放在该小节的正文后面
        - 但跨多小节的图片，不应该随便放在后面，说明类的图应该放在组内第一个小节的正文前面，总结类的图片应该放在组内最后一个小节的正文后面
    - 导出的目录树json作用是给agnet在生成完编排结果后进行检查，其编排了生成图片的小节id，必须在真实目录树中存在，避免编排结果无法应用于程序的问题
- 图片编排后处理阶段，由程序处理最终编排结果
  - 因为我们每组图片都设置了上限，所以编排了图片的小节数可能高于上限，需要程序根据生图优先级打分，来从高到底确定到底要生成哪些图片
  - 一个小节最多配一张图，html>mermaid>ai生图，假设三种图片设置的数量都是10，则先取html配图的前10个节点，最终编排结果标记为生成html图片，然后该节点即使也被初次编排了mermaid图片，也不会生成。如果是一组多小节组合的html图片，则这一组内所有小节都不会再生成其他图片。然后取10个mermaid的编排阶段进行标记，最后才是ai生图
- 生图阶段也不再按照之前的编排结果生成，而是按照我们本次修改的编排结果来生成，你先知道这点就行，先不用进行设计和修改。我们本次改动只集中精力改编排阶段，待该阶段稳定后再处理生成图片的阶段。

## 图片生成
- html图片和mermaid图片，用的都是文本模型；ai生图用的是生图模型，所以文本组和生图组直接的接口是隔离的，两组任务可以并发执行。每组内的任务也可以并发，并发上限参考系统设置中对应模型服务商的并发上限
- ai生图、agent生图保持以前的逻辑不变，只是从参考正文编排结果改为图片编排结果
- html图片的提示词非常简单：“阅读并理解以下内容，用html绘制一张甘特图，不要有太多文字描述，专业商务风格。这是一个类图片的html，所以注意仔细检查显示效果、文字换行、拥挤等问题。参考内容如下：”，其中XXX就是编排阶段所确定的图标类型，参考的内容就是编排的一个或多个小节
- html图片生成可能包含多个小节，多小节拼在一起会非常长，所以硬编码一个50000字符的限制，当要参考的原文标题+内容拼接在一起小于等于50000字符的时候，使用普通AI请求生成，当大于50000字符时启用agent模式生成。
  - 因为普通AI请求是可以并发的，而agent我们设计成单任务模式了，为避免并发任务混乱，我们先并发处理小于等于50000字符的普通AI请求，然后再逐个处理大于50000字符的agent任务

## html显示和导出
当前markdown预览功能是支持html代码的，但是应该不支持现在生成的这种超长的完整html。
我建议按以下逻辑执行：
- html生成后独立保存，不和正文内容混在一块（方便后续转图片失败后重试）
- html生成后，调用服务 https://mt.agnet.top/image/url2png 把html转成图片
    - 对html进行base64编码
    - 
- 转换好的图片保存到本地，并在markdown相应位置插入图片，而不是html代码
- 转换失败的图片仿照mermaid转图片的逻辑，有失败重试次数（延时和次数保持一致，最好复用变量，以便之后统一修改）
- 重试之后也失败的图片直接忽略掉（仅在开发者模式记录信息）

导出逻辑和mermaid差不多，查看一下mermaid的导出。