@@ -22,6 +22,16 @@ logger = logging.getLogger("devii.hub")
|
||||
SettingsBuilder = Callable[[str, str, str, bool], "tuple[Settings, Pricing]"]
|
||||
|
||||
|
||||
def _user_key_resolver(owner_id: str) -> Callable[[], str]:
|
||||
def resolve() -> str:
|
||||
if "users" not in db.tables:
|
||||
return ""
|
||||
row = db["users"].find_one(uid=owner_id, deleted_at=None)
|
||||
return (row or {}).get("api_key") or ""
|
||||
|
||||
return resolve
|
||||
|
||||
|
||||
class DeviiHub:
|
||||
def __init__(self, settings_builder: SettingsBuilder) -> None:
|
||||
self._build = settings_builder
|
||||
@@ -52,7 +62,10 @@ class DeviiHub:
|
||||
if session is not None:
|
||||
return session
|
||||
settings, pricing = self._build(api_key, base_url, owner_kind, is_admin)
|
||||
llm = LLMClient(settings)
|
||||
key_resolver = (
|
||||
_user_key_resolver(owner_id) if owner_kind == "user" else None
|
||||
)
|
||||
llm = LLMClient(settings, key_resolver=key_resolver)
|
||||
# Persistent, owner-isolated stores for signed-in users; ephemeral in-memory for guests.
|
||||
# The `docs` channel (Docii) is a self-contained documentation assistant: it gets its own
|
||||
# ephemeral stores so Devii's tasks, lessons, behavior and virtual tools never leak into it
|
||||
@@ -82,6 +95,7 @@ class DeviiHub:
|
||||
is_admin=is_admin,
|
||||
is_primary_admin=is_primary_admin,
|
||||
channel=channel,
|
||||
key_resolver=key_resolver,
|
||||
)
|
||||
if owner_kind == "user":
|
||||
saved = self._stores["conversations"].load(owner_kind, owner_id, channel)
|
||||
|
||||
Reference in New Issue
Block a user