mirror of
https://github.com/langgenius/dify.git
synced 2026-05-11 14:58:23 +08:00
Resolve the full dependency chain to enable all previously disabled controllers: Enabled routes: - sandbox_files: sandbox file browser API - sandbox_providers: sandbox provider management API - app_asset: app asset management API - skills: skill extraction API - CLI API blueprint: DifyCli callback endpoints (/cli/api/*) Dependencies extracted (64 files, ~8000 lines): - models/sandbox.py, models/app_asset.py: DB models - core/zip_sandbox/: zip-based sandbox execution - core/session/: CLI API session management - core/memory/: base memory + node token buffer - core/helper/creators.py: helper utilities - core/llm_generator/: context models, output models, utils - core/workflow/nodes/command/: command node type - core/workflow/nodes/file_upload/: file upload node type - core/app/entities/: app_asset_entities, app_bundle_entities, llm_generation_entities - services/: asset_content, skill, workflow_collaboration, workflow_comment - controllers/console/app/error.py: AppAsset error classes - core/tools/utils/system_encryption.py Import fixes: - dify_graph.enums -> graphon.enums in skill_service.py - get_signed_file_url_for_plugin -> get_signed_file_url in cli_api.py All 5 controllers verified: import OK, Flask starts successfully. 46 existing tests still pass. Made-with: Cursor
76 lines
2.5 KiB
Python
76 lines
2.5 KiB
Python
"""
|
|
Helper module for Creators Platform integration.
|
|
|
|
Provides functionality to upload DSL files to the Creators Platform
|
|
and generate redirect URLs with OAuth authorization codes.
|
|
"""
|
|
|
|
import logging
|
|
from urllib.parse import urlencode
|
|
|
|
import httpx
|
|
from yarl import URL
|
|
|
|
from configs import dify_config
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
creators_platform_api_url = URL(str(dify_config.CREATORS_PLATFORM_API_URL))
|
|
|
|
|
|
def upload_dsl(dsl_file_bytes: bytes, filename: str = "template.yaml") -> str:
|
|
"""Upload a DSL file to the Creators Platform anonymous upload endpoint.
|
|
|
|
Args:
|
|
dsl_file_bytes: Raw bytes of the DSL file (YAML or ZIP).
|
|
filename: Original filename for the upload.
|
|
|
|
Returns:
|
|
The claim_code string used to retrieve the DSL later.
|
|
|
|
Raises:
|
|
httpx.HTTPStatusError: If the upload request fails.
|
|
ValueError: If the response does not contain a valid claim_code.
|
|
"""
|
|
url = str(creators_platform_api_url / "api/v1/templates/anonymous-upload")
|
|
response = httpx.post(url, files={"file": (filename, dsl_file_bytes)}, timeout=30)
|
|
response.raise_for_status()
|
|
|
|
data = response.json()
|
|
claim_code = data.get("data", {}).get("claim_code")
|
|
if not claim_code:
|
|
raise ValueError("Creators Platform did not return a valid claim_code")
|
|
|
|
return claim_code
|
|
|
|
|
|
def get_redirect_url(user_account_id: str, claim_code: str) -> str:
|
|
"""Generate the redirect URL to the Creators Platform frontend.
|
|
|
|
Redirects to the Creators Platform root page with the dsl_claim_code.
|
|
If CREATORS_PLATFORM_OAUTH_CLIENT_ID is configured (Dify Cloud),
|
|
also signs an OAuth authorization code so the frontend can
|
|
automatically authenticate the user via the OAuth callback.
|
|
|
|
For self-hosted Dify without OAuth client_id configured, only the
|
|
dsl_claim_code is passed and the user must log in manually.
|
|
|
|
Args:
|
|
user_account_id: The Dify user account ID.
|
|
claim_code: The claim_code obtained from upload_dsl().
|
|
|
|
Returns:
|
|
The full redirect URL string.
|
|
"""
|
|
base_url = str(dify_config.CREATORS_PLATFORM_API_URL).rstrip("/")
|
|
params: dict[str, str] = {"dsl_claim_code": claim_code}
|
|
|
|
client_id = str(dify_config.CREATORS_PLATFORM_OAUTH_CLIENT_ID or "")
|
|
if client_id:
|
|
from services.oauth_server import OAuthServerService
|
|
|
|
oauth_code = OAuthServerService.sign_oauth_authorization_code(client_id, user_account_id)
|
|
params["oauth_code"] = oauth_code
|
|
|
|
return f"{base_url}?{urlencode(params)}"
|