文件最后提交记录最后更新时间
docs(examples): improve skill scores across 8 skills (#1809) Hullo @mdrxy 👋 I ran your skills through tessl skill review at work and found some targeted improvements. The process was run by me, a human meatbag (yes, I am typing, and that's me (with shorter hair) in the avatar), with some assistance from a skill and claude, which feels fitting and somewhat meta, given it's measuring and updating some skills. So I would consider this a clear disclaimer that I have used AI, but I did human write this. This is done with good intent, not to land some slop, the goal is to improve the activation and use of the skills you're sharing here, that's all. 🙏 <!-- Replace everything above this line with a 1-2 sentence description of your change. Keep the "Fixes #xx" keyword and update the issue number. --> <img width="1312" height="1214" alt="deepagents_score_card" src="https://github.com/user-attachments/assets/2fbd8b01-b73a-40d9-96b4-2047eb5c4004" /> Here's the before/after: | Skill | Before | After | Change | |-------|--------|-------|--------| | query-writing | 53% | 100% | +47% | | arxiv-search | 52% | 94% | +42% | | blog-post | 59% | 89% | +30% | | social-media | 59% | 89% | +30% | | langgraph-docs | 56% | 86% | +30% | | web-research | 59% | 89% | +30% | | schema-exploration | 55% | 83% | +28% | | skill-creator (built-in) | 84% | 88% | +4% | <details> <summary>What changed</summary> **Description improvements (all skills)** - Added concrete action verbs to frontmatter descriptions (e.g. "Writes and structures long-form blog posts" instead of just "Use this skill when writing...") - Added explicit "Use when..." clauses with natural trigger terms users would actually say - Expanded trigger term coverage (e.g. "tweet", "thread", "caption" for social-media) **Body conciseness (7 skills)** - Removed redundant "When to Use This Skill" body sections — these are only read after triggering, so they waste context tokens - Removed filler intro sentences ("This skill provides a structured workflow for...") - Removed "Available Tools" and "Research Subagent Configuration" sections from web-research — the agent already knows its tools - Removed verbose "Common Exploration Patterns" and "Tips" sections from schema-exploration that restated earlier content - Trimmed "About Skills" and "What Skills Provide" sections from both skill-creator instances **arxiv-search (52% → 94%)** - Replaced 103 lines of verbose content with 34 focused lines - Removed explanations of what arXiv is, "When to Use" section, "Features" list, and "Notes" section - Kept only the essential: usage syntax, one example, and dependency install **langgraph-docs (56% → 86%)** - Added concrete capabilities to description (stateful agents, multi-agent workflows, human-in-the-loop) - Added error recovery guidance for failed fetch_url calls - Removed redundant "Overview" section **query-writing (53% → 100%)** - Added error recovery section for empty results, syntax errors, and timeouts </details> Honest disclosure — I work at @tesslio where we build tooling around skills like these. Not a pitch - just saw room for improvement and wanted to contribute. Want to self-improve your skills? Just point your agent (Claude Code, Codex, etc.) at [this Tessl guide](https://docs.tessl.io/evaluate/optimize-a-skill-using-best-practices) and ask it to optimize your skill. Ping me - [@popey](https://github.com/popey) - if you hit any snags. Thanks in advance 🙏 > **Disclaimer**: This contribution was assisted by generative AI tooling (Claude Code + tessl skill review). ## make format ``` make format 🎨 Formatting libs/acp [ "deepagents_acp/ tests/" = "" ] || uv run --group test ruff format deepagents_acp/ tests/ Using CPython 3.12.11 Creating virtual environment at: .venv Built deepagents-acp @ file:///Users/alan/Projects/auto-p-o/langchain-ai/deepagents/libs/acp Installed 69 packages in 100ms 11 files left unchanged [ "deepagents_acp/ tests/" = "" ] || uv run --group test ruff check --fix deepagents_acp/ tests/ All checks passed! 🎨 Formatting libs/cli [ "." = "" ] || uv run --all-groups ruff format . Using CPython 3.12.11 Creating virtual environment at: .venv Built deepagents-cli @ file:///Users/alan/Projects/auto-p-o/langchain-ai/deepagents/libs/cli Built deepagents @ file:///Users/alan/Projects/auto-p-o/langchain-ai/deepagents/libs/deepagents Installed 177 packages in 213ms 125 files left unchanged [ "." = "" ] || uv run --all-groups ruff check --fix . All checks passed! 🎨 Formatting libs/deepagents [ "." = "" ] || uv run --all-groups ruff format . Using CPython 3.12.11 Creating virtual environment at: .venv Installed 118 packages in 143ms 80 files left unchanged [ "." = "" ] || uv run --all-groups ruff check --fix . All checks passed! 🎨 Formatting libs/harbor [ "deepagents_harbor/ tests/" = "" ] || uv run --group test ruff format deepagents_harbor/ tests/ Using CPython 3.12.11 Creating virtual environment at: .venv Built deepagents-cli @ file:///Users/alan/Projects/auto-p-o/langchain-ai/deepagents/libs/cli Built deepagents-harbor @ file:///Users/alan/Projects/auto-p-o/langchain-ai/deepagents/libs/harbor Installed 198 packages in 390ms 7 files left unchanged [ "deepagents_harbor/ tests/" = "" ] || uv run --group test ruff check --fix deepagents_harbor/ tests/ All checks passed! 🎨 Formatting libs/partners/daytona [ "." = "" ] || uv run --all-groups ruff format . Using CPython 3.12.11 Creating virtual environment at: .venv Built langchain-daytona @ file:///Users/alan/Projects/auto-p-o/langchain-ai/deepagents/libs/partners/daytona Installed 115 packages in 133ms 8 files left unchanged [ "." = "" ] || uv run --all-groups ruff check --fix . All checks passed! 🎨 Formatting libs/partners/modal [ "." = "" ] || uv run --all-groups ruff format . Using CPython 3.12.11 Creating virtual environment at: .venv Built langchain-modal @ file:///Users/alan/Projects/auto-p-o/langchain-ai/deepagents/libs/partners/modal Installed 102 packages in 97ms 8 files left unchanged [ "." = "" ] || uv run --all-groups ruff check --fix . All checks passed! 🎨 Formatting libs/partners/runloop [ "." = "" ] || uv run --all-groups ruff format . Using CPython 3.12.11 Creating virtual environment at: .venv Built langchain-runloop @ file:///Users/alan/Projects/auto-p-o/langchain-ai/deepagents/libs/partners/runloop Installed 79 packages in 72ms 8 files left unchanged [ "." = "" ] || uv run --all-groups ruff check --fix . All checks passed! ✅ All packages formatted! ``` ## make lint ``` make lint 🔍 Linting libs/acp [ "deepagents_acp/ tests/" = "" ] || uv run --group test ruff format deepagents_acp/ tests/ --diff 11 files already formatted [ "deepagents_acp/ tests/" = "" ] || uv run --group test ruff check deepagents_acp/ tests/ All checks passed! /Library/Developer/CommandLineTools/usr/bin/make type uv run --group test ty check deepagents_acp All checks passed! 🔍 Linting libs/cli [ "." = "" ] || uv run --all-groups ruff check . All checks passed! [ "." = "" ] || uv run --all-groups ruff format . --diff 125 files already formatted /Library/Developer/CommandLineTools/usr/bin/make type PYTHON_FILES="." uv run --all-groups ty check . warning[possibly-missing-attribute]: Attribute kwargs may be missing on object of type _Call | None | @Todo --> tests/unit_tests/test_thread_selector.py:1409:22 | 1408 | mock_list_threads.assert_awaited_once() 1409 | kw = mock_list_threads.await_args.kwargs | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1410 | assert kw["limit"] == 20 1411 | assert kw["include_message_count"] is False | info: rule possibly-missing-attribute is enabled by default warning[possibly-missing-attribute]: Attribute kwargs may be missing on object of type _Call | None | @Todo --> tests/unit_tests/test_thread_selector.py:1501:22 | 1500 | mock_list_threads.assert_awaited_once() 1501 | kw = mock_list_threads.await_args.kwargs | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1502 | assert kw["limit"] == 20 1503 | assert kw["include_message_count"] is False | info: rule possibly-missing-attribute is enabled by default Found 2 diagnostics 🔍 Linting libs/deepagents [ "." = "" ] || uv run --all-groups ruff check . All checks passed! [ "." = "" ] || uv run --all-groups ruff format . --diff 80 files already formatted /Library/Developer/CommandLineTools/usr/bin/make type uv run --all-groups ty check deepagents All checks passed! 🔍 Linting libs/harbor [ "deepagents_harbor/ tests/" = "" ] || uv run --group test ruff format deepagents_harbor/ tests/ --diff 7 files already formatted /Library/Developer/CommandLineTools/usr/bin/make type PYTHON_FILES="deepagents_harbor/ tests/" [ "deepagents_harbor/ tests/" = "" ] || uv run --group test ty check deepagents_harbor/ tests/ All checks passed! 🔍 Linting libs/partners/daytona [ "." = "" ] || uv run --all-groups ruff check . All checks passed! [ "." = "" ] || uv run --all-groups ruff format . --diff 8 files already formatted /Library/Developer/CommandLineTools/usr/bin/make type uv run --all-groups ty check langchain_daytona All checks passed! 🔍 Linting libs/partners/modal [ "." = "" ] || uv run --all-groups ruff check . All checks passed! [ "." = "" ] || uv run --all-groups ruff format . --diff 8 files already formatted /Library/Developer/CommandLineTools/usr/bin/make type uv run --all-groups ty check langchain_modal All checks passed! 🔍 Linting libs/partners/runloop [ "." = "" ] || uv run --all-groups ruff check . All checks passed! [ "." = "" ] || uv run --all-groups ruff format . --diff 8 files already formatted /Library/Developer/CommandLineTools/usr/bin/make type uv run --all-groups ty check langchain_runloop All checks passed! ✅ All packages linted! ```2 个月前
Merge content writing example (#744) Example on using filesystem to define agent and use Skills, Memory (AGENTS.md), and tools to write blogs, linkedin, posts, and tweets. Uses nano-banana to create an image per post4 个月前
chore: update Makefile targets, add pre-commit hooks (#790) porting infra from langchain-ai/langchain also switch to ty but don't activate in Makefile targets yet4 个月前
Merge content writing example (#744) Example on using filesystem to define agent and use Skills, Memory (AGENTS.md), and tools to write blogs, linkedin, posts, and tweets. Uses nano-banana to create an image per post4 个月前
Update Example on Main to Allow Interrupt Gracefully (#745) 4 个月前
chore(examples): ban-relative-imports = "all" (#1959)2 个月前
Merge content writing example (#744) Example on using filesystem to define agent and use Skills, Memory (AGENTS.md), and tools to write blogs, linkedin, posts, and tweets. Uses nano-banana to create an image per post4 个月前
chore: bump pygments to 2.20.0 everywhere (GHSA-5239-wwwm-4pmq) (#2349) ## Summary - Bumps pygments from 2.19.22.20.0 across all 12 uv.lock files - Fixes GHSA-5239-wwwm-4pmq (low severity) flagged by Dependabot in all sub-packages and examples Affected lock files: - libs/partners/{runloop,quickjs,modal,daytona}/uv.lock - libs/{evals,deepagents,cli,acp}/uv.lock - examples/{text-to-sql-agent,nvidia_deep_agent,deep_research,content-builder-agent}/uv.lock ## Release Note Patch deps ### Test Plan - [x] CI Green :pray:2 个月前
README.md

Content Builder Agent

content-cover-image

A content writing agent for writing blog posts, LinkedIn posts, and tweets with cover images included.

This example demonstrates how to define an agent through three filesystem primitives:

  • Memory (AGENTS.md) – persistent context like brand voice and style guidelines
  • Skills (skills/*/SKILL.md) – workflows for specific tasks, loaded on demand
  • Subagents (subagents.yaml) – specialized agents for delegated tasks like research

The content_writer.py script shows how to combine these into a working agent.

Quick Start

# Set API keys
export ANTHROPIC_API_KEY="..."
export GOOGLE_API_KEY="..."      # For image generation
export TAVILY_API_KEY="..."      # For web search (optional)

# Run (uv automatically installs dependencies on first run)
cd examples/content-builder-agent
uv run python content_writer.py "Write a blog post about prompt engineering"

More examples:

uv run python content_writer.py "Create a LinkedIn post about AI agents"
uv run python content_writer.py "Write a Twitter thread about the future of coding"

How It Works

The agent is configured by files on disk, not code:

content-builder-agent/
├── AGENTS.md                    # Brand voice & style guide
├── subagents.yaml               # Subagent definitions
├── skills/
│   ├── blog-post/
│   │   └── SKILL.md             # Blog writing workflow
│   └── social-media/
│       └── SKILL.md             # Social media workflow
└── content_writer.py            # Wires it together (includes tools)
File Purpose When Loaded
AGENTS.md Brand voice, tone, writing standards Always (system prompt)
subagents.yaml Research and other delegated tasks Always (defines task tool)
skills/*/SKILL.md Content-specific workflows On demand

What's in the skills? Each skill teaches the agent a specific workflow:

  • Blog posts: Structure (hook → context → main content → CTA), SEO best practices, research-first approach
  • Social media: Platform-specific formats (LinkedIn character limits, Twitter thread structure), hashtag usage
  • Image generation: Detailed prompt engineering guides with examples for different content types (technical posts, announcements, thought leadership)

Architecture

agent = create_deep_agent(
    memory=["./AGENTS.md"],                        # ← Middleware loads into system prompt
    skills=["./skills/"],                          # ← Middleware loads on demand
    tools=[generate_cover, generate_social_image], # ← Image generation tools
    subagents=load_subagents("./subagents.yaml"),  # ← See note below
    backend=FilesystemBackend(root_dir="./"),
)

The memory and skills parameters are handled natively by deepagents middleware. Tools are defined in the script and passed directly.

Note on subagents: Unlike memory and skills, subagents must be defined in code. We use a small load_subagents() helper to externalize config to YAML. You can also define them inline:

subagents=[
    {
        "name": "researcher",
        "description": "Research topics before writing...",
        "model": "anthropic:claude-haiku-4-5-20251001",
        "system_prompt": "You are a research assistant...",
        "tools": [web_search],
    }
],

Flow:

  1. Agent receives task → loads relevant skill (blog-post or social-media)
  2. Delegates research to researcher subagent → saves to research/
  3. Writes content following skill workflow → saves to blogs/ or linkedin/
  4. Generates cover image with Gemini → saves alongside content

Output

blogs/
└── prompt-engineering/
    ├── post.md       # Blog content
    └── hero.png      # Generated cover image

linkedin/
└── ai-agents/
    ├── post.md       # Post content
    └── image.png     # Generated image

research/
└── prompt-engineering.md   # Research notes

Customizing

Change the voice: Edit AGENTS.md to modify brand tone and style.

Add a content type: Create skills/<name>/SKILL.md with YAML frontmatter:

---
name: newsletter
description: Use this skill when writing email newsletters
---
# Newsletter Skill
...

Add a subagent: Add to subagents.yaml:

editor:
  description: Review and improve drafted content
  model: anthropic:claude-haiku-4-5-20251001
  system_prompt: |
    You are an editor. Review the content and suggest improvements...
  tools: []

Add a tool: Define it in content_writer.py with the @tool decorator and add to tools=[].

Security Note

This agent has filesystem access and can read, write, and delete files on your machine. Review generated content before publishing and avoid running in directories with sensitive data.

Requirements

  • Python 3.11+
  • ANTHROPIC_API_KEY - For the main agent
  • GOOGLE_API_KEY - For image generation (uses Gemini's Imagen / "nano banana" via gemini-2.5-flash-image)
  • TAVILY_API_KEY - For web search (optional, research still works without it)