Стандарт HL7 FHIR для управления медицинскими словарями. Определяет три core ресурса (метаданные словарей), стандартный набор operations (как с ними работать через REST API) и протокол version negotiation. Делает терминологию interoperable: любой FHIR-клиент может работать с любым server’ом, реализующим этот стандарт.
Три core ресурса
CodeSystem— определение конкретного словаря: набор concepts + relationships между ними. Примеры: LOINC (http://loinc.org), SNOMED CT (http://snomed.info/sct), RxNorm, ICD-10. Несёт metadata (publisher, version, copyright) + concept hierarchy.ValueSet— подмножество кодов из одного или нескольких CodeSystem’ов под конкретный use case. Например, «AllergyIntolerance category enum» ={food, medication, environment, biologic}из FHIR-administrative CodeSystem; «Lab tests for diabetes monitoring» = subset LOINC-кодов; «Risk levels» ={low, moderate, high}.ConceptMap— трансляция кодов между двумя CodeSystem’ами (или local-system → стандарт). Например: lab-internal “Glucose” → LOINC2345-7; ICD-9 → ICD-10. Наш растущий dictionary маппингов raw lab name → LOINC по сути ConceptMap (см. terminology-service).
Стандартные operations
Все operations — REST endpoints под [base]/<Resource>/$<op>:
| Operation | Что делает | Пример |
|---|---|---|
$lookup | code → metadata (display, designations, properties) | GET CodeSystem/$lookup?system=http://loinc.org&code=2345-7 |
$validate-code | проверка что код существует и valid в CodeSystem / ValueSet | GET ValueSet/$validate-code?url=...&system=...&code=... |
$expand | ValueSet definition → конкретный список codes (с filter / count / offset) | GET ValueSet/$expand?url=http://snomed.info/sct?fhir_vs&filter=Migraine&count=3 |
$translate | ConceptMap source → target code (e.g. local lab name → LOINC) | GET ConceptMap/$translate?url=...&system=...&code=... |
$subsumes | проверка subsumption иерархии в одном CodeSystem (concept A is-a concept B?) | GET CodeSystem/$subsumes?system=...&codeA=...&codeB=... |
$find-matches | grep-like поиск concepts по properties (FHIR R5+) | — |
$closure | incremental ValueSet build (для clients, который growing ValueSet постепенно) | — |
TerminologyCapabilities ресурс описывает что конкретный server поддерживает — какие CodeSystem’ы, какие operations, какие версии. Стандартный discovery.
Industry implementations
Commercial / supported:
- CSIRO Ontoserver — full FHIR terminology server, индустриальный стандарт (Apelon-like positioning). Упомянут у нас в clinical-code-resolution как audit-tool для SNOMED-coder’а. Реальный production-вариант если нужен external partner.
- Apelon DTS — long-standing terminology management platform. Pre-FHIR origins, FHIR-completed позже.
- IMO (Intelligent Medical Objects) — enterprise terminology mappings as a service.
Open source:
- Snowstorm — SNOMED-focused server, открытый, by SNOMED International. Если основной use case = SNOMED hierarchy navigation.
- Termhub — open-source FHIR terminology server (FHIR R4/R5 ops). Active development.
- Vonk / Firely Server — community editions могут включать terminology subset.
Free public:
- tx.fhir.org — HL7 maintained public test server, free для R4/R5. Не для production, но для разработки и тестирования.
- NLM Value Set Authority Center (VSAC) — US National Library of Medicine — published ValueSet’ы для federal initiatives (HEDIS, Meaningful Use). Бесплатный после регистрации UMLS.
Adjacent standards
- CTS2 (Common Terminology Services 2) — pre-FHIR HL7 stack для terminology services. FHIR Terminology Service фактически его spiritual successor. Сейчас CTS2 deprecated в пользу FHIR в большинстве проектов.
- IHE SVS (Sharing Value Sets) — старый IHE profile для ValueSet sharing, тоже superseded FHIR’ом.
Использование в BloodGPT
narrative-to-fhir(deployed) — hardcodedSNOMED_QUICK_LOOKUPtable + LLM fallback. Не использует terminology server. Audit май 2026 Артур делал через CSIRO Ontoserver — нашёл wrong-concept bugs.- V0.5 Mastra write tools (decided, не deployed) — design предусматривает
$expandчерез external terminology server (Ontoserver / tx.fhir.org / другой) для term→SNOMED resolution. См. clinical-code-resolution + llm-numeric-codes-policy. - LOINC harmonization service — наш внутренний artifact, по сути функционально является partial terminology service (хранит ConceptMap raw-name → LOINC, lookup LOINC metadata). Не FHIR-compliant API, но логически делает то же что
$translate+$lookup. См. terminology-service про path-к-full-сервису. - biomarker_graph.json — clinical knowledge overlay поверх LOINC ConceptMap. Не входит в standard scope FHIR Terminology Service (тот про codes / mappings, не про clinical relationships) — но adjacent capability «Clinical Knowledge Base».
- Custom reference ranges (BG-925, planned) — потенциально rolling ValueSet’ы (lab-specific подмножества LOINC + ranges). Не deployed.
Текущее positioning: мы НЕ запускаем полноценный FHIR terminology server. Используем external (Ontoserver) для audit, hardcode для production hot-path, и строим bottom-up свой internal terminology layer без FHIR-compliant API. Решение запустить proper server (или интегрироваться с external’ным) — open.
Открытые вопросы
$expandдля V0.5 — что использовать. Опции: tx.fhir.org (free, не для production data), Ontoserver (требует subscription), self-hosted Snowstorm (SNOMED только), build own на нашейloinc_harmonization_serviceбазе. Не зафиксировано.- FHIR-compliant API для нашего LOINC dictionary. Сделать
$translate/$lookupendpoints поверх нашего Redis dictionary — тривиально технически. Когда — зависит от внешних потребителей (b2b partners интегрируются через FHIR — нет пока такого запроса). - SNOMED licensing. Для production использования SNOMED CT нужна лицензия (affiliate license, free для участников SNOMED International member countries). У нас на момент 2026-05 — заблочено для production, использовали только для audit. Tx.fhir.org не для production data.
- ValueSet maintenance. Наши
parameter-triage-codes({urgent_doctor, routine_doctor, monitor_patient, ok_in_context}) — по сути custom ValueSet. Сейчас hard-coded enum в коде. Стоит ли публиковать какCodeSystem+ValueSetресурсы — open.
Связано
- terminology-service — наш bottom-up terminology service: как наш artifact relates to this standard — research
- clinical-code-resolution — где у нас используется
$expand(V0.5 tools, не deployed) - loinc — основной CodeSystem поверх которого работаем
- snomed — adjacent CodeSystem (licensing blocked)
- fhir-basics — FHIR-конвенции (Identifier, CodeableConcept, Coding)
- fhir-profiling — где ValueSet используются как constraint’ы в profile’ах (US Core, RuCore)
- loinc-harmonization-service — наш partial terminology service (raw-name → LOINC ConceptMap-like layer)
- loinc-harmonization-pipeline — pipeline-механизм пополнения ConceptMap
- llm-numeric-codes-policy — почему LLM не доверяем числовые коды;
$expandкак правильный path - us-core — обязательно использует FHIR Terminology Service для VS validation
- rucore — российский аналог; FHIR Terminology Service используется для НСИ Минздрав ValueSet’ов
- nsi-rosminzdrav — российский CodeSystem (OID
1.2.643.5.1.13.13.11.*)
Источники
- HL7 FHIR R4 Terminology Module — https://hl7.org/fhir/R4/terminology-module.html
- CodeSystem resource — https://hl7.org/fhir/R4/codesystem.html
- ValueSet resource — https://hl7.org/fhir/R4/valueset.html
- ConceptMap resource — https://hl7.org/fhir/R4/conceptmap.html
- tx.fhir.org (public test server) — http://tx.fhir.org
- CSIRO Ontoserver — https://ontoserver.csiro.au/
- Snowstorm (SNOMED International) — https://github.com/IHTSDO/snowstorm
- NLM VSAC — https://vsac.nlm.nih.gov/