dify/api/controllers/inner_api/agent/knowledge.py

56 lines
2.9 KiB
Python

"""Private authorization bridge for run-scoped, read-only Agent knowledge CLI."""
from dify_agent.protocol.knowledge_fs import KnowledgeFsError, KnowledgeFsPreparedRequest, KnowledgeFsPrepareRequest
from flask import request
from flask_restx import Resource
from pydantic import ValidationError
from controllers.common.schema import register_schema_models
from controllers.console.wraps import setup_required
from controllers.inner_api import inner_api_ns
from controllers.inner_api.wraps import plugin_inner_api_only
from services.agent.knowledge_gateway import AgentKnowledgeGateway
from services.agent_config_service import AgentConfigServiceError
from services.knowledge_fs.app_admission_service import KnowledgeFSAppAdmissionError
from services.knowledge_fs.product_authorization import KnowledgeFSProductNotFoundError
from services.knowledge_fs.product_remote import KnowledgeFSOperationUnavailableError
from services.knowledge_fs.query_images import KnowledgeFSQueryImageError
from services.knowledge_fs_capability import KnowledgeFSCapabilityConfigurationError, KnowledgeFSCapabilityPolicyError
register_schema_models(inner_api_ns, KnowledgeFsPrepareRequest, KnowledgeFsPreparedRequest)
@inner_api_ns.route("/agent/knowledge/prepare")
class AgentKnowledgePrepareApi(Resource):
@setup_required
@plugin_inner_api_only
@inner_api_ns.doc("inner_agent_knowledge_prepare")
@inner_api_ns.expect(inner_api_ns.models[KnowledgeFsPrepareRequest.__name__])
@inner_api_ns.response(200, "Private prepared command", inner_api_ns.models[KnowledgeFsPreparedRequest.__name__])
def post(self):
try:
payload = KnowledgeFsPrepareRequest.model_validate(request.get_json(silent=True) or {})
return AgentKnowledgeGateway().prepare(payload).model_dump(mode="json", exclude_none=True)
except ValidationError:
return {
"code": "KNOWLEDGE_INVALID_REQUEST",
"message": "Invalid knowledge command or execution context.",
}, 400
except KnowledgeFsError as exc:
return {"code": exc.code, "message": exc.message}, exc.status_code
except (
KnowledgeFSAppAdmissionError,
KnowledgeFSProductNotFoundError,
AgentConfigServiceError,
KnowledgeFSCapabilityPolicyError,
PermissionError,
):
return {"code": "KNOWLEDGE_ACCESS_DENIED", "message": "Knowledge access is unavailable or revoked."}, 403
except (KnowledgeFSOperationUnavailableError, KnowledgeFSCapabilityConfigurationError):
return {"code": "KNOWLEDGE_UNAVAILABLE", "message": "KnowledgeFS capability is unavailable."}, 503
except (KnowledgeFSQueryImageError, ValueError):
return {
"code": "KNOWLEDGE_INVALID_REQUEST",
"message": "Query image or knowledge reference is unavailable.",
}, 400