feat: add datasource support to PluginDeclaration and PluginCategory

This commit is contained in:
Yeuoly 2025-05-26 17:32:25 +08:00
parent 678d6ffe2b
commit 83ca7f8deb
8 changed files with 19 additions and 26 deletions

View File

@ -2,17 +2,18 @@ import logging
from datetime import UTC, datetime from datetime import UTC, datetime
from typing import Optional from typing import Optional
from flask_login import current_user
import requests import requests
from flask import current_app, redirect, request from flask import current_app, redirect, request
from flask_login import current_user
from flask_restful import Resource from flask_restful import Resource
from sqlalchemy import select from sqlalchemy import select
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from werkzeug.exceptions import Unauthorized, Forbidden, NotFound from werkzeug.exceptions import Forbidden, NotFound, Unauthorized
from configs import dify_config from configs import dify_config
from constants.languages import languages from constants.languages import languages
from controllers.console.wraps import account_initialization_required, setup_required from controllers.console.wraps import account_initialization_required, setup_required
from core.plugin.impl.oauth import OAuthHandler
from events.tenant_event import tenant_was_created from events.tenant_event import tenant_was_created
from extensions.ext_database import db from extensions.ext_database import db
from libs.helper import extract_remote_ip from libs.helper import extract_remote_ip
@ -25,7 +26,7 @@ from services.account_service import AccountService, RegisterService, TenantServ
from services.errors.account import AccountNotFoundError, AccountRegisterError from services.errors.account import AccountNotFoundError, AccountRegisterError
from services.errors.workspace import WorkSpaceNotAllowedCreateError, WorkSpaceNotFoundError from services.errors.workspace import WorkSpaceNotAllowedCreateError, WorkSpaceNotFoundError
from services.feature_service import FeatureService from services.feature_service import FeatureService
from core.plugin.impl.oauth import OAuthHandler
from .. import api from .. import api

View File

@ -1,24 +1,15 @@
from typing import cast
from flask_login import current_user # type: ignore from flask_login import current_user # type: ignore
from flask_restful import Resource, marshal_with, reqparse # type: ignore from flask_restful import Resource # type: ignore
from sqlalchemy.orm import Session
from werkzeug.exceptions import Forbidden from werkzeug.exceptions import Forbidden
from controllers.console import api from controllers.console import api
from controllers.console.datasets.wraps import get_rag_pipeline
from controllers.console.wraps import ( from controllers.console.wraps import (
account_initialization_required, account_initialization_required,
setup_required, setup_required,
) )
from core.plugin.impl.datasource import PluginDatasourceManager from core.plugin.impl.datasource import PluginDatasourceManager
from extensions.ext_database import db
from fields.rag_pipeline_fields import pipeline_import_check_dependencies_fields, pipeline_import_fields
from libs.login import login_required from libs.login import login_required
from models import Account
from models.dataset import Pipeline
from services.app_dsl_service import ImportStatus
from services.rag_pipeline.rag_pipeline_dsl_service import RagPipelineDslService
class DatasourcePluginOauthApi(Resource): class DatasourcePluginOauthApi(Resource):

View File

@ -30,7 +30,7 @@ from core.rag.index_processor.constant.built_in_field import BuiltInField
from core.repositories import SQLAlchemyWorkflowNodeExecutionRepository from core.repositories import SQLAlchemyWorkflowNodeExecutionRepository
from core.workflow.repository.workflow_node_execution_repository import WorkflowNodeExecutionRepository from core.workflow.repository.workflow_node_execution_repository import WorkflowNodeExecutionRepository
from extensions.ext_database import db from extensions.ext_database import db
from models import Account, App, EndUser, Workflow, WorkflowNodeExecutionTriggeredFrom from models import Account, EndUser, Workflow, WorkflowNodeExecutionTriggeredFrom
from models.dataset import Document, Pipeline from models.dataset import Document, Pipeline
from models.model import AppMode from models.model import AppMode
from services.dataset_service import DocumentService from services.dataset_service import DocumentService

View File

@ -10,7 +10,11 @@ class WebsiteCrawlDatasourcePluginProviderController(DatasourcePluginProviderCon
plugin_unique_identifier: str plugin_unique_identifier: str
def __init__( def __init__(
self, entity: DatasourceProviderEntityWithPlugin | None, plugin_id: str, plugin_unique_identifier: str, tenant_id: str self,
entity: DatasourceProviderEntityWithPlugin | None,
plugin_id: str,
plugin_unique_identifier: str,
tenant_id: str,
) -> None: ) -> None:
super().__init__(entity, tenant_id) super().__init__(entity, tenant_id)
self.plugin_id = plugin_id self.plugin_id = plugin_id

View File

@ -8,6 +8,7 @@ from pydantic import BaseModel, Field, model_validator
from werkzeug.exceptions import NotFound from werkzeug.exceptions import NotFound
from core.agent.plugin_entities import AgentStrategyProviderEntity from core.agent.plugin_entities import AgentStrategyProviderEntity
from core.datasource.entities.datasource_entities import DatasourceProviderEntity
from core.model_runtime.entities.provider_entities import ProviderEntity from core.model_runtime.entities.provider_entities import ProviderEntity
from core.plugin.entities.base import BasePluginEntity from core.plugin.entities.base import BasePluginEntity
from core.plugin.entities.endpoint import EndpointProviderDeclaration from core.plugin.entities.endpoint import EndpointProviderDeclaration
@ -62,6 +63,7 @@ class PluginCategory(enum.StrEnum):
Model = "model" Model = "model"
Extension = "extension" Extension = "extension"
AgentStrategy = "agent-strategy" AgentStrategy = "agent-strategy"
Datasource = "datasource"
class PluginDeclaration(BaseModel): class PluginDeclaration(BaseModel):
@ -69,6 +71,7 @@ class PluginDeclaration(BaseModel):
tools: Optional[list[str]] = Field(default_factory=list[str]) tools: Optional[list[str]] = Field(default_factory=list[str])
models: Optional[list[str]] = Field(default_factory=list[str]) models: Optional[list[str]] = Field(default_factory=list[str])
endpoints: Optional[list[str]] = Field(default_factory=list[str]) endpoints: Optional[list[str]] = Field(default_factory=list[str])
datasources: Optional[list[str]] = Field(default_factory=list[str])
class Meta(BaseModel): class Meta(BaseModel):
minimum_dify_version: Optional[str] = Field(default=None, pattern=r"^\d{1,4}(\.\d{1,4}){1,3}(-\w{1,16})?$") minimum_dify_version: Optional[str] = Field(default=None, pattern=r"^\d{1,4}(\.\d{1,4}){1,3}(-\w{1,16})?$")
@ -90,6 +93,7 @@ class PluginDeclaration(BaseModel):
model: Optional[ProviderEntity] = None model: Optional[ProviderEntity] = None
endpoint: Optional[EndpointProviderDeclaration] = None endpoint: Optional[EndpointProviderDeclaration] = None
agent_strategy: Optional[AgentStrategyProviderEntity] = None agent_strategy: Optional[AgentStrategyProviderEntity] = None
datasource: Optional[DatasourceProviderEntity] = None
meta: Meta meta: Meta
@model_validator(mode="before") @model_validator(mode="before")
@ -100,6 +104,8 @@ class PluginDeclaration(BaseModel):
values["category"] = PluginCategory.Tool values["category"] = PluginCategory.Tool
elif values.get("model"): elif values.get("model"):
values["category"] = PluginCategory.Model values["category"] = PluginCategory.Model
elif values.get("datasource"):
values["category"] = PluginCategory.Datasource
elif values.get("agent_strategy"): elif values.get("agent_strategy"):
values["category"] = PluginCategory.AgentStrategy values["category"] = PluginCategory.AgentStrategy
else: else:

View File

@ -236,7 +236,7 @@ class PluginDatasourceManager(BasePluginClient):
response = self._request_with_plugin_daemon_response_stream( response = self._request_with_plugin_daemon_response_stream(
"GET", "GET",
f"plugin/datasource/oauth", "plugin/datasource/oauth",
PluginBasicBooleanResponse, PluginBasicBooleanResponse,
params={"page": 1, "page_size": 256}, params={"page": 1, "page_size": 256},
headers={ headers={

View File

@ -1,4 +1,4 @@
from collections.abc import Generator, Mapping, Sequence from collections.abc import Mapping, Sequence
from typing import Any, cast from typing import Any, cast
from core.datasource.entities.datasource_entities import ( from core.datasource.entities.datasource_entities import (

View File

@ -1,20 +1,11 @@
from datetime import datetime from datetime import datetime
from json import JSONDecodeError
from typing import Any, cast
from sqlalchemy import func
from sqlalchemy.dialects.postgresql import JSONB from sqlalchemy.dialects.postgresql import JSONB
from sqlalchemy.orm import Mapped from sqlalchemy.orm import Mapped
from configs import dify_config
from extensions.ext_storage import storage
from services.entities.knowledge_entities.knowledge_entities import ParentMode, Rule
from .account import Account
from .base import Base from .base import Base
from .engine import db from .engine import db
from .model import App, Tag, TagBinding, UploadFile
from .types import StringUUID from .types import StringUUID