diff --git a/trulymem_entry.py b/trulymem_entry.py index 4060352..c121eba 100644 --- a/trulymem_entry.py +++ b/trulymem_entry.py @@ -13,13 +13,21 @@ os.chdir(application_path) from core import BackendServer from ui import GraphMemoryApp +from ui.services.config_service import ConfigService def main(): - backend_server = BackendServer(db_path="graph_memory.db", use_embedded_db=True) - backend_server.start(api_key="", base_url="https://api.deepseek.com") + # 配置文件保存在应用根目录(exe同级目录或源码根目录) + config_file = application_path / "config.json" - app = GraphMemoryApp(backend_server=backend_server) + # 加载配置 + config_service = ConfigService(config_file=config_file) + config = config_service.get_config() + + backend_server = BackendServer(db_path="graph_memory.db", use_embedded_db=True) + backend_server.start(api_key=config.api_key, base_url=config.base_url) + + app = GraphMemoryApp(backend_server=backend_server, config_service=config_service) try: app.run() diff --git a/ui/app.py b/ui/app.py index 77e92f5..2cd4a0f 100644 --- a/ui/app.py +++ b/ui/app.py @@ -5,6 +5,7 @@ from textual.binding import Binding from core import BackendServer, BackendClient from .models.message import Message +from .services.config_service import ConfigService class GraphMemoryApp(App): @@ -22,18 +23,24 @@ class GraphMemoryApp(App): Binding("f6", "quit", "退出"), ] - def __init__(self, backend_server: BackendServer = None, **kwargs): + def __init__(self, backend_server: BackendServer = None, config_service: ConfigService = None, **kwargs): super().__init__(**kwargs) self._backend_server = backend_server self._backend_client = BackendClient(backend_server) if backend_server else None + self._config_service = config_service self._api_configured = False def compose(self) -> ComposeResult: from .widgets.left_panel import LeftPanel from .widgets.right_panel import RightPanel from .widgets.status_bar import StatusBar + from .models.config import AppConfig + + # 获取初始配置 + initial_config = self._config_service.get_config() if self._config_service else AppConfig() + yield LeftPanel() - yield RightPanel() + yield RightPanel(config=initial_config) yield StatusBar() def on_mount(self) -> None: @@ -137,17 +144,18 @@ class GraphMemoryApp(App): return config = event.config - api_key = config.api_key - base_url = config.base_url # 异步更新配置,避免阻塞UI - asyncio.create_task(self._update_config_async(api_key, base_url)) + asyncio.create_task(self._update_config_async(config)) - async def _update_config_async(self, api_key: str, base_url: str) -> None: + async def _update_config_async(self, config) -> None: """异步更新配置""" from .widgets.status_bar import StatusBar status_bar = self.query_one(StatusBar) + api_key = config.api_key + base_url = config.base_url + try: result = await asyncio.get_event_loop().run_in_executor( None, @@ -157,6 +165,11 @@ class GraphMemoryApp(App): if result.get("success"): self._api_configured = bool(api_key) status_bar.set_api_status(self._api_configured) + + # 保存配置到文件(使用完整的config对象,保留model字段) + if self._config_service: + self._config_service.set_config(config) + self.notify("✅ 配置已保存并生效", title="配置成功", severity="information") else: error = result.get("error", "未知错误")