mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-08-09 12:40:59 +00:00
fix: use per-bot admins for command events (#2359)
* fix: use per-bot admins for command events * style: format rerank provider changes --------- Co-authored-by: dadachann <185672915+dadachann@users.noreply.github.com>
This commit is contained in:
@@ -234,9 +234,7 @@ class ModelProviderService:
|
|||||||
embedding_models = await self.ap.embedding_models_service.get_embedding_models_by_provider(provider_uuid)
|
embedding_models = await self.ap.embedding_models_service.get_embedding_models_by_provider(provider_uuid)
|
||||||
rerank_service = getattr(self.ap, 'rerank_models_service', None)
|
rerank_service = getattr(self.ap, 'rerank_models_service', None)
|
||||||
rerank_models = (
|
rerank_models = (
|
||||||
await rerank_service.get_rerank_models_by_provider(provider_uuid)
|
await rerank_service.get_rerank_models_by_provider(provider_uuid) if rerank_service is not None else []
|
||||||
if rerank_service is not None
|
|
||||||
else []
|
|
||||||
)
|
)
|
||||||
existing_llm_names = {model['name'] for model in llm_models}
|
existing_llm_names = {model['name'] for model in llm_models}
|
||||||
existing_embedding_names = {model['name'] for model in embedding_models}
|
existing_embedding_names = {model['name'] for model in embedding_models}
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
import typing
|
import typing
|
||||||
|
|
||||||
|
import sqlalchemy
|
||||||
|
|
||||||
from .. import handler
|
from .. import handler
|
||||||
from ... import entities
|
from ... import entities
|
||||||
from ... import plugin_diagnostics
|
from ... import plugin_diagnostics
|
||||||
|
from ....entity.persistence.bot import BotAdmin
|
||||||
import langbot_plugin.api.entities.builtin.provider.message as provider_message
|
import langbot_plugin.api.entities.builtin.provider.message as provider_message
|
||||||
import langbot_plugin.api.entities.builtin.provider.session as provider_session
|
import langbot_plugin.api.entities.builtin.provider.session as provider_session
|
||||||
import langbot_plugin.api.entities.builtin.pipeline.query as pipeline_query
|
import langbot_plugin.api.entities.builtin.pipeline.query as pipeline_query
|
||||||
@@ -24,7 +26,14 @@ class CommandHandler(handler.MessageHandler):
|
|||||||
|
|
||||||
privilege = 1
|
privilege = 1
|
||||||
|
|
||||||
if f'{query.launcher_type.value}_{query.launcher_id}' in self.ap.instance_config.data['admins']:
|
admins = await self.ap.persistence_mgr.execute_async(
|
||||||
|
sqlalchemy.select(BotAdmin).where(
|
||||||
|
BotAdmin.bot_uuid == (query.bot_uuid or ''),
|
||||||
|
BotAdmin.launcher_type == query.launcher_type.value,
|
||||||
|
BotAdmin.launcher_id == str(query.launcher_id),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
if admins.first() is not None:
|
||||||
privilege = 2
|
privilege = 2
|
||||||
|
|
||||||
spt = command_text.split(' ')
|
spt = command_text.split(' ')
|
||||||
|
|||||||
@@ -193,9 +193,7 @@ class ModelManager:
|
|||||||
existing_embedding_models = {
|
existing_embedding_models = {
|
||||||
m['uuid']: m for m in await self.ap.embedding_models_service.get_embedding_models()
|
m['uuid']: m for m in await self.ap.embedding_models_service.get_embedding_models()
|
||||||
}
|
}
|
||||||
existing_rerank_models = {
|
existing_rerank_models = {m['uuid']: m for m in await self.ap.rerank_models_service.get_rerank_models()}
|
||||||
m['uuid']: m for m in await self.ap.rerank_models_service.get_rerank_models()
|
|
||||||
}
|
|
||||||
|
|
||||||
created = 0
|
created = 0
|
||||||
updated = 0
|
updated = 0
|
||||||
|
|||||||
@@ -158,17 +158,21 @@ class TestCommandHandlerReal:
|
|||||||
|
|
||||||
@pytest.mark.asyncio
|
@pytest.mark.asyncio
|
||||||
async def test_admin_privilege_check(self, fake_app, mock_event_ctx, mock_execute_factory):
|
async def test_admin_privilege_check(self, fake_app, mock_event_ctx, mock_execute_factory):
|
||||||
"""Admin users get privilege level 2."""
|
"""A per-bot admin from the database is marked as admin in command events."""
|
||||||
from langbot_plugin.api.entities.builtin.provider.session import LauncherTypes
|
from langbot_plugin.api.entities.builtin.provider.session import LauncherTypes
|
||||||
|
|
||||||
command = get_command_handler()
|
command = get_command_handler()
|
||||||
|
|
||||||
fake_app.instance_config.data = {'admins': ['person_12345']}
|
admin_result = Mock()
|
||||||
|
admin_result.first.return_value = Mock()
|
||||||
|
fake_app.persistence_mgr.execute_async = AsyncMock(return_value=admin_result)
|
||||||
|
fake_app.instance_config.data = {}
|
||||||
fake_app.plugin_connector.emit_event = AsyncMock(return_value=mock_event_ctx)
|
fake_app.plugin_connector.emit_event = AsyncMock(return_value=mock_event_ctx)
|
||||||
fake_app.cmd_mgr.execute = mock_execute_factory()
|
fake_app.cmd_mgr.execute = mock_execute_factory()
|
||||||
|
|
||||||
handler = command.CommandHandler(fake_app)
|
handler = command.CommandHandler(fake_app)
|
||||||
query = command_query('status')
|
query = command_query('status')
|
||||||
|
query.bot_uuid = 'bot-1'
|
||||||
query.launcher_type = LauncherTypes.PERSON
|
query.launcher_type = LauncherTypes.PERSON
|
||||||
query.launcher_id = 12345
|
query.launcher_id = 12345
|
||||||
|
|
||||||
@@ -176,23 +180,28 @@ class TestCommandHandlerReal:
|
|||||||
async for result in handler.handle(query):
|
async for result in handler.handle(query):
|
||||||
results.append(result)
|
results.append(result)
|
||||||
|
|
||||||
|
fake_app.persistence_mgr.execute_async.assert_awaited_once()
|
||||||
call_args = fake_app.plugin_connector.emit_event.call_args
|
call_args = fake_app.plugin_connector.emit_event.call_args
|
||||||
event = call_args[0][0]
|
event = call_args[0][0]
|
||||||
assert event.is_admin is True
|
assert event.is_admin is True
|
||||||
|
|
||||||
@pytest.mark.asyncio
|
@pytest.mark.asyncio
|
||||||
async def test_non_admin_privilege_check(self, fake_app, mock_event_ctx, mock_execute_factory):
|
async def test_non_admin_privilege_check(self, fake_app, mock_event_ctx, mock_execute_factory):
|
||||||
"""Non-admin users get privilege level 1."""
|
"""A launcher absent from the per-bot admin table is not an admin."""
|
||||||
from langbot_plugin.api.entities.builtin.provider.session import LauncherTypes
|
from langbot_plugin.api.entities.builtin.provider.session import LauncherTypes
|
||||||
|
|
||||||
command = get_command_handler()
|
command = get_command_handler()
|
||||||
|
|
||||||
fake_app.instance_config.data = {'admins': ['person_12345']}
|
admin_result = Mock()
|
||||||
|
admin_result.first.return_value = None
|
||||||
|
fake_app.persistence_mgr.execute_async = AsyncMock(return_value=admin_result)
|
||||||
|
fake_app.instance_config.data = {}
|
||||||
fake_app.plugin_connector.emit_event = AsyncMock(return_value=mock_event_ctx)
|
fake_app.plugin_connector.emit_event = AsyncMock(return_value=mock_event_ctx)
|
||||||
fake_app.cmd_mgr.execute = mock_execute_factory()
|
fake_app.cmd_mgr.execute = mock_execute_factory()
|
||||||
|
|
||||||
handler = command.CommandHandler(fake_app)
|
handler = command.CommandHandler(fake_app)
|
||||||
query = command_query('status')
|
query = command_query('status')
|
||||||
|
query.bot_uuid = 'bot-1'
|
||||||
query.launcher_type = LauncherTypes.PERSON
|
query.launcher_type = LauncherTypes.PERSON
|
||||||
query.launcher_id = 67890
|
query.launcher_id = 67890
|
||||||
|
|
||||||
@@ -200,6 +209,7 @@ class TestCommandHandlerReal:
|
|||||||
async for result in handler.handle(query):
|
async for result in handler.handle(query):
|
||||||
results.append(result)
|
results.append(result)
|
||||||
|
|
||||||
|
fake_app.persistence_mgr.execute_async.assert_awaited_once()
|
||||||
call_args = fake_app.plugin_connector.emit_event.call_args
|
call_args = fake_app.plugin_connector.emit_event.call_args
|
||||||
event = call_args[0][0]
|
event = call_args[0][0]
|
||||||
assert event.is_admin is False
|
assert event.is_admin is False
|
||||||
|
|||||||
Reference in New Issue
Block a user