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 installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Turn agent intent into physical parts: engineering review, measured geometry, calibrated pricing.
Construction takeoff and estimating for AI agents. Measure a drawing PDF, export a priced estimate.
AI-powered job cost estimator for skilled trades with material and labor breakdowns
One-call installer quote review plus energy incentives, estimates, scores, and routing for agents.
Related MCP Servers
- FlicenseNot 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.
- AlicenseNot gradedqualityAmaintenanceEnables coding agents to convert natural language engineering prompts into editable parametric CAD models with deterministic parsing, validation, and edit support.6Apache 2.0
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to transcribe insurance rate filings into executable rating engines with full citation tracking, supporting validation, review, and quote generation through MCP tools.Apache 2.0
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to perform construction takeoff and estimating from drawing PDFs, including upload, scale calibration, trade-based takeoff, pricing, and proposal export.MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/brayans7/oficio'
If you have feedback or need assistance with the MCP directory API, please join our Discord server