Easel is an open-source content workspace and AI agent for managing social media from trend discovery through planning, content creation, publishing, and performance analysis. It is intended for social media creators and maintains separate account profiles, content projects, platform adaptations, and publishing records. The catalogue skills support these content and publishing workflows.
Getting it into your agent
It runs from inside its repository, so the clone comes first — what it calls does not travel with the file alone.
git clone --depth 1 https://github.com/ZJU-REAL/Easelnpx agentmods add skills/zju-real/easel/skill-zhihu-answerWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/zju-real/easel/skill-zhihu-answer)<a href="https://agentmods.dev/skills/zju-real/easel/skill-zhihu-answer"><img src="https://agentmods.dev/badge/skills/zju-real/easel/skill-zhihu-answer/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/zju-real/easel/skill-zhihu-answer"><img src="https://agentmods.dev/badge/skills/zju-real/easel/skill-zhihu-answer.svg" alt="Reviewed on agentmods" width="80" height="20"></a>- NVIDIA SkillSpector pass
What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00142 | $0.01991 |
| Opus 5.5 | $0.00057 | $0.00796 |
| Sonnet 5.5 | $0.00028 | $0.00398 |
| Haiku 4.5 | $0.00014 | $0.00199 |
Grade A, and why
skill-zhihu-answer scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 13d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 188 lines — stays where its author put it; the contents beside it link to each section on GitHub.
skill-zhihu-answer(发布层 · 知乎问答回答)
在知乎问答帖子下发布原创回答:搜索热门问题 → 检查可答性 → 调用制作层 SKILL 写内容 → Playwright 发布。 核心脚本:
skills/shared/scripts/zhihu_answer.py(CWD=项目根)。命令速查见references/commands.md。
与其他 SKILL 的区别
| SKILL | 定位 |
|---|---|
| skill-zhihu-answer(本 SKILL) | 知乎问答帖的回答发布:搜题 + 写内容 + 发布 |
| skill-zhihu-publisher | 知乎专栏文章(zhuanlan)发布,非问答回答 |
| skill-cross-platform-publish | 一稿多发,多平台分发 |
| novel-writer / copywriting | 制作层,生产回答正文;本 SKILL 调用它 |
核心流程
1. 搜索热门问题(可选,或用户直接给 URL)
↓
2. 检查可答状态(未答过 + WriteAnswerButton 存在)
↓
3. 制作层写内容(用 novel-writer / copywriting SKILL,或用户自备文本)
↓
4. 发布前人设检查(有 Profile 时)
↓
5. zhihu_answer.py --exec 发布
↓
6. 发布后留痕(persona_gate record + publish-log record)
Step 1:搜索热门问题(可选)
用已登录的 ZhihuProfile 搜索问题,直接访问候选页取真实回答数(搜索结果元数据不准):
page.goto("https://www.zhihu.com/search?type=question&q=<关键词>", wait_until="networkidle")
# 直接访问候选问题页取真实数据
page.goto("<问题URL>", wait_until="domcontentloaded")
import re
m = re.search(r'(\d[\d,]*)\s*个回答', page.inner_text("body"))
ans_count = int(m.group(1).replace(',', '')) if m else 0
zhihu_answer.py目前不含搜索功能,搜索用临时脚本或用户直接给 URL(逻辑见references/commands.md§6)。
Step 2:检查可答状态
has_write = page.locator(".WriteAnswerButton").count() > 0
already_answered = page.evaluate("""
() => Array.from(document.querySelectorAll('button'))
.some(b => (b.innerText||'').trim() === '编辑回答')
""")
can_answer = has_write and not already_answered
⚠️ 每个用户在同一问题只能回答一次。已答的问题显示「编辑回答」而非「写回答」。 对已答问题不要重复发布,否则进入编辑旧答案流程(发布按钮变为「提交修改」)。
Step 3:制作层写内容
回答正文属于制作层,用制作层 SKILL 写(novel-writer 或 copywriting),也可用用户提供的文本。
内容存为 outputs/主题名/answer_<问题ID>.md。
写作要点(恐怖/悬疑题材示例):第一人称、冷静克制、暗示>直白;短段落多换行适配手机; 开篇 500 字内建立世界观 + 第一个恐怖节点;文末加"本故事纯属虚构"。
Step 4:发布前人设检查
cd <项目根> && python skills/shared/scripts/persona_gate.py check --score <评分>
# 始终退出码 0;低于 80 分时告知偏离点,但不阻断用户发布
Step 5:发布命令
# Dry-run 预检(默认,不真正发布)
cd <项目根> && python skills/shared/scripts/zhihu_answer.py \
--question <问题URL> --content-file <回答内容.md>
# 正式发布
cd <项目根> && python skills/shared/scripts/zhihu_answer.py \
--question <问题URL> --content-file <回答内容.md> --exec
# 调试模式(有头浏览器,首次校验选择器时用)
cd <项目根> && python skills/shared/scripts/zhihu_answer.py \
--question <问题URL> --content-file <回答内容.md> --exec --headed
What ships with it
2 files beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 13d ago Changed e09d186cd4f8
- 1mo ago First seen · 188 lines · 142 tokens per session scan A 42ed18a04c01
skill-zhihu-answer is a skill published in the GitHub repository ZJU-REAL/Easel (4,082 stars, last pushed yesterday), licensed Apache-2.0. It adds 142 tokens to every session and 1,991 once invoked, about $0.0006 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-09-03.
Other skills, from other repositories
paperpod
Use when isolated agent runtime for code execution, live preview URLs, browser automation, 50+ tools (ffmpeg, sqlite, pandoc, imagemagick), LLM inference, and persistent memory — all via CLI or HTTP, no SDK or API keys required. Use when working with paperpod.
node-inspect-debugger
Debug Node.js via --inspect + Chrome DevTools Protocol.
playwright-cli
Translate natural-language browser automation requests into exact playwright-cli commands for interactive web testing and debugging. Use when requests involve opening/navigating pages, interacting with elements, capturing snapshots/screenshots/PDFs, using tabs, inspecting console/network, mocking routes, managing…
Browse Reddit or perform explicitly requested account actions through the existing signed-in Chrome session.
browser
Drive a live browser with async Python against QwenPaw's builtin Browser SDK. The full reference is below; re-load this browser skill after context compaction.
computer-use
Read and drive native desktop apps through the accessibility layer — list apps, snapshot a window as a numbered element tree, then click/type/scroll/drag by element index or screen coordinates. Use for a desktop app, not a web page. macOS + Windows; off unless enabled in Settings.