mirror of
https://github.com/langgenius/dify.git
synced 2026-10-16 15:35:32 +08:00
66 lines
2.8 KiB
Python
66 lines
2.8 KiB
Python
"""Create workflow and advanced-chat apps with the editor's starter draft; export then gives the starting DSL.
|
|
|
|
A workflow starts empty; an advanced-chat app starts with Start -> LLM -> Answer, the LLM without a model.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from http import HTTPStatus
|
|
from typing import Final, Literal
|
|
|
|
from flask_restx import Resource
|
|
|
|
from controllers.common.rbac import RBACPermission
|
|
from controllers.openapi import openapi_ns
|
|
from controllers.openapi._contract import Example, Kind, endpoint
|
|
from controllers.openapi._models import CreateAppPayload, CreatedAppResponse
|
|
from controllers.openapi.auth.requirements import EDITOR_ROLES, CheckAppQuota, workspace_write_guards
|
|
from extensions.ext_application_services import application_services
|
|
from machinery.context import RequestContext
|
|
from models import AppMode
|
|
from services.entities.app_entities import CreateAppParams
|
|
|
|
_CREATE_GUARDS: Final = workspace_write_guards(
|
|
RBACPermission.APP_CREATE_AND_MANAGEMENT, roles=EDITOR_ROLES, extra=(CheckAppQuota(),)
|
|
)
|
|
|
|
|
|
def _create(
|
|
ctx: RequestContext, mode: Literal[AppMode.WORKFLOW, AppMode.ADVANCED_CHAT], body: CreateAppPayload
|
|
) -> tuple[CreatedAppResponse, HTTPStatus]:
|
|
params = CreateAppParams(mode=mode.value, **body.model_dump(exclude_none=True))
|
|
app = application_services().apps.console.create_with_draft(ctx, params)
|
|
return CreatedAppResponse(app_id=app.id, mode=mode.value, name=app.name), HTTPStatus.CREATED
|
|
|
|
|
|
@openapi_ns.route("/workspaces/<string:workspace_id>/apps/workflow")
|
|
class WorkflowAppCreateApi(Resource):
|
|
@endpoint(
|
|
context="workspace",
|
|
op="create.console_app.workflow",
|
|
kind=Kind.OBJECT,
|
|
summary="Create a blank workflow app; export its DSL to start building",
|
|
examples=(Example(title="Create a workflow app", input={"name": "Release notes"}),),
|
|
requirements=_CREATE_GUARDS,
|
|
body=CreateAppPayload,
|
|
returns=(HTTPStatus.CREATED, CreatedAppResponse, "Created"),
|
|
)
|
|
def post(self, ctx: RequestContext, workspace_id: str, *, body: CreateAppPayload):
|
|
return _create(ctx, AppMode.WORKFLOW, body)
|
|
|
|
|
|
@openapi_ns.route("/workspaces/<string:workspace_id>/apps/advanced-chat")
|
|
class AdvancedChatAppCreateApi(Resource):
|
|
@endpoint(
|
|
context="workspace",
|
|
op="create.console_app.advanced_chat",
|
|
kind=Kind.OBJECT,
|
|
summary="Create an advanced-chat app with a Start, LLM and Answer draft; export its DSL to start building",
|
|
examples=(Example(title="Create an advanced-chat app", input={"name": "Support bot"}),),
|
|
requirements=_CREATE_GUARDS,
|
|
body=CreateAppPayload,
|
|
returns=(HTTPStatus.CREATED, CreatedAppResponse, "Created"),
|
|
)
|
|
def post(self, ctx: RequestContext, workspace_id: str, *, body: CreateAppPayload):
|
|
return _create(ctx, AppMode.ADVANCED_CHAT, body)
|