From de8a7df6c2e19cd8082044048185378a035b7e2e Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Mon, 29 Dec 2025 00:35:31 +0800 Subject: [PATCH] feat: implement instance ID management and integrate with OAuth token exchange --- src/langbot/pkg/api/http/service/user.py | 4 +++- src/langbot/pkg/core/app.py | 2 ++ src/langbot/pkg/core/stages/load_config.py | 19 +++++++++++++++++++ src/langbot/pkg/utils/constants.py | 2 ++ 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/langbot/pkg/api/http/service/user.py b/src/langbot/pkg/api/http/service/user.py index 4db1e013..3996caad 100644 --- a/src/langbot/pkg/api/http/service/user.py +++ b/src/langbot/pkg/api/http/service/user.py @@ -145,13 +145,15 @@ class UserService: async def exchange_space_oauth_code(self, code: str) -> typing.Dict: """Exchange OAuth authorization code for tokens""" + from langbot.pkg.utils import constants + space_config = self._get_space_config() space_url = space_config['url'] async with aiohttp.ClientSession() as session: async with session.post( f'{space_url}/api/v1/accounts/oauth/token', - json={'code': code}, + json={'code': code, 'instance_id': constants.instance_id}, ) as response: if response.status != 200: raise ValueError(f'Failed to exchange OAuth code: {await response.text()}') diff --git a/src/langbot/pkg/core/app.py b/src/langbot/pkg/core/app.py index 38f93daa..1397f233 100644 --- a/src/langbot/pkg/core/app.py +++ b/src/langbot/pkg/core/app.py @@ -76,6 +76,8 @@ class Application: instance_config: config_mgr.ConfigManager = None + instance_id: config_mgr.ConfigManager = None # used to identify the instance + # ======= Metadata config manager ======= sensitive_meta: config_mgr.ConfigManager = None diff --git a/src/langbot/pkg/core/stages/load_config.py b/src/langbot/pkg/core/stages/load_config.py index b2b5abba..ccf816bd 100644 --- a/src/langbot/pkg/core/stages/load_config.py +++ b/src/langbot/pkg/core/stages/load_config.py @@ -2,8 +2,11 @@ from __future__ import annotations import os from typing import Any +from langbot.pkg.utils import constants import yaml import importlib.resources as resources +import uuid +import time from .. import stage, app from ..bootutils import config @@ -142,6 +145,22 @@ class LoadConfigStage(stage.BootingStage): await ap.instance_config.dump_config() + # load or generate instance id + ap.instance_id = await config.load_json_config( + 'data/labels/instance_id.json', + template_data={ + 'instance_id': f'instance_{str(uuid.uuid4())}', + 'instance_create_ts': int(time.time()), + }, + completion=False, + ) + + constants.instance_id = ap.instance_id.data['instance_id'] + + print(f'LangBot instance id: {constants.instance_id}') + + await ap.instance_id.dump_config() + ap.sensitive_meta = await config.load_json_config( 'data/metadata/sensitive-words.json', 'metadata/sensitive-words.json', diff --git a/src/langbot/pkg/utils/constants.py b/src/langbot/pkg/utils/constants.py index a82d578c..1bb088a6 100644 --- a/src/langbot/pkg/utils/constants.py +++ b/src/langbot/pkg/utils/constants.py @@ -8,3 +8,5 @@ required_database_version = 16 debug_mode = False edition = 'community' + +instance_id = ''