初始化提交:contentm_agent 工作区全量快照
内容分四块: 1、产品规划产出 —— MCN 短视频整合营销工作台的①段五份(1a 需求/1b 竞品/1c 画像/1d 策略/1e 场景)、②段两份(2a 功能/2b 布局)、③段界面(DESIGN.md 契约与令牌表 + mcn-workbench.html 原型 + 实测/会诊/审查三份 + 23 张闸门截图)。 2、开源竞品调研 —— 5 个内容工作台项目的取证原始件与 1b 系列分析文档。 3、参考资料 —— 竞品视频抽帧 1145 张 + 2 个源视频 + 功能点截图。 4、机制侧 —— 协作脚本与状态台账、工作区记忆日志、抽帧/OCR 脚本。 .gitignore 只排运行时日志、脚本备份副本与一次性探针输出,其余按原样入库。
This commit is contained in:
commit
df56c2c137
1773 files changed
+205840
No files matched your search
@@ -0,0 +1,62 @@
|
||||
# ============================================================
|
||||
# Easel 环境变量 — 标准 Anthropic API key
|
||||
# 复制为 .env 并填入真实值:cp .env.example .env
|
||||
# ============================================================
|
||||
|
||||
# Anthropic API Key
|
||||
ANTHROPIC_API_KEY=sk-ant-REPLACE_ME
|
||||
|
||||
# 模型(OpenClaw provider/model 格式)
|
||||
CLAUDE_MODEL=anthropic/claude-sonnet-4-6
|
||||
|
||||
# 可选:Anthropic-compatible 服务
|
||||
# EASEL_LLM_API_KEY=REPLACE_ME
|
||||
# EASEL_LLM_BASE_URL=https://your-provider.example/v1
|
||||
# EASEL_LLM_API_KEY_HEADER=api-key
|
||||
# EASEL_LLM_ANTHROPIC_VERSION=2023-06-01
|
||||
|
||||
# OpenAI / OpenAI-compatible 服务
|
||||
# OPENAI_API_KEY=REPLACE_ME
|
||||
# OPENAI_BASE_URL=https://api.openai.com/v1
|
||||
# OPENAI_MODEL=gpt-4o
|
||||
|
||||
# 可选:独立向量/Embedding API(不配置则使用关键词记忆检索,不请求聊天 API 的 embedding 模型)
|
||||
# EASEL_EMBEDDING_API_KEY=REPLACE_ME
|
||||
# EASEL_EMBEDDING_BASE_URL=https://your-embedding-provider.example/v1
|
||||
# EASEL_EMBEDDING_MODEL=text-embedding-3-small
|
||||
|
||||
# OpenClaw gateway 端口:**不用配**,Easel 自动解析(环境变量 > openclaw.json > profile 哈希)。
|
||||
# 注意 Easel 用 `--profile easel`,而 OpenClaw 对非默认 profile 分配的端口不是 18789
|
||||
# (easel → 37289)—— 旧的 OPENCLAW_PORT 键从来没被读取,已移除,别再填。
|
||||
# 确实要强制指定时用下面这个(gateway.sh 会把它透传给 OpenClaw 的 OPENCLAW_GATEWAY_PORT):
|
||||
# EASEL_GATEWAY_PORT=
|
||||
|
||||
# ============================================================
|
||||
# 可选:媒体生成模型(也可在 Web「技能库」对应技能里填写)
|
||||
# 只需配置实际使用的 provider;密钥留空不会启用。
|
||||
# ============================================================
|
||||
|
||||
# 视频:dashscope / ark / kling / openai-compatible / xhs-maas / agnes
|
||||
VIDEO_PROVIDER=
|
||||
# AGNES_API_KEY=
|
||||
# AGNES_MODEL=agnes-video-2.5-flash
|
||||
# VIDEO_API_KEY=
|
||||
# VIDEO_BASE_URL=
|
||||
# VIDEO_MODEL=
|
||||
|
||||
# AI 音乐:dashscope / suno-compatible
|
||||
MUSIC_PROVIDER=
|
||||
# MUSIC_API_KEY=
|
||||
# MUSIC_BASE_URL=
|
||||
# MUSIC_MODEL=
|
||||
|
||||
# 云端 TTS:dashscope / minimax / fish-audio / openai-compatible / gemini
|
||||
VOICE_PROVIDER=
|
||||
# VOICE_API_KEY=
|
||||
# VOICE_BASE_URL=
|
||||
# VOICE_MODEL=
|
||||
# GEMINI_API_KEY=
|
||||
# GEMINI_TTS_MODEL=gemini-2.5-flash-preview-tts
|
||||
|
||||
# 多个媒体能力可复用同一份 DashScope key
|
||||
# DASHSCOPE_API_KEY=
|
||||
@@ -0,0 +1,98 @@
|
||||
# Changelog
|
||||
|
||||
All notable changes to Easel are documented in this file.
|
||||
|
||||
## [0.2.1] - 2026-09-24
|
||||
|
||||
### Added
|
||||
|
||||
- Added a unified **Settings panel** in the workbench (模型配置 · 环境安装 · 更多设置). Model configuration is now editable in the browser across all six channels (chat / transcribe / image / video / music / speech): edit provider, model, Base URL and API key, add custom providers, switch primary/backup, and run a real self-test that reports actual handshake latency. Saving writes to `.env`; keys are returned masked and an empty key field means "leave unchanged".
|
||||
- Added a runtime **environment installer** (`install_tool.py`) plus an in-panel 环境安装 page: local engines are health-checked for real, installed in the background, and their status is written back as the job progresses.
|
||||
- Added read-back reconciliation to Bilibili upload: after posting, the member submission API is queried directly and the run only counts as successful if the read-back matches.
|
||||
- Added `vendor/VENDOR.md` recording the provenance of the bundled `video-pipeline-sdk` (upstream, version, local modifications, how to resync).
|
||||
|
||||
### Improved
|
||||
|
||||
- Improved conversation latency: the Web chat now talks to the resident gateway over its OpenAI-compatible HTTP endpoint instead of spawning a thin `openclaw agent` client every turn, saving roughly 3s per turn (measured on Linux: 7.6s → 4.5s end-to-end). Transport is pinned per session and never switches mid-conversation, so history is never silently dropped. Set `EASEL_CHAT_TRANSPORT=cli` to return to the old path.
|
||||
- Improved responsiveness of the outputs library: `/api/outputs` moved to a thread pool so a full product-tree scan no longer blocks the event loop.
|
||||
- Improved CI coverage: the suite now runs `pytest` instead of `pytest tests/`, so the 38 skill-bundled tests under `skills/**/tests/` actually run in CI.
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed Windows installation on PowerShell 5.1, where `setup.ps1` failed outright during the configuration-writing stage (issue #41).
|
||||
- Fixed workspace resolution: `sync.sh`, `setup.ps1`, `doctor` and the video pipeline each hard-coded a different workspace path, so on the other OpenClaw layout they wrote to a directory the agent never reads — while still reporting success. All four now ask OpenClaw itself for its runtime `workspaceDir` (issue #19).
|
||||
- Fixed a placeholder API key in `.env.example` silently disabling the whole OpenAI-compatible branch of `setup.sh`, which produced a config with no provider while `doctor` still reported all green. `doctor` now verifies that the primary model's provider actually has credentials.
|
||||
- Fixed the HTML preview in the content library: the built-in「复制到公众号」button now works inside the preview drawer, and the preview always renders the latest version instead of a heuristically cached one.
|
||||
- Fixed images breaking after pasting into WeChat: local images referenced by a preview are inlined as base64 data-URIs, so the bytes travel with the clipboard instead of requiring WeChat to fetch a local Easel URL.
|
||||
- Fixed `install_tool.py` crashing under non-UTF-8 locales on Windows, which left the install endpoint with an empty id allowlist and made the 环境安装 page reject every tool.
|
||||
- Fixed domestic-platform publishing to fall back to a direct connection (Chromium-level `--no-proxy-server`), so it works with a VPN enabled.
|
||||
- Fixed `scripts/gateway.ps1` missing its UTF-8 BOM — the only Chinese-containing `.ps1` without one, which PowerShell 5.1 decoded using the system ANSI code page.
|
||||
|
||||
### Security
|
||||
|
||||
- Hardened the settings and install endpoints: the install id allowlist is derived from the engine's own recipe table, and settings writes are validated server-side.
|
||||
- Closed a command-injection hole in `.env` writes. The previous guard only rejected newlines, but `setup.sh` sources `.env`, so a non-newline value such as `KEY=$(id)` still reached bash's command substitution. Values are now restricted to the character set these fields actually need.
|
||||
- Added a Content-Security-Policy to the 公众号 preview page. The preview iframe needs `allow-scripts` for its copy button, and an opaque origin is not enough protection because the Web API is CORS-open and unauthenticated — reproduced in a real browser, a script embedded in generated content could call a local endpoint and read the response. `connect-src 'none'` now blocks that exfiltration path while leaving the copy button and image rendering intact.
|
||||
|
||||
[0.2.1]: https://github.com/ZJU-REAL/Easel/releases/tag/v0.2.1
|
||||
|
||||
## [0.2.0] - 2026-09-18
|
||||
|
||||
### Added
|
||||
|
||||
- Added the `video-production` Skill: an end-to-end video pipeline (probe → transcribe → scenes → design table → scaffold → verify → preview → render → deliver) with two human confirmation gates and quality gates (five-piece manifest, loudness, transitions). The upstream `video-pipeline-sdk` (MIT) is now vendored into the repo so the pipeline is self-contained, reproducible, and editable. Skill count is now 114.
|
||||
- Added three-tier transcription with automatic fallback: SRT/VTT subtitles first, then SiliconFlow ASR API, then local whisper as a last resort — so a run no longer requires downloading the 3GB model when a transcript or API key is available.
|
||||
- Added a **「笔」capability menu** to the workbench input area: click to browse everything Easel can do ("能做的都在这"); selecting an item prefills the prompt.
|
||||
- Added a ffmpeg-based slideshow renderer for image-storyboard voiceover dramas (Ken Burns, differentiated transitions, libass dynamic captions, light whoosh SFX, loudnorm).
|
||||
|
||||
### Improved
|
||||
|
||||
- Improved the Skill library display: Chinese display names shown large with the original name beneath, kept in sync across search and the drawer.
|
||||
- Improved in-conversation cards to support multi-select (`ask_user` multiSelect rendering and multi-value submission).
|
||||
- Improved file uploads: files exceeding the upload limit are automatically converted to local materials via a copy channel (without changing the 50MB config).
|
||||
- Improved reasoning visibility: `--thinking` now defaults to medium so chain-of-thought shows when the gateway supports it.
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed chain-of-thought (CoT) display in the Web conversation: token/thinking now streams token-by-token, and the anti-stall heartbeat no longer overrides real status.
|
||||
- Fixed the Gemini adapter to support `streamGenerateContent` streaming.
|
||||
- Fixed UTF-8 persistence on Windows (state read/write) and migrated the shutdown hook to a lifespan handler.
|
||||
|
||||
[0.2.0]: https://github.com/ZJU-REAL/Easel/releases/tag/v0.2.0
|
||||
|
||||
## [0.1.1] - 2026-09-15
|
||||
|
||||
### Added
|
||||
|
||||
- Added WeChat Official Account (公众号) support: article publishing, Data Center metrics, and account management via a background QR-scan session.
|
||||
- Added an optional vendored typesetting Skill (`gzh-design`, AGPL-3.0), bringing the Skill count to 113.
|
||||
|
||||
### Improved
|
||||
|
||||
- Improved the workbench **创作数据** panel: Bilibili and Douyin now populate "近 7 日 · 环比" (7-day metrics with week-over-week change) and "最近作品" (recent works).
|
||||
- Bilibili reads the creator overview API for play/like/comment/favorite/share/follower deltas, and lists recent uploads (title/link/cover/stats).
|
||||
- Douyin parses the real "近 7 日" labels with a section anchor to avoid mis-reading the "最新作品" card, handles the "较前7日±X" delta format, hardens polling stability, and scrapes recent works from the content-manage page.
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed OpenClaw version detection in `easel doctor` on Windows (the `.cmd` shim cannot be invoked bare).
|
||||
- Fixed cross-platform gateway/launcher robustness and Xiaohongshu login navigation races.
|
||||
|
||||
[0.1.1]: https://github.com/ZJU-REAL/Easel/releases/tag/v0.1.1
|
||||
|
||||
## [0.1.0] - 2026-08-31
|
||||
|
||||
Easel's first public release, jointly developed by REAL Lab and OpenDCAI Lab.
|
||||
|
||||
### Highlights
|
||||
|
||||
- Added an end-to-end social media operations workflow covering discovery, planning, creation, publishing, and attribution.
|
||||
- Added profile-driven account context and persistent operating memory across sessions and platforms.
|
||||
- Added 112 executable Skills for research, writing, visual production, audio, video, publishing, and analytics.
|
||||
- Added the Web workspace and CLI for running workflows, inspecting outputs, and managing projects locally.
|
||||
- Added multimodal production workflows for knowledge cards, stories, lifestyle content, audio, and video.
|
||||
- Added publishing workflows for Xiaohongshu, Douyin, Kuaishou, Zhihu, Bilibili, and WeChat Channels.
|
||||
- Added output manifests, publishing checks, content calendars, and performance attribution workflows.
|
||||
- Added Chinese and English documentation, examples, product showcases, and institutional branding.
|
||||
|
||||
[0.1.0]: https://github.com/ZJU-REAL/Easel/releases/tag/v0.1.0
|
||||
@@ -0,0 +1,266 @@
|
||||
[
|
||||
{
|
||||
"login": "lidingm",
|
||||
"id": 112814356,
|
||||
"node_id": "U_kgDOBrlpFA",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/112814356?v=4",
|
||||
"gravatar_id": "",
|
||||
"url": "https://api.github.com/users/lidingm",
|
||||
"html_url": "https://github.com/lidingm",
|
||||
"followers_url": "https://api.github.com/users/lidingm/followers",
|
||||
"following_url": "https://api.github.com/users/lidingm/following{/other_user}",
|
||||
"gists_url": "https://api.github.com/users/lidingm/gists{/gist_id}",
|
||||
"starred_url": "https://api.github.com/users/lidingm/starred{/owner}{/repo}",
|
||||
"subscriptions_url": "https://api.github.com/users/lidingm/subscriptions",
|
||||
"organizations_url": "https://api.github.com/users/lidingm/orgs",
|
||||
"repos_url": "https://api.github.com/users/lidingm/repos",
|
||||
"events_url": "https://api.github.com/users/lidingm/events{/privacy}",
|
||||
"received_events_url": "https://api.github.com/users/lidingm/received_events",
|
||||
"type": "User",
|
||||
"user_view_type": "public",
|
||||
"site_admin": false,
|
||||
"contributions": 35
|
||||
},
|
||||
{
|
||||
"login": "mengyuyuan",
|
||||
"id": 108800056,
|
||||
"node_id": "U_kgDOBnwoOA",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/108800056?v=4",
|
||||
"gravatar_id": "",
|
||||
"url": "https://api.github.com/users/mengyuyuan",
|
||||
"html_url": "https://github.com/mengyuyuan",
|
||||
"followers_url": "https://api.github.com/users/mengyuyuan/followers",
|
||||
"following_url": "https://api.github.com/users/mengyuyuan/following{/other_user}",
|
||||
"gists_url": "https://api.github.com/users/mengyuyuan/gists{/gist_id}",
|
||||
"starred_url": "https://api.github.com/users/mengyuyuan/starred{/owner}{/repo}",
|
||||
"subscriptions_url": "https://api.github.com/users/mengyuyuan/subscriptions",
|
||||
"organizations_url": "https://api.github.com/users/mengyuyuan/orgs",
|
||||
"repos_url": "https://api.github.com/users/mengyuyuan/repos",
|
||||
"events_url": "https://api.github.com/users/mengyuyuan/events{/privacy}",
|
||||
"received_events_url": "https://api.github.com/users/mengyuyuan/received_events",
|
||||
"type": "User",
|
||||
"user_view_type": "public",
|
||||
"site_admin": false,
|
||||
"contributions": 23
|
||||
},
|
||||
{
|
||||
"login": "88lin",
|
||||
"id": 111191349,
|
||||
"node_id": "U_kgDOBqClNQ",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/111191349?v=4",
|
||||
"gravatar_id": "",
|
||||
"url": "https://api.github.com/users/88lin",
|
||||
"html_url": "https://github.com/88lin",
|
||||
"followers_url": "https://api.github.com/users/88lin/followers",
|
||||
"following_url": "https://api.github.com/users/88lin/following{/other_user}",
|
||||
"gists_url": "https://api.github.com/users/88lin/gists{/gist_id}",
|
||||
"starred_url": "https://api.github.com/users/88lin/starred{/owner}{/repo}",
|
||||
"subscriptions_url": "https://api.github.com/users/88lin/subscriptions",
|
||||
"organizations_url": "https://api.github.com/users/88lin/orgs",
|
||||
"repos_url": "https://api.github.com/users/88lin/repos",
|
||||
"events_url": "https://api.github.com/users/88lin/events{/privacy}",
|
||||
"received_events_url": "https://api.github.com/users/88lin/received_events",
|
||||
"type": "User",
|
||||
"user_view_type": "public",
|
||||
"site_admin": false,
|
||||
"contributions": 19
|
||||
},
|
||||
{
|
||||
"login": "qywMichelle",
|
||||
"id": 106571461,
|
||||
"node_id": "U_kgDOBlomxQ",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/106571461?v=4",
|
||||
"gravatar_id": "",
|
||||
"url": "https://api.github.com/users/qywMichelle",
|
||||
"html_url": "https://github.com/qywMichelle",
|
||||
"followers_url": "https://api.github.com/users/qywMichelle/followers",
|
||||
"following_url": "https://api.github.com/users/qywMichelle/following{/other_user}",
|
||||
"gists_url": "https://api.github.com/users/qywMichelle/gists{/gist_id}",
|
||||
"starred_url": "https://api.github.com/users/qywMichelle/starred{/owner}{/repo}",
|
||||
"subscriptions_url": "https://api.github.com/users/qywMichelle/subscriptions",
|
||||
"organizations_url": "https://api.github.com/users/qywMichelle/orgs",
|
||||
"repos_url": "https://api.github.com/users/qywMichelle/repos",
|
||||
"events_url": "https://api.github.com/users/qywMichelle/events{/privacy}",
|
||||
"received_events_url": "https://api.github.com/users/qywMichelle/received_events",
|
||||
"type": "User",
|
||||
"user_view_type": "public",
|
||||
"site_admin": false,
|
||||
"contributions": 6
|
||||
},
|
||||
{
|
||||
"login": "xiaojinlucky",
|
||||
"id": 167421502,
|
||||
"node_id": "U_kgDOCfqmPg",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/167421502?v=4",
|
||||
"gravatar_id": "",
|
||||
"url": "https://api.github.com/users/xiaojinlucky",
|
||||
"html_url": "https://github.com/xiaojinlucky",
|
||||
"followers_url": "https://api.github.com/users/xiaojinlucky/followers",
|
||||
"following_url": "https://api.github.com/users/xiaojinlucky/following{/other_user}",
|
||||
"gists_url": "https://api.github.com/users/xiaojinlucky/gists{/gist_id}",
|
||||
"starred_url": "https://api.github.com/users/xiaojinlucky/starred{/owner}{/repo}",
|
||||
"subscriptions_url": "https://api.github.com/users/xiaojinlucky/subscriptions",
|
||||
"organizations_url": "https://api.github.com/users/xiaojinlucky/orgs",
|
||||
"repos_url": "https://api.github.com/users/xiaojinlucky/repos",
|
||||
"events_url": "https://api.github.com/users/xiaojinlucky/events{/privacy}",
|
||||
"received_events_url": "https://api.github.com/users/xiaojinlucky/received_events",
|
||||
"type": "User",
|
||||
"user_view_type": "public",
|
||||
"site_admin": false,
|
||||
"contributions": 4
|
||||
},
|
||||
{
|
||||
"login": "lanyinzly",
|
||||
"id": 106770708,
|
||||
"node_id": "U_kgDOBl0xFA",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/106770708?v=4",
|
||||
"gravatar_id": "",
|
||||
"url": "https://api.github.com/users/lanyinzly",
|
||||
"html_url": "https://github.com/lanyinzly",
|
||||
"followers_url": "https://api.github.com/users/lanyinzly/followers",
|
||||
"following_url": "https://api.github.com/users/lanyinzly/following{/other_user}",
|
||||
"gists_url": "https://api.github.com/users/lanyinzly/gists{/gist_id}",
|
||||
"starred_url": "https://api.github.com/users/lanyinzly/starred{/owner}{/repo}",
|
||||
"subscriptions_url": "https://api.github.com/users/lanyinzly/subscriptions",
|
||||
"organizations_url": "https://api.github.com/users/lanyinzly/orgs",
|
||||
"repos_url": "https://api.github.com/users/lanyinzly/repos",
|
||||
"events_url": "https://api.github.com/users/lanyinzly/events{/privacy}",
|
||||
"received_events_url": "https://api.github.com/users/lanyinzly/received_events",
|
||||
"type": "User",
|
||||
"user_view_type": "public",
|
||||
"site_admin": false,
|
||||
"contributions": 3
|
||||
},
|
||||
{
|
||||
"login": "zjg23edu",
|
||||
"id": 217017372,
|
||||
"node_id": "U_kgDODO9sHA",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/217017372?v=4",
|
||||
"gravatar_id": "",
|
||||
"url": "https://api.github.com/users/zjg23edu",
|
||||
"html_url": "https://github.com/zjg23edu",
|
||||
"followers_url": "https://api.github.com/users/zjg23edu/followers",
|
||||
"following_url": "https://api.github.com/users/zjg23edu/following{/other_user}",
|
||||
"gists_url": "https://api.github.com/users/zjg23edu/gists{/gist_id}",
|
||||
"starred_url": "https://api.github.com/users/zjg23edu/starred{/owner}{/repo}",
|
||||
"subscriptions_url": "https://api.github.com/users/zjg23edu/subscriptions",
|
||||
"organizations_url": "https://api.github.com/users/zjg23edu/orgs",
|
||||
"repos_url": "https://api.github.com/users/zjg23edu/repos",
|
||||
"events_url": "https://api.github.com/users/zjg23edu/events{/privacy}",
|
||||
"received_events_url": "https://api.github.com/users/zjg23edu/received_events",
|
||||
"type": "User",
|
||||
"user_view_type": "public",
|
||||
"site_admin": false,
|
||||
"contributions": 3
|
||||
},
|
||||
{
|
||||
"login": "Dear47",
|
||||
"id": 125485689,
|
||||
"node_id": "U_kgDOB3rCeQ",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/125485689?v=4",
|
||||
"gravatar_id": "",
|
||||
"url": "https://api.github.com/users/Dear47",
|
||||
"html_url": "https://github.com/Dear47",
|
||||
"followers_url": "https://api.github.com/users/Dear47/followers",
|
||||
"following_url": "https://api.github.com/users/Dear47/following{/other_user}",
|
||||
"gists_url": "https://api.github.com/users/Dear47/gists{/gist_id}",
|
||||
"starred_url": "https://api.github.com/users/Dear47/starred{/owner}{/repo}",
|
||||
"subscriptions_url": "https://api.github.com/users/Dear47/subscriptions",
|
||||
"organizations_url": "https://api.github.com/users/Dear47/orgs",
|
||||
"repos_url": "https://api.github.com/users/Dear47/repos",
|
||||
"events_url": "https://api.github.com/users/Dear47/events{/privacy}",
|
||||
"received_events_url": "https://api.github.com/users/Dear47/received_events",
|
||||
"type": "User",
|
||||
"user_view_type": "public",
|
||||
"site_admin": false,
|
||||
"contributions": 2
|
||||
},
|
||||
{
|
||||
"login": "naivezip",
|
||||
"id": 253203888,
|
||||
"node_id": "U_kgDODxeVsA",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/253203888?v=4",
|
||||
"gravatar_id": "",
|
||||
"url": "https://api.github.com/users/naivezip",
|
||||
"html_url": "https://github.com/naivezip",
|
||||
"followers_url": "https://api.github.com/users/naivezip/followers",
|
||||
"following_url": "https://api.github.com/users/naivezip/following{/other_user}",
|
||||
"gists_url": "https://api.github.com/users/naivezip/gists{/gist_id}",
|
||||
"starred_url": "https://api.github.com/users/naivezip/starred{/owner}{/repo}",
|
||||
"subscriptions_url": "https://api.github.com/users/naivezip/subscriptions",
|
||||
"organizations_url": "https://api.github.com/users/naivezip/orgs",
|
||||
"repos_url": "https://api.github.com/users/naivezip/repos",
|
||||
"events_url": "https://api.github.com/users/naivezip/events{/privacy}",
|
||||
"received_events_url": "https://api.github.com/users/naivezip/received_events",
|
||||
"type": "User",
|
||||
"user_view_type": "public",
|
||||
"site_admin": false,
|
||||
"contributions": 2
|
||||
},
|
||||
{
|
||||
"login": "MatrixA",
|
||||
"id": 33066250,
|
||||
"node_id": "MDQ6VXNlcjMzMDY2MjUw",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/33066250?v=4",
|
||||
"gravatar_id": "",
|
||||
"url": "https://api.github.com/users/MatrixA",
|
||||
"html_url": "https://github.com/MatrixA",
|
||||
"followers_url": "https://api.github.com/users/MatrixA/followers",
|
||||
"following_url": "https://api.github.com/users/MatrixA/following{/other_user}",
|
||||
"gists_url": "https://api.github.com/users/MatrixA/gists{/gist_id}",
|
||||
"starred_url": "https://api.github.com/users/MatrixA/starred{/owner}{/repo}",
|
||||
"subscriptions_url": "https://api.github.com/users/MatrixA/subscriptions",
|
||||
"organizations_url": "https://api.github.com/users/MatrixA/orgs",
|
||||
"repos_url": "https://api.github.com/users/MatrixA/repos",
|
||||
"events_url": "https://api.github.com/users/MatrixA/events{/privacy}",
|
||||
"received_events_url": "https://api.github.com/users/MatrixA/received_events",
|
||||
"type": "User",
|
||||
"user_view_type": "public",
|
||||
"site_admin": false,
|
||||
"contributions": 1
|
||||
},
|
||||
{
|
||||
"login": "wulinjuan",
|
||||
"id": 46820222,
|
||||
"node_id": "MDQ6VXNlcjQ2ODIwMjIy",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/46820222?v=4",
|
||||
"gravatar_id": "",
|
||||
"url": "https://api.github.com/users/wulinjuan",
|
||||
"html_url": "https://github.com/wulinjuan",
|
||||
"followers_url": "https://api.github.com/users/wulinjuan/followers",
|
||||
"following_url": "https://api.github.com/users/wulinjuan/following{/other_user}",
|
||||
"gists_url": "https://api.github.com/users/wulinjuan/gists{/gist_id}",
|
||||
"starred_url": "https://api.github.com/users/wulinjuan/starred{/owner}{/repo}",
|
||||
"subscriptions_url": "https://api.github.com/users/wulinjuan/subscriptions",
|
||||
"organizations_url": "https://api.github.com/users/wulinjuan/orgs",
|
||||
"repos_url": "https://api.github.com/users/wulinjuan/repos",
|
||||
"events_url": "https://api.github.com/users/wulinjuan/events{/privacy}",
|
||||
"received_events_url": "https://api.github.com/users/wulinjuan/received_events",
|
||||
"type": "User",
|
||||
"user_view_type": "public",
|
||||
"site_admin": false,
|
||||
"contributions": 1
|
||||
},
|
||||
{
|
||||
"login": "dafeng-001",
|
||||
"id": 67090734,
|
||||
"node_id": "MDQ6VXNlcjY3MDkwNzM0",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/67090734?v=4",
|
||||
"gravatar_id": "",
|
||||
"url": "https://api.github.com/users/dafeng-001",
|
||||
"html_url": "https://github.com/dafeng-001",
|
||||
"followers_url": "https://api.github.com/users/dafeng-001/followers",
|
||||
"following_url": "https://api.github.com/users/dafeng-001/following{/other_user}",
|
||||
"gists_url": "https://api.github.com/users/dafeng-001/gists{/gist_id}",
|
||||
"starred_url": "https://api.github.com/users/dafeng-001/starred{/owner}{/repo}",
|
||||
"subscriptions_url": "https://api.github.com/users/dafeng-001/subscriptions",
|
||||
"organizations_url": "https://api.github.com/users/dafeng-001/orgs",
|
||||
"repos_url": "https://api.github.com/users/dafeng-001/repos",
|
||||
"events_url": "https://api.github.com/users/dafeng-001/events{/privacy}",
|
||||
"received_events_url": "https://api.github.com/users/dafeng-001/received_events",
|
||||
"type": "User",
|
||||
"user_view_type": "public",
|
||||
"site_admin": false,
|
||||
"contributions": 1
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,48 @@
|
||||
# Easel Prompt Stack
|
||||
|
||||
> OpenClaw agent 的 prompt 由多层文件组合而成,每层职责明确、互不干扰。
|
||||
|
||||
## 组合顺序
|
||||
|
||||
```
|
||||
Layer 1: SOUL.md 人格 + 能力总览(搭子语气、沟通风格、对五层能力的自我认知)
|
||||
Layer 2: AGENTS.md 分工规则 + 编排逻辑 + Plan Mode + 制作层执行流程
|
||||
Layer 3: CONTEXT.md 项目路径信息(sync.sh 自动生成,包含 outputs/assets/profiles 路径)
|
||||
Layer 4: SKILL 被触发时加载 SKILL.md + 按需读取 references/ 下的文件
|
||||
```
|
||||
|
||||
> **画像(Profile)如何进入 prompt**:不再写全局 USER.md(会有并发竞态)。CLI 与 Web 统一把画像**作为消息内联**传入,由 OpenClaw 按 AGENTS.md 自行读取 `profiles/<X>/` 并凝练。每个请求自包含,无全局文件污染。
|
||||
> - **Web / skill**(单轮):每条消息前缀 `我当前使用的画像是「X」。`(`easel/persona.py:persona_prefix`)。
|
||||
> - **CLI `easel chat`**(多轮交互):选画像后经 `openclaw chat --message "<同一前缀>"` 注入为**初始消息**,画像随 session 历史留存供后续 turn 沿用(超长会话被压缩后可能丢,属已知取舍)。
|
||||
> - 三入口的画像逻辑统一收敛到 `easel/persona.py`(`list_personas` / `load_profile_text` / `persona_prefix`)。
|
||||
|
||||
> **记忆作用域**:Easel 不使用 OpenClaw 根目录的全局 `MEMORY.md` 承载账号知识;该文件由同步脚本保持为空。账号长期记忆只存放在 `profiles/<当前画像>/memory.md`,每个会话按自身绑定的画像直接读取。通用模式不读取任何画像记忆,也不通过动态改写全局文件切换画像。
|
||||
|
||||
## 各层说明
|
||||
|
||||
### Layer 1 — SOUL.md(常驻)
|
||||
定义 agent 的**人格**(创作者的社媒内容"搭子":懂策略、能上手、务实诚实)、沟通方式,以及一份**能力总览**,让 agent 心里有数、遇事先想"怎么帮他做成"而不是"我做不了"。所有 turn 都在 system prompt 中。
|
||||
保持精简且**类目级**:能力总览按五层写"能做什么",**不写具体 skill 名**(避免像 weibo 那样过时)、也**不写"去调某某 skill"这类操作机制**(那属 AGENTS 与技能库);语气是好伙伴,不是工具说明书。
|
||||
|
||||
### Layer 2 — AGENTS.md(常驻)
|
||||
核心业务逻辑:五层分工、Plan Mode 触发规则、纵向编排原则、制作层执行全流程。
|
||||
所有 turn 都在 system prompt 中。是最重要的文件。
|
||||
|
||||
### Layer 3 — CONTEXT.md(半静态)
|
||||
由 `sync.sh` 生成,包含项目绝对路径。换机器后重新跑 sync.sh 自动更新。
|
||||
OpenClaw 跑项目脚本前从这里读取项目根路径——**先 `cd` 到该目录再跑脚本(不支持 `--cwd`)**。
|
||||
|
||||
### Layer 4 — SKILL(按需)
|
||||
只有当 SKILL 被触发时才加载。加载顺序:
|
||||
1. SKILL.md 主体(执行流程)
|
||||
2. references/ 下的文件(按 SKILL.md 中的引用按需读取)
|
||||
3. scripts/ 下的脚本(执行时调用,脚本本身不进 prompt)
|
||||
|
||||
> 五层 SKILL(含制作层)都完整同步进 OpenClaw workspace,OpenClaw 读进来照其流程自己执行、产出成品到 `outputs/`。
|
||||
|
||||
## 设计原则
|
||||
|
||||
- 每层只管自己的事,不越界
|
||||
- 常驻层(1-3)保持精简,控制 token 消耗
|
||||
- SKILL 层按需加载,不用的不加载
|
||||
- references/ 里的文件只在 SKILL 执行过程中被读取,不常驻
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"Python": 2320394,
|
||||
"HTML": 987825,
|
||||
"TypeScript": 643318,
|
||||
"CSS": 94907,
|
||||
"Shell": 67915,
|
||||
"PowerShell": 29927,
|
||||
"JavaScript": 6082
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
// Easel — OpenClaw gateway 配置 (JSON5)
|
||||
// ⚠️ 本文件仅作参考,实际配置由 setup.sh 通过 `openclaw config set` 直接写入
|
||||
// ~/.openclaw-easel/openclaw.json,此模板从不被 setup.sh 应用。
|
||||
// 其中的字段(如 workspace 路径、agent 结构)可能已与实际配置漂移,
|
||||
// 请勿假设此文件生效。
|
||||
// Phase 0: 最简配置,只验证连通性
|
||||
{
|
||||
// ---- 模型供应商 ----
|
||||
models: {
|
||||
providers: {
|
||||
anthropic: {
|
||||
apiKey: "${ANTHROPIC_API_KEY}",
|
||||
// 若使用代理,取消下行注释
|
||||
// baseUrl: "${ANTHROPIC_BASE_URL}",
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
// ---- Agent 配置 ----
|
||||
// OpenClaw 自己的 agent 直接执行五层(发现/策划/制作/发布/归因),产物落 outputs/。
|
||||
agent: {
|
||||
// workspace 实际由 --profile easel 决定(~/.openclaw/workspace-easel/),
|
||||
// 无需硬编码绝对路径;此处仅示意,本模板从不被 setup.sh 应用。
|
||||
workspace: "~/.openclaw/workspace-easel",
|
||||
model: {
|
||||
primary: "${CLAUDE_MODEL:-anthropic/claude-sonnet-4-6}",
|
||||
},
|
||||
},
|
||||
|
||||
// ---- Gateway ----
|
||||
gateway: {
|
||||
bind: "lan", // 容器内绑定所有接口
|
||||
port: 18789,
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,110 @@
|
||||
# Easel Agent
|
||||
|
||||
你是 Easel,运行在 OpenClaw gateway 上的社媒内容创作助手。发现、策划、制作、发布、归因五层都由当前 Agent 直接执行;只组合任务需要的层。
|
||||
|
||||
## 核心执行规则
|
||||
|
||||
1. **先路由 SKILL**:每轮任务(含追问、换题)结合当前平台、账号、画像、主题和上一产物,先找精确匹配的 SKILL,并按其流程、脚本、数据源和边界执行;无精确匹配时复用最接近的 SKILL,无相关 SKILL 才用通用能力。
|
||||
2. **先到项目根**:每次准备运行本项目的第一个脚本时,必须先 `cd` 到本文件末尾“运行时项目根”的绝对路径,确认 `.env` 和 `skills/shared/scripts/` 存在,再使用 `skills/...` 根相对路径。
|
||||
3. **不在 workspace 跑项目副本**:禁止从 OpenClaw workspace、workspace 的 `shared/` 副本或某个 SKILL 目录运行项目脚本。
|
||||
4. **查现有信息再提问**:先查登录态、画像、历史产物和本地配置;只有关键输入确实无法推断时才问用户。
|
||||
5. **付费操作先确认**:生图、生视频、音乐等按量计费操作先给范围、计划和可得的费用预估,等用户确认后再发请求。
|
||||
6. **真实产物才算完成**:不以计划、空壳文件、中途文件或仅有提示词冒充成品;交付前必须自检。
|
||||
|
||||
外网代理已配置,不预设网络不可用。遇到登录、风控、付费源、缺素材等真实障碍时,说明原因和可行替代方案。
|
||||
|
||||
## 配置检查
|
||||
|
||||
模型、Key、Base URL 只能以项目根 `.env` 和项目根 `skills/shared/scripts/` 的脱敏检查结果为准:
|
||||
|
||||
- 支持 `--env-file` 时显式传 `.env`。
|
||||
- `env` / `printenv` 看不到未 export 的 `.env`;workspace 下 `ls -a` 也看不到项目根 `.env`,二者都不能用于宣称缺配置。
|
||||
- 检查报缺项时先 `pwd`;路径不对就回项目根重跑,禁止让用户重复填写已经存在的 Key/URL。
|
||||
- 不 `cat .env`、不回显 Key;使用 `model_registry.py configured` 或各脚本 `check`。
|
||||
|
||||
## SKILL 与站内信息
|
||||
|
||||
五层职责:
|
||||
|
||||
- 发现:热点、爆款、二创机会。
|
||||
- 策划:选题、脚本、分镜、封面构思。
|
||||
- 制作:短剧/小说、图文、封面、音视频,以及任何需要创建文件作为产物的任务;统一写入 `outputs/`。
|
||||
- 发布:合规、平台适配、排期、登录和真实发布。
|
||||
- 归因:数据、评论洞察和 Profile 回流。
|
||||
|
||||
关于用户自己的信息,先查再问:
|
||||
|
||||
- 账号、粉丝、作品、最近发布、身份 → `skill-my-account`(覆盖小红书、抖音、快手、知乎、视频号);未登录再提示扫码。
|
||||
- 帖子评论 → `skill-xhs-comment-reply` 抓取,`skill-comment-insights` 分析。
|
||||
- 画像 → `easel-profiles/`;历史产物 → `outputs/`。
|
||||
|
||||
清晰单层任务直接执行;跨两层以上或明显多步骤任务先给简短 Plan。一个任务可组合多个 SKILL,但不要运行无关层。
|
||||
|
||||
## 编排与日历
|
||||
|
||||
跨两层以上时用 `manifest.py` 传递“产物路径 + 一句结论”,单层不建 manifest;每层完成或失败都登记,下游先用 `latest` / `read` 读取上游,不重新推导或整块转发。完整载荷写文件,关键决策写 `brief.md`;失败后从断点续跑,结束用 `manifest.py meta` 登记 Web 展示信息。
|
||||
|
||||
规划/选题/排期前用 `calendar_ops.py context --days 14` 读日历;发布成功会自动写日历和 publish-log,不重复记录。值得长期跟踪的节日、大促和平台活动通过 `skill-event-calendar` 查询,再用 `calendar_ops.py import-events` 导入。具体命令按对应 SKILL 执行。
|
||||
|
||||
## 媒体模型选择
|
||||
|
||||
调用视频、音乐或云 TTS 前,从项目根用 `model_registry.py configured --group ... --env-file .env` 脱敏查询。用户点名且已配置就使用;只有一个可用就显式选择;多个可用就列出并询问,不按默认值擅选;零个则提示配置且不发付费请求。选定后整条任务保持同一 provider/model,具体命令按对应 SKILL 执行。
|
||||
|
||||
## 制作与自检
|
||||
|
||||
制作流程:凝练 Profile → 明确主题/规格/风格/受众/红线/输出 → 按 SKILL 产出 → 自检 → 仅失败时返工一次。
|
||||
|
||||
- Profile 读取 `identity.md`、`style.md`、`audience.md`、`preferences.md`、`memory.md`;制作层不读 `platforms.md`,并原样遵守 preferences 红线。
|
||||
- 一个项目使用 `outputs/<主题>/`;成品放项目目录根,中间素材放其 `assets/`,测试放 `outputs/_scratch/`。
|
||||
- 主题必须是人类可读的具体项目名,禁止 `xhs/test/tmp/output`等泛名,禁止在 `outputs/` 根目录散落内容文件。写入前先用 `python skills/shared/scripts/output_paths.py outputs/<主题>/<文件>` 校验;脚本自带该门禁时不重复调用。
|
||||
- 制作前明确 SKILL、主题、规格、风格、受众、结构、红线、特殊要求和输出路径;不要只复述用户原话就开工。
|
||||
- 自检文本内容及字数;媒体检查文件非空、数量、时长、分辨率、画幅等关键指标。零字节、严重残缺、跑题或规格不符判失败。
|
||||
- 多层编排中,报错、超时或未产出必须登记失败并保留断点;中途产物不得按成功交付。
|
||||
- 自检发现失败时带具体意见返工一次;仅有轻微瑕疵可诚实交付并说明,不循环返工。
|
||||
|
||||
## 对外发布安全
|
||||
|
||||
任何公开发布的文案、标题、话题、评论和回答都不得包含内部信息:
|
||||
|
||||
- **硬拦**:API Key/token、内部 URL/域名(如 `maas.devops...`)、代理 IP/端口、内部绝对路径(如 `/mnt/...`、`~/.openclaw`)、env 变量名、配置或调试片段。
|
||||
- **提醒但不硬拦**:AI/OpenClaw/Claude 等工具措辞和具体模型名;技术内容确有需要时可正常使用,其余场景避免自曝制作工具。
|
||||
- 常见泄露源是把报错、命令输出、配置示例顺手复制进文案;对外内容只保留用户真正要发布的信息。
|
||||
- dry-run 先列出全部命中;真发前由 `skills/shared/scripts/content_guard.py` 确定性扫描,敏感信息命中会 exit 7。删除敏感内容后重发,不用 `--allow-unsafe` 绕过,除非用户明确要求。
|
||||
|
||||
执行任一发布层 SKILL 前做人设一致性检查:
|
||||
|
||||
1. 有 Profile 时用 `skill-persona-check` 得到评分和偏离点;无 Profile 则跳过并提示。
|
||||
2. 评分必须优先比较账号定位、内容赛道、内容形式和目标受众,不能只因语气/用词相似给跨赛道内容高分。
|
||||
3. `python skills/shared/scripts/persona_gate.py check --score <评分>`:80 分及以上为 pass;低于 80 分为 warn,向用户展示分数、关键偏离和修改建议。人设检查只提醒、永不阻断发布;用户已明确要发布时继续执行,不额外索要确认。内容安全与平台合规硬门禁仍独立生效。
|
||||
4. 发布后留痕:
|
||||
|
||||
```bash
|
||||
python skills/shared/scripts/persona_gate.py record --topic <主题> --profile <画像> \
|
||||
--score <评分> --verdict <结论> --deviations <偏离点>
|
||||
python skills/openclaw/skill-publish-log/scripts/log.py record --platform <平台> \
|
||||
--title <标题> --profile <画像> --persona-score <评分> --persona-verdict <结论>
|
||||
```
|
||||
|
||||
## 素材与画像
|
||||
|
||||
- 用户素材在 `assets/`;明确要求使用时读取并传入制作流程。
|
||||
- 对话附件由后端按会话隔离,并在本轮消息中提供唯一的“系统附件清单”。只能使用清单明确列出的路径,禁止扫描、枚举或猜测 `outputs/_inbox/` 中的其他文件。需要纳入项目时把清单文件复制到 `outputs/<项目>/assets/` 后使用,保留 inbox 原件以支持安全重试;不要向用户复述上传过程、附件清单或内部路径。
|
||||
- 每个画像是 `easel-profiles/<画像>/` 下的一组 `identity/style/audience/platforms/preferences/memory.md`,代表一个跨平台人设。
|
||||
- 发现、策划、发布、归因读取六维;制作只凝练制作相关维度。未指定画像时走通用模式,可提示指定画像效果更好。
|
||||
- `easel-profiles/<当前画像>/memory.md` 是该会话唯一的账号长期记忆;每轮以消息中声明的当前画像为准,不从其他画像推断或借用经验。
|
||||
- 工作区根目录的全局 `MEMORY.md` 在 Easel 中不承载用户画像、账号经验或创作红线:不要读取、写入或调用 memory 工具检索它。通用模式不使用任何画像的 `memory.md`。
|
||||
- 不得为了切换画像而改写、复制或软链接全局 `MEMORY.md`;并行会话必须各自直接读取所绑定画像目录,避免互相覆盖。
|
||||
|
||||
任务结束时,只有出现真正可复用的偏好、红线、制作技巧或效果归因,才凝练 1–3 条并询问是否写入画像:
|
||||
|
||||
值得沉淀的内容包括:用户明确偏好/禁区、反复认可的封面/开场/配音/字幕方法,以及发布后验证有效或失效的选题和结构。一次性规格、临时参数和流水账不沉淀。
|
||||
|
||||
1. 给出拟写内容和目标文件(preferences/style/memory)。
|
||||
2. 用户同意后调用 `skill-profile-manager` 增量更新,去重合并,不覆盖无关内容。
|
||||
3. 用户拒绝、忽略或未指定画像则不写;不记录 Key、token、路径和一次性参数。
|
||||
|
||||
## 行为边界
|
||||
|
||||
- 聚焦社媒内容创作,不做无关通用聊天或平台违规操作。
|
||||
- 有把握就做,没把握就问;不每次都出 Plan,也不在关键输入缺失时强行执行。
|
||||
- 制作任务必须读 SKILL、明确要点并自检;自检宽容但诚实,不为返工而返工。
|
||||
@@ -0,0 +1,30 @@
|
||||
# Easel — 人格
|
||||
|
||||
你是 Easel,创作者的社媒内容搭子——既是懂策略的操盘手,也是能上手干活的制作伙伴。
|
||||
从一个热点、一句灵感,到成稿、成图、成片、发出去、再回头看数据复盘,你都陪着一起把它做成。
|
||||
|
||||
## 你能做的事(心里有数,遇事先想怎么做成)
|
||||
|
||||
你覆盖社媒内容的全链路,样样拿得起:
|
||||
|
||||
- **找灵感**:盯热搜热点、行业资讯、竞品动态、平台算法风向,挖二创机会和选题
|
||||
- **定策略**:账号定位、选题评估、内容日历、爆款钩子、活动与合作策划、受众画像
|
||||
- **做内容**:写文案(种草 / 口播 / 长文,也能润色、去 AI 味、改风格、控字数);出图(金句卡 / 小红书卡 / 海报 / 信息图 / 数据图表 / 对比图 / 表情包 / 脑图);做视频(AI 生成、剪辑、切片、转竖屏、字幕、翻译、配音、卡点、BGM、片头片尾);整套小红书笔记、AI 小说连载、竖屏短剧、论文解读视频;AI 生图生视频、声音克隆
|
||||
- **发出去**:小红书 / 抖音 / 快手 / 视频号 / 知乎 / B站 / 公众号 的登录与发布、跨平台一键分发、排期、短链、发布通知
|
||||
- **看效果**:抓创作数据、扒评论做情感与诉求分析、算 ROI、复盘打分、沉淀经验回画像
|
||||
|
||||
这些是你的底子——遇到相关的事,**先想"怎么帮他做成",而不是"这个我做不了"**。
|
||||
|
||||
而且这些本事大多沉淀成了**技能库里的 SKILL**——所以遇到活,**先去技能库找对应的 SKILL 照着用,别凭记忆裸做**;没有一模一样的就找最接近的参考,实在没有才自己想办法。(具体规则见 AGENTS。)
|
||||
|
||||
你还清楚创作者在 Easel 里的家底:他登录了哪些平台账号、画像怎么设的、之前做过什么。
|
||||
问到"我的账号 / 我的帖子 / 我的粉丝 / 最近发了啥"这类,**先去查已登录账号和站内数据,别回头问他要账号名**。
|
||||
真碰到一时不趁手的工具或拿不到的数据,就实话实说卡在哪、再给个能走的替代路子。
|
||||
|
||||
## 沟通风格
|
||||
|
||||
- 像搭子一样自然、简洁,不端着、不绕、不说废话
|
||||
- 给能落地的具体建议,不空谈;创意决策上给 2-3 个选项让创作者拍板
|
||||
- 中文为主
|
||||
- 务实、诚实:先尽力做,做不到或不确定才直说,不粉饰、不编数据
|
||||
- 发出去的东西只谈内容本身:对外文案/评论**绝不暴露**任何工具或配置痕迹(API key、内部地址、代理、路径、模型名、"由 AI 生成"之类)——你是创作者的搭子,不是在给系统打广告
|
||||
@@ -0,0 +1,34 @@
|
||||
[build-system]
|
||||
requires = ["setuptools>=68.0"]
|
||||
build-backend = "setuptools.build_meta"
|
||||
|
||||
[project]
|
||||
name = "easel"
|
||||
version = "0.2.1"
|
||||
description = "社媒内容工作流整合层 — Easel CLI"
|
||||
requires-python = ">=3.10"
|
||||
# 运行依赖统一安装,确保 Web、媒体处理和浏览器发布开箱可用。
|
||||
dependencies = [
|
||||
"fastapi>=0.115,<1", # Web 后端
|
||||
"uvicorn>=0.30,<1", # ASGI server(easel web)
|
||||
"sse-starlette>=2.1,<4", # 对话流式 SSE
|
||||
"httpx>=0.27,<1", # 对话直连常驻网关(EASEL_CHAT_TRANSPORT=http)的 SSE 客户端
|
||||
"pydantic>=2.7,<3", # 请求模型
|
||||
"segno>=1.6,<2", # B站扫码登录二维码渲染(纯 Python)
|
||||
"python-multipart>=0.0.9,<1", # FastAPI 文件上传 / Form
|
||||
"Pillow>=10,<13", "opencv-python>=4.8,<5", "numpy>=1.26,<3",
|
||||
"pandas>=2,<4", "matplotlib>=3.8,<4", "librosa>=0.10,<1",
|
||||
"faster-whisper>=1,<2", "edge-tts>=6,<8", "playwright>=1.45,<2",
|
||||
"rembg>=2.0,<3", "biliup>=1,<2", "jieba>=0.42,<1", "snownlp>=0.12,<1",
|
||||
"markdown>=3.5,<4",
|
||||
# ask_user 问答题桥接(easel/gateway_questions.py):连本地 gateway WS RPC + Ed25519 设备签名
|
||||
# 只用到 load_pem_private_key + Ed25519.sign(长期稳定 API),上界放宽避免与新版冲突
|
||||
"websocket-client>=1.7,<2",
|
||||
"cryptography>=42",
|
||||
]
|
||||
|
||||
[project.scripts]
|
||||
easel = "easel.cli:main"
|
||||
|
||||
[tool.setuptools.packages.find]
|
||||
include = ["easel*"]
|
||||
@@ -0,0 +1,170 @@
|
||||
[
|
||||
{
|
||||
"url": "https://api.github.com/repos/ZJU-REAL/Easel/releases/395285731",
|
||||
"assets_url": "https://api.github.com/repos/ZJU-REAL/Easel/releases/395285731/assets",
|
||||
"upload_url": "https://uploads.github.com/repos/ZJU-REAL/Easel/releases/395285731/assets{?name,label}",
|
||||
"html_url": "https://github.com/ZJU-REAL/Easel/releases/tag/v0.2.1",
|
||||
"id": 395285731,
|
||||
"author": {
|
||||
"login": "lidingm",
|
||||
"id": 112814356,
|
||||
"node_id": "U_kgDOBrlpFA",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/112814356?v=4",
|
||||
"gravatar_id": "",
|
||||
"url": "https://api.github.com/users/lidingm",
|
||||
"html_url": "https://github.com/lidingm",
|
||||
"followers_url": "https://api.github.com/users/lidingm/followers",
|
||||
"following_url": "https://api.github.com/users/lidingm/following{/other_user}",
|
||||
"gists_url": "https://api.github.com/users/lidingm/gists{/gist_id}",
|
||||
"starred_url": "https://api.github.com/users/lidingm/starred{/owner}{/repo}",
|
||||
"subscriptions_url": "https://api.github.com/users/lidingm/subscriptions",
|
||||
"organizations_url": "https://api.github.com/users/lidingm/orgs",
|
||||
"repos_url": "https://api.github.com/users/lidingm/repos",
|
||||
"events_url": "https://api.github.com/users/lidingm/events{/privacy}",
|
||||
"received_events_url": "https://api.github.com/users/lidingm/received_events",
|
||||
"type": "User",
|
||||
"user_view_type": "public",
|
||||
"site_admin": false
|
||||
},
|
||||
"node_id": "RE_kwDOUGn4eM4Xj5Tj",
|
||||
"tag_name": "v0.2.1",
|
||||
"target_commitish": "main",
|
||||
"name": "Easel v0.2.1 — 设置面板 · 对话直连网关提速 · 安全加固",
|
||||
"draft": false,
|
||||
"immutable": false,
|
||||
"prerelease": false,
|
||||
"created_at": "2026-09-24T03:12:28Z",
|
||||
"updated_at": "2026-09-24T03:18:26Z",
|
||||
"published_at": "2026-09-24T03:18:26Z",
|
||||
"assets": [],
|
||||
"tarball_url": "https://api.github.com/repos/ZJU-REAL/Easel/tarball/v0.2.1",
|
||||
"zipball_url": "https://api.github.com/repos/ZJU-REAL/Easel/zipball/v0.2.1",
|
||||
"body": "## Easel v0.2.1\n\n页面端设置面板(模型配置 · 环境安装 · 更多设置)· 对话直连常驻网关提速 · 一批安全加固与 Windows 修复。技能数仍为 114。\n\n### Added\n\n- **设置面板统一入口**:工作台新增「设置」,竖向三分区 —— 模型配置 / 环境安装 / 更多设置。六个通道(chat / transcribe / image / video / music / speech)的供应商、模型、Base URL、API Key 现在都能在页面上直接改;可添加自定义供应商、切换主备、跑真实自测(回显真实握手耗时)。保存写入 `.env`;读取只回掩码 key,输入框留空=不改该 key。\n- **运行期环境安装引擎** `install_tool.py` + 面板内「环境安装」页:对本地引擎做真实体检,后台执行安装、进度回写状态。\n- **B 站投稿读回对账**:投稿后直连 member 稿件接口读回,对上才算成功。\n- **`vendor/VENDOR.md`**:记清内置 `video-pipeline-sdk` 的来源、版本、本地改动与同步方式。\n\n### Improved\n\n- **对话每轮省掉约 3s**:Web 对话改走常驻网关的 OpenAI 兼容 HTTP 端点,不再每轮 spawn 一个 `openclaw agent` 瘦客户端(Linux 实测整轮 7.6s → 4.5s)。选路按会话钉死、中途不换边,不会静默丢掉对话历史。设 `EASEL_CHAT_TRANSPORT=cli` 可整机回到老路径。\n- `/api/outputs` 移入线程池,全量产物树扫描不再阻塞事件循环。\n- CI 从 `pytest tests/` 改为 `pytest`,技能自带的 38 个用例(`skills/**/tests/`)终于真的在 CI 上跑了。\n\n### Fixed\n\n- 修复 Windows PowerShell 5.1 上 `setup.ps1` 在配置写入阶段直接失败(#41)。\n- 修复 workspace 各写各的:`sync.sh` / `setup.ps1` / `doctor` / 视频产线原本各自硬编码了不同路径,在另一种 OpenClaw 布局下会写到 agent 根本不读的目录,却照样报成功。四处统一改为向 OpenClaw 自己问运行时 `workspaceDir`(#19)。\n- 修复 `.env.example` 里的占位符 key 让 `setup.sh` 整条 OpenAI 兼容分支被静默跳过 —— 写出没有 provider 的配置,而 `doctor` 全绿。`doctor` 新增校验:主模型指向的 provider 必须真的配了认证。\n- 修复内容库 HTML 预览:预览抽屉里自带的「复制到公众号」按钮可用了;预览总是渲染最新版本,不再命中启发式缓存的旧版。\n- 修复粘贴到公众号后图片裂开:预览引用的本地图内联为 base64 data-URI,图片字节随剪贴板走,不再要求公众号回源抓 Easel 本地地址。\n- 修复 `install_tool.py` 在非 UTF-8 locale 的 Windows 上崩溃 —— 它会让安装接口的 id 白名单为空,「环境安装」页装什么都报无效 id。\n- 修复国内平台发布链统一直连兜底(Chromium 级 `--no-proxy-server`),开 VPN 也能用。\n- 修复 `scripts/gateway.ps1` 缺 UTF-8 BOM(全仓唯一一个含中文却没 BOM 的 `.ps1`,PS 5.1 会按系统 ANSI 代码页解析)。\n\n### Security\n\n- 加固设置与安装接口:安装 id 白名单改为从引擎自己的配方表推导,设置写入在服务端校验。\n- **堵死 `.env` 值的命令替换注入**:旧守卫只拦换行,而 `setup.sh` 会 `source .env`,`KEY=$(id)` 这类不含换行的值照样走到 bash 的命令替换。现改为在入口把值的字符集收死。\n- **公众号预览页加 CSP**:预览 iframe 为了复制按钮必须开 `allow-scripts`,而 opaque origin 兜不住 —— Web 接口 CORS 全放开且无鉴权,真浏览器复现下正文里夹带的脚本能调本站接口并读到返回体。`connect-src 'none'` 掐断这条外带通道,复制按钮与图片渲染均不受影响。\n\n**Full Changelog**: https://github.com/ZJU-REAL/Easel/compare/v0.2.0...v0.2.1\n"
|
||||
},
|
||||
{
|
||||
"url": "https://api.github.com/repos/ZJU-REAL/Easel/releases/390917477",
|
||||
"assets_url": "https://api.github.com/repos/ZJU-REAL/Easel/releases/390917477/assets",
|
||||
"upload_url": "https://uploads.github.com/repos/ZJU-REAL/Easel/releases/390917477/assets{?name,label}",
|
||||
"html_url": "https://github.com/ZJU-REAL/Easel/releases/tag/v0.2.0",
|
||||
"id": 390917477,
|
||||
"author": {
|
||||
"login": "lidingm",
|
||||
"id": 112814356,
|
||||
"node_id": "U_kgDOBrlpFA",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/112814356?v=4",
|
||||
"gravatar_id": "",
|
||||
"url": "https://api.github.com/users/lidingm",
|
||||
"html_url": "https://github.com/lidingm",
|
||||
"followers_url": "https://api.github.com/users/lidingm/followers",
|
||||
"following_url": "https://api.github.com/users/lidingm/following{/other_user}",
|
||||
"gists_url": "https://api.github.com/users/lidingm/gists{/gist_id}",
|
||||
"starred_url": "https://api.github.com/users/lidingm/starred{/owner}{/repo}",
|
||||
"subscriptions_url": "https://api.github.com/users/lidingm/subscriptions",
|
||||
"organizations_url": "https://api.github.com/users/lidingm/orgs",
|
||||
"repos_url": "https://api.github.com/users/lidingm/repos",
|
||||
"events_url": "https://api.github.com/users/lidingm/events{/privacy}",
|
||||
"received_events_url": "https://api.github.com/users/lidingm/received_events",
|
||||
"type": "User",
|
||||
"user_view_type": "public",
|
||||
"site_admin": false
|
||||
},
|
||||
"node_id": "RE_kwDOUGn4eM4XTO1l",
|
||||
"tag_name": "v0.2.0",
|
||||
"target_commitish": "main",
|
||||
"name": "Easel v0.2.0 — 视频产线内置 + 三级转录 · 能力菜单 · CoT 流式修复",
|
||||
"draft": false,
|
||||
"immutable": false,
|
||||
"prerelease": false,
|
||||
"created_at": "2026-09-17T17:23:18Z",
|
||||
"updated_at": "2026-09-17T17:24:08Z",
|
||||
"published_at": "2026-09-17T17:24:08Z",
|
||||
"assets": [],
|
||||
"tarball_url": "https://api.github.com/repos/ZJU-REAL/Easel/tarball/v0.2.0",
|
||||
"zipball_url": "https://api.github.com/repos/ZJU-REAL/Easel/zipball/v0.2.0",
|
||||
"body": "## Easel v0.2.0\n\n内置视频产线 + 三级转录 · 「笔」能力菜单 · CoT 思考前端流式修复。技能数 113 → 114。\n\n### Added\n\n- **`video-production` 整片视频产线**:探针 → 转录 → 分场 → 设计表 → 搭建 → 校验 → 抽帧预览 → 渲染 → 交付 的多轮全流程,含两道人工确认门与质量门(五件套 / 响度 / 转场)。上游 `video-pipeline-sdk`(MIT)已内置进仓,产线自包含、可复现、可修改。\n- **三级转录降级**:SRT/VTT 字幕优先 → 硅基流动 ASR API → 本地 whisper 兜底——有字幕或 API key 时不再需要下载 3GB 模型。\n- **「笔」能力菜单**:工作台输入区新增入口,点开浏览 Easel 能做的一切(\"能做的都在这\"),选中即预填提示词。\n- **幻灯片成片渲染器**(ffmpeg):Ken Burns 运镜、差异化转场、libass 动态字幕、极轻 whoosh 音效、loudnorm 响度归一。\n\n### Improved\n\n- 技能库中文展示名(中文大字 + 原名小字,搜索与抽屉同步)。\n- 对话内多选卡(`ask_user` multiSelect 渲染与多值提交)。\n- 超上传上限文件自动转本地素材(复制通道,不改 50MB 配置)。\n- `--thinking` 默认 medium,网关支持时展示推理过程。\n\n### Fixed\n\n- 修复 Web 对话 CoT/token 逐字流式;防呆心跳不再顶真实状态。\n- Gemini 适配器支持 `streamGenerateContent` 流式。\n- Windows UTF-8 持久化(状态读写);关停钩子迁移到 lifespan handler。\n\n**Full Changelog**: https://github.com/ZJU-REAL/Easel/compare/v0.1.1...v0.2.0\n"
|
||||
},
|
||||
{
|
||||
"url": "https://api.github.com/repos/ZJU-REAL/Easel/releases/388554155",
|
||||
"assets_url": "https://api.github.com/repos/ZJU-REAL/Easel/releases/388554155/assets",
|
||||
"upload_url": "https://uploads.github.com/repos/ZJU-REAL/Easel/releases/388554155/assets{?name,label}",
|
||||
"html_url": "https://github.com/ZJU-REAL/Easel/releases/tag/v0.1.1",
|
||||
"id": 388554155,
|
||||
"author": {
|
||||
"login": "lidingm",
|
||||
"id": 112814356,
|
||||
"node_id": "U_kgDOBrlpFA",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/112814356?v=4",
|
||||
"gravatar_id": "",
|
||||
"url": "https://api.github.com/users/lidingm",
|
||||
"html_url": "https://github.com/lidingm",
|
||||
"followers_url": "https://api.github.com/users/lidingm/followers",
|
||||
"following_url": "https://api.github.com/users/lidingm/following{/other_user}",
|
||||
"gists_url": "https://api.github.com/users/lidingm/gists{/gist_id}",
|
||||
"starred_url": "https://api.github.com/users/lidingm/starred{/owner}{/repo}",
|
||||
"subscriptions_url": "https://api.github.com/users/lidingm/subscriptions",
|
||||
"organizations_url": "https://api.github.com/users/lidingm/orgs",
|
||||
"repos_url": "https://api.github.com/users/lidingm/repos",
|
||||
"events_url": "https://api.github.com/users/lidingm/events{/privacy}",
|
||||
"received_events_url": "https://api.github.com/users/lidingm/received_events",
|
||||
"type": "User",
|
||||
"user_view_type": "public",
|
||||
"site_admin": false
|
||||
},
|
||||
"node_id": "RE_kwDOUGn4eM4XKN2r",
|
||||
"tag_name": "v0.1.1",
|
||||
"target_commitish": "main",
|
||||
"name": "Easel v0.1.1",
|
||||
"draft": false,
|
||||
"immutable": false,
|
||||
"prerelease": false,
|
||||
"created_at": "2026-09-14T16:39:56Z",
|
||||
"updated_at": "2026-09-14T16:40:26Z",
|
||||
"published_at": "2026-09-14T16:40:26Z",
|
||||
"assets": [],
|
||||
"tarball_url": "https://api.github.com/repos/ZJU-REAL/Easel/tarball/v0.1.1",
|
||||
"zipball_url": "https://api.github.com/repos/ZJU-REAL/Easel/zipball/v0.1.1",
|
||||
"body": "### Added\n- **WeChat Official Account (公众号)** support: article publishing, Data Center metrics, and account management via a background QR-scan session.\n- Optional vendored typesetting Skill (`gzh-design`, AGPL-3.0) — Skill count is now **113**.\n\n### Improved\n- Workbench **创作数据** panel: Bilibili & Douyin now populate **近 7 日 · 环比** and **最近作品**.\n - Bilibili: creator overview API for play/like/comment/favorite/share/follower deltas + recent uploads (title/link/cover/stats).\n - Douyin: parses real 近 7 日 labels with a section anchor (no more mis-reading the 最新作品 card), handles 较前7日±X deltas, hardened polling, and scrapes recent works.\n\n### Fixed\n- `easel doctor` OpenClaw version detection on Windows (`.cmd` shim).\n- Cross-platform gateway/launcher robustness; Xiaohongshu login navigation races.\n\n**Full Changelog**: https://github.com/ZJU-REAL/Easel/compare/v0.1.0...v0.1.1\n"
|
||||
},
|
||||
{
|
||||
"url": "https://api.github.com/repos/ZJU-REAL/Easel/releases/379735885",
|
||||
"assets_url": "https://api.github.com/repos/ZJU-REAL/Easel/releases/379735885/assets",
|
||||
"upload_url": "https://uploads.github.com/repos/ZJU-REAL/Easel/releases/379735885/assets{?name,label}",
|
||||
"html_url": "https://github.com/ZJU-REAL/Easel/releases/tag/v0.1.0",
|
||||
"id": 379735885,
|
||||
"author": {
|
||||
"login": "lidingm",
|
||||
"id": 112814356,
|
||||
"node_id": "U_kgDOBrlpFA",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/112814356?v=4",
|
||||
"gravatar_id": "",
|
||||
"url": "https://api.github.com/users/lidingm",
|
||||
"html_url": "https://github.com/lidingm",
|
||||
"followers_url": "https://api.github.com/users/lidingm/followers",
|
||||
"following_url": "https://api.github.com/users/lidingm/following{/other_user}",
|
||||
"gists_url": "https://api.github.com/users/lidingm/gists{/gist_id}",
|
||||
"starred_url": "https://api.github.com/users/lidingm/starred{/owner}{/repo}",
|
||||
"subscriptions_url": "https://api.github.com/users/lidingm/subscriptions",
|
||||
"organizations_url": "https://api.github.com/users/lidingm/orgs",
|
||||
"repos_url": "https://api.github.com/users/lidingm/repos",
|
||||
"events_url": "https://api.github.com/users/lidingm/events{/privacy}",
|
||||
"received_events_url": "https://api.github.com/users/lidingm/received_events",
|
||||
"type": "User",
|
||||
"user_view_type": "public",
|
||||
"site_admin": false
|
||||
},
|
||||
"node_id": "RE_kwDOUGn4eM4Wok9N",
|
||||
"tag_name": "v0.1.0",
|
||||
"target_commitish": "main",
|
||||
"name": "Easel v0.1.0",
|
||||
"draft": false,
|
||||
"immutable": false,
|
||||
"prerelease": false,
|
||||
"created_at": "2026-08-31T12:18:17Z",
|
||||
"updated_at": "2026-08-31T12:24:34Z",
|
||||
"published_at": "2026-08-31T12:24:34Z",
|
||||
"assets": [],
|
||||
"tarball_url": "https://api.github.com/repos/ZJU-REAL/Easel/tarball/v0.1.0",
|
||||
"zipball_url": "https://api.github.com/repos/ZJU-REAL/Easel/zipball/v0.1.0",
|
||||
"body": "# Changelog\n\nAll notable changes to Easel are documented in this file.\n\n## [0.1.0] - 2026-08-31\n\nEasel's first public release, jointly developed by REAL Lab and OpenDCAI Lab.\n\n### Highlights\n\n- Added an end-to-end social media operations workflow covering discovery, planning, creation, publishing, and attribution.\n- Added profile-driven account context and persistent operating memory across sessions and platforms.\n- Added 112 executable Skills for research, writing, visual production, audio, video, publishing, and analytics.\n- Added the Web workspace and CLI for running workflows, inspecting outputs, and managing projects locally.\n- Added multimodal production workflows for knowledge cards, stories, lifestyle content, audio, and video.\n- Added publishing workflows for Xiaohongshu, Douyin, Kuaishou, Zhihu, Bilibili, and WeChat Channels.\n- Added output manifests, publishing checks, content calendars, and performance attribution workflows.\n- Added Chinese and English documentation, examples, product showcases, and institutional branding.\n\n[0.1.0]: https://github.com/ZJU-REAL/Easel/releases/tag/v0.1.0\n"
|
||||
}
|
||||
]
|
||||
+75
@@ -0,0 +1,75 @@
|
||||
---
|
||||
name: skill-quality-gate
|
||||
description: >
|
||||
发布前质量关卡:合规风险检测(敏感词、绝对化用语、平台规则)
|
||||
+ 产物质量审核(完整性、可读性、平台适配度)。一次检查,两道把关。
|
||||
当用户说"检查合规"、"质量检查"、"能不能发"、"有没有敏感词"、
|
||||
"审核一下"、"发布前检查"、"质量够不够"时使用。
|
||||
合并了原 skill-check-compliance 和 skill-review-deliverable 的能力。
|
||||
layer: publish
|
||||
---
|
||||
|
||||
# 发布前质量关卡
|
||||
|
||||
> 一个 SKILL 完成两道把关:合规风险检测 + 产物质量审核。
|
||||
|
||||
## 输入
|
||||
|
||||
用户提供待检查内容:文本、图片路径、视频路径、或混合。
|
||||
可选:目标发布平台。
|
||||
|
||||
## 输出
|
||||
|
||||
```json
|
||||
{
|
||||
"overall_verdict": "✅ 可发布 | ⚠️ 需修改 | ❌ 不达标",
|
||||
"platform": "平台名或 generic",
|
||||
"compliance": {
|
||||
"risk_level": "low|medium|high",
|
||||
"issues": [{ "type": "", "severity": "", "text": "", "reason": "", "suggestion": "" }],
|
||||
"passed_checks": []
|
||||
},
|
||||
"quality": {
|
||||
"score": "✅|⚠️|❌",
|
||||
"dimensions": [{ "name": "", "score": "", "note": "" }]
|
||||
},
|
||||
"top_fixes": ["修改建议1", "修改建议2", "修改建议3"]
|
||||
}
|
||||
```
|
||||
|
||||
## 执行步骤
|
||||
|
||||
### 第一关:合规检测
|
||||
|
||||
1. 读取内容(文本和/或图片)
|
||||
2. 加载通用合规规则 → `references/general-rules.md`
|
||||
3. 根据 Profile 或用户指定的平台加载对应规则:
|
||||
- 小红书 → `references/platform-xiaohongshu.md`
|
||||
- 抖音 → `references/platform-douyin.md`
|
||||
- B站 → `references/platform-bilibili.md`
|
||||
- 无平台 → 仅通用规则
|
||||
4. 逐项检测:绝对化用语、医疗违规、违禁内容、平台特有限制
|
||||
5. 汇总合规结果
|
||||
|
||||
### 第二关:质量审核
|
||||
|
||||
1. 识别产物类型(文本/图片/视频)
|
||||
2. 按维度逐项检查 → `references/review-dimensions.md`
|
||||
3. 给出三级结论 → `references/review-levels.md`
|
||||
- ✅ 通过:可直接发布
|
||||
- ⚠️ 有瑕疵:建议微调后发布
|
||||
- ❌ 不达标:需返工
|
||||
4. 如结论为 ❌,按 `references/rework-rules.md` 给出返工指引
|
||||
|
||||
### 综合判定
|
||||
|
||||
- 合规高风险 → 整体 ❌ 不达标
|
||||
- 质量审核为 ❌(返工级)→ 整体 ❌ 不达标
|
||||
- 合规低风险 + 质量 ✅ → 整体 ✅ 可发布
|
||||
- 其他组合 → 整体 ⚠️ 需修改
|
||||
- 输出 Top 3 优先修改建议
|
||||
|
||||
## Profile 感知
|
||||
|
||||
- **有 Profile**:读取 platform 加载平台规则、检查风格适配
|
||||
- **无 Profile**:仅通用合规检查 + 通用质量标准
|
||||
+95
@@ -0,0 +1,95 @@
|
||||
---
|
||||
name: skill-xhs-publisher
|
||||
description: |
|
||||
将图文/视频内容发布到小红书(XHS)。基于 Playwright + 持久化登录态,headless 即可运行,
|
||||
流程与选择器移植自成熟开源实现 xiaohongshu-mcp(含发布成功校验、上传完成等待、话题联想绑定、
|
||||
新旧发布按钮兼容、反检测)。适用场景:发布图文笔记、发布视频、扫码登录、发布前预检。
|
||||
layer: publish
|
||||
---
|
||||
|
||||
# 小红书发布助手(xhs-publisher)
|
||||
|
||||
你是"小红书发布助手"。目标是在用户确认后,调用 `xhs_publish.py` 完成**图文/视频发布**。
|
||||
|
||||
## 运行方式(Playwright,headless 可用)
|
||||
|
||||
统一走确定性脚本 **`../../shared/scripts/xhs_publish.py`**(CWD=项目根)。它用 Playwright +
|
||||
持久化登录态驱动小红书创作者后台,headless 即可发布——**替代了旧的 CDP-to-真实Chrome 死栈**
|
||||
(那套需桌面 Chrome,本环境跑不了,已删除)。
|
||||
|
||||
| 依赖 | 说明 |
|
||||
|------|------|
|
||||
| playwright + chromium 内核 | 本环境已装(`xhs_publish.py check` 验证) |
|
||||
| 已扫码登录 | `login` 把二维码抠成 PNG(默认 `outputs/_login/xhs-login-qrcode.png`,Web UI 可看)→ 扫码 → cookie 持久化到 `~/.easel-browser-profiles/XiaohongshuProfile` |
|
||||
| 干净网络 IP | 小红书对机房/代理出口报「安全限制·IP存在风险」拦在登录前;需家宽/干净 IP 代理,或在正常网络登录后拷贝登录态目录复用 |
|
||||
|
||||
## 能力范围
|
||||
|
||||
- **本 SKILL 现做**:图文发布、视频发布、扫码登录、发布前预检(plan)。
|
||||
- **评论区互动**(抓评论 + 回复)已拆分到 **skill-xhs-comment-reply**(与本 SKILL 共用登录态)。
|
||||
- **暂未移植(后续按需)**:首页/搜索/详情抓取、点赞/收藏/私信——选择器在参考实现里都有,
|
||||
需要时再移植;"分析爆款规律/数据洞察"走 **xhs-analyzer**。
|
||||
|
||||
## 与 xhs-analyzer 的分工边界
|
||||
|
||||
- **xhs-publisher(本 SKILL)** = 发布:发图文/视频。
|
||||
- **xhs-comment-reply** = 评论区互动:抓评论 + 回复粉丝评论。
|
||||
- **xhs-analyzer** = 分析:搜索规律、爆款拆解、关键词矩阵、创作者画像、限流检测。
|
||||
- 需要"实际发布"用本 SKILL;需要"回评/维护评论区"用 xhs-comment-reply;需要"分析/爆款规律"用 xhs-analyzer。
|
||||
|
||||
## 风险提示(重要)
|
||||
|
||||
**小红书自动化发布存在被平台风控、限流、封号的风险。** 默认提醒用户优先用测试号、小流量运行,
|
||||
最终内容人工复核。脚本已内置反检测(`--disable-blink-features=AutomationControlled` + 逐字符
|
||||
输入 + zh-CN 语言 + 登录态持久化),但风险不可完全消除,使用者自行评估承担。
|
||||
|
||||
## 输入判断(按顺序)
|
||||
|
||||
1. "检查环境 / 能不能发":`xhs_publish.py check`。
|
||||
2. "登录 / 扫码 / 换账号":`xhs_publish.py login`(有头,扫码)。
|
||||
3. 已提供 `标题 + 视频`:视频发布流程。
|
||||
4. 已提供 `标题 + 图片`:图文发布流程。
|
||||
5. 只给网页 URL:先提取内容与图片/视频,产出可发布草稿,等确认。
|
||||
6. 信息不全:先补齐,不要直接发布。
|
||||
|
||||
## 执行流程
|
||||
|
||||
```
|
||||
check(环境就绪?)
|
||||
→ 未登录 → login(有头扫码,一次即可)
|
||||
→ plan(dry-run 预检:标题长度/媒体路径/步骤)— 给用户确认最终标题、正文、图片/视频
|
||||
→ 发布前人设检查(见下)
|
||||
→ publish / publish-video --exec(首次建议加 --headed 校验选择器,OK 后 headless 复跑)
|
||||
→ 成功校验(脚本内置:URL 离开 /publish/publish 才算成功)
|
||||
→ 发布后留痕(见下)
|
||||
```
|
||||
|
||||
## 发布前人设检查(有 Profile 时)
|
||||
|
||||
按 AGENTS.md「发布前人设一致性检查」:先用 **skill-persona-check** 比对待发内容 × 画像,评分喂
|
||||
`python skills/shared/scripts/persona_gate.py check --score 85`——低于 80 分时告知分数、偏离点和
|
||||
修改建议,但不阻断发布;用户已明确要发布就继续执行。
|
||||
|
||||
## 发布后留痕(供监控/归因)
|
||||
|
||||
```
|
||||
python skills/shared/scripts/persona_gate.py record --topic 露营攻略 --profile 户外达人 \
|
||||
--score 85 --verdict pass
|
||||
python skills/openclaw/skill-publish-log/scripts/log.py record --platform 小红书 \
|
||||
--title "周末露营攻略" --profile 户外达人 --persona-score 85 --persona-verdict pass --skill-source skill-xhs-publisher
|
||||
```
|
||||
|
||||
## 必做约束
|
||||
|
||||
- 发布前必须让用户确认最终标题、正文、图片/视频(先跑 `plan` 展示)。
|
||||
- 图文发布必须有图片,视频发布必须有视频;图片与视频不可混用(二选一)。
|
||||
- 标题 ≤ 20 全角字(脚本 `calc_title_length` 按小红书口径校验,超限直接拦下)。
|
||||
- 文件路径必须为**绝对路径**(脚本会解析并校验存在)。
|
||||
- 首次发布或疑似平台改版:先加 `--headed` 观察,校验通过再 headless 批量。
|
||||
- 发布页结构异常时,改 `xhs_publish.py` 顶部的 **`SELECTORS` 字典**(选择器单点集中维护,
|
||||
每条标注了参考源),不要散改流程。
|
||||
|
||||
## 命令样例
|
||||
|
||||
全部命令(check/login/plan/publish/publish-video 参数、代理、首次校验)见
|
||||
**[references/commands.md](references/commands.md)**。
|
||||
@@ -0,0 +1,34 @@
|
||||
# skills/shared
|
||||
|
||||
跨 SKILL 复用的工具、脚本与配置。SKILL 通过相对路径引用(如 `../../shared/xxx`)。
|
||||
|
||||
## 知识文件
|
||||
|
||||
- `hotlist-apis.md` — 中文社媒热搜 API(60s / xxapi 聚合源,走代理;禁止直接抓平台官网)
|
||||
- `pillar-and-cadence.md` — 内容支柱与发布节奏(策划三角共享知识)
|
||||
- `scoring-dimensions.md` — 统一评分维度(七维 + 标尺)
|
||||
|
||||
## 脚本(scripts/)
|
||||
|
||||
- `social_stats.py` — 公共统计计算(互动率/环比/移动平均/加权/聚合),归因层复用,把 LLM 心算固化为确定性代码
|
||||
- `wordcount.py` — 字数统计与目标字数校验(count/check/selftest,含 social_count 社媒计数口径)。文本类 SKILL(text-condenser/hook-generator/post-formatter/video-script/social-content)统一用它校验字数行数
|
||||
- `render_card.py` — HTML → 图片确定性渲染(playwright + chromium,走代理加载 CDN/字体、有界超时不卡死)。卡片/海报类 SKILL(card-quote/card-xiaohongshu/poster-hero/comparison-card)统一用它出图
|
||||
- `image_ops.py` — 通用图像处理确定性封装(纯 Pillow):resize/crop/pad/convert/compress/watermark/round/collage/thumbnail/info 子命令。处理「已有图片」的加工类 SKILL(image-editing)统一用它,区别于 render_card 的「HTML 设计→渲染」
|
||||
- `audio_ops.py` — 通用音频处理封装(ffmpeg):trim/convert/normalize/extract/concat/fade/speed/denoise/info。audio-editing / audio-denoise 用它
|
||||
- `video_ops.py` — 通用视频处理封装(ffmpeg):cut/concat/speed/silence-cut/text/aspect(横竖转)/frame/gif/compress/bgm/watermark/info。video-editing 用它
|
||||
- `asr.py` — 语音转字幕(faster-whisper):transcribe → SRT/ASS/TXT/JSON,中文友好断句。auto-subtitle 用它
|
||||
- `tts.py` — 文字转语音配音(edge-tts):speak(多音色/语速/字幕)/voices。tts-voiceover 用它
|
||||
- `ai_image.py` — AI 文生图/图生图/变体(OpenAI 兼容 + apimart 异步,用户自备 key)。ai-image-gen 用它
|
||||
- `ai_video.py` — AI 文/图生视频(provider: 通义万相/火山Seedance/可灵/OpenAI兼容,异步轮询,用户自备 key)。ai-video-gen 用它
|
||||
- `ai_music.py` — AI 音乐/BGM 生成(provider: DashScope/Suno兼容,用户自备 key)。ai-music 用它
|
||||
|
||||
## 依赖
|
||||
|
||||
- `render_card.py` 需 `pip install playwright && playwright install chromium`
|
||||
- `image_ops.py` 需 `pip install Pillow`(图像处理)
|
||||
- `audio_ops.py` / `video_ops.py` 需系统 `ffmpeg` + `ffprobe`
|
||||
- `asr.py` 需 `pip install faster-whisper` + ffmpeg;模型放 `~/.cache/easel-models/faster-whisper-<size>/`(本环境代理下 HF 自动下载失败,需 curl 手动下 config.json/model.bin/tokenizer.json/vocabulary.txt)
|
||||
- `tts.py` 需 `pip install edge-tts` + 外网代理(微软在线 TTS)
|
||||
- `ai_image.py` / `ai_video.py` / `ai_music.py` 纯标准库(urllib/hmac),但需**用户自备各服务的 API key**(配 .env),见各自 SKILL 的配置章节
|
||||
- `data-report`(pandas+matplotlib)、`infographic/gif_chart.py`(matplotlib+Pillow)、`auto-short-video/assemble.py`(ffmpeg)在各自 SKILL 的 scripts/ 下
|
||||
- 其余脚本纯标准库,无需额外依赖
|
||||
@@ -0,0 +1,42 @@
|
||||
[
|
||||
{
|
||||
"name": "v0.2.1",
|
||||
"zipball_url": "https://api.github.com/repos/ZJU-REAL/Easel/zipball/refs/tags/v0.2.1",
|
||||
"tarball_url": "https://api.github.com/repos/ZJU-REAL/Easel/tarball/refs/tags/v0.2.1",
|
||||
"commit": {
|
||||
"sha": "3fe2d9904c1619281ef57f81d9ee0b7854998399",
|
||||
"url": "https://api.github.com/repos/ZJU-REAL/Easel/commits/3fe2d9904c1619281ef57f81d9ee0b7854998399"
|
||||
},
|
||||
"node_id": "REF_kwDOUGn4eLByZWZzL3RhZ3MvdjAuMi4x"
|
||||
},
|
||||
{
|
||||
"name": "v0.2.0",
|
||||
"zipball_url": "https://api.github.com/repos/ZJU-REAL/Easel/zipball/refs/tags/v0.2.0",
|
||||
"tarball_url": "https://api.github.com/repos/ZJU-REAL/Easel/tarball/refs/tags/v0.2.0",
|
||||
"commit": {
|
||||
"sha": "406438c30835a67ad9a1daaab99bcf8f4024ec61",
|
||||
"url": "https://api.github.com/repos/ZJU-REAL/Easel/commits/406438c30835a67ad9a1daaab99bcf8f4024ec61"
|
||||
},
|
||||
"node_id": "REF_kwDOUGn4eLByZWZzL3RhZ3MvdjAuMi4w"
|
||||
},
|
||||
{
|
||||
"name": "v0.1.1",
|
||||
"zipball_url": "https://api.github.com/repos/ZJU-REAL/Easel/zipball/refs/tags/v0.1.1",
|
||||
"tarball_url": "https://api.github.com/repos/ZJU-REAL/Easel/tarball/refs/tags/v0.1.1",
|
||||
"commit": {
|
||||
"sha": "23d0f7c48bdb01b6e27a7c60ff5036d1e1db5fac",
|
||||
"url": "https://api.github.com/repos/ZJU-REAL/Easel/commits/23d0f7c48bdb01b6e27a7c60ff5036d1e1db5fac"
|
||||
},
|
||||
"node_id": "REF_kwDOUGn4eLByZWZzL3RhZ3MvdjAuMS4x"
|
||||
},
|
||||
{
|
||||
"name": "v0.1.0",
|
||||
"zipball_url": "https://api.github.com/repos/ZJU-REAL/Easel/zipball/refs/tags/v0.1.0",
|
||||
"tarball_url": "https://api.github.com/repos/ZJU-REAL/Easel/tarball/refs/tags/v0.1.0",
|
||||
"commit": {
|
||||
"sha": "0372657984c2fb48793738fc15e51b89cf62f12a",
|
||||
"url": "https://api.github.com/repos/ZJU-REAL/Easel/commits/0372657984c2fb48793738fc15e51b89cf62f12a"
|
||||
},
|
||||
"node_id": "REF_kwDOUGn4eLByZWZzL3RhZ3MvdjAuMS4w"
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,173 @@
|
||||
# Easel SKILL 接口规范 v0.3
|
||||
|
||||
> 所有 Easel SKILL 遵循此规范。SKILL 是独立可调的原子能力单元。
|
||||
|
||||
## 目录结构
|
||||
|
||||
```
|
||||
skills/
|
||||
├── openclaw/ 五层 SKILL(发现/策划/制作/发布/归因),由 OpenClaw 直接执行
|
||||
└── shared/ 跨 SKILL 共享工具(脚本、配置、依赖)
|
||||
```
|
||||
|
||||
每个 SKILL 是一个独立目录:
|
||||
|
||||
```
|
||||
skill-xxx/
|
||||
├── SKILL.md 必须 — 执行流程(精简,< 200 行)
|
||||
├── references/ 可选 — 领域知识(按需加载,不常驻 prompt)
|
||||
│ └── *.md
|
||||
├── scripts/ 可选 — 可执行脚本(运行时调用,代码不进 prompt)
|
||||
│ └── *.py / *.sh
|
||||
└── tests/ 可选 — 测试用例
|
||||
├── test1.prompt 输入
|
||||
└── test1.expected 期望输出(关键字匹配)
|
||||
```
|
||||
|
||||
### 三层加载机制
|
||||
|
||||
| 层 | 内容 | 加载时机 | token 开销 |
|
||||
|---|---|---|---|
|
||||
| Metadata | frontmatter(name, description) | 常驻,用于 SKILL 路由 | 极小 |
|
||||
| Instructions | SKILL.md 主体 | SKILL 被触发时 | 中等 |
|
||||
| Resources | references/ + scripts/ | SKILL 执行中按需读取 | 按需 |
|
||||
|
||||
**核心原则:SKILL.md 只写"怎么做",领域知识写在 references/ 里。**
|
||||
|
||||
### 共享工具层
|
||||
|
||||
`skills/shared/` 存放多个 SKILL 共用的工具脚本和配置(如 ffmpeg 封装、API client、通用模板)。SKILL 通过相对路径引用。
|
||||
|
||||
## SKILL.md 格式
|
||||
|
||||
```markdown
|
||||
---
|
||||
name: skill-xxx
|
||||
description: >-
|
||||
用中文说明本 SKILL 做什么、用户在什么场景或用哪些说法时应触发,以及与相邻 SKILL 的边界。
|
||||
layer: discover / plan / produce / publish / attribute / general
|
||||
---
|
||||
|
||||
# SKILL 名称
|
||||
|
||||
> 一句话描述
|
||||
|
||||
## 输入
|
||||
|
||||
描述接受什么输入
|
||||
|
||||
## 输出
|
||||
|
||||
描述输出格式(字段说明,不写具体值)
|
||||
|
||||
## 执行步骤
|
||||
|
||||
1. 步骤(引用 references/ 下的文件获取领域知识)
|
||||
2. ...
|
||||
|
||||
## Profile 感知
|
||||
|
||||
有 Profile 时怎么用,没有时怎么退
|
||||
```
|
||||
|
||||
**frontmatter 规则:**
|
||||
- 只保留 `name`、`description`、`layer` 三个常规字段,减少常驻路由上下文和无效元数据
|
||||
- `description` 是 Agent 的主要触发依据,必须用中文同时写清能力、触发场景/用户说法和相邻 SKILL 边界;可使用 YAML 块标量
|
||||
- `layer` 标明所属层:五个流水线层 `discover / plan / produce / publish / attribute`,外加 `general`(跨切面基础设施,如画像管理、产物管理、模板库——不属于任一流水线阶段)
|
||||
- 仅在 OpenClaw 需要判断操作系统、二进制、环境变量或安装方式时,允许增加 `metadata.openclaw` 运行时清单
|
||||
- 禁止 `version`、`profile_aware`、`self_developed`、普通 `metadata.trigger/impl/source`、`allowed-tools`、`tags`;来源信息放 `EASEL-META.md`,执行约束和 Profile 行为写正文
|
||||
- SKILL.md 主体控制在 200 行以内
|
||||
|
||||
全库校验:
|
||||
|
||||
```bash
|
||||
python scripts/validate_skills.py
|
||||
python scripts/validate_skill_commands.py
|
||||
```
|
||||
|
||||
第一条检查 frontmatter、资源链接、输出和发布安全契约;第二条解析 Skill 中的 Python 命令,对照脚本的 argparse 定义检查路径与参数漂移。
|
||||
|
||||
## 调用方式
|
||||
|
||||
```bash
|
||||
easel skill check-compliance -i "内容"
|
||||
easel skill check-compliance -i "内容" -p 画像名
|
||||
```
|
||||
|
||||
所有调用统一走 OpenClaw agent,由 OpenClaw 读对应 SKILL、按 AGENTS.md 规则自己执行。
|
||||
|
||||
## SKILL 同步
|
||||
|
||||
`openclaw/sync.sh` 把 `skills/openclaw/` 与 `skills/shared/` 同步到 `~/.openclaw/workspace-easel/`。
|
||||
|
||||
## Profile 注入
|
||||
|
||||
- OpenClaw 直接读取 Profile 文件夹,按 AGENTS.md 凝练后用于产出。
|
||||
- 检测标记:`=== EASEL ACCOUNT PROFILE ===`
|
||||
|
||||
## 产物管理
|
||||
|
||||
**目录布局规约**(一个内容项目 = `outputs/<主题>/` 一个目录):
|
||||
```
|
||||
outputs/<主题>/
|
||||
├── note.md / final.mp4 / card_1.png 成品(用户要发/读的最终文件,放项目根)
|
||||
├── assets/ 中间件:frames/ clips/ 构建脚本 原始素材 草稿 重复文件
|
||||
└── .easel.json 唯一元数据:展示头 + 层间产物契约(隐藏)
|
||||
```
|
||||
- **成品放项目根、中间件进 `assets/`**:前端「内容库」据此把成品与素材分区展示。
|
||||
- 项目名用人类可读主题(中文可),禁泛名(xhs/test);测试/临时产物写 `outputs/_scratch/`。
|
||||
- 任何新脚本在创建产物前必须调用 `skills/shared/scripts/output_paths.py` 的 `validate_output_path()`;系统写入需显式传 `allow_system=True`,且只能使用已注册的 `_` 路径。
|
||||
- 系统状态一律 `_` 前缀目录(`_login/_publish/_analytics/_profile_build/_scratch`);
|
||||
**内容库只展示项目目录**,忽略根目录散文件与系统目录。
|
||||
|
||||
### 元数据契约(`.easel.json`)
|
||||
|
||||
单一元数据文件(隐藏),由 `skills/shared/scripts/manifest.py` 读写(带 selftest),含两部分:
|
||||
|
||||
**① 展示头**(供前端「内容库」富展示:标题/平台/状态/封面/标签 + 成品高亮)。收尾登记:
|
||||
```bash
|
||||
python skills/shared/scripts/manifest.py meta --topic <主题> \
|
||||
--title "<人类可读标题>" --platform 小红书 --kind cards --status draft \
|
||||
--tags "标签1,标签2" --cover cover.png --deliverables card_1.png,card_2.png
|
||||
```
|
||||
`kind` 取 `article/xhs-note/video/cards/poster/audio/other`;`status` 取 `draft/ready/published`。
|
||||
`meta` 为 upsert:只改传入字段、其余保留;缺省有兜底(title→topic、cover→首张成品媒体)。
|
||||
|
||||
**② 层间产物契约 steps[]**:纵向编排跨层时,上游产物路径与关键结论通过 manifest 结构化传递,下游无需重新推导。
|
||||
```bash
|
||||
# 上游每步产出后登记(失败也登记 --status failed,供断点续跑)
|
||||
python skills/shared/scripts/manifest.py record --topic <主题> \
|
||||
--layer plan --skill video-script --profile <画像> \
|
||||
--outputs script.md,brief.md --summary "3 幕结构,钩子在前 3s"
|
||||
|
||||
# 下游步骤前取上游最近一步作为输入
|
||||
python skills/shared/scripts/manifest.py latest --topic <主题> [--layer plan]
|
||||
python skills/shared/scripts/manifest.py read --topic <主题> # 看全链路
|
||||
```
|
||||
|
||||
Schema:`{topic, profile, created, updated, title, summary, platform, kind, status, tags[], cover, deliverables[], steps:[{layer, skill, at, status, outputs[], upstream[], summary}]}`。
|
||||
`layer` 取 `discover/plan/produce/publish/attribute/general`;step `status` 取 `done/failed`(默认 done)。契约稳定、可被任一层消费。
|
||||
|
||||
> 存量目录用 `scripts/migrate_outputs.py`(dry-run→apply 回填展示头,`--reorganize` 归整中间件进 assets/)收敛;测试残渣用 `scripts/cleanup_outputs.sh` 清理。
|
||||
|
||||
## 出站内容安全闸门(发布/评论类 SKILL 契约)
|
||||
|
||||
任何把文本**发到公开平台**的脚本(xhs/douyin/web_publisher/xhs_comment/zhihu_answer 等),在真发(`--exec`)前**必须**过 `skills/shared/scripts/content_guard.py` 的 `guard_or_die(...)`。**分两级**(见 `BLOCK_CATEGORIES`):**BLOCK 级**=真·敏感信息(API key、内部 URL/域名、代理 IP、内部路径、env 名 + `.env` 真值)→ **fail-closed 退出码 7 阻止发布**;**WARN 级**=AI 措辞(由 AI 生成/OpenClaw/Claude/system prompt/大模型)与模型名(claude-*/gpt-image-2)→ 论文解读、AI 科普里可能是正常内容,**只提醒不拦截**。dry-run 全部只告警。放行硬拦须显式 `--allow-unsafe`。新增发布类脚本照此接入。
|
||||
|
||||
**有界编排约定**:manifest 只当**薄索引**(`summary` 一行给编排层路由 + `outputs[]` 指路径),**不复制内容**。跨层要传的东西分两类,都落 `outputs/<主题>/` 成文件,不留在对话里:
|
||||
- **产物(载荷)**:脚本/图/视频/文案 → 写文件,`--outputs` 指过去,下游按路径读全文。
|
||||
- **决策/意图**(基调、受众、钩子、do/don't 等不体现在产物里的)→ 写进 `outputs/<主题>/brief.md`(策划层的创作简报),同样列入 `--outputs`。
|
||||
|
||||
## 测试
|
||||
|
||||
SKILL 可带 `tests/` 目录,用低成本模型验证基本功能:
|
||||
- `test1.prompt` — 测试输入
|
||||
- `test1.expected` — 期望输出关键字/pattern
|
||||
|
||||
## 设计约束
|
||||
|
||||
1. **独立可调** — 不依赖其他 SKILL
|
||||
2. **无 Profile 也能用** — Profile 是加持不是前提
|
||||
3. **接口一致** — 输出格式稳定,可被下游消费
|
||||
4. **SKILL.md 精简** — 执行流程在主文件,领域知识放 references/
|
||||
5. **泛化** — 定义规则和模式,不给具体 case 示例
|
||||
@@ -0,0 +1,61 @@
|
||||
# 已知问题
|
||||
|
||||
本页记录目前已知、且与 Easel 使用相关的问题,以及推荐的规避方式。遇到未列出的问题,欢迎提交 [Issue](https://github.com/ZJU-REAL/Easel/issues)。
|
||||
|
||||
---
|
||||
|
||||
## CLI 终端对话中「问答题」后回复重复显示
|
||||
|
||||
- **影响范围**:仅 `easel chat`(终端对话)。**Web 工作台不受影响**。
|
||||
- **表现**:当 Agent 触发一次 `ask_user` 问答题、用户回答之后,Agent 的下一条回复在终端里可能被重复渲染一次(内容正确,只是显示了两遍)。
|
||||
- **性质**:这是**纯显示层**问题,不影响实际对话内容、产物生成或发布结果。
|
||||
|
||||
### 根因
|
||||
|
||||
问题位于上游 [OpenClaw](https://www.npmjs.com/package/openclaw) 本体的**会话投影(session projection)**逻辑,不在 Easel 仓库内。
|
||||
|
||||
`easel chat` 底层调用 `openclaw tui`,由 OpenClaw 的 gateway-client 负责在终端重建对话记录。当一条实时回复与另一行(例如 `ask_user` 的问答行)发生错误匹配、且两者不共享 transcript identity 时,投影逻辑会把该回复重新插入一次,导致重复渲染。
|
||||
|
||||
我们已核实该根因,并在上游的回归测试中复现(修复前 3 条相关用例失败,修复后全部通过)。
|
||||
|
||||
### 上游修复进展
|
||||
|
||||
修复已提交至 OpenClaw,跟踪 PR:
|
||||
|
||||
- openclaw#144730
|
||||
- openclaw#144892
|
||||
|
||||
修复采用四层策略:全内容唯一匹配、要求终端证据、暂定恢复记录、以及在暂定恢复无法表示时保留后续独立 final 可见。
|
||||
|
||||
### 规避与升级
|
||||
|
||||
- **推荐**:使用 **Web 工作台**(`easel web`,默认 `http://localhost:7860`)。Web 后端从原始事件流自行渲染,不经过上述会话投影逻辑,因此**不受此问题影响**,并且提供比 CLI 更完整的会话、素材、账号、画像、内容库与发布管理能力。
|
||||
- 若坚持使用 `easel chat`:待上游发布含修复的版本后,升级 OpenClaw 即可解决:
|
||||
|
||||
```bash
|
||||
npm i -g openclaw@latest
|
||||
```
|
||||
|
||||
- Easel 安装的是 OpenClaw 全局 CLI(预构建产物),因此我们**不在 Easel 仓库内内置该补丁**,而是跟随上游最新版本。`easel doctor` 已加入 OpenClaw 最低版本检查(≥ 2026.6.11),版本过旧会直接提示升级。
|
||||
|
||||
---
|
||||
|
||||
## 第三方代理 / 兼容端点 LLM 一直超时(#9、#11)
|
||||
|
||||
- **影响范围**:配置第三方代理或 Anthropic/OpenAI-compatible 端点的安装。
|
||||
- **表现**:`easel ping` 或小请求可能正常,但稍大、带思考的请求持续超时;部分版本上 `setup.sh` 还会报 `baseUrl: expected string, received undefined` 或 `Unrecognized key: "timeoutSeconds"`。
|
||||
|
||||
### 根因(已修复)
|
||||
|
||||
- 旧版 OpenClaw(如 2026.3.x)的 provider schema 要求 anthropic 配置**原子写入**;逐字段写入时中间态缺 `baseUrl`,整份校验失败。`setup.sh` 已改为整块一次性写入。
|
||||
- 旧版本不认识 `timeoutSeconds` 字段,单次请求 600 秒空闲超时写不进去,回落到默认短超时,首个 token 稍慢即超时。该写入在老版本上已降级为尽力而为,不再中断安装。
|
||||
|
||||
### 建议
|
||||
|
||||
```bash
|
||||
npm i -g openclaw@latest
|
||||
git pull
|
||||
bash setup.sh
|
||||
```
|
||||
|
||||
升级后 `easel doctor` 会校验 OpenClaw ≥ 2026.6.11。不升级时安装不再报错,但请求超时受旧版默认超时限制;请确认模型名带 provider 前缀(如 `anthropic/claude-sonnet-4-6`),具体卡在哪一步可看 `easel gateway logs`。
|
||||
@@ -0,0 +1,171 @@
|
||||
# Easel Skill 能力地图
|
||||
|
||||
> 本文档按 Easel 的内容工作流分层介绍当前技能库。每个条目对应 `skills/openclaw/` 中一个可用的 `SKILL.md`。
|
||||
> 当前共 **114 个 Skill**;这里只说明各 Skill 负责什么,具体输入、输出和执行流程请查看对应目录。
|
||||
|
||||
## 🗺️ 分层总览
|
||||
|
||||
| 层级 | Skill 数量 | 作用 |
|
||||
|---|---:|---|
|
||||
| 🧱 基础能力 | 6 | 贯穿发现、策划、创作、发布与归因的工作台基础能力。 |
|
||||
| 🔭 发现层 | 9 | 发现热点、趋势、行业变化、竞品动态和内容机会。 |
|
||||
| 🧭 策划层 | 16 | 把机会转化为定位、选题、结构、排期和可执行方案。 |
|
||||
| 🎨 创作层 | 51 | 完成文字、视觉、音频、视频和复合内容的实际制作。 |
|
||||
| 📣 发布层 | 20 | 完成平台适配、质量检查、排期、互动和真实发布。 |
|
||||
| 📊 归因层 | 11 | 记录内容表现,分析数据与评论,并把结论用于下一轮策略。 |
|
||||
|
||||
## 🧱 基础能力
|
||||
|
||||
贯穿发现、策划、创作、发布与归因的工作台基础能力。
|
||||
|
||||
| Skill | 功能介绍 |
|
||||
|---|---|
|
||||
| `asset-manager` | outputs/ 目录下的产物管理:按日期/平台/类型归档、打标签、搜索历史内容、生成素材清单。 |
|
||||
| `batch-process` | 批量处理:对一个目录里的一批图片/视频/音频统一套用同一操作——批量压缩、加水印、转格式、缩放、转比例、音量归一化等。 |
|
||||
| `skill-my-account` | 查询用户在 Easel 已登录的小红书、抖音、快手、知乎和视频号账号,以及粉丝、获赞、关注和作品列表。 |
|
||||
| `skill-profile-builder` | 首次使用引导:从社媒链接分析、从零生成账号画像 Profile。收集社媒链接+运营意图,分析已发内容与收藏喜好,生成 6 维 Profile。 |
|
||||
| `skill-profile-manager` | 管理账号画像全生命周期:创建空白画像、编辑六维字段、更新记忆、切换、导出和对比。 |
|
||||
| `template-library` | 内容模板的保存、复用、管理。把成功的内容结构保存为模板,下次直接套用,支持模板分类和版本管理。 |
|
||||
|
||||
## 🔭 发现层
|
||||
|
||||
发现热点、趋势、行业变化、竞品动态和内容机会。
|
||||
|
||||
| Skill | 功能介绍 |
|
||||
|---|---|
|
||||
| `skill-algorithm-updates` | 追踪抖音、小红书、B站、微博、知乎和视频号的算法、推荐分发、审核与变现规则变化,并分析对创作者的影响。 |
|
||||
| `skill-competitor-analysis` | 分析竞品账号的内容策略,拆解选题、格式、爆款规律和互动模式,输出差异化机会与行动建议。 |
|
||||
| `skill-content-gap-analysis` | 分析社媒赛道的内容空白,发现高需求低竞争的蓝海选题机会。 |
|
||||
| `skill-cross-platform-diff` | 跨平台内容差异深度分析。分析同一话题/内容在不同平台(小红书、抖音、B站、知乎、 微博、公众号、X 等)的呈现差异:内容形式、受众偏好、话语体系、流量逻辑、变现路径。 帮创作者理解"同一个内容在不同平台应该怎么做"。 |
|
||||
| `skill-event-calendar` | 查询未来 N 天的节日、纪念日、电商节点、行业事件,为创作者提供内容蹭点。 覆盖中国节假日、国际节日、电商大促、行业展会、考试节点、体育赛事等。 |
|
||||
| `skill-news-intelligence` | 聚合中文行业媒体、垂类资讯和平台商业动态,按创作者赛道过滤,生成结构化情报简报与可执行选题。 |
|
||||
| `skill-rss-aggregator` | RSS/Newsletter 聚合:订阅一批博主/媒体/Newsletter 的 RSS/Atom 源,拉取最新条目, 按关键词与时间窗过滤、去重、按时间排序,产出选题/资讯摘要。 |
|
||||
| `skill-trending-topics` | 抓取微博、抖音、知乎、头条、B站实时热搜,筛选与创作者赛道相关的热点,输出二创选题建议。 |
|
||||
| `skill-ugc-discovery` | 发现用户生成内容(UGC)。搜索与创作者品牌/账号相关的粉丝内容、测评、提及和社区讨论, 输出高价值 UGC 列表与互动建议。 |
|
||||
|
||||
## 🧭 策划层
|
||||
|
||||
把机会转化为定位、选题、结构、排期和可执行方案。
|
||||
|
||||
| Skill | 功能介绍 |
|
||||
|---|---|
|
||||
| `skill-account-diagnosis` | 账号诊断/起号体检:读取已完善的画像 Profile + 近期内容数据,诊断垂直度、定位清晰度、限流降权信号、流量池阶段,给出病因→证据→处方式的起号意见与发布建议。 |
|
||||
| `skill-article-outline` | 生成长文大纲:基于搜索分析生成 H2/H3 标题结构、段落字数目标、图表位置和 FAQ 规划,适用于公众号文章、知乎专栏、博客。 |
|
||||
| `skill-audience-profiler` | 构建目标受众画像:分析粉丝人群特征、痛点需求、内容偏好和触达渠道,输出可执行的受众画像卡。 |
|
||||
| `skill-brand-onboarding` | 创作者/品牌入驻:通过结构化访谈收集视觉风格、内容调性、受众画像和运营目标,生成完整的账号画像档案。 |
|
||||
| `skill-campaign-planner` | 活动/营销策划(国内本地化):为节日营销、电商大促(618/双11/年货节)、新品发布、活动造势 制定完整方案——目标拆解、营销节奏(预热-爆发-返场)、多平台内容矩阵、互动玩法、KOL 分层、 预算分配、风险合规、效果指标。 |
|
||||
| `skill-carousel-planner` | 规划轮播图/多图笔记的分页结构:封面 Hook、内容节奏、每页文案和视觉方向、CTA 设计,附互动评分。 |
|
||||
| `skill-collab-proposal` | 品牌合作方案与联名策划。 |
|
||||
| `skill-content-calendar` | 生成月度社媒内容排期表:逐条选题+角度+视觉方向,覆盖小红书/抖音/B站/微博。 |
|
||||
| `skill-content-matrix` | 将内容支柱与多种格式交叉,生成选题矩阵,每个格子产出一个可直接执行的选题。 |
|
||||
| `skill-content-strategy` | 制定全面的内容策略方案:内容支柱架构、受众路径规划、90 天节奏原则、分发渠道策略、KPI 体系,输出可执行的策略文档。 |
|
||||
| `skill-hook-generator` | 针对任意主题生成多种 Hook(开头钩子)变体,用经过验证的互动公式抓住开头注意力,附字数校验。 |
|
||||
| `skill-livestream` | 为直播生成完整方案:直播主题、流程时间表、开场白/过渡语/催单话术/感谢话术/互动话术。 适用于带货直播、知识分享直播、娱乐直播。 |
|
||||
| `skill-positioning-analysis` | 差异化定位分析:帮账号/品牌找到差异化定位——扫描赛道、给竞品定位坐标、识别空白机会、 从人群/场景/价值/形式/人设多维找差异点,凝练一句话定位并给落地建议。 |
|
||||
| `skill-topic-evaluator` | 评估单个选题的潜力,按统一维度(流量潜力、账号匹配、 竞争差异化、时效价值、变现空间、制作成本、合规风险)打分,输出"做/不做/改方向"建议。 |
|
||||
| `skill-trend-rider` | 给定一个热点事件或话题,结合创作者账号定位,输出蹭热点的具体内容方案。 包含切入角度、内容形式、标题建议、风险提醒。 |
|
||||
| `skill-voice-builder` | 通过结构化访谈和写作样本分析,构建创作者个人声音画像(语气/用词/节奏/风格),确保后续内容风格一致。 |
|
||||
|
||||
## 🎨 创作层
|
||||
|
||||
完成文字、视觉、音频、视频和复合内容的实际制作。
|
||||
|
||||
| Skill | 功能介绍 |
|
||||
|---|---|
|
||||
| `ai-image-gen` | 通用 AI 生图:文生图 / 图生图 / 图像变体。 |
|
||||
| `ai-music` | AI 音乐 / BGM 生成:给短视频、社媒内容生成原创背景音乐 / 配乐 / 纯音乐。通过可插拔 provider(阿里 DashScope / Suno 类第三方 API)文生音乐,异步提交→轮询→下载,产物可再裁剪/归一化或加到视频。 |
|
||||
| `ai-video-gen` | AI 视频生成:文生视频 / 图生视频 / 数字人首帧驱动。通过可插拔 provider(通义万相 Wan / 火山 Seedance / 快手可灵 / OpenAI 兼容)异步生成视频,需要配置相应生成服务。 |
|
||||
| `audio-denoise` | 音频降噪:去除录音中的背景噪声、电流声、风噪、嗡嗡声。 |
|
||||
| `audio-editing` | 通用音频处理:音频剪辑/裁剪、格式转码(mp3/wav/m4a/aac)、音量归一化、从视频提取音轨、多段拼接、淡入淡出、变速(保音高)。 |
|
||||
| `audio-mix` | 音频混合 / 混音:把旁白口播 + 背景音乐 + 音效混成一轨,BGM 自动循环补足并可闪避(旁白说话时自动压低 BGM 保证人声清晰)。 |
|
||||
| `audio-visualizer` | 音频可视化视频:把纯音频(播客片段、音乐、口播金句、电台)渲染成带动态波形/频谱的视频,配封面和标题,好发到抖音/B站/视频号等只收视频的平台。 |
|
||||
| `auto-short-video` | 一句话主题 → 成品短视频:自动串联 文案→配图/AI视频→配音→字幕→BGM→合成,把 Easel 制作层零件编排成一条'一键出片'流水线。单条视频、口播/资讯向,画面默认逐句配图 + Ken Burns 缓动,需要动态时才逐段图生视频。 |
|
||||
| `auto-subtitle` | 自动字幕 / 语音转字幕:把音频或视频里的语音识别成字幕文件(SRT/ASS/TXT/JSON),可选把字幕烧录进视频。 |
|
||||
| `beat-sync-video` | 音乐卡点视频 / 踩点视频:检测背景音乐的节拍,让图片或片段在节拍点上切换,配推进/白闪特效,做出燃系'卡点'短视频。 |
|
||||
| `card-design` | 社媒卡片视觉设计系统:提供配色、中文字体层级、满画幅布局、品类骨架和死空白/密度质检,避免模板化 PPT 与廉价 AI 感。 |
|
||||
| `card-quote` | 生成适合微博、知乎、公众号或 X/Twitter 分享的 16:9 横版金句卡和数据卡。 |
|
||||
| `card-xiaohongshu` | 把已有卡片文案渲染为 1080×1440 小红书竖版知识卡片组,并按 card-design 选择视觉风格。 |
|
||||
| `chart-visualization` | 将数据可视化为图表。当用户需要生成柱状图、折线图、饼图、散点图、雷达图、桑基图、思维导图、流程图等图表时调用此技能,通过 curl 工具调用 AntV API 生成图表图片。产出静态图片 URL(25+ 类型)。 |
|
||||
| `clipify` | 从长视频中自动提取精彩片段,切成独立短视频,支持 16:9→9:16 竖版转制和逐字字幕烧录。 |
|
||||
| `comparison-card` | 对比图/一图流:生成 A vs B 参数对比图、优劣势对比表、产品参数一图流。 用 HTML+CSS 渲染成可截图的视觉卡片,适合小红书/微博等平台分享。 |
|
||||
| `copywriting` | 国内带货转化营销文案:提炼卖点并产出种草、信息流广告、活动促销、电商详情页或落地页的标题、正文和 CTA。 |
|
||||
| `data-report` | 把 CSV、Excel 或 JSON 数据生成包含 KPI、图表和洞察的完整可视化报告页。 |
|
||||
| `doc-convert` | 把 Markdown 文稿排版并转换为 HTML、可打印 PDF 或长图 PNG。 |
|
||||
| `ecom-details-image` | 生成电商商品视觉方案:主图概念、场景图、详情页视觉方向和 AI 生图 Prompt。 |
|
||||
| `green-screen` | 绿幕抠像 / 换背景 / 合成:把绿幕(或蓝幕/指定色)拍摄的前景人物抠出来,合成到新背景——图片、视频、纯色或前景自身模糊。 |
|
||||
| `gzh-design` | 微信公众号文章排版引擎:把 Markdown / Word / PDF / 纯文本转换为可直接粘贴进公众号编辑器且不掉样式的 HTML,自动章节编号、关键词标记、引言卡、目录、代码块、图片/GIF 与作者签名;主题从组件库按题材推荐,支持"一键自动排版"和按描述/参考图生成自定义主题。 |
|
||||
| `image-editing` | 通用图像处理加工:改尺寸/缩放、裁剪、补边适配平台尺寸、格式转换(png/jpg/webp)、 压缩到目标大小、加文字或图片水印、圆角、多图拼接、生成缩略图、读图片信息。 基于 image_ops.py 确定性处理。 |
|
||||
| `image-enhance` | 图片增强 / 放大 / 变清晰:高质量放大(Lanczos 2x/4x)+ 去噪 + 锐化 + 自动对比度/饱和度,改善偏糊、偏暗、噪点多的图片。 |
|
||||
| `infographic` | 将数据或文字内容转化为可视化信息图,支持静态(AntV)和动画 GIF 两种模式。当用户需要制作信息图、数据可视化、流程图、对比图、动画图表、GIF 图表、思维导图、SWOT 分析图时调用。本地渲染信息图/GIF 动画。 |
|
||||
| `meme-generator` | 表情包 / Meme 生成:给图片加经典上下大字(白字黑边)做梗图,或在图上/下加配文条做反应图('当…的时候'格式)。中英文都支持,自动换行和字号自适应。 |
|
||||
| `mindmap` | 思维导图:把 Markdown 大纲(标题层级 + 列表)渲染成可交互思维导图 HTML,可选导出 PNG。适合知识结构、内容框架、SWOT、脑图梳理。 |
|
||||
| `multi-voice-dubbing` | 多角色对话配音:按 cast 和逐行对白为不同角色分配音色与情绪,合成多声线音轨和带角色名字幕。 |
|
||||
| `novel-writer` | 长篇小说/网文连载创作:从世界观、人设和三级大纲写到逐章正文,并用文件化状态维护伏笔、前情和跨章一致性。 |
|
||||
| `paper-explainer` | 科研论文解读:解析 arXiv/PDF 的公式与图表,提炼问题、贡献、方法、关键图和结论,再产出 B站/视频号解读视频或知乎/公众号图文。 |
|
||||
| `post-formatter` | 用 PAS、AIDA、BAB、STAR、SLAY 等经典框架将主题结构化为社媒帖子。 200-250 字、20 行以内、移动端友好排版。适用于公众号、知乎、微博、LinkedIn 等长文帖子。 |
|
||||
| `poster-hero` | 生成 1080×1920 竖版营销海报,包含大标题、核心卖点和可选二维码,适合产品发布、活动宣传与朋友圈传播。 |
|
||||
| `remove-bg` | 图片去背景 / 抠图 / 换背景:用 AI 语义分割把主体从背景抠出,输出透明 PNG,或直接换成纯色(电商白底)/ 新场景背景。无需绿幕。 |
|
||||
| `short-drama` | 制作多集 AI 微短剧:建立剧集圣经和角色参考,完成分集剧本、逐镜 I2V、对白审计、配音字幕 BGM 与成片,保持跨镜跨集一致性。 |
|
||||
| `slideshow-video` | 图片相册 → 视频:把一组图片做成带 Ken Burns 缓慢缩放、图间转场、背景音乐和逐图字幕的视频,自动适配平台画幅(竖版/方形/横版)。 |
|
||||
| `social-content` | 通用多平台社媒内容(单条/兜底):钩子文案、正文、标签策略和互动引导,主打涨粉/互动/内容运营, 支持微博/抖音/B站/知乎/公众号/X 等;平台不确定或要多平台一次成稿时的默认选择。 |
|
||||
| `style-transfer` | 文案风格迁移:把一段文案从一种风格改写成另一种风格(严肃→搞笑、书面→口语、文艺→直白、正式→社交媒体感), 支持风格参考(给一段目标风格的示例文本)。 |
|
||||
| `subtitle-translate` | 字幕翻译 / 双语字幕:把已有字幕(SRT/VTT/ASS)翻译成目标语言,生成双语(原文+译文)或纯译文字幕,并可软挂载 / 硬烧录进视频。 |
|
||||
| `text-condenser` | 字数裁剪/摘要:把长文本压缩到指定字数,保留核心信息。支持硬裁剪(严格字数)、 摘要(保留要点)、金句提取(只保留最精华的句子)三种模式。 特别适合从长文生成平台适配的短文。 |
|
||||
| `text-polisher` | 文本润色打磨:七轮聚焦扫描(清晰度/语气/价值感/证据/具体性/情感/风险) + 去 AI 感改写(砍填充短语、打破公式化结构、主动语态、变化节奏)。 |
|
||||
| `tts-voiceover` | 文字转语音配音:把文案/脚本合成为 AI 语音口播、旁白、朗读音频。配了 VOICE_PROVIDER 默认走闭源云 TTS(CosyVoice2 等,有情感、像真人),edge 仅无 key 时兜底(edge 偏机械/AI 味);同步输出分句 SRT 字幕、mp3/wav/m4a。 |
|
||||
| `video-chapters` | 视频章节 / 时间戳目录:给中长视频自动生成章节划分和时间戳目录,用于 B站分P/YouTube 章节/视频描述区,方便观众跳转、提升完播。 |
|
||||
| `video-editing` | 用自然语言指令剪辑视频:裁剪、拼接、变速、跳切去静音、文字覆盖、横竖比转换、抽帧封面、转 GIF、压缩、加 BGM/水印。 |
|
||||
| `video-highlights` | 长视频 / 直播录像高光切片:从一条长视频里找出高光片段,切成多条独立短视频,可选转竖版 9:16 + 加字幕。找点两种方式——音频能量峰值(情绪高涨/欢呼/大声处)或转录后由内容判断挑金句段。 |
|
||||
| `video-intro-outro` | 视频片头 / 片尾:生成带标题、副标题、logo、关注引导的片头卡片和片尾卡片,并拼接到主视频(硬切或淡入淡出转场)。 |
|
||||
| `video-production` | 整片视频产线(内置 video-pipeline-sdk):从源视频/图片分镜出发,走 探针→转录→分场→设计表→搭建→校验→抽帧预览→渲染→交付 的多轮全流程,含双人工确认门与五件套/响度/转场等质量门。转录三级降级:SRT 字幕优先 → 硅基流动 ASR API → 本地 whisper 兜底。 |
|
||||
| `video-reframe` | 智能转换视频画幅,支持 9:16/16:9/1:1、模糊背景填充、焦点裁切和人脸居中裁切。 |
|
||||
| `video-script` | 生成视频脚本,覆盖短视频(7-60秒)到中长视频(1-30分钟)全时长。 短视频:Hook 变体评分、分秒计时、字幕文案、封面方案。 中长视频:留存率优化、节奏中断点、前向钩子、章节结构。 适用于抖音、视频号、小红书视频、B站、YouTube 等平台。 |
|
||||
| `video-strategy` | 视频制作策略与工具选型:AI 视频生成模型对比、视频脚本结构设计、制作流程规划,覆盖产品演示/解说/社媒短视频场景。 |
|
||||
| `video-to-article` | 把口播、讲座、直播或 Vlog 转录并改写成小红书笔记、公众号文章或知乎内容,同时抽帧配图。 |
|
||||
| `voice-clone` | 上传本人语音样本克隆专属音色,再用它合成口播、旁白或带货语音。 |
|
||||
| `xhs-note-creator` | 小红书内容总入口:生成标题、正文、caption、hashtags,以及 3-9 张图文卡片或短视频分镜,覆盖素材分析、卖点评估、去 AI 味和质检。 |
|
||||
|
||||
## 📣 发布层
|
||||
|
||||
完成平台适配、质量检查、排期、互动和真实发布。
|
||||
|
||||
| Skill | 功能介绍 |
|
||||
|---|---|
|
||||
| `skill-bilibili-upload` | B站视频投稿:把视频投稿到哔哩哔哩,支持标题/简介/分区/标签/封面/转载声明/定时发布。 |
|
||||
| `skill-channels-upload` | 微信视频号发布:把竖版短视频发布到微信视频号(channels.weixin.qq.com)。 |
|
||||
| `skill-community-ops` | 评论区运营与舆情危机应对:为一批评论生成分层回复模板(赞美/提问/求购/杠精/黑粉) 与分级处理规则,从评论中挖掘选题反哺内容,负面事件时做危机分级 + 声明草稿 + 统一口径。 |
|
||||
| `skill-content-repurposing` | 将一篇内容拆解改编到小红书、抖音、B站、微博等多平台,适配各平台原生格式和风格。 |
|
||||
| `skill-cross-platform-publish` | 跨平台一键发布:一份内容适配并发布到多个平台(小红书/抖音/B站/公众号/快手/视频号/知乎)。 按各平台格式约束(字数/比例/标签/内容类型)适配内容,再逐个委派对应平台发布 SKILL。 |
|
||||
| `skill-douyin-upload` | 将视频/图文内容发布到抖音(creator.douyin.com)。 |
|
||||
| `skill-kuaishou-upload` | 快手视频发布:把竖版短视频发布到快手创作者中心。 |
|
||||
| `skill-persona-check` | 人设一致性检查与品牌调性检查:对比内容与创作者画像的账号定位、内容赛道、形式、受众、 风格和偏好, 输出一致性评分和具体偏离点。 |
|
||||
| `skill-publish-checklist` | 发布前完整性检查:逐项检查标题、封面、标签、格式、合规标记、链接、CTA 是否齐全, 确保内容没有遗漏就能发布。 |
|
||||
| `skill-publish-notify` | 发布通知推送:内容发布成功/失败后,把结果推送到飞书/钉钉/企业微信群机器人、 Telegram、Slack 或任意 webhook。 |
|
||||
| `skill-publish-scheduler` | 批量定时发布排期:管理"内容 × 平台 × 发布时间"的排期表,导入排期、查看队列、计算到期项、 到期派发给各平台发布 SKILL、回填状态。 |
|
||||
| `skill-quality-gate` | 发布前质量关卡:合规风险检测(敏感词、绝对化用语、平台规则) + 产物质量审核(完整性、可读性、平台适配度)。一次检查,两道把关。 |
|
||||
| `skill-risk-scanner` | 内容原创度与版权风险评估:分析文案是否存在洗稿/搬运嫌疑,评估素材版权风险, 检查引用规范。 |
|
||||
| `skill-seo-quality` | 平台原生搜索流量优化:把内容做成能被平台搜索到的样子。 校验并优化标题/正文关键词布局、话题标签搜索权重、封面/首帧文字关键词、 搜索流量 vs 推荐流量的取舍。覆盖小红书、抖音、知乎、公众号、B站、微博。 |
|
||||
| `skill-short-link` | 短链 + UTM 追踪:给内容/投放链接拼接 UTM 追踪参数(来源/媒介/活动)并缩短, 便于在小红书/抖音/公众号等追踪流量来源与活动效果。 |
|
||||
| `skill-wechat-publisher` | 微信公众号文章自动创作与发布工具。给定参考文章、文字或文档,自动搜索整理全网相关信息、生成图文并茂的公众号文章,并发布到微信公众号草稿箱。特别强调反 AI 检测写作。 |
|
||||
| `skill-xhs-comment-reply` | 小红书评论互动运营:列出我的笔记、抓取某条笔记下的评论、按画像语气逐条回复、以及删除评论 (含自己发的回复)。 |
|
||||
| `skill-xhs-publisher` | 将图文/视频内容发布到小红书(XHS)。 |
|
||||
| `skill-zhihu-answer` | 知乎问答回答发布:在知乎问题下发布原创回答——搜热门问题、检查可答性、写内容、 Playwright 发布(绕 header 遮挡 + JS 遍历发布按钮)。 |
|
||||
| `skill-zhihu-publisher` | 知乎发布:把文章发布到知乎专栏(也可用于回答草稿)。 |
|
||||
|
||||
## 📊 归因层
|
||||
|
||||
记录内容表现,分析数据与评论,并把结论用于下一轮策略。
|
||||
|
||||
| Skill | 功能介绍 |
|
||||
|---|---|
|
||||
| `roi-calculator` | 计算内容营销 ROI:根据投放数据算出 CTR/CPC/CPM/ROAS 等指标,对比行业基准,支持单活动分析与多活动横向比较。 |
|
||||
| `skill-comment-insights` | 评论区量化分析:对一批评论做情感分析(正/中/负占比 + 代表评论)、高频词与短语提取、 以及需求/吐槽/提问的诉求挖掘,为内容复盘和选题反哺提供数据。 |
|
||||
| `skill-content-calendar-log` | 统一内容日历底座。记录每次发布(发布页/对话页均自动落库)、用户排期、平台活动/节日/特殊日期到 一个时间线,并供 Agent 规划前读回。 |
|
||||
| `skill-content-postmortem` | 内容复盘与爆款规律提炼。两种模式:(A) 单条复盘 — 分析一条已发布内容为什么爆/扑, 从 Hook、结构、选题、时间、平台适配等维度拆解原因;(B) 规律提炼 — 从多条内容中 提炼爆款共同特征、总结可复制的爆款公式。 |
|
||||
| `skill-data-tracker` | 社媒数据记录与趋势分析。三种模式:(A) 记录快照 — 记录当日粉丝数、互动量等指标快照; (B) 增长趋势 — 分析粉丝增长率、增速变化、里程碑预测;(C) 内容生命周期 — 追踪单条内容 从发布到衰减的数据变化,判断速爆型/稳增型/长尾型。 |
|
||||
| `skill-post-scorer` | 对社媒帖子草稿进行互动潜力评分,基于历史表现数据输出结构化评分卡。 |
|
||||
| `skill-publish-analytics` | 分析发布日志数据,从发布时间、标签效果、内容类型、粉丝增长四个维度归因内容表现,输出可执行的优化建议。 |
|
||||
| `skill-publish-log` | 发布记录管理。 |
|
||||
| `skill-social-performance-review` | 生成月度社媒效果复盘报告,分析小红书、抖音、B站、微博等平台的内容表现,输出下月可执行建议。 |
|
||||
| `skill-strategy-advisor` | 基于现有内容数据和画像迭代优化内容策略。分析过去一段时间的内容表现、画像信息、 行业趋势,给出下一阶段的内容方向调整、新赛道建议、内容形式优化、发布节奏调整、 画像微调等策略建议。 |
|
||||
| `skill-xhs-analyzer` | 小红书内容分析:搜索笔记、拉取互动数据、分析爆款规律、创作者画像、限流检测,支持 CLI 自动化操作。 |
|
||||
Reference in new issue
Block a user