from __future__ import annotations import os from pathlib import Path from dotenv import dotenv_values from huggingface_hub import HfApi ROOT = Path(__file__).resolve().parents[1] def env_value(values: dict[str, str | None], *names: str) -> str | None: for name in names: value = values.get(name) or os.getenv(name) if value: return value return None def main() -> None: values = dotenv_values(ROOT / ".env") token = env_value(values, "HF_TOKEN", "HF_Token", "HUGGINGFACE_TOKEN") if not token: raise SystemExit("Missing HF token. Add HF_TOKEN=... to .env and rerun this script.") api = HfApi(token=token) username = api.whoami()["name"] space_name = env_value(values, "HF_SPACE_NAME") or "agent-tina" repo_id = env_value(values, "HF_SPACE_ID") or f"{username}/{space_name}" openrouter_api_key = env_value(values, "OPENROUTER_API_KEY") if not openrouter_api_key: raise SystemExit("Missing OPENROUTER_API_KEY in .env.") openrouter_model = env_value(values, "OPENROUTER_MODEL") or "openai/gpt-oss-20b" correction_model = env_value(values, "OPENROUTER_CORRECTION_MODEL") or "openai/gpt-4o-mini" whisper_model = env_value(values, "WHISPER_MODEL") or "base" whisper_beam_size = env_value(values, "WHISPER_BEAM_SIZE") or "5" max_upload_mb = env_value(values, "MAX_UPLOAD_MB") or "250" app_base_url = env_value(values, "HF_APP_BASE_URL") or f"https://{repo_id.replace('/', '-').lower()}.hf.space" dataset_repo = env_value(values, "HF_DATASET_REPO") or f"{username}/agent-tina-meetings" api.create_repo( repo_id=repo_id, repo_type="space", space_sdk="docker", exist_ok=True, ) api.add_space_secret(repo_id=repo_id, key="OPENROUTER_API_KEY", value=openrouter_api_key) api.add_space_secret(repo_id=repo_id, key="HF_TOKEN", value=token) api.add_space_variable(repo_id=repo_id, key="OPENROUTER_MODEL", value=openrouter_model) api.add_space_variable(repo_id=repo_id, key="OPENROUTER_CORRECTION_MODEL", value=correction_model) api.add_space_variable(repo_id=repo_id, key="WHISPER_MODEL", value=whisper_model) api.add_space_variable(repo_id=repo_id, key="WHISPER_BEAM_SIZE", value=whisper_beam_size) api.add_space_variable(repo_id=repo_id, key="MAX_UPLOAD_MB", value=max_upload_mb) api.add_space_variable(repo_id=repo_id, key="APP_BASE_URL", value=app_base_url) api.add_space_variable(repo_id=repo_id, key="HF_DATASET_REPO", value=dataset_repo) api.create_repo( repo_id=dataset_repo, repo_type="dataset", private=True, exist_ok=True, ) api.update_repo_settings( repo_id=dataset_repo, repo_type="dataset", private=True, ) api.upload_folder( repo_id=repo_id, repo_type="space", folder_path=str(ROOT), commit_message="Deploy Agent Tina", ignore_patterns=[ ".env", ".venv/*", "**/__pycache__/**", ".cache/*", "data/*", "**/*.pyc", "sample.wav", ], ) print(f"Deployed to https://huggingface.co/spaces/{repo_id}") print(f"App URL: {app_base_url}") print(f"Dataset repo: https://huggingface.co/datasets/{dataset_repo}") if __name__ == "__main__": main()