Saltar al contenido principal
Esta página contiene ejemplos completos de uso de la API para diferentes casos de uso clínicos.

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.
{
  "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 completo
{
  "$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 con JSON.stringify().
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 completo
{
  "data": {
    "diags": ["J18.1"],
    "procs": ["0B9D0ZX"]
  },
  "run_id": "run_abc123"
}
Interpretación:
  • 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)

{
  "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

{
  "$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

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

{
  "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"
}
Casos de uso con FHIR:
  • 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

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 completo
{
  "$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 completo
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 completo
{
  "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

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

{
  "$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

{
  "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

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

{
  "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

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

{
  "$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

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

{
  "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

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"])

Próximos pasos