import os import re import time from crewai import Agent, Crew, Task, Process, LLM from crewai.tools import BaseTool from pydantic import BaseModel, Field # ── Vision model selection ──────────────────────────────────────────────────── # Priority: GROQ_API_KEY → Groq vision # fallback → OpenRouter (google/gemini-2.0-flash-exp:free) GROQ_VISION_MODEL = "meta-llama/llama-4-scout-17b-16e-instruct" OR_VISION_MODEL = "google/gemini-2.0-flash-exp:free" # ── Text agent model pools (OpenRouter free) ────────────────────────────────── _FAST_MODELS = [ "openrouter/deepseek/deepseek-v4-flash:free", "openrouter/google/gemma-3-27b-it:free", "openrouter/meta-llama/llama-3.3-70b-instruct:free", ] _SMART_MODELS = [ "openrouter/qwen/qwen3-coder:free", "openrouter/google/gemini-2.0-flash-exp:free", "openrouter/deepseek/deepseek-v4-flash:free", ] FRAMEWORK_GUIDE = { "react": "React TypeScript (TSX). Default export `function ComponentName(): JSX.Element`. Tailwind CSS only.", "vue": "Vue 3 SFC with `