agent-api / start_hf.py
github-actions[bot]
Sync GitHub snapshot to Hugging Face
9a1014e
Raw
History Blame Contribute Delete
2.52 kB
from __future__ import annotations
import os
import sys
from datetime import datetime, timezone
from pathlib import Path
import chromadb
ROOT = Path(__file__).resolve().parent
CHROMA_PATH = ROOT / "chroma_db_docs"
CHROMA_COLLECTION = "document_context"
MODEL_PATH = ROOT / "MODELS" / "qwen3-4b-instruct-gguf"
def log(stage: str, message: str) -> None:
timestamp = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
print(f"[{timestamp}] [BOOT:{stage}] {message}", flush=True)
def require_environment() -> None:
missing = [name for name in ("DATABASE_URL",) if not os.getenv(name)]
if missing:
raise RuntimeError(f"Missing required Space secrets: {', '.join(missing)}")
log("ENV", "Required secrets are present (values are not printed).")
def validate_document_chroma() -> None:
database_path = CHROMA_PATH / "chroma.sqlite3"
if not database_path.is_file():
raise FileNotFoundError(f"Generated Chroma database was not found: {database_path}")
client = chromadb.PersistentClient(path=str(CHROMA_PATH))
collection = client.get_collection(CHROMA_COLLECTION)
item_count = collection.count()
if item_count == 0:
raise RuntimeError(f"Generated Chroma collection is empty: {CHROMA_COLLECTION}")
log("CHROMA", f"Using build-generated {CHROMA_COLLECTION} collection ({item_count} chunks).")
def validate_local_model() -> None:
required_files = ("model.gguf",)
missing = [name for name in required_files if not (MODEL_PATH / name).is_file()]
if missing:
raise FileNotFoundError(
f"Local Qwen model is incomplete at {MODEL_PATH}; missing: {', '.join(missing)}"
)
log("MODEL", f"Local Qwen model is available at {MODEL_PATH}.")
def start_api() -> None:
port = os.getenv("PORT", "7860")
log("API", f"Starting Agent API on 0.0.0.0:{port}...")
os.execv(
sys.executable,
[
sys.executable,
"-m",
"uvicorn",
"main:app",
"--host",
"0.0.0.0",
"--port",
port,
"--log-level",
"info",
"--access-log",
],
)
def main() -> None:
log("START", "Starting Hugging Face Space initialization.")
require_environment()
validate_document_chroma()
validate_local_model()
start_api()
if __name__ == "__main__":
try:
main()
except Exception as exc:
log("ERROR", f"Startup aborted: {exc}")
raise