by Prefect (open source) Python 3.10+, OpenAI, Anthropic, Azure OpenAI
Marvin — прагматичный AI toolkit от Prefect для добавления AI-функций в Python-приложения. Акцент на типизированные AI-функции: extract, classify, transform, generate — без лишнего boilerplate. Возможности: - `marvin.extract(text, target=List[str])` — извлечение структур из текста - `marvin.classify(text, labels=[...])` — классификация - `marvin.cast(value, target_type)` — приведение типов через AI - `marvin.generate(n=5, target=str, instructions=...)` — генерация - `@marvin.fn` — превратить любую функцию в AI-функцию - `marvin.Image` — multimodal: анализ изображений - Интеграция с Pydantic, полный type safety
# pip:
pip install marvin
# Настройка:
export OPENAI_API_KEY="sk-..."
# или для Claude:
export ANTHROPIC_API_KEY="sk-ant-..."
export MARVIN_LLM_BACKEND=anthropic
# Пример:
import marvin
from pydantic import BaseModel
class Location(BaseModel):
city: str
country: str
locations = marvin.extract(
"I visited Paris and Tokyo last year",
target=list[Location]
)
# [Location(city="Paris", country="France"), ...]
)
Marvin — это Python-фреймворк для создания структурированных выходных данных и построения агентных ИИ-рабочих процессов.
Marvin предоставляет интуитивно понятный API для определения рабочих процессов и делегирования работы LLM:
Marvin доступен на PyPI:
uv add marvin
Настройте своего поставщика LLM (Marvin использует OpenAI по умолчанию, но нативно поддерживает все модели Pydantic AI):
export OPENAI_API_KEY=your-api-key
Marvin предлагает несколько интуитивно понятных способов работы с ИИ:
Вся команда здесь — вы можете найти все утилиты для структурированных выходных данных из marvin 2.x на верхнем уровне пакета.
Как использовать extract, cast, classify и generate
marvin.extractИзвлечение нативных типов из неструктурированных входных данных:
import marvin
result = marvin.extract(
"i found $30 on the ground and bought 5 bagels for $10",
int,
instructions="only USD"
)
print(result) # [30, 10]
marvin.castПриведение неструктурированных входных данных к структурированному типу:
from typing import TypedDict
import marvin
class Location(TypedDict):
lat: float
lon: float
result = marvin.cast("the place with the best bagels", Location)
print(result) # {'lat': 40.712776, 'lon': -74.005974}
marvin.classifyКлассификация неструктурированных входных данных как одной из набора предопределенных меток:
from enum import Enum
import marvin
class SupportDepartment(Enum):
ACCOUNTING = "accounting"
HR = "hr"
IT = "it"
SALES = "sales"
result = marvin.classify("shut up and take my money", SupportDepartment)
print(result) # SupportDepartment.SALES
marvin.generateГенерация некоторого количества структурированных объектов по описанию:
import marvin
primes = marvin.generate(int, 10, "odd primes")
print(primes) # [3, 5, 7, 11, 13, 17, 19, 23, 29, 31]
marvin 3.0 представляет новый способ работы с ИИ, перенесенный из ControlFlow.
marvin.runПростой способ запуска задачи:
import marvin
poem = marvin.run("Write a short poem about artificial intelligence")
print(poem)
вывод
In silicon minds, we dare to dream, A world where code and thoughts redeem. Intelligence crafted by humankind, Yet with its heart, a world to bind.
Neurons of metal, thoughts of light, A dance of knowledge in digital night. A symphony of zeros and ones, Stories of futures not yet begun.
The gears of logic spin and churn, Endless potential at every turn. A partner, a guide, a vision anew, Artificial minds, the dream we pursue.
Вы также можете запросить структурированный вывод:
import marvin
answer = marvin.run("the answer to the universe", result_type=int)
print(answer) # 42
marvin.AgentАгенты — это специализированные ИИ-агенты, которые можно использовать для выполнения задач:
from marvin import Agent
writer = Agent(
name="Poet",
instructions="Write creative, evocative poetry"
)
poem = writer.run("Write a haiku about coding")
print(poem)
вывод
There once was a language so neat, Whose simplicity could not be beat. Python's code was so clear, That even beginners would cheer, As they danced to its elegant beat.
marvin.TaskВы можете явно определить Task, который будет запущен агентом по умолчанию при вызове .run():
from marvin import Task
task = Task(
instructions="Write a limerick about Python",
result_type=str
)
poem = task.run()
print(poem)
вывод
In circuits and code, a mind does bloom, With algorithms weaving through the gloom. A spark of thought in silicon's embrace, Artificial intelligence finds its place.
Мы считаем, что работа с ИИ должна приносить радость (и, возможно, несколько "вау"-моментов):
Marvin построен вокруг нескольких мощных абстракций, которые упрощают работу с ИИ:
Задачи — это базовая единица работы в Marvin. Каждая задача представляет собой четкую цель, которую может достичь ИИ-агент:
Простейший способ запуска задачи — marvin.run:
import marvin
print(marvin.run("Write a haiku about coding"))
Lines of code unfold,
Digital whispers create
Virtual landscapes.
[!WARNING]
Хотя нижеследующий пример обеспечивает безопасность по типу 🙂, он выполняет недоверенные команды оболочки.
Добавьте контекст и/или инструменты для достижения более конкретных и сложных результатов:
import platform
import subprocess
from pydantic import IPvAnyAddress
import marvin
def run_shell_command(command: list[str]) -> str:
"""e.g. ['ls', '-l'] or ['git', '--no-pager', 'diff', '--cached']"""
return subprocess.check_output(command).decode()
task = marvin.Task(
instructions="find the current ip address",
result_type=IPvAnyAddress,
tools=[run_shell_command],
context={"os": platform.system()},
)
task.run()
╭─ Agent "Marvin" (db3cf035) ───────────────────────────────╮
│ Tool: run_shell_command │
│ Input: {'command': ['ipconfig', 'getifaddr', 'en0']} │
│ Status: ✅ │
│ Output: '192.168.0.202\n' │
╰───────────────────────────────────────────────────────────╯
╭─ Agent "Marvin" (db3cf035) ───────────────────────────────╮
│ Tool: MarkTaskSuccessful_cb267859 │
│ Input: {'response': {'result': '192.168.0.202'}} │
│ Status: ✅ │
│ Output: 'Final result processed.' │
╰───────────────────────────────────────────────────────────╯
Задачи: - 🎯 Ориентированы на цель: Каждая задача имеет четкие инструкции и результат, безопасный по типу - 🛠️ С поддержкой инструментов: Задачи могут использовать пользовательские инструменты для взаимодействия с вашим кодом и данными - 📊 Наблюдаемы: Отслеживайте прогресс, проверяйте результаты и отлаживайте сбои - 🔄 Компонуемы: Стройте сложные рабочие процессы, соединяя задачи вместе
Агенты — это портативные конфигурации LLM, которые можно назначать задачам. Они инкапсулируют всё, что нужно ИИ для эффективной работы:
import os
from pathlib import Path
from pydantic_ai.models.anthropic import AnthropicModel
import marvin
def write_file(path: str, content: str):
"""Записать содержимое в файл"""
_path = Path(path)
_path.write_text(content)
writer = marvin.Agent(
model=AnthropicModel(
model_name="claude-3-5-sonnet-latest",
api_key=os.getenv("ANTHROPIC_API_KEY"),
),
name="Technical Writer",
instructions="Write concise, engaging content for developers",
tools=[write_file],
)
result = marvin.run("how to use pydantic? write to docs.md", agents=[writer])
print(result)
вывод
╭─ Agent "Technical Writer" (7fa1dbc8) ────────────────────────────────────────────────────────────╮
│ Tool: MarkTaskSuccessful_dc92b2e7 │
│ Input: {'response': {'result': 'The documentation on how to use Pydantic has been successfully │
│ written to docs.md. It includes information on installation, basic usage, field │
│ validation, and settings management, with examples to guide developers on implementing │
│ Pydantic in their projects.'}} │
│ Status: ✅ │
│ Output: 'Final result processed.' │
╰──────────────────────────────────────────────────────────────────────────────────── 8:33:36 PM ─╯
The documentation on how to use Pydantic has been successfully written to docs.md. It includes information on installation, basic usage, field validation, and settings management, with examples to guide developers on implementing Pydantic in their projects.
Агенты: - 📝 Специализированные: Давайте агентам конкретные инструкции и личности - 🎭 Портативные: Переиспользуйте конфигурации агентов для различных задач - 🤝 Кооперативные: Формируйте команды агентов, которые работают вместе - 🔧 Настраиваемые: Конфигурируйте модель, температуру и другие параметры
Marvin упрощает разбиение сложных целей на управляемые задачи:
# Позвольте Marvin спланировать сложный рабочий процесс
tasks = marvin.plan("Create a blog post about AI trends")
marvin.run_tasks(tasks)
# Или оркестрируйте задачи вручную
with marvin.Thread() as thread:
research = marvin.run("Research recent AI developments")
outline = marvin.run("Create an outline", context={"research": research})
draft = marvin.run("Write the first draft", context={"outline": outline})
Возможности планирования: - 📋 Умное планирование: Разбиение сложных целей на дискретные, зависимые задачи - 🔄 Зависимости между задачами: Задачи могут зависеть от результатов других - 📈 Отслеживание прогресса: Мониторинг выполнения вашего рабочего процесса - 🧵 Управление потоками: Общий контекст и история между задачами
Marvin включает высокоуровневые функции для наиболее частых задач, таких как резюмирование текста, классификация данных, извлечение структурированной информации и многое другое.
marvin.run: Выполните любую задачу с помощью ИИ-агентаmarvin.summarize: Получите краткую сводку текстаmarvin.classify: Классифицируйте данные в предопределенные классыmarvin.extract: Извлекайте структурированную информацию из текстаmarvin.cast: Преобразуйте данные в другой типmarvin.generate: Создавайте структурированные данные из описанияВсе функции Marvin имеют встроенное управление потоками, что означает, что их можно объединять в цепочки задач, которые разделяют контекст и историю.
Marvin 3.0 объединяет DX (опыт разработки) от Marvin 2.0 с мощным агентным движком ControlFlow (таким образом, заменяя ControlFlow). Пользователи как Marvin, так и ControlFlow найдут знакомый интерфейс, но есть некоторые ключевые изменения, о которых стоит знать, особенно пользователям ControlFlow.
marvin.fn, marvin.classify, marvin.extract и другие.marvin.Task, marvin.Agent, marvin.run, marvin.Memory вместо их аналогов в ControlFlow.Flow в ControlFlow была переименована в Thread. Она работает аналогично, как контекстный менеджер. Декоратор @flow был удален:
```python
import marvinwith marvin.Thread(id="optional-id-for-recovery"): marvin.run("do something") marvin.run("do another thing") ``` - Изменения в базе данных: История потоков/сообщений теперь хранится в SQLite. Во время разработки: - В настоящее время доступных миграций базы данных нет; ожидайте сброс данных при обновлениях
Вот более практичный пример, демонстрирующий, как Marvin может помочь вам создавать реальные приложения:
import marvin
from pydantic import BaseModel
class Article(BaseModel):
title: str
content: str
key_points: list[str]
# Создайте специализированного агента-писателя
writer = marvin.Agent(
name="Writer",
instructions="Write clear, engaging content for a technical audience"
)
# Используйте поток для поддержания контекста между несколькими задачами
with marvin.Thread() as thread:
# Получите входные данные от пользователя
topic = marvin.run(
"Ask the user for a topic to write about.",
cli=True
)
# Исследуйте тему
research = marvin.run(
f"Research key points about {topic}",
result_type=list[str]
)
# Напишите структурированную статью
article = marvin.run(
"Write an article using the research",
agent=writer,
result_type=Article,
context={"research": research}
)
print(f"# {article.title}\n\n{article.content}")
вывод
Разговор: ```text Agent: I'd love to help you write about a technology topic. What interests you? It could be anything from AI and machine learning to web development or cybersecurity.
User: Let's write about WebAssembly ```
Статья: ```
WebAssembly: The Future of Web Performance
WebAssembly (Wasm) represents a transformative shift in web development, bringing near-native performance to web applications. This binary instruction format allows developers to write high-performance code in languages like C++, Rust, or Go and run it seamlessly in the browser.
[... полное содержание статьи ...]
Key Points: - WebAssembly enables near-native performance in web browsers - Supports multiple programming languages beyond JavaScript - Ensures security through sandboxed execution environment - Growing ecosystem of tools and frameworks - Used by major companies like Google, Mozilla, and Unity ```