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
Summary
batch_map_concepts_from_csvis broken on every input row. Since 67fc34a (expand find_omop_concept to return multiple candidate concepts with metadata),find_omop_conceptreturnsbut
batch_map_concepts_from_csvstill merges that dict directly into acsv.DictWriterrow whosefieldnameslist expects flat keys (concept_id,code,name,class,concept,validity,domain,vocab,url,reason).csv.DictWriterdefaults toextrasaction='raise', so the mergedcandidates/search_metadatakeys (or theerrorkey) trigger:The tool fails on the first row of any input CSV.
Location
omop_mcp/src/omop_mcp/server.py
Lines 179 to 208 in 001c91b
Repro
Fix
PR: #10