Add Ollama backend + Qwen3 local inference support

- Extractor now supports two backends: ollama (local) and anthropic (cloud)
- Default is ollama with qwen3:14b (fits 16GB VRAM)
- Set num_ctx to 32768 for full-script processing
- Added --backend and --ollama-url CLI flags
- Added The Last Backup test script
- Tested: 12/12 scenes valid on dialogue_heavy, 12/13 on the_last_backup

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-06 16:28:53 -07:00
co-authored by Claude Opus 4.6
parent 87d0af0748
commit 74870f7c0d
5 changed files with 548 additions and 35 deletions
+15 -9
View File
@@ -14,7 +14,9 @@ def main():
parser = argparse.ArgumentParser(description="AI Movie Production Pipeline — Phase 1")
parser.add_argument("--script", type=str, help="Path to .fountain script file")
parser.add_argument("--project", type=str, help="Project name (determines output directory)")
parser.add_argument("--model", type=str, default="claude-sonnet-4-20250514", help="Model ID")
parser.add_argument("--model", type=str, default="qwen3:14b", help="Model ID (default: qwen3:14b)")
parser.add_argument("--backend", type=str, default="ollama", choices=["ollama", "anthropic"], help="AI backend (default: ollama)")
parser.add_argument("--ollama-url", type=str, default="http://localhost:11434", help="Ollama server URL")
parser.add_argument("--scene", type=int, default=None, help="Process only this scene number")
parser.add_argument("--dry-run", action="store_true", help="Validate inputs only, no AI calls")
parser.add_argument("--force", action="store_true", help="Ignore cache, re-run even if unchanged")
@@ -24,14 +26,14 @@ def main():
args = parser.parse_args()
if args.test:
run_tests(args.model, args.output_dir)
run_tests(args.model, args.backend, args.ollama_url, args.output_dir)
return
if not args.script or not args.project:
parser.error("--script and --project are required (unless using --test)")
api_key = os.environ.get("ANTHROPIC_API_KEY")
if not api_key and not args.dry_run:
api_key = os.environ.get("ANTHROPIC_API_KEY", "")
if args.backend == "anthropic" and not api_key and not args.dry_run:
print("ERROR: ANTHROPIC_API_KEY not set. Set it in .env or environment.")
sys.exit(1)
@@ -44,8 +46,10 @@ def main():
result = run_phase1(
script_path=args.script,
project_name=args.project,
api_key=api_key or "",
api_key=api_key,
model=args.model,
backend=args.backend,
ollama_url=args.ollama_url,
output_dir=args.output_dir,
scene_filter=args.scene,
dry_run=args.dry_run,
@@ -60,11 +64,11 @@ def main():
sys.exit(0)
def run_tests(model: str, output_dir: str):
def run_tests(model: str, backend: str, ollama_url: str, output_dir: str):
"""Run test suite against all scripts in test_scripts/."""
api_key = os.environ.get("ANTHROPIC_API_KEY")
if not api_key:
print("ERROR: ANTHROPIC_API_KEY required for tests")
api_key = os.environ.get("ANTHROPIC_API_KEY", "")
if backend == "anthropic" and not api_key:
print("ERROR: ANTHROPIC_API_KEY required for anthropic backend tests")
sys.exit(1)
test_dir = os.path.join(os.path.dirname(__file__), "test_scripts")
@@ -93,6 +97,8 @@ def run_tests(model: str, output_dir: str):
project_name=project_name,
api_key=api_key,
model=model,
backend=backend,
ollama_url=ollama_url,
output_dir=output_dir,
)