FHIR — это спецификация, не реализация. Поверх неё существует экосистема инструментов: type-libraries для compile-time check, HTTP-клиенты для работы с FHIR-сервером, runtime-валидаторы, server SDKs, профайлинг-tooling. Каждый слой решает свою задачу — некоторые продукты совмещают несколько слоёв, некоторые узкоспециализированные.
Когда есть свой клиент / валидация / сервер, нужны только TS interfaces для compile-time
@types/fhir, fhir-ts-codegen
Types + validator
Когда вход непредсказуемый (LLM output, external API), нужен runtime gate
@reasonhealth/fhir-zod + types
Types + client (light)
Standard read/write/search на готовый FHIR-сервер
fhir-kit-client + @types/fhir
Full-stack (SDK)
Хочется типы + клиент + валидация + auth + dashboard в одной поставке
Medplum SDK (TS), Firely .NET SDK (C#)
Full FHIR-server in process
Хочется свой FHIR-сервер с full validation на месте, не managed cloud
HAPI FHIR, Medplum (self-hosted), Aidbox
Чем дальше вниз, тем больше lock-in и тем меньше control. Pure-types — low blast-radius (можно сменить tool); full-stack — high migration cost.
Наш текущий стек
Слой
Что используем
Types
@types/fhir (vanilla R4, без profile-awareness)
Validation
runtime — только сервер-side в Google Healthcare API (base R4)
HTTP-клиент
свой fhir-client.ts поверх REST endpoints Google Healthcare API
Builders
руками в narrative-to-fhir/fhir-builders/*.ts + lib/fhir-*-builder.ts
Server
Google Healthcare API (managed, GCP)
Profiling
нет (vanilla R4)
Это в-целом pure-types подход + managed server. Без runtime валидации в коде; check выполняется неявно через Google Healthcare API при write. Builder-логика — наша полностью.
Medplum SDK заменит свой client — если хотим React-hooks-style работу с FHIR из B2C-приложения и принимаем lock-in.
HAPI FHIR / Medplum self-hosted сервер — если выйдем за пределы GCP (например, на on-prem deployment для госпиталя или для compliance с резиденцией данных). Маловероятно в ближайшие 12 месяцев.
Inferno — если входим в US-рынок и нужно проходить ONC HTI-1 conformance tests.
Открытые вопросы
Между fhir-ts-codegen (only TS) и Microsoft fhir-codegen (multi-target) — что выбрать если планируем поддерживать и TS-pipeline и .NET-pipeline?
Когда runtime валидатор окупится — на каком объёме / сложности custom-profiles это становится net-win?
Какие части Medplum SDK можно взять без adoption Medplum server — @medplum/core standalone работает?