structured-writer — AI Agent
Project description
Structured Writer
结构化写作智能体 — 模板驱动的大纲规划 + 串行写作引擎。 版本:1.1.0b12 | 作者:wUwproject | 许可证:Apache 2.0
基于 Planner → Writer 双流水线的文档生成工具,支持模板驱动的元数据/内容树分离、大纲交互编辑、逻辑提示词等特性。
核心特性
| 特性 | 说明 |
|---|---|
| meta+content 分离 | 模板分元数据区(短标识)和内容树区(文章正文),各有独立渲染/规划规则 |
| LLM 对话生成模板 | 描述需求 → LLM 自动生成 meta/content/style/logic 四部分 |
| 串行写作引擎 | 按 order batch 逐节写作,支持 RAG 参考 + 辅助知识注入 + 事实自检 |
| 交互式大纲编辑 | 勾选/排序/重点/RAG/字数调整,leaf 和 section 类型独立字数控制 |
| 重新规划 + plan_hints | 模态框输入章节/字数修改要求,LLM 按优先级重规划 |
| 逻辑提示词 | 与风格提示词分离,控制 LLM 的认知流程顺序(先写什么后写什么),不影响文章最终排列 |
快速开始
# 1. 安装依赖
pip install -r requirements.txt
# 2. 启动(需要 LM Studio 或 Ollama 运行中)
python main.py
# 3. 打开浏览器访问 http://localhost:8770
用户界面概览
配置 Tab
┌─ 模板管理 ───────────────────────────────────────┐
│ [下拉选择模板] [另存为] [删除] [从对话生成] │
│ │
│ 元数据区(橙色) 名称 | 显 | 字段意义 | 填写 │
│ ┌─────────────────────────────────────────────┐ │
│ │ 标题 | ☐ | 文章标题 | auto │ │
│ │ 作者 | ☑ | 作者姓名 | user │ │
│ └─────────────────────────────────────────────┘ │
│ │
│ 内容树区(蓝色) 名称 | 显 | 字段意义 | 子结构 │
│ ┌─────────────────────────────────────────────┐ │
│ │ 摘要 | ☐ | 概括全文 | 无 │ │
│ │ 正文 | ☐ | 详细展开 | 有 │ │
│ └─────────────────────────────────────────────┘ │
│ │
│ 风格提示词:控制文风和语气,注入每一步写作 prompt │
│ 逻辑提示词:控制LLM认知顺序,不改变文章最终排列 │
└──────────────────────────────────────────────────┘
填写 → 规划 → 生成流程
1. 选择模板 → meta 输入框出现在聊天区
↓ 填写meta字段(或留空让LLM生成)
2. 发送写作主题 → LLM按模板生成大纲
↓
3. 编辑大纲(勾选/排序/字数/重点/RAG)
↓ 点「重新规划」→ 输入调整要求 → LLM重规划
4. 点「开始生成」→ 逐节串行写作
常见操作
1. 配置模型
在配置 Tab 的 规划模型 / 写作模型 区设置后端地址和模型名,点「刷新」加载可用模型列表。
2. 管理模板
- 切换:下拉选择
- 编辑:直接修改表格中的字段
- 另存为:基于当前模板创建副本
- 删除:仅自定义模板可删,双击确认
- 从对话生成:输入文档描述,LLM 自动构造 meta+content+style+logic
3. 调整大纲
| 操作 | 方式 |
|---|---|
| 隐藏/显示节 | 勾选复选框 |
| 调整顺序 | 下拉选择 I~X |
| 标记重点 | 勾选 ⭐重点 |
| 调整字数 | leaf 节直接改输入框,section 节改子结构输入框 |
| 设为 0 | 不做字数限制,LLM 自由发挥 |
| 启用 RAG | 勾选 RAG + 选择知识库(需 8767 在线) |
| 重新规划 | 点击 → 模态框输入要求 → LLM 按新要求重生成 |
4. 写作控制
- 自动撰写:单篇/批量自动执行规划+生成
- 延时停止:当前子结构写完停
- 立即停止:续写边界停
模板字段说明
元数据区:
source=user: 用户必须填,LLM不碰(作者、单位、文号)
source=auto: 用户可填,留空LLM生成(标题)
source=llm: 由LLM生成(关键词等短数据)
show_label=☑: 渲染时显示标签,无值也显示" > 名称:"
show_label=☐: 渲染时不显示标签,有值才显示" > 值"
内容树区:
type=leaf: 无子结构,单段直接写
type=section: 拆2-4个子结构(用户指定则按用户要求)
source 固定 llm,不在表格中显示
文件结构
structured-writer/
├── main.py # 入口
├── setup.bat # Windows 一键启动
├── config.json # 全量配置(模板/模型/参数)
├── requirements.txt # 依赖
├── CHANGELOG.md # 版本日志
├── README.md # 本文件
│
├── structured_writer/ # 核心模块
│ ├── web_ui.py # Web UI(port 8770)
│ ├── planner.py # 大纲规划器(LLM 调用)
│ ├── writer.py # 串行写作引擎
│ ├── config_manager.py # 配置读写 + 迁移
│ ├── state_manager.py # 会话状态管理
│ ├── llm_client.py # LLM 统一客户端
│ └── rag_client.py # RAG 外部 API 客户端
│
└── data/ # 运行时数据
├── sessions/ # 会话存档
└── archives/ # 归档会话
技术栈
- LLM 后端: LM Studio / Ollama
- Python: 3.10+
- 架构: ThreadingHTTPServer + 串行写作流水线
- 模板: meta[] + content[] + style + logic 四部分
- 渲染: Markdown(#/##/### 三级标题)
协议
Apache 2.0
更新说明
[1.1.0b12] - 2026-07-31
修复
- leaf 节写作报错 Missing section_title:删除了
_build_context_section_prompt()的section_title参数,已补回 - LLM 输出引用自来源 N 带空格不匹配:后处理新增
引用自来源 N和引自来源 N空格变种替换 - max_tokens 硬编码覆盖用户配置:
citation_validator.py的 LLM 格式化调用max_tokens=4096改为None,走用户上下文窗口 - logic 模板残留旧引用指令:学术论文/论文综述 logic 字段中的"引用来源标注为目标文件名"已删除
- IMRaD 缩写清理:学术论文 logic 字段 IMRaD → "按顺序撰写"
改进
- 删除按钮二次确认:输出列表删除不再使用浏览器 confirm 弹窗,改为行内确认/取消
- 上下文行为保持一致:恢复
_logical_order==2传全部上下文的原始设计
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file structured_writer_ldxs-1.1.0b12-py3-none-any.whl.
File metadata
- Download URL: structured_writer_ldxs-1.1.0b12-py3-none-any.whl
- Upload date:
- Size: 73.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bd8ceb5cf78aa652876cbe7d56bac81a3cf8eb49640541d4199ddc69dbf7d46e
|
|
| MD5 |
db36f4bed50080450632270eade08b6f
|
|
| BLAKE2b-256 |
195cc1d5fee1225ad75794f0e32b2e6452cdc5558a580fdfafeed80adf712182
|
Provenance
The following attestation bundles were made for structured_writer_ldxs-1.1.0b12-py3-none-any.whl:
Publisher:
publish-pypi.yml on Ldxs001/workbuddy-skills
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
structured_writer_ldxs-1.1.0b12-py3-none-any.whl -
Subject digest:
bd8ceb5cf78aa652876cbe7d56bac81a3cf8eb49640541d4199ddc69dbf7d46e - Sigstore transparency entry: 2292628805
- Sigstore integration time:
-
Permalink:
Ldxs001/workbuddy-skills@eb1514dd6a037415123f4731567486b2cfd3f15c -
Branch / Tag:
refs/tags/v1.1.0b12 - Owner: https://github.com/Ldxs001
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@eb1514dd6a037415123f4731567486b2cfd3f15c -
Trigger Event:
push
-
Statement type: