| """Shared configuration for the initial mock MVP.""" |
|
|
| import os |
| from collections.abc import Mapping |
| from dataclasses import dataclass |
| from pathlib import Path |
|
|
|
|
| APP_TITLE = "Objectverse Diary" |
| APP_SUBTITLE = "Every object has a secret life. / 每个物品都有秘密人生。" |
| APP_VERSION = "0.1.0-mock" |
|
|
| PERSONALITY_MODES = [ |
| "Cynical", |
| "Dramatic", |
| "Lonely", |
| "Philosopher", |
| "Romantic", |
| ] |
|
|
| DEFAULT_MODE = "Cynical" |
|
|
|
|
| @dataclass(frozen=True) |
| class RuntimeSettings: |
| vision_backend: str |
| text_backend: str |
| text_model_path: str |
| text_model_repo_id: str |
| text_model_filename: str |
| text_model_revision: str |
| vision_model_id: str |
| trace_output_dir: Path |
|
|
|
|
| def get_runtime_settings(environ: Mapping[str, str] | None = None) -> RuntimeSettings: |
| env = os.environ if environ is None else environ |
| return RuntimeSettings( |
| vision_backend=env.get("OBJECTVERSE_VISION_BACKEND", "mock"), |
| text_backend=env.get("OBJECTVERSE_TEXT_BACKEND", "mock"), |
| text_model_path=env.get("TEXT_MODEL_PATH", ""), |
| text_model_repo_id=env.get("TEXT_MODEL_REPO_ID", ""), |
| text_model_filename=env.get("TEXT_MODEL_FILENAME", ""), |
| text_model_revision=env.get("TEXT_MODEL_REVISION", ""), |
| vision_model_id=env.get("VISION_MODEL_ID", ""), |
| trace_output_dir=Path(env.get("TRACE_OUTPUT_DIR", "data/traces")), |
| ) |
|
|
|
|
| def runtime_status(settings: RuntimeSettings | None = None) -> dict[str, str]: |
| current = settings or get_runtime_settings() |
| vision_backend = current.vision_backend.strip().lower() |
| text_backend = current.text_backend.strip().lower() |
| vision = ( |
| "mock object understanding" |
| if vision_backend == "mock" |
| else f"{vision_backend} object understanding" |
| ) |
| text = "mock persona and diary generation" |
| if text_backend in {"llama-cpp", "llama_cpp", "llamacpp"}: |
| text = "llama-cpp text generation" |
| elif text_backend != "mock": |
| text = f"{text_backend} text generation" |
| runtime_parts: list[str] = [] |
| if vision_backend != "mock": |
| runtime_parts.append(f"vision model id: {current.vision_model_id or '[not configured]'}") |
| if text_backend == "mock": |
| runtime_parts.append("no llama.cpp model connected yet") |
| else: |
| runtime_parts.append(f"text model source: {_text_model_source_status(current)}") |
| runtime = "; ".join(runtime_parts) |
| return {"vision": vision, "text": text, "runtime": runtime} |
|
|
|
|
| def _text_model_source_status(settings: RuntimeSettings) -> str: |
| if settings.text_model_path.strip(): |
| return "[configured external GGUF]" |
| repo_id = settings.text_model_repo_id.strip() |
| filename = settings.text_model_filename.strip() |
| if repo_id and filename: |
| revision = settings.text_model_revision.strip() |
| suffix = f"@{revision}" if revision else "" |
| return f"Hub GGUF: {repo_id}/{filename}{suffix}" |
| return "[not configured]" |
|
|
|
|
| SETTINGS = get_runtime_settings() |
| TRACE_DIR = SETTINGS.trace_output_dir |
| MODEL_RUNTIME_STATUS = runtime_status(SETTINGS) |
|
|