PlanOpticon

Merge pull request #22 from ConflictHQ/fix/diagram-result-ollama-compat fix(diagram): normalize elements and text_content from Ollama llava

noreply 2026-02-18 11:48 trunk merge
Commit d5108ce5a76dbdebe1716a779f9dcfe6da8fa271fb547f2a56fedcdf54017a21
--- video_processor/analyzers/diagram_analyzer.py
+++ video_processor/analyzers/diagram_analyzer.py
@@ -210,18 +210,53 @@
210210
f"{src} -> {dst}: {label}" if label else f"{src} -> {dst}"
211211
)
212212
else:
213213
relationships.append(str(rel))
214214
215
+ # Normalize elements: llava may return dicts or nested lists
216
+ raw_elements = analysis.get("elements") or []
217
+ elements = []
218
+ for elem in raw_elements:
219
+ if isinstance(elem, str):
220
+ elements.append(elem)
221
+ elif isinstance(elem, dict):
222
+ name = elem.get("name", elem.get("element", ""))
223
+ etype = elem.get("type", elem.get("element_type", ""))
224
+ if name and etype:
225
+ elements.append(f"{etype}: {name}")
226
+ elif name:
227
+ elements.append(name)
228
+ else:
229
+ elements.append(json.dumps(elem))
230
+ elif isinstance(elem, list):
231
+ elements.extend(str(e) for e in elem)
232
+ else:
233
+ elements.append(str(elem))
234
+
235
+ # Normalize text_content: llava may return dict instead of string
236
+ raw_text = analysis.get("text_content")
237
+ if isinstance(raw_text, dict):
238
+ parts = []
239
+ for k, v in raw_text.items():
240
+ if isinstance(v, list):
241
+ parts.append(f"{k}: {', '.join(str(x) for x in v)}")
242
+ else:
243
+ parts.append(f"{k}: {v}")
244
+ text_content = "\n".join(parts)
245
+ elif isinstance(raw_text, list):
246
+ text_content = "\n".join(str(x) for x in raw_text)
247
+ else:
248
+ text_content = raw_text
249
+
215250
try:
216251
dr = DiagramResult(
217252
frame_index=i,
218253
diagram_type=diagram_type,
219254
confidence=confidence,
220255
description=analysis.get("description"),
221
- text_content=analysis.get("text_content"),
222
- elements=analysis.get("elements") or [],
256
+ text_content=text_content,
257
+ elements=elements,
223258
relationships=relationships,
224259
mermaid=analysis.get("mermaid"),
225260
chart_data=analysis.get("chart_data"),
226261
)
227262
except Exception as e:
228263
--- video_processor/analyzers/diagram_analyzer.py
+++ video_processor/analyzers/diagram_analyzer.py
@@ -210,18 +210,53 @@
210 f"{src} -> {dst}: {label}" if label else f"{src} -> {dst}"
211 )
212 else:
213 relationships.append(str(rel))
214
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
215 try:
216 dr = DiagramResult(
217 frame_index=i,
218 diagram_type=diagram_type,
219 confidence=confidence,
220 description=analysis.get("description"),
221 text_content=analysis.get("text_content"),
222 elements=analysis.get("elements") or [],
223 relationships=relationships,
224 mermaid=analysis.get("mermaid"),
225 chart_data=analysis.get("chart_data"),
226 )
227 except Exception as e:
228
--- video_processor/analyzers/diagram_analyzer.py
+++ video_processor/analyzers/diagram_analyzer.py
@@ -210,18 +210,53 @@
210 f"{src} -> {dst}: {label}" if label else f"{src} -> {dst}"
211 )
212 else:
213 relationships.append(str(rel))
214
215 # Normalize elements: llava may return dicts or nested lists
216 raw_elements = analysis.get("elements") or []
217 elements = []
218 for elem in raw_elements:
219 if isinstance(elem, str):
220 elements.append(elem)
221 elif isinstance(elem, dict):
222 name = elem.get("name", elem.get("element", ""))
223 etype = elem.get("type", elem.get("element_type", ""))
224 if name and etype:
225 elements.append(f"{etype}: {name}")
226 elif name:
227 elements.append(name)
228 else:
229 elements.append(json.dumps(elem))
230 elif isinstance(elem, list):
231 elements.extend(str(e) for e in elem)
232 else:
233 elements.append(str(elem))
234
235 # Normalize text_content: llava may return dict instead of string
236 raw_text = analysis.get("text_content")
237 if isinstance(raw_text, dict):
238 parts = []
239 for k, v in raw_text.items():
240 if isinstance(v, list):
241 parts.append(f"{k}: {', '.join(str(x) for x in v)}")
242 else:
243 parts.append(f"{k}: {v}")
244 text_content = "\n".join(parts)
245 elif isinstance(raw_text, list):
246 text_content = "\n".join(str(x) for x in raw_text)
247 else:
248 text_content = raw_text
249
250 try:
251 dr = DiagramResult(
252 frame_index=i,
253 diagram_type=diagram_type,
254 confidence=confidence,
255 description=analysis.get("description"),
256 text_content=text_content,
257 elements=elements,
258 relationships=relationships,
259 mermaid=analysis.get("mermaid"),
260 chart_data=analysis.get("chart_data"),
261 )
262 except Exception as e:
263

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button