Fix: clip_range source dynamic from LLM result instead of hardcoded 'claude'

Diagnoza:
- analyze.py je zgodovinsko imel samo Claude support
- ko se je dodal Gemini, je clip_range.source ostal hardcoded 'claude'
- prav tako log 'Whisper segmenti zamenjani s Claude' in 'Generated SRT from Claude'
- API rezultat je v jobu kazal source='claude' tudi ko je dejansko bil uporabljen Gemini
- to je samo COSMETIC bug — funkcionalno je vse delovalo pravilno
- Gemini se DEJANSKO klical (potrjeno: '🤖 Gemini (gemini-3.1-pro-preview) izbral: 172.5-201.8s')
  in vrnil pravilen rezultat — samo logging je rekel napačno

Popravki:
1. clip_range['source'] = claude_result['source'] (dejansko 'gemini:...' ali 'claude:...')
2. clip_range['reason'] prefix iz hardcoded 'claude_llm:' v dinamičen '{source}:'
3. Log 'Whisper segmenti zamenjani s Claude' → 'z {llm_label}'
4. Log 'Claude je popravil jezik' → 'LLM je popravil'
5. main.py 'Generated SRT from Claude' → 'from {llm_src}'

Test (Zlati Muzikanti - Le prijatelja bodiva, valček, 246s):
✓ Gemini dejansko izbere refren (172.5-201.8s)
✓ Whisper detektira sl (p=0.97 across 3 samples)
✓ Vseh 18 segmentov popravljenih
✓ Pipeline end-to-end deluje

Backward compat:
- transcript['claude_corrected'] in srt_from_claude variable name ohranjena
  ker že obstajajo v starih job state fajlih
This commit is contained in:
OpenClaw Agent 2026-04-29 09:49:58 +00:00
parent e350352883
commit 0ca33be6ac
2 changed files with 15 additions and 9 deletions

View File

@ -267,7 +267,8 @@ def process_job(job_id):
srt_path_out,
)
srt_from_claude = str(srt_path_out)
print(f"📝 Generated SRT from Claude transcript: {srt_path_out}")
llm_src = cr.get("source", "LLM")
print(f"📝 Generated SRT from {llm_src} transcript: {srt_path_out}")
except Exception as e:
print(f"⚠️ SRT generation failed: {e}")

View File

@ -830,18 +830,22 @@ def main():
),
}
# 6. Clip range — Claude ima prednost, sicer smart_clip_range fallback
# 6. Clip range — LLM (Claude/Gemini) ima prednost, sicer smart_clip_range fallback.
# POMEMBNO: spremenljivka se zgodovinsko imenuje claude_result, dejansko pa vsebuje
# rezultat KATEREGA KOLI LLM-ja (Claude ali Gemini) — glej analyze_with_llm().
# llm_source npr. "claude:claude-sonnet-4-6" ali "gemini:gemini-3.1-pro-preview".
if claude_result:
llm_source = claude_result.get("source", "llm")
clip_range = {
"start": claude_result["start"],
"end": claude_result["end"],
"duration": claude_result["duration"],
"reason": "claude_llm: " + claude_result.get("reason", ""),
"reason": f"{llm_source}: " + claude_result.get("reason", ""),
"chorus_text": claude_result.get("chorus_text", ""),
"structure": claude_result.get("structure", ""),
"source": "claude",
"source": llm_source,
}
# Apply max_duration cap če Claude pretirava
# Apply max_duration cap če LLM pretirava
if clip_range["duration"] > args.max_duration:
clip_range["end"] = clip_range["start"] + args.max_duration
clip_range["duration"] = args.max_duration
@ -891,12 +895,13 @@ def main():
"words": orig.get("words", []) if orig else [],
})
transcript["segments"] = new_segments
transcript["claude_corrected"] = True
# Posodobi tudi jezik če Claude je drugačnega mnenja
transcript["claude_corrected"] = True # ohranimo ime ključa zaradi backward compat
# Posodobi tudi jezik če LLM je drugačnega mnenja
if claude_result.get("language") and claude_result["language"] != transcript["language"]:
print(f" ✏️ Claude je popravil jezik: {transcript['language']}{claude_result['language']}", file=sys.stderr)
print(f" ✏️ LLM je popravil jezik: {transcript['language']}{claude_result['language']}", file=sys.stderr)
transcript["language"] = claude_result["language"]
print(f" ✏️ Whisper segmenti zamenjani s Claude popravljenimi ({len(new_segments)})", file=sys.stderr)
llm_label = claude_result.get("source", "LLM")
print(f" ✏️ Whisper segmenti zamenjani z {llm_label} popravljenimi ({len(new_segments)})", file=sys.stderr)
# 7. Fade params (lahko razširi clip end če konča sredi vokala)
fade = detect_audio_fade(clip_range, transcript, video_duration=duration)