Coverage for src / osiris_cli / profiles.py: 0%
41 statements
« prev ^ index » next coverage.py v7.13.0, created at 2025-12-31 05:01 +0200
« prev ^ index » next coverage.py v7.13.0, created at 2025-12-31 05:01 +0200
1import json
2from pathlib import Path
3from typing import Dict, Any, List
5from .config import CONFIG_DIR, Settings
7PROFILE_FILE = CONFIG_DIR / "profiles.json"
9PROFILE_FIELDS = [
10 "provider",
11 "provider_base_url",
12 "default_model",
13 "temperature",
14 "system_prompt",
15 "yolo_mode",
16 "reasoning_mode",
17 "safety_profile",
18 "offline_fallback",
19 "offline_provider",
20 "offline_model",
21]
24def _load_profiles() -> Dict[str, Any]:
25 if PROFILE_FILE.exists():
26 try:
27 return json.loads(PROFILE_FILE.read_text(encoding="utf-8"))
28 except Exception:
29 return {}
30 return {}
33def _save_profiles(data: Dict[str, Any]) -> None:
34 PROFILE_FILE.parent.mkdir(parents=True, exist_ok=True)
35 PROFILE_FILE.write_text(json.dumps(data, indent=2), encoding="utf-8")
38def list_profiles() -> List[str]:
39 return sorted(_load_profiles().keys())
42def save_profile(name: str, settings: Settings) -> None:
43 profiles = _load_profiles()
44 snapshot = {field: getattr(settings, field, None) for field in PROFILE_FIELDS}
45 profiles[name] = snapshot
46 _save_profiles(profiles)
49def load_profile(name: str, settings: Settings) -> bool:
50 profiles = _load_profiles()
51 if name not in profiles:
52 return False
53 snapshot = profiles[name]
54 for field, value in snapshot.items():
55 if hasattr(settings, field):
56 setattr(settings, field, value)
57 settings.apply_defaults()
58 settings.save()
59 return True
62def delete_profile(name: str) -> bool:
63 profiles = _load_profiles()
64 if name not in profiles:
65 return False
66 profiles.pop(name, None)
67 _save_profiles(profiles)
68 return True