Agent Skillsmaziyarpanahi/openmed › coding-icd10

coding-icd10

GitHub

为OpenMed提取的诊疗实体提供ICD-10-CM/PCS编码建议及依据,辅助认证编码员审核。支持按章节路由、ICD-9转ICD-10(GEMs)及预填病历。基于CMS公开数据或FHIR接口,非自动计费工具。

skills/coding-icd10/SKILL.md maziyarpanahi/openmed

Trigger Scenarios

诊断列表编码 将诊断映射到可计费代码 查找正确章节范围 通过GEMs进行ICD-9转换 预填就诊诊断供编码员审核

Install

npx skills add maziyarpanahi/openmed --skill coding-icd10 -g -y
More Options

Use without installing

npx skills use maziyarpanahi/openmed@coding-icd10

指定 Agent (Claude Code)

npx skills add maziyarpanahi/openmed --skill coding-icd10 -a claude-code -g -y

安装 repo 全部 skill

npx skills add maziyarpanahi/openmed --all -g -y

预览 repo 内 skill

npx skills add maziyarpanahi/openmed --list

SKILL.md

Frontmatter
{
    "name": "coding-icd10",
    "license": "Apache-2.0",
    "metadata": {
        "pairs": "after",
        "project": "OpenMed",
        "version": "1.0",
        "category": "terminology-coding"
    },
    "description": "Suggests candidate ICD-10-CM diagnosis codes (and ICD-10-PCS procedure codes) for diagnoses and procedures extracted by OpenMed, with rationale and a human-coder caveat. Use when the user wants to code a problem list, map a diagnosis span to a billable ICD-10-CM code, route a finding to the right chapter, cross-walk ICD-9 via GEMs, or pre-fill an encounter for coder review. Trigger keywords: ICD-10-CM, ICD-10-PCS, diagnosis coding, billable code, GEMs, problem list coding, encounter diagnosis, chapter range, CMS code lookup. references\/icd10-chapters.md holds the chapter\/section ranges. Pairs after OpenMed NER: consume Disease\/Pathology entities from openmed.analyze_text and propose codes a certified coder validates. ICD-10-CM\/PCS files are public domain from CMS — no license barrier (unlike CPT, which is restricted and out of scope)."
}

Coding OpenMed diagnoses to ICD-10-CM / PCS

Suggest ICD-10-CM diagnosis codes (and ICD-10-PCS for inpatient procedures) for the diagnosis and procedure spans OpenMed extracts. This is decision support for a certified coder, not autonomous billing: OpenMed + this skill narrow the candidate set and explain why; a human validates the final, billable code.

ICD-10-CM and ICD-10-PCS are public domain. CMS publishes the complete annual code files, addenda, and indexes for free. (CPT/HCPCS procedure codes are AMA-licensed and restricted — out of scope here; obtain those separately under the user's own AMA license.)

When to use

  • A note yields diagnoses ("type 2 diabetes with diabetic CKD", "community- acquired pneumonia") and you want candidate ICD-10-CM codes plus rationale.
  • You need to route a span to the right chapter quickly (see references/icd10-chapters.md for code ranges).
  • You hold legacy ICD-9 codes and need an approximate GEM cross-walk.
  • You are pre-filling encounter diagnoses for a coder's review queue.

For clinical-meaning codes use mapping-to-snomed; for HCC/risk capture use coding-hcc-risk-adjustment; this skill is for the ICD-10 classification.

Quick start (public data + public FHIR lookup)

Two complementary paths, both license-clean:

A) CMS files, loaded locally (public domain; you download once):

# CMS publishes the order/addenda file; load the code->description table.
# Columns: code (no dot), description; you insert the dot for display.
icd10cm = {}                       # "E1122" -> "Type 2 diabetes mellitus with diabetic chronic kidney disease"
with open("icd10cm_order_2025.txt", encoding="latin-1") as fh:
    for line in fh:
        code = line[6:13].strip()
        billable = line[14] == "1"     # '1' = valid billable code
        long_desc = line[77:].strip()
        if billable:
            icd10cm[code] = long_desc

def search_local(term: str, limit: int = 5):
    t = term.lower()
    hits = [(c, d) for c, d in icd10cm.items() if t in d.lower()]
    return sorted(hits, key=lambda cd: len(cd[1]))[:limit]

B) A FHIR terminology server that hosts ICD-10-CM (public servers exist; e.g. an NLM Clinical Tables endpoint or your own HAPI/Ontoserver):

import requests

# NLM Clinical Tables (public, no key) — ICD-10-CM autocomplete/search:
def search_icd10cm(term: str, count: int = 7):
    r = requests.get(
        "https://clinicaltables.nlm.nih.gov/api/icd10cm/v3/search",
        params={"sf": "code,name", "terms": term, "maxList": count}, timeout=10,
    )
    r.raise_for_status()
    _total, codes, _extra, display = r.json()
    return list(zip(codes, [d[1] for d in display]))   # [(code, name), ...]

print(search_icd10cm("type 2 diabetes nephropathy"))

Workflow

  1. Extract diagnosis/procedure spans with OpenMed (Disease/Pathology models).
  2. Route to a chapter using the span's clinical theme and references/icd10-chapters.md (e.g. endocrine → E00–E89, circulatory → I00–I99). This shrinks the search space and catches obvious mis-hits.
  3. Search the code text (local CMS table or the NLM API) for candidates.
  4. Apply ICD-10-CM specificity rules in your rationale: laterality, acute/chronic, episode of care, "with"/"due to" combination codes, and "code first / use additional code" notes. Flag where the note lacks the detail a billable code requires.
  5. Rank candidates; present the top few with rationale and the missing- detail caveat, not a single auto-selected code.
  6. Emit {system: "http://hl7.org/fhir/sid/icd-10-cm", code, display} marked status: needs-coder-review, with OpenMed source offsets.

Hand-off from OpenMed

openmed.analyze_text(..., output_format="dict") returns entities, each a dict with text, label, confidence, start, end. Consume Disease/Pathology spans:

import openmed

note = "Assessment: type 2 diabetes with diabetic nephropathy; CAP."
result = openmed.analyze_text(
    note,
    model_name="disease_detection_superclinical",   # Disease category
    output_format="dict",
)

DX_LABELS = {"DISEASE", "CONDITION", "PATHOLOGY"}
for ent in result["entities"]:
    if ent["label"] in DX_LABELS:
        candidates = search_icd10cm(ent["text"], count=5)
        print(ent["text"], ent["start"], ent["end"],
              f"(conf {ent['confidence']:.2f}) ->", candidates)
        # surface as SUGGESTIONS for a coder — never auto-bill

Keep OpenMed's start/end offsets next to each suggested code so the coder can jump to the exact supporting text. Store offsets and codes only — never the raw note in your suggestion log.

Edge cases & gotchas

  • Human-in-the-loop is mandatory. ICD-10-CM coding has legal/financial weight. Output candidates with rationale; a certified coder assigns the final billable code. Never present a suggestion as an authorized claim.
  • Specificity & unspecified codes. Many billable codes demand laterality, episode, or "with" detail the note may not state. Prefer flagging "documentation insufficient for a specific code" over forcing an .9/unspecified code.
  • Combination codes. ICD-10-CM bundles related conditions (e.g. E11.22 = diabetes with diabetic CKD). Don't emit two separate codes where one combination code is required; let the search surface combinations.
  • "Code first" / "use additional code" / Excludes1/Excludes2 sequencing notes change which codes coexist. Carry these as rationale for the coder.
  • GEMs are approximate. ICD-9↔ICD-10 General Equivalence Mappings are many-to-many and lossy; treat a GEM result as a starting hint, not a billable mapping.
  • Annual updates. Codes change every fiscal year (Oct 1). Pin the file year you loaded and refresh annually; record which version produced a suggestion.
  • Licensing. ICD-10-CM/PCS are public domain (CMS). Do not pull in CPT or proprietary code maps that require an AMA/other license — those stay user-supplied and out-of-process.
  • Local-first. OpenMed NER runs on-device; if you query the NLM API, send only the de-identified diagnosis string. No PHI over the wire.

Standards & references

Version History

  • f213557 Current 2026-07-23 00:43

Same Skill Collection

skills/building-with-openmed/SKILL.md
skills/loading-openmed-models/SKILL.md
skills/annotating-variants/SKILL.md
skills/assembling-fhir-bundles/SKILL.md
skills/auditing-deid-leakage/SKILL.md
skills/auditing-deidentification-runs/SKILL.md
skills/auditing-part11-trails/SKILL.md
skills/auditing-safe-harbor-checklist/SKILL.md
skills/auditing-subgroup-fairness/SKILL.md
skills/authoring-model-cards/SKILL.md
skills/batch-processing-clinical-text/SKILL.md
skills/benchmarking-clinical-ner/SKILL.md
skills/bridging-presidio-and-spacy/SKILL.md
skills/building-gold-corpus/SKILL.md
skills/building-patient-timelines/SKILL.md
skills/checking-hipaa-compliance/SKILL.md
skills/choosing-openmed-models/SKILL.md
skills/coding-hcc-risk-adjustment/SKILL.md
skills/computing-ecqms/SKILL.md
skills/configuring-privacy-policies/SKILL.md
skills/defining-cohort-phenotypes/SKILL.md
skills/deidentifying-clinical-text/SKILL.md
skills/deidentifying-multilingual-text/SKILL.md
skills/deploying-openmed-mcp/SKILL.md
skills/detecting-pv-signals/SKILL.md
skills/enforcing-nophi-logging/SKILL.md
skills/etl-to-omop-cdm/SKILL.md
skills/evaluating-with-leakage-gates/SKILL.md
skills/exporting-bulk-fhir/SKILL.md
skills/exporting-to-fhir/SKILL.md
skills/extracting-clinical-entities/SKILL.md
skills/extracting-dicom-metadata/SKILL.md
skills/extracting-lab-tables/SKILL.md
skills/extracting-pii-entities/SKILL.md
skills/extracting-sdoh/SKILL.md
skills/fetching-fhir-resources/SKILL.md
skills/gating-deid-leakage/SKILL.md
skills/generating-synthea-data/SKILL.md
skills/generating-synthetic-surrogates/SKILL.md
skills/ingesting-clinical-documents/SKILL.md
skills/linking-umls-concepts/SKILL.md
skills/mapping-loinc/SKILL.md
skills/mapping-to-snomed/SKILL.md
skills/mining-pubmed-literature/SKILL.md
skills/normalizing-rxnorm/SKILL.md
skills/parsing-ccda-documents/SKILL.md
skills/parsing-hl7v2-messages/SKILL.md
skills/parsing-lab-values/SKILL.md
skills/parsing-trial-eligibility/SKILL.md

Metadata

Files
0
Version
f213557
Hash
96ee40c0
Indexed
2026-07-23 00:43

ホーム - Wiki
Copyright © 2011-2026 iteam. Current version is 2.155.2. UTC+08:00, 2026-07-29 13:11
浙ICP备14020137号-1 $お客様$