deepagents
Description
🧠🤖 Deep Agents
Looking for the JS/TS version? Check out Deep Agents.js.
To help you ship LangChain apps to production faster, check out LangSmith. LangSmith is a unified developer platform for building, testing, and monitoring LLM applications.
Quick Install
uv add deepagents
🤔 What is this?
Deep Agents is an open source agent harness — an opinionated agent that runs out of the box. Extend, override, or replace any piece.
Principles:
- Opinionated — defaults tuned for long-horizon, multi-step work
- Extensible — override or replace any piece without forking
- Model-agnostic — works with any LLM that supports tool calling: frontier, open-weight, or local
- Production-ready — built on LangGraph (streaming, persistence, checkpointing) with first-class tracing, evaluation, and deployment via LangSmith
Features include:
- Sub-agents — delegate tasks to agents with isolated context windows
- Filesystem — read, write, edit, or search over pluggable local, sandboxed, or remote backends
- Context management — summarize long threads and offload tool outputs to disk
- Shell access — run commands in your sandbox of choice
- Persistent memory — pluggable state and store backends for cross-session recall
- Human-in-the-loop — approve, edit, or reject tool calls before they run
- Skills — reusable behaviors the agent can load on demand
- Tools — bring your own functions or any MCP server
from deepagents import create_deep_agent
agent = create_deep_agent(
model="openai:gpt-6-astra",
system_prompt="You are a research assistant.",
)
result = agent.invoke({"messages": "Research LangGraph and write a summary"})
The agent can plan, read/write files, and manage its own context. Add your own tools, swap models, customize prompts, configure sub-agents, and more. For a full overview and quickstart of Deep Agents, the best resource is our docs.
Acknowledgements: This project was primarily inspired by Claude Code, and initially was largely an attempt to see what made Claude Code general purpose, and make it even more so.
❓ FAQ
How is this different from LangGraph or LangChain?
LangGraph is the graph runtime. LangChain's create_agent is a minimal agent harness on top of it. Deep Agents is a more opinionated harness on top of create_agent — same building blocks, but with filesystem, sub-agents, context management, and skills bundled in. For how the three relate, see the LangChain ecosystem overview.
Does this work with open-weight or local models?
Yes. Any model that supports tool calling works — frontier APIs (OpenAI, Anthropic, Google), open-weight models hosted on providers like Baseten or Fireworks, and self-hosted models via Ollama, vLLM, or llama.cpp. Use any LangChain chat model.
Can I use this in production?
Yes! Deep Agents is built on LangGraph, designed for production agent deployments. Pair it with LangSmith for tracing, evaluation, and monitoring. See Going to production for the full guide.
When should I use Deep Agents vs. LangChain or LangGraph directly?
All three are layers in the same stack — see the LangChain ecosystem overview for how they relate. Use Deep Agents when you want the full harness — planning, context management, delegation — out of the box. Use LangChain's create_agent when you want a lighter harness without the bundled middleware. Drop to LangGraph when the agent loop itself isn't the right shape and you need a custom graph.
The layers compose: any LangGraph CompiledStateGraph can be passed in as a sub-agent to a Deep Agent, so custom orchestration plugs in alongside the harness's defaults.
📖 Resources
- Documentation — Full documentation
- LangChain ecosystem overview — how Deep Agents, LangChain, LangGraph, and LangSmith fit together
- API Reference — Full SDK reference documentation
- Examples — Working agents and patterns
- Discussions — Community forum for technical questions, ideas, and feedback
- LangChain Academy — Comprehensive, free courses on LangChain libraries and products, made by the LangChain team.
- Code of Conduct — community guidelines and standards
📕 Releases & Versioning
See our Releases and Versioning policies.
🔒 Security
Deep Agents follows a "trust the LLM" model. The agent can do anything its tools allow. Enforce boundaries at the tool/sandbox level, not by expecting the model to self-police. See the security policy for more information.
💁 Contributing
As an open-source project in a rapidly developing field, we are extremely open to contributions, whether it be in the form of a new feature, improved infrastructure, or better documentation.
For local setup and package-specific checks, see the Development Guide. For contribution policy, see the Contributing Guide.
Classes
DeepAgentState
AgentState with DeltaChannel on messages to reduce checkpoint growth from O(N²) to O(N).
ProviderProfile
Declarative configuration for constructing a chat model.
deepagents.profiles exposes beta APIs that may receive minor changes in
future releases. Refer to the [versioning document
GeneralPurposeSubagentProfile
Edits applied to the auto-added general-purpose subagent.
deepagents.profiles exposes beta APIs that may receive minor changes in
future releases. Refer to the [versioning docum
HarnessProfileConfig
Declarative harness-profile config for YAML/JSON-backed profiles.
deepagents.profiles exposes beta APIs that may receive minor changes in
future releases. Refer to the [versioning
HarnessProfile
Runtime configuration for deep agent behavior.
deepagents.profiles exposes beta APIs that may receive minor changes in
future releases. Refer to the [versioning documentation](htt
NemotronToolCallShim
Repair small Nemotron filesystem tool-call and tool-result quirks.
ReadFileContinuationNoticeMiddleware
Append a continuation notice to exactly-at-limit read_file results.
ModelRateLimitRetryMiddleware
Retry transient provider 429s around model calls.
ChatNVIDIAMessageCompatibilityMiddleware
Mirror standard LangChain tool-call fields into ChatNVIDIA payload metadata.
NemotronReasoningTagCleanupMiddleware
Remove preserved <think> blocks from normal assistant content.
NemotronTextToolCallParser
Repair tool calls emitted as text content instead of structured calls.
NemotronProgressBudgetMiddleware
Stop Ultra3-specific tool loops before they consume runaway context.
NemotronPolicyNudgeState
State schema for one-shot Nemotron policy nudges.
NemotronPolicyNudgeMiddleware
Inject lightweight policy nudges for common Ultra3 agent-control misses.
FollowupDisciplineState
State schema for FollowupDisciplineMiddleware.
FollowupDisciplineMiddleware
Send Ultra3 back once when it asks redundant follow-up questions.
EntityResolutionGuardState
State schema for EntityResolutionGuardMiddleware.
EntityResolutionGuardMiddleware
Send Ultra3 back once when it finalizes with unresolved or mis-bound IDs.
FinalAnswerGuardState
State schema for FinalAnswerGuardMiddleware.
FinalAnswerGuardMiddleware
Send Ultra3 back once when a final answer drops obvious required details.
SubAgent
Specification for a declarative subagent.
By default the subagent is isolated: it receives only the delegated task
description. Setting mode="fork" makes it continue the parent's
conversation inste
CompiledSubAgent
A pre-compiled agent spec.
The runnable's state schema must include a 'messages' key.
This is required for the subagent to communicate results back to the main agent.
TaskToolSchema
Input schema for the task tool.
SubAgentMiddleware
Middleware for providing subagents to an agent via a task tool.
This middleware adds a task tool to the agent that can be used
to invoke subagents.
Subagents are useful for handling complex task
UnsupportedContentMiddleware
Replace multimodal input blocks the active model can't accept with a text notice.
Without it, a request carrying content the model can't accept (e.g. an image sent to a text-only model) fails, and si
FilesystemPermission
A single access rule for filesystem operations.
With FilesystemBackend (directly or behind a CompositeBackend route),
rules are matched against both the requested path and its symlink-resolved
ta
FilesystemState
State for the filesystem middleware.
LsSchema
Input schema for the ls tool.
ReadFileSchema
Input schema for the read_file tool.
ReadVideoFileSchema
Input schema for read_file when the optional video frame extraction is available.
Identical to ReadFileSchema; only the offset/limit descriptions differ
to document their video semantics (int
WriteFileSchema
Input schema for the write_file tool.
EditFileSchema
Input schema for the edit_file tool.
DeleteSchema
Input schema for the delete tool.
GlobSchema
Input schema for the glob tool.
GrepSchema
Input schema for the grep tool.
ExecuteSchema
Input schema for the execute tool.
FilesystemMiddleware
Middleware for providing filesystem and optional execution tools to an agent.
This middleware adds filesystem tools to the agent: ls, read_file, write_file,
edit_file, glob, and grep.
Fi
AsyncSubAgent
Specification for an async subagent running on a remote Agent Protocol server.
Async subagents connect to any Agent Protocol-compliant server via the
AsyncTask
A tracked async subagent task persisted in agent state.
AsyncSubAgentState
State extension for async subagent task tracking.
StartAsyncTaskSchema
Input schema for the start_async_task tool.
CheckAsyncTaskSchema
Input schema for the check_async_task tool.
UpdateAsyncTaskSchema
Input schema for the update_async_task tool.
CancelAsyncTaskSchema
Input schema for the cancel_async_task tool.
ListAsyncTasksSchema
Input schema for the list_async_tasks tool.
TaskEvent
How an async subagent's task ended or paused, as reported to the agent that started it.
A notification message carries it in additional_kwargs["deepagents_notification"],
so apps can tell these mes
AsyncSubAgentMiddleware
Middleware for async subagents running on remote Agent Protocol servers.
This middleware adds tools for launching, monitoring, and updating background tasks on remote Agent Protocol servers. Unlike t
SkillMetadata
Metadata for a skill per Agent Skills specification (https://agentskills.io/specification).
SkillsState
State for the skills middleware.
SkillsStateUpdate
State update for the skills middleware.
SkillsMiddleware
Middleware for loading and exposing agent skills to the system prompt.
Loads skills from backend sources and injects them into the system prompt using progressive disclosure (metadata first, full con
CompactConversationSchema
Input schema for the compact_conversation tool.
SummarizationEvent
Represents a summarization event.
TriggerClause
Dictionary-based summarization trigger with AND semantics.
TruncateArgsSettings
Settings for truncating large tool-call arguments in older messages.
This is a lightweight, pre-summarization optimization that fires at a lower token threshold than full conversation compaction. Whe
SummarizationState
State for the summarization middleware.
Extends AgentState with a private field for tracking summarization events.
SummarizationDefaults
Default settings computed from model profile.
SummarizationToolMiddleware
Middleware that provides a compact_conversation tool for manual compaction.
This middleware composes with a SummarizationMiddleware instance, reusing
its summarization engine (model, backend, tri
MemoryState
State schema for MemoryMiddleware.
MemoryStateUpdate
State update for MemoryMiddleware.
MemoryMiddleware
Middleware for loading agent memory from AGENTS.md files.
Loads memory content from configured sources and injects into the system prompt. Supports multiple sources that are combined together. See
ContentPreview
A rendered preview plus a record of what was left out to build it.
The flags are reported by the code that built text, never inferred from
the rendered bytes — a literal `... [N lines truncated] ..
CriterionPass
Per-criterion grader verdict when the criterion passes.
CriterionFail
Per-criterion grader verdict when the criterion fails.
RubricEvaluation
One grader evaluation, appended to _rubric_evaluations each iteration.
Consumers can read any field without guarding against absence since all
fields are always populated by _build_evaluation and
RubricState
State schema for RubricMiddleware.
Only rubric is part of the public I/O schema -- callers write a
rubric and read the improved agent response back from messages.
Everything else is bookkeepin
GraderResponse
Structured output the grader sub-agent must emit.
Passed as response_format=GraderResponse to create_agent so the
underlying provider's structured output strategy is auto-selected.
RubricMiddleware
Middleware that drives self-evaluated iteration against a rubric.
The middleware activates only when a caller passes a rubric on
invocation state. With no rubric, both before_agent and `after_age
PatchToolCallsMiddleware
Middleware to patch dangling tool calls in the messages history.
VideoExtractionError
Raised when PyAV cannot produce frames for the requested window.
LangSmithSandbox
LangSmith sandbox implementation conforming to SandboxBackendProtocol.
LocalShellBackend
Filesystem backend with unrestricted local shell command execution.
This backend extends FilesystemBackend to add shell command execution
capabilities. Commands are executed directly on the host sy
InvalidGlobPatternError
A glob pattern the shared matcher refuses to compile.
Subclasses ValueError so existing except ValueError handlers keep
working. Callers that catch this specific type can label the failure a
*pat
FilesystemBackend
Backend that reads and writes files directly from the filesystem.
Files are accessed using their actual filesystem paths. Relative paths are resolved relative to the current working directory. Conten
ContextHubBackend
Backend that stores files in a LangSmith Hub agent repo (persistent).
StateBackend
Backend that stores files in agent state (ephemeral).
Uses LangGraph's state management and checkpointing. Files persist within a conversation thread but not across threads. State is automatically ch
FileDownloadResponse
Result of a single file download operation.
The response is designed to allow partial success in batch operations.
The errors are standardized using FileOperationError literals for certain
recover
FileUploadResponse
Result of a single file upload operation.
The response is designed to allow partial success in batch operations.
The errors are standardized using FileOperationError literals for certain
recoverab
FileInfo
Structured file listing info.
Minimal contract used across backends. Only path is required.
Other fields are best-effort and may be absent depending on backend.
ContextLine
A non-matching line surrounding a grep match, used for context_lines.
GrepMatch
A single match from a grep search.
FileData
Data structure for storing file contents with metadata.
ReadResult
Result from backend read operations.
WriteResult
Result from backend write operations.
EditResult
Result from backend edit operations.
DeleteResult
Result from backend delete operations.
LsResult
Result from backend ls operations.
GrepResult
Result from backend grep operations.
GlobResult
Result from backend glob operations.
BackendProtocol
Protocol for pluggable memory backends (single, unified).
Backends can store files in different locations (state, filesystem, database, etc.) and provide a uniform interface for file operations.
Fil
ExecuteResponse
Result of code execution.
Simplified schema optimized for LLM consumption.
ExecuteArtifact
Machine-readable metadata attached to an execute tool result.
Carried on ToolMessage.artifact alongside the model-facing content, so
callers can react to shell failures. artifact is None in
ExecuteOffloadResult
Result of BaseSandbox.execute_with_offload.
offloaded describes the capture mechanism and is kept off ExecuteResponse
(which an o
SandboxBackendProtocol
Extension of BackendProtocol that adds shell command execution.
Designed for backends running in isolated environments (containers, VMs, remote hosts).
Adds execute()/aexecute() for shell comm
BaseSandbox
Base sandbox implementation with execute() as the core abstract method.
This class provides default implementations for all protocol methods. File listing, grep, and glob use shell commands via `ex
CompositeBackend
Routes file operations to different backends by path prefix.
Matches paths against route prefixes (longest first) and delegates to the corresponding backend. Unmatched paths use the default backend.
StoreBackend
Backend that stores files in LangGraph's BaseStore (persistent).
Uses LangGraph's Store for persistent, cross-conversation storage. Files are organized via namespaces and persist across all threads.
Functions
resolve_model
Resolve a model string to a BaseChatModel.
If model is already a BaseChatModel, returns it unchanged.
String models are resolved via init_chat_model, composed with any
provider-specific init
get_model_identifier
Extract the provider-native model identifier from a chat model.
Providers do not agree on a single field name for the identifier. Some use
model_name, while others use model.
get_model_provider
Extract the provider name from a chat model instance.
Uses the model's _get_ls_params method. The base BaseChatModel
implementation derives ls_provider from the class name, and all major
provid
is_bedrock_model
Check whether a model targets AWS Bedrock.
model_matches_spec
Check whether a model instance already matches a string model spec.
Bare specs match by model identifier. Provider-prefixed specs match by both model identifier and provider when the current model ex
create_deep_agent
Create a deep agent.
By default, this agent has access to the following tools:
ls,read_file,write_file,edit_file,glob,grep: file operationsexecute: run shell commands- `task
validate_profile_key
Validate a provider or provider:model profile registry key.
The first colon separates the provider from the complete model identifier. Providers must not contain colons, while model identifiers m
check_openrouter_version
Raise if the installed langchain-openrouter is below the minimum.
If the package is not installed at all the check is skipped;
init_chat_model will surface its own missing-dependency error downst
register
Register the built-in OpenRouter provider profile.
register
Register the built-in NVIDIA provider profile.
register_provider_profile
Register a ProviderProfile for a provider or specific model.
deepagents.profiles exposes beta APIs that may receive minor changes in
future releases. Refer to the [versioning do
get_provider_profile
Look up the ProviderProfile for a model spec.
deepagents.profiles exposes beta APIs that may receive minor changes in
future releases. Refer to the [versioning documentation](ht
apply_provider_profile
Compose init_chat_model kwargs from the registered profile for spec.
deepagents.profiles exposes beta APIs that may receive minor changes in
future releases. Refer to the [ver
register
Register the built-in OpenAI provider profile.
register
Register the built-in Claude Sonnet 4.6 harness profile.
register_harness_profile
Register a harness profile for a provider or specific model.
deepagents.profiles exposes beta APIs that may receive minor changes in
future releases. Refer to the [versioning docu
register
Register the built-in Nemotron 3 Ultra harness profile.
register
Register the built-in Codex harness profile for each Codex spec.
register
Register the built-in Claude Haiku 4.5 harness profile.
register
Register the built-in Claude Opus 4.7 harness profile.
append_prompt_caching_middleware
Append provider-specific prompt caching middleware.
create_sub_agent
Create a runnable agent from a raw SubAgent spec.
This is the shared entrypoint for the create_agent path used by
raw subagent specs. Pre-compiled CompiledSubAgent runnables are already
created
private_state_field_names
Return fields annotated with PrivateStateAttr across state schemas.
Annotations are resolved at runtime, so a schema whose PrivateStateAttr
annotation references a TYPE_CHECKING-only name canno
supports_execution
Check if a backend supports command execution.
For CompositeBackend,
checks if the default backend supports execution.
For other backends, checks i
disclosed_skill_tool_names
Return the names of the skill tools disclosed to the latest model call.
Use it in middleware that gates tool calls itself, so the gate admits the skill tools the model has been shown. The agent's own
compute_summarization_defaults
Compute default summarization settings based on model profile.
create_summarization_middleware
Create a Deep Agents SummarizationMiddleware with model-aware defaults.
Why this exists in deepagents
The Deep Agents SummarizationMiddleware wraps
`langchain.agents.middleware.Summarizatio
create_summarization_tool_middleware
Create a SummarizationToolMiddleware with model-aware defaults.
Convenience factory: builds a SummarizationMiddleware via
[create_summarization_middleware][deepagents.middleware.summarization.c
append_to_system_message
Append text to a system message.
video_dependencies_available
Return whether the optional video dependencies appear to be installed.
Uses importlib.util.find_spec, which checks that av and Pillow are
discoverable rather than performing a full import. A di
extract_video_frames
Decode sampled frames from a video byte payload.
warn_deprecated
Emit a deprecation warning with caller-controlled stack attribution.
langchain_core.warn_deprecated formats a standard message but hardcodes
stacklevel=4 in its internal warnings.warn call. Tha
reset_deprecation_dedupe
Reset the @deprecated decorator's dedupe flag for testing.
The langchain_core @deprecated decorator emits each warning at most once
per process via a closure-bound warned flag. Tests that asser
compile_grep_include_glob
Compile a grep include-glob into a matcher with ripgrep-like semantics.
Provides one shared include-glob behavior for every backend so the same
grep(..., glob=...) call closely mirrors ripgrep for
sanitize_tool_call_id
Return a bounded, path-safe component for a tool call ID.
format_content_with_line_numbers
Format file content with line numbers.
Chunks lines longer than MAX_LINE_LENGTH with continuation markers
(e.g., 5.1, 5.2). Line markers are separated from source content
with two spaces so sou
check_empty_content
Check if content is empty and return warning message.
file_data_to_string
Convert current or legacy persisted file content to a string.
create_file_data
Create a FileData object with timestamps.
update_file_data
Update FileData with new content, preserving creation timestamp.
normalize_read_bounds
Floor a requested read window at a zero offset and zero lines.
Models occasionally emit degenerate read_file arguments (offset=-1,
limit=0). Clamping offset keeps backends from reporting a li
slice_read_response
Slice file data to the requested line range without formatting.
The returned ReadResult carries the raw (unformatted) window in
file_data; line-number formatting is applied downstream by the
midd
perform_string_replacement
Perform string replacement with occurrence validation.
truncate_if_too_long
Truncate list or string result if it exceeds token limit (rough estimate: 4 chars/token).
to_posix_path
Normalize backslash separators to forward slashes for PurePosixPath use.
Backends running on Windows return OS-native paths using backslashes.
PurePosixPath treats backslashes as literal filename
validate_path
Validate and normalize file path for security.
Ensures paths are safe to use by preventing directory traversal attacks and enforcing consistent formatting. All paths are normalized to use forward sla
grep_matches_from_files
Return structured grep matches from an in-memory files mapping.
Performs literal text search (not regex).
Returns a GrepResult with matches on success. When max_count is set, at
most that many m
build_grep_results_dict
Group structured matches into the legacy dict form used by formatters.
format_grep_matches
Format structured grep matches using existing formatting logic.
regex_literal_hint
Return a hint when a pattern looks like an (unsupported) regex.
grep matches literal text, so regex metacharacters are searched verbatim
and silently miss. Callers gate this on a no-match result; t
execute_accepts_timeout
Check whether a backend class's execute accepts a timeout kwarg.
Older backend packages didn't lower-bound their SDK dependency, so they
may not accept the timeout keyword added to
[`SandboxBac
get_default_model
deprecatedGet the default model for Deep Agents.
Deprecated since 0.5.3; will be removed in deepagents==1.0.0.
Construct your model explicitly (e.g.,
`ChatAnthropic(model_name="
Modules
deepagents
Deep Agents package.
graph
Primary graph assembly module for Deep Agents.
Provides create_deep_agent, the main entry
point for constructing a fully configured deep agent with planning, f
profiles
Public beta APIs for model and harness profiles.
deepagents.profiles exposes beta APIs that may receive minor changes in
future releases. Refer to the [versioning documentation](h
provider
Provider profile package: ProviderProfile API and built-in providers.
provider_profiles
Beta APIs for configuring model-construction behavior.
deepagents.profiles exposes beta APIs that may receive minor changes in
future releases. Refer to the [versioning documentat
harness
Harness profile package: HarnessProfile API and built-in registrations.
Individual built-in modules expose a zero-arg register() callable; the lazy
_builtin_profiles bootstrap invokes them once
harness_profiles
Beta APIs for configuring deep agent runtime behavior.
deepagents.profiles exposes beta APIs that may receive minor changes in
future releases. Refer to the [versioning documentat
middleware
Middleware for the Deep Agents agent.
Overview
The LLM receives tools through two paths:
- SDK middleware (this package) -- tools, system-prompt injection, and request interception that
subagents
Middleware for providing subagents to an agent via a task tool.
unsupported_content
Replace input content blocks the active model can't accept.
filesystem
Middleware for providing filesystem tools to an agent.
async_subagents
Middleware for async subagents running on remote Agent Protocol servers.
Async subagents use the LangGraph SDK to launch background runs on remote [Agent Protocol](https://github.com/langchain-ai/age
skills
Skills middleware for loading and exposing agent skills to the system prompt.
This module implements Anthropic's agent skills pattern with progressive disclosure, loading skills from backend storage
summarization
Summarization middleware for automatic and tool-based conversation compaction.
This module provides two middleware classes and a convenience factory:
SummarizationMiddleware— automatically comp
memory
Middleware for loading agent memory/context from AGENTS.md files.
This module implements support for the AGENTS.md specification (https://agents.md/), loading memory/context from configurable sources
rubric
Rubric middleware for self-evaluated agent iteration.
RubricMiddleware lets a caller declare what done looks like via a
rubric. Each time the agent would otherwise finish — i.e. the model
returns
patch_tool_calls
Middleware to patch dangling tool calls in the messages history.
permissions
Backward-compatible re-export for filesystem permissions.
deprecation
Adapter for langchain_core's private deprecation helpers.
Centralizes the import surface so an upstream rename or move is a one-file change.
Re-exports:
deprecated: decorator for callables, cl
backends
Memory backends for pluggable file storage.
langsmith
LangSmith sandbox backend implementation.
local_shell
LocalShellBackend: Filesystem backend with unrestricted local shell execution.
This backend extends FilesystemBackend to add shell command execution on
the local host system. It provides NO sandb
utils
Shared utility functions for memory backend implementations.
This module contains both user-facing string formatters and structured helpers used by backends and the composite router. Structured helpe
filesystem
FilesystemBackend: Read and write files directly from the filesystem.
context_hub
ContextHubBackend: Store files in a LangSmith Hub agent repo (persistent).
state
StateBackend: Store files in LangGraph agent state (ephemeral).
protocol
Protocol definition for pluggable memory backends.
This module defines the BackendProtocol that all backend implementations
must follow. Backends can store files in different locations (state, file
sandbox
Base sandbox implementation.
BaseSandbox implements
SandboxBackendProtocol.
File listing, grep,
composite
Composite backend that routes file operations by path prefix.
Routes operations to different backends based on path prefixes. Use this when you need different storage strategies for different paths (
store
StoreBackend: Adapter for LangGraph's BaseStore (persistent, cross-thread).
Types
SkillSource
A skill source: either a bare path or a (path, label) pair.
When only a path is given, the label is derived from the final path component. Supply a tuple to override the default (e.g. to distinguis
RubricResult
Status recorded on each evaluation.
Superset of GraderVerdict with two middleware-synthesized terminal
statuses the grader cannot emit itself:
max_iterations_reached: the iteration cap fired o
GlobBackendResult
Result shape accepted by composite glob merge helpers.
Composite glob supports both current GlobResult values and legacy
list[FileInfo] backend returns.
