Ejemplo 1: Codificación de diagnósticos y procedimientos
Caso de uso
Extraer códigos CIE-10 de diagnósticos y procedimientos de una nota clínica para generar el CMBD automáticamente.Texto de entrada (JSON)
Nota: La API acepta tanto texto plano como JSON stringificado. En este ejemplo enviamos un objeto JSON completo como string.Copiar
{
"informe_urgencias": {
"fecha": "19/10/2025",
"servicio": "Urgencias",
"paciente": {
"edad": 45,
"sexo": "Varón"
},
"motivo_consulta": "Fiebre y malestar general",
"antecedentes_personales": "No referidos de interés",
"enfermedad_actual": "Paciente masculino de 45 años que acude al servicio de urgencias por presentar fiebre alta de hasta 39 °C, tos seca y malestar general de tres días de evolución. Niega disnea intensa ni dolor torácico pleurítico.",
"exploracion_fisica": {
"constantes_vitales": {
"ta": "125/80 mmHg",
"fc": "92 lpm",
"fr": "20 rpm",
"temperatura": "39 °C",
"sato2": "95% basal"
},
"auscultacion_pulmonar": "Disminución del murmullo vesicular y crepitantes en base pulmonar derecha",
"resto": "Dentro de la normalidad"
},
"pruebas_complementarias": {
"radiografia_torax": "Infiltrado alveolar localizado en lóbulo inferior derecho compatible con neumonía lobar derecha"
},
"diagnostico": "Neumonía lobar derecha adquirida en la comunidad",
"tratamiento_urgencias": [
"Antitérmico oral",
"Primera dosis de antibiótico administrada en el servicio"
],
"tratamiento_alta": [
"Amoxicilina-clavulánico 875/125 mg cada 8 horas durante 7 días",
"Control evolutivo por su médico de atención primaria o reconsulta en urgencias ante empeoramiento clínico"
],
"evolucion": "Paciente estable hemodinámicamente, con mejoría parcial tras tratamiento sintomático en urgencias. Se decide alta con tratamiento y recomendaciones."
}
}
Esquema JSON
Ver archivo completoCopiar
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "diagnosis_and_procedures/v1",
"type": "object",
"required": ["diags", "procs"],
"properties": {
"diags": {
"type": "array",
"description": "List of diagnosis codes (CIE10)",
"items": {
"type": "string",
"source": "CIE-10-MC-ES-2026"
}
},
"procs": {
"type": "array",
"description": "List of procedure codes (CIE10-PCS)",
"items": {
"type": "string",
"source": "CIE-10-PCS-ES-2026"
}
}
}
}
Petición completa
Ver archivo completo Importante: Cuando envías JSON estructurado, debes convertirlo a string conJSON.stringify().
Copiar
import json
import requests
# El informe estructurado como JSON
informe_json = {
"informe_urgencias": {
"fecha": "19/10/2025",
"servicio": "Urgencias",
"paciente": {"edad": 45, "sexo": "Varón"},
"motivo_consulta": "Fiebre y malestar general",
"enfermedad_actual": "Paciente masculino de 45 años que acude al servicio de urgencias por presentar fiebre alta de hasta 39 °C, tos seca y malestar general de tres días de evolución.",
"exploracion_fisica": {
"constantes_vitales": {
"ta": "125/80 mmHg",
"fc": "92 lpm",
"temperatura": "39 °C"
},
"auscultacion_pulmonar": "Disminución del murmullo vesicular y crepitantes en base pulmonar derecha"
},
"pruebas_complementarias": {
"radiografia_torax": "Infiltrado alveolar compatible con neumonía lobar derecha"
},
"diagnostico": "Neumonía lobar derecha adquirida en la comunidad"
}
}
# Convertir el JSON a string para enviarlo como input
payload = {
"input": json.dumps(informe_json, ensure_ascii=False), # JSON stringificado
"json_schema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"required": ["diags", "procs"],
"properties": {
"diags": {
"type": "array",
"items": {"type": "string", "source": "CIE-10-MC-ES-2026"}
},
"procs": {
"type": "array",
"items": {"type": "string", "source": "CIE-10-PCS-ES-2026"}
}
}
},
"configure": "Codifica únicamente con códigos válidos. No inventes. Si hay duda, deja vacío.",
"target_language": "es-ES",
"metadata": {
"encounter_type": "emergency",
"site": "Urgencias Hospital General"
}
}
response = requests.post(
"https://{tu-endpoint}/v1/codify",
json=payload,
headers={
"Authorization": "Bearer TU_TOKEN",
"x-doctor": "dr_123",
"x-patient": "pt_456"
}
)
result = response.json()
print(f"Diagnósticos: {result['data']['diags']}")
print(f"Procedimientos: {result['data']['procs']}")
Respuesta
Ver archivo completoCopiar
{
"data": {
"diags": ["J18.1"],
"procs": ["0B9D0ZX"]
},
"run_id": "run_abc123"
}
- J18.1: Neumonía lobar, no especificada
- 0B9D0ZX: Drenaje de pleura derecha, vía percutánea, enfoque diagnóstico
Ejemplo 2: Extracción desde formato FHIR
Caso de uso
Procesar datos clínicos ya estructurados en formato FHIR (Fast Healthcare Interoperability Resources) y extraer códigos diagnósticos simplificados o información agregada. Nota: La API también puede recibir JSON FHIR como entrada para extraer/transformar información específica.Texto de entrada (Bundle FHIR como JSON)
Copiar
{
"resourceType": "Bundle",
"type": "collection",
"entry": [
{
"resource": {
"resourceType": "Patient",
"id": "patient-001",
"name": [
{
"family": "García",
"given": ["Ana", "María"]
}
],
"birthDate": "1978-03-15",
"gender": "female"
}
},
{
"resource": {
"resourceType": "Encounter",
"id": "encounter-001",
"status": "finished",
"class": {
"system": "http://terminology.hl7.org/CodeSystem/v3-ActCode",
"code": "AMB",
"display": "ambulatory"
},
"period": {
"start": "2025-10-19T10:00:00Z",
"end": "2025-10-19T10:30:00Z"
}
}
},
{
"resource": {
"resourceType": "Condition",
"id": "condition-diabetes",
"clinicalStatus": {
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/condition-clinical",
"code": "active"
}
]
},
"code": {
"coding": [
{
"system": "http://snomed.info/sct",
"code": "44054006",
"display": "Diabetes mellitus type 2"
},
{
"system": "http://hl7.org/fhir/sid/icd-10",
"code": "E11.9",
"display": "Diabetes mellitus tipo 2 sin complicaciones"
}
]
},
"subject": {
"reference": "Patient/patient-001"
}
}
},
{
"resource": {
"resourceType": "Condition",
"id": "condition-hta",
"clinicalStatus": {
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/condition-clinical",
"code": "active"
}
]
},
"code": {
"coding": [
{
"system": "http://snomed.info/sct",
"code": "38341003",
"display": "Hypertensive disorder"
},
{
"system": "http://hl7.org/fhir/sid/icd-10",
"code": "I10",
"display": "Hipertensión esencial (primaria)"
}
]
},
"subject": {
"reference": "Patient/patient-001"
}
}
},
{
"resource": {
"resourceType": "Observation",
"id": "obs-glucosa",
"status": "final",
"code": {
"coding": [
{
"system": "http://loinc.org",
"code": "2339-0",
"display": "Glucose [Mass/volume] in Blood"
}
]
},
"subject": {
"reference": "Patient/patient-001"
},
"effectiveDateTime": "2025-10-19T10:15:00Z",
"valueQuantity": {
"value": 185,
"unit": "mg/dL",
"system": "http://unitsofmeasure.org",
"code": "mg/dL"
},
"interpretation": [
{
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation",
"code": "H",
"display": "High"
}
]
}
]
}
}
]
}
Esquema JSON para extraer resumen
Copiar
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "fhir_extraction/v1",
"type": "object",
"required": ["paciente", "diagnosticos_activos", "observaciones_relevantes"],
"properties": {
"paciente": {
"type": "object",
"properties": {
"nombre_completo": {
"type": "string",
"description": "Nombre completo del paciente"
},
"edad": {
"type": "integer",
"description": "Edad calculada a partir de la fecha de nacimiento"
},
"sexo": {
"type": "string",
"enum": ["masculino", "femenino", "otro"]
}
}
},
"diagnosticos_activos": {
"type": "array",
"description": "Lista de diagnósticos activos con códigos CIE-10",
"items": {
"type": "object",
"properties": {
"codigo_cie10": {
"type": "string",
"source": "CIE-10-MC-ES-2026"
},
"descripcion": {
"type": "string"
}
}
}
},
"observaciones_relevantes": {
"type": "array",
"description": "Observaciones clínicas importantes",
"items": {
"type": "object",
"properties": {
"tipo": {
"type": "string",
"description": "Tipo de observación (laboratorio, constante vital, etc.)"
},
"nombre": {
"type": "string"
},
"valor": {
"type": "string"
},
"interpretacion": {
"type": "string",
"description": "Normal, Alto, Bajo, etc."
}
}
}
},
"resumen_clinico": {
"type": "string",
"description": "Resumen narrativo de la consulta"
}
}
}
Petición
Copiar
import json
import requests
# Bundle FHIR completo
fhir_bundle = {
"resourceType": "Bundle",
"type": "collection",
"entry": [
# ... (el bundle FHIR completo de arriba)
]
}
# Convertir FHIR a string
payload = {
"input": json.dumps(fhir_bundle, ensure_ascii=False), # FHIR stringificado
"json_schema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"required": ["paciente", "diagnosticos_activos"],
"properties": {
"paciente": {
"type": "object",
"properties": {
"nombre_completo": {"type": "string"},
"edad": {"type": "integer"},
"sexo": {"type": "string"}
}
},
"diagnosticos_activos": {
"type": "array",
"items": {
"type": "object",
"properties": {
"codigo_cie10": {
"type": "string",
"source": "CIE-10-MC-ES-2026"
},
"descripcion": {"type": "string"}
}
}
},
"observaciones_relevantes": {
"type": "array",
"items": {
"type": "object",
"properties": {
"tipo": {"type": "string"},
"nombre": {"type": "string"},
"valor": {"type": "string"},
"interpretacion": {"type": "string"}
}
}
},
"resumen_clinico": {"type": "string"}
}
},
"configure": "Extrae información del bundle FHIR y simplifica a formato legible. Mantén los códigos CIE-10 cuando estén disponibles.",
"target_language": "es-ES"
}
response = requests.post(
"https://{tu-endpoint}/v1/codify",
json=payload,
headers={
"Authorization": "Bearer TU_TOKEN",
"x-doctor": "dr_123",
"x-patient": "pt_001"
}
)
result = response.json()
print(json.dumps(result['data'], indent=2, ensure_ascii=False))
Respuesta
Copiar
{
"data": {
"paciente": {
"nombre_completo": "Ana María García",
"edad": 47,
"sexo": "femenino"
},
"diagnosticos_activos": [
{
"codigo_cie10": "E11.9",
"descripcion": "Diabetes mellitus tipo 2 sin complicaciones"
},
{
"codigo_cie10": "I10",
"descripcion": "Hipertensión esencial (primaria)"
}
],
"observaciones_relevantes": [
{
"tipo": "Laboratorio",
"nombre": "Glucosa en sangre",
"valor": "185 mg/dL",
"interpretacion": "Alto"
}
],
"resumen_clinico": "Paciente femenina de 47 años con diabetes mellitus tipo 2 e hipertensión esencial en seguimiento. Última glucemia elevada (185 mg/dL). Requiere ajuste de tratamiento."
},
"run_id": "run_fhir_extract_001"
}
- Simplificar bundles FHIR complejos a reportes legibles
- Extraer códigos específicos (CIE-10, SNOMED, LOINC) de recursos FHIR
- Generar resúmenes narrativos desde datos estructurados FHIR
- Convertir entre versiones de FHIR/HL7 o normalizar códigos
- Validar coherencia entre códigos SNOMED y CIE-10 en recursos FHIR
Ejemplo 3: Nota clínica estructurada
Caso de uso
Extraer campos estructurados de una consulta médica (motivo, enfermedad actual, plan de tratamiento, constantes vitales, etc.) para documentación automática del EHR.Texto de entrada
Copiar
Paciente femenina de 29 años con odinofagia, fiebre 38.5°C desde hace 2 días.
Exploración: placas amigdalares, adenopatías cervicales sensibles, sin exantema.
Tratamiento: ibuprofeno y reposo. Se sugiere test de antígeno.
Esquema JSON
Ver archivo completoCopiar
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "clinical_note/v1",
"type": "object",
"required": ["motivo_de_consulta", "enfermedad_actual", "plan_de_tratamientos"],
"properties": {
"dia_actual": {"type": "string"},
"proxima_cita": {"type": "string"},
"motivo_de_consulta": {"type": "string"},
"resumen": {"type": "string"},
"enfermedad_actual": {"type": "string"},
"comentarios_observaciones": {"type": "string"},
"plan_de_tratamientos": {"type": "string"},
"peticiones": {"type": "string"},
"constantes_vitales": {
"type": "array",
"items": {
"type": "object",
"properties": {
"nombre": {"type": "string"},
"valor": {"type": "string"},
"unidad": {"type": "string"},
"momento": {"type": "string", "format": "date-time"}
}
}
}
}
}
Petición
Ver archivo completoCopiar
import requests
payload = {
"input": """Paciente femenina de 29 años con odinofagia, fiebre 38.5°C desde hace 2 días.
Exploración: placas amigdalares, adenopatías cervicales sensibles, sin exantema.
Tratamiento: ibuprofeno y reposo. Se sugiere test de antígeno.""",
"json_schema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "clinical_note/v1",
"type": "object",
"required": ["motivo_de_consulta", "enfermedad_actual", "plan_de_tratamientos"],
"properties": {
"dia_actual": {"type": "string"},
"proxima_cita": {"type": "string"},
"motivo_de_consulta": {"type": "string"},
"resumen": {"type": "string"},
"enfermedad_actual": {"type": "string"},
"comentarios_observaciones": {"type": "string"},
"plan_de_tratamientos": {"type": "string"},
"peticiones": {"type": "string"},
"constantes_vitales": {
"type": "array",
"items": {
"type": "object",
"properties": {
"nombre": {"type": "string"},
"valor": {"type": "string"},
"unidad": {"type": "string"},
"momento": {"type": "string", "format": "date-time"}
}
}
}
}
},
"target_language": "es-ES"
}
response = requests.post(
"https://{tu-endpoint}/v1/codify",
json=payload,
headers={
"Authorization": "Bearer TU_TOKEN",
"x-doctor": "dr_234",
"x-patient": "pt_567"
}
)
result = response.json()
print(result['data'])
Respuesta
Ver archivo completoCopiar
{
"data": {
"dia_actual": "2025-10-19T09:45:00Z",
"proxima_cita": "",
"motivo_de_consulta": "Dolor de garganta y fiebre de 2 días",
"resumen": "Faringoamigdalitis probable; inicio de ibuprofeno, reposo e hidratación; considerar test de antígeno.",
"enfermedad_actual": "Dolor faríngeo, fiebre 38.5°C, odinofagia. Placas amigdalares, adenopatías cervicales.",
"comentarios_observaciones": "Buen estado general, sin exantema.",
"plan_de_tratamientos": "Ibuprofeno 400 mg cada 8h por 3 días; reposo; hidratación.",
"peticiones": "Test rápido de antígeno para estreptococo si disponible.",
"constantes_vitales": [
{
"nombre": "temperatura",
"valor": "38.5",
"unidad": "°C",
"momento": "2025-10-19T09:40:00Z"
}
]
},
"run_id": "run_def789"
}
Ejemplo 4: Extracción para registro de oncología
Caso de uso
Alimentar automáticamente un registro de oncología con datos extraídos de notas clínicas.Texto de entrada
Copiar
Paciente diagnosticada de adenocarcinoma de mama izquierda. Estadio T2N1M0
(estadio IIA). Receptores hormonales positivos (ER+, PR+), HER2 negativo.
Se inicia protocolo de quimioterapia neoadyuvante con AC-T (adriamicina,
ciclofosfamida seguido de taxanos). Programada cirugía conservadora tras
respuesta favorable a QT.
Esquema JSON
Copiar
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "registro_oncologia/v1",
"type": "object",
"required": ["diagnostico", "localizacion", "estadio_tnm"],
"properties": {
"diagnostico": {
"type": "string",
"description": "Diagnóstico histológico"
},
"codigo_cie10": {
"type": "string",
"source": "CIE-10-MC-ES-2026"
},
"localizacion": {
"type": "string",
"description": "Localización anatómica del tumor"
},
"estadio_tnm": {
"type": "object",
"properties": {
"t": {"type": "string"},
"n": {"type": "string"},
"m": {"type": "string"},
"estadio": {"type": "string"}
}
},
"biomarcadores": {
"type": "object",
"properties": {
"receptores_estrogenicos": {"type": "string"},
"receptores_progesterona": {"type": "string"},
"her2": {"type": "string"}
}
},
"tratamiento_planificado": {
"type": "string"
},
"protocolo_quimioterapia": {
"type": "string"
}
}
}
Respuesta esperada
Copiar
{
"data": {
"diagnostico": "Adenocarcinoma de mama",
"codigo_cie10": "C50.9",
"localizacion": "mama izquierda",
"estadio_tnm": {
"t": "T2",
"n": "N1",
"m": "M0",
"estadio": "IIA"
},
"biomarcadores": {
"receptores_estrogenicos": "positivo",
"receptores_progesterona": "positivo",
"her2": "negativo"
},
"tratamiento_planificado": "Quimioterapia neoadyuvante seguida de cirugía conservadora",
"protocolo_quimioterapia": "AC-T (adriamicina, ciclofosfamida seguido de taxanos)"
},
"run_id": "run_onco_001"
}
Petición
Copiar
import requests
payload = {
"input": """Paciente diagnosticada de adenocarcinoma de mama izquierda. Estadio T2N1M0
(estadio IIA). Receptores hormonales positivos (ER+, PR+), HER2 negativo.
Se inicia protocolo de quimioterapia neoadyuvante con AC-T (adriamicina,
ciclofosfamida seguido de taxanos). Programada cirugía conservadora tras
respuesta favorable a QT.""",
"json_schema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "registro_oncologia/v1",
"type": "object",
"required": ["diagnostico", "localizacion", "estadio_tnm"],
"properties": {
"diagnostico": {"type": "string"},
"codigo_cie10": {"type": "string", "source": "CIE-10-MC-ES-2026"},
"localizacion": {"type": "string"},
"estadio_tnm": {
"type": "object",
"properties": {
"t": {"type": "string"},
"n": {"type": "string"},
"m": {"type": "string"},
"estadio": {"type": "string"}
}
},
"biomarcadores": {
"type": "object",
"properties": {
"receptores_estrogenicos": {"type": "string"},
"receptores_progesterona": {"type": "string"},
"her2": {"type": "string"}
}
},
"tratamiento_planificado": {"type": "string"},
"protocolo_quimioterapia": {"type": "string"}
}
},
"target_language": "es-ES"
}
response = requests.post(
"https://{tu-endpoint}/v1/codify",
json=payload,
headers={
"Authorization": "Bearer TU_TOKEN",
"x-doctor": "dr_345",
"x-patient": "pt_678"
}
)
result = response.json()
print(result['data'])
Respuesta esperada
Copiar
{
"data": {
"diagnostico": "Adenocarcinoma de mama",
"codigo_cie10": "C50.9",
"localizacion": "mama izquierda",
"estadio_tnm": {
"t": "T2",
"n": "N1",
"m": "M0",
"estadio": "IIA"
},
"biomarcadores": {
"receptores_estrogenicos": "positivo",
"receptores_progesterona": "positivo",
"her2": "negativo"
},
"tratamiento_planificado": "Quimioterapia neoadyuvante seguida de cirugía conservadora",
"protocolo_quimioterapia": "AC-T (adriamicina, ciclofosfamida seguido de taxanos)"
},
"run_id": "run_onco_001"
}
Ejemplo 5: Extracción de medicación
Caso de uso
Extraer medicación prescrita con códigos del sistema de farmacia del hospital (Botplus).Texto de entrada
Copiar
Se prescribe enalapril 10 mg cada 12 horas vía oral, atorvastatina 20 mg
cada noche vía oral, y metformina 850 mg cada 8 horas con las comidas.
Continuar con AAS 100 mg en desayuno.
Esquema JSON con fuente custom
Copiar
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"medicamentos": {
"type": "array",
"items": {
"type": "object",
"properties": {
"nombre": {
"type": "string",
"description": "Nombre del medicamento"
},
"codigo_botplus": {
"type": "string",
"source": "BOTPLUS-2024",
"description": "Código Botplus del medicamento"
},
"dosis": {
"type": "string",
"description": "Dosis prescrita"
},
"frecuencia": {
"type": "string",
"description": "Frecuencia de administración"
},
"via": {
"type": "string",
"enum": ["oral", "iv", "im", "sc", "topica", "inhalada"],
"description": "Vía de administración"
},
"indicaciones_administracion": {
"type": "string",
"description": "Indicaciones especiales (ej: con comidas)"
}
}
}
}
}
}
Petición
Copiar
import requests
payload = {
"input": """Se prescribe enalapril 10 mg cada 12 horas vía oral, atorvastatina 20 mg
cada noche vía oral, y metformina 850 mg cada 8 horas con las comidas.
Continuar con AAS 100 mg en desayuno.""",
"json_schema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"medicamentos": {
"type": "array",
"items": {
"type": "object",
"properties": {
"nombre": {"type": "string"},
"codigo_botplus": {
"type": "string",
"source": "BOTPLUS-2024"
},
"dosis": {"type": "string"},
"frecuencia": {"type": "string"},
"via": {
"type": "string",
"enum": ["oral", "iv", "im", "sc", "topica", "inhalada"]
},
"indicaciones_administracion": {"type": "string"}
}
}
}
}
},
"configure": "Extrae todos los medicamentos con códigos Botplus exactos. No inventes códigos.",
"target_language": "es-ES"
}
response = requests.post(
"https://{tu-endpoint}/v1/codify",
json=payload,
headers={
"Authorization": "Bearer TU_TOKEN",
"x-doctor": "dr_456",
"x-patient": "pt_789"
}
)
result = response.json()
print(result['data'])
Respuesta esperada
Copiar
{
"data": {
"medicamentos": [
{
"nombre": "Enalapril",
"codigo_botplus": "652302",
"dosis": "10 mg",
"frecuencia": "cada 12 horas",
"via": "oral",
"indicaciones_administracion": ""
},
{
"nombre": "Atorvastatina",
"codigo_botplus": "663798",
"dosis": "20 mg",
"frecuencia": "cada noche",
"via": "oral",
"indicaciones_administracion": ""
},
{
"nombre": "Metformina",
"codigo_botplus": "651077",
"dosis": "850 mg",
"frecuencia": "cada 8 horas",
"via": "oral",
"indicaciones_administracion": "con las comidas"
},
{
"nombre": "Ácido acetilsalicílico",
"codigo_botplus": "651449",
"dosis": "100 mg",
"frecuencia": "cada 24 horas",
"via": "oral",
"indicaciones_administracion": "en desayuno"
}
]
},
"run_id": "run_med_001"
}
Ejemplo 6: Batch processing de múltiples notas
Caso de uso
Procesar múltiples notas clínicas en paralelo para generar CMBD de todos los episodios cerrados del día.Código Python
Copiar
import requests
import concurrent.futures
from typing import List, Dict
API_URL = "https://your-endpoint/v1/codify"
API_TOKEN = "your-token"
CMBD_SCHEMA = {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"required": ["diagnostico_principal", "procedimientos"],
"properties": {
"diagnostico_principal": {
"type": "string",
"source": "CIE-10-MC-ES-2026"
},
"diagnosticos_secundarios": {
"type": "array",
"items": {"type": "string", "source": "CIE-10-MC-ES-2026"}
},
"procedimientos": {
"type": "array",
"items": {"type": "string", "source": "CIE-10-PCS-ES-2026"}
}
}
}
def codify_note(note_data: Dict) -> Dict:
"""Codifica una nota clínica"""
headers = {
"Authorization": f"Bearer {API_TOKEN}",
"Content-Type": "application/json",
"x-doctor": note_data.get("doctor_id"),
"x-patient": note_data.get("patient_id")
}
payload = {
"input": note_data["text"],
"json_schema": CMBD_SCHEMA,
"target_language": "es-ES",
"metadata": {
"episode_id": note_data["episode_id"],
"idempotency_key": f"episode_{note_data['episode_id']}_cmbd"
}
}
response = requests.post(API_URL, json=payload, headers=headers, timeout=30)
response.raise_for_status()
result = response.json()
return {
"episode_id": note_data["episode_id"],
"cmbd": result["data"],
"run_id": result["run_id"]
}
def process_batch(notes: List[Dict], max_workers: int = 10) -> List[Dict]:
"""Procesa múltiples notas en paralelo"""
with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor:
futures = [executor.submit(codify_note, note) for note in notes]
results = []
for future in concurrent.futures.as_completed(futures):
try:
result = future.result()
results.append(result)
print(f"✅ Episodio {result['episode_id']} procesado")
except Exception as e:
print(f"❌ Error: {e}")
return results
# Uso
if __name__ == "__main__":
# Obtener notas pendientes de codificación
pending_notes = [
{
"episode_id": "EP001",
"text": "Paciente con IAM anterior...",
"doctor_id": "dr_123",
"patient_id": "pt_456"
},
{
"episode_id": "EP002",
"text": "Paciente con fractura de cadera...",
"doctor_id": "dr_124",
"patient_id": "pt_457"
},
# ... más notas
]
results = process_batch(pending_notes)
print(f"\n✅ Procesados {len(results)} episodios")
# Guardar en base de datos
for result in results:
save_cmbd_to_database(result["episode_id"], result["cmbd"])