EasyWriter 是一个面向多平台内容创作场景的智能写作代理系统。基于 LangGraph 构建的多 Agent 协作架构,只需输入简单的自然语言描述,即可自主完成写作规划、信息研究、内容生成、配图生成与多平台适配,输出可直接用于分发的高质量文章内容。
核心亮点:
- 🎯 极简输入:无需复杂 Prompt,一句话描述即可生成完整文章
- 🧠 智能规划:先规划后执行,结构清晰可控
- 🔍 研究增强:自动搜索补充事实和案例(基于 Tavily)
- 🖼️ AI 配图:自动生成文章封面配图(支持 DALL-E / ModelScope)
- 📱 多平台适配:一次生成,自动适配微信公众号、知乎、小红书、Twitter
- 💬 交互编辑:支持大纲审核与文章对话式修改
- 👁️ 透明可控:执行过程可追踪,支持实时进度显示
- 🔧 模块化架构:结构化 XML Prompt,回调系统可扩展
- 自然语言理解用户写作需求
- 自动提取主题、内容类型、目标受众
- 智能判断是否需要资料研究
- 根据参考文章结构生成专业大纲
- 包含核心信息、开篇钩子、章节规划、结论要点
- 自动估算各章节字数
- 参考研究:搜索同主题优质文章,借鉴结构和写法
- 事实研究:为各章节补充数据、案例、引用
- 多级深度:支持 none/light/normal/deep 四级研究深度
- 基于 Tavily Search API 的高质量搜索
- 支持并行/串行章节写作
- 保持上下文连贯性
- 自动整合研究资料到正文
- 自动根据文章内容生成封面配图
- 支持 OpenAI DALL-E 和 ModelScope 双后端
- 智能下载并保存到本地
- 大纲审核:生成大纲后暂停,支持用户审核和修改
- 大纲重生成:根据用户反馈重新生成大纲
- 对话式修改:文章完成后进入对话模式,支持自然语言修改请求
- 实时保存:每次修改后自动保存最新版本
- 微信公众号:适配排版规范,生成引导关注话术
- 知乎:优化为问答式标题,添加专业话题标签
- 小红书:改写为种草风格,生成吸睛标题和 emoji
- Twitter/X:压缩为精炼推文,生成话题标签
- 结构化 XML Prompt:使用 XML 格式组织 Prompt 模板,易于维护和扩展
- 回调系统:工作流回调抽象,支持自定义阶段处理逻辑
- 交互式工作流:独立的交互模块管理大纲审核和文章修改
- CLI 回调机制:解耦命令行逻辑与业务逻辑
用户输入 "帮我写一篇 AI Agent 入门文章"
│
▼
┌───────────────────────────────┐
│ Intent Analyzer │ ← 理解写作意图
└───────────────┬───────────────┘
▼
┌───────────────────────────────┐
│ Reference Research │ ← 搜索参考文章(可选)
└───────────────┬───────────────┘
▼
┌───────────────────────────────┐
│ Planner Agent │ ← 生成内容大纲
└───────────────┬───────────────┘
▼
┌───────────────────────────────┐
│ Outline Review │ ← 用户审核大纲(交互式)
└───────────────┬───────────────┘
▼
┌───────────────────────────────┐
│ Section Research │ ← 章节事实研究(可选)
└───────────────┬───────────────┘
▼
┌───────────────────────────────┐
│ Writer Agent │ ← 撰写初稿(支持并行)
└───────────────┬───────────────┘
▼
┌───────────────────────────────┐
│ Article Review │ ← 对话式修改(交互式)
└───────────────┬───────────────┘
▼
┌───────────────────────────────┐
│ Illustrator Agent │ ← 生成配图(可选)
└───────────────┬───────────────┘
▼
┌───────────────────────────────┐
│ Adapter Agent │ ← 多平台适配(可选)
└───────────────┬───────────────┘
▼
┌─────────────────────────────────────────┐
│ 微信公众号版 │ 知乎版 │ 小红书版 │ ... │
└─────────────────────────────────────────┘
| Agent | 输入 | 输出 | 职责 |
|---|---|---|---|
| IntentAnalyzer | 用户 prompt | TaskContext | 提取写作意图:主题、类型、风格、受众 |
| Researcher | TaskContext / Outline | ResearchContext | 搜索参考文章和事实资料 |
| Planner | TaskContext + 参考资料 | ContentOutline | 规划文章结构:核心信息、章节、要点 |
| Writer | Outline + 研究资料 | DraftContent | 根据大纲撰写完整初稿 |
| Editor | 用户修改请求 + 文章 | 修改后文章 | 处理对话式修改请求 |
| Illustrator | 文章内容 | ArticleImage | 生成文章封面配图 |
| Adapter | 原始内容 | 多平台版本 | 适配不同平台的内容规范 |
详见 项目结构文档
- Python:>= 3.12
- API Key:OpenAI 或兼容 API(必需)
- Tavily API Key:用于研究功能(可选)
# 克隆项目
git clone https://github.com/yourusername/easywriter.git
cd easywriter
# 创建虚拟环境
python3.12 -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
# 安装依赖
pip install -r requirements.txt
# 配置环境变量
cp .env.example .env
# 编辑 .env 填入 OPENAI_API_KEY# 运行写作任务(默认启用交互式模式)
.venv/bin/easywriter run "帮我写一篇介绍 Python 装饰器的技术文章"
# 指定模型
.venv/bin/easywriter run "写一篇 AI Agent 入门" --model gpt-4o-mini
# 控制研究深度
.venv/bin/easywriter run "写一篇技术深度分析" --research-depth deep
.venv/bin/easywriter run "写一篇个人感想" --research-depth none
# 禁用配图
.venv/bin/easywriter run "写一篇不带配图的文章" --no-images
# 禁用交互式模式(跳过大纲审核和文章修改)
.venv/bin/easywriter run "写文章" --no-interactive
# 跳过特定交互阶段
.venv/bin/easywriter run "写文章" --skip-outline-review # 跳过大纲审核
.venv/bin/easywriter run "写文章" --skip-article-review # 跳过文章修改
# 启用多平台适配
.venv/bin/easywriter run "写文章" --adapt --platforms wechat,zhihu,xiaohongshu
# 指定输出目录
.venv/bin/easywriter run "写文章" --output-dir my_articles# 将已有文章适配到多个平台
.venv/bin/easywriter adapt article.md -p wechat,zhihu
# 适配到所有平台
.venv/bin/easywriter adapt article.md -p all -d ./output# 查看配置状态
.venv/bin/easywriter config
# 查看版本
.venv/bin/easywriter version创建 .env 文件(参考 .env.example):
| 环境变量 | 说明 | 默认值 |
|---|---|---|
OPENAI_API_KEY |
OpenAI 或兼容 API 密钥 | 必填 |
OPENAI_BASE_URL |
API 基础 URL | https://api.openai.com/v1 |
DEFAULT_MODEL |
默认模型 | gpt-4o |
TAVILY_API_KEY |
Tavily 搜索 API 密钥 | 可选(研究功能需要) |
LOG_LEVEL |
日志级别 | INFO |
MAX_RETRIES |
最大重试次数 | 3 |
REQUEST_TIMEOUT |
请求超时时间(秒) | 30 |
| 环境变量 | 说明 | 默认值 |
|---|---|---|
IMAGE_PROVIDER |
图像提供商(auto/openai/modelscope) | auto |
OPENAI_IMAGE_API_KEY |
OpenAI 图像 API 密钥 | 可选 |
OPENAI_IMAGE_BASE_URL |
OpenAI 图像 API URL | https://api.openai.com/v1 |
OPENAI_IMAGE_MODEL |
图像模型 | dall-e-3 |
MODELSCOPE_IMAGE_API_KEY |
ModelScope API 密钥 | 可选 |
MODELSCOPE_IMAGE_MODEL |
ModelScope 图像模型 | Qwen/Qwen-Image-2512 |
执行写作任务。
easywriter run <prompt> [OPTIONS]参数:
prompt:写作需求描述(必需)
选项:
| 选项 | 说明 | 默认值 |
|---|---|---|
--research-depth, -r |
研究深度:none/light/normal/deep | normal |
--images/--no-images |
是否生成配图 | --images |
--output-dir, -d |
输出根目录 | output |
--show-outline |
是否显示大纲 | True |
--show-config |
启动时显示配置 | True |
--parallel/--no-parallel |
是否并行生成章节 | --no-parallel |
--adapt/--no-adapt |
是否启用多平台适配 | --no-adapt |
--platforms, -p |
目标平台(逗号分隔) | zhihu |
-i, --interactive/--no-interactive |
是否启用交互式模式 | --interactive |
--skip-outline-review |
跳过大纲审核阶段 | False |
--skip-article-review |
跳过文章修改阶段 | False |
输出结构:
output/
└── {task_id}/
├── article.md # 主文章
├── outline.md # 内容大纲
├── images/ # 配图目录
│ └── cover.png # 封面图
└── adapted/ # 适配版本(如启用)
├── wechat/
├── zhihu/
├── xiaohongshu/
└── twitter/
适配已有内容到多个平台。
easywriter adapt <content_file> [OPTIONS]选项:
| 选项 | 说明 | 默认值 |
|---|---|---|
--platforms, -p |
目标平台(逗号分隔,支持 all) | wechat,zhihu |
--output-dir, -d |
输出目录 | adapted |
--title, -t |
文章标题 | 从文件读取 |
检查配置状态。
显示版本信息。
# 运行所有测试
.venv/bin/python -m pytest
# 运行单元测试
.venv/bin/python -m pytest tests/unit/ -v
# 快速自检
.venv/bin/python scripts/quick_test.py- 在
src/easywriter/agents/下创建新文件 - 继承
BaseAgent基类 - 实现
run(state: WritingState) -> WritingState方法 - 在
agents/__init__.py中导出
- 在
src/easywriter/adapters/下创建新文件 - 继承
BaseAdapter基类 - 实现必需的抽象方法
- 在
adapters/__init__.py中注册
- Phase 1: 核心 MVP(规划 → 写作)
- Phase 2: 研究能力集成(Tavily Search)
- Phase 3: 配图生成(DALL-E / ModelScope)
- Phase 4: 多平台适配
- Phase 5: 交互式编辑(大纲审核 + 对话式修改)
- Phase 6: 模块化架构重构(XML Prompt + 回调系统)
- Phase 7: 前端开发(Web UI)
- Phase 8: 更多 LLM 后端支持(Anthropic、本地模型)
- Phase 9: 记忆系统和风格学习
欢迎贡献代码、提出问题或建议!
- Fork 本项目
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 提交 Pull Request
本项目基于 MIT License 许可证开源。
- LangChain - 强大的 LLM 应用框架
- LangGraph - 多 Agent 工作流编排
- Tavily - 高质量 AI 搜索 API
- Typer - 现代化的 CLI 框架
- Rich - 优雅的终端输出
如果这个项目对您有帮助,请给一个 ⭐️ Star 支持一下!