Call a user-supplied FHIR terminology server ($validate-code, $expand, $lookup, $translate) to validate and expand clinical codes without bundling restricted vocabulary (SNOMED CT, RxNorm, LOINC, ICD-10) into OpenMed. Covers a thin local client, ValueSet $expand with filters/ECL, CodeSystem $lookup, ConceptMap $translate, and pointing at Ontoserver / HAPI / tx.fhir.org. Use as the grounding step for OpenMed coding skills — turn an OpenMed entity span into a validated coded CodeableConcept — when the user mentions terminology server, $validate-code, $expand, ValueSet, ECL, SNOMED/RxNorm/LOINC lookups, or code validation. Pairs adjacent.
72
87%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
OpenMed deliberately bundles no restricted vocabulary — no SNOMED CT,
RxNorm, LOINC, ICD-10, UMLS. So when an OpenMed entity span needs a validated
code (the grounding step exporting-to-fhir references), you call a FHIR
terminology server the user already operates, with their own license. This
skill is the thin client the coding skills lean on.
Use it whenever a span must become a coded CodeableConcept, when you need to
confirm a code is valid in a system, expand a ValueSet for a picklist, look up a
display, or map between vocabularies. Triggers: "terminology server",
"$validate-code", "$expand", "ValueSet", "ECL", "is this a valid SNOMED/LOINC/
RxNorm code", "translate ICD-10 to SNOMED". It sits between OpenMed NER and
exporting-to-fhir.
The four operations are standard FHIR; point the client at whichever server the user is licensed for:
OpenMed never ships or proxies these — the credentials and content are the user's.
POST [tx]/CodeSystem/$validate-code -> is this code valid in this system?
POST [tx]/ValueSet/$expand -> enumerate the codes in a value set
POST [tx]/CodeSystem/$lookup -> display + properties for a code
POST [tx]/ConceptMap/$translate -> map a code from one system to another$validate-code — confirm before you emitcurl -s -X POST 'https://tx.example/fhir/CodeSystem/$validate-code' \
-H 'Content-Type: application/fhir+json' -d '{
"resourceType": "Parameters",
"parameter": [
{"name": "url", "valueUri": "http://snomed.info/sct"},
{"name": "code", "valueCode": "44054006"},
{"name": "display", "valueString": "Diabetes mellitus type 2"}
]}'
# -> Parameters: { result: true, display: "Diabetes mellitus type 2" }$expand — enumerate a ValueSet (with ECL for SNOMED)# Expand "disorders of the lung" via an implicit SNOMED ECL value set
curl -s -X POST 'https://tx.example/fhir/ValueSet/$expand' \
-H 'Content-Type: application/fhir+json' -d '{
"resourceType": "Parameters",
"parameter": [
{"name": "url", "valueUri":
"http://snomed.info/sct?fhir_vs=ecl/<<19829001"},
{"name": "filter", "valueString": "pneumonia"},
{"name": "count", "valueInteger": 20}
]}'<<19829001 is ECL for "19829001 (Disorder of lung) or any subtype". Use
$expand + filter to power autocomplete and to constrain which codes a span
may map to.
$lookup and $translate# Display + properties for a LOINC code
POST [tx]/CodeSystem/$lookup { url=http://loinc.org, code=4548-4 }
# Map an ICD-10-CM code to SNOMED via a ConceptMap
POST [tx]/ConceptMap/$translate {
url=<conceptmap-url>, system=http://hl7.org/fhir/sid/icd-10-cm,
code=E11.9, targetsystem=http://snomed.info/sct }import requests
class TxClient:
def __init__(self, base, token=None):
self.base = base.rstrip("/")
self.h = {"Content-Type": "application/fhir+json"}
if token:
self.h["Authorization"] = f"Bearer {token}"
def _params(self, **kv):
return {"resourceType": "Parameters",
"parameter": [{"name": k, **v} for k, v in kv.items()]}
def validate_code(self, system, code, display=None):
body = self._params(url={"valueUri": system}, code={"valueCode": code},
**({"display": {"valueString": display}} if display else {}))
out = requests.post(f"{self.base}/CodeSystem/$validate-code",
json=body, headers=self.h, timeout=15).json()
params = {p["name"]: p for p in out.get("parameter", [])}
return bool(params.get("result", {}).get("valueBoolean"))
# Ground an OpenMed span only if the code validates:
tx = TxClient("https://tx.example/fhir", token="...")
if tx.validate_code("http://snomed.info/sct", "44054006", "Diabetes mellitus type 2"):
from openmed.clinical.exporters.codeable_concept_simple import coding, codeable_concept
cc = codeable_concept([coding("snomed", "44054006",
"Diabetes mellitus type 2")], text=span.text)The system URIs here line up with OpenMed's system_uri
(snomed/loinc/rxnorm/icd-10-cm/hpo/mesh), so a validated code drops
straight into coding(...).
EntityPrediction.text (the span surface form) plus your
candidate code(s) are the input to $validate-code/$translate.coding(...) → codeable_concept(...) (exporting-to-fhir). If a span fails
validation, emit CodeableConcept with only text and flag it via
OperationOutcomeIssue(severity="warning", code="code-invalid", ...).tx.fhir.org only serves open content. Do not route
licensed lookups through a public server.$expand can be enormous. Always pass count (paginate with offset)
and filter; an unfiltered expand of a large hierarchy can time out.http://snomed.info/sct?fhir_vs=ecl/<expression>; other systems use
$expand with filter/property.version matters. SNOMED/LOINC editions change; pin the version
parameter for reproducible validation in CI.tx.fhir.org. It is a public service — only synthetic/coded
data.$validate-code: https://hl7.org/fhir/R4/valueset-operation-validate-code.html$expand: https://hl7.org/fhir/R4/valueset-operation-expand.html$lookup: https://hl7.org/fhir/R4/codesystem-operation-lookup.html$translate: https://hl7.org/fhir/R4/conceptmap-operation-translate.html80da98c
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.