import quart from urllib.parse import unquote from ... import group @group.group_class('knowledge_engines', '/api/v1/knowledge/engines') class KnowledgeEnginesRouterGroup(group.RouterGroup): async def initialize(self) -> None: @self.route('', methods=['GET'], auth_type=group.AuthType.USER_TOKEN_OR_API_KEY) async def list_knowledge_engines() -> quart.Response: """List all available Knowledge Engines from plugins. Returns a list of Knowledge Engines with their capabilities and configuration schemas. This is used by the frontend to render the knowledge base creation wizard. """ engines = await self.ap.knowledge_service.list_knowledge_engines() return self.success(data={'engines': engines}) @self.route( '//creation-schema', methods=['GET'], auth_type=group.AuthType.USER_TOKEN_OR_API_KEY ) async def get_engine_creation_schema(plugin_id: str) -> quart.Response: """Get creation settings schema for a specific Knowledge Engine. plugin_id is in 'author/name' format, captured via converter. """ plugin_id = unquote(plugin_id) if '/' not in plugin_id: return self.http_status(400, -1, 'Invalid plugin_id format. Expected author/name.') schema = await self.ap.knowledge_service.get_engine_creation_schema(plugin_id) return self.success(data={'schema': schema}) @self.route( '//retrieval-schema', methods=['GET'], auth_type=group.AuthType.USER_TOKEN_OR_API_KEY ) async def get_engine_retrieval_schema(plugin_id: str) -> quart.Response: """Get retrieval settings schema for a specific Knowledge Engine. plugin_id is in 'author/name' format, captured via converter. """ plugin_id = unquote(plugin_id) if '/' not in plugin_id: return self.http_status(400, -1, 'Invalid plugin_id format. Expected author/name.') schema = await self.ap.knowledge_service.get_engine_retrieval_schema(plugin_id) return self.success(data={'schema': schema})