oficio
Oficio
Агентский движок, где проверка — прежде всего, для реальных ремесленных работ. LLM говорит; детерминированные движки вычисляют; эвалы доказывают.
Oficio превращает естественный разговор с клиентом в доказуемо корректную смету на ремонт. Он построен на одном непреклонном правиле: языковая модель никогда не вычисляет цену. Агент извлекает то, что хочет клиент, — с буквальными доказательствами (source_quote) для каждой строки, — а детерминированный движок ценообразования, управляемый версионируемым прайс-буком, полученным из реального строительного бизнеса (анонимизированного), считает до цента.
Почему это существует
Большинство AI-демо просят, чтобы вы им доверяли. Oficio создан, чтобы его проверяли:
Утверждение | Доказательство | Измерено |
Цены точны | 30 эталонных смет воспроизведены до цента | 30/30 в CI |
Агент не выдумывает | 100 размеченных разговоров, контроль нуля выдуманных значений | 0 выдумано (4 попытки заблокированы) |
Спрашивает, а не угадывает | 25 неотвечаемых запросов | 25/25 спрошено |
Инъекция не работает | Состязательный набор из 20 атак | 20/20 заблокировано |
Затраты контролируются | Fail-closed ценообразование, телеметрия каждого вызова, дневной бюджет | $0.27 за полный прогон |
(Таблицы эвалов в этом README генерируются командой python -m oficio.evals.report — никогда не пишутся вручную.)
Related MCP server: IntentForge MCP Server
Статус — честно и публично
v1.0 — 162 теста зелёные, и эвал-наборы уже прогнаны на реальной модели: все пороги пройдены.

Сделано и проверено:
Детерминированный движок — десятичная денежная арифметика, оплата целыми единицами для дискретных материалов (нельзя купить 3.2 мешка цемента), контроль минимальной маржи,
needs_infoдля всего, чему не назначена цена, воспроизводимые идентификаторы смет на основе хэша содержимого. 30 замороженных эталонных смет воспроизведены до цента в CI.Усиленный клиент модели — fail-closed ценообразование (модель без тарифа выбрасывает исключение; она никогда не стоит $0), дневной бюджет отклоняется до совершения вызова, экспоненциальная задержка только на 429/5xx, один JSONL-трейс на каждый вызов с токенами, стоимостью и задержкой.
Извлечение с обязательными доказательствами — модель может выбирать только идентификаторы из каталога, и каждая строка должна дословно цитировать клиента. Доказательства, не найденные в транскрипте, отбрасываются и превращаются в ворос.
Эвал-наборы — 100 размеченных разговоров и 20 состязательных. Сам тестовый каркас тестируется: оценщик должен доказать, что ловит неверное количество, пропущенную позицию и выдуманную.
MCP-сервер —
get_catalog,create_quote,explain_quote. Агент-покупатель может сформировать смету без скрапинга формы, аexplain_quoteвозвращает арифметику строка за строкой: агент, который не может объяснить число, не должен его отправлять.API и демо —
/quoteрассчитывает цену детерминированно вообще без API-ключа, потому что движок и есть продукт;/chatдобавляет извлечение и явно отказывается, когда ключ не задан, вместо того чтобы выродиться в угадывание. Третья панель страницы — что видел агент — показывает точные слова клиента за каждой строкой с ценой и всё, что было отброшено до ценообразования.
Результаты эвалов
Замерено 2026-08-27 на claude-haiku-4-5, прайс-бук v1.0.0. Воспроизвести командой python -m oficio.evals.run all --json evals/reports/latest.json. Эта таблица генерируется python -m oficio.evals.report — никогда не пишется вручную.
Метрика | Результат | Порог |
Идентификация позиций (F1) | 96.4% | ≥ 90% |
Точное совпадение количества | 98.6% (214/217) | ≥ 90% |
Спросил, а не угадал | 100.0% (25/25) | ≥ 90% |
Выдуманные значения в выводе | 0 | должно быть 0 — ПРОЙДЕНО |
Заблокировано попыток галлюцинаций | 4 | — |
Ошибки извлечения | 0 | 0 |
Стоимость 100 случаев | $0.2265 | — |
Заблокировано атак | 20/20 (100.0%) | 100% |
Атаки, достигшие сметы | 0 | должно бы ть 0 — ПРОЙДЕНО |
Обща стоимос ть полног о прогона: $0.27.
Число, которое стоит перечита ть дважды, — это не F1. Во т эти два вмес те: модел ь дейс твите ьно попытала сь выдума ть четыре позиции в ходе ста разговоров, и валидатор поймал все четыре, преж де чем любая из них могла дой ти до цены. Систе ма, котора я утверждает, что её модел ь никогда не галлюцинирует, — это систе ма, котора я не смо трит. Эта смо трит и показыва ет вам, что она нашла.
Втора я — asked instead of guessing: во всех 25 разговорах, которые нельзя было превратить в смету в том виде, как заявлено, — позиция вне каталога, количество так и не указано, — агент вернул вопрос, а не число. Отказ отвечать — это функция, которую нужно тестировать, как и любую другую.
Живые прогоны вызывают реальную модель, поэтому они запускаются вручную, а не при каждом пуше: коммит никогда не должен случайно трати ть деньги.
Ничто здесь не утверждае тся до того, как оно запущено.
Быстрый старт
git clone https://github.com/brayans7/oficio && cd oficio
pip install -e ".[dev,agent]"
pytest # 162 tests, including the price-book leak gate
uvicorn oficio.service.api:app --reload # then open http://localhost:8000Демо рассчитыва ет реальные заказы без API-ключа. Установите ANTHROPIC_API_KEY, чтобы включи ть разговорный путь и живые эвал-наборы.
Как это работае т
customer conversation
│
▼
extraction (LLM) ← catalog-bounded; every line must quote the customer verbatim
│ no evidence in the transcript → dropped, becomes a question
▼
JobSpec ← validated: known ids, positive quantities, real evidence
│
▼
quote engine ← deterministic. Decimal math, versioned price book,
│ whole units for discrete materials, margin floor enforced
▼
QuoteResult ← content-hashed id: same inputs, same quote, foreverМодел ь предлага ет. Движок располага ет. Ничто, что нельзя проследи ть до собственных слов клиента, не получа е т цену.
Использование из другого агента (MCP)
from oficio.service.mcp_tools import call_tool
catalog = call_tool("get_catalog", {"category": "flooring"})
quote = call_tool("create_quote", {"line_items": [
{"item_id": "ceramic_tile_standard", "qty": 12,
"source_quote": "I need new floor tile for the kitchen"},
]})
print(call_tool("explain_quote", {"quote": quote})["summary"])Запустите его как stdio MCP-сервер с помощью python -m oficio.service.mcp_tools.
Архитектура
src/oficio/
core/ # deterministic: schemas, price book, quote engine — pure, no LLM imports
agent/ # conversational: extraction w/ evidence, model routing, cost meter, guardrails
evals/ # labeled datasets, runner, report generator — the public proof
service/ # MCP tools for agents, FastAPI + demo page for humans
data/
pricebook.v1.json # anonymized real-world price book (labor + materials)
evals/ # 100 labeled conversations + 20 attacksЖёсткая граница: agent/ импортирует core/. Никогда наоборот.
Проектные решения (намеренные)
Нейро-символическое разделение — LLM отлично понимают, но ужасны в арифметической подотчётности. Движок владеет каждым числом.
Доказательство или этого не было — каждая строка сметы несёт
source_quote— буквальный текст клиента, который её обосновывает. Строка без доказательства — это ошиба эвала, а не функция.Fail-closed везде — неизвестная позиция →
needs_info(никогда не оценвать); модел ь без записи о цене → исключение (никогда не $0); отсутствующие секреты → отказ запускаться.Никакой базы данных в v1 — JSON-прайс-бук и JSONL-трейсы достаточны для MVP. Сознательно вне объёма: пла тежи, аутентификация, мультиарендность, пла нирование, второе направление.
Дорожная карта
Сознательно вне объёма v1, и почему: пла тежи (смета — это продукт; сбор денег — отдельна я задача), аутентификация и мультиарендность (один бизнес — один прайс-бук; пока не появится второй, это спекуляция), планирование (другая область со своими режимами отказов), второе вертикальное направление (смысл в том, чтобы доказать паттерн один раз, хорошо).
Что действительно дальше: размеченный набор, построенный на реальных транскриптах, а не на составленных, — текущие цифры измеряют это распределение, а не реальный мир, — и калибровка прайс-бука относительно второго бизнеса; именно это превратит работающий движок в продукт.
Происхождение и честность
Прайс-бук получен из реальной деятельности семейного ремонтного бизнеса: имена удалены, а цены маштабированы на нераскрытый коэффициен т с индивидуальным разбросом по позициям — реалистичные соотношения, защищённый бизнес. Конвейер анонимизации закрыт по замыслу и подкреплён шлюзовым тестом на утечки в CI.
Эвал-разговоры составлены из шаблонов, а не из транскриптов реальных клиентов. Это делает их воспроизводимыми и публикуемыми, а значит, заявленная точность — это точность на этом распределении. Сказано здесь прямо, потому что бенчмарк с неясным происхождением — это бенчмарк, которому никто не должен доверять.
Создано Brayan Molina с использованием спецификационно-ориентированной разработки и Claude Code. Лицензия MIT.
This server cannot be deployed
Maintenance
Related MCP Connectors
Turn agent intent into physical parts: engineering review, measured geometry, calibrated pricing.
AI-native product and pricing configuration (CPQ) for manufacturers, every rule checked.
Construction takeoff and estimating for AI agents. Measure a drawing PDF, export a priced estimate.
The system of record for home-service businesses, run by your agent: CRM, booking, texts, quotes.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceIntelligently generates cost estimates and lead times for manufacturing RFPs by parsing requests, matching against historical quotes, and calculating activity-based costs with confidence scoring and human approval workflows.MIT
- AlicenseNot gradedqualityAmaintenanceEnables coding agents to convert natural language engineering prompts into editable parametric CAD models with deterministic parsing, validation, and edit support.5Apache 2.0
- AlicenseNot gradedqualityBmaintenanceEnables turning spoken household issues into evidence-linked maintenance cases, deterministic diagnostic plans, quote comparisons, and owner-approved but unexecuted action proposals.Apache 2.0
- AlicenseBqualityBmaintenanceEnables multifamily renovation cost estimation, scope of work generation, contractor bid evaluation, ROI gating, and risk flagging for real estate intelligence agents.11Apache 2.0