Skip to content

batch_map_concepts_from_csv raises ValueError on every row #9

Description

@hyun-hyang

Summary

batch_map_concepts_from_csv is broken on every input row. Since 67fc34a (expand find_omop_concept to return multiple candidate concepts with metadata), find_omop_concept returns

{"candidates": [...], "search_metadata": {...}}        # success
{"error": "..."}                                       # no results

but batch_map_concepts_from_csv still merges that dict directly into a csv.DictWriter row whose fieldnames list expects flat keys (concept_id, code, name, class, concept, validity, domain, vocab, url, reason).

csv.DictWriter defaults to extrasaction='raise', so the merged candidates / search_metadata keys (or the error key) trigger:

ValueError: dict contains fields not in fieldnames: 'candidates', 'search_metadata'

The tool fails on the first row of any input CSV.

Location

async def batch_map_concepts_from_csv(csv_path: str) -> str:
"""
Process a CSV file of keywords, mapping each row and returning a CSV with mapping results appended as new columns.
"""
output = io.StringIO()
with open(csv_path, newline="", encoding="utf-8") as infile:
reader = csv.DictReader(infile)
fieldnames = reader.fieldnames + [
"concept_id",
"code",
"name",
"class",
"concept",
"validity",
"domain",
"vocab",
"url",
"reason",
]
writer = csv.DictWriter(output, fieldnames=fieldnames)
writer.writeheader()
for row in reader:
keyword = row.get("keyword", "")
omop_field = row.get("omop_field", "")
omop_table = row.get("omop_table", "")
result = await find_omop_concept(keyword, omop_table, omop_field)
# Merge result into row
row.update(result)
writer.writerow(row)
return output.getvalue()

Repro

# input.csv
# keyword,omop_table,omop_field
# diabetes,condition_occurrence,condition_concept_id
import asyncio, csv, io
from omop_mcp.server import batch_map_concepts_from_csv
asyncio.run(batch_map_concepts_from_csv("input.csv"))
# ValueError: dict contains fields not in fieldnames: 'candidates', 'search_metadata'

Fix

PR: #10

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions