Skip to main content
Glama
FoundryNet

forge-sandbox

by FoundryNet

Forge Sandbox

Имитация данных, настоящая схема.

Локальная симуляция без ключей ядра промышленной телеметрии Forge. Запустите её на ноутбуке, создайте интеграцию своего агента на её основе, а затем направьте тот же код на продакшн-версию Forge, чтобы общаться с реальным оборудованием.

Никакого API-ключа. Никакого аккаунта. Никакой регистрации. Ничего не сохраняется. Приложение не совершает исходящих вызовов.

docker run -p 8000:8000 ghcr.io/foundrynet/forge-sandbox

Мультиархитектурный: linux/amd64 и linux/arm64. Закрепите версию с помощью ghcr.io/foundrynet/forge-sandbox:1.0.0, если не хотите отслеживать latest.

Порт 8000 уже занят? docker run -p 8099:8000 ..., или через compose: FORGE_SANDBOX_PORT=8099 docker compose up.

curl -X POST http://localhost:8000/v1/normalize \
  -H "Content-Type: application/json" \
  -d '{"oem": "haas", "data": {"S SPEED (RPM)": 8500, "SP_LOAD_PCT (%)": 84.7, "COOL_TEMP [°F]": 161.8}}'
{
  "normalized": {
    "spindle_speed_rpm": 8500,
    "spindle_load_pct": 84.7,
    "sensor_readings.coolant_temp": 72.1111
  },
  "coverage_pct": 100.0,
  "fields_total": 3,
  "fields_distinct_canonical": 3,
  "unit_conversions": [
    {"raw_field": "COOL_TEMP [°F]", "canonical_field": "sensor_readings.coolant_temp",
     "from": "f", "to": "c", "conversion": "fahrenheit_to_celsius",
     "raw_value": 161.8, "converted_value": 72.1111}
  ],
  "oem": "haas",
  "vertical": "cnc",
  "simulated": true
}

Для чего это нужно

Промышленное оборудование от N производителей выдаёт телеметрию в N несовместимых форматах. Скорость шпинделя — это S SPEED (RPM) на Haas, Nist_Spindle (RPM) на SINUMERIK и ACT_SP_SPEED_1/min на FANUC. Ваш агент не должен изучать все три.

Forge переводит любой из них в единый канонический словарь. Песочница позволяет вам разрабатывать на основе этого словаря до того, как у вас появятся оборудование, учётные данные или бюджет.

Sandbox

Production

Данные

имитированные

ваше реальное оборудование

Каноническая схема

настоящая

настоящая

Сопоставления тегов вендоров

1 515 (публичные источники)

16 908 курируемых

Нераспознанные теги

классификатор сигналов

+ эмбеддинги, + исследование LLM, + самовосстановление

Прогнозирование

метод наименьших квадратов

TimesFM (200M параметров)

Аутентификация

нет

API-ключ

Персистентность

нет

история, идентичность, триггеры, ограничители

Стоимость

бесплатно

см. цены

Формы ответов идентичны. Это и есть контракт. Стройте интеграцию против песочницы, измените базовый URL, добавьте заголовок Authorization: Bearer — и ваш клиентский код не изменится.


Related MCP server: mcp-live-telemetry

Пять минут

Песочница поставляется с пятью имитированными машинами. Каждая передаёт настоящие имена тегов вендора — те самые написания, которые вы встречаете в реальном трафике.

# 1. See what's here
curl -s localhost:8000/v1/machines | jq '.machines[].description'

# 2. Pull a raw reading — vendor tags, unnormalized
curl -s localhost:8000/v1/simulate/siemens | jq .data
{
  "Betriebszustand": "AUTOMATIK",
  "PROGRAMM": "WELLE_STUFE3.MPF",
  "Nist_Spindle (RPM)": 1203,
  "SPINDEL_AUSLASTUNG (%)": 62.4,
  "Kuehlmittel Temp (C)": 30.6,
  "STUECKZAHL (pcs)": 842,
  "Betriebsstunden": 14203.5
}

Ваш агент не может догадаться, что STUECKZAHL — это количество деталей, а Betriebsstunden — часы работы. Ему и не нужно:

# 3. Normalize it
curl -s localhost:8000/v1/simulate/siemens \
  | jq '{oem, data}' \
  | curl -s -X POST localhost:8000/v1/normalize -H 'Content-Type: application/json' -d @- \
  | jq .normalized
{
  "execution_state": "AUTOMATIK",
  "program_name": "WELLE_STUFE3.MPF",
  "spindle_speed_rpm": 1203,
  "spindle_load_pct": 62.4,
  "sensor_readings.coolant_temp": 30.6,
  "part_count": 842,
  "operating_hours": 14203.5
}
# 4. Forecast — grab a series, ask whether it breaches
curl -s 'localhost:8000/v1/simulate/fanuc/series?field=MOTOR_TEMP&points=48' > /tmp/s.json

jq '{time_series: .values, threshold: 75.0, canonical_field: .canonical_field}' /tmp/s.json \
  | curl -s -X POST localhost:8000/v1/predict_breach -H 'Content-Type: application/json' -d @- \
  | jq '{will_breach, estimated_steps_to_breach, confidence, breach_window}'

Пять машин

Ключ

Оборудование

Протокол

Стиль тегов

haas

Обрабатывающий центр Haas VF-2SS

MTConnect

S SPEED (RPM), SP_LOAD_PCT (%)

fanuc

6-осевой робот FANUC R-30iB

FOCAS

TCPVEL (mm/s), PAYLOADKG(kg)

siemens

SINUMERIK 840D sl / S7-1500

PROFINET

SPINDEL_AUSLASTUNG (%), STUECKZAHL (pcs)

prusa

3D-принтер Prusa MK3S+

Marlin (последовательный)

hotend_temp, heater_power, pinda_temp

carrier

Кровельный HVAC Carrier 48TC

BACnet/IP

SupplyTemp, DamperPosition, CO2

Добавьте ?seed=N к любому вызову simulate, чтобы сделать его повторяемым.


Эндпоинты

Эндпоинт

Что делает

POST /v1/normalize

сырая телеметрия вендора → канонические поля (JSON или text/csv)

POST /v1/predict_breach

пересечёт ли ряд порог и когда

POST /v1/fleet_health

сводка по парку, распределение рисков, очередь обслуживания

POST /v1/predict_batch

предсказания по каждой машине, без сводки

GET /v1/coverage

что можно нормализовать; передайте ?oem=, чтобы проверить одного производителя

GET /v1/canonical-fields

канонический словарь: имя, тип, единица измерения, вертикаль

GET /v1/machines

пять имитированных машин

GET /v1/simulate/{machine}

одно сырое показание

GET /v1/simulate/{machine}/series?field=

история по одному сырому тегу

GET /health

проверка живости (GET и HEAD)

ANY /mcp

MCP-сервер, Streamable HTTP

GET /docs

браузер OpenAPI

Эндпоинты, которые существуют в продакшене, но требуют постоянного состояния — /v1/history, /v1/identify, /v1/guardrails, /v1/triggers, /v1/attest, /v1/billing/usage — возвращают 501 с причиной, а не голый 404, чтобы вы могли отличить «нет в песочнице» от «вы ошиблись при вводе».


MCP

Песочница также является MCP-сервером. Направьте Claude Desktop, Claude Code или любой MCP-клиент на http://localhost:8000/mcp.

{
  "mcpServers": {
    "forge-sandbox": {
      "type": "http",
      "url": "http://localhost:8000/mcp"
    }
  }
}

Claude Code:

claude mcp add --scope user --transport http forge-sandbox http://localhost:8000/mcp

--scope user важен. Без него claude mcp add регистрирует сервер локально для текущей директории, поэтому он доступен только там и нигде больше — выполните claude mcp get forge-sandbox из проекта, в котором вы действительно хотите его использовать, и вы получите «No MCP server named forge-sandbox». Пользовательская область видимости делает его доступным везде. Чтобы убрать его обратно:

claude mcp remove forge-sandbox -s user

Восемь инструментов. Пять из них, существующих в продакшене, несут описания инструментов продакшена дословно, потому что описание — это интерфейс, на основе которого ваш агент принимает решения; если здесь оно читается иначе, поведение промпта, которое вы настраиваете против песочницы, не перенесётся.

Инструмент

normalize_telemetry

продакшн

get_coverage

продакшн

predict_breach

продакшн

fleet_health

продакшн

predict_batch

продакшн

list_sandbox_machines

только песочница

get_sandbox_reading

только песочница

get_sandbox_series

только песочница

Каждое описание инструмента заканчивается примечанием SANDBOX:, поэтому агент, читающий список инструментов, узнаёт, что данные имитированы, прежде чем что-либо сделать.

Продакшн-версия Forge предоставляет 32 инструмента на https://mcp.foundrynet.io/mcp. Остальным 24 нужны постоянная идентичность, история, ограничители, триггеры, биллинг или ончейн-аттестация.


Как на самом деле работает разрешение

Продакшн разрешает тег через пять уровней. Песочница включает три из них, которым не нужны веса моделей, сеть и проприетарные данные.

Уровень

Тип совпадения

Уверенность

Что это

1

corpus

1.00

точный тег вендора в пакете сопоставлений

1b

corpus_normalized

0.95

та же строка, когда регистр, пунктуация и суффикс единицы измерения свёрнуты

1c

cross_oem

0.60

пакет другого вендора знал этот тег — сообщается, а не скрывается

2

identity

1.00

тег уже ЯВЛЯЕТСЯ каноническим именем поля

3

signal

0.55–0.72

детерминированный классификатор «субъект+количество»

—

unknown

0.00

честный промах

Тег, который не разрешается ни во что, сохраняет своё исходное имя и значение в выводе. Ничто не отбрасывается молча, и он не учитывается в покрытии.

coverage_pct — это уникальные канонические поля ÷ общее количество тегов. Десять написаний одной величины — это одно покрытое поле, а не десять. (В продакшене была именно эта ошибка, и он сообщал о 100% покрытии на корпусе без начальных данных.)

Песочница никогда не выдумывает канонические имена. Каждое имя, которое она выдаёт, берётся из поставляемого словаря, а цели классификатора проверяются по этому словарю при запуске — опечатка приводит к падению контейнера, а не к поставке правдоподобно выглядящего неправильного поля.


Чего НЕТ в этом образе

Намеренно, и заявлено прямо, чтобы ничто здесь не приняли за настоящий продукт:

  • Продакшн-корпус сопоставлений. 16 908 курируемых сопоставлений с оценками уверенности и происхождением. Песочница поставляет 1 515 сопоставлений, собранных только из уже публичных источников: каноническая схема под лицензией MIT (haas, fanuc, siemens, octoprint), поставляемый вертикальный пакет BACnet/IP плюс имена объектов Carrier i-Vu, а также имена полей Marlin M105/M114, которые любой Prusa передаёт по последовательному порту. tools/build_packs.py показывает, откуда взялась каждая строка.

  • Слой эмбеддингов. Продакшн векторизует нераспознанные теги и сопоставляет их по сходству. Здесь нет весов моделей.

  • LLM-исследование полей. Продакшн отправляет действительно новые теги модели, кэширует ответ, подтверждает его после 5 использований и упаковывает после 10. Не здесь.

  • Физические валидаторы и валидаторы времени чтения. Скорость изменения, залипший датчик, пропадание сигнала, режим работы, корреляция, затухание уверенности. Не здесь.

  • TimesFM. Продакшн прогнозирует с помощью фундаментальной модели временных рядов на 200M параметров. Песочница использует метод наименьших квадратов с квантильной полосой, масштабированной по остаткам. Каждый прогноз помечается "model": "sandbox-ols-v1" и "simulated": true.

  • Персистентность, идентичность, история, триггеры, ограничители, биллинг, аттестация. Всё с сохранением состояния, всё на стороне сервера.

  • Любое соединение с продакшеном. Приложение не импортирует HTTP-клиент и не использует socket API, поэтому не совершает исходящих вызовов — grep -rE "httpx|requests|urllib|socket" app/ возвращает пустой результат. docker-compose.yml дополнительно запускает его в режиме read_only со всеми capabilities отключёнными. Обратите внимание: это укрепляет файловую систему, а не сеть: стандартный мост Docker по-прежнему разрешает исходящий трафик, так что если вам нужно, чтобы это было принудительно, а не просто фактом, запускайте во internal сети.

Каждый ответ содержит "simulated": true и заголовок X-Forge-Sandbox: true. Если вы когда-нибудь увидите их на реальном эндпоинте, значит, что-то маршрутизируется неправильно.


Две вещи, которые песочница делает лучше продакшена

Обе — известные проблемы продакшена, исправленные здесь, потому что песочница, которая учит неправильной форме, хуже, чем отсутствие песочницы.

  1. Шкала PWM объявлена. Поле нагревателя @: в Marlin — это байт коэффициента заполнения 0–127, а не процент. Корпус продакшена выдаёт для него unit: null, поэтому показание 95 интерпретируется как «95%, почти максимум», хотя на самом деле это около 75%. Песочница объявляет unit: "pwm_0_127".

  2. Пустые единицы измерения заполняются из имён полей. Опубликованный корпус объявляет единицу измерения только для 58 из 366 полей. Там, где имя поля указывает единицу (_temperature_c, _pressure_bar, _rpm), песочница заполняет её и помечает unit_source: "sandbox_inferred_from_name".


Локальная разработка

docker compose up --build          # build and run your local changes
docker build --target test .       # run the suite inside the shipping image

Без Docker:

python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements-dev.txt
python -m pytest tests/ -q
uvicorn app.main:app --reload --port 8000

Перегенерируйте пакеты сопоставлений из исходников (требуется клонированный репозиторий canonical-schema):

python3 tools/build_packs.py
forge-sandbox/
  app/
    main.py        FastAPI surface — the production response envelopes
    corpus.py      tag → canonical resolution, unit conversion, collisions
    simulate.py    the five machines
    predict.py     deterministic forecasting, production's response contract
    mcp_tools.py   MCP server, production tool descriptions
    packs/         generated mapping packs + the canonical dictionary
  tools/
    build_packs.py regenerates packs from the public sources
  tests/
    test_sandbox.py

Переход на продакшен

Два изменения:

- BASE_URL = "http://localhost:8000"
- headers = {}
+ BASE_URL = "https://forge.foundrynet.io"
+ headers = {"Authorization": f"Bearer {FORGE_API_KEY}"}

Для MCP замените http://localhost:8000/mcp на https://mcp.foundrynet.io/mcp.

Что меняется под капотом:

  • Теги, которые песочница пометила как unknown, разрешаются слоем эмбеддингов, путём LLM-исследований или вертикальными пакетами.

  • Прогнозы поступают от TimesFM вместо прямой линии.

  • Показания сохраняются, поэтому история, триггеры и ограничители начинают работать.

  • /v1/identify выдаёт постоянную идентичность машины.

  • Прогнозы могут быть аттестованы.

Получите ключ: foundrynet.io


Sandbox:     fake data, real schema
Production:  real data, real schema, real predictions

Upgrade:     foundrynet.io

Лицензия

MIT. Пакеты сопоставлений получены из схемы FoundryNet canonical schema, распространяемой по лицензии MIT; tools/build_packs.py документирует происхождение каждого пакета.


Forge от Foundry Labs · forge@foundrynet.io

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Exposes live industrial IoT telemetry to any MCP client, streaming simulated sensor data from a fleet of machines and detecting anomalies, with the ability to inject faults on demand.
    4
    MIT
  • A
    license
    B
    quality
    B
    maintenance
    Enables bounded, deterministic triage verdicts for server health, fleet status, and timeline investigation through a simulated execution-boundary MCP server.
    3
    5
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    An MCP server that lets AI models read and control industrial devices via standardized protocols like Modbus, OPC UA, and MQTT, with simulation and real hardware modes.
    4
    MIT