PlanOpticon
Merge pull request #22 from ConflictHQ/fix/diagram-result-ollama-compat fix(diagram): normalize elements and text_content from Ollama llava
Commit
d5108ce5a76dbdebe1716a779f9dcfe6da8fa271fb547f2a56fedcdf54017a21
Parent
c25da179e9e6e96…
1 file changed
+37
-2
| --- video_processor/analyzers/diagram_analyzer.py | ||
| +++ video_processor/analyzers/diagram_analyzer.py | ||
| @@ -210,18 +210,53 @@ | ||
| 210 | 210 | f"{src} -> {dst}: {label}" if label else f"{src} -> {dst}" |
| 211 | 211 | ) |
| 212 | 212 | else: |
| 213 | 213 | relationships.append(str(rel)) |
| 214 | 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 | + | |
| 215 | 250 | try: |
| 216 | 251 | dr = DiagramResult( |
| 217 | 252 | frame_index=i, |
| 218 | 253 | diagram_type=diagram_type, |
| 219 | 254 | confidence=confidence, |
| 220 | 255 | 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, | |
| 223 | 258 | relationships=relationships, |
| 224 | 259 | mermaid=analysis.get("mermaid"), |
| 225 | 260 | chart_data=analysis.get("chart_data"), |
| 226 | 261 | ) |
| 227 | 262 | except Exception as e: |
| 228 | 263 |
| --- 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 |