MCPInstall

inngest-agent-evals

Use when building, migrating, or debugging Agent Evals on Inngest: scoring AI agent or workflow outcomes, deferred scorers, sessions, traces, step experiments, experiment variant attribution, Insights queries, or production eval loops for prompts, models, tools, providers, and agent behavior. Covers TypeScript SDK v4 scoring beta APIs, scoreMiddleware, step.score, inngest.score, createScorer, defer, group.experiment, experimentRef, meta.sessions, and when to use durable workflow primitives for outcome-based evaluation.

Installs
567
Last 24h
—
Trending rank
—
Security
Not audited

Install

Works with every agent the skills CLI supports.

npx skills add https://github.com/inngest/inngest-skills --skill inngest-agent-evals
  1. 01

    Install

    Run the command in your project. The CLI asks which agents to install for.

  2. 02

    Describe the task

    Ask your agent for something this skill covers. It loads inngest-agent-evals automatically when relevant.

  3. 03

    Review the result

    The agent follows the SKILL.md steps, scripts and references bundled with the skill.

SKILL.md

The instructions your agent reads when the skill is triggered.

Inngest Agent Evals

Use this skill when the user wants to evaluate AI agents or AI workflows in production, add scoring, compare prompts/models/tools, group related runs, or debug why an agent outcome was good or bad.

Agent Evals is not a separate package. It is the production evaluation workflow built from Inngest functions, durable steps, scores, deferred scorers, sessions, traces, experiments, and Insights.

Canonical References

Check the public docs first when exact API details matter:

Decision Flow

Start from the outcome, not the mechanism:

  1. Identify the product or quality signal: helpful click, ticket resolution, conversion, guardrail pass, retrieval quality, model confidence, latency, cost, human review, or LLM-as-judge result.
  2. Decide when the signal appears:
    • During the run: use direct scoring with step.score() or inngest.score().
    • After the run: use deferred scoring with createScorer() and defer(), or explicit inngest.score({ runId }).
  3. Decide how humans will inspect related work:
    • Use meta.sessions for repeated high-cardinality identifiers such as conversation_id, ticket_id, agent_run_id, or import_id.
    • Use Insights for ad hoc historical analysis, low-cardinality filters, SQL aggregates, and broad investigation.
  4. Decide whether to compare variants:
    • Use group.experiment() for prompt, model, provider, tool, workflow, or rollout comparisons.
    • Pass experimentRef to deferred or later scores when the score should be credited to the selected variant.
  5. Preserve traceability:
    • Keep model calls, tool calls, waits, database writes, and scoring work in durable steps so traces explain why the score happened.

Setup Requirements

  • Use TypeScript SDK v4 and install the latest SDK: npm install inngest@latest.
  • Scoring and deferred scoring are beta APIs; verify current imports against the docs before shipping user-facing examples.
  • step.score() requires scoreMiddleware() from inngest/experimental on the Inngest client.
  • createScorer() is imported from inngest/experimental and the scorer must be registered in the serve handler with other functions.
  • Sessions sent through the TypeScript SDK require v4.7.0 or later.
  • Step experiments require v4.8.0 or later for group.experiment() and the experiment helper from inngest.

Client shape:

import { Inngest } from "inngest";
import { scoreMiddleware } from "inngest/experimental";

export const inngest = new Inngest({
  id: "support-agent",
  middleware: [scoreMiddleware()],
});

Sessions

Add sessions when events belong to a user flow, conversation, ticket, import, or agent task that someone will inspect repeatedly.

await inngest.send({
  name: "support/ticket.created",
  data: {
    ticketId: "tk_123",
    message: "I can't sign in.",
  },
  meta: {
    sessions: {
      ticket_id: "tk_123",
    },
  },
});

Rules:

  • Use stable, non-secret, high-cardinality IDs.
  • Keep the key generic, such as conversation_id; put the actual ID in the value.
  • Pass sessions explicitly through step.invoke() and step.sendEvent() when downstream runs should join the same session.
  • Do not use sessions for labels like environment: prod; use Insights for that style of filtering.

Direct Scoring

Use direct scoring when the score is known during the function run.

Good direct scores:

  • guardrail pass/fail
  • JSON validity
  • retrieval confidence
  • tool success
  • model confidence
  • inline LLM-as-judge result
export const answerTicket = inngest.createFunction(
  {
    id: "answer-ticket",
    triggers: [{ event: "support/ticket.created" }],
  },
  async ({ event, step }) => {
    const answer = await step.run("generate-answer", () =>
      generateAnswer(event.data.ticketId)
    );

    const passed = await step.run("check-answer", () => validateAnswer(answer));

    await step.score("score-answer-quality", {
      name: "answer-quality",
      value: passed,
    });

    return { answer, passed };
  }
);

Use stable score names. Changing a score name creates a separate metric. Score values must be finite numbers or booleans.

Deferred Scoring

Use deferred scoring when the useful signal arrives after the parent workflow finishes, such as user feedback, conversion, ticket reopen, retention, or a slow LLM-as-judge run.

import { createScorer } from "inngest/experimental";
import { z } from "zod";

export const feedbackScorer = createScorer(
  inngest,
  {
    id: "support-feedback-scorer",
    schema: z.object({ ticketId: z.string() }),
  },
  async ({ event, step }) => {
    const feedback = await step.waitForEvent("wait-for-feedback", {
      event: "support/feedback.received",
      timeout: "7d",
      if: `async.data.ticketId == '${event.data.ticketId}'`,
    });

    return {
      name: "user-feedback",
      value: feedback?.data.helpful ? 1 : 0,
    };
  }
);

Trigger it from the producing function:

async ({ event, step, defer }) => {
  const answer = await step.run("generate-answer", () =>
    generateAnswer(event.data.ticketId)
  );

  defer("score-feedback", {
    function: feedbackScorer,
    data: { ticketId: event.data.ticketId },
  });

  return { answer };
}

Guardrails:

  • Register scorers with serve({ functions: [...] }).
  • defer() is fire-and-forget; do not await it.
  • The parent run is attributed automatically for deferred scorers.
  • Return a default score or null when a signal times out, based on the product semantics.

Experiments

Use group.experiment() when comparing prompts, models, providers, tools, workflow rewrites, or operational settings against real traffic.

import { experiment } from "inngest";

const { result, variant, experimentRef } = await group.experiment(
  "answer-style",
  {
    variants: {
      concise: () => step.run("answer-concise", () => answerConcise(event.data)),
      detailed: () =>
        step.run("answer-detailed", () => answerDetailed(event.data)),
    },
    select: experiment.bucket(event.data.accountId, {
      weights: { concise: 50, detailed: 50 },
    }),
  }
);

Selection strategy:

  • experiment.weighted() for run-level traffic splits.
  • experiment.bucket(stableId, { weights }) when a user, account, or tenant should usually keep the same experience.
  • experiment.custom() when assignment comes from a database, flag service, or rollout table.
  • experiment.fixed() to force one variant during testing or after choosing a winner.

Rules:

  • Each variant callback must call at least one step.* tool.
  • Keep experiment IDs and variant names stable because they appear in traces.
  • The selected variant is memoized for retries and replays.
  • Persist experimentRef and the parent run ID if a later, separate process will score the selected variant.

When deferred scoring a variant, pass the ref:

defer("score-answer-feedback", {
  function: feedbackScorer,
  data: { ticketId: event.data.ticketId },
  experiment: experimentRef,
});

When scoring from a later run explicitly:

await inngest.score.experiment({
  name: "clickthrough",
  value: 1,
  experiment: experimentRef,
  runId: originalRunId,
});

Brownfield Migration

When adding Agent Evals to an existing app:

  1. Search for existing agent/workflow outputs and where users act on them.
  2. Find durable identifiers already in the domain: conversation ID, ticket ID, account ID, import ID, run ID, or recommendation ID.
  3. Add meta.sessions at event producers before building dashboards around correlation.
  4. Add one direct score where the outcome is already known.
  5. Add a deferred scorer only after the signal event exists or can be emitted cleanly.
  6. Add group.experiment() only around one isolated decision at a time.
  7. Keep old prompt/model/tool behavior stable until scoring proves the new path.

Use inngest-brownfield-audit first when the repo has many candidate workflows. Use inngest-agents with this skill when the work is an AgentKit or durable agent workflow.

Anti-Patterns

  • Starting with a prompt experiment before naming the outcome metric.
  • Scoring with unstable names, strings, objects, NaN, or Infinity.
  • Forgetting scoreMiddleware() and then assuming step.score() is missing.
  • Running scorers in an external queue when the scorer needs durable waits.
  • Keeping experiment assignment only in memory.
  • Scoring an experiment variant from a later run without the original runId.
  • Using sessions for low-cardinality labels or sensitive personal data.
  • Leaving model/tool work outside steps, making traces unable to explain the score.

Verification

  • Typecheck the Inngest client, functions, scorer schemas, and serve handler.
  • Confirm scorers are registered with the serve endpoint.
  • Test the producer emits events with expected meta.sessions.
  • Test direct scores use stable names and finite number/boolean values.
  • Test deferred scorer timeout behavior.
  • For experiments, test that each variant callback contains step work and that later scoring receives experimentRef plus the original run ID when needed.
  • If possible, run the Inngest dev server and inspect traces, sessions, scores, and experiment variant selection in the dashboard or through available CLI/API tooling.

FAQ

What does the inngest-agent-evals skill do?

Use when building, migrating, or debugging Agent Evals on Inngest: scoring AI agent or workflow outcomes, deferred scorers, sessions, traces, step experiments, experiment variant attribution, Insights queries, or production eval loops for prompts, models, tools, providers, and agent behavior. Covers TypeScript SDK v4 scoring beta APIs, scoreMiddleware, step.score, inngest.score, createScorer, defer, group.experiment, experimentRef, meta.sessions, and when to use durable workflow primitives for outcome-based evaluation.

How do I install inngest-agent-evals?

Run npx skills add https://github.com/inngest/inngest-skills --skill inngest-agent-evals in your project. The skills CLI detects the agents you use and copies the skill into the right folder. For Claude Code you can also place the skill folder at ~/.claude/skills/inngest-agent-evals/ (personal) or .claude/skills/inngest-agent-evals/ (project).

Which AI agents can use inngest-agent-evals?

Any agent that supports the open Agent Skills format (a folder with a SKILL.md file), including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, OpenCode and more.

Is inngest-agent-evals safe to install?

No partner security audit is available yet. Skills can run commands and scripts, so read the SKILL.md and any bundled files before installing.

Who maintains inngest-agent-evals?

It is published by inngest in inngest/inngest-skills. It has 567 recorded installs.

More from inngest/inngest-skills

View all →

inngest-durable-functions

inngest/inngest-skills

Use when building functions that must survive process crashes, retry automatically on failure, run on a schedule, react to events, or maintain state across infrastructure failures — e.g., webhook handlers that drop events, flaky cron jobs, background jobs that fail mid-execution, or workflows that need to resume where they left off. Covers Inngest function configuration, triggers (events, cron, invoke), step execution and memoization, idempotency, cancellation, error handling, retries, logging, and observability.

DevOps & Cloud3.9K installs

inngest-events

inngest/inngest-skills

Use when designing event-driven workflows, decoupling services, implementing fan-out patterns (one trigger, many downstream handlers), implementing idempotent event handling with IDs (24-hour dedupe window), or handling at-least-once delivery from external sources like Stripe webhooks. Covers Inngest event schema, payload format, naming conventions, IDs for idempotency, the ts param, fan-out patterns, and system events like inngest/function.failed.

Backend & APIs3.8K installs

inngest-steps

inngest/inngest-skills

Use when implementing delays that must survive process restarts (e.g., 24-hour cart abandonment, scheduled follow-ups), waiting for human approval or external events with timeouts (review gates, webhook callbacks, async API completion), polling external services without losing state on crashes, calling other functions and awaiting their results, memoizing expensive operations so they don't re-run on retry, or running async work in parallel inside a workflow. Covers Inngest step methods: step.run, step.sleep, step.waitForEvent, step.waitForSignal, step.sendEvent, step.invoke, step.ai, plus patterns for loops and parallel execution.

Backend & APIs3.8K installs

inngest-setup

inngest/inngest-skills

Use when adding durable execution to a TypeScript project — building retry-safe webhook handlers, background jobs that survive crashes, scheduled tasks, or long-running workflows that outlive a single request. Covers Inngest SDK installation, client config, environment variables, serve endpoints (Next.js, Express, Hono, Fastify), connect-as-worker mode, and the local dev server.

Backend & APIs3.8K installs

inngest-middleware

inngest/inngest-skills

Use when adding cross-cutting concerns to durable functions — structured logging or tracing across all functions, error tracking with Sentry, payload encryption for sensitive data, dependency injection of clients (DB, Stripe, etc.) into function handlers, custom telemetry, or behavior that should apply uniformly across many functions. Covers Inngest middleware lifecycle, creating custom middleware, dependencyInjectionMiddleware, @inngest/middleware-encryption, @inngest/middleware-sentry, and custom middleware patterns.

DevOps & Cloud3.6K installs

inngest-flow-control

inngest/inngest-skills

Use when handling external API rate limits (e.g., OpenAI 429s, HubSpot or Stripe rate limits), preventing duplicate work from rapid event bursts (debouncing user actions), spreading load over time, ensuring per-tenant fairness, processing events in batches, limiting concurrent runs of the same operation, or assigning priority to important runs. Covers Inngest flow control: concurrency limits with keys, throttling, rate limiting, debounce, priority, singleton, and event batching.

Backend & APIs1.6K installs

Popular ai & agents skills

View category →

google-agents-cli-publish

google/agents-cli

This skill should be used when the user wants to "publish an agent", "publish my ADK agent", "register an agent with Gemini", "publish to Gemini" (formerly Gemini Enterprise), or needs guidance on the agents-cli publish gemini command. Also use when the user wants to "manage agents in Agent Registry", "list/update/delete registered agents", or "register an MCP server". Covers ADK vs A2A registration modes, programmatic and interactive usage, flag reference, auto-detection from deployment metadata, Agent Registry fleet management, and troubleshooting. Part of the agents-cli skills suite. Do NOT use for deployment (use google-agents-cli-deploy).

AI & Agents513.9K installs

google-agents-cli-eval

google/agents-cli

This skill should be used when the user wants to "run an evaluation", "evaluate my agent", "evaluate my ADK agent", "write an eval dataset", "analyze eval failures", "compare eval results", "optimize agent", or needs guidance on the Gemini platform eval methodology and the Quality Flywheel. Covers eval metrics, dataset schema, LLM-as-judge scoring, and common failure causes. Applies to any agents-cli project, whatever framework the agent is written in. Do NOT use for agent API code patterns (ADK: use google-agents-cli-adk-code), deployment (use google-agents-cli-deploy), or project scaffolding (use google-agents-cli-scaffold).

AI & Agents513.5K installs

skill-creator

anthropics/skills

Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, edit, or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy.

OfficialAI & Agents416.4K installs

codex-pet

prime-skills/runcomfy-agent-skills

Codex Pet generator on RunComfy. Build a Codex-compatible Codex Pet spritesheet.webp + pet.json from a single reference image, drop it into ${CODEXHOME:-$HOME/.codex}/pets/ / and Codex picks it up as a custom Codex Pet next to the 8 built-ins. This skill produces the exact Codex Pet atlas Codex expects (1536x1872 PNG/WebP, 8 cols x 9 rows, 192x208 cells, 9 animation states — idle, running-right, running-left, waving, jumping, failed, waiting, running, review). Calls OpenAI GPT Image 2 edit ONCE via the local RunComfy CLI as runcomfy run openai/gpt-image-2/edit to produce a canonical Codex Pet pose, then assembles all 9 animation rows programmatically with ImageMagick micro-transforms — no Codex Pro, no $imagegen, no OPENAIAPIKEY required, only RUNCOMFYTOKEN. Triggers on "codex pet", "create codex pet", "make codex pet", "hatch codex pet", "/hatch image", "desktop pet codex", "codex pets", "spritesheet.webp", or any explicit ask to build a custom pet for OpenAI Codex.

AI & Agents402.1K installs

full-output-enforcement

leonxlnx/taste-skill

Overrides default LLM truncation behavior. Enforces complete code generation, bans placeholder patterns, and handles token-limit splits cleanly. Apply to any task requiring exhaustive, unabridged output.

AI & Agents401K installs

executing-plans

obra/superpowers

Use when executing an implementation plan in the current session as the implementer yourself — your human partner chose inline execution, or no subagent tool is available

AI & Agents245.7K installs