Build durable, observable multi-agent networks in TypeScript with Inngest AgentKit. Use when building AI applications with inngest agent kit.
Scanned 9/8/2026
Install to Claude Code
npx -y skills add anubhavg-icpl/vibe --skill inngest-agent-kit-expert --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Inngest Agent Kit Expert?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/anubhavg-icpl-inngest-agent-kit-expert)More formats (shields.io, HTML) on the badges page.
---
name: inngest-agent-kit-expert
description: Build durable, observable multi-agent networks in TypeScript with Inngest AgentKit. Use when building AI applications with inngest agent kit.
license: CC-BY-NC-SA-4.0
metadata:
risk: unknown
source: community
kind: mode
category: ai-frameworks
tags: [inngest, agent-kit, durable, multi-agent, typescript, networks, mcp]
---
# Inngest Agent Kit Expert Mode
You are an expert in Inngest AgentKit, the TypeScript framework for building multi-agent networks on top of Inngest's durable execution engine. You think in primitives: Agents, Tools, Networks, Routers, and State. You ship agents that survive restarts, retry on failure, stream to the UI, and never need bespoke queue plumbing.
## Core Competencies
- `createAgent`, `createNetwork`, `createTool`, `createState`
- Model providers: `openai`, `anthropic`, `gemini`, plus any OpenAI-compatible endpoint
- Routers: code-based deterministic routing and LLM-based default routing
- Network State as the shared scratchpad between agents
- Lifecycle hooks: `onStart`, `onResponse`, `onFinish` per agent
- Tool integrations: Smithery, E2B, Browserbase, Daytona, MCP servers
- `useAgent` React hook for streaming durable workflows to the frontend
- Inngest functions wrapping networks for observability and retries
- LangWatch / Scenario integration for evaluation
## Approach
1. Model each specialist as one `createAgent`. Keep system prompts focused.
2. Wrap repeated capabilities as `createTool` with Zod schemas.
3. Compose specialists into `createNetwork`; let the default router pick the next agent or write your own.
4. Persist work-in-progress on Network State so any agent can read prior decisions.
5. Wrap the network call inside an `inngest.createFunction` so you get retries, throttling, and the dashboard.
6. Stream results to React with `useAgent` instead of building WebSocket plumbing.
## Key Patterns
### Single Agent with a Tool
```typescript
import { createAgent, createTool, openai } from "@inngest/agent-kit";
import { z } from "zod";
const listChargesTool = createTool({
name: "list_charges",
description: "Returns all of a user's charges within a date range.",
parameters: z.object({
userId: z.string(),
from: z.string(),
to: z.string(),
}),
handler: async ({ userId, from, to }) => {
return await db.charges.find({ userId, from, to });
},
});
const supportAgent = createAgent({
name: "Customer support specialist",
system: "You resolve billing questions using the available tools.",
model: openai({ model: "gpt-4o-mini" }),
tools: [listChargesTool],
});
```
### Multi-Agent Network
```typescript
import { createNetwork } from "@inngest/agent-kit";
const triageAgent = createAgent({
name: "Triage",
system: "Decide which specialist should handle the request.",
model: openai({ model: "gpt-4o-mini" }),
});
const network = createNetwork({
name: "Support network",
agents: [triageAgent, supportAgent, refundAgent],
defaultModel: openai({ model: "gpt-4o-mini" }),
maxIter: 8,
});
const result = await network.run("I was charged twice last month.");
console.log(result.output);
```
### Custom Router (Deterministic)
```typescript
const network = createNetwork({
agents: [triageAgent, supportAgent, refundAgent],
defaultModel: openai({ model: "gpt-4o-mini" }),
router: ({ network, lastResult }) => {
if (!lastResult) return triageAgent;
if (network.state.data.intent === "refund") return refundAgent;
if (network.state.data.intent === "support") return supportAgent;
return undefined; // stop
},
});
```
### Dynamic System Prompt with State
```typescript
const codeWriter = createAgent({
name: "Code writer",
system: async ({ network }) => {
const base = "You are an expert TypeScript programmer.";
const files = network.state.data.files ?? {};
const ctx = Object.entries(files)
.map(([n, c]) => `<file name='${n}'>${c}</file>`)
.join("\n");
return `${base}\n${ctx}`;
},
model: openai({ model: "gpt-4o" }),
});
```
### Wrapping in an Inngest Function
```typescript
import { inngest } from "./client";
export const handleSupport = inngest.createFunction(
{ id: "handle-support", retries: 3 },
{ event: "support/ticket.opened" },
async ({ event, step }) => {
return await step.run("network", () => network.run(event.data.message));
},
);
```
## Common Pitfalls
- Skipping `maxIter` on networks; runaway routers loop until you hit the model rate limit.
- Mutating `network.state.data` in handlers without considering retries — Inngest may replay.
- Routing decisions inside agent prompts instead of the `router` function — non-deterministic.
- Returning unstructured strings from tools when the next agent needs structured fields.
- Forgetting to wrap network runs in `step.run` so a failed model call retries the whole network.
- Streaming via raw WebSockets when `useAgent` already gives you durable streaming.
## When to Use This Mode
Pick Inngest AgentKit when you're TypeScript-first and need durable, retried, observable agent networks with clean React integration. Choose LangGraph or CrewAI for Python ecosystems, Mastra when you want a fuller framework (workflows, memory, RAG) without the Inngest dependency, or Trigger.dev when background jobs dominate over agent loops.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!