Task Results
Get structured outputs from your tasks.
Marvin provides powerful ways to control and validate the output of tasks. By specifying a result_type
, you can ensure that tasks return exactly the data structure you need.
Scalar Types
The simplest way to specify a result type is with Python’s built-in scalar types:
Classification
For classification tasks, Marvin provides several ways to specify options. Under the hood, Marvin optimizes classification by having agents choose indices rather than writing out full labels:
Multi-label Classification
For tasks where multiple labels can apply, use either list[Literal]
, list[Enum]
, or Marvin’s shorthand double-list syntax:
Collections
Use Python’s type hints to specify collections. Marvin supports several collection types:
Lists
Lists are the most common collection type and work well with all LLM providers:
Sets
Sets work similarly to lists but ensure unique values:
Dictionaries
Dictionaries are useful for key-value data:
Tuples
While tuples are not directly supported by most LLM providers, Marvin will attempt to coerce the result into a tuple for you:
Structured Types
Marvin supports several options for complex data structures, each with their own benefits:
TypedDict
TypedDicts provide a way to specify dictionary types with fixed keys:
Dataclasses
Dataclasses offer a more object-oriented approach with attribute access:
Pydantic Models
Pydantic models (recommended) provide rich validation and nested structures:
Validation
Result Validators
You can provide a validation function to enforce additional constraints. The function should either return the validated result or raise an exception:
Pydantic Validation
When using Pydantic models, you can use field or model validators for more complex validation:
using field_validator
using model_validator
Annotated Types
Use Annotated
to provide additional context about the expected result:
If you want to write a function (like field_validator
) to validate a type so that the validation is baked into the type itself, you can use pydantic
’s functional validators: