Trigger.dev Agent Patterns
papermark/papermark
Patterns for building LLM agents on Trigger.dev tasks: prompt chaining, routing, parallel workers, orchestrator-workers, evaluator loops and human approval gates.
Add tools, agents, and handoffs to an existing Agent Kernel project.
$ npx skills add yaalalabs/agent-kernel --skill ak-build -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install yaalalabs/agent-kernel ak-build --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/yaalalabs/agent-kernel.git skills-src && mkdir -p .claude/skills && cp -r skills-src/ak-py/src/agentkernel/skills/ak-build .claude/skills/ak-build && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "ak-build" agent skill from https://github.com/yaalalabs/agent-kernel/tree/develop/ak-py/src/agentkernel/skills/ak-build into .claude/skills/ak-build/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ak-build", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/yaalalabs/agent-kernel/tree/develop/ak-py/src/agentkernel/skills/ak-buildType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add yaalalabs/agent-kernel --skill ak-build -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install yaalalabs/agent-kernel ak-build --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/yaalalabs/agent-kernel.git skills-src && mkdir -p .agents/skills && cp -r skills-src/ak-py/src/agentkernel/skills/ak-build .agents/skills/ak-build && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "ak-build" agent skill from https://github.com/yaalalabs/agent-kernel/tree/develop/ak-py/src/agentkernel/skills/ak-build into .agents/skills/ak-build/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ak-build", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add yaalalabs/agent-kernel --skill ak-build -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install yaalalabs/agent-kernel ak-build --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/yaalalabs/agent-kernel.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/ak-py/src/agentkernel/skills/ak-build .cursor/skills/ak-build && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "ak-build" agent skill from https://github.com/yaalalabs/agent-kernel/tree/develop/ak-py/src/agentkernel/skills/ak-build into .cursor/skills/ak-build/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ak-build", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/yaalalabs/agent-kernel.git --path ak-py/src/agentkernel/skills/ak-build--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add yaalalabs/agent-kernel --skill ak-build -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install yaalalabs/agent-kernel ak-build --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/yaalalabs/agent-kernel.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/ak-py/src/agentkernel/skills/ak-build .gemini/skills/ak-build && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "ak-build" agent skill from https://github.com/yaalalabs/agent-kernel/tree/develop/ak-py/src/agentkernel/skills/ak-build into .gemini/skills/ak-build/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ak-build", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install yaalalabs/agent-kernel ak-buildInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add yaalalabs/agent-kernel --skill ak-build -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/yaalalabs/agent-kernel.git skills-src && mkdir -p .github/skills && cp -r skills-src/ak-py/src/agentkernel/skills/ak-build .github/skills/ak-build && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "ak-build" agent skill from https://github.com/yaalalabs/agent-kernel/tree/develop/ak-py/src/agentkernel/skills/ak-build into .github/skills/ak-build/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ak-build", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add yaalalabs/agent-kernel --skill ak-build -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install yaalalabs/agent-kernel ak-build --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/yaalalabs/agent-kernel.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/ak-py/src/agentkernel/skills/ak-build .opencode/skills/ak-build && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "ak-build" agent skill from https://github.com/yaalalabs/agent-kernel/tree/develop/ak-py/src/agentkernel/skills/ak-build into .opencode/skills/ak-build/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ak-build", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
ak-buildAdd tools, agents, and handoffs to an existing Agent Kernel project.
Ak Build is an agent skill from yaalalabs/agent-kernel. Add tools, agents, and handoffs to an existing Agent Kernel project. This skill guides you through reading the current project, understanding its framework and structure, then making context-aware additions — new tools, new agents, agent-to-agent handoffs, and Module wiring. The workhorse skill for iterative agent development.
Its SKILL.md is about 4.5k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files (for example `evals/evals.json`).
It sits in AI & LLM Engineering, covering Multi-agent orchestration and Building AI agents. It works with OpenAI and Redis. The repository describes itself as: The Operating System for Scalable Enterprise AI Agents - Run, orchestrate, and deploy Compliant Enterprise AI Agents at scale across frameworks, without lock-in, rewrites or… The licence is Apache-2.0.
8 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 97fa8d9. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
uvpythoncurlFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use uv and curl, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
OPENAI_API_KEYAK_WHATSAPP__ACCESS_TOKENFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Ak Build loads about 4.5k tokens when it runs. Until then it costs about 84 tokens; SKILL.md has 1,327 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from yaalalabs/agent-kernel at commit 97fa8d9, republished under its Apache-2.0 licence (© yaalalabs). 1,327 words, ~4,524 tokens.
.claude/skills/ak-build/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.Use this skill to add new tools, agents, or handoffs to an existing Agent Kernel project.
Before generating any code, inspect the project to determine:
Framework — Open the main agent file (e.g., app.py, demo.py, server.py, lambda.py) and look for:
from agentkernel.openai import OpenAIModule → OpenAI Agents SDKfrom agentkernel.langgraph import LangGraphModule → LangGraphfrom agentkernel.crewai import CrewAIModule → CrewAIfrom agentkernel.adk import GoogleADKModule → Google ADKfrom agentkernel.smolagents import SmolagentsModule → Smolagentsfrom agentkernel.pydanticai import PydanticAIModule → Pydantic AIExisting agents — List every agent already defined (names, roles, instructions).
Existing tools — List every tool function and which agent uses it.
Entry point — Is it CLI (demo.py), API (RESTAPI.run()), Lambda (Lambda.handler), or Azure Function?
Config — Read config.yaml for session type, guardrails, tracing, integrations already enabled.
Dependencies — Read pyproject.toml for the extras already installed (e.g., [openai,api,redis]).
Report back what you found before proceeding. Example:
Project summary:
- Framework: OpenAI Agents SDK
- Entry point:
app.py(API mode viaRESTAPI.run())- Agents:
triage(routes to sub-agents),math(handles math),general(handles everything else)- Tools:
calculator(bound tomath),web_search(bound togeneral)- Session: Redis
- Extras:
[openai,api,redis]
Ask the user what they want to add:
Create the tool function in the project's tool file (usually tool.py, or wherever existing tools live).
Rules:
ToolContext.get() inside the function body to access session and runtime. Never pass context as a parameter.__ (double underscore) as the nested delimiter in environment variable names (e.g., AK_REDIS__URL).from agentkernel.core import ToolContext
def lookup_order(order_id: str) -> str:
"""Look up an order by its ID and return the order details."""
context = ToolContext.get()
session = context.session
# Use session cache for expensive lookups
cache = session.get_non_volatile_cache()
cached = cache.get(f"order:{order_id}")
if cached:
return cached
# Your lookup logic here
result = f"Order {order_id}: shipped, arriving tomorrow"
cache[f"order:{order_id}"] = result
return resultThe binding syntax depends on the framework. Match what the project already uses:
OpenAI Agents SDK:
from agentkernel.openai import OpenAIToolBuilder
tools = OpenAIToolBuilder.bind([lookup_order, existing_tool_1])
agent = Agent(name="support", instructions="...", tools=tools)LangGraph:
from agentkernel.langgraph import LangGraphToolBuilder
tools = LangGraphToolBuilder.bind([lookup_order, existing_tool_1])
agent = create_react_agent(name="support", tools=tools, model=model, prompt="...")CrewAI:
from agentkernel.crewai import CrewAIToolBuilder
tools = CrewAIToolBuilder.bind([lookup_order, existing_tool_1])
agent = Agent(role="support", goal="...", backstory="...", tools=tools, verbose=False)Google ADK:
from agentkernel.adk import GoogleADKToolBuilder
tools = GoogleADKToolBuilder.bind([lookup_order, existing_tool_1])
agent = Agent(name="support", model=LiteLlm(model="openai/gpt-4o-mini"),
description="...", instruction="...", tools=tools)Smolagents:
from agentkernel.smolagents import SmolagentsToolBuilder
tools = SmolagentsToolBuilder.bind([lookup_order, existing_tool_1])
agent = ToolCallingAgent(
tools=tools,
model=model,
name="support",
description="...",
)Pydantic AI:
from agentkernel.pydanticai import PydanticAIToolBuilder
tools = PydanticAIToolBuilder.bind([lookup_order, existing_tool_1])
agent = Agent(model="openai:gpt-4o-mini", name="support", description="...", instructions="...", tools=tools)Gotcha: Always add the new tool to the existing
bind()call for that agent. Don't create a secondbind().
Match the framework already in use:
OpenAI Agents SDK:
from agents import Agent
from agentkernel.openai import OpenAIToolBuilder
support_agent = Agent(
name="support",
handoff_description="Specialist for customer support and order inquiries",
instructions="You help customers with order lookups, returns, and general support questions.",
tools=OpenAIToolBuilder.bind([lookup_order]),
)LangGraph:
from langchain.chat_models import init_chat_model
from langgraph.prebuilt import create_react_agent
from agentkernel.langgraph import LangGraphToolBuilder
model = init_chat_model("openai:gpt-4o-mini")
support_agent = create_react_agent(
name="support", # Always pass name= explicitly!
tools=LangGraphToolBuilder.bind([lookup_order]),
model=model,
prompt="You help customers with order lookups, returns, and general support questions.",
)Gotcha (LangGraph): Always pass
name=tocreate_react_agent(). Without it the agent is unnamed and the supervisor cannot route to it.
CrewAI:
from crewai import Agent
from agentkernel.crewai import CrewAIToolBuilder
support_agent = Agent(
role="support", # CrewAI uses role= as the identifier, NOT name=
goal="Specialist for customer support and order inquiries",
backstory="You help customers with order lookups, returns, and general support questions.",
tools=CrewAIToolBuilder.bind([lookup_order]),
verbose=False,
)Gotcha (CrewAI): Use
role=as the agent identifier — Agent Kernel mapsagent.roleto the agent name. Settingverbose=Falsekeeps output clean.
Google ADK:
from google.adk.agents import Agent
from google.adk.models.lite_llm import LiteLlm
from agentkernel.adk import GoogleADKToolBuilder
support_agent = Agent(
name="support",
model=LiteLlm(model="openai/gpt-4o-mini"), # Always wrap in LiteLlm()
description="Specialist for customer support and order inquiries",
instruction="You help customers with order lookups, returns, and general support questions.",
tools=GoogleADKToolBuilder.bind([lookup_order]),
)Gotcha (Google ADK): Use
LiteLlm(model="openai/gpt-4o-mini")— never pass a bare model string like"gpt-4o-mini".
Smolagents:
from smolagents import LiteLLMModel, ToolCallingAgent
from agentkernel.smolagents import SmolagentsToolBuilder
model = LiteLLMModel(model_id="openai/gpt-4o")
support_agent = ToolCallingAgent(
tools=SmolagentsToolBuilder.bind([lookup_order]),
model=model,
name="support",
description="You help customers with order lookups, returns, and general support questions.",
)Pydantic AI:
from pydantic_ai import Agent
from agentkernel.pydanticai import PydanticAIToolBuilder
support_agent = Agent(
model="openai:gpt-4o-mini", # provider-agnostic — swap for "anthropic:...", "google-gla:...", etc.
name="support", # Always pass name= explicitly!
description="Specialist for customer support and order inquiries",
instructions="You help customers with order lookups, returns, and general support questions.",
tools=PydanticAIToolBuilder.bind([lookup_order]),
)Gotcha (Pydantic AI): Always pass
name=(AK registers by name eagerly; Pydantic AI otherwise infers it lazily at first run) anddescription=(Pydantic AI's description is optional but is what AK reports as the agent description / A2A summary). The provider key for the model string (e.g.OPENAI_API_KEY) must be set at import time — Pydantic AI resolves the provider at construction.
Add the new agent to the existing Module constructor call. Do not create a second Module.
# Before:
OpenAIModule([triage_agent, math_agent, general_agent])
# After:
OpenAIModule([triage_agent, math_agent, general_agent, support_agent])This applies to all frameworks — LangGraphModule, CrewAIModule, GoogleADKModule, SmolagentsModule, PydanticAIModule work the same way.
To make an agent return a typed dict instead of plain text, define a Pydantic model and configure it on the agent (or, for CrewAI, on the module). The runner returns an AgentReplyAny whose content is the result as a dict; str(reply) is the JSON serialization, so text-based consumers (CLI, chat integrations) work unchanged. Applies to non-streaming execution only.
from pydantic import BaseModel
class OrderStatus(BaseModel):
order_id: str
status: str| Framework | How to configure |
|---|---|
| OpenAI Agents SDK | Agent(..., output_type=OrderStatus) |
| LangGraph | create_react_agent(..., response_format=OrderStatus) |
| CrewAI | CrewAIModule([agent], output_pydantic={"support": OrderStatus}) — or output_json={...}; keyed by agent role |
| Google ADK | LlmAgent(..., output_schema=OrderStatus) |
| Smolagents | No schema parameter — have the agent pass a dict or Pydantic instance to final_answer |
Gotcha (CrewAI): CrewAI puts the output schema on the
Task, not theAgent— and Agent Kernel builds the task internally per run, so the schema is passed to theCrewAIModuleconstructor keyed by agent role.
Wire the new agent into the existing routing so the triage/supervisor agent can delegate to it.
OpenAI Agents SDK:
Add the new agent to the triage agent's handoffs list:
triage_agent = Agent(
name="triage",
instructions="You route requests to the right specialist agent...",
handoffs=[math_agent, general_agent, support_agent], # Add here
)Update the triage instructions to mention the new agent:
instructions = """You route user requests to the right specialist:
- math agent: for calculations and math problems
- general agent: for general knowledge questions
- support agent: for customer support and order inquiries ← ADD THIS
"""LangGraph:
Add the new agent to the supervisor's agents list:
from langgraph_supervisor import create_supervisor
triage_agent = create_supervisor(
model=model,
agents=[math_agent, general_agent, support_agent], # Add here
prompt="Route requests to the right specialist...",
).compile(name="triage")CrewAI:
No explicit routing — CrewAI automatically makes all agents in the Module available. Just add the new agent to the Module list (Step 4b). The Crew will include it.
Google ADK:
Add the new agent to the triage agent's sub_agents:
from google.adk.agents import LlmAgent
triage_agent = LlmAgent(
name="triage",
model=LiteLlm(model="openai/gpt-4o-mini"),
description="Routes requests to specialists",
instruction="""Route requests to the right specialist.
Use transfer_to_agent to delegate:
- math: for calculations
- general: for general knowledge
- support: for customer support and order inquiries ← ADD THIS
""",
sub_agents=[math_agent, general_agent, support_agent], # Add here
)Smolagents:
Add the new agent to the triage agent's managed_agents list:
triage_agent = ToolCallingAgent(
tools=[],
model=model,
name="triage",
description="You determine which agent to use based on the user's question.",
managed_agents=[math_agent, general_agent, support_agent], # Add here
)Attach pre/post processing to the new agent. See the ak-add-capabilities skill for full hook patterns.
# Pre-hook: runs before the agent processes the request
module.pre_hook(support_agent, [RAGPreHook()])
# Post-hook: runs after the agent generates a response
module.post_hook(support_agent, [DisclaimerPostHook()])Where module is the framework Module instance (e.g., OpenAIModule). To use hooks, assign the Module to a variable:
module = OpenAIModule([triage_agent, math_agent, general_agent, support_agent])
module.pre_hook(support_agent, [RAGPreHook()])Framework-native run options (optional): to pass the framework's own run arguments for one agent
(OpenAI max_turns, hooks=RunHooks() and run_config=RunConfig(...); LangGraph config; ADK
plugins and run_config; Pydantic AI usage_limits; CrewAI step_callback; smolagents
max_steps), declare them with run_options on the same module, in the framework's own types:
from agents import RunConfig
module.run_options(support_agent, max_turns=25, hooks=ProgressHooks(), run_config=RunConfig(...))Keys the adapter populates itself (session, context, input, ...) raise ValueError at
declaration. See the ak-add-capabilities skill for the per-framework destinations.
To compute options per run, give run_options a callable before the keywords; it is called with
(agent, session, requests) on every run and its mapping is merged over the static keywords:
def options_for(agent, session, requests):
return {"max_turns": 10} if session.id.startswith("guest") else {}
module.run_options(support_agent, options_for, max_turns=25, hooks=ProgressHooks())If the new tool or agent requires additional packages, update pyproject.toml:
dependencies = [
"agentkernel[openai,api,redis]>=0.9.5",
"httpx>=0.27.0", # Add any new deps for your tool
]Then run:
uv syncSyntax check — Run: uv run python -c "import app" (or whatever the entry file is)
Test the new agent — Add a test for the new agent (see ak-test skill for test setup):
@pytest.mark.order(10)
async def test_support_routing(test_client):
await test_client.send("What's the status of order 12345?")
await test_client.expect(["order", "12345", "shipped"])uv run pytest -vpython app.py &
curl -X POST http://localhost:8000/run \
-H "Content-Type: application/json" \
-d '{"prompt": "Check order 12345", "session_id": "test-1", "agent": "triage"}'| Gotcha | Details |
|---|---|
| ToolContext access | Always use ToolContext.get() inside the tool function body. Never pass context as a function parameter. |
LangGraph name= | Always pass name= to create_react_agent(). Without it, the supervisor cannot route to the agent. |
CrewAI role= | Use role= as the agent identifier, not name=. Agent Kernel reads agent.role as the agent name. |
CrewAI verbose= | Set verbose=False on agents to prevent noisy console output. |
| CrewAI conversation history | CrewAI runner keeps its own per-session transcript (last 20 lines) prepended to each task description, independent of the Memory feature. If Memory.remember() fails (e.g. no embedder configured), the runner logs a warning and continues instead of failing the run. |
| CrewAI structured output | Configured on the module, not the agent: CrewAIModule([agent], output_pydantic={"<role>": Model}). The native crewai.Agent rejects an output_pydantic attribute (it belongs to the Task, which Agent Kernel builds per run). |
Google ADK LiteLlm | Wrap the model string: LiteLlm(model="openai/gpt-4o-mini"). A bare string won't work. |
| Env var nesting | Use __ (double underscore) as the nested delimiter: AK_REDIS__URL, AK_WHATSAPP__ACCESS_TOKEN. |
| Single Module | Only one Module instance per framework. Add new agents to the existing Module's agent list. |
Single bind() | Add new tools to the existing ToolBuilder.bind() call for that agent. Don't create a second one. |
Now that you've added new tools and agents to your project, here are natural next steps:
ak-build skill again (it's meant to be used repeatedly)ak-add-capabilities skill to add input/output guardrails (OpenAI, Bedrock, Walled AI), observability tracing (Langfuse, OpenLLMetry, Logfire, CloudWatch), session persistence (Redis, DynamoDB, Cosmos DB), MCP server, A2A protocol, custom hooks, or multimodal supportak-add-integration skill to add Slack, WhatsApp, Messenger, Instagram, Telegram, or Gmailak-cloud-deploy skill to deploy to AWS Lambda, AWS ECS/Fargate, Azure Functions, or Azure Container Apps with Terraformak-test skill to configure test modes (score, llm, fallback), write agent tests, and debug common issues© yaalalabs, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file in ak-py/src/agentkernel/skills/ak-build of yaalalabs/agent-kernel.
Open the folder on GitHubat commit 97fa8d9
Ak Build next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Ak Build this skillyaalalabs/agent-kernel | 192 | — | ~4.5k | Automated safety check: Pass | Apache-2.0 | |
| Trigger.dev Agent Patternspapermark/papermark | 9.2k | — | ~2k | Automated safety check: Pass | Custom licence | |
| Agent Squad Python Guide2FastLabs/agent-squad | 7.8k | — | ~4.7k | Automated safety check: Pass | Apache-2.0 | |
| AgentSquad for Swift2FastLabs/agent-squad | 7.8k | — | ~3.5k | Automated safety check: Pass | Apache-2.0 | |
| Agent Squad for TypeScript2FastLabs/agent-squad | 7.8k | — | ~4.3k | Automated safety check: Pass | Apache-2.0 | |
| Openai Agentscoco-research/coco | 531 | — | ~3.3k | Automated safety check: Pass | MIT |
papermark/papermark
Patterns for building LLM agents on Trigger.dev tasks: prompt chaining, routing, parallel workers, orchestrator-workers, evaluator loops and human approval gates.
2FastLabs/agent-squad
Map of the agent-squad Python framework for async multi-agent orchestration: which agent, classifier, storage and tool provider to pick, and the pitfalls to avoid.
2FastLabs/agent-squad
Guides building on-device multi-agent apps in Swift with the AgentSquad framework: which agent, orchestrator, classifier, storage or voice type fits each situation.
2FastLabs/agent-squad
Guide to building Node.js and TypeScript apps on the agent-squad package: orchestrator, agent types, classifier routing, storage, retrievers and MCP tools.
coco-research/coco
Build AI applications with OpenAI Agents SDK - text agents, voice agents, multi-agent handoffs, tools with Zod schemas, guardrails, and streaming.
jeremylongshore/tons-of-skills-marketplace
Rate-limit LangChain 1.0 calls correctly across multi-worker deployments — Redis-backed limiters, asyncio.Semaphore, narrow exception whitelists, and provider-specific throttle handling.
yaalalabs/agent-kernel
Code quality standards, formatting, Python style rules (classes over script-style functions, configuration-field rules), commit conventions, and PR workflow for Agent Kernel development.
yaalalabs/agent-kernel
Step-by-step guide for adding a new built-in test evaluator provider to Agent Kernel (beyond DeepEval, Opik and JEV).
yaalalabs/agent-kernel
Step-by-step guide for adding a new guardrail provider to Agent Kernel.
yaalalabs/agent-kernel
Step-by-step guide for adding a new knowledge base backend to Agent Kernel.
yaalalabs/agent-kernel
Step-by-step guide for adding a new messaging platform integration to Agent Kernel.
yaalalabs/agent-kernel
Step-by-step guide for adding a new multimodal attachment storage backend to Agent Kernel.
Categories
Add tools, agents, and handoffs to an existing Agent Kernel project. Ak Build is an agent skill from yaalalabs/agent-kernel. Add tools, agents, and handoffs to an existing Agent Kernel project.
Ak Build fits situations like: tasks that involve Multi-agent orchestration; tasks that involve Building AI agents.
Run `npx skills add yaalalabs/agent-kernel --skill ak-build -a claude-code`. Or copy the skill folder (ak-py/src/agentkernel/skills/ak-build in yaalalabs/agent-kernel) into .claude/skills/ak-build in your project. Claude Code loads it when a task matches its description.
Run `npx skills add yaalalabs/agent-kernel --skill ak-build -a codex`. Or copy the skill folder (ak-py/src/agentkernel/skills/ak-build in yaalalabs/agent-kernel) into .agents/skills/ak-build in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add yaalalabs/agent-kernel --skill ak-build -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/ak-build, .gemini/skills/ak-build, .github/skills/ak-build and .opencode/skills/ak-build in your project.
Going by SKILL.md and its folder, Ak Build needs the command-line tools its instructions call (uv, python and curl) and credentials named OPENAI_API_KEY and AK_WHATSAPP__ACCESS_TOKEN. Our summary lists: Python 3; A credential in OPENAI_API_KEY.
SKILL.md contains no URLs. Its commands use uv and curl, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Ak Build is published under the Apache-2.0 licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.5k tokens (SKILL.md is roughly 18k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Ak Build: Trigger.dev Agent Patterns (papermark/papermark, 9.2k stars), Agent Squad Python Guide (2FastLabs/agent-squad, 7.8k stars), AgentSquad for Swift (2FastLabs/agent-squad, 7.8k stars) and Agent Squad for TypeScript (2FastLabs/agent-squad, 7.8k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
yaalalabs (a GitHub organization) maintains it in yaalalabs/agent-kernel, which has 192 GitHub stars. The repository holds 23 skills in this directory. The repository was last updated on October 9, 2026.
Source: yaalalabs/agent-kernel on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.