ec436095dd
Book-CI / test (macos-latest) (push) Waiting to run
Deploy / deploy (macos-latest) (push) Waiting to run
Deploy / deploy (ubuntu-latest) (push) Waiting to run
Deploy / deploy (windows-latest) (push) Waiting to run
Release to PyPI / Build & publish sglang-kt (push) Waiting to run
Release to PyPI / Build kt-kernel (Python 3.11) (push) Waiting to run
Release to PyPI / Build kt-kernel (Python 3.12) (push) Waiting to run
Release to PyPI / Publish kt-kernel to PyPI (push) Blocked by required conditions
Book-CI / test (ubuntu-latest) (push) Waiting to run
Book-CI / test (windows-latest) (push) Waiting to run
Release Fake Tag / publish (push) Waiting to run
112 lines
3.3 KiB
Python
112 lines
3.3 KiB
Python
"""
|
|
Configuration save/load for kt run command.
|
|
|
|
Manages saved run configurations bound to specific models.
|
|
"""
|
|
|
|
from pathlib import Path
|
|
from typing import Dict, List, Optional, Any
|
|
from datetime import datetime
|
|
import yaml
|
|
|
|
|
|
CONFIG_FILE = Path.home() / ".ktransformers" / "run_configs.yaml"
|
|
|
|
|
|
class RunConfigManager:
|
|
"""Manager for saved run configurations."""
|
|
|
|
def __init__(self):
|
|
self.config_file = CONFIG_FILE
|
|
self._ensure_config_file()
|
|
|
|
def _ensure_config_file(self):
|
|
"""Ensure config file exists."""
|
|
if not self.config_file.exists():
|
|
self.config_file.parent.mkdir(parents=True, exist_ok=True)
|
|
self._save_data({"version": "1.0", "configs": {}})
|
|
|
|
def _load_data(self) -> Dict:
|
|
"""Load raw config data."""
|
|
try:
|
|
with open(self.config_file, "r", encoding="utf-8") as f:
|
|
return yaml.safe_load(f) or {"version": "1.0", "configs": {}}
|
|
except Exception:
|
|
return {"version": "1.0", "configs": {}}
|
|
|
|
def _save_data(self, data: Dict):
|
|
"""Save raw config data."""
|
|
with open(self.config_file, "w", encoding="utf-8") as f:
|
|
yaml.dump(data, f, allow_unicode=True, default_flow_style=False)
|
|
|
|
def list_configs(self, model_id: str) -> List[Dict[str, Any]]:
|
|
"""List all saved configs for a model.
|
|
|
|
Returns:
|
|
List of config dicts with 'config_name' and other fields.
|
|
"""
|
|
data = self._load_data()
|
|
configs = data.get("configs", {}).get(model_id, [])
|
|
return configs if isinstance(configs, list) else []
|
|
|
|
def save_config(self, model_id: str, config: Dict[str, Any]):
|
|
"""Save a configuration for a model.
|
|
|
|
Args:
|
|
model_id: Model ID to bind config to
|
|
config: Configuration dict with all run parameters
|
|
"""
|
|
data = self._load_data()
|
|
|
|
if "configs" not in data:
|
|
data["configs"] = {}
|
|
|
|
if model_id not in data["configs"]:
|
|
data["configs"][model_id] = []
|
|
|
|
# Add timestamp
|
|
config["created_at"] = datetime.now().isoformat()
|
|
|
|
# Append config
|
|
data["configs"][model_id].append(config)
|
|
|
|
self._save_data(data)
|
|
|
|
def delete_config(self, model_id: str, config_index: int) -> bool:
|
|
"""Delete a saved configuration.
|
|
|
|
Args:
|
|
model_id: Model ID
|
|
config_index: Index of config to delete (0-based)
|
|
|
|
Returns:
|
|
True if deleted, False if not found
|
|
"""
|
|
data = self._load_data()
|
|
|
|
if model_id not in data.get("configs", {}):
|
|
return False
|
|
|
|
configs = data["configs"][model_id]
|
|
if config_index < 0 or config_index >= len(configs):
|
|
return False
|
|
|
|
configs.pop(config_index)
|
|
self._save_data(data)
|
|
return True
|
|
|
|
def get_config(self, model_id: str, config_index: int) -> Optional[Dict[str, Any]]:
|
|
"""Get a specific saved configuration.
|
|
|
|
Args:
|
|
model_id: Model ID
|
|
config_index: Index of config to get (0-based)
|
|
|
|
Returns:
|
|
Config dict or None if not found
|
|
"""
|
|
configs = self.list_configs(model_id)
|
|
if config_index < 0 or config_index >= len(configs):
|
|
return None
|
|
return configs[config_index]
|