====== Marvin ====== **Marvin** is a Python framework by [[https://prefect.io|Prefect]] for producing [[structured_outputs|structured outputs]] from LLMs and building [[agentic_ai|agentic AI workflows]].(([[https://github.com/PrefectHQ/marvin|Marvin on GitHub]])) With 6.1K+ GitHub stars, it provides intuitive building blocks, cast, classify, extract, generate, that bridge AI unpredictability with type-safe, observable, composable software patterns. Version 3.0 introduces full agentic control flow with Tasks, Agents, and Threads. ===== Overview ===== Marvins philosophy treats AI capabilities as **engineering building blocks** rather than black-box magic. Each function enforces type safety via Pydantic, maintains observability, and composes naturally into larger workflows.(([[https://askmarvin.ai/|Marvin Documentation]])) The framework prioritizes making LLM interactions reliable and predictable while keeping the API minimal. Core design principles: * **Type-safe results**, All outputs validated through Pydantic models * **Task-centric**, Discrete, observable units of work with clear objectives * **Composable**, Chain tasks into threads for complex multi-step workflows * **Flexible control**, Tune autonomy vs. determinism per task * **Multi-agent**, Assign specialized agents to specific tasks ===== Installation ===== pip install marvin # or with uv uv add marvin Configure your LLM provider: export OPENAI_API_KEY="your-api-key" ===== Core Functions ===== Marvin provides high-level functions for common LLM tasks:(([[https://pypi.org/project/marvin/|Marvin on PyPI]])) import marvin from pydantic import BaseModel #, cast: Convert unstructured text to typed objects --- class Location(BaseModel): city: str state: str country: str location = marvin.cast("The Big Apple", target=Location) # Location(city=New York, state=NY, country=US) #, classify: Categorize data into labels --- sentiment = marvin.classify( "I absolutely love this product!", labels=["positive", "negative", "neutral"] ) # "positive" #, extract: Pull structured data from text --- class Contact(BaseModel): name: str email: str contacts = marvin.extract( "Reach out to Alice at alice@example.com or Bob at bob@test.io", target=Contact ) # [Contact(name=Alice, email=alice@example.com), # Contact(name=Bob, email=bob@test.io)] #, generate: Produce [[structured_outputs|structured outputs]] --- colors = marvin.generate( target=str, instructions="Generate 5 creative color names for a cyberpunk palette", n=5 ) #, fn: AI-powered function decorator --- @marvin.fn def summarize(text: str, max_words: int = 50) -> str: "Summarize the given text in the specified number of words." summary = summarize("Long article text here...", max_words=30) ===== Agentic Workflows (v3.0) ===== Marvin v3.0 introduces a full agentic control flow engine:(([[https://prefect.io/marvin|Marvin on Prefect.io]])) graph TD subgraph Thread["marvin.Thread: shared context"] A[Task 1: Research] --> B[Task 2: Write Article - agent=Writer] B --> C[Task 3: Review and Edit - agent=Editor] end import marvin from pydantic import BaseModel class Article(BaseModel): title: str content: str key_points: liststr # Define specialized agents writer = marvin.Agent( name="Writer", instructions="Write clear, engaging content for a technical audience." ) editor = marvin.Agent( name="Editor", instructions="Review and improve articles for clarity and accuracy." ) # Orchestrate with a Thread (shared context) with marvin.Thread() as thread: # Task 1: Research key_points = marvin.run( "Research the top 5 trends in AI agent frameworks for 2025", result_type=liststr ) # Task 2: Write (assigned to writer agent) draft = marvin.run( "Write a technical article using the research", agent=writer, result_type=Article, context={"research": key_points} ) # Task 3: Edit (assigned to editor agent) final = marvin.run( "Review and polish the article", agent=editor, result_type=Article, context={"draft": draft} ) print(f"Title: {final.title}") print(final.content) ===== Planning and Teams ===== import marvin # AI-powered [[task_decomposition|task decomposition]] tasks = marvin.plan("Create a comprehensive blog post about AI trends") marvin.run_tasks(tasks) # Team coordination from marvin import Team, Swarm # Structured team with delegation rules research_team = Team( agents=[researcher, analyst], instructions="Collaborate on research tasks" ) # Swarm: free-form delegation among agents creative_swarm = Swarm(agents=[writer, designer, editor]) ===== Integration with Prefect ===== Marvin integrates naturally with Prefect for production orchestration: from prefect import flow import marvin @flow def process_github_issue(issue_payload: dict): summary = marvin.cast( issue_payload["body"], target=str, instructions="Summarize this [[github|GitHub]] issue in one sentence" ) category = marvin.classify( summary, labels=["bug", "feature_request", "question", "documentation"] ) response = marvin.generate( target=str, instructions=f"Write a helpful response to this {category} issue", context={"summary": summary} ) return {"summary": summary, "category": category, "response": response} ===== Key Features in v3.0 ===== * **Streaming responses**, Real-time output streaming for interactive applications * **Tool support**, Custom Python functions as agent tools * **Observability**, Built-in tracing and progress tracking * **Multimodal**, Image and audio input support * **Multiple LLM providers**, [[openai|OpenAI]] (default), [[claude|Claude]], and all Pydantic AI-supported models ===== See Also ===== * [[hermes_agent|Hermes Agent]] * [[how_to_build_a_coding_agent|How to Build a Coding Agent]] * [[xagent|XAgent: Autonomous LLM Agent for Complex Tasks]] * [[langflow|Langflow]] * [[open_interpreter|Open Interpreter: Local AI Agent & Terminal AI Agent]] ===== References =====