diff --git a/ltx_director.py b/ltx_director.py index 1f89b8d..f9fb690 100644 --- a/ltx_director.py +++ b/ltx_director.py @@ -477,6 +477,30 @@ def _extract_ollama_generated_text(resp_json: dict) -> str: return max(cleaned_candidates, key=len) +def _collect_ollama_text_candidates(resp_json: dict) -> list[str]: + if not isinstance(resp_json, dict): + return [] + + candidates = [resp_json.get("response"), resp_json.get("content"), resp_json.get("thinking")] + message = resp_json.get("message") + if isinstance(message, dict): + candidates.extend([ + message.get("content"), + message.get("reasoning_content"), + message.get("thinking"), + ]) + + cleaned = [] + for candidate in candidates: + if isinstance(candidate, str): + text = candidate.strip() + if "" in text: + text = text.split("")[-1].strip() + if text: + cleaned.append(text) + return cleaned + + def _analysis_text_is_usable(text: str) -> bool: text = (text or "").strip() if not text: @@ -555,6 +579,7 @@ async def analyze_character_endpoint(request): try: async with aiohttp.ClientSession() as session: if provider == "ollama": + debug_candidates = [] analysis_images = cleaned_b64_list payload = { "model": model_name, @@ -578,11 +603,13 @@ async def analyze_character_endpoint(request): retry_err = await retry_response.text() return web.json_response({"status": "error", "message": f"Ollama HTTP {retry_response.status}: {retry_err}"}) resp_json = await retry_response.json() + debug_candidates.extend(_collect_ollama_text_candidates(resp_json)) generated_text = _extract_ollama_generated_text(resp_json) else: return web.json_response({"status": "error", "message": f"Ollama HTTP {response.status}: {err_txt}"}) else: resp_json = await response.json() + debug_candidates.extend(_collect_ollama_text_candidates(resp_json)) generated_text = _extract_ollama_generated_text(resp_json) if not _analysis_text_is_usable(generated_text): @@ -603,9 +630,17 @@ async def analyze_character_endpoint(request): async with session.post(f"{base_url}/api/chat", json=chat_payload, timeout=300) as response: if response.status == 200: resp_json = await response.json() + debug_candidates.extend(_collect_ollama_text_candidates(resp_json)) chat_text = _extract_ollama_generated_text(resp_json) if _analysis_text_is_usable(chat_text): generated_text = chat_text + if not _analysis_text_is_usable(generated_text): + return web.json_response({ + "status": "error", + "message": "Ollama returned only a truncated analysis response.", + "debug_candidates": debug_candidates, + "description": generated_text, + }) else: # OpenAI-compatible vision chat (LM Studio / Custom). content = [{"type": "text", "text": _ANALYZE_PROMPT}]