From e9377948316754ee78311ddf5069a12140b112e4 Mon Sep 17 00:00:00 2001 From: chariri Date: Fri, 26 Jun 2026 03:28:33 +0900 Subject: [PATCH 1/2] refactor(api): remove legacy helper field compatibility --- api/controllers/console/app/workflow.py | 342 ++--- api/controllers/console/datasets/external.py | 191 ++- .../rag_pipeline/rag_pipeline_workflow.py | 196 +-- api/controllers/console/explore/trial.py | 154 +- .../console/snippets/snippet_workflow.py | 94 +- api/controllers/console/workspace/snippets.py | 105 +- .../console/workspace/workspace.py | 122 +- .../service_api/dataset/dataset.py | 23 +- api/controllers/web/human_input_form.py | 167 ++- api/controllers/web/site.py | 202 ++- api/fields/app_fields.py | 271 ---- api/fields/conversation_variable_fields.py | 13 +- api/fields/dataset_fields.py | 113 +- api/fields/member_fields.py | 18 +- api/fields/snippet_fields.py | 110 +- api/fields/workflow_fields.py | 129 -- api/fields/workflow_run_fields.py | 49 +- api/libs/helper.py | 45 +- api/openapi/markdown/console-openapi.md | 1279 ++++++++--------- api/openapi/markdown/service-openapi.md | 4 +- api/openapi/markdown/web-openapi.md | 133 +- api/tests/unit_tests/libs/test_helper.py | 22 +- .../api/console/account/types.gen.ts | 20 +- .../generated/api/console/account/zod.gen.ts | 24 +- .../generated/api/console/agent/types.gen.ts | 43 +- .../generated/api/console/agent/zod.gen.ts | 132 +- .../api/console/all-workspaces/types.gen.ts | 4 +- .../api/console/all-workspaces/zod.gen.ts | 6 +- .../generated/api/console/apps/orpc.gen.ts | 754 +++------- .../generated/api/console/apps/types.gen.ts | 430 +----- .../generated/api/console/apps/zod.gen.ts | 712 ++++----- .../api/console/datasets/orpc.gen.ts | 8 + .../api/console/datasets/types.gen.ts | 154 +- .../generated/api/console/datasets/zod.gen.ts | 176 +-- .../api/console/installed-apps/types.gen.ts | 11 +- .../api/console/installed-apps/zod.gen.ts | 11 +- .../console/instruction-generate/types.gen.ts | 32 +- .../console/instruction-generate/zod.gen.ts | 35 +- .../generated/api/console/rag/orpc.gen.ts | 347 +---- .../generated/api/console/rag/types.gen.ts | 399 ++--- .../generated/api/console/rag/zod.gen.ts | 479 +++--- .../console/rule-code-generate/types.gen.ts | 32 +- .../api/console/rule-code-generate/zod.gen.ts | 35 +- .../api/console/rule-generate/types.gen.ts | 32 +- .../api/console/rule-generate/zod.gen.ts | 35 +- .../types.gen.ts | 32 +- .../zod.gen.ts | 35 +- .../api/console/snippets/orpc.gen.ts | 74 +- .../api/console/snippets/types.gen.ts | 69 +- .../generated/api/console/snippets/zod.gen.ts | 82 +- .../generated/api/console/test/types.gen.ts | 21 +- .../generated/api/console/test/zod.gen.ts | 27 +- .../api/console/trial-apps/orpc.gen.ts | 84 +- .../api/console/trial-apps/types.gen.ts | 553 ++++--- .../api/console/trial-apps/zod.gen.ts | 703 +++++---- .../console/workflow-generate/types.gen.ts | 32 +- .../api/console/workflow-generate/zod.gen.ts | 35 +- .../api/console/workspaces/orpc.gen.ts | 381 +++-- .../api/console/workspaces/types.gen.ts | 197 +-- .../api/console/workspaces/zod.gen.ts | 292 ++-- .../generated/api/service/types.gen.ts | 4 +- .../generated/api/service/zod.gen.ts | 6 +- .../contracts/generated/api/web/orpc.gen.ts | 11 +- .../contracts/generated/api/web/types.gen.ts | 164 ++- .../contracts/generated/api/web/zod.gen.ts | 194 ++- packages/contracts/openapi-ts.api.config.ts | 78 +- 66 files changed, 4517 insertions(+), 6250 deletions(-) delete mode 100644 api/fields/app_fields.py delete mode 100644 api/fields/workflow_fields.py diff --git a/api/controllers/console/app/workflow.py b/api/controllers/console/app/workflow.py index aff32035233..e92d3266d9e 100644 --- a/api/controllers/console/app/workflow.py +++ b/api/controllers/console/app/workflow.py @@ -1,19 +1,19 @@ import json import logging -from collections.abc import Sequence +from collections.abc import Mapping, Sequence from datetime import datetime -from typing import Any, NotRequired, TypedDict, cast +from typing import Any, Literal, NotRequired, TypedDict, cast from flask import abort, request -from flask_restx import Resource, fields -from pydantic import AliasChoices, BaseModel, Field, RootModel, ValidationError, field_validator +from flask_restx import Resource +from pydantic import AliasChoices, BaseModel, Field, ValidationError, field_validator from sqlalchemy.orm import Session, sessionmaker from werkzeug.exceptions import BadRequest, Forbidden, InternalServerError, NotFound import services from controllers.common.controller_schemas import DefaultBlockConfigQuery, WorkflowListQuery, WorkflowUpdatePayload from controllers.common.errors import InvalidArgumentError -from controllers.common.fields import GeneratedAppResponse, NewAppResponse, SimpleResultResponse +from controllers.common.fields import NewAppResponse, SimpleResultResponse from controllers.common.schema import ( query_params_from_model, register_response_schema_model, @@ -21,11 +21,7 @@ from controllers.common.schema import ( register_schema_models, ) from controllers.console import console_ns -from controllers.console.app.error import ( - ConversationCompletedError, - DraftWorkflowNotExist, - DraftWorkflowNotSync, -) +from controllers.console.app.error import ConversationCompletedError, DraftWorkflowNotExist, DraftWorkflowNotSync from controllers.console.app.permission_keys import get_app_permission_keys from controllers.console.app.wraps import get_app_model from controllers.console.wraps import ( @@ -58,7 +54,7 @@ from extensions.ext_database import db from extensions.ext_redis import redis_client from factories import file_factory, variable_factory from fields.base import ResponseModel -from fields.member_fields import SimpleAccount +from fields.member_fields import SimpleAccountResponse from fields.workflow_run_fields import WorkflowRunNodeExecutionResponse from graphon.enums import NodeType from graphon.file import File @@ -69,7 +65,7 @@ from graphon.variables import SecretVariable, SegmentType, VariableBase from graphon.variables.exc import VariableError from libs import helper from libs.datetime_utils import naive_utc_now -from libs.helper import TimestampField, dump_response, to_timestamp, uuid_value +from libs.helper import dump_response, to_timestamp, uuid_value from libs.login import login_required from models import Account, App from models.model import AppMode @@ -103,20 +99,16 @@ class SyncDraftWorkflowPayload(BaseModel): graph: dict[str, Any] features: dict[str, Any] hash: str | None = None - environment_variables: list[dict[str, Any]] = Field( - default_factory=list, - ) - conversation_variables: list[dict[str, Any]] = Field( - default_factory=list, - ) + environment_variables: list[dict[str, Any]] = Field(default_factory=list) + conversation_variables: list[dict[str, Any]] = Field(default_factory=list) class BaseWorkflowRunPayload(BaseModel): - files: list[dict[str, Any]] | None = Field(default=None) + files: list[dict[str, Any]] | None = None class AdvancedChatWorkflowRunPayload(BaseWorkflowRunPayload): - inputs: dict[str, Any] | None = Field(default=None) + inputs: dict[str, Any] | None = None query: str = "" conversation_id: str | None = None parent_message_id: str | None = None @@ -130,11 +122,11 @@ class AdvancedChatWorkflowRunPayload(BaseWorkflowRunPayload): class IterationNodeRunPayload(BaseModel): - inputs: dict[str, Any] | None = Field(default=None) + inputs: dict[str, Any] | None = None class LoopNodeRunPayload(BaseModel): - inputs: dict[str, Any] | None = Field(default=None) + inputs: dict[str, Any] | None = None class DraftWorkflowRunPayload(BaseWorkflowRunPayload): @@ -159,10 +151,7 @@ class ConvertToWorkflowPayload(BaseModel): class WorkflowFeaturesPayload(BaseModel): - features: dict[str, Any] = Field( - ..., - description="Workflow feature configuration", - ) + features: dict[str, Any] = Field(..., description="Workflow feature configuration") class WorkflowOnlineUsersPayload(BaseModel): @@ -197,7 +186,7 @@ class PipelineVariableResponse(ResponseModel): max_length: int | None = None required: bool unit: str | None = None - default_value: Any = Field(default=None) + default_value: Any = None options: list[str] | None = None placeholder: str | None = None tooltips: str | None = None @@ -220,21 +209,17 @@ class WorkflowEnvironmentVariableResponse(ResponseModel): class WorkflowResponse(ResponseModel): id: str - graph: dict[str, Any] = Field( - validation_alias=AliasChoices("graph_dict", "graph"), - ) - features: dict[str, Any] = Field( - validation_alias=AliasChoices("features_dict", "features"), - ) + graph: dict[str, Any] = Field(validation_alias=AliasChoices("graph_dict", "graph")) + features: dict[str, Any] = Field(validation_alias=AliasChoices("features_dict", "features")) hash: str = Field(validation_alias=AliasChoices("unique_hash", "hash")) version: str marked_name: str marked_comment: str - created_by: SimpleAccount | None = Field( + created_by: SimpleAccountResponse | None = Field( default=None, validation_alias=AliasChoices("created_by_account", "created_by") ) created_at: int - updated_by: SimpleAccount | None = Field( + updated_by: SimpleAccountResponse | None = Field( default=None, validation_alias=AliasChoices("updated_by_account", "updated_by") ) updated_at: int @@ -267,6 +252,53 @@ class WorkflowPaginationResponse(ResponseModel): has_more: bool +class SyncDraftWorkflowResponse(ResponseModel): + result: str + hash: str + updated_at: int + + +class PublishWorkflowResponse(ResponseModel): + result: str + created_at: int + + +class HumanInputUserActionResponse(ResponseModel): + id: str + title: str + button_style: str = "default" + + +class HumanInputFormPreviewResponse(ResponseModel): + # Draft previews are shape-compatible with live human_input_required events, + # but they do not persist a form or mint recipient tokens (no expiration_time) + type_: Literal["human_input_required"] = Field(default="human_input_required", alias="TYPE") + form_id: str + form_content: str + inputs: list[Mapping[str, Any]] = Field(default_factory=list) + actions: list[HumanInputUserActionResponse] = Field(default_factory=list) + node_id: str + node_title: str + resolved_default_values: Mapping[str, Any] = Field(default_factory=dict) + display_in_ui: bool = Field(default=False, description="Always false for draft preview responses.") + form_token: str | None = Field(default=None, description="Always null for draft preview responses.") + expiration_time: int | None = Field(default=None, description="Always null for draft preview responses.") + + +class HumanInputDeliveryTestResponse(ResponseModel): + pass + + +class TriggerDebugWaitingResponse(ResponseModel): + status: Literal["waiting"] + retry_in: int + + +class TriggerDebugErrorResponse(ResponseModel): + status: Literal["error"] + error: str | None = None + + class WorkflowOnlineUser(ResponseModel): user_id: str username: str @@ -282,46 +314,6 @@ class WorkflowOnlineUsersResponse(ResponseModel): data: list[WorkflowOnlineUsersByApp] -class WorkflowPublishResponse(ResponseModel): - result: str - created_at: int - - -class WorkflowRestoreResponse(ResponseModel): - result: str - hash: str - updated_at: int - - -class DefaultBlockConfigsResponse(RootModel[list[dict[str, Any]]]): - root: list[dict[str, Any]] - - -class DefaultBlockConfigResponse(RootModel[dict[str, Any]]): - root: dict[str, Any] - - -class HumanInputFormPreviewResponse(ResponseModel): - form_id: str - node_id: str - node_title: str - form_content: str - inputs: list[dict[str, Any]] = Field(default_factory=list) - actions: list[dict[str, Any]] = Field(default_factory=list) - display_in_ui: bool | None = None - form_token: str | None = None - resolved_default_values: dict[str, Any] = Field(default_factory=dict) - expiration_time: int | None = None - - -class HumanInputFormSubmitResponse(RootModel[dict[str, Any]]): - root: dict[str, Any] - - -class EmptyObjectResponse(RootModel[dict[str, Any]]): - root: dict[str, Any] - - class DraftWorkflowTriggerRunPayload(BaseModel): node_id: str @@ -356,19 +348,19 @@ register_response_schema_models( WorkflowEnvironmentVariableResponse, WorkflowResponse, WorkflowPaginationResponse, + SyncDraftWorkflowResponse, + PublishWorkflowResponse, + HumanInputUserActionResponse, + HumanInputFormPreviewResponse, + HumanInputDeliveryTestResponse, + TriggerDebugWaitingResponse, + TriggerDebugErrorResponse, WorkflowOnlineUser, WorkflowOnlineUsersByApp, WorkflowOnlineUsersResponse, - WorkflowPublishResponse, - WorkflowRestoreResponse, - DefaultBlockConfigsResponse, - DefaultBlockConfigResponse, - HumanInputFormPreviewResponse, - HumanInputFormSubmitResponse, - EmptyObjectResponse, - GeneratedAppResponse, NewAppResponse, SimpleResultResponse, + WorkflowRunNodeExecutionResponse, ) @@ -426,6 +418,14 @@ def _serialize_environment_variable(value: Any) -> EnvironmentVariableResponseDi return value +def _trigger_debug_waiting_response() -> dict[str, int | str]: + return TriggerDebugWaitingResponse(status="waiting", retry_in=LISTENING_RETRY_IN).model_dump(mode="json") + + +def _trigger_debug_error_response(error: str | None = None) -> dict[str, str]: + return TriggerDebugErrorResponse(status="error", error=error).model_dump(mode="json", exclude_none=True) + + @console_ns.route("/apps//workflows/draft") class DraftWorkflowApi(Resource): @console_ns.doc("get_draft_workflow") @@ -475,14 +475,7 @@ class DraftWorkflowApi(Resource): @console_ns.response( 200, "Draft workflow synced successfully", - console_ns.model( - "SyncDraftWorkflowResponse", - { - "result": fields.String, - "hash": fields.String, - "updated_at": fields.String, - }, - ), + console_ns.models[SyncDraftWorkflowResponse.__name__], ) @console_ns.response(400, "Invalid workflow configuration") @console_ns.response(403, "Permission denied") @@ -535,11 +528,11 @@ class DraftWorkflowApi(Resource): except VariableError as e: raise InvalidArgumentError(description=str(e)) - return { - "result": "success", - "hash": workflow.unique_hash, - "updated_at": TimestampField().format(workflow.updated_at or workflow.created_at), - } + return SyncDraftWorkflowResponse( + result="success", + hash=workflow.unique_hash, + updated_at=to_timestamp(workflow.updated_at or workflow.created_at), + ).model_dump(mode="json") @console_ns.route("/apps//advanced-chat/workflows/draft/run") @@ -548,7 +541,7 @@ class AdvancedChatDraftWorkflowRunApi(Resource): @console_ns.doc(description="Run draft workflow for advanced chat application") @console_ns.doc(params={"app_id": "Application ID"}) @console_ns.expect(console_ns.models[AdvancedChatWorkflowRunPayload.__name__]) - @console_ns.response(200, "Workflow run started successfully", console_ns.models[GeneratedAppResponse.__name__]) + @console_ns.response(200, "Workflow run started successfully") @console_ns.response(400, "Invalid request parameters") @console_ns.response(403, "Permission denied") @setup_required @@ -574,6 +567,7 @@ class AdvancedChatDraftWorkflowRunApi(Resource): app_model=app_model, user=current_user, args=args, invoke_from=InvokeFrom.DEBUGGER, streaming=True ) + # response-contract:ignore compact_generate_response return helper.compact_generate_response(response) except services.errors.conversation.ConversationNotExistsError: raise NotFound("Conversation Not Exists.") @@ -594,11 +588,7 @@ class AdvancedChatDraftRunIterationNodeApi(Resource): @console_ns.doc(description="Run draft workflow iteration node for advanced chat") @console_ns.doc(params={"app_id": "Application ID", "node_id": "Node ID"}) @console_ns.expect(console_ns.models[IterationNodeRunPayload.__name__]) - @console_ns.response( - 200, - "Iteration node run started successfully", - console_ns.models[GeneratedAppResponse.__name__], - ) + @console_ns.response(200, "Iteration node run started successfully") @console_ns.response(403, "Permission denied") @console_ns.response(404, "Node not found") @setup_required @@ -619,6 +609,7 @@ class AdvancedChatDraftRunIterationNodeApi(Resource): app_model=app_model, user=current_user, node_id=node_id, args=args, streaming=True ) + # response-contract:ignore compact_generate_response return helper.compact_generate_response(response) except services.errors.conversation.ConversationNotExistsError: raise NotFound("Conversation Not Exists.") @@ -637,11 +628,7 @@ class WorkflowDraftRunIterationNodeApi(Resource): @console_ns.doc(description="Run draft workflow iteration node") @console_ns.doc(params={"app_id": "Application ID", "node_id": "Node ID"}) @console_ns.expect(console_ns.models[IterationNodeRunPayload.__name__]) - @console_ns.response( - 200, - "Workflow iteration node run started successfully", - console_ns.models[GeneratedAppResponse.__name__], - ) + @console_ns.response(200, "Workflow iteration node run started successfully") @console_ns.response(403, "Permission denied") @console_ns.response(404, "Node not found") @setup_required @@ -662,6 +649,7 @@ class WorkflowDraftRunIterationNodeApi(Resource): app_model=app_model, user=current_user, node_id=node_id, args=args, streaming=True ) + # response-contract:ignore compact_generate_response return helper.compact_generate_response(response) except services.errors.conversation.ConversationNotExistsError: raise NotFound("Conversation Not Exists.") @@ -680,7 +668,7 @@ class AdvancedChatDraftRunLoopNodeApi(Resource): @console_ns.doc(description="Run draft workflow loop node for advanced chat") @console_ns.doc(params={"app_id": "Application ID", "node_id": "Node ID"}) @console_ns.expect(console_ns.models[LoopNodeRunPayload.__name__]) - @console_ns.response(200, "Loop node run started successfully", console_ns.models[GeneratedAppResponse.__name__]) + @console_ns.response(200, "Loop node run started successfully") @console_ns.response(403, "Permission denied") @console_ns.response(404, "Node not found") @setup_required @@ -701,6 +689,7 @@ class AdvancedChatDraftRunLoopNodeApi(Resource): app_model=app_model, user=current_user, node_id=node_id, args=args, streaming=True ) + # response-contract:ignore compact_generate_response return helper.compact_generate_response(response) except services.errors.conversation.ConversationNotExistsError: raise NotFound("Conversation Not Exists.") @@ -719,11 +708,7 @@ class WorkflowDraftRunLoopNodeApi(Resource): @console_ns.doc(description="Run draft workflow loop node") @console_ns.doc(params={"app_id": "Application ID", "node_id": "Node ID"}) @console_ns.expect(console_ns.models[LoopNodeRunPayload.__name__]) - @console_ns.response( - 200, - "Workflow loop node run started successfully", - console_ns.models[GeneratedAppResponse.__name__], - ) + @console_ns.response(200, "Workflow loop node run started successfully") @console_ns.response(403, "Permission denied") @console_ns.response(404, "Node not found") @setup_required @@ -744,6 +729,7 @@ class WorkflowDraftRunLoopNodeApi(Resource): app_model=app_model, user=current_user, node_id=node_id, args=args, streaming=True ) + # response-contract:ignore compact_generate_response return helper.compact_generate_response(response) except services.errors.conversation.ConversationNotExistsError: raise NotFound("Conversation Not Exists.") @@ -764,10 +750,7 @@ class HumanInputFormPreviewPayload(BaseModel): class HumanInputFormSubmitPayload(BaseModel): - form_inputs: dict[str, Any] = Field( - ..., - description="Values the user provides for the form's own fields", - ) + form_inputs: dict[str, Any] = Field(..., description="Values the user provides for the form's own fields") inputs: dict[str, Any] = Field( ..., description="Values used to fill missing upstream variables referenced in form_content", @@ -797,7 +780,11 @@ class AdvancedChatDraftHumanInputFormPreviewApi(Resource): @console_ns.doc(description="Get human input form preview for advanced chat workflow") @console_ns.doc(params={"app_id": "Application ID", "node_id": "Node ID"}) @console_ns.expect(console_ns.models[HumanInputFormPreviewPayload.__name__]) - @console_ns.response(200, "Human input form preview", console_ns.models[HumanInputFormPreviewResponse.__name__]) + @console_ns.response( + 200, + "Human input form preview retrieved", + console_ns.models[HumanInputFormPreviewResponse.__name__], + ) @setup_required @login_required @account_initialization_required @@ -819,7 +806,7 @@ class AdvancedChatDraftHumanInputFormPreviewApi(Resource): node_id=node_id, inputs=inputs, ) - return jsonable_encoder(preview) + return dump_response(HumanInputFormPreviewResponse, preview) @console_ns.route("/apps//advanced-chat/workflows/draft/human-input/nodes//form/run") @@ -830,8 +817,7 @@ class AdvancedChatDraftHumanInputFormRunApi(Resource): @console_ns.expect(console_ns.models[HumanInputFormSubmitPayload.__name__]) @console_ns.response( 200, - "Human input form submission result", - console_ns.models[HumanInputFormSubmitResponse.__name__], + "Human input form submitted", ) @setup_required @login_required @@ -854,6 +840,7 @@ class AdvancedChatDraftHumanInputFormRunApi(Resource): inputs=args.inputs, action=args.action, ) + # TODO: typing here for result return jsonable_encoder(result) @@ -863,7 +850,11 @@ class WorkflowDraftHumanInputFormPreviewApi(Resource): @console_ns.doc(description="Get human input form preview for workflow") @console_ns.doc(params={"app_id": "Application ID", "node_id": "Node ID"}) @console_ns.expect(console_ns.models[HumanInputFormPreviewPayload.__name__]) - @console_ns.response(200, "Human input form preview", console_ns.models[HumanInputFormPreviewResponse.__name__]) + @console_ns.response( + 200, + "Human input form preview retrieved", + console_ns.models[HumanInputFormPreviewResponse.__name__], + ) @setup_required @login_required @account_initialization_required @@ -885,7 +876,7 @@ class WorkflowDraftHumanInputFormPreviewApi(Resource): node_id=node_id, inputs=inputs, ) - return jsonable_encoder(preview) + return dump_response(HumanInputFormPreviewResponse, preview) @console_ns.route("/apps//workflows/draft/human-input/nodes//form/run") @@ -896,8 +887,7 @@ class WorkflowDraftHumanInputFormRunApi(Resource): @console_ns.expect(console_ns.models[HumanInputFormSubmitPayload.__name__]) @console_ns.response( 200, - "Human input form submission result", - console_ns.models[HumanInputFormSubmitResponse.__name__], + "Human input form submitted", ) @setup_required @login_required @@ -920,6 +910,7 @@ class WorkflowDraftHumanInputFormRunApi(Resource): inputs=args.inputs, action=args.action, ) + # TODO: typing here return jsonable_encoder(result) @@ -929,7 +920,11 @@ class WorkflowDraftHumanInputDeliveryTestApi(Resource): @console_ns.doc(description="Test human input delivery for workflow") @console_ns.doc(params={"app_id": "Application ID", "node_id": "Node ID"}) @console_ns.expect(console_ns.models[HumanInputDeliveryTestPayload.__name__]) - @console_ns.response(200, "Human input delivery test result", console_ns.models[EmptyObjectResponse.__name__]) + @console_ns.response( + 200, + "Human input delivery tested", + console_ns.models[HumanInputDeliveryTestResponse.__name__], + ) @setup_required @login_required @account_initialization_required @@ -950,7 +945,7 @@ class WorkflowDraftHumanInputDeliveryTestApi(Resource): delivery_method_id=args.delivery_method_id, inputs=args.inputs, ) - return jsonable_encoder({}) + return HumanInputDeliveryTestResponse().model_dump(mode="json") @console_ns.route("/apps//workflows/draft/run") @@ -959,11 +954,7 @@ class DraftWorkflowRunApi(Resource): @console_ns.doc(description="Run draft workflow") @console_ns.doc(params={"app_id": "Application ID"}) @console_ns.expect(console_ns.models[DraftWorkflowRunPayload.__name__]) - @console_ns.response( - 200, - "Draft workflow run started successfully", - console_ns.models[GeneratedAppResponse.__name__], - ) + @console_ns.response(200, "Draft workflow run started successfully") @console_ns.response(403, "Permission denied") @setup_required @login_required @@ -991,6 +982,7 @@ class DraftWorkflowRunApi(Resource): streaming=True, ) + # response-contract:ignore compact_generate_response return helper.compact_generate_response(response) except InvokeRateLimitError as ex: raise InvokeRateLimitHttpError(ex.description) @@ -1021,7 +1013,7 @@ class WorkflowTaskStopApi(Resource): # New graph engine command channel mechanism GraphEngineManager(redis_client).send_stop_command(task_id) - return {"result": "success"} + return SimpleResultResponse(result="success").model_dump(mode="json") @console_ns.route("/apps//workflows/draft/nodes//run") @@ -1109,7 +1101,7 @@ class PublishedWorkflowApi(Resource): return dump_response(WorkflowResponse, workflow) @console_ns.expect(console_ns.models[PublishWorkflowPayload.__name__]) - @console_ns.response(200, "Workflow published successfully", console_ns.models[WorkflowPublishResponse.__name__]) + @console_ns.response(200, "Workflow published successfully", console_ns.models[PublishWorkflowResponse.__name__]) @setup_required @login_required @account_initialization_required @@ -1141,12 +1133,9 @@ class PublishedWorkflowApi(Resource): app_model_in_session.updated_by = current_user.id app_model_in_session.updated_at = naive_utc_now() - workflow_created_at = TimestampField().format(workflow.created_at) + workflow_created_at = to_timestamp(workflow.created_at) - return { - "result": "success", - "created_at": workflow_created_at, - } + return PublishWorkflowResponse(result="success", created_at=workflow_created_at).model_dump(mode="json") @console_ns.route("/apps//workflows/default-workflow-block-configs") @@ -1157,7 +1146,6 @@ class DefaultBlockConfigsApi(Resource): @console_ns.response( 200, "Default block configurations retrieved successfully", - console_ns.models[DefaultBlockConfigsResponse.__name__], ) @setup_required @login_required @@ -1179,13 +1167,12 @@ class DefaultBlockConfigApi(Resource): @console_ns.doc("get_default_block_config") @console_ns.doc(description="Get default block configuration by type") @console_ns.doc(params={"app_id": "Application ID", "block_type": "Block type"}) + @console_ns.doc(params=query_params_from_model(DefaultBlockConfigQuery)) @console_ns.response( 200, "Default block configuration retrieved successfully", - console_ns.models[DefaultBlockConfigResponse.__name__], ) @console_ns.response(404, "Block type not found") - @console_ns.doc(params=query_params_from_model(DefaultBlockConfigQuery)) @setup_required @login_required @account_initialization_required @@ -1279,15 +1266,14 @@ class WorkflowFeaturesApi(Resource): workflow_service = WorkflowService() workflow_service.update_draft_workflow_features(app_model=app_model, features=features, account=current_user) - return {"result": "success"} + return SimpleResultResponse(result="success").model_dump(mode="json") @console_ns.route("/apps//workflows") class PublishedAllWorkflowApi(Resource): - @console_ns.doc(params=query_params_from_model(WorkflowListQuery)) @console_ns.doc("get_all_published_workflows") @console_ns.doc(description="Get all published workflows for an application") - @console_ns.doc(params={"app_id": "Application ID"}) + @console_ns.doc(params={"app_id": "Application ID", **query_params_from_model(WorkflowListQuery)}) @console_ns.response( 200, "Published workflows retrieved successfully", @@ -1340,7 +1326,11 @@ class DraftWorkflowRestoreApi(Resource): @console_ns.doc("restore_workflow_to_draft") @console_ns.doc(description="Restore a published workflow version into the draft workflow") @console_ns.doc(params={"app_id": "Application ID", "workflow_id": "Published workflow ID"}) - @console_ns.response(200, "Workflow restored successfully", console_ns.models[WorkflowRestoreResponse.__name__]) + @console_ns.response( + 200, + "Workflow restored successfully", + console_ns.models[SyncDraftWorkflowResponse.__name__], + ) @console_ns.response(400, "Source workflow must be published") @console_ns.response(404, "Workflow not found") @setup_required @@ -1366,11 +1356,11 @@ class DraftWorkflowRestoreApi(Resource): except ValueError as exc: raise BadRequest(str(exc)) from exc - return { - "result": "success", - "hash": workflow.unique_hash, - "updated_at": TimestampField().format(workflow.updated_at or workflow.created_at), - } + return SyncDraftWorkflowResponse( + result="success", + hash=workflow.unique_hash, + updated_at=to_timestamp(workflow.updated_at or workflow.created_at), + ).model_dump(mode="json") @console_ns.route("/apps//workflows/") @@ -1422,6 +1412,7 @@ class WorkflowByIdApi(Resource): return dump_response(WorkflowResponse, workflow) + @console_ns.response(204, "Workflow deleted successfully") @setup_required @login_required @account_initialization_required @@ -1480,7 +1471,7 @@ class DraftWorkflowNodeLastRunApi(Resource): ) if node_exec is None: raise NotFound("last run not found") - return WorkflowRunNodeExecutionResponse.model_validate(node_exec, from_attributes=True).model_dump(mode="json") + return dump_response(WorkflowRunNodeExecutionResponse, node_exec) @console_ns.route("/apps//workflows/draft/trigger/run") @@ -1493,19 +1484,8 @@ class DraftWorkflowTriggerRunApi(Resource): @console_ns.doc("poll_draft_workflow_trigger_run") @console_ns.doc(description="Poll for trigger events and execute full workflow when event arrives") @console_ns.doc(params={"app_id": "Application ID"}) - @console_ns.expect( - console_ns.model( - "DraftWorkflowTriggerRunRequest", - { - "node_id": fields.String(required=True, description="Node ID"), - }, - ) - ) - @console_ns.response( - 200, - "Trigger event received and workflow executed successfully", - console_ns.models[GeneratedAppResponse.__name__], - ) + @console_ns.expect(console_ns.models[DraftWorkflowTriggerRunPayload.__name__]) + @console_ns.response(200, "Trigger event received and workflow executed successfully") @console_ns.response(403, "Permission denied") @console_ns.response(500, "Internal server error") @setup_required @@ -1537,10 +1517,11 @@ class DraftWorkflowTriggerRunApi(Resource): try: event = poller.poll() if not event: - return jsonable_encoder({"status": "waiting", "retry_in": LISTENING_RETRY_IN}) + return _trigger_debug_waiting_response() workflow_args = dict(event.workflow_args) workflow_args[SKIP_PREPARE_USER_INPUTS_KEY] = True + # response-contract:ignore compact_generate_response return helper.compact_generate_response( AppGenerateService.generate( app_model=app_model, @@ -1554,7 +1535,7 @@ class DraftWorkflowTriggerRunApi(Resource): except InvokeRateLimitError as ex: raise InvokeRateLimitHttpError(ex.description) except PluginInvokeError as e: - return jsonable_encoder({"status": "error", "error": e.to_user_friendly_error()}), 400 + return _trigger_debug_error_response(e.to_user_friendly_error()), 400 except Exception as e: logger.exception("Error polling trigger debug event") raise e @@ -1573,7 +1554,7 @@ class DraftWorkflowTriggerNodeApi(Resource): @console_ns.response( 200, "Trigger event received and node executed successfully", - console_ns.models[GeneratedAppResponse.__name__], + console_ns.models[WorkflowRunNodeExecutionResponse.__name__], ) @console_ns.response(403, "Permission denied") @console_ns.response(500, "Internal server error") @@ -1617,12 +1598,12 @@ class DraftWorkflowTriggerNodeApi(Resource): ) event = poller.poll() except PluginInvokeError as e: - return jsonable_encoder({"status": "error", "error": e.to_user_friendly_error()}), 400 + return _trigger_debug_error_response(e.to_user_friendly_error()), 400 except Exception as e: logger.exception("Error polling trigger debug event") raise e if not event: - return jsonable_encoder({"status": "waiting", "retry_in": LISTENING_RETRY_IN}) + return _trigger_debug_waiting_response() raw_files = event.workflow_args.get("files") files = _parse_file(draft_workflow, raw_files if isinstance(raw_files, list) else None) @@ -1636,12 +1617,10 @@ class DraftWorkflowTriggerNodeApi(Resource): query="", files=files, ) - return jsonable_encoder(node_execution) + return dump_response(WorkflowRunNodeExecutionResponse, node_execution) except Exception as e: logger.exception("Error running draft workflow trigger node") - return jsonable_encoder( - {"status": "error", "error": "An unexpected error occurred while running the node."} - ), 400 + return _trigger_debug_error_response("An unexpected error occurred while running the node."), 400 @console_ns.route("/apps//workflows/draft/trigger/run-all") @@ -1655,7 +1634,7 @@ class DraftWorkflowTriggerRunAllApi(Resource): @console_ns.doc(description="Full workflow debug when the start node is a trigger") @console_ns.doc(params={"app_id": "Application ID"}) @console_ns.expect(console_ns.models[DraftWorkflowTriggerRunAllPayload.__name__]) - @console_ns.response(200, "Workflow executed successfully", console_ns.models[GeneratedAppResponse.__name__]) + @console_ns.response(200, "Workflow executed successfully") @console_ns.response(403, "Permission denied") @console_ns.response(500, "Internal server error") @setup_required @@ -1685,12 +1664,12 @@ class DraftWorkflowTriggerRunAllApi(Resource): node_ids=node_ids, ) except PluginInvokeError as e: - return jsonable_encoder({"status": "error", "error": e.to_user_friendly_error()}), 400 + return _trigger_debug_error_response(e.to_user_friendly_error()), 400 except Exception as e: logger.exception("Error polling trigger debug event") raise e if trigger_debug_event is None: - return jsonable_encoder({"status": "waiting", "retry_in": LISTENING_RETRY_IN}) + return _trigger_debug_waiting_response() try: workflow_args = dict(trigger_debug_event.workflow_args) @@ -1704,16 +1683,13 @@ class DraftWorkflowTriggerRunAllApi(Resource): streaming=True, root_node_id=trigger_debug_event.node_id, ) + # response-contract:ignore compact_generate_response return helper.compact_generate_response(response) except InvokeRateLimitError as ex: raise InvokeRateLimitHttpError(ex.description) except Exception: logger.exception("Error running draft workflow trigger run-all") - return jsonable_encoder( - { - "status": "error", - } - ), 400 + return _trigger_debug_error_response(), 400 @console_ns.route("/apps/workflows/online-users") @@ -1738,7 +1714,7 @@ class WorkflowOnlineUsersApi(Resource): raise BadRequest(f"Maximum {MAX_WORKFLOW_ONLINE_USERS_REQUEST_IDS} app_ids are allowed per request.") if not app_ids: - return {"data": []} + return WorkflowOnlineUsersResponse(data=[]).model_dump(mode="json") workflow_service = WorkflowService() accessible_app_ids = workflow_service.get_accessible_app_ids(app_ids, current_tenant_id) diff --git a/api/controllers/console/datasets/external.py b/api/controllers/console/datasets/external.py index eb7b9aa84f8..ba9c66302f7 100644 --- a/api/controllers/console/datasets/external.py +++ b/api/controllers/console/datasets/external.py @@ -1,19 +1,15 @@ +from datetime import datetime from typing import Any from uuid import UUID from flask import request -from flask_restx import Resource, fields, marshal -from pydantic import BaseModel, Field, RootModel +from flask_restx import Resource +from pydantic import AliasChoices, BaseModel, Field, field_validator from werkzeug.exceptions import Forbidden, InternalServerError, NotFound import services from controllers.common.fields import UsageCountResponse -from controllers.common.schema import ( - get_or_create_model, - query_params_from_model, - register_response_schema_models, - register_schema_models, -) +from controllers.common.schema import query_params_from_model, register_response_schema_models, register_schema_models from controllers.console import console_ns from controllers.console.datasets.error import DatasetNameDuplicateError from controllers.console.wraps import ( @@ -28,19 +24,8 @@ from controllers.console.wraps import ( ) from extensions.ext_database import db from fields.base import ResponseModel -from fields.dataset_fields import ( - dataset_detail_fields, - dataset_retrieval_model_fields, - doc_metadata_fields, - external_knowledge_info_fields, - external_retrieval_model_fields, - icon_info_fields, - keyword_setting_fields, - reranking_model_fields, - tag_fields, - vector_setting_fields, - weighted_score_fields, -) +from fields.dataset_fields import DatasetDetailResponse +from libs.helper import dump_response from libs.login import login_required from models import Account from services.dataset_service import DatasetService @@ -49,50 +34,10 @@ from services.external_knowledge_service import ExternalDatasetService from services.hit_testing_service import HitTestingService from services.knowledge_service import BedrockRetrievalSetting, ExternalDatasetTestService -register_response_schema_models(console_ns, UsageCountResponse) - - -def _build_dataset_detail_model(): - keyword_setting_model = get_or_create_model("DatasetKeywordSetting", keyword_setting_fields) - vector_setting_model = get_or_create_model("DatasetVectorSetting", vector_setting_fields) - - weighted_score_fields_copy = weighted_score_fields.copy() - weighted_score_fields_copy["keyword_setting"] = fields.Nested(keyword_setting_model) - weighted_score_fields_copy["vector_setting"] = fields.Nested(vector_setting_model) - weighted_score_model = get_or_create_model("DatasetWeightedScore", weighted_score_fields_copy) - - reranking_model = get_or_create_model("DatasetRerankingModel", reranking_model_fields) - - dataset_retrieval_model_fields_copy = dataset_retrieval_model_fields.copy() - dataset_retrieval_model_fields_copy["reranking_model"] = fields.Nested(reranking_model) - dataset_retrieval_model_fields_copy["weights"] = fields.Nested(weighted_score_model, allow_null=True) - dataset_retrieval_model = get_or_create_model("DatasetRetrievalModel", dataset_retrieval_model_fields_copy) - - tag_model = get_or_create_model("Tag", tag_fields) - doc_metadata_model = get_or_create_model("DatasetDocMetadata", doc_metadata_fields) - external_knowledge_info_model = get_or_create_model("ExternalKnowledgeInfo", external_knowledge_info_fields) - external_retrieval_model = get_or_create_model("ExternalRetrievalModel", external_retrieval_model_fields) - icon_info_model = get_or_create_model("DatasetIconInfo", icon_info_fields) - - dataset_detail_fields_copy = dataset_detail_fields.copy() - dataset_detail_fields_copy["retrieval_model_dict"] = fields.Nested(dataset_retrieval_model) - dataset_detail_fields_copy["tags"] = fields.List(fields.Nested(tag_model)) - dataset_detail_fields_copy["external_knowledge_info"] = fields.Nested(external_knowledge_info_model) - dataset_detail_fields_copy["external_retrieval_model"] = fields.Nested(external_retrieval_model, allow_null=True) - dataset_detail_fields_copy["doc_metadata"] = fields.List(fields.Nested(doc_metadata_model)) - dataset_detail_fields_copy["icon_info"] = fields.Nested(icon_info_model) - return get_or_create_model("DatasetDetail", dataset_detail_fields_copy) - - -try: - dataset_detail_model = console_ns.models["DatasetDetail"] -except KeyError: - dataset_detail_model = _build_dataset_detail_model() - class ExternalKnowledgeApiPayload(BaseModel): name: str = Field(..., min_length=1, max_length=40) - settings: dict[str, object] + settings: dict[str, Any] class ExternalDatasetCreatePayload(BaseModel): @@ -100,15 +45,13 @@ class ExternalDatasetCreatePayload(BaseModel): external_knowledge_id: str name: str = Field(..., min_length=1, max_length=100) description: str | None = Field(None, max_length=400) - external_retrieval_model: dict[str, object] | None = Field(default=None) + external_retrieval_model: dict[str, Any] | None = None class ExternalHitTestingPayload(BaseModel): query: str - external_retrieval_model: dict[str, object] | None = Field(default=None) - metadata_filtering_conditions: dict[str, object] | None = Field( - default=None, - ) + external_retrieval_model: dict[str, Any] | None = None + metadata_filtering_conditions: dict[str, Any] | None = None class BedrockRetrievalPayload(BaseModel): @@ -123,7 +66,7 @@ class ExternalApiTemplateListQuery(BaseModel): keyword: str | None = Field(default=None, description="Search keyword") -class ExternalKnowledgeDatasetBindingResponse(ResponseModel): +class ExternalKnowledgeApiBindingResponse(ResponseModel): id: str name: str @@ -133,22 +76,52 @@ class ExternalKnowledgeApiResponse(ResponseModel): tenant_id: str name: str description: str - settings: dict[str, Any] | None = Field(default=None) - dataset_bindings: list[ExternalKnowledgeDatasetBindingResponse] = Field(default_factory=list) + settings: dict[str, Any] | None = Field(validation_alias=AliasChoices("settings_dict", "settings")) + dataset_bindings: list[ExternalKnowledgeApiBindingResponse] created_by: str created_at: str + @field_validator("created_at", mode="before") + @classmethod + def _normalize_created_at(cls, value: datetime | str) -> str: + if isinstance(value, datetime): + return value.isoformat() + return value + class ExternalKnowledgeApiListResponse(ResponseModel): data: list[ExternalKnowledgeApiResponse] has_more: bool limit: int - total: int + total: int | None page: int -class ExternalRetrievalTestResponse(RootModel[dict[str, Any] | list[dict[str, Any]]]): - root: dict[str, Any] | list[dict[str, Any]] +class ExternalHitTestingQueryResponse(ResponseModel): + content: str + + +class ExternalHitTestingRecordResponse(ResponseModel): + content: str | None = None + title: str | None = None + score: float | None = None + metadata: dict[str, Any] | None = None + + +class ExternalHitTestingResponse(ResponseModel): + query: ExternalHitTestingQueryResponse + records: list[ExternalHitTestingRecordResponse] + + +class BedrockRetrievalRecordResponse(ResponseModel): + metadata: dict[str, Any] | None = None + score: float + title: str | None = None + content: str | None = None + + +class BedrockRetrievalResponse(ResponseModel): + records: list[BedrockRetrievalRecordResponse] register_schema_models( @@ -161,9 +134,16 @@ register_schema_models( ) register_response_schema_models( console_ns, + UsageCountResponse, + DatasetDetailResponse, + ExternalKnowledgeApiBindingResponse, ExternalKnowledgeApiResponse, ExternalKnowledgeApiListResponse, - ExternalRetrievalTestResponse, + ExternalHitTestingQueryResponse, + ExternalHitTestingRecordResponse, + ExternalHitTestingResponse, + BedrockRetrievalRecordResponse, + BedrockRetrievalResponse, ) @@ -187,24 +167,26 @@ class ExternalApiTemplateListApi(Resource): external_knowledge_apis, total = ExternalDatasetService.get_external_knowledge_apis( query.page, query.limit, current_tenant_id, query.keyword ) - response = { - "data": [item.to_dict() for item in external_knowledge_apis], - "has_more": len(external_knowledge_apis) == query.limit, - "limit": query.limit, - "total": total, - "page": query.page, - } - return response, 200 + return ExternalKnowledgeApiListResponse( + data=[ExternalKnowledgeApiResponse.model_validate(item) for item in external_knowledge_apis], + has_more=len(external_knowledge_apis) == query.limit, + limit=query.limit, + total=total, + page=query.page, + ).model_dump(mode="json"), 200 - @setup_required - @login_required - @account_initialization_required + @console_ns.doc("create_external_api_template") + @console_ns.doc(description="Create external knowledge API template") @console_ns.expect(console_ns.models[ExternalKnowledgeApiPayload.__name__]) @console_ns.response( 201, "External API template created successfully", console_ns.models[ExternalKnowledgeApiResponse.__name__], ) + @console_ns.response(403, "Permission denied") + @setup_required + @login_required + @account_initialization_required @with_current_user @with_current_tenant_id def post(self, current_tenant_id: str, current_user: Account): @@ -223,7 +205,7 @@ class ExternalApiTemplateListApi(Resource): except services.errors.dataset.DatasetNameDuplicateError: raise DatasetNameDuplicateError() - return external_knowledge_api.to_dict(), 201 + return dump_response(ExternalKnowledgeApiResponse, external_knowledge_api), 201 @console_ns.route("/datasets/external-knowledge-api/") @@ -249,17 +231,21 @@ class ExternalApiTemplateApi(Resource): if external_knowledge_api is None: raise NotFound("API template not found.") - return external_knowledge_api.to_dict(), 200 + return dump_response(ExternalKnowledgeApiResponse, external_knowledge_api), 200 + @console_ns.doc("update_external_api_template") + @console_ns.doc(description="Update external knowledge API template") + @console_ns.doc(params={"external_knowledge_api_id": "External knowledge API ID"}) + @console_ns.expect(console_ns.models[ExternalKnowledgeApiPayload.__name__]) @console_ns.response( 200, "External API template updated successfully", console_ns.models[ExternalKnowledgeApiResponse.__name__], ) + @console_ns.response(404, "Template not found") @setup_required @login_required @account_initialization_required - @console_ns.expect(console_ns.models[ExternalKnowledgeApiPayload.__name__]) @with_current_user @with_current_tenant_id def patch(self, current_tenant_id: str, current_user: Account, external_knowledge_api_id: UUID): @@ -275,7 +261,7 @@ class ExternalApiTemplateApi(Resource): args=payload.model_dump(), ) - return external_knowledge_api.to_dict(), 200 + return dump_response(ExternalKnowledgeApiResponse, external_knowledge_api), 200 @setup_required @login_required @@ -309,7 +295,7 @@ class ExternalApiUseCheckApi(Resource): external_knowledge_api_is_using, count = ExternalDatasetService.external_knowledge_api_use_check( external_knowledge_api_id_str, current_tenant_id ) - return {"is_using": external_knowledge_api_is_using, "count": count}, 200 + return UsageCountResponse(is_using=external_knowledge_api_is_using, count=count).model_dump(mode="json"), 200 @console_ns.route("/datasets/external") @@ -317,7 +303,9 @@ class ExternalDatasetCreateApi(Resource): @console_ns.doc("create_external_dataset") @console_ns.doc(description="Create external knowledge dataset") @console_ns.expect(console_ns.models[ExternalDatasetCreatePayload.__name__]) - @console_ns.response(201, "External dataset created successfully", dataset_detail_model) + @console_ns.response( + 201, "External dataset created successfully", console_ns.models[DatasetDetailResponse.__name__] + ) @console_ns.response(400, "Invalid parameters") @console_ns.response(403, "Permission denied") @setup_required @@ -345,16 +333,15 @@ class ExternalDatasetCreateApi(Resource): except services.errors.dataset.DatasetNameDuplicateError: raise DatasetNameDuplicateError() - item = marshal(dataset, dataset_detail_fields) - dataset_id_str = item["id"] + dataset_id_str = str(dataset.id) permission_keys_map = enterprise_rbac_service.RBACService.DatasetPermissions.batch_get( str(current_tenant_id), current_user.id, [dataset_id_str], ) - item["permission_keys"] = permission_keys_map.get(dataset_id_str, []) - - return item, 201 + data = DatasetDetailResponse.model_validate(dataset).model_dump(mode="json") + data["permission_keys"] = permission_keys_map.get(dataset_id_str, []) + return data, 201 @console_ns.route("/datasets//external-hit-testing") @@ -366,7 +353,7 @@ class ExternalKnowledgeHitTestingApi(Resource): @console_ns.response( 200, "External hit testing completed successfully", - console_ns.models[ExternalRetrievalTestResponse.__name__], + console_ns.models[ExternalHitTestingResponse.__name__], ) @console_ns.response(404, "Dataset not found") @console_ns.response(400, "Invalid parameters") @@ -399,7 +386,7 @@ class ExternalKnowledgeHitTestingApi(Resource): metadata_filtering_conditions=payload.metadata_filtering_conditions, ) - return response + return dump_response(ExternalHitTestingResponse, response) except Exception as e: raise InternalServerError(str(e)) @@ -410,11 +397,7 @@ class BedrockRetrievalApi(Resource): @console_ns.doc("bedrock_retrieval_test") @console_ns.doc(description="Bedrock retrieval test (internal use only)") @console_ns.expect(console_ns.models[BedrockRetrievalPayload.__name__]) - @console_ns.response( - 200, - "Bedrock retrieval test completed", - console_ns.models[ExternalRetrievalTestResponse.__name__], - ) + @console_ns.response(200, "Bedrock retrieval test completed", console_ns.models[BedrockRetrievalResponse.__name__]) def post(self): payload = BedrockRetrievalPayload.model_validate(console_ns.payload or {}) @@ -422,4 +405,4 @@ class BedrockRetrievalApi(Resource): result = ExternalDatasetTestService.knowledge_retrieval( payload.retrieval_setting, payload.query, payload.knowledge_id ) - return result, 200 + return dump_response(BedrockRetrievalResponse, result), 200 diff --git a/api/controllers/console/datasets/rag_pipeline/rag_pipeline_workflow.py b/api/controllers/console/datasets/rag_pipeline/rag_pipeline_workflow.py index fdc55ea9737..adf0a0006be 100644 --- a/api/controllers/console/datasets/rag_pipeline/rag_pipeline_workflow.py +++ b/api/controllers/console/datasets/rag_pipeline/rag_pipeline_workflow.py @@ -1,5 +1,6 @@ import json import logging +from collections.abc import Mapping from typing import Any, Literal, cast from uuid import UUID @@ -21,8 +22,6 @@ from controllers.console.app.error import ( ) from controllers.console.app.workflow import ( RESTORE_SOURCE_WORKFLOW_MUST_BE_PUBLISHED_MESSAGE, - DefaultBlockConfigResponse, - DefaultBlockConfigsResponse, WorkflowPaginationResponse, WorkflowResponse, ) @@ -41,6 +40,7 @@ from controllers.web.error import InvokeRateLimitError as InvokeRateLimitHttpErr from core.app.apps.base_app_queue_manager import AppQueueManager from core.app.apps.pipeline.pipeline_generator import PipelineGenerator from core.app.entities.app_invoke_entities import InvokeFrom +from core.plugin.entities.plugin_daemon import PluginDatasourceProviderEntity from extensions.ext_database import db from factories import variable_factory from fields.base import ResponseModel @@ -50,9 +50,8 @@ from fields.workflow_run_fields import ( WorkflowRunNodeExecutionResponse, WorkflowRunPaginationResponse, ) -from graphon.model_runtime.utils.encoders import jsonable_encoder from libs import helper -from libs.helper import TimestampField, UUIDStrOrEmpty, dump_response +from libs.helper import UUIDStrOrEmpty, dump_response, to_timestamp from libs.login import login_required from models import Account from models.dataset import Pipeline @@ -72,14 +71,14 @@ logger = logging.getLogger(__name__) class DraftWorkflowSyncPayload(BaseModel): graph: dict[str, Any] hash: str | None = None - environment_variables: list[dict[str, Any]] | None = Field(default=None) - conversation_variables: list[dict[str, Any]] | None = Field(default=None) - rag_pipeline_variables: list[dict[str, Any]] | None = Field(default=None) - features: dict[str, Any] | None = Field(default=None) + environment_variables: list[dict[str, Any]] | None = None + conversation_variables: list[dict[str, Any]] | None = None + rag_pipeline_variables: list[dict[str, Any]] | None = None + features: dict[str, Any] | None = None class NodeRunPayload(BaseModel): - inputs: dict[str, Any] | None = Field(default=None) + inputs: dict[str, Any] | None = None class NodeRunRequiredPayload(BaseModel): @@ -136,14 +135,30 @@ class RagPipelineWorkflowPublishResponse(ResponseModel): created_at: int -class RagPipelineOpaqueResponse(RootModel[Any]): - root: Any - - -class RagPipelineStepParametersResponse(ResponseModel): +class RagPipelineVariablesResponse(ResponseModel): + # TODO: Replace Any with a response model that mirrors graphon.variables.variables.RAGPipelineVariable. variables: Any +class DatasourcePluginListResponse(RootModel[list[PluginDatasourceProviderEntity]]): + pass + + +class RagPipelineRecommendedPluginResponse(ResponseModel): + installed_recommended_plugins: list[Mapping[str, object]] = Field( + description="Installed tool provider payloads. Shape follows the tool provider serializer." + ) + uninstalled_recommended_plugins: list[Mapping[str, object]] = Field( + description="Marketplace plugin manifest payloads returned by the marketplace service." + ) + + +class RagPipelineTransformResponse(ResponseModel): + pipeline_id: str + dataset_id: str + status: str + + register_schema_models( console_ns, DraftWorkflowSyncPayload, @@ -162,10 +177,10 @@ register_schema_models( ) register_response_schema_models( console_ns, - DefaultBlockConfigResponse, - DefaultBlockConfigsResponse, - RagPipelineOpaqueResponse, - RagPipelineStepParametersResponse, + DatasourcePluginListResponse, + RagPipelineRecommendedPluginResponse, + RagPipelineTransformResponse, + RagPipelineVariablesResponse, RagPipelineWorkflowPublishResponse, RagPipelineWorkflowSyncResponse, SimpleResultResponse, @@ -254,17 +269,16 @@ class DraftRagPipelineApi(Resource): except WorkflowHashNotEqualError: raise DraftWorkflowNotSync() - return { - "result": "success", - "hash": workflow.unique_hash, - "updated_at": TimestampField().format(workflow.updated_at or workflow.created_at), - } + return RagPipelineWorkflowSyncResponse( + result="success", + hash=workflow.unique_hash, + updated_at=to_timestamp(workflow.updated_at or workflow.created_at), + ).model_dump(mode="json") @console_ns.route("/rag/pipelines//workflows/draft/iteration/nodes//run") class RagPipelineDraftRunIterationNodeApi(Resource): @console_ns.expect(console_ns.models[NodeRunPayload.__name__]) - @console_ns.response(200, "Success", console_ns.models[RagPipelineOpaqueResponse.__name__]) @setup_required @login_required @account_initialization_required @@ -284,6 +298,7 @@ class RagPipelineDraftRunIterationNodeApi(Resource): pipeline=pipeline, user=current_user, node_id=node_id, args=args, streaming=True ) + # response-contract:ignore compact_generate_response return helper.compact_generate_response(response) except services.errors.conversation.ConversationNotExistsError: raise NotFound("Conversation Not Exists.") @@ -299,7 +314,6 @@ class RagPipelineDraftRunIterationNodeApi(Resource): @console_ns.route("/rag/pipelines//workflows/draft/loop/nodes//run") class RagPipelineDraftRunLoopNodeApi(Resource): @console_ns.expect(console_ns.models[NodeRunPayload.__name__]) - @console_ns.response(200, "Success", console_ns.models[RagPipelineOpaqueResponse.__name__]) @setup_required @login_required @account_initialization_required @@ -319,6 +333,7 @@ class RagPipelineDraftRunLoopNodeApi(Resource): pipeline=pipeline, user=current_user, node_id=node_id, args=args, streaming=True ) + # response-contract:ignore compact_generate_response return helper.compact_generate_response(response) except services.errors.conversation.ConversationNotExistsError: raise NotFound("Conversation Not Exists.") @@ -334,7 +349,6 @@ class RagPipelineDraftRunLoopNodeApi(Resource): @console_ns.route("/rag/pipelines//workflows/draft/run") class DraftRagPipelineRunApi(Resource): @console_ns.expect(console_ns.models[DraftWorkflowRunPayload.__name__]) - @console_ns.response(200, "Success", console_ns.models[RagPipelineOpaqueResponse.__name__]) @setup_required @login_required @account_initialization_required @@ -358,6 +372,7 @@ class DraftRagPipelineRunApi(Resource): streaming=True, ) + # response-contract:ignore compact_generate_response return helper.compact_generate_response(response) except InvokeRateLimitError as ex: raise InvokeRateLimitHttpError(ex.description) @@ -366,7 +381,6 @@ class DraftRagPipelineRunApi(Resource): @console_ns.route("/rag/pipelines//workflows/published/run") class PublishedRagPipelineRunApi(Resource): @console_ns.expect(console_ns.models[PublishedWorkflowRunPayload.__name__]) - @console_ns.response(200, "Success", console_ns.models[RagPipelineOpaqueResponse.__name__]) @setup_required @login_required @account_initialization_required @@ -391,6 +405,7 @@ class PublishedRagPipelineRunApi(Resource): streaming=streaming, ) + # response-contract:ignore compact_generate_response return helper.compact_generate_response(response) except InvokeRateLimitError as ex: raise InvokeRateLimitHttpError(ex.description) @@ -399,7 +414,6 @@ class PublishedRagPipelineRunApi(Resource): @console_ns.route("/rag/pipelines//workflows/published/datasource/nodes//run") class RagPipelinePublishedDatasourceNodeRunApi(Resource): @console_ns.expect(console_ns.models[DatasourceNodeRunPayload.__name__]) - @console_ns.response(200, "Success", console_ns.models[RagPipelineOpaqueResponse.__name__]) @setup_required @login_required @account_initialization_required @@ -414,6 +428,7 @@ class RagPipelinePublishedDatasourceNodeRunApi(Resource): payload = DatasourceNodeRunPayload.model_validate(console_ns.payload or {}) rag_pipeline_service = RagPipelineService() + # response-contract:ignore compact_generate_response return helper.compact_generate_response( PipelineGenerator.convert_to_event_stream( rag_pipeline_service.run_datasource_workflow_node( @@ -432,7 +447,6 @@ class RagPipelinePublishedDatasourceNodeRunApi(Resource): @console_ns.route("/rag/pipelines//workflows/draft/datasource/nodes//run") class RagPipelineDraftDatasourceNodeRunApi(Resource): @console_ns.expect(console_ns.models[DatasourceNodeRunPayload.__name__]) - @console_ns.response(200, "Success", console_ns.models[RagPipelineOpaqueResponse.__name__]) @setup_required @login_required @edit_permission_required @@ -447,6 +461,7 @@ class RagPipelineDraftDatasourceNodeRunApi(Resource): payload = DatasourceNodeRunPayload.model_validate(console_ns.payload or {}) rag_pipeline_service = RagPipelineService() + # response-contract:ignore compact_generate_response return helper.compact_generate_response( PipelineGenerator.convert_to_event_stream( rag_pipeline_service.run_datasource_workflow_node( @@ -492,9 +507,7 @@ class RagPipelineDraftNodeRunApi(Resource): if workflow_node_execution is None: raise ValueError("Workflow node execution not found") - return WorkflowRunNodeExecutionResponse.model_validate( - workflow_node_execution, from_attributes=True - ).model_dump(mode="json") + return dump_response(WorkflowRunNodeExecutionResponse, workflow_node_execution) @console_ns.route("/rag/pipelines//workflow-runs/tasks//stop") @@ -513,7 +526,7 @@ class RagPipelineTaskStopApi(Resource): """ AppQueueManager.set_stop_flag(task_id, InvokeFrom.DEBUGGER, current_user.id) - return {"result": "success"} + return SimpleResultResponse(result="success").model_dump(mode="json") @console_ns.route("/rag/pipelines//workflows/publish") @@ -567,20 +580,18 @@ class PublishedRagPipelineApi(Resource): pipeline.is_published = True pipeline.workflow_id = workflow.id db.session.commit() - workflow_created_at = TimestampField().format(workflow.created_at) + workflow_created_at = to_timestamp(workflow.created_at) - return { - "result": "success", - "created_at": workflow_created_at, - } + return RagPipelineWorkflowPublishResponse(result="success", created_at=workflow_created_at).model_dump( + mode="json" + ) @console_ns.route("/rag/pipelines//workflows/default-workflow-block-configs") class DefaultRagPipelineBlockConfigsApi(Resource): @console_ns.response( 200, - "Default block configs retrieved successfully", - console_ns.models[DefaultBlockConfigsResponse.__name__], + "Default workflow block configurations retrieved successfully", ) @setup_required @login_required @@ -602,8 +613,7 @@ class DefaultRagPipelineBlockConfigApi(Resource): @console_ns.doc(params=query_params_from_model(DefaultBlockConfigQuery)) @console_ns.response( 200, - "Default block config retrieved successfully", - console_ns.models[DefaultBlockConfigResponse.__name__], + "Default workflow block configuration retrieved successfully", ) @setup_required @login_required @@ -631,13 +641,13 @@ class DefaultRagPipelineBlockConfigApi(Resource): @console_ns.route("/rag/pipelines//workflows") class PublishedAllRagPipelineApi(Resource): - @console_ns.doc(params=query_params_from_model(WorkflowListQuery)) @console_ns.response( 200, "Published workflows retrieved successfully", console_ns.models[WorkflowPaginationResponse.__name__], ) @console_ns.response(403, "Permission denied") + @console_ns.doc(params=query_params_from_model(WorkflowListQuery)) @setup_required @login_required @account_initialization_required @@ -671,14 +681,15 @@ class PublishedAllRagPipelineApi(Resource): named_only=named_only, ) - return WorkflowPaginationResponse.model_validate( + return dump_response( + WorkflowPaginationResponse, { "items": workflows, "page": page, "limit": limit, "has_more": has_more, - } - ).model_dump(mode="json") + }, + ) @console_ns.route("/rag/pipelines//workflows//restore") @@ -706,11 +717,11 @@ class RagPipelineDraftWorkflowRestoreApi(Resource): except WorkflowNotFoundError as exc: raise NotFound(str(exc)) from exc - return { - "result": "success", - "hash": workflow.unique_hash, - "updated_at": TimestampField().format(workflow.updated_at or workflow.created_at), - } + return RagPipelineWorkflowSyncResponse( + result="success", + hash=workflow.unique_hash, + updated_at=to_timestamp(workflow.updated_at or workflow.created_at), + ).model_dump(mode="json") @console_ns.route("/rag/pipelines//workflows/") @@ -784,13 +795,17 @@ class RagPipelineByIdApi(Resource): except ValueError as e: raise NotFound(str(e)) - return None, 204 + return "", 204 @console_ns.route("/rag/pipelines//workflows/published/processing/parameters") class PublishedRagPipelineSecondStepApi(Resource): @console_ns.doc(params=query_params_from_model(NodeIdQuery)) - @console_ns.response(200, "Success", console_ns.models[RagPipelineStepParametersResponse.__name__]) + @console_ns.response( + 200, + "Second step parameters retrieved successfully", + console_ns.models[RagPipelineVariablesResponse.__name__], + ) @setup_required @login_required @account_initialization_required @@ -805,15 +820,17 @@ class PublishedRagPipelineSecondStepApi(Resource): node_id = query.node_id rag_pipeline_service = RagPipelineService() variables = rag_pipeline_service.get_second_step_parameters(pipeline=pipeline, node_id=node_id, is_draft=False) - return { - "variables": variables, - } + return dump_response(RagPipelineVariablesResponse, {"variables": variables}) @console_ns.route("/rag/pipelines//workflows/published/pre-processing/parameters") class PublishedRagPipelineFirstStepApi(Resource): @console_ns.doc(params=query_params_from_model(NodeIdQuery)) - @console_ns.response(200, "Success", console_ns.models[RagPipelineStepParametersResponse.__name__]) + @console_ns.response( + 200, + "First step parameters retrieved successfully", + console_ns.models[RagPipelineVariablesResponse.__name__], + ) @setup_required @login_required @account_initialization_required @@ -828,15 +845,17 @@ class PublishedRagPipelineFirstStepApi(Resource): node_id = query.node_id rag_pipeline_service = RagPipelineService() variables = rag_pipeline_service.get_first_step_parameters(pipeline=pipeline, node_id=node_id, is_draft=False) - return { - "variables": variables, - } + return dump_response(RagPipelineVariablesResponse, {"variables": variables}) @console_ns.route("/rag/pipelines//workflows/draft/pre-processing/parameters") class DraftRagPipelineFirstStepApi(Resource): @console_ns.doc(params=query_params_from_model(NodeIdQuery)) - @console_ns.response(200, "Success", console_ns.models[RagPipelineStepParametersResponse.__name__]) + @console_ns.response( + 200, + "First step parameters retrieved successfully", + console_ns.models[RagPipelineVariablesResponse.__name__], + ) @setup_required @login_required @account_initialization_required @@ -851,15 +870,17 @@ class DraftRagPipelineFirstStepApi(Resource): node_id = query.node_id rag_pipeline_service = RagPipelineService() variables = rag_pipeline_service.get_first_step_parameters(pipeline=pipeline, node_id=node_id, is_draft=True) - return { - "variables": variables, - } + return dump_response(RagPipelineVariablesResponse, {"variables": variables}) @console_ns.route("/rag/pipelines//workflows/draft/processing/parameters") class DraftRagPipelineSecondStepApi(Resource): @console_ns.doc(params=query_params_from_model(NodeIdQuery)) - @console_ns.response(200, "Success", console_ns.models[RagPipelineStepParametersResponse.__name__]) + @console_ns.response( + 200, + "Second step parameters retrieved successfully", + console_ns.models[RagPipelineVariablesResponse.__name__], + ) @setup_required @login_required @account_initialization_required @@ -875,9 +896,7 @@ class DraftRagPipelineSecondStepApi(Resource): rag_pipeline_service = RagPipelineService() variables = rag_pipeline_service.get_second_step_parameters(pipeline=pipeline, node_id=node_id, is_draft=True) - return { - "variables": variables, - } + return dump_response(RagPipelineVariablesResponse, {"variables": variables}) @console_ns.route("/rag/pipelines//workflow-runs") @@ -910,7 +929,7 @@ class RagPipelineWorkflowRunListApi(Resource): rag_pipeline_service = RagPipelineService() result = rag_pipeline_service.get_rag_pipeline_paginate_workflow_runs(pipeline=pipeline, args=args) - return WorkflowRunPaginationResponse.model_validate(result, from_attributes=True).model_dump(mode="json") + return dump_response(WorkflowRunPaginationResponse, result) @console_ns.route("/rag/pipelines//workflow-runs/") @@ -935,7 +954,7 @@ class RagPipelineWorkflowRunDetailApi(Resource): if workflow_run is None: raise NotFound("Workflow run not found") - return WorkflowRunDetailResponse.model_validate(workflow_run, from_attributes=True).model_dump(mode="json") + return dump_response(WorkflowRunDetailResponse, workflow_run) @console_ns.route("/rag/pipelines//workflow-runs//node-executions") @@ -964,20 +983,25 @@ class RagPipelineWorkflowRunNodeExecutionListApi(Resource): user=user, ) - return WorkflowRunNodeExecutionListResponse.model_validate( - {"data": node_executions}, from_attributes=True - ).model_dump(mode="json") + return dump_response(WorkflowRunNodeExecutionListResponse, {"data": node_executions}) @console_ns.route("/rag/pipelines/datasource-plugins") class DatasourceListApi(Resource): - @console_ns.response(200, "Success", console_ns.models[RagPipelineOpaqueResponse.__name__]) + @console_ns.response( + 200, + "Datasource plugins retrieved successfully", + console_ns.models[DatasourcePluginListResponse.__name__], + ) @setup_required @login_required @account_initialization_required @with_current_tenant_id def get(self, current_tenant_id: str): - return jsonable_encoder(RagPipelineManageService.list_rag_pipeline_datasources(current_tenant_id)) + return dump_response( + DatasourcePluginListResponse, + RagPipelineManageService.list_rag_pipeline_datasources(current_tenant_id), + ) @console_ns.route("/rag/pipelines//workflows/draft/nodes//last-run") @@ -1003,12 +1027,16 @@ class RagPipelineWorkflowLastRunApi(Resource): ) if node_exec is None: raise NotFound("last run not found") - return WorkflowRunNodeExecutionResponse.model_validate(node_exec, from_attributes=True).model_dump(mode="json") + return dump_response(WorkflowRunNodeExecutionResponse, node_exec) @console_ns.route("/rag/pipelines/transform/datasets/") class RagPipelineTransformApi(Resource): - @console_ns.response(200, "Success", console_ns.models[RagPipelineOpaqueResponse.__name__]) + @console_ns.response( + 200, + "Dataset transformed successfully", + console_ns.models[RagPipelineTransformResponse.__name__], + ) @setup_required @login_required @account_initialization_required @@ -1020,7 +1048,7 @@ class RagPipelineTransformApi(Resource): dataset_id_str = str(dataset_id) rag_pipeline_transform_service = RagPipelineTransformService() result = rag_pipeline_transform_service.transform_dataset(dataset_id_str, db.session) - return result + return dump_response(RagPipelineTransformResponse, result) @console_ns.route("/rag/pipelines//workflows/draft/datasource/variables-inspect") @@ -1050,15 +1078,17 @@ class RagPipelineDatasourceVariableApi(Resource): args=args, current_user=current_user, ) - return WorkflowRunNodeExecutionResponse.model_validate( - workflow_node_execution, from_attributes=True - ).model_dump(mode="json") + return dump_response(WorkflowRunNodeExecutionResponse, workflow_node_execution) @console_ns.route("/rag/pipelines/recommended-plugins") class RagPipelineRecommendedPluginApi(Resource): @console_ns.doc(params=query_params_from_model(RagPipelineRecommendedPluginQuery)) - @console_ns.response(200, "Success", console_ns.models[RagPipelineOpaqueResponse.__name__]) + @console_ns.response( + 200, + "Recommended plugins retrieved successfully", + console_ns.models[RagPipelineRecommendedPluginResponse.__name__], + ) @setup_required @login_required @account_initialization_required @@ -1069,4 +1099,4 @@ class RagPipelineRecommendedPluginApi(Resource): rag_pipeline_service = RagPipelineService() recommended_plugins = rag_pipeline_service.get_recommended_plugins(query.type, current_user, current_tenant_id) - return recommended_plugins + return dump_response(RagPipelineRecommendedPluginResponse, recommended_plugins) diff --git a/api/controllers/console/explore/trial.py b/api/controllers/console/explore/trial.py index 6aef9129780..fd614ece87f 100644 --- a/api/controllers/console/explore/trial.py +++ b/api/controllers/console/explore/trial.py @@ -1,28 +1,24 @@ import logging -from typing import Any, Literal, cast +from typing import Literal from flask import request -from flask_restx import Resource, fields, marshal, marshal_with +from flask_restx import Resource from pydantic import BaseModel, Field from sqlalchemy import select from werkzeug.exceptions import Forbidden, InternalServerError, NotFound import services -from controllers.common.fields import ( - AudioBinaryResponse, - AudioTranscriptResponse, - GeneratedAppResponse, - SimpleResultResponse, -) +from controllers.common.fields import AudioBinaryResponse, AudioTranscriptResponse, SimpleResultResponse from controllers.common.fields import Parameters as ParametersResponse from controllers.common.fields import Site as SiteResponse from controllers.common.schema import ( - get_or_create_model, query_params_from_model, + query_params_from_request, register_response_schema_models, register_schema_models, ) from controllers.console import console_ns +from controllers.console.app.app import AppDetailWithSite from controllers.console.app.error import ( AppUnavailableError, AudioTooLargeError, @@ -36,6 +32,7 @@ from controllers.console.app.error import ( ProviderQuotaExceededError, UnsupportedAudioTypeError, ) +from controllers.console.app.workflow import WorkflowResponse from controllers.console.app.wraps import get_app_model_with_trial from controllers.console.explore.error import ( AppSuggestedQuestionsAfterAnswerDisabledError, @@ -56,26 +53,13 @@ from core.errors.error import ( ) from extensions.ext_database import db from extensions.ext_redis import redis_client -from fields.app_fields import ( - app_detail_fields_with_site, - deleted_tool_fields, - model_config_fields, - site_fields, - tag_fields, -) -from fields.dataset_fields import dataset_fields -from fields.member_fields import simple_account_fields +from fields.base import ResponseModel +from fields.dataset_fields import DatasetDetailResponse from fields.message_fields import SuggestedQuestionsResponse -from fields.workflow_fields import ( - conversation_variable_fields, - pipeline_variable_fields, - workflow_fields, - workflow_partial_fields, -) from graphon.graph_engine.manager import GraphEngineManager from graphon.model_runtime.errors.invoke import InvokeError from libs import helper -from libs.helper import uuid_value +from libs.helper import dump_response, uuid_value from models import Account from models.account import TenantStatus from models.model import AppMode, Site @@ -102,57 +86,42 @@ from services.recommended_app_service import RecommendedAppService logger = logging.getLogger(__name__) -model_config_model = get_or_create_model("TrialAppModelConfig", model_config_fields) -workflow_partial_model = get_or_create_model("TrialWorkflowPartial", workflow_partial_fields) -deleted_tool_model = get_or_create_model("TrialDeletedTool", deleted_tool_fields) -tag_model = get_or_create_model("TrialTag", tag_fields) -site_model = get_or_create_model("TrialSite", site_fields) +class TrialDatasetListItemResponse(DatasetDetailResponse): + pass -app_detail_fields_with_site_copy = app_detail_fields_with_site.copy() -app_detail_fields_with_site_copy["model_config"] = fields.Nested( - model_config_model, attribute="app_model_config", allow_null=True -) -app_detail_fields_with_site_copy["workflow"] = fields.Nested(workflow_partial_model, allow_null=True) -app_detail_fields_with_site_copy["deleted_tools"] = fields.List(fields.Nested(deleted_tool_model)) -app_detail_fields_with_site_copy["tags"] = fields.List(fields.Nested(tag_model)) -app_detail_fields_with_site_copy["site"] = fields.Nested(site_model) -app_detail_with_site_model = get_or_create_model("TrialAppDetailWithSite", app_detail_fields_with_site_copy) -simple_account_model = get_or_create_model("TrialSimpleAccount", simple_account_fields) -conversation_variable_model = get_or_create_model("TrialConversationVariable", conversation_variable_fields) -pipeline_variable_model = get_or_create_model("TrialPipelineVariable", pipeline_variable_fields) +class TrialDatasetListResponse(ResponseModel): + data: list[TrialDatasetListItemResponse] + has_more: bool + limit: int + total: int + page: int -workflow_fields_copy = workflow_fields.copy() -workflow_fields_copy["created_by"] = fields.Nested(simple_account_model, attribute="created_by_account") -workflow_fields_copy["updated_by"] = fields.Nested( - simple_account_model, attribute="updated_by_account", allow_null=True -) -workflow_fields_copy["conversation_variables"] = fields.List(fields.Nested(conversation_variable_model)) -workflow_fields_copy["rag_pipeline_variables"] = fields.List(fields.Nested(pipeline_variable_model)) -workflow_model = get_or_create_model("TrialWorkflow", workflow_fields_copy) -dataset_model = get_or_create_model("TrialDataset", dataset_fields) -dataset_list_model = get_or_create_model( - "TrialDatasetList", - { - "data": fields.List(fields.Nested(dataset_model)), - "has_more": fields.Boolean, - "limit": fields.Integer, - "total": fields.Integer, - "page": fields.Integer, - }, +register_response_schema_models( + console_ns, + ParametersResponse, + AppDetailWithSite, + AudioBinaryResponse, + AudioTranscriptResponse, + SimpleResultResponse, + SiteResponse, + SuggestedQuestionsResponse, + TrialDatasetListItemResponse, + TrialDatasetListResponse, + WorkflowResponse, ) class WorkflowRunRequest(BaseModel): inputs: dict - files: list | None = Field(default=None) + files: list | None = None class ChatRequest(BaseModel): inputs: dict query: str - files: list | None = Field(default=None) + files: list | None = None conversation_id: str | None = None parent_message_id: str | None = None retriever_from: str = "explore_app" @@ -168,7 +137,7 @@ class TextToSpeechRequest(BaseModel): class CompletionRequest(BaseModel): inputs: dict query: str = "" - files: list | None = Field(default=None) + files: list | None = None response_mode: Literal["blocking", "streaming"] | None = None retriever_from: str = "explore_app" @@ -187,23 +156,13 @@ register_schema_models( CompletionRequest, TrialDatasetListQuery, ) -register_response_schema_models( - console_ns, - ParametersResponse, - AudioBinaryResponse, - AudioTranscriptResponse, - GeneratedAppResponse, - SimpleResultResponse, - SiteResponse, - SuggestedQuestionsResponse, -) class TrialAppWorkflowRunApi(TrialAppResource): @trial_feature_enable - @console_ns.expect(console_ns.models[WorkflowRunRequest.__name__]) - @console_ns.response(200, "Success", console_ns.models[GeneratedAppResponse.__name__]) @with_current_user + @console_ns.expect(console_ns.models[WorkflowRunRequest.__name__]) + @console_ns.response(200, "Success") def post(self, current_user: Account, trial_app): """ Run workflow @@ -224,6 +183,7 @@ class TrialAppWorkflowRunApi(TrialAppResource): app_model=app_model, user=current_user, args=args, invoke_from=InvokeFrom.EXPLORE, streaming=True ) RecommendedAppService.add_trial_app_record(db.session, app_id, user_id) + # response-contract:ignore compact_generate_response return helper.compact_generate_response(response) except ProviderTokenNotInitError as ex: raise ProviderNotInitializeError(ex.description) @@ -263,12 +223,12 @@ class TrialAppWorkflowTaskStopApi(TrialAppResource): # New graph engine command channel mechanism GraphEngineManager(redis_client).send_stop_command(task_id) - return {"result": "success"} + return SimpleResultResponse(result="success").model_dump(mode="json") class TrialChatApi(TrialAppResource): @console_ns.expect(console_ns.models[ChatRequest.__name__]) - @console_ns.response(200, "Success", console_ns.models[GeneratedAppResponse.__name__]) + @console_ns.response(200, "Success") @trial_feature_enable @with_current_user def post(self, current_user: Account, trial_app): @@ -297,6 +257,7 @@ class TrialChatApi(TrialAppResource): app_model=app_model, user=current_user, args=args, invoke_from=InvokeFrom.EXPLORE, streaming=True ) RecommendedAppService.add_trial_app_record(db.session, app_id, user_id) + # response-contract:ignore compact_generate_response return helper.compact_generate_response(response) except services.errors.conversation.ConversationNotExistsError: raise NotFound("Conversation Not Exists.") @@ -355,7 +316,7 @@ class TrialMessageSuggestedQuestionApi(TrialAppResource): logger.exception("internal server error.") raise InternalServerError() - return {"data": questions} + return dump_response(SuggestedQuestionsResponse, {"data": questions}) class TrialChatAudioApi(TrialAppResource): @@ -374,7 +335,7 @@ class TrialChatAudioApi(TrialAppResource): response = AudioService.transcript_asr(app_model=app_model, file=file, end_user=None) RecommendedAppService.add_trial_app_record(db.session, app_id, user_id) - return response + return dump_response(AudioTranscriptResponse, response) except services.errors.app_model_config.AppModelConfigBrokenError: logger.exception("App model config broken.") raise AppUnavailableError() @@ -427,6 +388,7 @@ class TrialChatTextApi(TrialAppResource): message_id=message_id, ) RecommendedAppService.add_trial_app_record(db.session, app_id, user_id) + # response-contract:ignore binary response return response except services.errors.app_model_config.AppModelConfigBrokenError: logger.exception("App model config broken.") @@ -456,7 +418,7 @@ class TrialChatTextApi(TrialAppResource): class TrialCompletionApi(TrialAppResource): @console_ns.expect(console_ns.models[CompletionRequest.__name__]) - @console_ns.response(200, "Success", console_ns.models[GeneratedAppResponse.__name__]) + @console_ns.response(200, "Success") @trial_feature_enable @with_current_user def post(self, current_user: Account, trial_app): @@ -480,6 +442,7 @@ class TrialCompletionApi(TrialAppResource): ) RecommendedAppService.add_trial_app_record(db.session, app_id, user_id) + # response-contract:ignore compact_generate_response return helper.compact_generate_response(response) except services.errors.conversation.ConversationNotExistsError: raise NotFound("Conversation Not Exists.") @@ -557,50 +520,49 @@ class TrialAppParameterApi(Resource): class AppApi(Resource): - @console_ns.response(200, "Success", app_detail_with_site_model) @get_app_model_with_trial(None) - @marshal_with(app_detail_with_site_model) + @console_ns.response(200, "App detail retrieved successfully", console_ns.models[AppDetailWithSite.__name__]) def get(self, app_model): """Get app detail""" app_service = AppService() app_model = app_service.get_app(app_model) - return app_model + return dump_response(AppDetailWithSite, app_model) class AppWorkflowApi(Resource): - @console_ns.response(200, "Success", workflow_model) @get_app_model_with_trial(None) - @marshal_with(workflow_model) + @console_ns.response(200, "Workflow detail retrieved successfully", console_ns.models[WorkflowResponse.__name__]) def get(self, app_model): """Get workflow detail""" if not app_model.workflow_id: raise AppUnavailableError() workflow = db.session.get(Workflow, app_model.workflow_id) - return workflow + return dump_response(WorkflowResponse, workflow) class DatasetListApi(Resource): @console_ns.doc(params=query_params_from_model(TrialDatasetListQuery)) - @console_ns.response(200, "Success", dataset_list_model) + @console_ns.response(200, "Success", console_ns.models[TrialDatasetListResponse.__name__]) @get_app_model_with_trial(None) def get(self, app_model): - page = request.args.get("page", default=1, type=int) - limit = request.args.get("limit", default=20, type=int) - ids = request.args.getlist("ids") + query = query_params_from_request( + TrialDatasetListQuery, + list_fields=("ids",), + use_defaults_for_malformed_ints=True, + ) tenant_id = app_model.tenant_id - if ids: - datasets, total = DatasetService.get_datasets_by_ids(ids, tenant_id) + if query.ids: + datasets, total = DatasetService.get_datasets_by_ids(query.ids, tenant_id) else: raise NeedAddIdsError() - data = cast(list[dict[str, Any]], marshal(datasets, dataset_fields)) - - response = {"data": data, "has_more": len(datasets) == limit, "limit": limit, "total": total, "page": page} - return response + return TrialDatasetListResponse( + data=datasets, has_more=len(datasets) == query.limit, limit=query.limit, total=total or 0, page=query.page + ).model_dump(mode="json") console_ns.add_resource(TrialChatApi, "/trial-apps//chat-messages", endpoint="trial_app_chat_completion") diff --git a/api/controllers/console/snippets/snippet_workflow.py b/api/controllers/console/snippets/snippet_workflow.py index 0b8dc264a68..17416ee8610 100644 --- a/api/controllers/console/snippets/snippet_workflow.py +++ b/api/controllers/console/snippets/snippet_workflow.py @@ -8,20 +8,18 @@ from pydantic import BaseModel, Field from sqlalchemy.orm import Session, sessionmaker from werkzeug.exceptions import BadRequest, InternalServerError, NotFound -from controllers.common.fields import GeneratedAppResponse, SimpleResultResponse +from controllers.common.fields import EventStreamResponse, SimpleResultResponse from controllers.common.schema import query_params_from_model, register_response_schema_models, register_schema_models from controllers.console import console_ns from controllers.console.app.error import DraftWorkflowNotExist, DraftWorkflowNotSync from controllers.console.app.workflow import ( RESTORE_SOURCE_WORKFLOW_MUST_BE_PUBLISHED_MESSAGE, - DefaultBlockConfigsResponse, + PublishWorkflowResponse, + SyncDraftWorkflowResponse, WorkflowPaginationResponse, - WorkflowPublishResponse, WorkflowResponse, - WorkflowRestoreResponse, ) from controllers.console.snippets.payloads import ( - PublishWorkflowPayload, SnippetDraftNodeRunPayload, SnippetDraftRunPayload, SnippetDraftSyncPayload, @@ -43,6 +41,7 @@ from core.app.apps.base_app_queue_manager import AppQueueManager from core.app.entities.app_invoke_entities import InvokeFrom from extensions.ext_database import db from extensions.ext_redis import redis_client +from fields.base import ResponseModel from fields.workflow_run_fields import ( WorkflowRunDetailResponse, WorkflowRunNodeExecutionListResponse, @@ -51,7 +50,7 @@ from fields.workflow_run_fields import ( ) from graphon.graph_engine.manager import GraphEngineManager from libs import helper -from libs.helper import TimestampField +from libs.helper import dump_response, to_timestamp from libs.login import current_account_with_tenant, login_required from models import Account from models.snippet import CustomizedSnippet @@ -76,7 +75,7 @@ class SnippetWorkflowResponse(WorkflowResponse): input_fields: list[dict] = Field(default_factory=list) -class SnippetDraftConfigResponse(BaseModel): +class SnippetDraftConfigResponse(ResponseModel): parallel_depth_limit: int @@ -96,19 +95,17 @@ register_schema_models( SnippetLoopNodeRunPayload, SnippetWorkflowListQuery, WorkflowRunQuery, - PublishWorkflowPayload, ) register_response_schema_models( console_ns, - DefaultBlockConfigsResponse, - GeneratedAppResponse, + EventStreamResponse, SimpleResultResponse, SnippetDraftConfigResponse, SnippetWorkflowResponse, SnippetWorkflowPaginationResponse, - WorkflowPublishResponse, + PublishWorkflowResponse, WorkflowPaginationResponse, - WorkflowRestoreResponse, + SyncDraftWorkflowResponse, WorkflowRunPaginationResponse, WorkflowRunDetailResponse, WorkflowRunNodeExecutionListResponse, @@ -175,7 +172,7 @@ class SnippetDraftWorkflowApi(Resource): raise DraftWorkflowNotExist() workflow.conversation_variables = [] - response = SnippetWorkflowResponse.model_validate(workflow, from_attributes=True).model_dump(mode="json") + response = dump_response(SnippetWorkflowResponse, workflow) response["input_fields"] = snippet.input_fields_list return response @@ -184,7 +181,7 @@ class SnippetDraftWorkflowApi(Resource): @console_ns.response( 200, "Draft workflow synced successfully", - console_ns.models[WorkflowRestoreResponse.__name__], + console_ns.models[SyncDraftWorkflowResponse.__name__], ) @console_ns.response(400, "Hash mismatch") @setup_required @@ -214,11 +211,11 @@ class SnippetDraftWorkflowApi(Resource): except ValueError as e: return {"message": str(e)}, 400 - return { - "result": "success", - "hash": workflow.unique_hash, - "updated_at": TimestampField().format(workflow.updated_at or workflow.created_at), - } + return SyncDraftWorkflowResponse( + result="success", + hash=workflow.unique_hash, + updated_at=to_timestamp(workflow.updated_at or workflow.created_at), + ).model_dump(mode="json") @console_ns.route("/snippets//workflows/draft/config") @@ -237,9 +234,7 @@ class SnippetDraftConfigApi(Resource): @rbac_permission_required(RBACResourceScope.WORKSPACE, RBACPermission.SNIPPETS_MANAGE, resource_required=False) def get(self, snippet: CustomizedSnippet): """Get snippet draft workflow configuration limits.""" - return { - "parallel_depth_limit": 3, - } + return SnippetDraftConfigResponse(parallel_depth_limit=3).model_dump(mode="json") @console_ns.route("/snippets//workflows/publish") @@ -268,13 +263,12 @@ class SnippetPublishedWorkflowApi(Resource): if not workflow: return None - response = SnippetWorkflowResponse.model_validate(workflow, from_attributes=True).model_dump(mode="json") + response = dump_response(SnippetWorkflowResponse, workflow) response["input_fields"] = snippet.input_fields_list return response @console_ns.doc("publish_snippet_workflow") - @console_ns.expect(console_ns.models.get(PublishWorkflowPayload.__name__)) - @console_ns.response(200, "Workflow published successfully", console_ns.models[WorkflowPublishResponse.__name__]) + @console_ns.response(200, "Workflow published successfully", console_ns.models[PublishWorkflowResponse.__name__]) @console_ns.response(400, "No draft workflow found") @setup_required @login_required @@ -297,25 +291,18 @@ class SnippetPublishedWorkflowApi(Resource): snippet=snippet, account=current_user, ) - workflow_created_at = TimestampField().format(workflow.created_at) + workflow_created_at = to_timestamp(workflow.created_at) session.commit() except ValueError as e: return {"message": str(e)}, 400 - return { - "result": "success", - "created_at": workflow_created_at, - } + return PublishWorkflowResponse(result="success", created_at=workflow_created_at).model_dump(mode="json") @console_ns.route("/snippets//workflows/default-workflow-block-configs") class SnippetDefaultBlockConfigsApi(Resource): @console_ns.doc("get_snippet_default_block_configs") - @console_ns.response( - 200, - "Default block configs retrieved successfully", - console_ns.models[DefaultBlockConfigsResponse.__name__], - ) + @console_ns.response(200, "Default block configs retrieved successfully") @setup_required @login_required @account_initialization_required @@ -377,7 +364,7 @@ class SnippetDraftWorkflowRestoreApi(Resource): @console_ns.doc("restore_snippet_workflow_to_draft") @console_ns.doc(description="Restore a published snippet workflow version into the draft workflow") @console_ns.doc(params={"snippet_id": "Snippet ID", "workflow_id": "Published workflow ID"}) - @console_ns.response(200, "Workflow restored successfully", console_ns.models[WorkflowRestoreResponse.__name__]) + @console_ns.response(200, "Workflow restored successfully", console_ns.models[SyncDraftWorkflowResponse.__name__]) @console_ns.response(400, "Source workflow must be published") @console_ns.response(404, "Workflow not found") @setup_required @@ -406,11 +393,11 @@ class SnippetDraftWorkflowRestoreApi(Resource): except ValueError as exc: raise BadRequest(str(exc)) from exc - return { - "result": "success", - "hash": workflow.unique_hash, - "updated_at": TimestampField().format(workflow.updated_at or workflow.created_at), - } + return SyncDraftWorkflowResponse( + result="success", + hash=workflow.unique_hash, + updated_at=to_timestamp(workflow.updated_at or workflow.created_at), + ).model_dump(mode="json") @console_ns.route("/snippets//workflow-runs") @@ -442,7 +429,7 @@ class SnippetWorkflowRunsApi(Resource): snippet_service = _snippet_service() result = snippet_service.get_snippet_workflow_runs(snippet=snippet, args=args) - return WorkflowRunPaginationResponse.model_validate(result, from_attributes=True).model_dump(mode="json") + return dump_response(WorkflowRunPaginationResponse, result) @console_ns.route("/snippets//workflow-runs/") @@ -468,7 +455,7 @@ class SnippetWorkflowRunDetailApi(Resource): if not workflow_run: raise NotFound("Workflow run not found") - return WorkflowRunDetailResponse.model_validate(workflow_run, from_attributes=True).model_dump(mode="json") + return dump_response(WorkflowRunDetailResponse, workflow_run) @console_ns.route("/snippets//workflow-runs//node-executions") @@ -493,9 +480,7 @@ class SnippetWorkflowRunNodeExecutionsApi(Resource): run_id=run_id, ) - return WorkflowRunNodeExecutionListResponse.model_validate( - {"data": node_executions}, from_attributes=True - ).model_dump(mode="json") + return dump_response(WorkflowRunNodeExecutionListResponse, {"data": node_executions}) @console_ns.route("/snippets//workflows/draft/nodes//run") @@ -546,9 +531,7 @@ class SnippetDraftNodeRunApi(Resource): session_maker=_snippet_session_maker(), ) - return WorkflowRunNodeExecutionResponse.model_validate( - workflow_node_execution, from_attributes=True - ).model_dump(mode="json") + return dump_response(WorkflowRunNodeExecutionResponse, workflow_node_execution) @console_ns.route("/snippets//workflows/draft/nodes//last-run") @@ -584,7 +567,7 @@ class SnippetDraftNodeLastRunApi(Resource): if node_exec is None: raise NotFound("Node last run not found") - return WorkflowRunNodeExecutionResponse.model_validate(node_exec, from_attributes=True).model_dump(mode="json") + return dump_response(WorkflowRunNodeExecutionResponse, node_exec) @console_ns.route("/snippets//workflows/draft/iteration/nodes//run") @@ -596,7 +579,7 @@ class SnippetDraftRunIterationNodeApi(Resource): @console_ns.response( 200, "Iteration node run started successfully (SSE stream)", - console_ns.models[GeneratedAppResponse.__name__], + console_ns.models[EventStreamResponse.__name__], ) @console_ns.response(404, "Snippet or draft workflow not found") @setup_required @@ -627,6 +610,7 @@ class SnippetDraftRunIterationNodeApi(Resource): session_maker=_snippet_session_maker(), ) + # response-contract:ignore compact_generate_response return helper.compact_generate_response(response) except ValueError as e: raise e @@ -644,7 +628,7 @@ class SnippetDraftRunLoopNodeApi(Resource): @console_ns.response( 200, "Loop node run started successfully (SSE stream)", - console_ns.models[GeneratedAppResponse.__name__], + console_ns.models[EventStreamResponse.__name__], ) @console_ns.response(404, "Snippet or draft workflow not found") @setup_required @@ -675,6 +659,7 @@ class SnippetDraftRunLoopNodeApi(Resource): session_maker=_snippet_session_maker(), ) + # response-contract:ignore compact_generate_response return helper.compact_generate_response(response) except ValueError as e: raise e @@ -690,7 +675,7 @@ class SnippetDraftWorkflowRunApi(Resource): @console_ns.response( 200, "Draft workflow run started successfully (SSE stream)", - console_ns.models[GeneratedAppResponse.__name__], + console_ns.models[EventStreamResponse.__name__], ) @console_ns.response(404, "Snippet or draft workflow not found") @setup_required @@ -722,6 +707,7 @@ class SnippetDraftWorkflowRunApi(Resource): session_maker=_snippet_session_maker(), ) + # response-contract:ignore compact_generate_response return helper.compact_generate_response(response) except ValueError as e: raise e @@ -757,4 +743,4 @@ class SnippetWorkflowTaskStopApi(Resource): # New graph engine command channel mechanism GraphEngineManager(redis_client).send_stop_command(task_id) - return {"result": "success"} + return SimpleResultResponse(result="success").model_dump(mode="json") diff --git a/api/controllers/console/workspace/snippets.py b/api/controllers/console/workspace/snippets.py index e8f0b228c8b..6e7c79f85ae 100644 --- a/api/controllers/console/workspace/snippets.py +++ b/api/controllers/console/workspace/snippets.py @@ -1,16 +1,13 @@ import logging import re -from typing import Any from urllib.parse import quote from flask import Response, request -from flask_restx import Resource, marshal -from pydantic import RootModel +from flask_restx import Resource from sqlalchemy.orm import Session, sessionmaker from werkzeug.datastructures import MultiDict from werkzeug.exceptions import NotFound -from controllers.common.fields import TextFileResponse from controllers.common.schema import query_params_from_model, register_response_schema_models, register_schema_models from controllers.console import console_ns from controllers.console.snippets.payloads import ( @@ -32,12 +29,13 @@ from controllers.console.wraps import ( ) from extensions.ext_database import db from fields.base import ResponseModel -from fields.snippet_fields import snippet_fields, snippet_list_fields, snippet_pagination_fields +from fields.snippet_fields import SnippetPaginationResponse, SnippetResponse +from libs.helper import dump_response from libs.login import login_required from models import Account from models.snippet import SnippetType from services.app_dsl_service import ImportStatus -from services.snippet_dsl_service import SnippetDslService +from services.snippet_dsl_service import CheckDependenciesResult, SnippetDslService, SnippetImportInfo from services.snippet_service import SnippetService logger = logging.getLogger(__name__) @@ -45,15 +43,7 @@ _TAG_IDS_BRACKET_PATTERN = re.compile(r"^tag_ids\[(\d+)\]$") _CREATOR_IDS_BRACKET_PATTERN = re.compile(r"^creator_ids\[(\d+)\]$") -class SnippetImportResponse(RootModel[dict[str, Any]]): - root: dict[str, Any] - - -class SnippetDependencyCheckResponse(RootModel[dict[str, Any]]): - root: dict[str, Any] - - -class SnippetUseCountResponse(ResponseModel): +class SnippetUseCountIncrementResponse(ResponseModel): result: str use_count: int @@ -100,30 +90,22 @@ register_schema_models( IncludeSecretQuery, ) register_response_schema_models( - console_ns, - TextFileResponse, - SnippetImportResponse, - SnippetDependencyCheckResponse, - SnippetUseCountResponse, + console_ns, SnippetResponse, SnippetPaginationResponse, SnippetUseCountIncrementResponse, SnippetImportInfo ) -# Create namespace models for marshaling -snippet_model = console_ns.model("Snippet", snippet_fields) -snippet_list_model = console_ns.model("SnippetList", snippet_list_fields) -snippet_pagination_model = console_ns.model("SnippetPagination", snippet_pagination_fields) - @console_ns.route("/workspaces/current/customized-snippets") class CustomizedSnippetsApi(Resource): @console_ns.doc("list_customized_snippets") @console_ns.doc(params=query_params_from_model(SnippetListQuery)) - @console_ns.response(200, "Snippets retrieved successfully", snippet_pagination_model) + @console_ns.response(200, "Snippets retrieved successfully", console_ns.models[SnippetPaginationResponse.__name__]) @setup_required @login_required @account_initialization_required @with_current_tenant_id def get(self, current_tenant_id: str): """List customized snippets with pagination and search.""" + query = SnippetListQuery.model_validate(_normalize_snippet_list_query_args(request.args)) snippet_service = _snippet_service() @@ -138,17 +120,20 @@ class CustomizedSnippetsApi(Resource): tag_ids=query.tag_ids, ) - return { - "data": marshal(snippets, snippet_list_fields), - "page": query.page, - "limit": query.limit, - "total": total, - "has_more": has_more, - }, 200 + return dump_response( + SnippetPaginationResponse, + { + "data": snippets, + "page": query.page, + "limit": query.limit, + "total": total, + "has_more": has_more, + }, + ), 200 @console_ns.doc("create_customized_snippet") @console_ns.expect(console_ns.models.get(CreateSnippetPayload.__name__)) - @console_ns.response(201, "Snippet created successfully", snippet_model) + @console_ns.response(201, "Snippet created successfully", console_ns.models[SnippetResponse.__name__]) @console_ns.response(400, "Invalid request") @setup_required @login_required @@ -161,6 +146,7 @@ class CustomizedSnippetsApi(Resource): @with_current_tenant_id def post(self, current_tenant_id: str, current_user: Account): """Create a new customized snippet.""" + payload = CreateSnippetPayload.model_validate(console_ns.payload or {}) try: @@ -185,13 +171,13 @@ class CustomizedSnippetsApi(Resource): except ValueError as e: return {"message": str(e)}, 400 - return marshal(snippet, snippet_fields), 201 + return dump_response(SnippetResponse, snippet), 201 @console_ns.route("/workspaces/current/customized-snippets/") class CustomizedSnippetDetailApi(Resource): @console_ns.doc("get_customized_snippet") - @console_ns.response(200, "Snippet retrieved successfully", snippet_model) + @console_ns.response(200, "Snippet retrieved successfully", console_ns.models[SnippetResponse.__name__]) @console_ns.response(404, "Snippet not found") @setup_required @login_required @@ -199,20 +185,21 @@ class CustomizedSnippetDetailApi(Resource): @with_current_tenant_id def get(self, current_tenant_id: str, snippet_id: str): """Get customized snippet details.""" + snippet_service = _snippet_service() snippet = snippet_service.get_snippet_by_id( - snippet_id=str(snippet_id), + snippet_id=snippet_id, tenant_id=current_tenant_id, ) if not snippet: raise NotFound("Snippet not found") - return marshal(snippet, snippet_fields), 200 + return dump_response(SnippetResponse, snippet), 200 @console_ns.doc("update_customized_snippet") @console_ns.expect(console_ns.models.get(UpdateSnippetPayload.__name__)) - @console_ns.response(200, "Snippet updated successfully", snippet_model) + @console_ns.response(200, "Snippet updated successfully", console_ns.models[SnippetResponse.__name__]) @console_ns.response(400, "Invalid request") @console_ns.response(404, "Snippet not found") @setup_required @@ -226,9 +213,10 @@ class CustomizedSnippetDetailApi(Resource): @with_current_tenant_id def patch(self, current_tenant_id: str, current_user: Account, snippet_id: str): """Update customized snippet.""" + snippet_service = _snippet_service() snippet = snippet_service.get_snippet_by_id( - snippet_id=str(snippet_id), + snippet_id=snippet_id, tenant_id=current_tenant_id, ) @@ -257,7 +245,7 @@ class CustomizedSnippetDetailApi(Resource): except ValueError as e: return {"message": str(e)}, 400 - return marshal(snippet, snippet_fields), 200 + return dump_response(SnippetResponse, snippet), 200 @console_ns.doc("delete_customized_snippet") @console_ns.response(204, "Snippet deleted successfully") @@ -270,9 +258,10 @@ class CustomizedSnippetDetailApi(Resource): @with_current_tenant_id def delete(self, current_tenant_id: str, snippet_id: str): """Delete customized snippet.""" + snippet_service = _snippet_service() snippet = snippet_service.get_snippet_by_id( - snippet_id=str(snippet_id), + snippet_id=snippet_id, tenant_id=current_tenant_id, ) @@ -296,7 +285,7 @@ class CustomizedSnippetExportApi(Resource): @console_ns.doc(description="Export snippet configuration as DSL") @console_ns.doc(params={"snippet_id": "Snippet ID to export"}) @console_ns.doc(params=query_params_from_model(IncludeSecretQuery)) - @console_ns.response(200, "Snippet exported successfully", console_ns.models[TextFileResponse.__name__]) + @console_ns.response(200, "Snippet exported successfully") @console_ns.response(404, "Snippet not found") @setup_required @login_required @@ -308,9 +297,10 @@ class CustomizedSnippetExportApi(Resource): @with_current_tenant_id def get(self, current_tenant_id: str, snippet_id: str): """Export snippet as DSL.""" + snippet_service = _snippet_service() snippet = snippet_service.get_snippet_by_id( - snippet_id=str(snippet_id), + snippet_id=snippet_id, tenant_id=current_tenant_id, ) @@ -343,8 +333,8 @@ class CustomizedSnippetImportApi(Resource): @console_ns.doc("import_customized_snippet") @console_ns.doc(description="Import snippet from DSL") @console_ns.expect(console_ns.models.get(SnippetImportPayload.__name__)) - @console_ns.response(200, "Snippet imported successfully", console_ns.models[SnippetImportResponse.__name__]) - @console_ns.response(202, "Import pending confirmation", console_ns.models[SnippetImportResponse.__name__]) + @console_ns.response(200, "Snippet imported successfully", console_ns.models[SnippetImportInfo.__name__]) + @console_ns.response(202, "Import pending confirmation", console_ns.models[SnippetImportInfo.__name__]) @console_ns.response(400, "Import failed") @setup_required @login_required @@ -385,7 +375,7 @@ class CustomizedSnippetImportConfirmApi(Resource): @console_ns.doc("confirm_snippet_import") @console_ns.doc(description="Confirm a pending snippet import") @console_ns.doc(params={"import_id": "Import ID to confirm"}) - @console_ns.response(200, "Import confirmed successfully", console_ns.models[SnippetImportResponse.__name__]) + @console_ns.response(200, "Import confirmed successfully", console_ns.models[SnippetImportInfo.__name__]) @console_ns.response(400, "Import failed") @setup_required @login_required @@ -412,11 +402,7 @@ class CustomizedSnippetCheckDependenciesApi(Resource): @console_ns.doc("check_snippet_dependencies") @console_ns.doc(description="Check dependencies for a snippet") @console_ns.doc(params={"snippet_id": "Snippet ID"}) - @console_ns.response( - 200, - "Dependencies checked successfully", - console_ns.models[SnippetDependencyCheckResponse.__name__], - ) + @console_ns.response(200, "Dependencies checked successfully", console_ns.models[CheckDependenciesResult.__name__]) @console_ns.response(404, "Snippet not found") @setup_required @login_required @@ -430,7 +416,7 @@ class CustomizedSnippetCheckDependenciesApi(Resource): """Check dependencies for a snippet.""" snippet_service = _snippet_service() snippet = snippet_service.get_snippet_by_id( - snippet_id=str(snippet_id), + snippet_id=snippet_id, tenant_id=current_tenant_id, ) @@ -449,7 +435,11 @@ class CustomizedSnippetUseCountIncrementApi(Resource): @console_ns.doc("increment_snippet_use_count") @console_ns.doc(description="Increment snippet use count by 1") @console_ns.doc(params={"snippet_id": "Snippet ID"}) - @console_ns.response(200, "Use count incremented successfully", console_ns.models[SnippetUseCountResponse.__name__]) + @console_ns.response( + 200, + "Use count incremented successfully", + console_ns.models[SnippetUseCountIncrementResponse.__name__], + ) @console_ns.response(404, "Snippet not found") @setup_required @login_required @@ -461,9 +451,10 @@ class CustomizedSnippetUseCountIncrementApi(Resource): @with_current_tenant_id def post(self, current_tenant_id: str, snippet_id: str): """Increment snippet use count when it is inserted into a workflow.""" + snippet_service = _snippet_service() snippet = snippet_service.get_snippet_by_id( - snippet_id=str(snippet_id), + snippet_id=snippet_id, tenant_id=current_tenant_id, ) @@ -476,4 +467,6 @@ class CustomizedSnippetUseCountIncrementApi(Resource): session.commit() session.refresh(snippet) - return {"result": "success", "use_count": snippet.use_count}, 200 + return SnippetUseCountIncrementResponse(result="success", use_count=snippet.use_count).model_dump( + mode="json" + ), 200 diff --git a/api/controllers/console/workspace/workspace.py b/api/controllers/console/workspace/workspace.py index 0afd7e06bf7..2644229d3e6 100644 --- a/api/controllers/console/workspace/workspace.py +++ b/api/controllers/console/workspace/workspace.py @@ -2,7 +2,7 @@ import logging from datetime import datetime from flask import request -from flask_restx import Resource, fields, marshal +from flask_restx import Resource from pydantic import BaseModel, Field, field_validator from sqlalchemy import select from werkzeug.exceptions import Unauthorized @@ -16,7 +16,12 @@ from controllers.common.errors import ( TooManyFilesError, UnsupportedFileTypeError, ) -from controllers.common.schema import query_params_from_model, register_response_schema_models, register_schema_models +from controllers.common.schema import ( + query_params_from_model, + query_params_from_request, + register_response_schema_models, + register_schema_models, +) from controllers.console import console_ns from controllers.console.admin import admin_required from controllers.console.error import AccountNotLinkTenantError @@ -31,7 +36,7 @@ from controllers.console.wraps import ( from enums.cloud_plan import CloudPlan from extensions.ext_database import db from fields.base import ResponseModel -from libs.helper import OptionalTimestampField, TimestampField, dump_response, to_timestamp +from libs.helper import dump_response, to_timestamp from libs.login import login_required from models.account import Account, Tenant, TenantAccountJoin, TenantCustomConfigDict, TenantStatus from services.account_service import TenantService @@ -102,6 +107,7 @@ class TenantListItemResponse(ResponseModel): plan: str | None = None status: str | None = None created_at: int | None = None + last_opened_at: int | None = None current: bool @field_validator("plan", "status", mode="before") @@ -113,9 +119,9 @@ class TenantListItemResponse(ResponseModel): return value return str(getattr(value, "value", value)) - @field_validator("created_at", mode="before") + @field_validator("created_at", "last_opened_at", mode="before") @classmethod - def _normalize_created_at(cls, value: datetime | int | None): + def _normalize_timestamp(cls, value: datetime | int | None): return to_timestamp(value) @@ -131,7 +137,7 @@ class WorkspaceListItemResponse(ResponseModel): @field_validator("status", mode="before") @classmethod - def _normalize_status(cls, value): + def _normalize_enum_like(cls, value): if value is None: return None if isinstance(value, str): @@ -144,7 +150,7 @@ class WorkspaceListItemResponse(ResponseModel): return to_timestamp(value) -class WorkspaceListResponse(ResponseModel): +class WorkspacePaginationResponse(ResponseModel): data: list[WorkspaceListItemResponse] has_more: bool limit: int @@ -157,7 +163,7 @@ class SwitchWorkspaceResponse(ResponseModel): new_tenant: TenantInfoResponse -class WorkspaceMutationResponse(ResponseModel): +class WorkspaceTenantResultResponse(ResponseModel): result: str tenant: TenantInfoResponse @@ -172,6 +178,16 @@ class WorkspacePermissionResponse(ResponseModel): allow_owner_transfer: bool +WORKSPACE_LOGO_UPLOAD_PARAMS = { + "file": { + "in": "formData", + "type": "file", + "required": True, + "description": "Workspace web app logo file. Only SVG and PNG files are supported.", + } +} + + register_schema_models( console_ns, WorkspaceListQuery, @@ -182,49 +198,17 @@ register_schema_models( register_response_schema_models( console_ns, TenantInfoResponse, + TenantListItemResponse, TenantListResponse, - WorkspaceListResponse, - SwitchWorkspaceResponse, - WorkspaceMutationResponse, - WorkspaceLogoUploadResponse, WorkspaceCustomConfigResponse, + WorkspaceListItemResponse, + WorkspacePaginationResponse, + SwitchWorkspaceResponse, + WorkspaceTenantResultResponse, + WorkspaceLogoUploadResponse, WorkspacePermissionResponse, ) -provider_fields = { - "provider_name": fields.String, - "provider_type": fields.String, - "is_valid": fields.Boolean, - "token_is_set": fields.Boolean, -} - -tenant_fields = { - "id": fields.String, - "name": fields.String, - "plan": fields.String, - "status": fields.String, - "created_at": TimestampField, - "role": fields.String, - "in_trial": fields.Boolean, - "trial_end_reason": fields.String, - "custom_config": fields.Raw(attribute="custom_config"), - "trial_credits": fields.Integer, - "trial_credits_used": fields.Integer, - "next_credit_reset_date": fields.Integer, -} - -tenants_fields = { - "id": fields.String, - "name": fields.String, - "plan": fields.String, - "status": fields.String, - "created_at": TimestampField, - "last_opened_at": OptionalTimestampField, - "current": fields.Boolean, -} - -workspace_fields = {"id": fields.String, "name": fields.String, "status": fields.String, "created_at": TimestampField} - @console_ns.route("/workspaces") class TenantListApi(Resource): @@ -279,18 +263,17 @@ class TenantListApi(Resource): tenant_dicts.append(tenant_dict) - return {"workspaces": marshal(tenant_dicts, tenants_fields)}, 200 + return dump_response(TenantListResponse, {"workspaces": tenant_dicts}), 200 @console_ns.route("/all-workspaces") class WorkspaceListApi(Resource): @console_ns.doc(params=query_params_from_model(WorkspaceListQuery)) - @console_ns.response(200, "Success", console_ns.models[WorkspaceListResponse.__name__]) + @console_ns.response(200, "Success", console_ns.models[WorkspacePaginationResponse.__name__]) @setup_required @admin_required def get(self): - payload = request.args.to_dict(flat=True) - args = WorkspaceListQuery.model_validate(payload) + args = query_params_from_request(WorkspaceListQuery) stmt = select(Tenant).order_by(Tenant.created_at.desc()) tenants = db.paginate(select=stmt, page=args.page, per_page=args.limit, error_out=False) @@ -299,13 +282,9 @@ class WorkspaceListApi(Resource): if tenants.has_next: has_more = True - return { - "data": marshal(tenants.items, workspace_fields), - "has_more": has_more, - "limit": args.limit, - "page": args.page, - "total": tenants.total, - }, 200 + return WorkspacePaginationResponse( + data=tenants.items, has_more=has_more, limit=args.limit, page=args.page, total=tenants.total or 0 + ).model_dump(mode="json"), 200 @console_ns.route("/workspaces/current", endpoint="workspaces_current") @@ -359,13 +338,15 @@ class SwitchWorkspaceApi(Resource): if new_tenant is None: raise ValueError("Tenant not found") - return {"result": "success", "new_tenant": marshal(WorkspaceService.get_tenant_info(new_tenant), tenant_fields)} + return SwitchWorkspaceResponse( + result="success", new_tenant=WorkspaceService.get_tenant_info(new_tenant) + ).model_dump(mode="json") @console_ns.route("/workspaces/custom-config") class CustomConfigWorkspaceApi(Resource): @console_ns.expect(console_ns.models[WorkspaceCustomConfigPayload.__name__]) - @console_ns.response(200, "Success", console_ns.models[WorkspaceMutationResponse.__name__]) + @console_ns.response(200, "Success", console_ns.models[WorkspaceTenantResultResponse.__name__]) @setup_required @login_required @account_initialization_required @@ -388,11 +369,14 @@ class CustomConfigWorkspaceApi(Resource): tenant.custom_config_dict = custom_config_dict db.session.commit() - return {"result": "success", "tenant": marshal(WorkspaceService.get_tenant_info(tenant), tenant_fields)} + return WorkspaceTenantResultResponse( + result="success", tenant=WorkspaceService.get_tenant_info(tenant) + ).model_dump(mode="json") @console_ns.route("/workspaces/custom-config/webapp-logo/upload") class WebappLogoWorkspaceApi(Resource): + @console_ns.doc(consumes=["multipart/form-data"], params=WORKSPACE_LOGO_UPLOAD_PARAMS) @console_ns.response(201, "Logo uploaded", console_ns.models[WorkspaceLogoUploadResponse.__name__]) @setup_required @login_required @@ -429,13 +413,13 @@ class WebappLogoWorkspaceApi(Resource): except services.errors.file.UnsupportedFileTypeError: raise UnsupportedFileTypeError() - return {"id": upload_file.id}, 201 + return WorkspaceLogoUploadResponse(id=upload_file.id).model_dump(mode="json"), 201 @console_ns.route("/workspaces/info") class WorkspaceInfoApi(Resource): @console_ns.expect(console_ns.models[WorkspaceInfoPayload.__name__]) - @console_ns.response(200, "Success", console_ns.models[WorkspaceMutationResponse.__name__]) + @console_ns.response(200, "Success", console_ns.models[WorkspaceTenantResultResponse.__name__]) @setup_required @login_required @account_initialization_required @@ -451,7 +435,9 @@ class WorkspaceInfoApi(Resource): tenant.name = args.name db.session.commit() - return {"result": "success", "tenant": marshal(WorkspaceService.get_tenant_info(tenant), tenant_fields)} + return WorkspaceTenantResultResponse( + result="success", tenant=WorkspaceService.get_tenant_info(tenant) + ).model_dump(mode="json") @console_ns.route("/workspaces/current/permission") @@ -475,8 +461,8 @@ class WorkspacePermissionApi(Resource): # Get workspace permissions from enterprise service permission = EnterpriseService.WorkspacePermissionService.get_permission(current_tenant_id) - return { - "workspace_id": permission.workspace_id, - "allow_member_invite": permission.allow_member_invite, - "allow_owner_transfer": permission.allow_owner_transfer, - }, 200 + return WorkspacePermissionResponse( + workspace_id=permission.workspace_id, + allow_member_invite=permission.allow_member_invite, + allow_owner_transfer=permission.allow_owner_transfer, + ).model_dump(mode="json"), 200 diff --git a/api/controllers/service_api/dataset/dataset.py b/api/controllers/service_api/dataset/dataset.py index 292c39f69bc..c12d02ae826 100644 --- a/api/controllers/service_api/dataset/dataset.py +++ b/api/controllers/service_api/dataset/dataset.py @@ -837,7 +837,7 @@ class DocumentStatusApi(DatasetApiResource): except ValueError as e: raise InvalidActionError(str(e)) - return dump_response(SimpleResultResponse, {"result": "success"}), 200 + return SimpleResultResponse(result="success").model_dump(mode="json"), 200 @service_api_ns.route("/datasets/tags") @@ -903,11 +903,8 @@ class DatasetTagsApi(DatasetApiResource): payload = TagCreatePayload.model_validate(service_api_ns.payload or {}) tag = TagService.save_tags(SaveTagPayload(name=payload.name, type=TagType.KNOWLEDGE), db.session) - response = dump_response( - KnowledgeTagResponse, - {"id": tag.id, "name": tag.name, "type": tag.type, "binding_count": 0}, - ) - return response, 200 + response = KnowledgeTagResponse(id=tag.id, name=tag.name, type=tag.type, binding_count="0") + return response.model_dump(mode="json"), 200 @service_api_ns.doc( summary="Update Knowledge Tag", @@ -943,11 +940,8 @@ class DatasetTagsApi(DatasetApiResource): binding_count = TagService.get_tag_binding_count(tag_id, db.session) - response = dump_response( - KnowledgeTagResponse, - {"id": tag.id, "name": tag.name, "type": tag.type, "binding_count": binding_count}, - ) - return response, 200 + response = KnowledgeTagResponse(id=tag.id, name=tag.name, type=tag.type, binding_count=str(binding_count)) + return response.model_dump(mode="json"), 200 @service_api_ns.doc( summary="Delete Knowledge Tag", @@ -1078,5 +1072,8 @@ class DatasetTagsBindingStatusApi(DatasetApiResource): tags = TagService.get_tags_by_target_id( "knowledge", current_user.current_tenant_id, str(dataset_id), db.session ) - tags_list = [{"id": tag.id, "name": tag.name} for tag in tags] - return dump_response(DatasetBoundTagListResponse, {"data": tags_list, "total": len(tags)}), 200 + response = DatasetBoundTagListResponse( + data=[DatasetBoundTagResponse(id=tag.id, name=tag.name) for tag in tags], + total=len(tags), + ) + return response.model_dump(mode="json"), 200 diff --git a/api/controllers/web/human_input_form.py b/api/controllers/web/human_input_form.py index 14b982dd23b..ebf63db2458 100644 --- a/api/controllers/web/human_input_form.py +++ b/api/controllers/web/human_input_form.py @@ -2,14 +2,12 @@ Web App Human Input Form APIs. """ -import json import logging from collections.abc import Sequence -from typing import Any, NotRequired, TypedDict +from typing import Self -from flask import Response, request +from flask import request from flask_restx import Resource -from pydantic import BaseModel, ConfigDict, Field from sqlalchemy import select from sqlalchemy.orm import sessionmaker from werkzeug.exceptions import Forbidden @@ -20,35 +18,58 @@ from controllers.common.human_input import HumanInputFormSubmitPayload, stringif from controllers.common.schema import register_response_schema_models, register_schema_models from controllers.web import web_ns from controllers.web.error import WebFormRateLimitExceededError -from controllers.web.site import serialize_app_site_payload +from controllers.web.site import WebAppSiteResponse from extensions.ext_database import db -from graphon.nodes.human_input.entities import FormInputConfig -from libs.helper import RateLimiter, extract_remote_ip, to_timestamp +from fields.base import ResponseModel +from graphon.nodes.human_input.entities import FormInputConfig, UserActionConfig +from libs.helper import RateLimiter, dump_response, extract_remote_ip, to_timestamp from models.account import TenantStatus from models.model import App, Site from repositories.factory import DifyAPIRepositoryFactory +from services.feature_service import FeatureService from services.human_input_file_upload_service import HumanInputFileUploadService from services.human_input_service import Form, FormNotFoundError, HumanInputService logger = logging.getLogger(__name__) -class HumanInputUploadTokenResponse(BaseModel): +class HumanInputUploadTokenResponse(ResponseModel): upload_token: str expires_at: int -class HumanInputFormDefinitionResponse(BaseModel): - form_content: Any - inputs: Any +class HumanInputFormDefinitionResponse(ResponseModel): + form_content: str + inputs: list[FormInputConfig] resolved_default_values: dict[str, str] - user_actions: Any + user_actions: list[UserActionConfig] expiration_time: int - site: dict[str, Any] | None = Field(default=None) + site: WebAppSiteResponse | None = None + + @classmethod + def from_form( + cls, + form: Form, + *, + inputs: Sequence[FormInputConfig] = (), + site: WebAppSiteResponse | None = None, + ) -> Self: + definition_payload = form.get_definition().model_dump(mode="json") + expiration_time = to_timestamp(form.expiration_time) + if expiration_time is None: + raise ValueError("Human input form expiration_time is required") + return cls( + form_content=definition_payload["rendered_content"], + inputs=list(inputs), + resolved_default_values=stringify_form_default_values(definition_payload["default_values"]), + user_actions=definition_payload["user_actions"], + expiration_time=expiration_time, + site=site, + ) -class HumanInputFormSubmitResponse(BaseModel): - model_config = ConfigDict(extra="forbid") +class HumanInputFormSubmitResponse(ResponseModel): + pass register_schema_models(web_ns, HumanInputFormSubmitPayload) @@ -86,40 +107,26 @@ def _create_upload_service() -> HumanInputFileUploadService: ) -class FormDefinitionPayload(TypedDict): - form_content: Any - inputs: Any - resolved_default_values: dict[str, str] - user_actions: Any - expiration_time: int - site: NotRequired[dict] - - -def _jsonify_form_definition( - form: Form, - *, - inputs: Sequence[FormInputConfig] = (), - site_payload: dict | None = None, -) -> Response: - """Return the form payload (optionally with site) as a JSON response.""" - definition_payload = form.get_definition().model_dump(mode="json") - payload: FormDefinitionPayload = { - "form_content": definition_payload["rendered_content"], - "inputs": [i.model_dump(mode="json") for i in inputs], - "resolved_default_values": stringify_form_default_values(definition_payload["default_values"]), - "user_actions": definition_payload["user_actions"], - "expiration_time": to_timestamp(form.expiration_time), - } - if site_payload is not None: - payload["site"] = site_payload - return Response(json.dumps(payload, ensure_ascii=False), mimetype="application/json") - - @web_ns.route("/form/human_input//upload-token") class HumanInputFormUploadTokenApi(Resource): """API for issuing HITL upload tokens for active human input forms.""" - @web_ns.response(200, "Success", web_ns.models[HumanInputUploadTokenResponse.__name__]) + @web_ns.doc("create_human_input_form_upload_token") + @web_ns.doc(description="Issue an upload token for an active human input form") + @web_ns.doc(params={"form_token": "Human input form token"}) + @web_ns.doc( + responses={ + 200: "Upload token issued successfully", + 404: "Form not found", + 412: "Form already submitted or expired", + 429: "Too many requests", + } + ) + @web_ns.response( + 200, + "Upload token issued successfully", + web_ns.models[HumanInputUploadTokenResponse.__name__], + ) def post(self, form_token: str): """ Issue an upload token for a human input form. @@ -136,11 +143,9 @@ class HumanInputFormUploadTokenApi(Resource): except FormNotFoundError: raise NotFoundError("Form not found") - response = HumanInputUploadTokenResponse( - upload_token=token.upload_token, - expires_at=to_timestamp(token.expires_at), - ) - return response.model_dump(mode="json"), 200 + return HumanInputUploadTokenResponse( + upload_token=token.upload_token, expires_at=to_timestamp(token.expires_at) + ).model_dump(mode="json"), 200 @web_ns.route("/form/human_input/") @@ -150,7 +155,23 @@ class HumanInputFormApi(Resource): # NOTE(QuantumGhost): this endpoint is unauthenticated on purpose for now. # def get(self, _app_model: App, _end_user: EndUser, form_token: str): - @web_ns.response(200, "Success", web_ns.models[HumanInputFormDefinitionResponse.__name__]) + @web_ns.doc("get_human_input_form") + @web_ns.doc(description="Get a human input form definition by token") + @web_ns.doc(params={"form_token": "Human input form token"}) + @web_ns.doc( + responses={ + 200: "Form retrieved successfully", + 403: "Forbidden", + 404: "Form not found", + 412: "Form already submitted or expired", + 429: "Too many requests", + } + ) + @web_ns.response( + 200, + "Form retrieved successfully", + web_ns.models[HumanInputFormDefinitionResponse.__name__], + ) def get(self, form_token: str): """ Get human input form definition by token. @@ -172,17 +193,47 @@ class HumanInputFormApi(Resource): service.ensure_form_active(form) app_model, site = _get_app_site_from_form(form) + tenant = app_model.tenant + if tenant is None: + raise Forbidden() inputs = service.resolve_form_inputs(form) - return _jsonify_form_definition( - form, - inputs=inputs, - site_payload=serialize_app_site_payload(app_model, site, None), + return dump_response( + HumanInputFormDefinitionResponse, + HumanInputFormDefinitionResponse.from_form( + form, + inputs=inputs, + site=WebAppSiteResponse.from_app_site( + tenant=tenant, + app_model=app_model, + site=site, + end_user_id=None, + can_replace_logo=FeatureService.get_features( + app_model.tenant_id, exclude_vector_space=True + ).can_replace_logo, + ), + ), ) # def post(self, _app_model: App, _end_user: EndUser, form_token: str): - @web_ns.response(200, "Success", web_ns.models[HumanInputFormSubmitResponse.__name__]) @web_ns.expect(web_ns.models[HumanInputFormSubmitPayload.__name__]) + @web_ns.doc("submit_human_input_form") + @web_ns.doc(description="Submit a human input form by token") + @web_ns.doc(params={"form_token": "Human input form token"}) + @web_ns.doc( + responses={ + 200: "Form submitted successfully", + 400: "Bad request - invalid submission data", + 404: "Form not found", + 412: "Form already submitted or expired", + 429: "Too many requests", + } + ) + @web_ns.response( + 200, + "Form submitted successfully", + web_ns.models[HumanInputFormSubmitResponse.__name__], + ) def post(self, form_token: str): """ Submit human input form by token. @@ -225,7 +276,7 @@ class HumanInputFormApi(Resource): except FormNotFoundError: raise NotFoundError("Form not found") - return {}, 200 + return HumanInputFormSubmitResponse().model_dump(mode="json"), 200 def _get_app_site_from_form(form: Form) -> tuple[App, Site]: @@ -238,7 +289,7 @@ def _get_app_site_from_form(form: Form) -> tuple[App, Site]: if site is None: raise Forbidden() - if app_model.tenant and app_model.tenant.status == TenantStatus.ARCHIVE: + if app_model.tenant is None or app_model.tenant.status == TenantStatus.ARCHIVE: raise Forbidden() return app_model, site diff --git a/api/controllers/web/site.py b/api/controllers/web/site.py index 5e0f8326517..e70cc2c2a1d 100644 --- a/api/controllers/web/site.py +++ b/api/controllers/web/site.py @@ -1,7 +1,6 @@ -from typing import Any, cast +from typing import Any, Self -from flask_restx import fields, marshal, marshal_with -from pydantic import Field +from pydantic import AliasChoices, Field, computed_field from sqlalchemy import select from werkzeug.exceptions import Forbidden @@ -11,30 +10,19 @@ from controllers.web import web_ns from controllers.web.wraps import WebApiResource from extensions.ext_database import db from fields.base import ResponseModel -from libs.helper import AppIconUrlField -from models.account import TenantStatus +from libs.helper import build_icon_url +from models.account import Tenant, TenantStatus from models.model import App, EndUser, Site from services.feature_service import FeatureService -class AppSiteModelConfigResponse(ResponseModel): - opening_statement: str | None = None - suggested_questions: Any - suggested_questions_after_answer: Any - more_like_this: Any - model: Any - user_input_form: Any - pre_prompt: str | None = None - - -class AppSiteResponse(ResponseModel): - title: str | None = None +class WebSiteResponse(ResponseModel): + title: str chat_color_theme: str | None = None - chat_color_theme_inverted: bool | None = None + chat_color_theme_inverted: bool icon_type: str | None = None icon: str | None = None icon_background: str | None = None - icon_url: str | None = None description: str | None = None copyright: str | None = None privacy_policy: str | None = None @@ -44,64 +32,92 @@ class AppSiteResponse(ResponseModel): show_workflow_steps: bool | None = None use_icon_as_answer_icon: bool | None = None + @computed_field(return_type=str | None) # type: ignore[prop-decorator] + @property + def icon_url(self) -> str | None: + return build_icon_url(self.icon_type, self.icon) -class AppSiteInfoResponse(ResponseModel): + +class WebModelConfigResponse(ResponseModel): + opening_statement: str | None = None + suggested_questions: Any = Field( + default=None, + validation_alias=AliasChoices("suggested_questions_list", "suggested_questions"), + ) + suggested_questions_after_answer: Any = Field( + default=None, + validation_alias=AliasChoices("suggested_questions_after_answer_dict", "suggested_questions_after_answer"), + ) + more_like_this: Any = Field( + default=None, + validation_alias=AliasChoices("more_like_this_dict", "more_like_this"), + ) + model: Any = Field(default=None, validation_alias=AliasChoices("model_dict", "model")) + user_input_form: Any = Field( + default=None, + validation_alias=AliasChoices("user_input_form_list", "user_input_form"), + ) + pre_prompt: str | None = None + + +class WebAppCustomConfigResponse(ResponseModel): + remove_webapp_brand: bool + replace_webapp_logo: str | None = None + + +class WebAppSiteResponse(ResponseModel): app_id: str end_user_id: str | None = None enable_site: bool - site: AppSiteResponse - model_config_: AppSiteModelConfigResponse | None = Field(default=None, alias="model_config") - plan: str | None = None + site: WebSiteResponse + model_config_: WebModelConfigResponse | None = Field( + default=None, validation_alias="model_config", serialization_alias="model_config" + ) + plan: str can_replace_logo: bool - custom_config: dict[str, Any] | None = Field(default=None) + custom_config: WebAppCustomConfigResponse | None = None + + @classmethod + def from_app_site( + cls, + *, + tenant: Tenant, + app_model: App, + site: Site, + end_user_id: str | None, + can_replace_logo: bool, + ) -> Self: + custom_config = None + if can_replace_logo: + replace_webapp_logo = ( + f"{dify_config.FILES_URL}/files/workspaces/{tenant.id}/webapp-logo" + if tenant.custom_config_dict.get("replace_webapp_logo") + else None + ) + custom_config = WebAppCustomConfigResponse( + remove_webapp_brand=tenant.custom_config_dict.get("remove_webapp_brand", False), + replace_webapp_logo=replace_webapp_logo, + ) + + return cls( + app_id=app_model.id, + end_user_id=end_user_id, + enable_site=app_model.enable_site, + site=WebSiteResponse.model_validate(site, from_attributes=True), + model_config_=None, + plan=tenant.plan, + can_replace_logo=can_replace_logo, + custom_config=custom_config, + ) -register_response_schema_models(web_ns, AppSiteInfoResponse) +register_response_schema_models( + web_ns, WebSiteResponse, WebModelConfigResponse, WebAppCustomConfigResponse, WebAppSiteResponse +) @web_ns.route("/site") class AppSiteApi(WebApiResource): - """Resource for app sites.""" - - model_config_fields = { - "opening_statement": fields.String, - "suggested_questions": fields.Raw(attribute="suggested_questions_list"), - "suggested_questions_after_answer": fields.Raw(attribute="suggested_questions_after_answer_dict"), - "more_like_this": fields.Raw(attribute="more_like_this_dict"), - "model": fields.Raw(attribute="model_dict"), - "user_input_form": fields.Raw(attribute="user_input_form_list"), - "pre_prompt": fields.String, - } - - site_fields = { - "title": fields.String, - "chat_color_theme": fields.String, - "chat_color_theme_inverted": fields.Boolean, - "icon_type": fields.String, - "icon": fields.String, - "icon_background": fields.String, - "icon_url": AppIconUrlField, - "description": fields.String, - "copyright": fields.String, - "privacy_policy": fields.String, - "custom_disclaimer": fields.String, - "default_language": fields.String, - "prompt_public": fields.Boolean, - "show_workflow_steps": fields.Boolean, - "use_icon_as_answer_icon": fields.Boolean, - } - - app_fields = { - "app_id": fields.String, - "end_user_id": fields.String, - "enable_site": fields.Boolean, - "site": fields.Nested(site_fields), - "model_config": fields.Nested(model_config_fields, allow_null=True), - "plan": fields.String, - "can_replace_logo": fields.Boolean, - "custom_config": fields.Raw(attribute="custom_config"), - } - @web_ns.doc("Get App Site Info") @web_ns.doc(description="Retrieve app site information and configuration.") @web_ns.doc( @@ -114,57 +130,25 @@ class AppSiteApi(WebApiResource): 500: "Internal Server Error", } ) - @web_ns.response(200, "Success", web_ns.models[AppSiteInfoResponse.__name__]) - @marshal_with(app_fields) + @web_ns.response(200, "Success", web_ns.models[WebAppSiteResponse.__name__]) def get(self, app_model: App, end_user: EndUser): """Retrieve app site info.""" # get site site = db.session.scalar(select(Site).where(Site.app_id == app_model.id).limit(1)) - if not site: + if site is None: raise Forbidden() - if app_model.tenant and app_model.tenant.status == TenantStatus.ARCHIVE: + tenant = app_model.tenant + if tenant is None or tenant.status == TenantStatus.ARCHIVE: raise Forbidden() can_replace_logo = FeatureService.get_features(app_model.tenant_id, exclude_vector_space=True).can_replace_logo - return AppSiteInfo(app_model.tenant, app_model, site, end_user.id, can_replace_logo) - - -class AppSiteInfo: - """Class to store site information.""" - - def __init__(self, tenant, app, site, end_user, can_replace_logo): - """Initialize AppSiteInfo instance.""" - self.app_id = app.id - self.end_user_id = end_user - self.enable_site = app.enable_site - self.site = site - self.model_config = None - self.plan = tenant.plan - self.can_replace_logo = can_replace_logo - - if can_replace_logo: - base_url = dify_config.FILES_URL - remove_webapp_brand = tenant.custom_config_dict.get("remove_webapp_brand", False) - replace_webapp_logo = ( - f"{base_url}/files/workspaces/{tenant.id}/webapp-logo" - if tenant.custom_config_dict.get("replace_webapp_logo") - else None - ) - self.custom_config = { - "remove_webapp_brand": remove_webapp_brand, - "replace_webapp_logo": replace_webapp_logo, - } - - -def serialize_site(site: Site) -> dict[str, Any]: - """Serialize Site model using the same schema as AppSiteApi.""" - return cast(dict[str, Any], marshal(site, AppSiteApi.site_fields)) - - -def serialize_app_site_payload(app_model: App, site: Site, end_user_id: str | None) -> dict[str, Any]: - can_replace_logo = FeatureService.get_features(app_model.tenant_id, exclude_vector_space=True).can_replace_logo - app_site_info = AppSiteInfo(app_model.tenant, app_model, site, end_user_id, can_replace_logo) - return cast(dict[str, Any], marshal(app_site_info, AppSiteApi.app_fields)) + return WebAppSiteResponse.from_app_site( + tenant=tenant, + app_model=app_model, + site=site, + end_user_id=end_user.id, + can_replace_logo=can_replace_logo, + ).model_dump(mode="json") diff --git a/api/fields/app_fields.py b/api/fields/app_fields.py deleted file mode 100644 index 96d8fbdf34c..00000000000 --- a/api/fields/app_fields.py +++ /dev/null @@ -1,271 +0,0 @@ -import json -from typing import override - -from flask_restx import fields - -from fields.workflow_fields import workflow_partial_fields -from libs.helper import AppIconUrlField, TimestampField - - -class JsonStringField(fields.Raw): - @override - def format(self, value): - if isinstance(value, str): - try: - return json.loads(value) - except (json.JSONDecodeError, TypeError): - return value - return value - - -class OpaqueRawField(fields.Raw): - @override - def schema(self) -> dict[str, object]: - return {"type": "object"} - - -class StringListRawField(fields.Raw): - @override - def schema(self) -> dict[str, object]: - return {"type": "array", "items": {"type": "string"}} - - -class ObjectListRawField(fields.Raw): - @override - def schema(self) -> dict[str, object]: - return {"type": "array", "items": {"type": "object"}} - - -app_detail_kernel_fields = { - "id": fields.String, - "name": fields.String, - "description": fields.String, - "mode": fields.String(attribute="mode_compatible_with_agent"), - "icon_type": fields.String, - "icon": fields.String, - "icon_background": fields.String, - "icon_url": AppIconUrlField, -} - -related_app_list = { - "data": fields.List(fields.Nested(app_detail_kernel_fields)), - "total": fields.Integer, -} - -model_config_fields = { - "opening_statement": fields.String, - "suggested_questions": StringListRawField(attribute="suggested_questions_list"), - "suggested_questions_after_answer": OpaqueRawField(attribute="suggested_questions_after_answer_dict"), - "speech_to_text": OpaqueRawField(attribute="speech_to_text_dict"), - "text_to_speech": OpaqueRawField(attribute="text_to_speech_dict"), - "retriever_resource": OpaqueRawField(attribute="retriever_resource_dict"), - "annotation_reply": OpaqueRawField(attribute="annotation_reply_dict"), - "more_like_this": OpaqueRawField(attribute="more_like_this_dict"), - "sensitive_word_avoidance": OpaqueRawField(attribute="sensitive_word_avoidance_dict"), - "external_data_tools": ObjectListRawField(attribute="external_data_tools_list"), - "model": OpaqueRawField(attribute="model_dict"), - "user_input_form": ObjectListRawField(attribute="user_input_form_list"), - "dataset_query_variable": fields.String, - "pre_prompt": fields.String, - "agent_mode": OpaqueRawField(attribute="agent_mode_dict"), - "prompt_type": fields.String, - "chat_prompt_config": OpaqueRawField(attribute="chat_prompt_config_dict"), - "completion_prompt_config": OpaqueRawField(attribute="completion_prompt_config_dict"), - "dataset_configs": OpaqueRawField(attribute="dataset_configs_dict"), - "file_upload": OpaqueRawField(attribute="file_upload_dict"), - "created_by": fields.String, - "created_at": TimestampField, - "updated_by": fields.String, - "updated_at": TimestampField, -} - -tag_fields = {"id": fields.String, "name": fields.String, "type": fields.String} - -app_detail_fields = { - "id": fields.String, - "name": fields.String, - "description": fields.String, - "mode": fields.String(attribute="mode_compatible_with_agent"), - "icon": fields.String, - "icon_background": fields.String, - "enable_site": fields.Boolean, - "enable_api": fields.Boolean, - "model_config": fields.Nested(model_config_fields, attribute="app_model_config", allow_null=True), - "workflow": fields.Nested(workflow_partial_fields, allow_null=True), - "tracing": OpaqueRawField, - "use_icon_as_answer_icon": fields.Boolean, - "created_by": fields.String, - "created_at": TimestampField, - "updated_by": fields.String, - "updated_at": TimestampField, - "access_mode": fields.String, - "tags": fields.List(fields.Nested(tag_fields)), - "permission_keys": fields.List(fields.String()), -} - -prompt_config_fields = { - "prompt_template": fields.String, -} - -model_config_partial_fields = { - "model": OpaqueRawField(attribute="model_dict"), - "pre_prompt": fields.String, - "created_by": fields.String, - "created_at": TimestampField, - "updated_by": fields.String, - "updated_at": TimestampField, -} - -app_partial_fields = { - "id": fields.String, - "name": fields.String, - "max_active_requests": OpaqueRawField(), - "description": fields.String(attribute="desc_or_prompt"), - "mode": fields.String(attribute="mode_compatible_with_agent"), - "icon_type": fields.String, - "icon": fields.String, - "icon_background": fields.String, - "icon_url": AppIconUrlField, - "model_config": fields.Nested(model_config_partial_fields, attribute="app_model_config", allow_null=True), - "workflow": fields.Nested(workflow_partial_fields, allow_null=True), - "use_icon_as_answer_icon": fields.Boolean, - "created_by": fields.String, - "created_at": TimestampField, - "updated_by": fields.String, - "updated_at": TimestampField, - "tags": fields.List(fields.Nested(tag_fields)), - "access_mode": fields.String, - "create_user_name": fields.String, - "author_name": fields.String, - "has_draft_trigger": fields.Boolean, - "permission_keys": fields.List(fields.String()), -} - - -app_pagination_fields = { - "page": fields.Integer, - "limit": fields.Integer(attribute="per_page"), - "total": fields.Integer, - "has_more": fields.Boolean(attribute="has_next"), - "data": fields.List(fields.Nested(app_partial_fields), attribute="items"), -} - -template_fields = { - "name": fields.String, - "icon": fields.String, - "icon_background": fields.String, - "description": fields.String, - "mode": fields.String, - "model_config": fields.Nested(model_config_fields), -} - -template_list_fields = { - "data": fields.List(fields.Nested(template_fields)), -} - -site_fields = { - "access_token": fields.String(attribute="code"), - "code": fields.String, - "title": fields.String, - "icon_type": fields.String, - "icon": fields.String, - "icon_background": fields.String, - "icon_url": AppIconUrlField, - "description": fields.String, - "default_language": fields.String, - "chat_color_theme": fields.String, - "chat_color_theme_inverted": fields.Boolean, - "customize_domain": fields.String, - "copyright": fields.String, - "privacy_policy": fields.String, - "custom_disclaimer": fields.String, - "customize_token_strategy": fields.String, - "prompt_public": fields.Boolean, - "app_base_url": fields.String, - "show_workflow_steps": fields.Boolean, - "use_icon_as_answer_icon": fields.Boolean, - "created_by": fields.String, - "created_at": TimestampField, - "updated_by": fields.String, - "updated_at": TimestampField, -} - -deleted_tool_fields = { - "type": fields.String, - "tool_name": fields.String, - "provider_id": fields.String, -} - -app_detail_fields_with_site = { - "id": fields.String, - "name": fields.String, - "description": fields.String, - "mode": fields.String(attribute="mode_compatible_with_agent"), - "icon_type": fields.String, - "icon": fields.String, - "icon_background": fields.String, - "icon_url": AppIconUrlField, - "enable_site": fields.Boolean, - "enable_api": fields.Boolean, - "model_config": fields.Nested(model_config_fields, attribute="app_model_config", allow_null=True), - "workflow": fields.Nested(workflow_partial_fields, allow_null=True), - "api_base_url": fields.String, - "use_icon_as_answer_icon": fields.Boolean, - "max_active_requests": fields.Integer, - "created_by": fields.String, - "created_at": TimestampField, - "updated_by": fields.String, - "updated_at": TimestampField, - "deleted_tools": fields.List(fields.Nested(deleted_tool_fields)), - "access_mode": fields.String, - "tags": fields.List(fields.Nested(tag_fields)), - "permission_keys": fields.List(fields.String()), - "site": fields.Nested(site_fields), -} - - -app_site_fields = { - "app_id": fields.String, - "access_token": fields.String(attribute="code"), - "code": fields.String, - "title": fields.String, - "icon": fields.String, - "icon_background": fields.String, - "description": fields.String, - "default_language": fields.String, - "customize_domain": fields.String, - "copyright": fields.String, - "privacy_policy": fields.String, - "custom_disclaimer": fields.String, - "customize_token_strategy": fields.String, - "prompt_public": fields.Boolean, - "show_workflow_steps": fields.Boolean, - "use_icon_as_answer_icon": fields.Boolean, -} - -leaked_dependency_fields = {"type": fields.String, "value": OpaqueRawField, "current_identifier": fields.String} - -app_import_fields = { - "id": fields.String, - "status": fields.String, - "app_id": fields.String, - "app_mode": fields.String, - "current_dsl_version": fields.String, - "imported_dsl_version": fields.String, - "error": fields.String, -} - -app_import_check_dependencies_fields = { - "leaked_dependencies": fields.List(fields.Nested(leaked_dependency_fields)), -} - -app_server_fields = { - "id": fields.String, - "name": fields.String, - "server_code": fields.String, - "description": fields.String, - "status": fields.String, - "parameters": JsonStringField, - "created_at": TimestampField, - "updated_at": TimestampField, -} diff --git a/api/fields/conversation_variable_fields.py b/api/fields/conversation_variable_fields.py index 4d5de84fd98..6618475f2f3 100644 --- a/api/fields/conversation_variable_fields.py +++ b/api/fields/conversation_variable_fields.py @@ -3,25 +3,14 @@ from __future__ import annotations from datetime import datetime from typing import Any -from flask_restx import fields from pydantic import field_validator from fields.base import ResponseModel from graphon.variables.types import SegmentType -from libs.helper import TimestampField, to_timestamp +from libs.helper import to_timestamp from ._value_type_serializer import serialize_value_type -conversation_variable_fields = { - "id": fields.String, - "name": fields.String, - "value_type": fields.String(attribute=serialize_value_type), - "value": fields.String, - "description": fields.String, - "created_at": TimestampField, - "updated_at": TimestampField, -} - class ConversationVariableResponse(ResponseModel): id: str diff --git a/api/fields/dataset_fields.py b/api/fields/dataset_fields.py index ea506d2a7e4..f97f5b79460 100644 --- a/api/fields/dataset_fields.py +++ b/api/fields/dataset_fields.py @@ -1,22 +1,9 @@ from datetime import datetime -from flask_restx import fields from pydantic import Field, field_validator from fields.base import ResponseModel -from libs.helper import TimestampField, to_timestamp - -dataset_fields = { - "id": fields.String, - "name": fields.String, - "description": fields.String, - "permission": fields.String, - "data_source_type": fields.String, - "indexing_technique": fields.String, - "created_by": fields.String, - "created_at": TimestampField, - "permission_keys": fields.List(fields.String()), -} +from libs.helper import to_timestamp class DatasetMetadataResponse(ResponseModel): @@ -50,104 +37,6 @@ class DatasetMetadataActionResponse(ResponseModel): result: str -reranking_model_fields = {"reranking_provider_name": fields.String, "reranking_model_name": fields.String} - -keyword_setting_fields = {"keyword_weight": fields.Float} - -vector_setting_fields = { - "vector_weight": fields.Float, - "embedding_model_name": fields.String, - "embedding_provider_name": fields.String, -} - -weighted_score_fields = { - "weight_type": fields.String, - "keyword_setting": fields.Nested(keyword_setting_fields), - "vector_setting": fields.Nested(vector_setting_fields), -} - -dataset_retrieval_model_fields = { - "search_method": fields.String, - "reranking_enable": fields.Boolean, - "reranking_mode": fields.String, - "reranking_model": fields.Nested(reranking_model_fields), - "weights": fields.Nested(weighted_score_fields, allow_null=True), - "top_k": fields.Integer, - "score_threshold_enabled": fields.Boolean, - "score_threshold": fields.Float, -} - -dataset_summary_index_fields = { - "enable": fields.Boolean, - "model_name": fields.String, - "model_provider_name": fields.String, - "summary_prompt": fields.String, -} - -external_retrieval_model_fields = { - "top_k": fields.Integer, - "score_threshold": fields.Float, - "score_threshold_enabled": fields.Boolean, -} - -tag_fields = {"id": fields.String, "name": fields.String, "type": fields.String} - -external_knowledge_info_fields = { - "external_knowledge_id": fields.String, - "external_knowledge_api_id": fields.String, - "external_knowledge_api_name": fields.String, - "external_knowledge_api_endpoint": fields.String, -} - -doc_metadata_fields = {"id": fields.String, "name": fields.String, "type": fields.String} - -icon_info_fields = { - "icon_type": fields.String, - "icon": fields.String, - "icon_background": fields.String, - "icon_url": fields.String, -} - -dataset_detail_fields = { - "id": fields.String, - "name": fields.String, - "description": fields.String, - "provider": fields.String, - "permission": fields.String, - "data_source_type": fields.String, - "indexing_technique": fields.String, - "app_count": fields.Integer, - "document_count": fields.Integer, - "word_count": fields.Integer, - "created_by": fields.String, - "author_name": fields.String, - "created_at": TimestampField, - "updated_by": fields.String, - "updated_at": TimestampField, - "embedding_model": fields.String, - "embedding_model_provider": fields.String, - "embedding_available": fields.Boolean, - "retrieval_model_dict": fields.Nested(dataset_retrieval_model_fields), - "summary_index_setting": fields.Nested(dataset_summary_index_fields), - "tags": fields.List(fields.Nested(tag_fields)), - "doc_form": fields.String, - "external_knowledge_info": fields.Nested(external_knowledge_info_fields), - "external_retrieval_model": fields.Nested(external_retrieval_model_fields, allow_null=True), - "doc_metadata": fields.List(fields.Nested(doc_metadata_fields)), - "built_in_field_enabled": fields.Boolean, - "pipeline_id": fields.String, - "runtime_mode": fields.String, - "chunk_structure": fields.String, - "icon_info": fields.Nested(icon_info_fields), - "is_published": fields.Boolean, - "total_documents": fields.Integer, - "total_available_documents": fields.Integer, - "enable_api": fields.Boolean, - "is_multimodal": fields.Boolean, - "permission_keys": fields.List(fields.String()), -} - - class DatasetRerankingModelResponse(ResponseModel): reranking_provider_name: str | None = None reranking_model_name: str | None = None diff --git a/api/fields/member_fields.py b/api/fields/member_fields.py index 9bbcbef8429..80b93f0a24b 100644 --- a/api/fields/member_fields.py +++ b/api/fields/member_fields.py @@ -15,13 +15,13 @@ simple_account_fields = { } -class SimpleAccount(ResponseModel): +class SimpleAccountResponse(ResponseModel): id: str name: str email: str -class _AccountAvatar(ResponseModel): +class _AccountAvatarResponseMixin(ResponseModel): avatar: str | None = None @computed_field(return_type=str | None) # type: ignore[prop-decorator] @@ -30,7 +30,7 @@ class _AccountAvatar(ResponseModel): return build_avatar_url(self.avatar) -class Account(_AccountAvatar): +class AccountResponse(_AccountAvatarResponseMixin): id: str name: str email: str @@ -48,7 +48,7 @@ class Account(_AccountAvatar): return to_timestamp(value) -class AccountWithRole(_AccountAvatar): +class AccountWithRoleResponse(_AccountAvatarResponseMixin): id: str name: str email: str @@ -65,5 +65,11 @@ class AccountWithRole(_AccountAvatar): return to_timestamp(value) -class AccountWithRoleList(ResponseModel): - accounts: list[AccountWithRole] +class AccountWithRoleListResponse(ResponseModel): + accounts: list[AccountWithRoleResponse] + + +SimpleAccount = SimpleAccountResponse +Account = AccountResponse +AccountWithRole = AccountWithRoleResponse +AccountWithRoleList = AccountWithRoleListResponse diff --git a/api/fields/snippet_fields.py b/api/fields/snippet_fields.py index 699a3687ac1..9d12b600722 100644 --- a/api/fields/snippet_fields.py +++ b/api/fields/snippet_fields.py @@ -1,61 +1,67 @@ -from typing import override +from datetime import datetime +from typing import Any -from flask_restx import fields +from pydantic import Field, field_validator -from fields.member_fields import simple_account_fields -from libs.helper import TimestampField +from fields.base import ResponseModel +from fields.member_fields import SimpleAccountResponse +from libs.helper import to_timestamp -class OpaqueRawField(fields.Raw): - @override - def schema(self) -> dict[str, object]: - return {"type": "object"} +class SnippetTagResponse(ResponseModel): + id: str + name: str + type: str -tag_fields = {"id": fields.String, "name": fields.String, "type": fields.String} +class SnippetListItemResponse(ResponseModel): + id: str + name: str + description: str | None = None + type: str + version: int + use_count: int + is_published: bool + icon_info: dict[str, Any] | None = None + tags: list[SnippetTagResponse] = Field(default_factory=list) + created_by: str | None = None + author_name: str | None = None + created_at: int | None = None + updated_by: str | None = None + updated_at: int | None = None -# Snippet list item fields (lightweight for list display) -snippet_list_fields = { - "id": fields.String, - "name": fields.String, - "description": fields.String, - "type": fields.String, - "version": fields.Integer, - "use_count": fields.Integer, - "is_published": fields.Boolean, - "icon_info": OpaqueRawField, - "tags": fields.List(fields.Nested(tag_fields)), - "created_by": fields.String, - "author_name": fields.String, - "created_at": TimestampField, - "updated_by": fields.String, - "updated_at": TimestampField, -} + @field_validator("created_at", "updated_at", mode="before") + @classmethod + def _normalize_timestamp(cls, value: datetime | int | None) -> int | None: + return to_timestamp(value) -# Full snippet fields (includes creator info and graph data) -snippet_fields = { - "id": fields.String, - "name": fields.String, - "description": fields.String, - "type": fields.String, - "version": fields.Integer, - "use_count": fields.Integer, - "is_published": fields.Boolean, - "icon_info": OpaqueRawField, - "graph": OpaqueRawField(attribute="graph_dict"), - "input_fields": OpaqueRawField(attribute="input_fields_list"), - "tags": fields.List(fields.Nested(tag_fields)), - "created_by": fields.Nested(simple_account_fields, attribute="created_by_account", allow_null=True), - "created_at": TimestampField, - "updated_by": fields.Nested(simple_account_fields, attribute="updated_by_account", allow_null=True), - "updated_at": TimestampField, -} -# Pagination response fields -snippet_pagination_fields = { - "data": fields.List(fields.Nested(snippet_list_fields)), - "page": fields.Integer, - "limit": fields.Integer, - "total": fields.Integer, - "has_more": fields.Boolean, -} +class SnippetResponse(ResponseModel): + id: str + name: str + description: str | None = None + type: str + version: int + use_count: int + is_published: bool + icon_info: dict[str, Any] | None = None + graph: dict[str, Any] | None = Field(default=None, validation_alias="graph_dict") + input_fields: list[dict[str, Any]] | None = Field(default=None, validation_alias="input_fields_list") + tags: list[SnippetTagResponse] = Field(default_factory=list) + created_by: SimpleAccountResponse | None = Field(default=None, validation_alias="created_by_account") + created_at: int | None = None + updated_by: SimpleAccountResponse | None = Field(default=None, validation_alias="updated_by_account") + updated_at: int | None = None + + @field_validator("created_at", "updated_at", mode="before") + @classmethod + def _normalize_timestamp(cls, value: datetime | int | None) -> int | None: + return to_timestamp(value) + + +class SnippetPaginationResponse(ResponseModel): + data: list[SnippetListItemResponse] + page: int + limit: int + total: int + has_more: bool diff --git a/api/fields/workflow_fields.py b/api/fields/workflow_fields.py deleted file mode 100644 index 2d0d8f9f546..00000000000 --- a/api/fields/workflow_fields.py +++ /dev/null @@ -1,129 +0,0 @@ -from typing import override - -from flask_restx import fields - -from core.helper import encrypter -from fields.member_fields import simple_account_fields -from graphon.variables import SecretVariable, SegmentType, VariableBase -from libs.helper import TimestampField - -from ._value_type_serializer import serialize_value_type - -ENVIRONMENT_VARIABLE_SUPPORTED_TYPES = (SegmentType.STRING, SegmentType.NUMBER, SegmentType.SECRET) - - -class OpaqueRawField(fields.Raw): - @override - def schema(self) -> dict[str, object]: - return {"type": "object"} - - -class JsonValueRawField(fields.Raw): - @override - def schema(self) -> dict[str, object]: - return { - "anyOf": [ - {"type": "string"}, - {"type": "integer"}, - {"type": "number"}, - {"type": "boolean"}, - {"type": "object", "additionalProperties": True}, - {"type": "array", "items": {}}, - {"type": "null"}, - ] - } - - -class EnvironmentVariableField(fields.Raw): - @override - def schema(self) -> dict[str, object]: - return {"type": "object"} - - @override - def format(self, value): - # Mask secret variables values in environment_variables - if isinstance(value, SecretVariable): - return { - "id": value.id, - "name": value.name, - "value": encrypter.full_mask_token(), - "value_type": value.value_type.value, - "description": value.description, - } - if isinstance(value, VariableBase): - return { - "id": value.id, - "name": value.name, - "value": value.value, - "value_type": str(value.value_type.exposed_type()), - "description": value.description, - } - if isinstance(value, dict): - value_type_str = value.get("value_type") - if not isinstance(value_type_str, str): - raise TypeError( - f"unexpected type for value_type field, value={value_type_str}, type={type(value_type_str)}" - ) - value_type = SegmentType(value_type_str).exposed_type() - if value_type not in ENVIRONMENT_VARIABLE_SUPPORTED_TYPES: - raise ValueError(f"Unsupported environment variable value type: {value_type}") - return value - - -conversation_variable_fields = { - "id": fields.String, - "name": fields.String, - "value_type": fields.String(attribute=serialize_value_type), - "value": JsonValueRawField, - "description": fields.String, -} - -pipeline_variable_fields = { - "label": fields.String, - "variable": fields.String, - "type": fields.String, - "belong_to_node_id": fields.String, - "max_length": fields.Integer, - "required": fields.Boolean, - "unit": fields.String, - "default_value": JsonValueRawField, - "options": fields.List(fields.String), - "placeholder": fields.String, - "tooltips": fields.String, - "allowed_file_types": fields.List(fields.String), - "allow_file_extension": fields.List(fields.String), - "allow_file_upload_methods": fields.List(fields.String), -} - -workflow_fields = { - "id": fields.String, - "graph": OpaqueRawField(attribute="graph_dict"), - "features": OpaqueRawField(attribute="features_dict"), - "hash": fields.String(attribute="unique_hash"), - "version": fields.String, - "marked_name": fields.String, - "marked_comment": fields.String, - "created_by": fields.Nested(simple_account_fields, attribute="created_by_account"), - "created_at": TimestampField, - "updated_by": fields.Nested(simple_account_fields, attribute="updated_by_account", allow_null=True), - "updated_at": TimestampField, - "tool_published": fields.Boolean, - "environment_variables": fields.List(EnvironmentVariableField()), - "conversation_variables": fields.List(fields.Nested(conversation_variable_fields)), - "rag_pipeline_variables": fields.List(fields.Nested(pipeline_variable_fields)), -} - -workflow_partial_fields = { - "id": fields.String, - "created_by": fields.String, - "created_at": TimestampField, - "updated_by": fields.String, - "updated_at": TimestampField, -} - -workflow_pagination_fields = { - "items": fields.List(fields.Nested(workflow_fields), attribute="items"), - "page": fields.Integer, - "limit": fields.Integer(attribute="limit"), - "has_more": fields.Boolean(attribute="has_more"), -} diff --git a/api/fields/workflow_run_fields.py b/api/fields/workflow_run_fields.py index 53cdfa234f9..be043fbbd6c 100644 --- a/api/fields/workflow_run_fields.py +++ b/api/fields/workflow_run_fields.py @@ -1,53 +1,14 @@ -"""Workflow run response schemas for console APIs. - -Most workflow-run endpoints should document and serialize responses with the -Pydantic models in this module. The remaining Flask-RESTX field dictionaries are -kept only for workflow app-log endpoints that still build legacy log models. -""" - from __future__ import annotations from datetime import datetime from typing import Any -from flask_restx import Namespace, fields from pydantic import AliasChoices, Field, field_validator from fields.base import ResponseModel from fields.end_user_fields import SimpleEndUser -from fields.member_fields import SimpleAccount -from libs.helper import TimestampField, to_timestamp - -workflow_run_for_log_fields = { - "id": fields.String, - "version": fields.String, - "status": fields.String, - "triggered_from": fields.String, - "error": fields.String, - "elapsed_time": fields.Float, - "total_tokens": fields.Integer, - "total_steps": fields.Integer, - "created_at": TimestampField, - "finished_at": TimestampField, - "exceptions_count": fields.Integer, -} - - -def build_workflow_run_for_log_model(api_or_ns: Namespace): - return api_or_ns.model("WorkflowRunForLog", workflow_run_for_log_fields) - - -workflow_run_for_archived_log_fields = { - "id": fields.String, - "status": fields.String, - "triggered_from": fields.String, - "elapsed_time": fields.Float, - "total_tokens": fields.Integer, -} - - -def build_workflow_run_for_archived_log_model(api_or_ns: Namespace): - return api_or_ns.model("WorkflowRunForArchivedLog", workflow_run_for_archived_log_fields) +from fields.member_fields import SimpleAccountResponse +from libs.helper import to_timestamp class WorkflowRunForLogResponse(ResponseModel): @@ -98,7 +59,7 @@ class WorkflowRunForListResponse(ResponseModel): elapsed_time: float | None = None total_tokens: int | None = None total_steps: int | None = None - created_by_account: SimpleAccount | None = None + created_by_account: SimpleAccountResponse | None = None created_at: int | None = None finished_at: int | None = None exceptions_count: int | None = None @@ -158,7 +119,7 @@ class WorkflowRunDetailResponse(ResponseModel): total_tokens: int | None = None total_steps: int | None = None created_by_role: str | None = None - created_by_account: SimpleAccount | None = None + created_by_account: SimpleAccountResponse | None = None created_by_end_user: SimpleEndUser | None = None created_at: int | None = None finished_at: int | None = None @@ -194,7 +155,7 @@ class WorkflowRunNodeExecutionResponse(ResponseModel): extras: Any = None created_at: int | None = None created_by_role: str | None = None - created_by_account: SimpleAccount | None = None + created_by_account: SimpleAccountResponse | None = None created_by_end_user: SimpleEndUser | None = None finished_at: int | None = None inputs_truncated: bool | None = None diff --git a/api/libs/helper.py b/api/libs/helper.py index 7066f9eab45..35c613ae90e 100644 --- a/api/libs/helper.py +++ b/api/libs/helper.py @@ -10,12 +10,11 @@ import uuid from collections.abc import Callable, Generator, Mapping from datetime import datetime from hashlib import sha256 -from typing import TYPE_CHECKING, Annotated, Any, Protocol, cast, overload, override +from typing import TYPE_CHECKING, Annotated, Any, Protocol, cast, overload from uuid import UUID from zoneinfo import available_timezones from flask import Request, Response, stream_with_context -from flask_restx import fields from pydantic import BaseModel, ConfigDict, TypeAdapter, with_config from pydantic.functional_validators import AfterValidator from typing_extensions import TypedDict @@ -127,26 +126,6 @@ def run(script): return subprocess.getstatusoutput("source /root/.bashrc && " + script) -class AppIconUrlField(fields.Raw): - @override - def schema(self) -> dict[str, object]: - return {"type": "string", "nullable": True} - - @override - def output(self, key, obj, **kwargs): - if obj is None: - return None - - from models.model import App, IconType, Site - - if isinstance(obj, dict) and "app" in obj: - obj = obj["app"] - - if isinstance(obj, App | Site) and obj.icon_type == IconType.IMAGE: - return build_icon_url(obj.icon_type, obj.icon) - return None - - def build_icon_url(icon_type: Any, icon: str | None) -> str | None: if icon is None or icon_type is None: return None @@ -167,28 +146,6 @@ def build_avatar_url(avatar: str | None) -> str | None: return file_helpers.get_signed_file_url(avatar) -class TimestampField(fields.Raw): - @override - def schema(self) -> dict[str, object]: - return {"type": "integer", "format": "int64"} - - @override - def format(self, value) -> int: - return int(value.timestamp()) - - -class OptionalTimestampField(fields.Raw): - @override - def schema(self) -> dict[str, object]: - return {"type": "integer", "format": "int64", "nullable": True} - - @override - def format(self, value) -> int | None: - if value is None: - return None - return int(value.timestamp()) - - @overload def to_timestamp(value: datetime) -> int: ... diff --git a/api/openapi/markdown/console-openapi.md b/api/openapi/markdown/console-openapi.md index b3a0b8a6a71..4bd828c8df4 100644 --- a/api/openapi/markdown/console-openapi.md +++ b/api/openapi/markdown/console-openapi.md @@ -38,7 +38,7 @@ Get account avatar url | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Success | **application/json**: [Account](#account)
| +| 200 | Success | **application/json**: [AccountResponse](#accountresponse)
| ### [POST] /account/change-email #### Request Body @@ -77,7 +77,7 @@ Get account avatar url | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Success | **application/json**: [Account](#account)
| +| 200 | Success | **application/json**: [AccountResponse](#accountresponse)
| ### [POST] /account/change-email/validity #### Request Body @@ -198,7 +198,7 @@ Get account avatar url | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Success | **application/json**: [Account](#account)
| +| 200 | Success | **application/json**: [AccountResponse](#accountresponse)
| ### [POST] /account/interface-theme #### Request Body @@ -211,7 +211,7 @@ Get account avatar url | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Success | **application/json**: [Account](#account)
| +| 200 | Success | **application/json**: [AccountResponse](#accountresponse)
| ### [POST] /account/name #### Request Body @@ -224,7 +224,7 @@ Get account avatar url | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Success | **application/json**: [Account](#account)
| +| 200 | Success | **application/json**: [AccountResponse](#accountresponse)
| ### [POST] /account/password #### Request Body @@ -237,14 +237,14 @@ Get account avatar url | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Success | **application/json**: [Account](#account)
| +| 200 | Success | **application/json**: [AccountResponse](#accountresponse)
| ### [GET] /account/profile #### Responses | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Success | **application/json**: [Account](#account)
| +| 200 | Success | **application/json**: [AccountResponse](#accountresponse)
| ### [POST] /account/timezone #### Request Body @@ -257,7 +257,7 @@ Get account avatar url | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Success | **application/json**: [Account](#account)
| +| 200 | Success | **application/json**: [AccountResponse](#accountresponse)
| ### [POST] /activate Activate account with invitation token @@ -1050,7 +1050,7 @@ Infer CLI tool + ENV suggestions from a standardized Agent App skill | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Success | **application/json**: [WorkspaceListResponse](#workspacelistresponse)
| +| 200 | Success | **application/json**: [WorkspacePaginationResponse](#workspacepaginationresponse)
| ### [GET] /api-based-extension Get all API-based extensions for current tenant @@ -1433,7 +1433,7 @@ Get human input form preview for advanced chat workflow | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Human input form preview | **application/json**: [HumanInputFormPreviewResponse](#humaninputformpreviewresponse)
| +| 200 | Human input form preview retrieved | **application/json**: [HumanInputFormPreviewResponse](#humaninputformpreviewresponse)
| ### [POST] /apps/{app_id}/advanced-chat/workflows/draft/human-input/nodes/{node_id}/form/run **Submit human input form preview** @@ -1455,9 +1455,9 @@ Submit human input form preview for advanced chat workflow #### Responses -| Code | Description | Schema | -| ---- | ----------- | ------ | -| 200 | Human input form submission result | **application/json**: [HumanInputFormSubmitResponse](#humaninputformsubmitresponse)
| +| Code | Description | +| ---- | ----------- | +| 200 | Human input form submitted | ### [POST] /apps/{app_id}/advanced-chat/workflows/draft/iteration/nodes/{node_id}/run **Run draft workflow iteration node** @@ -1479,11 +1479,11 @@ Run draft workflow iteration node for advanced chat #### Responses -| Code | Description | Schema | -| ---- | ----------- | ------ | -| 200 | Iteration node run started successfully | **application/json**: [GeneratedAppResponse](#generatedappresponse)
| -| 403 | Permission denied | | -| 404 | Node not found | | +| Code | Description | +| ---- | ----------- | +| 200 | Iteration node run started successfully | +| 403 | Permission denied | +| 404 | Node not found | ### [POST] /apps/{app_id}/advanced-chat/workflows/draft/loop/nodes/{node_id}/run **Run draft workflow loop node** @@ -1505,11 +1505,11 @@ Run draft workflow loop node for advanced chat #### Responses -| Code | Description | Schema | -| ---- | ----------- | ------ | -| 200 | Loop node run started successfully | **application/json**: [GeneratedAppResponse](#generatedappresponse)
| -| 403 | Permission denied | | -| 404 | Node not found | | +| Code | Description | +| ---- | ----------- | +| 200 | Loop node run started successfully | +| 403 | Permission denied | +| 404 | Node not found | ### [POST] /apps/{app_id}/advanced-chat/workflows/draft/run **Run draft workflow** @@ -1530,11 +1530,11 @@ Run draft workflow for advanced chat application #### Responses -| Code | Description | Schema | -| ---- | ----------- | ------ | -| 200 | Workflow run started successfully | **application/json**: [GeneratedAppResponse](#generatedappresponse)
| -| 400 | Invalid request parameters | | -| 403 | Permission denied | | +| Code | Description | +| ---- | ----------- | +| 200 | Workflow run started successfully | +| 400 | Invalid request parameters | +| 403 | Permission denied | ### [GET] /apps/{app_id}/agent/drive/files List agent drive entries (read-only inspector; one endpoint for both tabs) @@ -3475,9 +3475,9 @@ Get default block configurations for workflow #### Responses -| Code | Description | Schema | -| ---- | ----------- | ------ | -| 200 | Default block configurations retrieved successfully | **application/json**: [DefaultBlockConfigsResponse](#defaultblockconfigsresponse)
| +| Code | Description | +| ---- | ----------- | +| 200 | Default block configurations retrieved successfully | ### [GET] /apps/{app_id}/workflows/default-workflow-block-configs/{block_type} **Get default block config** @@ -3494,10 +3494,10 @@ Get default block configuration by type #### Responses -| Code | Description | Schema | -| ---- | ----------- | ------ | -| 200 | Default block configuration retrieved successfully | **application/json**: [DefaultBlockConfigResponse](#defaultblockconfigresponse)
| -| 404 | Block type not found | | +| Code | Description | +| ---- | ----------- | +| 200 | Default block configuration retrieved successfully | +| 404 | Block type not found | ### [GET] /apps/{app_id}/workflows/draft **Get draft workflow** @@ -3661,7 +3661,7 @@ Test human input delivery for workflow | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Human input delivery test result | **application/json**: [EmptyObjectResponse](#emptyobjectresponse)
| +| 200 | Human input delivery tested | **application/json**: [HumanInputDeliveryTestResponse](#humaninputdeliverytestresponse)
| ### [POST] /apps/{app_id}/workflows/draft/human-input/nodes/{node_id}/form/preview **Preview human input form content and placeholders** @@ -3685,7 +3685,7 @@ Get human input form preview for workflow | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Human input form preview | **application/json**: [HumanInputFormPreviewResponse](#humaninputformpreviewresponse)
| +| 200 | Human input form preview retrieved | **application/json**: [HumanInputFormPreviewResponse](#humaninputformpreviewresponse)
| ### [POST] /apps/{app_id}/workflows/draft/human-input/nodes/{node_id}/form/run **Submit human input form preview** @@ -3707,9 +3707,9 @@ Submit human input form preview for workflow #### Responses -| Code | Description | Schema | -| ---- | ----------- | ------ | -| 200 | Human input form submission result | **application/json**: [HumanInputFormSubmitResponse](#humaninputformsubmitresponse)
| +| Code | Description | +| ---- | ----------- | +| 200 | Human input form submitted | ### [POST] /apps/{app_id}/workflows/draft/iteration/nodes/{node_id}/run **Run draft workflow iteration node** @@ -3729,11 +3729,11 @@ Submit human input form preview for workflow #### Responses -| Code | Description | Schema | -| ---- | ----------- | ------ | -| 200 | Workflow iteration node run started successfully | **application/json**: [GeneratedAppResponse](#generatedappresponse)
| -| 403 | Permission denied | | -| 404 | Node not found | | +| Code | Description | +| ---- | ----------- | +| 200 | Workflow iteration node run started successfully | +| 403 | Permission denied | +| 404 | Node not found | ### [POST] /apps/{app_id}/workflows/draft/loop/nodes/{node_id}/run **Run draft workflow loop node** @@ -3753,11 +3753,11 @@ Submit human input form preview for workflow #### Responses -| Code | Description | Schema | -| ---- | ----------- | ------ | -| 200 | Workflow loop node run started successfully | **application/json**: [GeneratedAppResponse](#generatedappresponse)
| -| 403 | Permission denied | | -| 404 | Node not found | | +| Code | Description | +| ---- | ----------- | +| 200 | Workflow loop node run started successfully | +| 403 | Permission denied | +| 404 | Node not found | ### [GET] /apps/{app_id}/workflows/draft/nodes/{node_id}/agent-composer #### Parameters @@ -3943,7 +3943,7 @@ Get last run result for draft workflow node | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Trigger event received and node executed successfully | **application/json**: [GeneratedAppResponse](#generatedappresponse)
| +| 200 | Trigger event received and node executed successfully | **application/json**: [WorkflowRunNodeExecutionResponse](#workflowrunnodeexecutionresponse)
| | 403 | Permission denied | | | 500 | Internal server error | | @@ -3996,10 +3996,10 @@ Get variables for a specific node #### Responses -| Code | Description | Schema | -| ---- | ----------- | ------ | -| 200 | Draft workflow run started successfully | **application/json**: [GeneratedAppResponse](#generatedappresponse)
| -| 403 | Permission denied | | +| Code | Description | +| ---- | ----------- | +| 200 | Draft workflow run started successfully | +| 403 | Permission denied | ### [GET] /apps/{app_id}/workflows/draft/runs/{run_id}/node-outputs Snapshot of every node's declared outputs for a draft workflow run. @@ -4100,15 +4100,15 @@ Get system variables for workflow | Required | Schema | | -------- | ------ | -| Yes | **application/json**: [DraftWorkflowTriggerRunRequest](#draftworkflowtriggerrunrequest)
| +| Yes | **application/json**: [DraftWorkflowTriggerRunPayload](#draftworkflowtriggerrunpayload)
| #### Responses -| Code | Description | Schema | -| ---- | ----------- | ------ | -| 200 | Trigger event received and workflow executed successfully | **application/json**: [GeneratedAppResponse](#generatedappresponse)
| -| 403 | Permission denied | | -| 500 | Internal server error | | +| Code | Description | +| ---- | ----------- | +| 200 | Trigger event received and workflow executed successfully | +| 403 | Permission denied | +| 500 | Internal server error | ### [POST] /apps/{app_id}/workflows/draft/trigger/run-all **Full workflow debug when the start node is a trigger** @@ -4127,11 +4127,11 @@ Get system variables for workflow #### Responses -| Code | Description | Schema | -| ---- | ----------- | ------ | -| 200 | Workflow executed successfully | **application/json**: [GeneratedAppResponse](#generatedappresponse)
| -| 403 | Permission denied | | -| 500 | Internal server error | | +| Code | Description | +| ---- | ----------- | +| 200 | Workflow executed successfully | +| 403 | Permission denied | +| 500 | Internal server error | ### [DELETE] /apps/{app_id}/workflows/draft/variables Delete all draft workflow variables @@ -4278,7 +4278,7 @@ Get published workflow for an application | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Workflow published successfully | **application/json**: [WorkflowPublishResponse](#workflowpublishresponse)
| +| 200 | Workflow published successfully | **application/json**: [PublishWorkflowResponse](#publishworkflowresponse)
| ### [GET] /apps/{app_id}/workflows/published/runs/{run_id}/node-outputs Snapshot of every node's declared outputs for a published workflow run. @@ -4423,7 +4423,7 @@ Restore a published workflow version into the draft workflow | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Workflow restored successfully | **application/json**: [WorkflowRestoreResponse](#workflowrestoreresponse)
| +| 200 | Workflow restored successfully | **application/json**: [SyncDraftWorkflowResponse](#syncdraftworkflowresponse)
| | 400 | Source workflow must be published | | | 404 | Workflow not found | | @@ -4882,7 +4882,7 @@ Create external knowledge dataset | Code | Description | Schema | | ---- | ----------- | ------ | -| 201 | External dataset created successfully | **application/json**: [DatasetDetail](#datasetdetail)
| +| 201 | External dataset created successfully | **application/json**: [DatasetDetailResponse](#datasetdetailresponse)
| | 400 | Invalid parameters | | | 403 | Permission denied | | @@ -4904,6 +4904,8 @@ Get external knowledge API templates | 200 | External API templates retrieved successfully | **application/json**: [ExternalKnowledgeApiListResponse](#externalknowledgeapilistresponse)
| ### [POST] /datasets/external-knowledge-api +Create external knowledge API template + #### Request Body | Required | Schema | @@ -4915,6 +4917,7 @@ Get external knowledge API templates | Code | Description | Schema | | ---- | ----------- | ------ | | 201 | External API template created successfully | **application/json**: [ExternalKnowledgeApiResponse](#externalknowledgeapiresponse)
| +| 403 | Permission denied | | ### [DELETE] /datasets/external-knowledge-api/{external_knowledge_api_id} #### Parameters @@ -4946,11 +4949,13 @@ Get external knowledge API template details | 404 | Template not found | | ### [PATCH] /datasets/external-knowledge-api/{external_knowledge_api_id} +Update external knowledge API template + #### Parameters | Name | Located in | Description | Required | Schema | | ---- | ---------- | ----------- | -------- | ------ | -| external_knowledge_api_id | path | | Yes | string (uuid) | +| external_knowledge_api_id | path | External knowledge API ID | Yes | string (uuid) | #### Request Body @@ -4963,6 +4968,7 @@ Get external knowledge API template details | Code | Description | Schema | | ---- | ----------- | ------ | | 200 | External API template updated successfully | **application/json**: [ExternalKnowledgeApiResponse](#externalknowledgeapiresponse)
| +| 404 | Template not found | | ### [GET] /datasets/external-knowledge-api/{external_knowledge_api_id}/use-check Check if external knowledge API is being used @@ -5841,7 +5847,7 @@ Test external knowledge retrieval for dataset | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | External hit testing completed successfully | **application/json**: [ExternalRetrievalTestResponse](#externalretrievaltestresponse)
| +| 200 | External hit testing completed successfully | **application/json**: [ExternalHitTestingResponse](#externalhittestingresponse)
| | 400 | Invalid parameters | | | 404 | Dataset not found | | @@ -7231,7 +7237,7 @@ Initiate OAuth login process | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Success | **application/json**: [RagPipelineOpaqueResponse](#ragpipelineopaqueresponse)
| +| 200 | Datasource plugins retrieved successfully | **application/json**: [DatasourcePluginListResponse](#datasourcepluginlistresponse)
| ### [POST] /rag/pipelines/imports #### Request Body @@ -7286,7 +7292,7 @@ Initiate OAuth login process | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Success | **application/json**: [RagPipelineOpaqueResponse](#ragpipelineopaqueresponse)
| +| 200 | Recommended plugins retrieved successfully | **application/json**: [RagPipelineRecommendedPluginResponse](#ragpipelinerecommendedpluginresponse)
| ### [POST] /rag/pipelines/transform/datasets/{dataset_id} #### Parameters @@ -7299,7 +7305,7 @@ Initiate OAuth login process | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Success | **application/json**: [RagPipelineOpaqueResponse](#ragpipelineopaqueresponse)
| +| 200 | Dataset transformed successfully | **application/json**: [RagPipelineTransformResponse](#ragpipelinetransformresponse)
| ### [POST] /rag/pipelines/{pipeline_id}/customized/publish #### Parameters @@ -7430,9 +7436,9 @@ Initiate OAuth login process #### Responses -| Code | Description | Schema | -| ---- | ----------- | ------ | -| 200 | Default block configs retrieved successfully | **application/json**: [DefaultBlockConfigsResponse](#defaultblockconfigsresponse)
| +| Code | Description | +| ---- | ----------- | +| 200 | Default workflow block configurations retrieved successfully | ### [GET] /rag/pipelines/{pipeline_id}/workflows/default-workflow-block-configs/{block_type} **Get default block config** @@ -7447,9 +7453,9 @@ Initiate OAuth login process #### Responses -| Code | Description | Schema | -| ---- | ----------- | ------ | -| 200 | Default block config retrieved successfully | **application/json**: [DefaultBlockConfigResponse](#defaultblockconfigresponse)
| +| Code | Description | +| ---- | ----------- | +| 200 | Default workflow block configuration retrieved successfully | ### [GET] /rag/pipelines/{pipeline_id}/workflows/draft **Get draft rag pipeline's workflow** @@ -7506,9 +7512,9 @@ Initiate OAuth login process #### Responses -| Code | Description | Schema | -| ---- | ----------- | ------ | -| 200 | Success | **application/json**: [RagPipelineOpaqueResponse](#ragpipelineopaqueresponse)
| +| Code | Description | +| ---- | ----------- | +| 200 | Success | ### [POST] /rag/pipelines/{pipeline_id}/workflows/draft/datasource/variables-inspect **Set datasource variables** @@ -7564,9 +7570,9 @@ Initiate OAuth login process #### Responses -| Code | Description | Schema | -| ---- | ----------- | ------ | -| 200 | Success | **application/json**: [RagPipelineOpaqueResponse](#ragpipelineopaqueresponse)
| +| Code | Description | +| ---- | ----------- | +| 200 | Success | ### [POST] /rag/pipelines/{pipeline_id}/workflows/draft/loop/nodes/{node_id}/run **Run draft workflow loop node** @@ -7586,9 +7592,9 @@ Initiate OAuth login process #### Responses -| Code | Description | Schema | -| ---- | ----------- | ------ | -| 200 | Success | **application/json**: [RagPipelineOpaqueResponse](#ragpipelineopaqueresponse)
| +| Code | Description | +| ---- | ----------- | +| 200 | Success | ### [GET] /rag/pipelines/{pipeline_id}/workflows/draft/nodes/{node_id}/last-run #### Parameters @@ -7668,7 +7674,7 @@ Initiate OAuth login process | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Success | **application/json**: [RagPipelineStepParametersResponse](#ragpipelinestepparametersresponse)
| +| 200 | First step parameters retrieved successfully | **application/json**: [RagPipelineVariablesResponse](#ragpipelinevariablesresponse)
| ### [GET] /rag/pipelines/{pipeline_id}/workflows/draft/processing/parameters **Get second step parameters of rag pipeline** @@ -7684,7 +7690,7 @@ Initiate OAuth login process | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Success | **application/json**: [RagPipelineStepParametersResponse](#ragpipelinestepparametersresponse)
| +| 200 | Second step parameters retrieved successfully | **application/json**: [RagPipelineVariablesResponse](#ragpipelinevariablesresponse)
| ### [POST] /rag/pipelines/{pipeline_id}/workflows/draft/run **Run draft workflow** @@ -7703,9 +7709,9 @@ Initiate OAuth login process #### Responses -| Code | Description | Schema | -| ---- | ----------- | ------ | -| 200 | Success | **application/json**: [RagPipelineOpaqueResponse](#ragpipelineopaqueresponse)
| +| Code | Description | +| ---- | ----------- | +| 200 | Success | ### [GET] /rag/pipelines/{pipeline_id}/workflows/draft/system-variables #### Parameters @@ -7883,9 +7889,9 @@ Initiate OAuth login process #### Responses -| Code | Description | Schema | -| ---- | ----------- | ------ | -| 200 | Success | **application/json**: [RagPipelineOpaqueResponse](#ragpipelineopaqueresponse)
| +| Code | Description | +| ---- | ----------- | +| 200 | Success | ### [GET] /rag/pipelines/{pipeline_id}/workflows/published/pre-processing/parameters **Get first step parameters of rag pipeline** @@ -7901,7 +7907,7 @@ Initiate OAuth login process | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Success | **application/json**: [RagPipelineStepParametersResponse](#ragpipelinestepparametersresponse)
| +| 200 | First step parameters retrieved successfully | **application/json**: [RagPipelineVariablesResponse](#ragpipelinevariablesresponse)
| ### [GET] /rag/pipelines/{pipeline_id}/workflows/published/processing/parameters **Get second step parameters of rag pipeline** @@ -7917,7 +7923,7 @@ Initiate OAuth login process | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Success | **application/json**: [RagPipelineStepParametersResponse](#ragpipelinestepparametersresponse)
| +| 200 | Second step parameters retrieved successfully | **application/json**: [RagPipelineVariablesResponse](#ragpipelinevariablesresponse)
| ### [POST] /rag/pipelines/{pipeline_id}/workflows/published/run **Run published workflow** @@ -7936,9 +7942,9 @@ Initiate OAuth login process #### Responses -| Code | Description | Schema | -| ---- | ----------- | ------ | -| 200 | Success | **application/json**: [RagPipelineOpaqueResponse](#ragpipelineopaqueresponse)
| +| Code | Description | +| ---- | ----------- | +| 200 | Success | ### [DELETE] /rag/pipelines/{pipeline_id}/workflows/{workflow_id} **Delete a published workflow version that is not currently active on the pipeline** @@ -8192,9 +8198,9 @@ Get all published workflows for a snippet #### Responses -| Code | Description | Schema | -| ---- | ----------- | ------ | -| 200 | Default block configs retrieved successfully | **application/json**: [DefaultBlockConfigsResponse](#defaultblockconfigsresponse)
| +| Code | Description | +| ---- | ----------- | +| 200 | Default block configs retrieved successfully | ### [GET] /snippets/{snippet_id}/workflows/draft **Get draft workflow for snippet** @@ -8231,7 +8237,7 @@ Get all published workflows for a snippet | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Draft workflow synced successfully | **application/json**: [WorkflowRestoreResponse](#workflowrestoreresponse)
| +| 200 | Draft workflow synced successfully | **application/json**: [SyncDraftWorkflowResponse](#syncdraftworkflowresponse)
| | 400 | Hash mismatch | | ### [GET] /snippets/{snippet_id}/workflows/draft/config @@ -8304,7 +8310,7 @@ Returns an SSE event stream with iteration progress and results. | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Iteration node run started successfully (SSE stream) | **application/json**: [GeneratedAppResponse](#generatedappresponse)
| +| 200 | Iteration node run started successfully (SSE stream) | **application/json**: [EventStreamResponse](#eventstreamresponse)
| | 404 | Snippet or draft workflow not found | | ### [POST] /snippets/{snippet_id}/workflows/draft/loop/nodes/{node_id}/run @@ -8331,7 +8337,7 @@ Returns an SSE event stream with loop progress and results. | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Loop node run started successfully (SSE stream) | **application/json**: [GeneratedAppResponse](#generatedappresponse)
| +| 200 | Loop node run started successfully (SSE stream) | **application/json**: [EventStreamResponse](#eventstreamresponse)
| | 404 | Snippet or draft workflow not found | | ### [GET] /snippets/{snippet_id}/workflows/draft/nodes/{node_id}/last-run @@ -8436,7 +8442,7 @@ and returns an SSE event stream with execution progress and results. | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Draft workflow run started successfully (SSE stream) | **application/json**: [GeneratedAppResponse](#generatedappresponse)
| +| 200 | Draft workflow run started successfully (SSE stream) | **application/json**: [EventStreamResponse](#eventstreamresponse)
| | 404 | Snippet or draft workflow not found | | ### [GET] /snippets/{snippet_id}/workflows/draft/system-variables @@ -8586,17 +8592,11 @@ Reset a draft workflow variable to its default value (snippet scope) | ---- | ---------- | ----------- | -------- | ------ | | snippet_id | path | | Yes | string (uuid) | -#### Request Body - -| Required | Schema | -| -------- | ------ | -| Yes | **application/json**: [PublishWorkflowPayload](#publishworkflowpayload)
| - #### Responses | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Workflow published successfully | **application/json**: [WorkflowPublishResponse](#workflowpublishresponse)
| +| 200 | Workflow published successfully | **application/json**: [PublishWorkflowResponse](#publishworkflowresponse)
| | 400 | No draft workflow found | | ### [POST] /snippets/{snippet_id}/workflows/{workflow_id}/restore @@ -8613,7 +8613,7 @@ Reset a draft workflow variable to its default value (snippet scope) | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Workflow restored successfully | **application/json**: [WorkflowRestoreResponse](#workflowrestoreresponse)
| +| 200 | Workflow restored successfully | **application/json**: [SyncDraftWorkflowResponse](#syncdraftworkflowresponse)
| | 400 | Source workflow must be published | | | 404 | Workflow not found | | @@ -8745,7 +8745,7 @@ Bedrock retrieval test (internal use only) | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Bedrock retrieval test completed | **application/json**: [ExternalRetrievalTestResponse](#externalretrievaltestresponse)
| +| 200 | Bedrock retrieval test completed | **application/json**: [BedrockRetrievalResponse](#bedrockretrievalresponse)
| ### [GET] /trial-apps/{app_id} **Get app detail** @@ -8760,7 +8760,7 @@ Bedrock retrieval test (internal use only) | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Success | **application/json**: [TrialAppDetailWithSite](#trialappdetailwithsite)
| +| 200 | App detail retrieved successfully | **application/json**: [AppDetailWithSite](#appdetailwithsite)
| ### [POST] /trial-apps/{app_id}/audio-to-text #### Parameters @@ -8790,9 +8790,9 @@ Bedrock retrieval test (internal use only) #### Responses -| Code | Description | Schema | -| ---- | ----------- | ------ | -| 200 | Success | **application/json**: [GeneratedAppResponse](#generatedappresponse)
| +| Code | Description | +| ---- | ----------- | +| 200 | Success | ### [POST] /trial-apps/{app_id}/completion-messages #### Parameters @@ -8809,9 +8809,9 @@ Bedrock retrieval test (internal use only) #### Responses -| Code | Description | Schema | -| ---- | ----------- | ------ | -| 200 | Success | **application/json**: [GeneratedAppResponse](#generatedappresponse)
| +| Code | Description | +| ---- | ----------- | +| 200 | Success | ### [GET] /trial-apps/{app_id}/datasets #### Parameters @@ -8827,7 +8827,7 @@ Bedrock retrieval test (internal use only) | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Success | **application/json**: [TrialDatasetList](#trialdatasetlist)
| +| 200 | Success | **application/json**: [TrialDatasetListResponse](#trialdatasetlistresponse)
| ### [GET] /trial-apps/{app_id}/messages/{message_id}/suggested-questions #### Parameters @@ -8907,7 +8907,7 @@ Returns the site configuration for the application including theme, icons, and t | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Success | **application/json**: [TrialWorkflow](#trialworkflow)
| +| 200 | Workflow detail retrieved successfully | **application/json**: [WorkflowResponse](#workflowresponse)
| ### [POST] /trial-apps/{app_id}/workflows/run **Run workflow** @@ -8926,9 +8926,9 @@ Returns the site configuration for the application including theme, icons, and t #### Responses -| Code | Description | Schema | -| ---- | ----------- | ------ | -| 200 | Success | **application/json**: [GeneratedAppResponse](#generatedappresponse)
| +| Code | Description | +| ---- | ----------- | +| 200 | Success | ### [POST] /trial-apps/{app_id}/workflows/tasks/{task_id}/stop **Stop workflow task** @@ -9104,7 +9104,7 @@ Get list of available agent providers | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Snippets retrieved successfully | **application/json**: [SnippetPagination](#snippetpagination)
| +| 200 | Snippets retrieved successfully | **application/json**: [SnippetPaginationResponse](#snippetpaginationresponse)
| ### [POST] /workspaces/current/customized-snippets **Create a new customized snippet** @@ -9119,7 +9119,7 @@ Get list of available agent providers | Code | Description | Schema | | ---- | ----------- | ------ | -| 201 | Snippet created successfully | **application/json**: [Snippet](#snippet)
| +| 201 | Snippet created successfully | **application/json**: [SnippetResponse](#snippetresponse)
| | 400 | Invalid request | | ### [POST] /workspaces/current/customized-snippets/imports @@ -9135,8 +9135,8 @@ Get list of available agent providers | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Snippet imported successfully | **application/json**: [SnippetImportResponse](#snippetimportresponse)
| -| 202 | Import pending confirmation | **application/json**: [SnippetImportResponse](#snippetimportresponse)
| +| 200 | Snippet imported successfully | **application/json**: [SnippetImportInfo](#snippetimportinfo)
| +| 202 | Import pending confirmation | **application/json**: [SnippetImportInfo](#snippetimportinfo)
| | 400 | Import failed | | ### [POST] /workspaces/current/customized-snippets/imports/{import_id}/confirm @@ -9152,7 +9152,7 @@ Get list of available agent providers | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Import confirmed successfully | **application/json**: [SnippetImportResponse](#snippetimportresponse)
| +| 200 | Import confirmed successfully | **application/json**: [SnippetImportInfo](#snippetimportinfo)
| | 400 | Import failed | | ### [DELETE] /workspaces/current/customized-snippets/{snippet_id} @@ -9184,7 +9184,7 @@ Get list of available agent providers | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Snippet retrieved successfully | **application/json**: [Snippet](#snippet)
| +| 200 | Snippet retrieved successfully | **application/json**: [SnippetResponse](#snippetresponse)
| | 404 | Snippet not found | | ### [PATCH] /workspaces/current/customized-snippets/{snippet_id} @@ -9206,7 +9206,7 @@ Get list of available agent providers | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Snippet updated successfully | **application/json**: [Snippet](#snippet)
| +| 200 | Snippet updated successfully | **application/json**: [SnippetResponse](#snippetresponse)
| | 400 | Invalid request | | | 404 | Snippet not found | | @@ -9223,7 +9223,7 @@ Get list of available agent providers | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Dependencies checked successfully | **application/json**: [SnippetDependencyCheckResponse](#snippetdependencycheckresponse)
| +| 200 | Dependencies checked successfully | **application/json**: [CheckDependenciesResult](#checkdependenciesresult)
| | 404 | Snippet not found | | ### [GET] /workspaces/current/customized-snippets/{snippet_id}/export @@ -9240,10 +9240,10 @@ Export snippet configuration as DSL #### Responses -| Code | Description | Schema | -| ---- | ----------- | ------ | -| 200 | Snippet exported successfully | **application/json**: [TextFileResponse](#textfileresponse)
| -| 404 | Snippet not found | | +| Code | Description | +| ---- | ----------- | +| 200 | Snippet exported successfully | +| 404 | Snippet not found | ### [POST] /workspaces/current/customized-snippets/{snippet_id}/use-count/increment **Increment snippet use count when it is inserted into a workflow** @@ -9260,7 +9260,7 @@ Increment snippet use count by 1 | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Use count incremented successfully | **application/json**: [SnippetUseCountResponse](#snippetusecountresponse)
| +| 200 | Use count incremented successfully | **application/json**: [SnippetUseCountIncrementResponse](#snippetusecountincrementresponse)
| | 404 | Snippet not found | | ### [GET] /workspaces/current/dataset-operators @@ -9268,7 +9268,7 @@ Increment snippet use count by 1 | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Success | **application/json**: [AccountWithRoleList](#accountwithrolelist)
| +| 200 | Success | **application/json**: [AccountWithRoleListResponse](#accountwithrolelistresponse)
| ### [GET] /workspaces/current/default-model #### Parameters @@ -9477,7 +9477,7 @@ Update a plugin endpoint | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Success | **application/json**: [AccountWithRoleList](#accountwithrolelist)
| +| 200 | Success | **application/json**: [AccountWithRoleListResponse](#accountwithrolelistresponse)
| ### [POST] /workspaces/current/members/invite-email #### Request Body @@ -11739,9 +11739,15 @@ Returns permission flags that control workspace features like member invitations | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Success | **application/json**: [WorkspaceMutationResponse](#workspacemutationresponse)
| +| 200 | Success | **application/json**: [WorkspaceTenantResultResponse](#workspacetenantresultresponse)
| ### [POST] /workspaces/custom-config/webapp-logo/upload +#### Request Body + +| Required | Schema | +| -------- | ------ | +| Yes | **multipart/form-data**: { **"file"**: binary }
| + #### Responses | Code | Description | Schema | @@ -11759,7 +11765,7 @@ Returns permission flags that control workspace features like member invitations | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Success | **application/json**: [WorkspaceMutationResponse](#workspacemutationresponse)
| +| 200 | Success | **application/json**: [WorkspaceTenantResultResponse](#workspacetenantresultresponse)
| ### [POST] /workspaces/switch #### Request Body @@ -11928,23 +11934,6 @@ Default namespace | role_name | string | | No | | tenant_id | string | | No | -#### Account - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| avatar | string | | No | -| avatar_url | string | | Yes | -| created_at | integer | | No | -| email | string | | Yes | -| id | string | | Yes | -| interface_language | string | | No | -| interface_theme | string | | No | -| is_password_set | boolean | | Yes | -| last_login_at | integer | | No | -| last_login_ip | string | | No | -| name | string | | Yes | -| timezone | string | | No | - #### AccountAvatarPayload | Name | Type | Description | Required | @@ -12020,13 +12009,36 @@ Default namespace | password | string | | No | | repeat_new_password | string | | Yes | +#### AccountResponse + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| avatar | string | | No | +| avatar_url | string | | Yes | +| created_at | integer | | No | +| email | string | | Yes | +| id | string | | Yes | +| interface_language | string | | No | +| interface_theme | string | | No | +| is_password_set | boolean | | Yes | +| last_login_at | integer | | No | +| last_login_ip | string | | No | +| name | string | | Yes | +| timezone | string | | No | + #### AccountTimezonePayload | Name | Type | Description | Required | | ---- | ---- | ----------- | -------- | | timezone | string | | Yes | -#### AccountWithRole +#### AccountWithRoleListResponse + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| accounts | [ [AccountWithRoleResponse](#accountwithroleresponse) ] | | Yes | + +#### AccountWithRoleResponse | Name | Type | Description | Required | | ---- | ---- | ----------- | -------- | @@ -12041,12 +12053,6 @@ Default namespace | roles | [ object ] | | No | | status | string | | Yes | -#### AccountWithRoleList - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| accounts | [ [AccountWithRole](#accountwithrole) ] | | Yes | - #### ActivateCheckQuery | Name | Type | Description | Required | @@ -12095,7 +12101,7 @@ Default namespace | ---- | ---- | ----------- | -------- | | conversation_id | string | | No | | created_at | integer | | No | -| created_by_account | [SimpleAccount](#simpleaccount) | | No | +| created_by_account | [SimpleAccountResponse](#simpleaccountresponse) | | No | | elapsed_time | number | | No | | exceptions_count | integer | | No | | finished_at | integer | | No | @@ -13909,6 +13915,12 @@ AppMCPServer Status Enum | use_icon_as_answer_icon | boolean | | No | | workflow | [WorkflowPartial](#workflowpartial) | | No | +#### AppSelectorScope + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| AppSelectorScope | string | | | + #### AppSiteResponse | Name | Type | Description | Required | @@ -14061,6 +14073,21 @@ AppMCPServer Status Enum | query | string | | Yes | | retrieval_setting | [BedrockRetrievalSetting](#bedrockretrievalsetting) | | Yes | +#### BedrockRetrievalRecordResponse + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| content | string | | No | +| metadata | object | | No | +| score | number | | Yes | +| title | string | | No | + +#### BedrockRetrievalResponse + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| records | [ [BedrockRetrievalRecordResponse](#bedrockretrievalrecordresponse) ] | | Yes | + #### BedrockRetrievalSetting Retrieval settings for Amazon Bedrock knowledge base queries. @@ -14930,47 +14957,6 @@ Model class for provider custom model configuration. | permission | [PermissionEnum](#permissionenum) | | No | | provider | string,
**Default:** vendor | | No | -#### DatasetDetail - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| app_count | integer | | No | -| author_name | string | | No | -| built_in_field_enabled | boolean | | No | -| chunk_structure | string | | No | -| created_at | long | | No | -| created_by | string | | No | -| data_source_type | string | | No | -| description | string | | No | -| doc_form | string | | No | -| doc_metadata | [ [DatasetDocMetadata](#datasetdocmetadata) ] | | No | -| document_count | integer | | No | -| embedding_available | boolean | | No | -| embedding_model | string | | No | -| embedding_model_provider | string | | No | -| enable_api | boolean | | No | -| external_knowledge_info | [ExternalKnowledgeInfo](#externalknowledgeinfo) | | No | -| external_retrieval_model | [ExternalRetrievalModel](#externalretrievalmodel) | | No | -| icon_info | [DatasetIconInfo](#dataseticoninfo) | | No | -| id | string | | No | -| indexing_technique | string | | No | -| is_multimodal | boolean | | No | -| is_published | boolean | | No | -| name | string | | No | -| permission | string | | No | -| permission_keys | [ string ] | | No | -| pipeline_id | string | | No | -| provider | string | | No | -| retrieval_model_dict | [DatasetRetrievalModel](#datasetretrievalmodel) | | No | -| runtime_mode | string | | No | -| summary_index_setting | [_AnonymousInlineModel_b1954337d565](#_anonymousinlinemodel_b1954337d565) | | No | -| tags | [ [Tag](#tag) ] | | No | -| total_available_documents | integer | | No | -| total_documents | integer | | No | -| updated_at | long | | No | -| updated_by | string | | No | -| word_count | integer | | No | - #### DatasetDetailResponse | Name | Type | Description | Required | @@ -15056,14 +15042,6 @@ Model class for provider custom model configuration. | updated_by | string | | Yes | | word_count | integer | | Yes | -#### DatasetDocMetadata - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| id | string | | No | -| name | string | | No | -| type | string | | No | - #### DatasetDocMetadataResponse | Name | Type | Description | Required | @@ -15089,15 +15067,6 @@ Model class for provider custom model configuration. | score_threshold_enabled | boolean | | No | | top_k | integer | | Yes | -#### DatasetIconInfo - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| icon | string | | No | -| icon_background | string | | No | -| icon_type | string | | No | -| icon_url | string | | No | - #### DatasetIconInfoResponse | Name | Type | Description | Required | @@ -15107,12 +15076,6 @@ Model class for provider custom model configuration. | icon_type | string | | No | | icon_url | string | | No | -#### DatasetKeywordSetting - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| keyword_weight | number | | No | - #### DatasetKeywordSettingResponse | Name | Type | Description | Required | @@ -15250,13 +15213,6 @@ Model class for provider custom model configuration. | page | integer | | Yes | | total | integer | | Yes | -#### DatasetRerankingModel - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| reranking_model_name | string | | No | -| reranking_provider_name | string | | No | - #### DatasetRerankingModelResponse | Name | Type | Description | Required | @@ -15277,19 +15233,6 @@ Model class for provider custom model configuration. | name | string | | Yes | | permission | string | | No | -#### DatasetRetrievalModel - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| reranking_enable | boolean | | No | -| reranking_mode | string | | No | -| reranking_model | [DatasetRerankingModel](#datasetrerankingmodel) | | No | -| score_threshold | number | | No | -| score_threshold_enabled | boolean | | No | -| search_method | string | | No | -| top_k | integer | | No | -| weights | [DatasetWeightedScore](#datasetweightedscore) | | No | - #### DatasetRetrievalModelResponse | Name | Type | Description | Required | @@ -15339,14 +15282,6 @@ Model class for provider custom model configuration. | retrieval_model | object | | No | | summary_index_setting | object | | No | -#### DatasetVectorSetting - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| embedding_model_name | string | | No | -| embedding_provider_name | string | | No | -| vector_weight | number | | No | - #### DatasetVectorSettingResponse | Name | Type | Description | Required | @@ -15355,14 +15290,6 @@ Model class for provider custom model configuration. | embedding_provider_name | string | | No | | vector_weight | number | | No | -#### DatasetWeightedScore - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| keyword_setting | [DatasetKeywordSetting](#datasetkeywordsetting) | | No | -| vector_setting | [DatasetVectorSetting](#datasetvectorsetting) | | No | -| weight_type | string | | No | - #### DatasetWeightedScoreResponse | Name | Type | Description | Required | @@ -15411,6 +15338,25 @@ Model class for provider custom model configuration. | ---- | ---- | ----------- | -------- | | id | string | | Yes | +#### DatasourceEntity + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| description | [I18nObject](#i18nobject) | The label of the datasource | Yes | +| identity | [DatasourceIdentity](#datasourceidentity) | | Yes | +| output_schema | object | | No | +| parameters | [ [DatasourceParameter](#datasourceparameter) ] | | No | + +#### DatasourceIdentity + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| author | string | The author of the datasource | Yes | +| icon | string | | No | +| label | [I18nObject](#i18nobject) | The label of the datasource | Yes | +| name | string | The name of the datasource | Yes | +| provider | string | The provider of the datasource | Yes | + #### DatasourceNodeRunPayload | Name | Type | Description | Required | @@ -15434,6 +15380,70 @@ Model class for provider custom model configuration. | error | string | Error message from OAuth provider | No | | state | string | OAuth state parameter | No | +#### DatasourceParameter + +Overrides type + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| auto_generate | [PluginParameterAutoGenerate](#pluginparameterautogenerate) | | No | +| default | number
integer
string
boolean
[ object ]
object | | No | +| description | [I18nObject](#i18nobject) | The description of the parameter | Yes | +| label | [I18nObject](#i18nobject) | The label presented to the user | Yes | +| max | number
integer | | No | +| min | number
integer | | No | +| name | string | The name of the parameter | Yes | +| options | [ [PluginParameterOption](#pluginparameteroption) ] | | No | +| placeholder | [I18nObject](#i18nobject) | The placeholder presented to the user | No | +| precision | integer | | No | +| required | boolean | | No | +| scope | string | | No | +| template | [PluginParameterTemplate](#pluginparametertemplate) | | No | +| type | [DatasourceParameterType](#datasourceparametertype) | The type of the parameter | Yes | + +#### DatasourceParameterType + +removes TOOLS_SELECTOR from PluginParameterType + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| DatasourceParameterType | string | removes TOOLS_SELECTOR from PluginParameterType | | + +#### DatasourcePluginListResponse + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| DatasourcePluginListResponse | array | | | + +#### DatasourceProviderEntityWithPlugin + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| credentials_schema | [ [ProviderConfig](#providerconfig) ] | | No | +| datasources | [ [DatasourceEntity](#datasourceentity) ] | | No | +| identity | [DatasourceProviderIdentity](#datasourceprovideridentity) | | Yes | +| oauth_schema | [OAuthSchema](#oauthschema) | | No | +| provider_type | [DatasourceProviderType](#datasourceprovidertype) | | Yes | + +#### DatasourceProviderIdentity + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| author | string | The author of the tool | Yes | +| description | [I18nObject](#i18nobject) | The description of the tool | Yes | +| icon | string | The icon of the tool | Yes | +| label | [I18nObject](#i18nobject) | The label of the tool | Yes | +| name | string | The name of the tool | Yes | +| tags | [ [ToolLabelEnum](#toollabelenum) ] | The tags of the tool | No | + +#### DatasourceProviderType + +Enum class for datasource provider + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| DatasourceProviderType | string | Enum class for datasource provider | | + #### DatasourceUpdateNamePayload | Name | Type | Description | Required | @@ -15548,18 +15558,6 @@ Per-output retry configuration that mirrors ``graphon.RetryConfig`` shape. | ---- | ---- | ----------- | -------- | | q | string | | No | -#### DefaultBlockConfigResponse - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| DefaultBlockConfigResponse | object | | | - -#### DefaultBlockConfigsResponse - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| DefaultBlockConfigsResponse | array | | | - #### DefaultModelDataResponse | Name | Type | Description | Required | @@ -15768,12 +15766,6 @@ Request payload for bulk downloading documents as a zip archive. | ---- | ---- | ----------- | -------- | | node_id | string | | Yes | -#### DraftWorkflowTriggerRunRequest - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| node_id | string | Node ID | Yes | - #### EducationActivatePayload | Name | Type | Description | Required | @@ -15883,12 +15875,6 @@ Request payload for bulk downloading documents as a zip archive. | email | string | | Yes | | token | string | | Yes | -#### EmptyObjectResponse - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| EmptyObjectResponse | object | | | - #### EndpointCreatePayload | Name | Type | Description | Required | @@ -16075,6 +16061,35 @@ Request payload for bulk downloading documents as a zip archive. | metadata_filtering_conditions | object | | No | | query | string | | Yes | +#### ExternalHitTestingQueryResponse + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| content | string | | Yes | + +#### ExternalHitTestingRecordResponse + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| content | string | | No | +| metadata | object | | No | +| score | number | | No | +| title | string | | No | + +#### ExternalHitTestingResponse + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| query | [ExternalHitTestingQueryResponse](#externalhittestingqueryresponse) | | Yes | +| records | [ [ExternalHitTestingRecordResponse](#externalhittestingrecordresponse) ] | | Yes | + +#### ExternalKnowledgeApiBindingResponse + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| id | string | | Yes | +| name | string | | Yes | + #### ExternalKnowledgeApiListResponse | Name | Type | Description | Required | @@ -16098,43 +16113,13 @@ Request payload for bulk downloading documents as a zip archive. | ---- | ---- | ----------- | -------- | | created_at | string | | Yes | | created_by | string | | Yes | -| dataset_bindings | [ [ExternalKnowledgeDatasetBindingResponse](#externalknowledgedatasetbindingresponse) ] | | No | +| dataset_bindings | [ [ExternalKnowledgeApiBindingResponse](#externalknowledgeapibindingresponse) ] | | Yes | | description | string | | Yes | | id | string | | Yes | | name | string | | Yes | -| settings | object | | No | +| settings | object | | Yes | | tenant_id | string | | Yes | -#### ExternalKnowledgeDatasetBindingResponse - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| id | string | | Yes | -| name | string | | Yes | - -#### ExternalKnowledgeInfo - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| external_knowledge_api_endpoint | string | | No | -| external_knowledge_api_id | string | | No | -| external_knowledge_api_name | string | | No | -| external_knowledge_id | string | | No | - -#### ExternalRetrievalModel - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| score_threshold | number | | No | -| score_threshold_enabled | boolean | | No | -| top_k | integer | | No | - -#### ExternalRetrievalTestResponse - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| ExternalRetrievalTestResponse | object
[ object ] | | | - #### FeatureModel | Name | Type | Description | Required | @@ -16488,6 +16473,11 @@ Enum class for form type. | delivery_method_id | string | Delivery method ID | Yes | | inputs | object | Values used to fill missing upstream variables referenced in form_content | No | +#### HumanInputDeliveryTestResponse + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | + #### HumanInputFormDefinition | Name | Type | Description | Required | @@ -16513,12 +16503,13 @@ Enum class for form type. | Name | Type | Description | Required | | ---- | ---- | ----------- | -------- | -| actions | [ object ] | | No | -| display_in_ui | boolean | | No | -| expiration_time | integer | | No | +| TYPE | string,
**Default:** human_input_required | | No | +| actions | [ [HumanInputUserActionResponse](#humaninputuseractionresponse) ] | | No | +| display_in_ui | boolean | Always false for draft preview responses. | No | +| expiration_time | integer | Always null for draft preview responses. | No | | form_content | string | | Yes | | form_id | string | | Yes | -| form_token | string | | No | +| form_token | string | Always null for draft preview responses. | No | | inputs | [ object ] | | No | | node_id | string | | Yes | | node_title | string | | Yes | @@ -16543,12 +16534,6 @@ Enum class for form type. | form_inputs | object | Values the user provides for the form's own fields | Yes | | inputs | object | Values used to fill missing upstream variables referenced in form_content | Yes | -#### HumanInputFormSubmitResponse - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| HumanInputFormSubmitResponse | object | | | - #### HumanInputPauseTypeResponse | Name | Type | Description | Required | @@ -16557,6 +16542,14 @@ Enum class for form type. | form_id | string | | Yes | | type | string | | Yes | +#### HumanInputUserActionResponse + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| button_style | string,
**Default:** default | | No | +| id | string | | Yes | +| title | string | | Yes | + #### I18nObject Model class for i18n object. @@ -16782,7 +16775,7 @@ Input field definition for snippet parameters. | Name | Type | Description | Required | | ---- | ---- | ----------- | -------- | -| JSONValue | string
integer
number
boolean
object
[ object ] | | | +| JSONValue | | | | #### JSONValueType @@ -17181,10 +17174,30 @@ Metadata operation data | Name | Type | Description | Required | | ---- | ---- | ----------- | -------- | -| completion_params | object | | No | -| mode | [LLMMode](#llmmode) | | Yes | -| name | string | | Yes | -| provider | string | | Yes | +| agent_mode | [JSONValue](#jsonvalue) | | No | +| annotation_reply | [JSONValue](#jsonvalue) | | No | +| chat_prompt_config | [JSONValue](#jsonvalue) | | No | +| completion_prompt_config | [JSONValue](#jsonvalue) | | No | +| created_at | integer | | No | +| created_by | string | | No | +| dataset_configs | [JSONValue](#jsonvalue) | | No | +| dataset_query_variable | string | | No | +| external_data_tools | [JSONValue](#jsonvalue) | | No | +| file_upload | [JSONValue](#jsonvalue) | | No | +| model | [JSONValue](#jsonvalue) | | No | +| more_like_this | [JSONValue](#jsonvalue) | | No | +| opening_statement | string | | No | +| pre_prompt | string | | No | +| prompt_type | string | | No | +| retriever_resource | [JSONValue](#jsonvalue) | | No | +| sensitive_word_avoidance | [JSONValue](#jsonvalue) | | No | +| speech_to_text | [JSONValue](#jsonvalue) | | No | +| suggested_questions | [JSONValue](#jsonvalue) | | No | +| suggested_questions_after_answer | [JSONValue](#jsonvalue) | | No | +| text_to_speech | [JSONValue](#jsonvalue) | | No | +| updated_at | integer | | No | +| updated_by | string | | No | +| user_input_form | [JSONValue](#jsonvalue) | | No | #### ModelConfigPartial @@ -17281,6 +17294,12 @@ Enum class for model property key. | ---- | ---- | ----------- | -------- | | payment_link | string | | Yes | +#### ModelSelectorScope + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| ModelSelectorScope | string | | | + #### ModelStatus Enum class for model status. @@ -17571,6 +17590,15 @@ Coarse node-level status used by Inspector to pick a banner. | refresh_token | string | | Yes | | token_type | string | | Yes | +#### OAuthSchema + +OAuth schema + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| client_schema | [ [ProviderConfig](#providerconfig) ] | client schema like client_id, client_secret, etc. | No | +| credentials_schema | [ [ProviderConfig](#providerconfig) ] | credentials schema like access_token, refresh_token, etc. | No | + #### OAuthTokenRequest | Name | Type | Description | Required | @@ -17588,6 +17616,13 @@ Coarse node-level status used by Inspector to pick a banner. | ---- | ---- | ----------- | -------- | | OpaqueObjectResponse | object | | | +#### Option + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| label | [I18nObject](#i18nobject) | The label of the option | Yes | +| value | string | The value of the option | Yes | + #### OutputErrorStrategy Per-output failure handling strategy. @@ -18239,6 +18274,16 @@ Shared permission levels for resources (datasets, credentials, etc.) | ---- | ---- | ----------- | -------- | | PluginDaemonOperationResponse | | | | +#### PluginDatasourceProviderEntity + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| declaration | [DatasourceProviderEntityWithPlugin](#datasourceproviderentitywithplugin) | | Yes | +| is_authorized | boolean | | No | +| plugin_id | string | | Yes | +| plugin_unique_identifier | string | | Yes | +| provider | string | | Yes | + #### PluginDebuggingKeyResponse | Name | Type | Description | Required | @@ -18350,6 +18395,26 @@ Shared permission levels for resources (datasets, credentials, etc.) | message | string | | No | | success | boolean | | Yes | +#### PluginParameterAutoGenerate + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| type | [core__plugin__entities__parameters__PluginParameterAutoGenerate__Type](#core__plugin__entities__parameters__pluginparameterautogenerate__type) | | Yes | + +#### PluginParameterOption + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| icon | string | The icon of the option, can be a url or a base64 encoded image | No | +| label | [I18nObject](#i18nobject) | The label of the option | Yes | +| value | string | The value of the option | Yes | + +#### PluginParameterTemplate + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| enabled | boolean | Whether the parameter is jinja enabled | No | + #### PluginPermissionResponse | Name | Type | Description | Required | @@ -18429,6 +18494,24 @@ Dataset Process Rule Mode | ---- | ---- | ----------- | -------- | | ProcessRuleMode | string | Dataset Process Rule Mode | | +#### ProviderConfig + +Model class for common provider settings like credentials + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| default | integer
string
number
boolean | | No | +| help | [I18nObject](#i18nobject) | | No | +| label | [I18nObject](#i18nobject) | | No | +| multiple | boolean | | No | +| name | string | The name of the credentials | Yes | +| options | [ [Option](#option) ] | | No | +| placeholder | [I18nObject](#i18nobject) | | No | +| required | boolean | | No | +| scope | [AppSelectorScope](#appselectorscope)
[ModelSelectorScope](#modelselectorscope)
[ToolSelectorScope](#toolselectorscope) | | No | +| type | [core__entities__provider_entities__BasicProviderConfig__Type](#core__entities__provider_entities__basicproviderconfig__type) | The type of the credentials | Yes | +| url | string | | No | + #### ProviderCredentialResponse | Name | Type | Description | Required | @@ -18559,11 +18642,17 @@ Model class for provider with models response. #### PublishWorkflowPayload -Payload for publishing snippet workflow. +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| marked_comment | string | | No | +| marked_name | string | | No | + +#### PublishWorkflowResponse | Name | Type | Description | Required | | ---- | ---- | ----------- | -------- | -| knowledge_base_setting | object | | No | +| created_at | integer | | Yes | +| result | string | | Yes | #### PublishedWorkflowRunPayload @@ -18672,19 +18761,28 @@ Model class for provider quota configuration. | pipeline_id | string | | No | | status | [ImportStatus](#importstatus) | | Yes | -#### RagPipelineOpaqueResponse - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| RagPipelineOpaqueResponse | | | | - #### RagPipelineRecommendedPluginQuery | Name | Type | Description | Required | | ---- | ---- | ----------- | -------- | | type | string,
**Default:** all | | No | -#### RagPipelineStepParametersResponse +#### RagPipelineRecommendedPluginResponse + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| installed_recommended_plugins | [ object ] | Installed tool provider payloads. Shape follows the tool provider serializer. | Yes | +| uninstalled_recommended_plugins | [ object ] | Marketplace plugin manifest payloads returned by the marketplace service. | Yes | + +#### RagPipelineTransformResponse + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| dataset_id | string | | Yes | +| pipeline_id | string | | Yes | +| status | string | | Yes | + +#### RagPipelineVariablesResponse | Name | Type | Description | Required | | ---- | ---- | ----------- | -------- | @@ -19151,6 +19249,14 @@ Model class for provider quota configuration. | id | string | | Yes | | name | string | | Yes | +#### SimpleAccountResponse + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| email | string | | Yes | +| id | string | | Yes | +| name | string | | Yes | + #### SimpleConversation | Name | Type | Description | Required | @@ -19288,32 +19394,6 @@ Validated metadata extracted from a Skill package. | inferable | boolean | | Yes | | reason | string | | No | -#### Snippet - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| created_at | long | | No | -| created_by | [_AnonymousInlineModel_b0fd3f86d9d5](#_anonymousinlinemodel_b0fd3f86d9d5) | | No | -| description | string | | No | -| graph | object | | No | -| icon_info | object | | No | -| id | string | | No | -| input_fields | object | | No | -| is_published | boolean | | No | -| name | string | | No | -| tags | [ [_AnonymousInlineModel_7b8b49ca164e](#_anonymousinlinemodel_7b8b49ca164e) ] | | No | -| type | string | | No | -| updated_at | long | | No | -| updated_by | [_AnonymousInlineModel_b0fd3f86d9d5](#_anonymousinlinemodel_b0fd3f86d9d5) | | No | -| use_count | integer | | No | -| version | integer | | No | - -#### SnippetDependencyCheckResponse - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| SnippetDependencyCheckResponse | object | | | - #### SnippetDraftConfigResponse | Name | Type | Description | Required | @@ -19350,6 +19430,17 @@ Payload for syncing snippet draft workflow. | hash | string | | No | | input_fields | [ object ] | | No | +#### SnippetImportInfo + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| current_dsl_version | string,
**Default:** 0.1.0 | | No | +| error | string | | No | +| id | string | | Yes | +| imported_dsl_version | string | | No | +| snippet_id | string | | No | +| status | [ImportStatus](#importstatus) | | Yes | + #### SnippetImportPayload Payload for importing snippet from DSL. @@ -19363,12 +19454,6 @@ Payload for importing snippet from DSL. | yaml_content | string | YAML content (required for yaml-content mode) | No | | yaml_url | string | YAML URL (required for yaml-url mode) | No | -#### SnippetImportResponse - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| SnippetImportResponse | object | | | - #### SnippetIterationNodeRunPayload Payload for running an iteration node in snippet draft workflow. @@ -19377,24 +19462,24 @@ Payload for running an iteration node in snippet draft workflow. | ---- | ---- | ----------- | -------- | | inputs | object | | No | -#### SnippetList +#### SnippetListItemResponse | Name | Type | Description | Required | | ---- | ---- | ----------- | -------- | | author_name | string | | No | -| created_at | long | | No | +| created_at | integer | | No | | created_by | string | | No | | description | string | | No | | icon_info | object | | No | -| id | string | | No | -| is_published | boolean | | No | -| name | string | | No | -| tags | [ [_AnonymousInlineModel_7b8b49ca164e](#_anonymousinlinemodel_7b8b49ca164e) ] | | No | -| type | string | | No | -| updated_at | long | | No | +| id | string | | Yes | +| is_published | boolean | | Yes | +| name | string | | Yes | +| tags | [ [SnippetTagResponse](#snippettagresponse) ] | | No | +| type | string | | Yes | +| updated_at | integer | | No | | updated_by | string | | No | -| use_count | integer | | No | -| version | integer | | No | +| use_count | integer | | Yes | +| version | integer | | Yes | #### SnippetListQuery @@ -19417,17 +19502,45 @@ Payload for running a loop node in snippet draft workflow. | ---- | ---- | ----------- | -------- | | inputs | object | | No | -#### SnippetPagination +#### SnippetPaginationResponse | Name | Type | Description | Required | | ---- | ---- | ----------- | -------- | -| data | [ [_AnonymousInlineModel_744ff9cc03e6](#_anonymousinlinemodel_744ff9cc03e6) ] | | No | -| has_more | boolean | | No | -| limit | integer | | No | -| page | integer | | No | -| total | integer | | No | +| data | [ [SnippetListItemResponse](#snippetlistitemresponse) ] | | Yes | +| has_more | boolean | | Yes | +| limit | integer | | Yes | +| page | integer | | Yes | +| total | integer | | Yes | -#### SnippetUseCountResponse +#### SnippetResponse + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| created_at | integer | | No | +| created_by | [SimpleAccountResponse](#simpleaccountresponse) | | No | +| description | string | | No | +| graph | object | | No | +| icon_info | object | | No | +| id | string | | Yes | +| input_fields | [ object ] | | No | +| is_published | boolean | | Yes | +| name | string | | Yes | +| tags | [ [SnippetTagResponse](#snippettagresponse) ] | | No | +| type | string | | Yes | +| updated_at | integer | | No | +| updated_by | [SimpleAccountResponse](#simpleaccountresponse) | | No | +| use_count | integer | | Yes | +| version | integer | | Yes | + +#### SnippetTagResponse + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| id | string | | Yes | +| name | string | | Yes | +| type | string | | Yes | + +#### SnippetUseCountIncrementResponse | Name | Type | Description | Required | | ---- | ---- | ----------- | -------- | @@ -19458,7 +19571,7 @@ Query parameters for listing snippet published workflows. | ---- | ---- | ----------- | -------- | | conversation_variables | [ [WorkflowConversationVariableResponse](#workflowconversationvariableresponse) ] | | Yes | | created_at | integer | | Yes | -| created_by | [SimpleAccount](#simpleaccount) | | No | +| created_by | [SimpleAccountResponse](#simpleaccountresponse) | | No | | environment_variables | [ [WorkflowEnvironmentVariableResponse](#workflowenvironmentvariableresponse) ] | | Yes | | features | object | | Yes | | graph | object | | Yes | @@ -19470,7 +19583,7 @@ Query parameters for listing snippet published workflows. | rag_pipeline_variables | [ [PipelineVariableResponse](#pipelinevariableresponse) ] | | Yes | | tool_published | boolean | | Yes | | updated_at | integer | | Yes | -| updated_by | [SimpleAccount](#simpleaccount) | | No | +| updated_by | [SimpleAccountResponse](#simpleaccountresponse) | | No | | version | string | | Yes | #### StarredAppListQuery @@ -19579,9 +19692,9 @@ Default configuration for form inputs. | Name | Type | Description | Required | | ---- | ---- | ----------- | -------- | -| hash | string | | No | -| result | string | | No | -| updated_at | string | | No | +| hash | string | | Yes | +| result | string | | Yes | +| updated_at | integer | | Yes | #### SystemConfigurationResponse @@ -19722,6 +19835,7 @@ Tag type | created_at | integer | | No | | current | boolean | | Yes | | id | string | | Yes | +| last_opened_at | integer | | No | | name | string | | No | | plan | string | | No | | status | string | | No | @@ -19796,6 +19910,12 @@ Tag type | ---- | ---- | ----------- | -------- | | data | [ [TokensPerSecondStatisticItem](#tokenspersecondstatisticitem) ] | | Yes | +#### ToolLabelEnum + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| ToolLabelEnum | string | | | + #### ToolOAuthClientSchemaResponse | Name | Type | Description | Required | @@ -19841,6 +19961,12 @@ Enum class for tool provider | ---- | ---- | ----------- | -------- | | ToolProviderType | string | Enum class for tool provider | | +#### ToolSelectorScope + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| ToolSelectorScope | string | | | + #### TraceAppConfigResponse | Name | Type | Description | Required | @@ -19869,97 +19995,47 @@ Enum class for tool provider | ---- | ---- | ----------- | -------- | | tracing_provider | string | Tracing provider name | Yes | -#### TrialAppDetailWithSite +#### TrialDatasetListItemResponse | Name | Type | Description | Required | | ---- | ---- | ----------- | -------- | -| access_mode | string | | No | -| api_base_url | string | | No | -| created_at | long | | No | -| created_by | string | | No | -| deleted_tools | [ [TrialDeletedTool](#trialdeletedtool) ] | | No | -| description | string | | No | -| enable_api | boolean | | No | -| enable_site | boolean | | No | -| icon | string | | No | -| icon_background | string | | No | -| icon_type | string | | No | -| icon_url | string | | No | -| id | string | | No | -| max_active_requests | integer | | No | -| mode | string | | No | -| model_config | [TrialAppModelConfig](#trialappmodelconfig) | | No | -| name | string | | No | +| app_count | integer | | Yes | +| author_name | string | | Yes | +| built_in_field_enabled | boolean | | Yes | +| chunk_structure | string | | Yes | +| created_at | integer | | Yes | +| created_by | string | | Yes | +| data_source_type | string | | Yes | +| description | string | | Yes | +| doc_form | string | | Yes | +| doc_metadata | [ [DatasetDocMetadataResponse](#datasetdocmetadataresponse) ] | | Yes | +| document_count | integer | | Yes | +| embedding_available | boolean | | No | +| embedding_model | string | | Yes | +| embedding_model_provider | string | | Yes | +| enable_api | boolean | | Yes | +| external_knowledge_info | [DatasetExternalKnowledgeInfoResponse](#datasetexternalknowledgeinforesponse) | | No | +| external_retrieval_model | [DatasetExternalRetrievalModelResponse](#datasetexternalretrievalmodelresponse) | | Yes | +| icon_info | [DatasetIconInfoResponse](#dataseticoninforesponse) | | No | +| id | string | | Yes | +| indexing_technique | string | | Yes | +| is_multimodal | boolean | | Yes | +| is_published | boolean | | Yes | +| maintainer | string | | No | +| name | string | | Yes | +| permission | string | | Yes | | permission_keys | [ string ] | | No | -| site | [TrialSite](#trialsite) | | No | -| tags | [ [TrialTag](#trialtag) ] | | No | -| updated_at | long | | No | -| updated_by | string | | No | -| use_icon_as_answer_icon | boolean | | No | -| workflow | [TrialWorkflowPartial](#trialworkflowpartial) | | No | - -#### TrialAppModelConfig - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| agent_mode | object | | No | -| annotation_reply | object | | No | -| chat_prompt_config | object | | No | -| completion_prompt_config | object | | No | -| created_at | long | | No | -| created_by | string | | No | -| dataset_configs | object | | No | -| dataset_query_variable | string | | No | -| external_data_tools | [ object ] | | No | -| file_upload | object | | No | -| model | object | | No | -| more_like_this | object | | No | -| opening_statement | string | | No | -| pre_prompt | string | | No | -| prompt_type | string | | No | -| retriever_resource | object | | No | -| sensitive_word_avoidance | object | | No | -| speech_to_text | object | | No | -| suggested_questions | [ string ] | | No | -| suggested_questions_after_answer | object | | No | -| text_to_speech | object | | No | -| updated_at | long | | No | -| updated_by | string | | No | -| user_input_form | [ object ] | | No | - -#### TrialConversationVariable - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| description | string | | No | -| id | string | | No | -| name | string | | No | -| value | string
integer
number
boolean
object
[ object ] | | No | -| value_type | string | | No | - -#### TrialDataset - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| created_at | long | | No | -| created_by | string | | No | -| data_source_type | string | | No | -| description | string | | No | -| id | string | | No | -| indexing_technique | string | | No | -| name | string | | No | -| permission | string | | No | -| permission_keys | [ string ] | | No | - -#### TrialDatasetList - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| data | [ [TrialDataset](#trialdataset) ] | | No | -| has_more | boolean | | No | -| limit | integer | | No | -| page | integer | | No | -| total | integer | | No | +| pipeline_id | string | | Yes | +| provider | string | | Yes | +| retrieval_model_dict | [DatasetRetrievalModelResponse](#datasetretrievalmodelresponse) | | Yes | +| runtime_mode | string | | Yes | +| summary_index_setting | [DatasetSummaryIndexSettingResponse](#datasetsummaryindexsettingresponse) | | No | +| tags | [ [DatasetTagResponse](#datasettagresponse) ] | | Yes | +| total_available_documents | integer | | Yes | +| total_documents | integer | | Yes | +| updated_at | integer | | Yes | +| updated_by | string | | Yes | +| word_count | integer | | Yes | #### TrialDatasetListQuery @@ -19969,13 +20045,15 @@ Enum class for tool provider | limit | integer,
**Default:** 20 | Number of items per page | No | | page | integer,
**Default:** 1 | Page number | No | -#### TrialDeletedTool +#### TrialDatasetListResponse | Name | Type | Description | Required | | ---- | ---- | ----------- | -------- | -| provider_id | string | | No | -| tool_name | string | | No | -| type | string | | No | +| data | [ [TrialDatasetListItemResponse](#trialdatasetlistitemresponse) ] | | Yes | +| has_more | boolean | | Yes | +| limit | integer | | Yes | +| page | integer | | Yes | +| total | integer | | Yes | #### TrialModelsResponse @@ -19983,99 +20061,19 @@ Enum class for tool provider | ---- | ---- | ----------- | -------- | | trial_models | [ string ] | | Yes | -#### TrialPipelineVariable +#### TriggerDebugErrorResponse | Name | Type | Description | Required | | ---- | ---- | ----------- | -------- | -| allow_file_extension | [ string ] | | No | -| allow_file_upload_methods | [ string ] | | No | -| allowed_file_types | [ string ] | | No | -| belong_to_node_id | string | | No | -| default_value | string
integer
number
boolean
object
[ object ] | | No | -| label | string | | No | -| max_length | integer | | No | -| options | [ string ] | | No | -| placeholder | string | | No | -| required | boolean | | No | -| tooltips | string | | No | -| type | string | | No | -| unit | string | | No | -| variable | string | | No | +| error | string | | No | +| status | string | | Yes | -#### TrialSimpleAccount +#### TriggerDebugWaitingResponse | Name | Type | Description | Required | | ---- | ---- | ----------- | -------- | -| email | string | | No | -| id | string | | No | -| name | string | | No | - -#### TrialSite - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| access_token | string | | No | -| app_base_url | string | | No | -| chat_color_theme | string | | No | -| chat_color_theme_inverted | boolean | | No | -| code | string | | No | -| copyright | string | | No | -| created_at | long | | No | -| created_by | string | | No | -| custom_disclaimer | string | | No | -| customize_domain | string | | No | -| customize_token_strategy | string | | No | -| default_language | string | | No | -| description | string | | No | -| icon | string | | No | -| icon_background | string | | No | -| icon_type | string | | No | -| icon_url | string | | No | -| privacy_policy | string | | No | -| prompt_public | boolean | | No | -| show_workflow_steps | boolean | | No | -| title | string | | No | -| updated_at | long | | No | -| updated_by | string | | No | -| use_icon_as_answer_icon | boolean | | No | - -#### TrialTag - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| id | string | | No | -| name | string | | No | -| type | string | | No | - -#### TrialWorkflow - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| conversation_variables | [ [TrialConversationVariable](#trialconversationvariable) ] | | No | -| created_at | long | | No | -| created_by | [TrialSimpleAccount](#trialsimpleaccount) | | No | -| environment_variables | [ object ] | | No | -| features | object | | No | -| graph | object | | No | -| hash | string | | No | -| id | string | | No | -| marked_comment | string | | No | -| marked_name | string | | No | -| rag_pipeline_variables | [ [TrialPipelineVariable](#trialpipelinevariable) ] | | No | -| tool_published | boolean | | No | -| updated_at | long | | No | -| updated_by | [TrialSimpleAccount](#trialsimpleaccount) | | No | -| version | string | | No | - -#### TrialWorkflowPartial - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| created_at | long | | No | -| created_by | string | | No | -| id | string | | No | -| updated_at | long | | No | -| updated_by | string | | No | +| retry_in | integer | | Yes | +| status | string | | Yes | #### TriggerOAuthAuthorizeResponse @@ -20390,7 +20388,7 @@ How a workflow node is bound to an Agent. | Name | Type | Description | Required | | ---- | ---- | ----------- | -------- | | created_at | integer | | No | -| created_by_account | [SimpleAccount](#simpleaccount) | | No | +| created_by_account | [SimpleAccountResponse](#simpleaccountresponse) | | No | | created_by_end_user | [SimpleEndUser](#simpleenduser) | | No | | created_by_role | string | | No | | created_from | string | | No | @@ -20427,7 +20425,7 @@ How a workflow node is bound to an Agent. | Name | Type | Description | Required | | ---- | ---- | ----------- | -------- | | created_at | integer | | No | -| created_by_account | [SimpleAccount](#simpleaccount) | | No | +| created_by_account | [SimpleAccountResponse](#simpleaccountresponse) | | No | | created_by_end_user | [SimpleEndUser](#simpleenduser) | | No | | id | string | | Yes | | trigger_metadata | | | No | @@ -20528,7 +20526,7 @@ How a workflow node is bound to an Agent. | Name | Type | Description | Required | | ---- | ---- | ----------- | -------- | -| users | [ [AccountWithRole](#accountwithrole) ] | | Yes | +| users | [ [AccountWithRoleResponse](#accountwithroleresponse) ] | | Yes | #### WorkflowCommentReply @@ -20864,20 +20862,13 @@ can reuse its existing handler. | variable | string | | No | | variable_selector | [ string
integer
number
boolean ] | | No | -#### WorkflowPublishResponse - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| created_at | integer | | Yes | -| result | string | | Yes | - #### WorkflowResponse | Name | Type | Description | Required | | ---- | ---- | ----------- | -------- | | conversation_variables | [ [WorkflowConversationVariableResponse](#workflowconversationvariableresponse) ] | | Yes | | created_at | integer | | Yes | -| created_by | [SimpleAccount](#simpleaccount) | | No | +| created_by | [SimpleAccountResponse](#simpleaccountresponse) | | No | | environment_variables | [ [WorkflowEnvironmentVariableResponse](#workflowenvironmentvariableresponse) ] | | Yes | | features | object | | Yes | | graph | object | | Yes | @@ -20888,17 +20879,9 @@ can reuse its existing handler. | rag_pipeline_variables | [ [PipelineVariableResponse](#pipelinevariableresponse) ] | | Yes | | tool_published | boolean | | Yes | | updated_at | integer | | Yes | -| updated_by | [SimpleAccount](#simpleaccount) | | No | +| updated_by | [SimpleAccountResponse](#simpleaccountresponse) | | No | | version | string | | Yes | -#### WorkflowRestoreResponse - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| hash | string | | Yes | -| result | string | | Yes | -| updated_at | integer | | Yes | - #### WorkflowRunCountQuery | Name | Type | Description | Required | @@ -20923,7 +20906,7 @@ can reuse its existing handler. | Name | Type | Description | Required | | ---- | ---- | ----------- | -------- | | created_at | integer | | No | -| created_by_account | [SimpleAccount](#simpleaccount) | | No | +| created_by_account | [SimpleAccountResponse](#simpleaccountresponse) | | No | | created_by_end_user | [SimpleEndUser](#simpleenduser) | | No | | created_by_role | string | | No | | elapsed_time | number | | No | @@ -20962,7 +20945,7 @@ can reuse its existing handler. | Name | Type | Description | Required | | ---- | ---- | ----------- | -------- | | created_at | integer | | No | -| created_by_account | [SimpleAccount](#simpleaccount) | | No | +| created_by_account | [SimpleAccountResponse](#simpleaccountresponse) | | No | | elapsed_time | number | | No | | exceptions_count | integer | | No | | finished_at | integer | | No | @@ -21009,7 +20992,7 @@ can reuse its existing handler. | Name | Type | Description | Required | | ---- | ---- | ----------- | -------- | | created_at | integer | | No | -| created_by_account | [SimpleAccount](#simpleaccount) | | No | +| created_by_account | [SimpleAccountResponse](#simpleaccountresponse) | | No | | created_by_end_user | [SimpleEndUser](#simpleenduser) | | No | | created_by_role | string | | No | | elapsed_time | number | | No | @@ -21202,7 +21185,13 @@ Workflow tool configuration | limit | integer,
**Default:** 20 | | No | | page | integer,
**Default:** 1 | | No | -#### WorkspaceListResponse +#### WorkspaceLogoUploadResponse + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| id | string | | Yes | + +#### WorkspacePaginationResponse | Name | Type | Description | Required | | ---- | ---- | ----------- | -------- | @@ -21212,19 +21201,6 @@ Workflow tool configuration | page | integer | | Yes | | total | integer | | Yes | -#### WorkspaceLogoUploadResponse - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| id | string | | Yes | - -#### WorkspaceMutationResponse - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| result | string | | Yes | -| tenant | [TenantInfoResponse](#tenantinforesponse) | | Yes | - #### WorkspacePermissionResponse | Name | Type | Description | Required | @@ -21239,6 +21215,13 @@ Workflow tool configuration | ---- | ---- | ----------- | -------- | | permission_keys | [ string ] | | No | +#### WorkspaceTenantResultResponse + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| result | string | | Yes | +| tenant | [TenantInfoResponse](#tenantinforesponse) | | Yes | + #### _AccessPolicyList | Name | Type | Description | Required | @@ -21246,50 +21229,6 @@ Workflow tool configuration | data | [ [AccessPolicy](#accesspolicy) ] | | No | | pagination | [Pagination](#pagination) | | No | -#### _AnonymousInlineModel_744ff9cc03e6 - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| author_name | string | | No | -| created_at | long | | No | -| created_by | string | | No | -| description | string | | No | -| icon_info | object | | No | -| id | string | | No | -| is_published | boolean | | No | -| name | string | | No | -| tags | [ [_AnonymousInlineModel_7b8b49ca164e](#_anonymousinlinemodel_7b8b49ca164e) ] | | No | -| type | string | | No | -| updated_at | long | | No | -| updated_by | string | | No | -| use_count | integer | | No | -| version | integer | | No | - -#### _AnonymousInlineModel_7b8b49ca164e - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| id | string | | No | -| name | string | | No | -| type | string | | No | - -#### _AnonymousInlineModel_b0fd3f86d9d5 - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| email | string | | No | -| id | string | | No | -| name | string | | No | - -#### _AnonymousInlineModel_b1954337d565 - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| enable | boolean | | No | -| model_name | string | | No | -| model_provider_name | string | | No | -| summary_prompt | string | | No | - #### _MembersInRoleList | Name | Type | Description | Required | @@ -21311,6 +21250,18 @@ Workflow tool configuration | data | [ [RBACRole](#rbacrole) ] | | No | | pagination | [Pagination](#pagination) | | No | +#### core__entities__provider_entities__BasicProviderConfig__Type + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| core__entities__provider_entities__BasicProviderConfig__Type | string | | | + +#### core__plugin__entities__parameters__PluginParameterAutoGenerate__Type + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| core__plugin__entities__parameters__PluginParameterAutoGenerate__Type | string | | | + #### core__tools__entities__common_entities__I18nObject Model class for i18n object. diff --git a/api/openapi/markdown/service-openapi.md b/api/openapi/markdown/service-openapi.md index 8fc5e75e3cf..5c30aefead1 100644 --- a/api/openapi/markdown/service-openapi.md +++ b/api/openapi/markdown/service-openapi.md @@ -3937,7 +3937,7 @@ Model class for provider with models response. | output_variable_name | string | | Yes | | type | string | | No | -#### SimpleAccount +#### SimpleAccountResponse | Name | Type | Description | Required | | ---- | ---- | ----------- | -------- | @@ -4147,7 +4147,7 @@ in form definiton, or a variable while the workflow is running. | Name | Type | Description | Required | | ---- | ---- | ----------- | -------- | | created_at | integer | | No | -| created_by_account | [SimpleAccount](#simpleaccount) | | No | +| created_by_account | [SimpleAccountResponse](#simpleaccountresponse) | | No | | created_by_end_user | [SimpleEndUser](#simpleenduser) | | No | | created_by_role | string | | No | | created_from | string | | No | diff --git a/api/openapi/markdown/web-openapi.md b/api/openapi/markdown/web-openapi.md index 0f368895ab6..d8eddcfc6b2 100644 --- a/api/openapi/markdown/web-openapi.md +++ b/api/openapi/markdown/web-openapi.md @@ -346,23 +346,29 @@ Verify password reset token validity ### [GET] /form/human_input/{form_token} **Get human input form definition by token** +Get a human input form definition by token GET /api/form/human_input/ #### Parameters | Name | Located in | Description | Required | Schema | | ---- | ---------- | ----------- | -------- | ------ | -| form_token | path | | Yes | string | +| form_token | path | Human input form token | Yes | string | #### Responses | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Success | **application/json**: [HumanInputFormDefinitionResponse](#humaninputformdefinitionresponse)
| +| 200 | Form retrieved successfully | **application/json**: [HumanInputFormDefinitionResponse](#humaninputformdefinitionresponse)
| +| 403 | Forbidden | | +| 404 | Form not found | | +| 412 | Form already submitted or expired | | +| 429 | Too many requests | | ### [POST] /form/human_input/{form_token} **Submit human input form by token** +Submit a human input form by token POST /api/form/human_input/ Request body: @@ -377,7 +383,7 @@ Request body: | Name | Located in | Description | Required | Schema | | ---- | ---------- | ----------- | -------- | ------ | -| form_token | path | | Yes | string | +| form_token | path | Human input form token | Yes | string | #### Request Body @@ -389,24 +395,32 @@ Request body: | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Success | **application/json**: [HumanInputFormSubmitResponse](#humaninputformsubmitresponse)
| +| 200 | Form submitted successfully | **application/json**: [HumanInputFormSubmitResponse](#humaninputformsubmitresponse)
| +| 400 | Bad request - invalid submission data | | +| 404 | Form not found | | +| 412 | Form already submitted or expired | | +| 429 | Too many requests | | ### [POST] /form/human_input/{form_token}/upload-token **Issue an upload token for a human input form** +Issue an upload token for an active human input form POST /api/form/human_input//upload-token #### Parameters | Name | Located in | Description | Required | Schema | | ---- | ---------- | ----------- | -------- | ------ | -| form_token | path | | Yes | string | +| form_token | path | Human input form token | Yes | string | #### Responses | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Success | **application/json**: [HumanInputUploadTokenResponse](#humaninputuploadtokenresponse)
| +| 200 | Upload token issued successfully | **application/json**: [HumanInputUploadTokenResponse](#humaninputuploadtokenresponse)
| +| 404 | Form not found | | +| 412 | Form already submitted or expired | | +| 429 | Too many requests | | ### [POST] /human-input-forms/files **Upload one local file or remote URL file for a HITL human input form** @@ -752,7 +766,7 @@ Retrieve app site information and configuration. | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Success | **application/json**: [AppSiteInfoResponse](#appsiteinforesponse)
| +| 200 | Success | **application/json**: [WebAppSiteResponse](#webappsiteresponse)
| | 400 | Bad Request | | | 401 | Unauthorized | | | 403 | Forbidden | | @@ -967,51 +981,6 @@ Returns Server-Sent Events stream. | ---- | ---- | ----------- | -------- | | appId | string | Application ID | Yes | -#### AppSiteInfoResponse - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| app_id | string | | Yes | -| can_replace_logo | boolean | | Yes | -| custom_config | object | | No | -| enable_site | boolean | | Yes | -| end_user_id | string | | No | -| model_config | [AppSiteModelConfigResponse](#appsitemodelconfigresponse) | | No | -| plan | string | | No | -| site | [AppSiteResponse](#appsiteresponse) | | Yes | - -#### AppSiteModelConfigResponse - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| model | | | Yes | -| more_like_this | | | Yes | -| opening_statement | string | | No | -| pre_prompt | string | | No | -| suggested_questions | | | Yes | -| suggested_questions_after_answer | | | Yes | -| user_input_form | | | Yes | - -#### AppSiteResponse - -| Name | Type | Description | Required | -| ---- | ---- | ----------- | -------- | -| chat_color_theme | string | | No | -| chat_color_theme_inverted | boolean | | No | -| copyright | string | | No | -| custom_disclaimer | string | | No | -| default_language | string | | No | -| description | string | | No | -| icon | string | | No | -| icon_background | string | | No | -| icon_type | string | | No | -| icon_url | string | | No | -| privacy_policy | string | | No | -| prompt_public | boolean | | No | -| show_workflow_steps | boolean | | No | -| title | string | | No | -| use_icon_as_answer_icon | boolean | | No | - #### AudioBinaryResponse | Name | Type | Description | Required | @@ -1260,11 +1229,11 @@ Parsed multipart form fields for HITL uploads. | Name | Type | Description | Required | | ---- | ---- | ----------- | -------- | | expiration_time | integer | | Yes | -| form_content | | | Yes | -| inputs | | | Yes | +| form_content | string | | Yes | +| inputs | [ [FormInputConfig](#forminputconfig) ] | | Yes | | resolved_default_values | object | | Yes | -| site | object | | No | -| user_actions | | | Yes | +| site | [WebAppSiteResponse](#webappsiteresponse) | | No | +| user_actions | [ [UserActionConfig](#useractionconfig) ] | | Yes | #### HumanInputFormSubmissionData @@ -1681,6 +1650,26 @@ in form definiton, or a variable while the workflow is running. | ---- | ---- | ----------- | -------- | | protocol | string | | Yes | +#### WebAppCustomConfigResponse + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| remove_webapp_brand | boolean | | Yes | +| replace_webapp_logo | string | | No | + +#### WebAppSiteResponse + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| app_id | string | | Yes | +| can_replace_logo | boolean | | Yes | +| custom_config | [WebAppCustomConfigResponse](#webappcustomconfigresponse) | | No | +| enable_site | boolean | | Yes | +| end_user_id | string | | No | +| model_config | [WebModelConfigResponse](#webmodelconfigresponse) | | No | +| plan | string | | Yes | +| site | [WebSiteResponse](#websiteresponse) | | Yes | + #### WebMessageInfiniteScrollPagination | Name | Type | Description | Required | @@ -1709,6 +1698,38 @@ in form definiton, or a variable while the workflow is running. | retriever_resources | [ [RetrieverResource](#retrieverresource) ] | | Yes | | status | string | | Yes | +#### WebModelConfigResponse + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| model | | | No | +| more_like_this | | | No | +| opening_statement | string | | No | +| pre_prompt | string | | No | +| suggested_questions | | | No | +| suggested_questions_after_answer | | | No | +| user_input_form | | | No | + +#### WebSiteResponse + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| chat_color_theme | string | | No | +| chat_color_theme_inverted | boolean | | Yes | +| copyright | string | | No | +| custom_disclaimer | string | | No | +| default_language | string | | No | +| description | string | | No | +| icon | string | | No | +| icon_background | string | | No | +| icon_type | string | | No | +| icon_url | string | | Yes | +| privacy_policy | string | | No | +| prompt_public | boolean | | No | +| show_workflow_steps | boolean | | No | +| title | string | | Yes | +| use_icon_as_answer_icon | boolean | | No | + #### WorkflowRunPayload | Name | Type | Description | Required | diff --git a/api/tests/unit_tests/libs/test_helper.py b/api/tests/unit_tests/libs/test_helper.py index 1a93dbbca13..1bd36d134d6 100644 --- a/api/tests/unit_tests/libs/test_helper.py +++ b/api/tests/unit_tests/libs/test_helper.py @@ -1,8 +1,9 @@ from datetime import datetime +from typing import Any, cast import pytest -from libs.helper import OptionalTimestampField, escape_like_pattern, extract_tenant_id +from libs.helper import escape_like_pattern, extract_tenant_id, to_timestamp from models.account import Account from models.model import EndUser @@ -42,7 +43,7 @@ class TestExtractTenantId: """Test extracting tenant_id from EndUser without tenant_id.""" # Create a mock EndUser object end_user = EndUser() - end_user.tenant_id = None + cast(Any, end_user).tenant_id = None tenant_id = extract_tenant_id(end_user) assert tenant_id is None @@ -52,32 +53,29 @@ class TestExtractTenantId: invalid_user = "not_a_user_object" with pytest.raises(ValueError, match="Invalid user type.*Expected Account or EndUser"): - extract_tenant_id(invalid_user) + extract_tenant_id(cast(Any, invalid_user)) def test_extract_tenant_id_with_none_user(self): """Test extracting tenant_id with None user raises ValueError.""" with pytest.raises(ValueError, match="Invalid user type.*Expected Account or EndUser"): - extract_tenant_id(None) + extract_tenant_id(cast(Any, None)) def test_extract_tenant_id_with_dict_user(self): """Test extracting tenant_id with dict user raises ValueError.""" dict_user = {"id": "123", "tenant_id": "456"} with pytest.raises(ValueError, match="Invalid user type.*Expected Account or EndUser"): - extract_tenant_id(dict_user) + extract_tenant_id(cast(Any, dict_user)) -class TestOptionalTimestampField: +class TestToTimestamp: def test_format_returns_none_for_none(self): - field = OptionalTimestampField() - - assert field.format(None) is None + assert to_timestamp(None) is None def test_format_returns_unix_timestamp_for_datetime(self): - field = OptionalTimestampField() value = datetime(2024, 1, 2, 3, 4, 5) - assert field.format(value) == int(value.timestamp()) + assert to_timestamp(value) == int(value.timestamp()) class TestEscapeLikePattern: @@ -111,7 +109,7 @@ class TestEscapeLikePattern: def test_escape_none_handling(self): """Test escaping None returns None (falsy check handles it).""" # The function checks `if not pattern`, so None is falsy and returns as-is - result = escape_like_pattern(None) + result = escape_like_pattern(cast(Any, None)) assert result is None def test_escape_normal_string_no_change(self): diff --git a/packages/contracts/generated/api/console/account/types.gen.ts b/packages/contracts/generated/api/console/account/types.gen.ts index cdd45925fb2..1a7d1644f8f 100644 --- a/packages/contracts/generated/api/console/account/types.gen.ts +++ b/packages/contracts/generated/api/console/account/types.gen.ts @@ -12,7 +12,7 @@ export type AccountAvatarPayload = { avatar: string } -export type Account = { +export type AccountResponse = { avatar?: string | null readonly avatar_url: string | null created_at?: number | null @@ -140,7 +140,7 @@ export type AccountIntegrateResponse = { provider: string } -export type AccountWritable = { +export type AccountResponseWritable = { avatar?: string | null created_at?: number | null email: string @@ -177,7 +177,7 @@ export type PostAccountAvatarData = { } export type PostAccountAvatarResponses = { - 200: Account + 200: AccountResponse } export type PostAccountAvatarResponse = PostAccountAvatarResponses[keyof PostAccountAvatarResponses] @@ -218,7 +218,7 @@ export type PostAccountChangeEmailResetData = { } export type PostAccountChangeEmailResetResponses = { - 200: Account + 200: AccountResponse } export type PostAccountChangeEmailResetResponse @@ -374,7 +374,7 @@ export type PostAccountInterfaceLanguageData = { } export type PostAccountInterfaceLanguageResponses = { - 200: Account + 200: AccountResponse } export type PostAccountInterfaceLanguageResponse @@ -388,7 +388,7 @@ export type PostAccountInterfaceThemeData = { } export type PostAccountInterfaceThemeResponses = { - 200: Account + 200: AccountResponse } export type PostAccountInterfaceThemeResponse @@ -402,7 +402,7 @@ export type PostAccountNameData = { } export type PostAccountNameResponses = { - 200: Account + 200: AccountResponse } export type PostAccountNameResponse = PostAccountNameResponses[keyof PostAccountNameResponses] @@ -415,7 +415,7 @@ export type PostAccountPasswordData = { } export type PostAccountPasswordResponses = { - 200: Account + 200: AccountResponse } export type PostAccountPasswordResponse @@ -429,7 +429,7 @@ export type GetAccountProfileData = { } export type GetAccountProfileResponses = { - 200: Account + 200: AccountResponse } export type GetAccountProfileResponse = GetAccountProfileResponses[keyof GetAccountProfileResponses] @@ -442,7 +442,7 @@ export type PostAccountTimezoneData = { } export type PostAccountTimezoneResponses = { - 200: Account + 200: AccountResponse } export type PostAccountTimezoneResponse diff --git a/packages/contracts/generated/api/console/account/zod.gen.ts b/packages/contracts/generated/api/console/account/zod.gen.ts index 9951efc8d9f..cba539b0316 100644 --- a/packages/contracts/generated/api/console/account/zod.gen.ts +++ b/packages/contracts/generated/api/console/account/zod.gen.ts @@ -17,9 +17,9 @@ export const zAccountAvatarPayload = z.object({ }) /** - * Account + * AccountResponse */ -export const zAccount = z.object({ +export const zAccountResponse = z.object({ avatar: z.string().nullish(), avatar_url: z.string().nullable(), created_at: z.int().nullish(), @@ -212,9 +212,9 @@ export const zAccountIntegrateListResponse = z.object({ }) /** - * Account + * AccountResponse */ -export const zAccountWritable = z.object({ +export const zAccountResponseWritable = z.object({ avatar: z.string().nullish(), created_at: z.int().nullish(), email: z.string(), @@ -242,7 +242,7 @@ export const zPostAccountAvatarBody = zAccountAvatarPayload /** * Success */ -export const zPostAccountAvatarResponse = zAccount +export const zPostAccountAvatarResponse = zAccountResponse export const zPostAccountChangeEmailBody = zChangeEmailSendPayload @@ -263,7 +263,7 @@ export const zPostAccountChangeEmailResetBody = zChangeEmailResetPayload /** * Success */ -export const zPostAccountChangeEmailResetResponse = zAccount +export const zPostAccountChangeEmailResetResponse = zAccountResponse export const zPostAccountChangeEmailValidityBody = zChangeEmailValidityPayload @@ -336,37 +336,37 @@ export const zPostAccountInterfaceLanguageBody = zAccountInterfaceLanguagePayloa /** * Success */ -export const zPostAccountInterfaceLanguageResponse = zAccount +export const zPostAccountInterfaceLanguageResponse = zAccountResponse export const zPostAccountInterfaceThemeBody = zAccountInterfaceThemePayload /** * Success */ -export const zPostAccountInterfaceThemeResponse = zAccount +export const zPostAccountInterfaceThemeResponse = zAccountResponse export const zPostAccountNameBody = zAccountNamePayload /** * Success */ -export const zPostAccountNameResponse = zAccount +export const zPostAccountNameResponse = zAccountResponse export const zPostAccountPasswordBody = zAccountPasswordPayload /** * Success */ -export const zPostAccountPasswordResponse = zAccount +export const zPostAccountPasswordResponse = zAccountResponse /** * Success */ -export const zGetAccountProfileResponse = zAccount +export const zGetAccountProfileResponse = zAccountResponse export const zPostAccountTimezoneBody = zAccountTimezonePayload /** * Success */ -export const zPostAccountTimezoneResponse = zAccount +export const zPostAccountTimezoneResponse = zAccountResponse diff --git a/packages/contracts/generated/api/console/agent/types.gen.ts b/packages/contracts/generated/api/console/agent/types.gen.ts index 43119c4f1f4..0607d1662d7 100644 --- a/packages/contracts/generated/api/console/agent/types.gen.ts +++ b/packages/contracts/generated/api/console/agent/types.gen.ts @@ -405,12 +405,30 @@ export type DeletedTool = { } export type ModelConfig = { - completion_params?: { - [key: string]: unknown - } - mode: LlmMode - name: string - provider: string + agent_mode?: JsonValue | null + annotation_reply?: JsonValue | null + chat_prompt_config?: JsonValue | null + completion_prompt_config?: JsonValue | null + created_at?: number | null + created_by?: string | null + dataset_configs?: JsonValue | null + dataset_query_variable?: string | null + external_data_tools?: JsonValue | null + file_upload?: JsonValue | null + model?: JsonValue | null + more_like_this?: JsonValue | null + opening_statement?: string | null + pre_prompt?: string | null + prompt_type?: string | null + retriever_resource?: JsonValue | null + sensitive_word_avoidance?: JsonValue | null + speech_to_text?: JsonValue | null + suggested_questions?: JsonValue | null + suggested_questions_after_answer?: JsonValue | null + text_to_speech?: JsonValue | null + updated_at?: number | null + updated_by?: string | null + user_input_form?: JsonValue | null } export type Site = { @@ -436,16 +454,7 @@ export type Tag = { type: string } -export type JsonValue - = | string - | number - | number - | boolean - | { - [key: string]: unknown - } - | Array - | null +export type JsonValue = unknown export type WorkflowPartial = { created_at?: number | null @@ -879,8 +888,6 @@ export type AgentAppPublishedReferenceResponse = { app_name: string } -export type LlmMode = 'chat' | 'completion' - export type AgentKind = 'dify_agent' export type AgentPublishedReferenceResponse = { diff --git a/packages/contracts/generated/api/console/agent/zod.gen.ts b/packages/contracts/generated/api/console/agent/zod.gen.ts index d7f5681ffc4..7d061e956f4 100644 --- a/packages/contracts/generated/api/console/agent/zod.gen.ts +++ b/packages/contracts/generated/api/console/agent/zod.gen.ts @@ -218,16 +218,37 @@ export const zTag = z.object({ type: z.string(), }) -export const zJsonValue = z - .union([ - z.string(), - z.int(), - z.number(), - z.boolean(), - z.record(z.string(), z.unknown()), - z.array(z.unknown()), - ]) - .nullable() +export const zJsonValue = z.unknown() + +/** + * ModelConfig + */ +export const zModelConfig = z.object({ + agent_mode: zJsonValue.nullish(), + annotation_reply: zJsonValue.nullish(), + chat_prompt_config: zJsonValue.nullish(), + completion_prompt_config: zJsonValue.nullish(), + created_at: z.int().nullish(), + created_by: z.string().nullish(), + dataset_configs: zJsonValue.nullish(), + dataset_query_variable: z.string().nullish(), + external_data_tools: zJsonValue.nullish(), + file_upload: zJsonValue.nullish(), + model: zJsonValue.nullish(), + more_like_this: zJsonValue.nullish(), + opening_statement: z.string().nullish(), + pre_prompt: z.string().nullish(), + prompt_type: z.string().nullish(), + retriever_resource: zJsonValue.nullish(), + sensitive_word_avoidance: zJsonValue.nullish(), + speech_to_text: zJsonValue.nullish(), + suggested_questions: zJsonValue.nullish(), + suggested_questions_after_answer: zJsonValue.nullish(), + text_to_speech: zJsonValue.nullish(), + updated_at: z.int().nullish(), + updated_by: z.string().nullish(), + user_input_form: zJsonValue.nullish(), +}) /** * WorkflowPartial @@ -240,6 +261,43 @@ export const zWorkflowPartial = z.object({ updated_by: z.string().nullish(), }) +/** + * AgentAppDetailWithSite + */ +export const zAgentAppDetailWithSite = z.object({ + access_mode: z.string().nullish(), + active_config_is_published: z.boolean().optional().default(false), + api_base_url: z.string().nullish(), + app_id: z.string().nullish(), + bound_agent_id: z.string().nullish(), + created_at: z.int().nullish(), + created_by: z.string().nullish(), + debug_conversation_id: z.string().nullish(), + deleted_tools: z.array(zDeletedTool).optional(), + description: z.string().nullish(), + enable_api: z.boolean(), + enable_site: z.boolean(), + icon: z.string().nullish(), + icon_background: z.string().nullish(), + icon_type: z.string().nullish(), + icon_url: z.string().nullable(), + id: z.string(), + maintainer: z.string().nullish(), + max_active_requests: z.int().nullish(), + mode: z.string(), + model_config: zModelConfig.nullish(), + name: z.string(), + permission_keys: z.array(z.string()).optional(), + role: z.string().nullish(), + site: zSite.nullish(), + tags: z.array(zTag).optional(), + tracing: zJsonValue.nullish(), + updated_at: z.int().nullish(), + updated_by: z.string().nullish(), + use_icon_as_answer_icon: z.boolean().nullish(), + workflow: zWorkflowPartial.nullish(), +}) + /** * AgentConfigSnapshotSummaryResponse */ @@ -773,60 +831,6 @@ export const zAgentAppPagination = z.object({ total: z.int(), }) -/** - * LLMMode - * - * Enum class for large language model mode. - */ -export const zLlmMode = z.enum(['chat', 'completion']) - -/** - * ModelConfig - */ -export const zModelConfig = z.object({ - completion_params: z.record(z.string(), z.unknown()).optional(), - mode: zLlmMode, - name: z.string(), - provider: z.string(), -}) - -/** - * AgentAppDetailWithSite - */ -export const zAgentAppDetailWithSite = z.object({ - access_mode: z.string().nullish(), - active_config_is_published: z.boolean().optional().default(false), - api_base_url: z.string().nullish(), - app_id: z.string().nullish(), - bound_agent_id: z.string().nullish(), - created_at: z.int().nullish(), - created_by: z.string().nullish(), - debug_conversation_id: z.string().nullish(), - deleted_tools: z.array(zDeletedTool).optional(), - description: z.string().nullish(), - enable_api: z.boolean(), - enable_site: z.boolean(), - icon: z.string().nullish(), - icon_background: z.string().nullish(), - icon_type: z.string().nullish(), - icon_url: z.string().nullable(), - id: z.string(), - maintainer: z.string().nullish(), - max_active_requests: z.int().nullish(), - mode: z.string(), - model_config: zModelConfig.nullish(), - name: z.string(), - permission_keys: z.array(z.string()).optional(), - role: z.string().nullish(), - site: zSite.nullish(), - tags: z.array(zTag).optional(), - tracing: zJsonValue.nullish(), - updated_at: z.int().nullish(), - updated_by: z.string().nullish(), - use_icon_as_answer_icon: z.boolean().nullish(), - workflow: zWorkflowPartial.nullish(), -}) - /** * AgentKind * diff --git a/packages/contracts/generated/api/console/all-workspaces/types.gen.ts b/packages/contracts/generated/api/console/all-workspaces/types.gen.ts index 4683b2d9921..b4c9fa0349a 100644 --- a/packages/contracts/generated/api/console/all-workspaces/types.gen.ts +++ b/packages/contracts/generated/api/console/all-workspaces/types.gen.ts @@ -4,7 +4,7 @@ export type ClientOptions = { baseUrl: `${string}://${string}/console/api` | (string & {}) } -export type WorkspaceListResponse = { +export type WorkspacePaginationResponse = { data: Array has_more: boolean limit: number @@ -30,7 +30,7 @@ export type GetAllWorkspacesData = { } export type GetAllWorkspacesResponses = { - 200: WorkspaceListResponse + 200: WorkspacePaginationResponse } export type GetAllWorkspacesResponse = GetAllWorkspacesResponses[keyof GetAllWorkspacesResponses] diff --git a/packages/contracts/generated/api/console/all-workspaces/zod.gen.ts b/packages/contracts/generated/api/console/all-workspaces/zod.gen.ts index f63bd0e396f..c9cdda11681 100644 --- a/packages/contracts/generated/api/console/all-workspaces/zod.gen.ts +++ b/packages/contracts/generated/api/console/all-workspaces/zod.gen.ts @@ -13,9 +13,9 @@ export const zWorkspaceListItemResponse = z.object({ }) /** - * WorkspaceListResponse + * WorkspacePaginationResponse */ -export const zWorkspaceListResponse = z.object({ +export const zWorkspacePaginationResponse = z.object({ data: z.array(zWorkspaceListItemResponse), has_more: z.boolean(), limit: z.int(), @@ -31,4 +31,4 @@ export const zGetAllWorkspacesQuery = z.object({ /** * Success */ -export const zGetAllWorkspacesResponse = zWorkspaceListResponse +export const zGetAllWorkspacesResponse = zWorkspacePaginationResponse diff --git a/packages/contracts/generated/api/console/apps/orpc.gen.ts b/packages/contracts/generated/api/console/apps/orpc.gen.ts index ea72df28458..1409ac2ea2e 100644 --- a/packages/contracts/generated/api/console/apps/orpc.gen.ts +++ b/packages/contracts/generated/api/console/apps/orpc.gen.ts @@ -173,11 +173,6 @@ import { zGetAppsByAppIdWorkflowRunsPath, zGetAppsByAppIdWorkflowRunsQuery, zGetAppsByAppIdWorkflowRunsResponse, - zGetAppsByAppIdWorkflowsDefaultWorkflowBlockConfigsByBlockTypePath, - zGetAppsByAppIdWorkflowsDefaultWorkflowBlockConfigsByBlockTypeQuery, - zGetAppsByAppIdWorkflowsDefaultWorkflowBlockConfigsByBlockTypeResponse, - zGetAppsByAppIdWorkflowsDefaultWorkflowBlockConfigsPath, - zGetAppsByAppIdWorkflowsDefaultWorkflowBlockConfigsResponse, zGetAppsByAppIdWorkflowsDraftConversationVariablesPath, zGetAppsByAppIdWorkflowsDraftConversationVariablesResponse, zGetAppsByAppIdWorkflowsDraftEnvironmentVariablesPath, @@ -258,18 +253,6 @@ import { zPostAppsByAppIdAdvancedChatWorkflowsDraftHumanInputNodesByNodeIdFormPreviewBody, zPostAppsByAppIdAdvancedChatWorkflowsDraftHumanInputNodesByNodeIdFormPreviewPath, zPostAppsByAppIdAdvancedChatWorkflowsDraftHumanInputNodesByNodeIdFormPreviewResponse, - zPostAppsByAppIdAdvancedChatWorkflowsDraftHumanInputNodesByNodeIdFormRunBody, - zPostAppsByAppIdAdvancedChatWorkflowsDraftHumanInputNodesByNodeIdFormRunPath, - zPostAppsByAppIdAdvancedChatWorkflowsDraftHumanInputNodesByNodeIdFormRunResponse, - zPostAppsByAppIdAdvancedChatWorkflowsDraftIterationNodesByNodeIdRunBody, - zPostAppsByAppIdAdvancedChatWorkflowsDraftIterationNodesByNodeIdRunPath, - zPostAppsByAppIdAdvancedChatWorkflowsDraftIterationNodesByNodeIdRunResponse, - zPostAppsByAppIdAdvancedChatWorkflowsDraftLoopNodesByNodeIdRunBody, - zPostAppsByAppIdAdvancedChatWorkflowsDraftLoopNodesByNodeIdRunPath, - zPostAppsByAppIdAdvancedChatWorkflowsDraftLoopNodesByNodeIdRunResponse, - zPostAppsByAppIdAdvancedChatWorkflowsDraftRunBody, - zPostAppsByAppIdAdvancedChatWorkflowsDraftRunPath, - zPostAppsByAppIdAdvancedChatWorkflowsDraftRunResponse, zPostAppsByAppIdAgentFilesBody, zPostAppsByAppIdAgentFilesPath, zPostAppsByAppIdAgentFilesQuery, @@ -383,15 +366,6 @@ import { zPostAppsByAppIdWorkflowsDraftHumanInputNodesByNodeIdFormPreviewBody, zPostAppsByAppIdWorkflowsDraftHumanInputNodesByNodeIdFormPreviewPath, zPostAppsByAppIdWorkflowsDraftHumanInputNodesByNodeIdFormPreviewResponse, - zPostAppsByAppIdWorkflowsDraftHumanInputNodesByNodeIdFormRunBody, - zPostAppsByAppIdWorkflowsDraftHumanInputNodesByNodeIdFormRunPath, - zPostAppsByAppIdWorkflowsDraftHumanInputNodesByNodeIdFormRunResponse, - zPostAppsByAppIdWorkflowsDraftIterationNodesByNodeIdRunBody, - zPostAppsByAppIdWorkflowsDraftIterationNodesByNodeIdRunPath, - zPostAppsByAppIdWorkflowsDraftIterationNodesByNodeIdRunResponse, - zPostAppsByAppIdWorkflowsDraftLoopNodesByNodeIdRunBody, - zPostAppsByAppIdWorkflowsDraftLoopNodesByNodeIdRunPath, - zPostAppsByAppIdWorkflowsDraftLoopNodesByNodeIdRunResponse, zPostAppsByAppIdWorkflowsDraftNodesByNodeIdAgentComposerCopyFromRosterBody, zPostAppsByAppIdWorkflowsDraftNodesByNodeIdAgentComposerCopyFromRosterPath, zPostAppsByAppIdWorkflowsDraftNodesByNodeIdAgentComposerCopyFromRosterResponse, @@ -411,15 +385,6 @@ import { zPostAppsByAppIdWorkflowsDraftNodesByNodeIdTriggerRunResponse, zPostAppsByAppIdWorkflowsDraftPath, zPostAppsByAppIdWorkflowsDraftResponse, - zPostAppsByAppIdWorkflowsDraftRunBody, - zPostAppsByAppIdWorkflowsDraftRunPath, - zPostAppsByAppIdWorkflowsDraftRunResponse, - zPostAppsByAppIdWorkflowsDraftTriggerRunAllBody, - zPostAppsByAppIdWorkflowsDraftTriggerRunAllPath, - zPostAppsByAppIdWorkflowsDraftTriggerRunAllResponse, - zPostAppsByAppIdWorkflowsDraftTriggerRunBody, - zPostAppsByAppIdWorkflowsDraftTriggerRunPath, - zPostAppsByAppIdWorkflowsDraftTriggerRunResponse, zPostAppsByAppIdWorkflowsPublishBody, zPostAppsByAppIdWorkflowsPublishPath, zPostAppsByAppIdWorkflowsPublishResponse, @@ -630,36 +595,8 @@ export const preview = { post: post4, } -/** - * Submit human input form preview - * - * Submit human input form preview for advanced chat workflow - */ -export const post5 = oc - .route({ - description: 'Submit human input form preview for advanced chat workflow', - inputStructure: 'detailed', - method: 'POST', - operationId: 'postAppsByAppIdAdvancedChatWorkflowsDraftHumanInputNodesByNodeIdFormRun', - path: '/apps/{app_id}/advanced-chat/workflows/draft/human-input/nodes/{node_id}/form/run', - summary: 'Submit human input form preview', - tags: ['console'], - }) - .input( - z.object({ - body: zPostAppsByAppIdAdvancedChatWorkflowsDraftHumanInputNodesByNodeIdFormRunBody, - params: zPostAppsByAppIdAdvancedChatWorkflowsDraftHumanInputNodesByNodeIdFormRunPath, - }), - ) - .output(zPostAppsByAppIdAdvancedChatWorkflowsDraftHumanInputNodesByNodeIdFormRunResponse) - -export const run = { - post: post5, -} - export const form = { preview, - run, } export const byNodeId = { @@ -674,116 +611,8 @@ export const humanInput = { nodes, } -/** - * Run draft workflow iteration node - * - * Run draft workflow iteration node for advanced chat - */ -export const post6 = oc - .route({ - description: 'Run draft workflow iteration node for advanced chat', - inputStructure: 'detailed', - method: 'POST', - operationId: 'postAppsByAppIdAdvancedChatWorkflowsDraftIterationNodesByNodeIdRun', - path: '/apps/{app_id}/advanced-chat/workflows/draft/iteration/nodes/{node_id}/run', - summary: 'Run draft workflow iteration node', - tags: ['console'], - }) - .input( - z.object({ - body: zPostAppsByAppIdAdvancedChatWorkflowsDraftIterationNodesByNodeIdRunBody, - params: zPostAppsByAppIdAdvancedChatWorkflowsDraftIterationNodesByNodeIdRunPath, - }), - ) - .output(zPostAppsByAppIdAdvancedChatWorkflowsDraftIterationNodesByNodeIdRunResponse) - -export const run2 = { - post: post6, -} - -export const byNodeId2 = { - run: run2, -} - -export const nodes2 = { - byNodeId: byNodeId2, -} - -export const iteration = { - nodes: nodes2, -} - -/** - * Run draft workflow loop node - * - * Run draft workflow loop node for advanced chat - */ -export const post7 = oc - .route({ - description: 'Run draft workflow loop node for advanced chat', - inputStructure: 'detailed', - method: 'POST', - operationId: 'postAppsByAppIdAdvancedChatWorkflowsDraftLoopNodesByNodeIdRun', - path: '/apps/{app_id}/advanced-chat/workflows/draft/loop/nodes/{node_id}/run', - summary: 'Run draft workflow loop node', - tags: ['console'], - }) - .input( - z.object({ - body: zPostAppsByAppIdAdvancedChatWorkflowsDraftLoopNodesByNodeIdRunBody, - params: zPostAppsByAppIdAdvancedChatWorkflowsDraftLoopNodesByNodeIdRunPath, - }), - ) - .output(zPostAppsByAppIdAdvancedChatWorkflowsDraftLoopNodesByNodeIdRunResponse) - -export const run3 = { - post: post7, -} - -export const byNodeId3 = { - run: run3, -} - -export const nodes3 = { - byNodeId: byNodeId3, -} - -export const loop = { - nodes: nodes3, -} - -/** - * Run draft workflow - * - * Run draft workflow for advanced chat application - */ -export const post8 = oc - .route({ - description: 'Run draft workflow for advanced chat application', - inputStructure: 'detailed', - method: 'POST', - operationId: 'postAppsByAppIdAdvancedChatWorkflowsDraftRun', - path: '/apps/{app_id}/advanced-chat/workflows/draft/run', - summary: 'Run draft workflow', - tags: ['console'], - }) - .input( - z.object({ - body: zPostAppsByAppIdAdvancedChatWorkflowsDraftRunBody, - params: zPostAppsByAppIdAdvancedChatWorkflowsDraftRunPath, - }), - ) - .output(zPostAppsByAppIdAdvancedChatWorkflowsDraftRunResponse) - -export const run4 = { - post: post8, -} - export const draft = { humanInput, - iteration, - loop, - run: run4, } export const workflows2 = { @@ -953,7 +782,7 @@ export const delete_ = oc * * Commit an uploaded file into the agent drive under files/ (ENG-625 D3) */ -export const post9 = oc +export const post5 = oc .route({ description: 'Commit an uploaded file into the agent drive under files/ (ENG-625 D3)', inputStructure: 'detailed', @@ -975,7 +804,7 @@ export const post9 = oc export const files2 = { delete: delete_, - post: post9, + post: post5, } /** @@ -1005,7 +834,7 @@ export const logs = { * * Upload + standardize a Skill into the agent drive */ -export const post10 = oc +export const post6 = oc .route({ description: 'Upload + standardize a Skill into the agent drive', inputStructure: 'detailed', @@ -1026,7 +855,7 @@ export const post10 = oc .output(zPostAppsByAppIdAgentSkillsUploadResponse) export const upload = { - post: post10, + post: post6, } /** @@ -1035,7 +864,7 @@ export const upload = { * Infer CLI tool + ENV suggestions from a standardized skill's SKILL.md (draft only, ENG-371) * Saving still goes through composer validation. */ -export const post11 = oc +export const post7 = oc .route({ description: 'Infer CLI tool + ENV suggestions from a standardized skill\'s SKILL.md (draft only, ENG-371)\nSaving still goes through composer validation.', @@ -1055,7 +884,7 @@ export const post11 = oc .output(zPostAppsByAppIdAgentSkillsBySlugInferToolsResponse) export const inferTools = { - post: post11, + post: post7, } /** @@ -1121,7 +950,7 @@ export const status = { /** * Enable or disable annotation reply for an app */ -export const post12 = oc +export const post8 = oc .route({ description: 'Enable or disable annotation reply for an app', inputStructure: 'detailed', @@ -1139,7 +968,7 @@ export const post12 = oc .output(zPostAppsByAppIdAnnotationReplyByActionResponse) export const byAction = { - post: post12, + post: post8, status, } @@ -1169,7 +998,7 @@ export const annotationSetting = { /** * Update annotation settings for an app */ -export const post13 = oc +export const post9 = oc .route({ description: 'Update annotation settings for an app', inputStructure: 'detailed', @@ -1187,7 +1016,7 @@ export const post13 = oc .output(zPostAppsByAppIdAnnotationSettingsByAnnotationSettingIdResponse) export const byAnnotationSettingId = { - post: post13, + post: post9, } export const annotationSettings = { @@ -1197,7 +1026,7 @@ export const annotationSettings = { /** * Batch import annotations from CSV file with rate limiting and security checks */ -export const post14 = oc +export const post10 = oc .route({ description: 'Batch import annotations from CSV file with rate limiting and security checks', inputStructure: 'detailed', @@ -1210,7 +1039,7 @@ export const post14 = oc .output(zPostAppsByAppIdAnnotationsBatchImportResponse) export const batchImport = { - post: post14, + post: post10, } /** @@ -1313,7 +1142,7 @@ export const delete3 = oc /** * Update or delete an annotation */ -export const post15 = oc +export const post11 = oc .route({ description: 'Update or delete an annotation', inputStructure: 'detailed', @@ -1332,7 +1161,7 @@ export const post15 = oc export const byAnnotationId = { delete: delete3, - post: post15, + post: post11, hitHistories, } @@ -1371,7 +1200,7 @@ export const get17 = oc /** * Create a new annotation for an app */ -export const post16 = oc +export const post12 = oc .route({ description: 'Create a new annotation for an app', inputStructure: 'detailed', @@ -1389,7 +1218,7 @@ export const post16 = oc export const annotations = { delete: delete4, get: get17, - post: post16, + post: post12, batchImport, batchImportStatus, count: count2, @@ -1400,7 +1229,7 @@ export const annotations = { /** * Enable or disable app API */ -export const post17 = oc +export const post13 = oc .route({ description: 'Enable or disable app API', inputStructure: 'detailed', @@ -1413,13 +1242,13 @@ export const post17 = oc .output(zPostAppsByAppIdApiEnableResponse) export const apiEnable = { - post: post17, + post: post13, } /** * Transcript audio to text for chat messages */ -export const post18 = oc +export const post14 = oc .route({ description: 'Transcript audio to text for chat messages', inputStructure: 'detailed', @@ -1432,7 +1261,7 @@ export const post18 = oc .output(zPostAppsByAppIdAudioToTextResponse) export const audioToText = { - post: post18, + post: post14, } /** @@ -1522,7 +1351,7 @@ export const byMessageId = { /** * Stop a running chat message generation */ -export const post19 = oc +export const post15 = oc .route({ description: 'Stop a running chat message generation', inputStructure: 'detailed', @@ -1535,7 +1364,7 @@ export const post19 = oc .output(zPostAppsByAppIdChatMessagesByTaskIdStopResponse) export const stop = { - post: post19, + post: post15, } export const byTaskId = { @@ -1629,7 +1458,7 @@ export const completionConversations = { /** * Stop a running completion message generation */ -export const post20 = oc +export const post16 = oc .route({ description: 'Stop a running completion message generation', inputStructure: 'detailed', @@ -1642,7 +1471,7 @@ export const post20 = oc .output(zPostAppsByAppIdCompletionMessagesByTaskIdStopResponse) export const stop2 = { - post: post20, + post: post16, } export const byTaskId2 = { @@ -1652,7 +1481,7 @@ export const byTaskId2 = { /** * Generate completion message for debugging */ -export const post21 = oc +export const post17 = oc .route({ description: 'Generate completion message for debugging', inputStructure: 'detailed', @@ -1670,7 +1499,7 @@ export const post21 = oc .output(zPostAppsByAppIdCompletionMessagesResponse) export const completionMessages = { - post: post21, + post: post17, byTaskId: byTaskId2, } @@ -1705,7 +1534,7 @@ export const conversationVariables = { * Convert expert mode of chatbot app to workflow mode * Convert Completion App to Workflow App */ -export const post22 = oc +export const post18 = oc .route({ description: 'Convert application to workflow mode\nConvert expert mode of chatbot app to workflow mode\nConvert Completion App to Workflow App', @@ -1725,7 +1554,7 @@ export const post22 = oc .output(zPostAppsByAppIdConvertToWorkflowResponse) export const convertToWorkflow = { - post: post22, + post: post18, } /** @@ -1733,7 +1562,7 @@ export const convertToWorkflow = { * * Create a copy of an existing application */ -export const post23 = oc +export const post19 = oc .route({ description: 'Create a copy of an existing application', inputStructure: 'detailed', @@ -1748,7 +1577,7 @@ export const post23 = oc .output(zPostAppsByAppIdCopyResponse) export const copy = { - post: post23, + post: post19, } /** @@ -1802,7 +1631,7 @@ export const export3 = { /** * Create or update message feedback (like/dislike) */ -export const post24 = oc +export const post20 = oc .route({ description: 'Create or update message feedback (like/dislike)', inputStructure: 'detailed', @@ -1815,14 +1644,14 @@ export const post24 = oc .output(zPostAppsByAppIdFeedbacksResponse) export const feedbacks = { - post: post24, + post: post20, export: export3, } /** * Update application icon */ -export const post25 = oc +export const post21 = oc .route({ description: 'Update application icon', inputStructure: 'detailed', @@ -1835,7 +1664,7 @@ export const post25 = oc .output(zPostAppsByAppIdIconResponse) export const icon = { - post: post25, + post: post21, } /** @@ -1866,7 +1695,7 @@ export const messages = { * * Update application model configuration */ -export const post26 = oc +export const post22 = oc .route({ description: 'Update application model configuration', inputStructure: 'detailed', @@ -1882,13 +1711,13 @@ export const post26 = oc .output(zPostAppsByAppIdModelConfigResponse) export const modelConfig = { - post: post26, + post: post22, } /** * Check if app name is available */ -export const post27 = oc +export const post23 = oc .route({ description: 'Check if app name is available', inputStructure: 'detailed', @@ -1901,13 +1730,13 @@ export const post27 = oc .output(zPostAppsByAppIdNameResponse) export const name = { - post: post27, + post: post23, } /** * Publish app to Creators Platform */ -export const post28 = oc +export const post24 = oc .route({ inputStructure: 'detailed', method: 'POST', @@ -1920,7 +1749,7 @@ export const post28 = oc .output(zPostAppsByAppIdPublishToCreatorsPlatformResponse) export const publishToCreatorsPlatform = { - post: post28, + post: post24, } /** @@ -1941,7 +1770,7 @@ export const get28 = oc /** * Create MCP server configuration for an application */ -export const post29 = oc +export const post25 = oc .route({ description: 'Create MCP server configuration for an application', inputStructure: 'detailed', @@ -1971,14 +1800,14 @@ export const put = oc export const server = { get: get28, - post: post29, + post: post25, put, } /** * Reset access token for application site */ -export const post30 = oc +export const post26 = oc .route({ description: 'Reset access token for application site', inputStructure: 'detailed', @@ -1991,13 +1820,13 @@ export const post30 = oc .output(zPostAppsByAppIdSiteAccessTokenResetResponse) export const accessTokenReset = { - post: post30, + post: post26, } /** * Update application site configuration */ -export const post31 = oc +export const post27 = oc .route({ description: 'Update application site configuration', inputStructure: 'detailed', @@ -2010,14 +1839,14 @@ export const post31 = oc .output(zPostAppsByAppIdSiteResponse) export const site = { - post: post31, + post: post27, accessTokenReset, } /** * Enable or disable app site */ -export const post32 = oc +export const post28 = oc .route({ description: 'Enable or disable app site', inputStructure: 'detailed', @@ -2030,7 +1859,7 @@ export const post32 = oc .output(zPostAppsByAppIdSiteEnableResponse) export const siteEnable = { - post: post32, + post: post28, } /** @@ -2051,7 +1880,7 @@ export const delete7 = oc /** * Star an application for the current account */ -export const post33 = oc +export const post29 = oc .route({ description: 'Star an application for the current account', inputStructure: 'detailed', @@ -2065,7 +1894,7 @@ export const post33 = oc export const star = { delete: delete7, - post: post33, + post: post29, } /** @@ -2298,7 +2127,7 @@ export const voices = { /** * Convert text to speech for chat messages */ -export const post34 = oc +export const post30 = oc .route({ description: 'Convert text to speech for chat messages', inputStructure: 'detailed', @@ -2313,7 +2142,7 @@ export const post34 = oc .output(zPostAppsByAppIdTextToAudioResponse) export const textToAudio = { - post: post34, + post: post30, voices, } @@ -2338,7 +2167,7 @@ export const get38 = oc /** * Update app tracing configuration */ -export const post35 = oc +export const post31 = oc .route({ description: 'Update app tracing configuration', inputStructure: 'detailed', @@ -2352,7 +2181,7 @@ export const post35 = oc export const trace = { get: get38, - post: post35, + post: post31, } /** @@ -2421,7 +2250,7 @@ export const patch = oc * * Create a new tracing configuration for an application */ -export const post36 = oc +export const post32 = oc .route({ description: 'Create a new tracing configuration for an application', inputStructure: 'detailed', @@ -2441,13 +2270,13 @@ export const traceConfig = { delete: delete8, get: get39, patch, - post: post36, + post: post32, } /** * Update app trigger (enable/disable) */ -export const post37 = oc +export const post33 = oc .route({ inputStructure: 'detailed', method: 'POST', @@ -2465,7 +2294,7 @@ export const post37 = oc .output(zPostAppsByAppIdTriggerEnableResponse) export const triggerEnable = { - post: post37, + post: post33, } /** @@ -2573,7 +2402,7 @@ export const count3 = { * * Stop running workflow task */ -export const post38 = oc +export const post34 = oc .route({ description: 'Stop running workflow task', inputStructure: 'detailed', @@ -2587,7 +2416,7 @@ export const post38 = oc .output(zPostAppsByAppIdWorkflowRunsTasksByTaskIdStopResponse) export const stop3 = { - post: post38, + post: post34, } export const byTaskId3 = { @@ -2690,7 +2519,7 @@ export const read = { /** * Upload one workflow Agent sandbox file as a Dify ToolFile mapping */ -export const post39 = oc +export const post35 = oc .route({ description: 'Upload one workflow Agent sandbox file as a Dify ToolFile mapping', inputStructure: 'detailed', @@ -2708,7 +2537,7 @@ export const post39 = oc .output(zPostAppsByAppIdWorkflowRunsByWorkflowRunIdAgentNodesByNodeIdSandboxFilesUploadResponse) export const upload2 = { - post: post39, + post: post35, } /** @@ -2742,12 +2571,12 @@ export const sandbox = { files: files3, } -export const byNodeId4 = { +export const byNodeId2 = { sandbox, } export const agentNodes = { - byNodeId: byNodeId4, + byNodeId: byNodeId2, } export const byWorkflowRunId = { @@ -2859,7 +2688,7 @@ export const byReplyId = { * * Add a reply to a workflow comment */ -export const post40 = oc +export const post36 = oc .route({ description: 'Add a reply to a workflow comment', inputStructure: 'detailed', @@ -2879,7 +2708,7 @@ export const post40 = oc .output(zPostAppsByAppIdWorkflowCommentsByCommentIdRepliesResponse) export const replies = { - post: post40, + post: post36, byReplyId, } @@ -2888,7 +2717,7 @@ export const replies = { * * Resolve a workflow comment */ -export const post41 = oc +export const post37 = oc .route({ description: 'Resolve a workflow comment', inputStructure: 'detailed', @@ -2902,7 +2731,7 @@ export const post41 = oc .output(zPostAppsByAppIdWorkflowCommentsByCommentIdResolveResponse) export const resolve = { - post: post41, + post: post37, } /** @@ -2996,7 +2825,7 @@ export const get52 = oc * * Create a new workflow comment */ -export const post42 = oc +export const post38 = oc .route({ description: 'Create a new workflow comment', inputStructure: 'detailed', @@ -3017,7 +2846,7 @@ export const post42 = oc export const comments = { get: get52, - post: post42, + post: post38, mentionUsers, byCommentId, } @@ -3130,60 +2959,10 @@ export const workflow = { statistics: statistics2, } -/** - * Get default block config - * - * Get default block configuration by type - */ -export const get57 = oc - .route({ - description: 'Get default block configuration by type', - inputStructure: 'detailed', - method: 'GET', - operationId: 'getAppsByAppIdWorkflowsDefaultWorkflowBlockConfigsByBlockType', - path: '/apps/{app_id}/workflows/default-workflow-block-configs/{block_type}', - summary: 'Get default block config', - tags: ['console'], - }) - .input( - z.object({ - params: zGetAppsByAppIdWorkflowsDefaultWorkflowBlockConfigsByBlockTypePath, - query: zGetAppsByAppIdWorkflowsDefaultWorkflowBlockConfigsByBlockTypeQuery.optional(), - }), - ) - .output(zGetAppsByAppIdWorkflowsDefaultWorkflowBlockConfigsByBlockTypeResponse) - -export const byBlockType = { - get: get57, -} - -/** - * Get default block config - * - * Get default block configurations for workflow - */ -export const get58 = oc - .route({ - description: 'Get default block configurations for workflow', - inputStructure: 'detailed', - method: 'GET', - operationId: 'getAppsByAppIdWorkflowsDefaultWorkflowBlockConfigs', - path: '/apps/{app_id}/workflows/default-workflow-block-configs', - summary: 'Get default block config', - tags: ['console'], - }) - .input(z.object({ params: zGetAppsByAppIdWorkflowsDefaultWorkflowBlockConfigsPath })) - .output(zGetAppsByAppIdWorkflowsDefaultWorkflowBlockConfigsResponse) - -export const defaultWorkflowBlockConfigs = { - get: get58, - byBlockType, -} - /** * Get conversation variables for workflow */ -export const get59 = oc +export const get57 = oc .route({ description: 'Get conversation variables for workflow', inputStructure: 'detailed', @@ -3198,7 +2977,7 @@ export const get59 = oc /** * Update conversation variables for workflow draft */ -export const post43 = oc +export const post39 = oc .route({ description: 'Update conversation variables for workflow draft', inputStructure: 'detailed', @@ -3216,8 +2995,8 @@ export const post43 = oc .output(zPostAppsByAppIdWorkflowsDraftConversationVariablesResponse) export const conversationVariables2 = { - get: get59, - post: post43, + get: get57, + post: post39, } /** @@ -3225,7 +3004,7 @@ export const conversationVariables2 = { * * Get environment variables for workflow */ -export const get60 = oc +export const get58 = oc .route({ description: 'Get environment variables for workflow', inputStructure: 'detailed', @@ -3241,7 +3020,7 @@ export const get60 = oc /** * Update environment variables for workflow draft */ -export const post44 = oc +export const post40 = oc .route({ description: 'Update environment variables for workflow draft', inputStructure: 'detailed', @@ -3259,14 +3038,14 @@ export const post44 = oc .output(zPostAppsByAppIdWorkflowsDraftEnvironmentVariablesResponse) export const environmentVariables = { - get: get60, - post: post44, + get: get58, + post: post40, } /** * Update draft workflow features */ -export const post45 = oc +export const post41 = oc .route({ description: 'Update draft workflow features', inputStructure: 'detailed', @@ -3284,7 +3063,7 @@ export const post45 = oc .output(zPostAppsByAppIdWorkflowsDraftFeaturesResponse) export const features = { - post: post45, + post: post41, } /** @@ -3292,7 +3071,7 @@ export const features = { * * Test human input delivery for workflow */ -export const post46 = oc +export const post42 = oc .route({ description: 'Test human input delivery for workflow', inputStructure: 'detailed', @@ -3311,7 +3090,7 @@ export const post46 = oc .output(zPostAppsByAppIdWorkflowsDraftHumanInputNodesByNodeIdDeliveryTestResponse) export const deliveryTest = { - post: post46, + post: post42, } /** @@ -3319,7 +3098,7 @@ export const deliveryTest = { * * Get human input form preview for workflow */ -export const post47 = oc +export const post43 = oc .route({ description: 'Get human input form preview for workflow', inputStructure: 'detailed', @@ -3338,133 +3117,27 @@ export const post47 = oc .output(zPostAppsByAppIdWorkflowsDraftHumanInputNodesByNodeIdFormPreviewResponse) export const preview3 = { - post: post47, -} - -/** - * Submit human input form preview - * - * Submit human input form preview for workflow - */ -export const post48 = oc - .route({ - description: 'Submit human input form preview for workflow', - inputStructure: 'detailed', - method: 'POST', - operationId: 'postAppsByAppIdWorkflowsDraftHumanInputNodesByNodeIdFormRun', - path: '/apps/{app_id}/workflows/draft/human-input/nodes/{node_id}/form/run', - summary: 'Submit human input form preview', - tags: ['console'], - }) - .input( - z.object({ - body: zPostAppsByAppIdWorkflowsDraftHumanInputNodesByNodeIdFormRunBody, - params: zPostAppsByAppIdWorkflowsDraftHumanInputNodesByNodeIdFormRunPath, - }), - ) - .output(zPostAppsByAppIdWorkflowsDraftHumanInputNodesByNodeIdFormRunResponse) - -export const run5 = { - post: post48, + post: post43, } export const form2 = { preview: preview3, - run: run5, } -export const byNodeId5 = { +export const byNodeId3 = { deliveryTest, form: form2, } -export const nodes4 = { - byNodeId: byNodeId5, +export const nodes2 = { + byNodeId: byNodeId3, } export const humanInput2 = { - nodes: nodes4, + nodes: nodes2, } -/** - * Run draft workflow iteration node - * - * Run draft workflow iteration node - */ -export const post49 = oc - .route({ - description: 'Run draft workflow iteration node', - inputStructure: 'detailed', - method: 'POST', - operationId: 'postAppsByAppIdWorkflowsDraftIterationNodesByNodeIdRun', - path: '/apps/{app_id}/workflows/draft/iteration/nodes/{node_id}/run', - summary: 'Run draft workflow iteration node', - tags: ['console'], - }) - .input( - z.object({ - body: zPostAppsByAppIdWorkflowsDraftIterationNodesByNodeIdRunBody, - params: zPostAppsByAppIdWorkflowsDraftIterationNodesByNodeIdRunPath, - }), - ) - .output(zPostAppsByAppIdWorkflowsDraftIterationNodesByNodeIdRunResponse) - -export const run6 = { - post: post49, -} - -export const byNodeId6 = { - run: run6, -} - -export const nodes5 = { - byNodeId: byNodeId6, -} - -export const iteration2 = { - nodes: nodes5, -} - -/** - * Run draft workflow loop node - * - * Run draft workflow loop node - */ -export const post50 = oc - .route({ - description: 'Run draft workflow loop node', - inputStructure: 'detailed', - method: 'POST', - operationId: 'postAppsByAppIdWorkflowsDraftLoopNodesByNodeIdRun', - path: '/apps/{app_id}/workflows/draft/loop/nodes/{node_id}/run', - summary: 'Run draft workflow loop node', - tags: ['console'], - }) - .input( - z.object({ - body: zPostAppsByAppIdWorkflowsDraftLoopNodesByNodeIdRunBody, - params: zPostAppsByAppIdWorkflowsDraftLoopNodesByNodeIdRunPath, - }), - ) - .output(zPostAppsByAppIdWorkflowsDraftLoopNodesByNodeIdRunResponse) - -export const run7 = { - post: post50, -} - -export const byNodeId7 = { - run: run7, -} - -export const nodes6 = { - byNodeId: byNodeId7, -} - -export const loop2 = { - nodes: nodes6, -} - -export const get61 = oc +export const get59 = oc .route({ inputStructure: 'detailed', method: 'GET', @@ -3478,10 +3151,10 @@ export const get61 = oc .output(zGetAppsByAppIdWorkflowsDraftNodesByNodeIdAgentComposerCandidatesResponse) export const candidates = { - get: get61, + get: get59, } -export const post51 = oc +export const post44 = oc .route({ inputStructure: 'detailed', method: 'POST', @@ -3498,10 +3171,10 @@ export const post51 = oc .output(zPostAppsByAppIdWorkflowsDraftNodesByNodeIdAgentComposerCopyFromRosterResponse) export const copyFromRoster = { - post: post51, + post: post44, } -export const post52 = oc +export const post45 = oc .route({ inputStructure: 'detailed', method: 'POST', @@ -3518,10 +3191,10 @@ export const post52 = oc .output(zPostAppsByAppIdWorkflowsDraftNodesByNodeIdAgentComposerImpactResponse) export const impact = { - post: post52, + post: post45, } -export const post53 = oc +export const post46 = oc .route({ inputStructure: 'detailed', method: 'POST', @@ -3538,10 +3211,10 @@ export const post53 = oc .output(zPostAppsByAppIdWorkflowsDraftNodesByNodeIdAgentComposerSaveToRosterResponse) export const saveToRoster = { - post: post53, + post: post46, } -export const post54 = oc +export const post47 = oc .route({ inputStructure: 'detailed', method: 'POST', @@ -3558,10 +3231,10 @@ export const post54 = oc .output(zPostAppsByAppIdWorkflowsDraftNodesByNodeIdAgentComposerValidateResponse) export const validate = { - post: post54, + post: post47, } -export const get62 = oc +export const get60 = oc .route({ inputStructure: 'detailed', method: 'GET', @@ -3589,7 +3262,7 @@ export const put4 = oc .output(zPutAppsByAppIdWorkflowsDraftNodesByNodeIdAgentComposerResponse) export const agentComposer = { - get: get62, + get: get60, put: put4, candidates, copyFromRoster, @@ -3601,7 +3274,7 @@ export const agentComposer = { /** * Get last run result for draft workflow node */ -export const get63 = oc +export const get61 = oc .route({ description: 'Get last run result for draft workflow node', inputStructure: 'detailed', @@ -3614,7 +3287,7 @@ export const get63 = oc .output(zGetAppsByAppIdWorkflowsDraftNodesByNodeIdLastRunResponse) export const lastRun = { - get: get63, + get: get61, } /** @@ -3622,7 +3295,7 @@ export const lastRun = { * * Run draft workflow node */ -export const post55 = oc +export const post48 = oc .route({ description: 'Run draft workflow node', inputStructure: 'detailed', @@ -3640,8 +3313,8 @@ export const post55 = oc ) .output(zPostAppsByAppIdWorkflowsDraftNodesByNodeIdRunResponse) -export const run8 = { - post: post55, +export const run = { + post: post48, } /** @@ -3649,7 +3322,7 @@ export const run8 = { * * Poll for trigger events and execute single node when event arrives */ -export const post56 = oc +export const post49 = oc .route({ description: 'Poll for trigger events and execute single node when event arrives', inputStructure: 'detailed', @@ -3662,12 +3335,12 @@ export const post56 = oc .input(z.object({ params: zPostAppsByAppIdWorkflowsDraftNodesByNodeIdTriggerRunPath })) .output(zPostAppsByAppIdWorkflowsDraftNodesByNodeIdTriggerRunResponse) -export const run9 = { - post: post56, +export const run2 = { + post: post49, } export const trigger = { - run: run9, + run: run2, } /** @@ -3689,7 +3362,7 @@ export const delete11 = oc /** * Get variables for a specific node */ -export const get64 = oc +export const get62 = oc .route({ description: 'Get variables for a specific node', inputStructure: 'detailed', @@ -3703,52 +3376,25 @@ export const get64 = oc export const variables = { delete: delete11, - get: get64, + get: get62, } -export const byNodeId8 = { +export const byNodeId4 = { agentComposer, lastRun, - run: run8, + run, trigger, variables, } -export const nodes7 = { - byNodeId: byNodeId8, -} - -/** - * Run draft workflow - * - * Run draft workflow - */ -export const post57 = oc - .route({ - description: 'Run draft workflow', - inputStructure: 'detailed', - method: 'POST', - operationId: 'postAppsByAppIdWorkflowsDraftRun', - path: '/apps/{app_id}/workflows/draft/run', - summary: 'Run draft workflow', - tags: ['console'], - }) - .input( - z.object({ - body: zPostAppsByAppIdWorkflowsDraftRunBody, - params: zPostAppsByAppIdWorkflowsDraftRunPath, - }), - ) - .output(zPostAppsByAppIdWorkflowsDraftRunResponse) - -export const run10 = { - post: post57, +export const nodes3 = { + byNodeId: byNodeId4, } /** * Server-Sent Events stream of inspector deltas for a draft workflow run. */ -export const get65 = oc +export const get63 = oc .route({ description: 'Server-Sent Events stream of inspector deltas for a draft workflow run.', inputStructure: 'detailed', @@ -3761,13 +3407,13 @@ export const get65 = oc .output(zGetAppsByAppIdWorkflowsDraftRunsByRunIdNodeOutputsEventsResponse) export const events = { - get: get65, + get: get63, } /** * Full value for one declared output, including signed download URL for files. */ -export const get66 = oc +export const get64 = oc .route({ description: 'Full value for one declared output, including signed download URL for files.', inputStructure: 'detailed', @@ -3784,7 +3430,7 @@ export const get66 = oc .output(zGetAppsByAppIdWorkflowsDraftRunsByRunIdNodeOutputsByNodeIdByOutputNamePreviewResponse) export const preview4 = { - get: get66, + get: get64, } export const byOutputName = { @@ -3794,7 +3440,7 @@ export const byOutputName = { /** * One node's declared outputs for a draft workflow run. */ -export const get67 = oc +export const get65 = oc .route({ description: 'One node\'s declared outputs for a draft workflow run.', inputStructure: 'detailed', @@ -3806,15 +3452,15 @@ export const get67 = oc .input(z.object({ params: zGetAppsByAppIdWorkflowsDraftRunsByRunIdNodeOutputsByNodeIdPath })) .output(zGetAppsByAppIdWorkflowsDraftRunsByRunIdNodeOutputsByNodeIdResponse) -export const byNodeId9 = { - get: get67, +export const byNodeId5 = { + get: get65, byOutputName, } /** * Snapshot of every node's declared outputs for a draft workflow run. */ -export const get68 = oc +export const get66 = oc .route({ description: 'Snapshot of every node\'s declared outputs for a draft workflow run.', inputStructure: 'detailed', @@ -3827,9 +3473,9 @@ export const get68 = oc .output(zGetAppsByAppIdWorkflowsDraftRunsByRunIdNodeOutputsResponse) export const nodeOutputs = { - get: get68, + get: get66, events, - byNodeId: byNodeId9, + byNodeId: byNodeId5, } export const byRunId2 = { @@ -3843,7 +3489,7 @@ export const runs = { /** * Get system variables for workflow */ -export const get69 = oc +export const get67 = oc .route({ description: 'Get system variables for workflow', inputStructure: 'detailed', @@ -3856,66 +3502,7 @@ export const get69 = oc .output(zGetAppsByAppIdWorkflowsDraftSystemVariablesResponse) export const systemVariables = { - get: get69, -} - -/** - * Poll for trigger events and execute full workflow when event arrives - * - * Poll for trigger events and execute full workflow when event arrives - */ -export const post58 = oc - .route({ - description: 'Poll for trigger events and execute full workflow when event arrives', - inputStructure: 'detailed', - method: 'POST', - operationId: 'postAppsByAppIdWorkflowsDraftTriggerRun', - path: '/apps/{app_id}/workflows/draft/trigger/run', - summary: 'Poll for trigger events and execute full workflow when event arrives', - tags: ['console'], - }) - .input( - z.object({ - body: zPostAppsByAppIdWorkflowsDraftTriggerRunBody, - params: zPostAppsByAppIdWorkflowsDraftTriggerRunPath, - }), - ) - .output(zPostAppsByAppIdWorkflowsDraftTriggerRunResponse) - -export const run11 = { - post: post58, -} - -/** - * Full workflow debug when the start node is a trigger - * - * Full workflow debug when the start node is a trigger - */ -export const post59 = oc - .route({ - description: 'Full workflow debug when the start node is a trigger', - inputStructure: 'detailed', - method: 'POST', - operationId: 'postAppsByAppIdWorkflowsDraftTriggerRunAll', - path: '/apps/{app_id}/workflows/draft/trigger/run-all', - summary: 'Full workflow debug when the start node is a trigger', - tags: ['console'], - }) - .input( - z.object({ - body: zPostAppsByAppIdWorkflowsDraftTriggerRunAllBody, - params: zPostAppsByAppIdWorkflowsDraftTriggerRunAllPath, - }), - ) - .output(zPostAppsByAppIdWorkflowsDraftTriggerRunAllResponse) - -export const runAll = { - post: post59, -} - -export const trigger2 = { - run: run11, - runAll, + get: get67, } /** @@ -3956,7 +3543,7 @@ export const delete12 = oc /** * Get a specific workflow variable */ -export const get70 = oc +export const get68 = oc .route({ description: 'Get a specific workflow variable', inputStructure: 'detailed', @@ -3990,7 +3577,7 @@ export const patch2 = oc export const byVariableId = { delete: delete12, - get: get70, + get: get68, patch: patch2, reset, } @@ -4016,7 +3603,7 @@ export const delete13 = oc * * Get draft workflow variables */ -export const get71 = oc +export const get69 = oc .route({ description: 'Get draft workflow variables', inputStructure: 'detailed', @@ -4036,7 +3623,7 @@ export const get71 = oc export const variables2 = { delete: delete13, - get: get71, + get: get69, byVariableId, } @@ -4045,7 +3632,7 @@ export const variables2 = { * * Get draft workflow for an application */ -export const get72 = oc +export const get70 = oc .route({ description: 'Get draft workflow for an application', inputStructure: 'detailed', @@ -4063,7 +3650,7 @@ export const get72 = oc * * Sync draft workflow configuration */ -export const post60 = oc +export const post50 = oc .route({ description: 'Sync draft workflow configuration', inputStructure: 'detailed', @@ -4082,19 +3669,15 @@ export const post60 = oc .output(zPostAppsByAppIdWorkflowsDraftResponse) export const draft2 = { - get: get72, - post: post60, + get: get70, + post: post50, conversationVariables: conversationVariables2, environmentVariables, features, humanInput: humanInput2, - iteration: iteration2, - loop: loop2, - nodes: nodes7, - run: run10, + nodes: nodes3, runs, systemVariables, - trigger: trigger2, variables: variables2, } @@ -4103,7 +3686,7 @@ export const draft2 = { * * Get published workflow for an application */ -export const get73 = oc +export const get71 = oc .route({ description: 'Get published workflow for an application', inputStructure: 'detailed', @@ -4119,7 +3702,7 @@ export const get73 = oc /** * Publish workflow */ -export const post61 = oc +export const post51 = oc .route({ inputStructure: 'detailed', method: 'POST', @@ -4137,14 +3720,14 @@ export const post61 = oc .output(zPostAppsByAppIdWorkflowsPublishResponse) export const publish = { - get: get73, - post: post61, + get: get71, + post: post51, } /** * Server-Sent Events stream of inspector deltas for a published workflow run. */ -export const get74 = oc +export const get72 = oc .route({ description: 'Server-Sent Events stream of inspector deltas for a published workflow run.', inputStructure: 'detailed', @@ -4157,13 +3740,13 @@ export const get74 = oc .output(zGetAppsByAppIdWorkflowsPublishedRunsByRunIdNodeOutputsEventsResponse) export const events2 = { - get: get74, + get: get72, } /** * Full value for one declared output of a published run. */ -export const get75 = oc +export const get73 = oc .route({ description: 'Full value for one declared output of a published run.', inputStructure: 'detailed', @@ -4184,7 +3767,7 @@ export const get75 = oc ) export const preview5 = { - get: get75, + get: get73, } export const byOutputName2 = { @@ -4194,7 +3777,7 @@ export const byOutputName2 = { /** * One node's declared outputs for a published workflow run. */ -export const get76 = oc +export const get74 = oc .route({ description: 'One node\'s declared outputs for a published workflow run.', inputStructure: 'detailed', @@ -4206,15 +3789,15 @@ export const get76 = oc .input(z.object({ params: zGetAppsByAppIdWorkflowsPublishedRunsByRunIdNodeOutputsByNodeIdPath })) .output(zGetAppsByAppIdWorkflowsPublishedRunsByRunIdNodeOutputsByNodeIdResponse) -export const byNodeId10 = { - get: get76, +export const byNodeId6 = { + get: get74, byOutputName: byOutputName2, } /** * Snapshot of every node's declared outputs for a published workflow run. */ -export const get77 = oc +export const get75 = oc .route({ description: 'Snapshot of every node\'s declared outputs for a published workflow run.', inputStructure: 'detailed', @@ -4227,9 +3810,9 @@ export const get77 = oc .output(zGetAppsByAppIdWorkflowsPublishedRunsByRunIdNodeOutputsResponse) export const nodeOutputs2 = { - get: get77, + get: get75, events: events2, - byNodeId: byNodeId10, + byNodeId: byNodeId6, } export const byRunId3 = { @@ -4247,7 +3830,7 @@ export const published = { /** * Get webhook trigger for a node */ -export const get78 = oc +export const get76 = oc .route({ inputStructure: 'detailed', method: 'GET', @@ -4265,7 +3848,7 @@ export const get78 = oc .output(zGetAppsByAppIdWorkflowsTriggersWebhookResponse) export const webhook = { - get: get78, + get: get76, } export const triggers2 = { @@ -4275,7 +3858,7 @@ export const triggers2 = { /** * Restore a published workflow version into the draft workflow */ -export const post62 = oc +export const post52 = oc .route({ description: 'Restore a published workflow version into the draft workflow', inputStructure: 'detailed', @@ -4288,7 +3871,7 @@ export const post62 = oc .output(zPostAppsByAppIdWorkflowsByWorkflowIdRestoreResponse) export const restore = { - post: post62, + post: post52, } /** @@ -4341,7 +3924,7 @@ export const byWorkflowId = { * * Get all published workflows for an application */ -export const get79 = oc +export const get77 = oc .route({ description: 'Get all published workflows for an application', inputStructure: 'detailed', @@ -4360,8 +3943,7 @@ export const get79 = oc .output(zGetAppsByAppIdWorkflowsResponse) export const workflows3 = { - get: get79, - defaultWorkflowBlockConfigs, + get: get77, draft: draft2, publish, published, @@ -4393,7 +3975,7 @@ export const delete15 = oc * * Get application details */ -export const get80 = oc +export const get78 = oc .route({ description: 'Get application details', inputStructure: 'detailed', @@ -4426,7 +4008,7 @@ export const put6 = oc export const byAppId2 = { delete: delete15, - get: get80, + get: get78, put: put6, advancedChat, agent, @@ -4495,7 +4077,7 @@ export const byApiKeyId = { * * Get all API keys for an app */ -export const get81 = oc +export const get79 = oc .route({ description: 'Get all API keys for an app', inputStructure: 'detailed', @@ -4513,7 +4095,7 @@ export const get81 = oc * * Create a new API key for an app */ -export const post63 = oc +export const post53 = oc .route({ description: 'Create a new API key for an app', inputStructure: 'detailed', @@ -4528,8 +4110,8 @@ export const post63 = oc .output(zPostAppsByResourceIdApiKeysResponse) export const apiKeys = { - get: get81, - post: post63, + get: get79, + post: post53, byApiKeyId, } @@ -4540,7 +4122,7 @@ export const byResourceId = { /** * Refresh MCP server configuration and regenerate server code */ -export const get82 = oc +export const get80 = oc .route({ description: 'Refresh MCP server configuration and regenerate server code', inputStructure: 'detailed', @@ -4553,7 +4135,7 @@ export const get82 = oc .output(zGetAppsByServerIdServerRefreshResponse) export const refresh = { - get: get82, + get: get80, } export const server2 = { @@ -4569,7 +4151,7 @@ export const byServerId = { * * Get list of applications with pagination and filtering */ -export const get83 = oc +export const get81 = oc .route({ description: 'Get list of applications with pagination and filtering', inputStructure: 'detailed', @@ -4587,7 +4169,7 @@ export const get83 = oc * * Create a new application */ -export const post64 = oc +export const post54 = oc .route({ description: 'Create a new application', inputStructure: 'detailed', @@ -4602,8 +4184,8 @@ export const post64 = oc .output(zPostAppsResponse) export const apps = { - get: get83, - post: post64, + get: get81, + post: post54, imports, starred, workflows, diff --git a/packages/contracts/generated/api/console/apps/types.gen.ts b/packages/contracts/generated/api/console/apps/types.gen.ts index 9e79518f3cd..0b46ade7963 100644 --- a/packages/contracts/generated/api/console/apps/types.gen.ts +++ b/packages/contracts/generated/api/console/apps/types.gen.ts @@ -119,10 +119,9 @@ export type HumanInputFormPreviewPayload = { } export type HumanInputFormPreviewResponse = { - actions?: Array<{ - [key: string]: unknown - }> - display_in_ui?: boolean | null + TYPE?: 'human_input_required' + actions?: Array + display_in_ui?: boolean expiration_time?: number | null form_content: string form_id: string @@ -137,46 +136,6 @@ export type HumanInputFormPreviewResponse = { } } -export type HumanInputFormSubmitPayload = { - action: string - form_inputs: { - [key: string]: unknown - } - inputs: { - [key: string]: unknown - } -} - -export type HumanInputFormSubmitResponse = { - [key: string]: unknown -} - -export type IterationNodeRunPayload = { - inputs?: { - [key: string]: unknown - } | null -} - -export type GeneratedAppResponse = JsonValue - -export type LoopNodeRunPayload = { - inputs?: { - [key: string]: unknown - } | null -} - -export type AdvancedChatWorkflowRunPayload = { - conversation_id?: string | null - files?: Array<{ - [key: string]: unknown - }> | null - inputs?: { - [key: string]: unknown - } | null - parent_message_id?: string | null - query?: string -} - export type AgentDriveListResponse = { items?: Array } @@ -422,6 +381,8 @@ export type CompletionMessagePayload = { retriever_from?: string } +export type GeneratedAppResponse = JsonValue + export type PaginatedConversationVariableResponse = { data: Array has_more: boolean @@ -731,7 +692,7 @@ export type WorkflowRunPaginationResponse = { export type WorkflowRunDetailResponse = { created_at?: number | null - created_by_account?: SimpleAccount | null + created_by_account?: SimpleAccountResponse | null created_by_end_user?: SimpleEndUser | null created_by_role?: string | null elapsed_time?: number | null @@ -799,7 +760,7 @@ export type WorkflowCommentCreate = { } export type WorkflowCommentMentionUsersPayload = { - users: Array + users: Array } export type WorkflowCommentDetail = { @@ -876,18 +837,10 @@ export type WorkflowPaginationResponse = { page: number } -export type DefaultBlockConfigsResponse = Array<{ - [key: string]: unknown -}> - -export type DefaultBlockConfigResponse = { - [key: string]: unknown -} - export type WorkflowResponse = { conversation_variables: Array created_at: number - created_by?: SimpleAccount | null + created_by?: SimpleAccountResponse | null environment_variables: Array features: { [key: string]: unknown @@ -902,7 +855,7 @@ export type WorkflowResponse = { rag_pipeline_variables: Array tool_published: boolean updated_at: number - updated_by?: SimpleAccount | null + updated_by?: SimpleAccountResponse | null version: string } @@ -923,9 +876,9 @@ export type SyncDraftWorkflowPayload = { } export type SyncDraftWorkflowResponse = { - hash?: string - result?: string - updated_at?: string + hash: string + result: string + updated_at: number } export type WorkflowDraftVariableList = { @@ -961,7 +914,7 @@ export type HumanInputDeliveryTestPayload = { } } -export type EmptyObjectResponse = { +export type HumanInputDeliveryTestResponse = { [key: string]: unknown } @@ -1029,7 +982,7 @@ export type AgentComposerValidateResponse = { export type WorkflowRunNodeExecutionResponse = { created_at?: number | null - created_by_account?: SimpleAccount | null + created_by_account?: SimpleAccountResponse | null created_by_end_user?: SimpleEndUser | null created_by_role?: string | null elapsed_time?: number | null @@ -1062,17 +1015,6 @@ export type DraftWorkflowNodeRunPayload = { query?: string } -export type DraftWorkflowRunPayload = { - datasource_info_list: Array<{ - [key: string]: unknown - }> - datasource_type: string - inputs: { - [key: string]: unknown - } - start_node_id: string -} - export type WorkflowRunSnapshotView = { node_outputs?: Array workflow_run_id: string @@ -1099,14 +1041,6 @@ export type OutputPreviewView = { value?: unknown } -export type DraftWorkflowTriggerRunRequest = { - node_id: string -} - -export type DraftWorkflowTriggerRunAllPayload = { - node_ids: Array -} - export type WorkflowDraftVariableListWithoutValue = { items?: Array total?: number @@ -1143,12 +1077,11 @@ export type WorkflowDraftVariableUpdatePayload = { } export type PublishWorkflowPayload = { - knowledge_base_setting?: { - [key: string]: unknown - } | null + marked_comment?: string | null + marked_name?: string | null } -export type WorkflowPublishResponse = { +export type PublishWorkflowResponse = { created_at: number result: string } @@ -1167,12 +1100,6 @@ export type WorkflowUpdatePayload = { marked_name?: string | null } -export type WorkflowRestoreResponse = { - hash: string - result: string - updated_at: number -} - export type ApiKeyList = { data: Array } @@ -1223,12 +1150,30 @@ export type DeletedTool = { } export type ModelConfig = { - completion_params?: { - [key: string]: unknown - } - mode: LlmMode - name: string - provider: string + agent_mode?: JsonValue | null + annotation_reply?: JsonValue | null + chat_prompt_config?: JsonValue | null + completion_prompt_config?: JsonValue | null + created_at?: number | null + created_by?: string | null + dataset_configs?: JsonValue | null + dataset_query_variable?: string | null + external_data_tools?: JsonValue | null + file_upload?: JsonValue | null + model?: JsonValue | null + more_like_this?: JsonValue | null + opening_statement?: string | null + pre_prompt?: string | null + prompt_type?: string | null + retriever_resource?: JsonValue | null + sensitive_word_avoidance?: JsonValue | null + speech_to_text?: JsonValue | null + suggested_questions?: JsonValue | null + suggested_questions_after_answer?: JsonValue | null + text_to_speech?: JsonValue | null + updated_at?: number | null + updated_by?: string | null + user_input_form?: JsonValue | null } export type Site = { @@ -1254,16 +1199,7 @@ export type Tag = { type: string } -export type JsonValue - = | string - | number - | number - | boolean - | { - [key: string]: unknown - } - | Array - | null +export type JsonValue = unknown export type WorkflowPartial = { created_at?: number | null @@ -1289,7 +1225,7 @@ export type WorkflowOnlineUsersByApp = { export type AdvancedChatWorkflowRunForListResponse = { conversation_id?: string | null created_at?: number | null - created_by_account?: SimpleAccount | null + created_by_account?: SimpleAccountResponse | null elapsed_time?: number | null exceptions_count?: number | null finished_at?: number | null @@ -1302,6 +1238,12 @@ export type AdvancedChatWorkflowRunForListResponse = { version?: string | null } +export type HumanInputUserActionResponse = { + button_style?: string + id: string + title: string +} + export type AgentDriveItemResponse = { created_at?: number | null file_kind: string @@ -1596,7 +1538,7 @@ export type UserSatisfactionRateStatisticItem = { export type WorkflowAppLogPartialResponse = { created_at?: number | null - created_by_account?: SimpleAccount | null + created_by_account?: SimpleAccountResponse | null created_by_end_user?: SimpleEndUser | null created_by_role?: string | null created_from?: string | null @@ -1607,7 +1549,7 @@ export type WorkflowAppLogPartialResponse = { export type WorkflowArchivedLogPartialResponse = { created_at?: number | null - created_by_account?: SimpleAccount | null + created_by_account?: SimpleAccountResponse | null created_by_end_user?: SimpleEndUser | null id: string trigger_metadata?: unknown @@ -1616,7 +1558,7 @@ export type WorkflowArchivedLogPartialResponse = { export type WorkflowRunForListResponse = { created_at?: number | null - created_by_account?: SimpleAccount | null + created_by_account?: SimpleAccountResponse | null elapsed_time?: number | null exceptions_count?: number | null finished_at?: number | null @@ -1628,7 +1570,7 @@ export type WorkflowRunForListResponse = { version?: string | null } -export type SimpleAccount = { +export type SimpleAccountResponse = { email: string id: string name: string @@ -1671,7 +1613,7 @@ export type WorkflowCommentBasic = { updated_at?: number | null } -export type AccountWithRole = { +export type AccountWithRoleResponse = { avatar?: string | null created_at?: number | null email: string @@ -1982,8 +1924,6 @@ export type ModelConfigPartial = { updated_by?: string | null } -export type LlmMode = 'chat' | 'completion' - export type Type = 'github' | 'marketplace' | 'package' export type Github = { @@ -2054,6 +1994,12 @@ export type SimpleMessageDetail = { query: string } +export type SimpleAccount = { + email: string + id: string + name: string +} + export type HumanInputFormDefinition = { actions?: Array display_in_ui?: boolean @@ -2654,6 +2600,10 @@ export type WorkflowCommentDetailWritable = { updated_at?: number | null } +export type HumanInputDeliveryTestResponseWritable = { + [key: string]: unknown +} + export type AppPartialWritable = { access_mode?: string | null app_id?: string | null @@ -2999,88 +2949,6 @@ export type PostAppsByAppIdAdvancedChatWorkflowsDraftHumanInputNodesByNodeIdForm export type PostAppsByAppIdAdvancedChatWorkflowsDraftHumanInputNodesByNodeIdFormPreviewResponse = PostAppsByAppIdAdvancedChatWorkflowsDraftHumanInputNodesByNodeIdFormPreviewResponses[keyof PostAppsByAppIdAdvancedChatWorkflowsDraftHumanInputNodesByNodeIdFormPreviewResponses] -export type PostAppsByAppIdAdvancedChatWorkflowsDraftHumanInputNodesByNodeIdFormRunData = { - body: HumanInputFormSubmitPayload - path: { - app_id: string - node_id: string - } - query?: never - url: '/apps/{app_id}/advanced-chat/workflows/draft/human-input/nodes/{node_id}/form/run' -} - -export type PostAppsByAppIdAdvancedChatWorkflowsDraftHumanInputNodesByNodeIdFormRunResponses = { - 200: HumanInputFormSubmitResponse -} - -export type PostAppsByAppIdAdvancedChatWorkflowsDraftHumanInputNodesByNodeIdFormRunResponse - = PostAppsByAppIdAdvancedChatWorkflowsDraftHumanInputNodesByNodeIdFormRunResponses[keyof PostAppsByAppIdAdvancedChatWorkflowsDraftHumanInputNodesByNodeIdFormRunResponses] - -export type PostAppsByAppIdAdvancedChatWorkflowsDraftIterationNodesByNodeIdRunData = { - body: IterationNodeRunPayload - path: { - app_id: string - node_id: string - } - query?: never - url: '/apps/{app_id}/advanced-chat/workflows/draft/iteration/nodes/{node_id}/run' -} - -export type PostAppsByAppIdAdvancedChatWorkflowsDraftIterationNodesByNodeIdRunErrors = { - 403: unknown - 404: unknown -} - -export type PostAppsByAppIdAdvancedChatWorkflowsDraftIterationNodesByNodeIdRunResponses = { - 200: GeneratedAppResponse -} - -export type PostAppsByAppIdAdvancedChatWorkflowsDraftIterationNodesByNodeIdRunResponse - = PostAppsByAppIdAdvancedChatWorkflowsDraftIterationNodesByNodeIdRunResponses[keyof PostAppsByAppIdAdvancedChatWorkflowsDraftIterationNodesByNodeIdRunResponses] - -export type PostAppsByAppIdAdvancedChatWorkflowsDraftLoopNodesByNodeIdRunData = { - body: LoopNodeRunPayload - path: { - app_id: string - node_id: string - } - query?: never - url: '/apps/{app_id}/advanced-chat/workflows/draft/loop/nodes/{node_id}/run' -} - -export type PostAppsByAppIdAdvancedChatWorkflowsDraftLoopNodesByNodeIdRunErrors = { - 403: unknown - 404: unknown -} - -export type PostAppsByAppIdAdvancedChatWorkflowsDraftLoopNodesByNodeIdRunResponses = { - 200: GeneratedAppResponse -} - -export type PostAppsByAppIdAdvancedChatWorkflowsDraftLoopNodesByNodeIdRunResponse - = PostAppsByAppIdAdvancedChatWorkflowsDraftLoopNodesByNodeIdRunResponses[keyof PostAppsByAppIdAdvancedChatWorkflowsDraftLoopNodesByNodeIdRunResponses] - -export type PostAppsByAppIdAdvancedChatWorkflowsDraftRunData = { - body: AdvancedChatWorkflowRunPayload - path: { - app_id: string - } - query?: never - url: '/apps/{app_id}/advanced-chat/workflows/draft/run' -} - -export type PostAppsByAppIdAdvancedChatWorkflowsDraftRunErrors = { - 400: unknown - 403: unknown -} - -export type PostAppsByAppIdAdvancedChatWorkflowsDraftRunResponses = { - 200: GeneratedAppResponse -} - -export type PostAppsByAppIdAdvancedChatWorkflowsDraftRunResponse - = PostAppsByAppIdAdvancedChatWorkflowsDraftRunResponses[keyof PostAppsByAppIdAdvancedChatWorkflowsDraftRunResponses] - export type GetAppsByAppIdAgentDriveFilesData = { body?: never path: { @@ -5114,45 +4982,6 @@ export type GetAppsByAppIdWorkflowsResponses = { export type GetAppsByAppIdWorkflowsResponse = GetAppsByAppIdWorkflowsResponses[keyof GetAppsByAppIdWorkflowsResponses] -export type GetAppsByAppIdWorkflowsDefaultWorkflowBlockConfigsData = { - body?: never - path: { - app_id: string - } - query?: never - url: '/apps/{app_id}/workflows/default-workflow-block-configs' -} - -export type GetAppsByAppIdWorkflowsDefaultWorkflowBlockConfigsResponses = { - 200: DefaultBlockConfigsResponse -} - -export type GetAppsByAppIdWorkflowsDefaultWorkflowBlockConfigsResponse - = GetAppsByAppIdWorkflowsDefaultWorkflowBlockConfigsResponses[keyof GetAppsByAppIdWorkflowsDefaultWorkflowBlockConfigsResponses] - -export type GetAppsByAppIdWorkflowsDefaultWorkflowBlockConfigsByBlockTypeData = { - body?: never - path: { - app_id: string - block_type: string - } - query?: { - q?: string - } - url: '/apps/{app_id}/workflows/default-workflow-block-configs/{block_type}' -} - -export type GetAppsByAppIdWorkflowsDefaultWorkflowBlockConfigsByBlockTypeErrors = { - 404: unknown -} - -export type GetAppsByAppIdWorkflowsDefaultWorkflowBlockConfigsByBlockTypeResponses = { - 200: DefaultBlockConfigResponse -} - -export type GetAppsByAppIdWorkflowsDefaultWorkflowBlockConfigsByBlockTypeResponse - = GetAppsByAppIdWorkflowsDefaultWorkflowBlockConfigsByBlockTypeResponses[keyof GetAppsByAppIdWorkflowsDefaultWorkflowBlockConfigsByBlockTypeResponses] - export type GetAppsByAppIdWorkflowsDraftData = { body?: never path: { @@ -5293,7 +5122,7 @@ export type PostAppsByAppIdWorkflowsDraftHumanInputNodesByNodeIdDeliveryTestData } export type PostAppsByAppIdWorkflowsDraftHumanInputNodesByNodeIdDeliveryTestResponses = { - 200: EmptyObjectResponse + 200: HumanInputDeliveryTestResponse } export type PostAppsByAppIdWorkflowsDraftHumanInputNodesByNodeIdDeliveryTestResponse @@ -5316,67 +5145,6 @@ export type PostAppsByAppIdWorkflowsDraftHumanInputNodesByNodeIdFormPreviewRespo export type PostAppsByAppIdWorkflowsDraftHumanInputNodesByNodeIdFormPreviewResponse = PostAppsByAppIdWorkflowsDraftHumanInputNodesByNodeIdFormPreviewResponses[keyof PostAppsByAppIdWorkflowsDraftHumanInputNodesByNodeIdFormPreviewResponses] -export type PostAppsByAppIdWorkflowsDraftHumanInputNodesByNodeIdFormRunData = { - body: HumanInputFormSubmitPayload - path: { - app_id: string - node_id: string - } - query?: never - url: '/apps/{app_id}/workflows/draft/human-input/nodes/{node_id}/form/run' -} - -export type PostAppsByAppIdWorkflowsDraftHumanInputNodesByNodeIdFormRunResponses = { - 200: HumanInputFormSubmitResponse -} - -export type PostAppsByAppIdWorkflowsDraftHumanInputNodesByNodeIdFormRunResponse - = PostAppsByAppIdWorkflowsDraftHumanInputNodesByNodeIdFormRunResponses[keyof PostAppsByAppIdWorkflowsDraftHumanInputNodesByNodeIdFormRunResponses] - -export type PostAppsByAppIdWorkflowsDraftIterationNodesByNodeIdRunData = { - body: IterationNodeRunPayload - path: { - app_id: string - node_id: string - } - query?: never - url: '/apps/{app_id}/workflows/draft/iteration/nodes/{node_id}/run' -} - -export type PostAppsByAppIdWorkflowsDraftIterationNodesByNodeIdRunErrors = { - 403: unknown - 404: unknown -} - -export type PostAppsByAppIdWorkflowsDraftIterationNodesByNodeIdRunResponses = { - 200: GeneratedAppResponse -} - -export type PostAppsByAppIdWorkflowsDraftIterationNodesByNodeIdRunResponse - = PostAppsByAppIdWorkflowsDraftIterationNodesByNodeIdRunResponses[keyof PostAppsByAppIdWorkflowsDraftIterationNodesByNodeIdRunResponses] - -export type PostAppsByAppIdWorkflowsDraftLoopNodesByNodeIdRunData = { - body: LoopNodeRunPayload - path: { - app_id: string - node_id: string - } - query?: never - url: '/apps/{app_id}/workflows/draft/loop/nodes/{node_id}/run' -} - -export type PostAppsByAppIdWorkflowsDraftLoopNodesByNodeIdRunErrors = { - 403: unknown - 404: unknown -} - -export type PostAppsByAppIdWorkflowsDraftLoopNodesByNodeIdRunResponses = { - 200: GeneratedAppResponse -} - -export type PostAppsByAppIdWorkflowsDraftLoopNodesByNodeIdRunResponse - = PostAppsByAppIdWorkflowsDraftLoopNodesByNodeIdRunResponses[keyof PostAppsByAppIdWorkflowsDraftLoopNodesByNodeIdRunResponses] - export type GetAppsByAppIdWorkflowsDraftNodesByNodeIdAgentComposerData = { body?: never path: { @@ -5556,7 +5324,7 @@ export type PostAppsByAppIdWorkflowsDraftNodesByNodeIdTriggerRunErrors = { } export type PostAppsByAppIdWorkflowsDraftNodesByNodeIdTriggerRunResponses = { - 200: GeneratedAppResponse + 200: WorkflowRunNodeExecutionResponse } export type PostAppsByAppIdWorkflowsDraftNodesByNodeIdTriggerRunResponse @@ -5596,26 +5364,6 @@ export type GetAppsByAppIdWorkflowsDraftNodesByNodeIdVariablesResponses = { export type GetAppsByAppIdWorkflowsDraftNodesByNodeIdVariablesResponse = GetAppsByAppIdWorkflowsDraftNodesByNodeIdVariablesResponses[keyof GetAppsByAppIdWorkflowsDraftNodesByNodeIdVariablesResponses] -export type PostAppsByAppIdWorkflowsDraftRunData = { - body: DraftWorkflowRunPayload - path: { - app_id: string - } - query?: never - url: '/apps/{app_id}/workflows/draft/run' -} - -export type PostAppsByAppIdWorkflowsDraftRunErrors = { - 403: unknown -} - -export type PostAppsByAppIdWorkflowsDraftRunResponses = { - 200: GeneratedAppResponse -} - -export type PostAppsByAppIdWorkflowsDraftRunResponse - = PostAppsByAppIdWorkflowsDraftRunResponses[keyof PostAppsByAppIdWorkflowsDraftRunResponses] - export type GetAppsByAppIdWorkflowsDraftRunsByRunIdNodeOutputsData = { body?: never path: { @@ -5720,48 +5468,6 @@ export type GetAppsByAppIdWorkflowsDraftSystemVariablesResponses = { export type GetAppsByAppIdWorkflowsDraftSystemVariablesResponse = GetAppsByAppIdWorkflowsDraftSystemVariablesResponses[keyof GetAppsByAppIdWorkflowsDraftSystemVariablesResponses] -export type PostAppsByAppIdWorkflowsDraftTriggerRunData = { - body: DraftWorkflowTriggerRunRequest - path: { - app_id: string - } - query?: never - url: '/apps/{app_id}/workflows/draft/trigger/run' -} - -export type PostAppsByAppIdWorkflowsDraftTriggerRunErrors = { - 403: unknown - 500: unknown -} - -export type PostAppsByAppIdWorkflowsDraftTriggerRunResponses = { - 200: GeneratedAppResponse -} - -export type PostAppsByAppIdWorkflowsDraftTriggerRunResponse - = PostAppsByAppIdWorkflowsDraftTriggerRunResponses[keyof PostAppsByAppIdWorkflowsDraftTriggerRunResponses] - -export type PostAppsByAppIdWorkflowsDraftTriggerRunAllData = { - body: DraftWorkflowTriggerRunAllPayload - path: { - app_id: string - } - query?: never - url: '/apps/{app_id}/workflows/draft/trigger/run-all' -} - -export type PostAppsByAppIdWorkflowsDraftTriggerRunAllErrors = { - 403: unknown - 500: unknown -} - -export type PostAppsByAppIdWorkflowsDraftTriggerRunAllResponses = { - 200: GeneratedAppResponse -} - -export type PostAppsByAppIdWorkflowsDraftTriggerRunAllResponse - = PostAppsByAppIdWorkflowsDraftTriggerRunAllResponses[keyof PostAppsByAppIdWorkflowsDraftTriggerRunAllResponses] - export type DeleteAppsByAppIdWorkflowsDraftVariablesData = { body?: never path: { @@ -5908,7 +5614,7 @@ export type PostAppsByAppIdWorkflowsPublishData = { } export type PostAppsByAppIdWorkflowsPublishResponses = { - 200: WorkflowPublishResponse + 200: PublishWorkflowResponse } export type PostAppsByAppIdWorkflowsPublishResponse @@ -6077,7 +5783,7 @@ export type PostAppsByAppIdWorkflowsByWorkflowIdRestoreErrors = { } export type PostAppsByAppIdWorkflowsByWorkflowIdRestoreResponses = { - 200: WorkflowRestoreResponse + 200: SyncDraftWorkflowResponse } export type PostAppsByAppIdWorkflowsByWorkflowIdRestoreResponse diff --git a/packages/contracts/generated/api/console/apps/zod.gen.ts b/packages/contracts/generated/api/console/apps/zod.gen.ts index 9b86fda0a62..0103748ec7d 100644 --- a/packages/contracts/generated/api/console/apps/zod.gen.ts +++ b/packages/contracts/generated/api/console/apps/zod.gen.ts @@ -43,61 +43,6 @@ export const zHumanInputFormPreviewPayload = z.object({ inputs: z.record(z.string(), z.unknown()).optional(), }) -/** - * HumanInputFormPreviewResponse - */ -export const zHumanInputFormPreviewResponse = z.object({ - actions: z.array(z.record(z.string(), z.unknown())).optional(), - display_in_ui: z.boolean().nullish(), - expiration_time: z.int().nullish(), - form_content: z.string(), - form_id: z.string(), - form_token: z.string().nullish(), - inputs: z.array(z.record(z.string(), z.unknown())).optional(), - node_id: z.string(), - node_title: z.string(), - resolved_default_values: z.record(z.string(), z.unknown()).optional(), -}) - -/** - * HumanInputFormSubmitPayload - */ -export const zHumanInputFormSubmitPayload = z.object({ - action: z.string(), - form_inputs: z.record(z.string(), z.unknown()), - inputs: z.record(z.string(), z.unknown()), -}) - -/** - * HumanInputFormSubmitResponse - */ -export const zHumanInputFormSubmitResponse = z.record(z.string(), z.unknown()) - -/** - * IterationNodeRunPayload - */ -export const zIterationNodeRunPayload = z.object({ - inputs: z.record(z.string(), z.unknown()).nullish(), -}) - -/** - * LoopNodeRunPayload - */ -export const zLoopNodeRunPayload = z.object({ - inputs: z.record(z.string(), z.unknown()).nullish(), -}) - -/** - * AdvancedChatWorkflowRunPayload - */ -export const zAdvancedChatWorkflowRunPayload = z.object({ - conversation_id: z.string().nullish(), - files: z.array(z.record(z.string(), z.unknown())).nullish(), - inputs: z.record(z.string(), z.unknown()).nullish(), - parent_message_id: z.string().nullish(), - query: z.string().optional().default(''), -}) - /** * AgentDriveDownloadResponse */ @@ -581,16 +526,6 @@ export const zWorkflowCommentResolve = z.object({ resolved_by: z.string().nullish(), }) -/** - * DefaultBlockConfigsResponse - */ -export const zDefaultBlockConfigsResponse = z.array(z.record(z.string(), z.unknown())) - -/** - * DefaultBlockConfigResponse - */ -export const zDefaultBlockConfigResponse = z.record(z.string(), z.unknown()) - /** * SyncDraftWorkflowPayload */ @@ -602,10 +537,13 @@ export const zSyncDraftWorkflowPayload = z.object({ hash: z.string().nullish(), }) +/** + * SyncDraftWorkflowResponse + */ export const zSyncDraftWorkflowResponse = z.object({ - hash: z.string().optional(), - result: z.string().optional(), - updated_at: z.string().optional(), + hash: z.string(), + result: z.string(), + updated_at: z.int(), }) /** @@ -638,9 +576,9 @@ export const zHumanInputDeliveryTestPayload = z.object({ }) /** - * EmptyObjectResponse + * HumanInputDeliveryTestResponse */ -export const zEmptyObjectResponse = z.record(z.string(), z.unknown()) +export const zHumanInputDeliveryTestResponse = z.record(z.string(), z.unknown()) /** * WorkflowComposerCopyFromRosterPayload @@ -660,32 +598,11 @@ export const zDraftWorkflowNodeRunPayload = z.object({ query: z.string().optional().default(''), }) -/** - * DraftWorkflowRunPayload - */ -export const zDraftWorkflowRunPayload = z.object({ - datasource_info_list: z.array(z.record(z.string(), z.unknown())), - datasource_type: z.string(), - inputs: z.record(z.string(), z.unknown()), - start_node_id: z.string(), -}) - /** * EventStreamResponse */ export const zEventStreamResponse = z.string() -export const zDraftWorkflowTriggerRunRequest = z.object({ - node_id: z.string(), -}) - -/** - * DraftWorkflowTriggerRunAllPayload - */ -export const zDraftWorkflowTriggerRunAllPayload = z.object({ - node_ids: z.array(z.string()), -}) - export const zWorkflowDraftVariable = z.object({ description: z.string().optional(), edited: z.boolean().optional(), @@ -723,17 +640,16 @@ export const zWorkflowDraftVariableUpdatePayload = z.object({ /** * PublishWorkflowPayload - * - * Payload for publishing snippet workflow. */ export const zPublishWorkflowPayload = z.object({ - knowledge_base_setting: z.record(z.string(), z.unknown()).nullish(), + marked_comment: z.string().max(100).nullish(), + marked_name: z.string().max(20).nullish(), }) /** - * WorkflowPublishResponse + * PublishWorkflowResponse */ -export const zWorkflowPublishResponse = z.object({ +export const zPublishWorkflowResponse = z.object({ created_at: z.int(), result: z.string(), }) @@ -758,15 +674,6 @@ export const zWorkflowUpdatePayload = z.object({ marked_name: z.string().max(20).nullish(), }) -/** - * WorkflowRestoreResponse - */ -export const zWorkflowRestoreResponse = z.object({ - hash: z.string(), - result: z.string(), - updated_at: z.int(), -}) - /** * ApiKeyItem */ @@ -873,22 +780,43 @@ export const zTag = z.object({ type: z.string(), }) -export const zJsonValue = z - .union([ - z.string(), - z.int(), - z.number(), - z.boolean(), - z.record(z.string(), z.unknown()), - z.array(z.unknown()), - ]) - .nullable() +export const zJsonValue = z.unknown() /** * GeneratedAppResponse */ export const zGeneratedAppResponse = zJsonValue +/** + * ModelConfig + */ +export const zModelConfig = z.object({ + agent_mode: zJsonValue.nullish(), + annotation_reply: zJsonValue.nullish(), + chat_prompt_config: zJsonValue.nullish(), + completion_prompt_config: zJsonValue.nullish(), + created_at: z.int().nullish(), + created_by: z.string().nullish(), + dataset_configs: zJsonValue.nullish(), + dataset_query_variable: z.string().nullish(), + external_data_tools: zJsonValue.nullish(), + file_upload: zJsonValue.nullish(), + model: zJsonValue.nullish(), + more_like_this: zJsonValue.nullish(), + opening_statement: z.string().nullish(), + pre_prompt: z.string().nullish(), + prompt_type: z.string().nullish(), + retriever_resource: zJsonValue.nullish(), + sensitive_word_avoidance: zJsonValue.nullish(), + speech_to_text: zJsonValue.nullish(), + suggested_questions: zJsonValue.nullish(), + suggested_questions_after_answer: zJsonValue.nullish(), + text_to_speech: zJsonValue.nullish(), + updated_at: z.int().nullish(), + updated_by: z.string().nullish(), + user_input_form: zJsonValue.nullish(), +}) + /** * WorkflowPartial */ @@ -900,6 +828,66 @@ export const zWorkflowPartial = z.object({ updated_by: z.string().nullish(), }) +/** + * AppDetailWithSite + */ +export const zAppDetailWithSite = z.object({ + access_mode: z.string().nullish(), + api_base_url: z.string().nullish(), + app_id: z.string().nullish(), + bound_agent_id: z.string().nullish(), + created_at: z.int().nullish(), + created_by: z.string().nullish(), + deleted_tools: z.array(zDeletedTool).optional(), + description: z.string().nullish(), + enable_api: z.boolean(), + enable_site: z.boolean(), + icon: z.string().nullish(), + icon_background: z.string().nullish(), + icon_type: z.string().nullish(), + icon_url: z.string().nullable(), + id: z.string(), + maintainer: z.string().nullish(), + max_active_requests: z.int().nullish(), + mode: z.string(), + model_config: zModelConfig.nullish(), + name: z.string(), + permission_keys: z.array(z.string()).optional(), + site: zSite.nullish(), + tags: z.array(zTag).optional(), + tracing: zJsonValue.nullish(), + updated_at: z.int().nullish(), + updated_by: z.string().nullish(), + use_icon_as_answer_icon: z.boolean().nullish(), + workflow: zWorkflowPartial.nullish(), +}) + +/** + * AppDetail + */ +export const zAppDetail = z.object({ + access_mode: z.string().nullish(), + app_model_config: zModelConfig.nullish(), + created_at: z.int().nullish(), + created_by: z.string().nullish(), + description: z.string().nullish(), + enable_api: z.boolean(), + enable_site: z.boolean(), + icon: z.string().nullish(), + icon_background: z.string().nullish(), + id: z.string(), + maintainer: z.string().nullish(), + mode_compatible_with_agent: z.string(), + name: z.string(), + permission_keys: z.array(z.string()).optional(), + tags: z.array(zTag).optional(), + tracing: zJsonValue.nullish(), + updated_at: z.int().nullish(), + updated_by: z.string().nullish(), + use_icon_as_answer_icon: z.boolean().nullish(), + workflow: zWorkflowPartial.nullish(), +}) + /** * ImportStatus */ @@ -919,6 +907,32 @@ export const zImport = z.object({ status: zImportStatus, }) +/** + * HumanInputUserActionResponse + */ +export const zHumanInputUserActionResponse = z.object({ + button_style: z.string().optional().default('default'), + id: z.string(), + title: z.string(), +}) + +/** + * HumanInputFormPreviewResponse + */ +export const zHumanInputFormPreviewResponse = z.object({ + TYPE: z.literal('human_input_required').optional().default('human_input_required'), + actions: z.array(zHumanInputUserActionResponse).optional(), + display_in_ui: z.boolean().optional().default(false), + expiration_time: z.int().nullish(), + form_content: z.string(), + form_id: z.string(), + form_token: z.string().nullish(), + inputs: z.array(z.record(z.string(), z.unknown())).optional(), + node_id: z.string(), + node_title: z.string(), + resolved_default_values: z.record(z.string(), z.unknown()).optional(), +}) + /** * AgentDriveItemResponse */ @@ -1118,6 +1132,25 @@ export const zFeedbackStat = z.object({ like: z.int(), }) +/** + * ConversationDetail + */ +export const zConversationDetail = z.object({ + admin_feedback_stats: zFeedbackStat.nullish(), + annotated: z.boolean(), + created_at: z.int().nullish(), + from_account_id: z.string().nullish(), + from_end_user_id: z.string().nullish(), + from_source: z.string(), + id: z.string(), + introduction: z.string().nullish(), + message_count: z.int(), + model_config: zModelConfig.nullish(), + status: z.string(), + updated_at: z.int().nullish(), + user_feedback_stats: zFeedbackStat.nullish(), +}) + /** * ConversationVariableResponse */ @@ -1319,9 +1352,9 @@ export const zUserSatisfactionRateStatisticResponse = z.object({ }) /** - * SimpleAccount + * SimpleAccountResponse */ -export const zSimpleAccount = z.object({ +export const zSimpleAccountResponse = z.object({ email: z.string(), id: z.string(), name: z.string(), @@ -1333,7 +1366,7 @@ export const zSimpleAccount = z.object({ export const zAdvancedChatWorkflowRunForListResponse = z.object({ conversation_id: z.string().nullish(), created_at: z.int().nullish(), - created_by_account: zSimpleAccount.nullish(), + created_by_account: zSimpleAccountResponse.nullish(), elapsed_time: z.number().nullish(), exceptions_count: z.int().nullish(), finished_at: z.int().nullish(), @@ -1355,72 +1388,12 @@ export const zAdvancedChatWorkflowRunPaginationResponse = z.object({ limit: z.int(), }) -/** - * ConversationAnnotation - */ -export const zConversationAnnotation = z.object({ - account: zSimpleAccount.nullish(), - content: z.string(), - created_at: z.int().nullish(), - id: z.string(), - question: z.string().nullish(), -}) - -/** - * ConversationAnnotationHitHistory - */ -export const zConversationAnnotationHitHistory = z.object({ - annotation_create_account: zSimpleAccount.nullish(), - created_at: z.int().nullish(), - id: z.string(), -}) - -/** - * Feedback - */ -export const zFeedback = z.object({ - content: z.string().nullish(), - from_account: zSimpleAccount.nullish(), - from_end_user_id: z.string().nullish(), - from_source: z.string(), - rating: z.string(), -}) - -/** - * MessageDetail - */ -export const zMessageDetail = z.object({ - agent_thoughts: z.array(zAgentThought), - annotation: zConversationAnnotation.nullish(), - annotation_hit_history: zConversationAnnotationHitHistory.nullish(), - answer_tokens: z.int(), - conversation_id: z.string(), - created_at: z.int().nullish(), - error: z.string().nullish(), - feedbacks: z.array(zFeedback), - from_account_id: z.string().nullish(), - from_end_user_id: z.string().nullish(), - from_source: z.string(), - id: z.string(), - inputs: z.record(z.string(), zJsonValue), - message: zJsonValue, - message_files: z.array(zMessageFile), - message_metadata_dict: zJsonValue, - message_tokens: z.int(), - parent_message_id: z.string().nullish(), - provider_response_latency: z.number(), - query: z.string(), - re_sign_file_url_answer: z.string(), - status: z.string(), - workflow_run_id: z.string().nullish(), -}) - /** * WorkflowRunForListResponse */ export const zWorkflowRunForListResponse = z.object({ created_at: z.int().nullish(), - created_by_account: zSimpleAccount.nullish(), + created_by_account: zSimpleAccountResponse.nullish(), elapsed_time: z.number().nullish(), exceptions_count: z.int().nullish(), finished_at: z.int().nullish(), @@ -1456,7 +1429,7 @@ export const zSimpleEndUser = z.object({ */ export const zWorkflowRunDetailResponse = z.object({ created_at: z.int().nullish(), - created_by_account: zSimpleAccount.nullish(), + created_by_account: zSimpleAccountResponse.nullish(), created_by_end_user: zSimpleEndUser.nullish(), created_by_role: z.string().nullish(), elapsed_time: z.number().nullish(), @@ -1478,7 +1451,7 @@ export const zWorkflowRunDetailResponse = z.object({ */ export const zWorkflowRunNodeExecutionResponse = z.object({ created_at: z.int().nullish(), - created_by_account: zSimpleAccount.nullish(), + created_by_account: zSimpleAccountResponse.nullish(), created_by_end_user: zSimpleEndUser.nullish(), created_by_role: z.string().nullish(), elapsed_time: z.number().nullish(), @@ -1544,9 +1517,9 @@ export const zSandboxUploadResponse = z.object({ }) /** - * AccountWithRole + * AccountWithRoleResponse */ -export const zAccountWithRole = z.object({ +export const zAccountWithRoleResponse = z.object({ avatar: z.string().nullish(), created_at: z.int().nullish(), email: z.string(), @@ -1563,7 +1536,7 @@ export const zAccountWithRole = z.object({ * WorkflowCommentMentionUsersPayload */ export const zWorkflowCommentMentionUsersPayload = z.object({ - users: z.array(zAccountWithRole), + users: z.array(zAccountWithRoleResponse), }) /** @@ -1752,7 +1725,7 @@ export const zPipelineVariableResponse = z.object({ export const zWorkflowResponse = z.object({ conversation_variables: z.array(zWorkflowConversationVariableResponse), created_at: z.int(), - created_by: zSimpleAccount.nullish(), + created_by: zSimpleAccountResponse.nullish(), environment_variables: z.array(zWorkflowEnvironmentVariableResponse), features: z.record(z.string(), z.unknown()), graph: z.record(z.string(), z.unknown()), @@ -1763,7 +1736,7 @@ export const zWorkflowResponse = z.object({ rag_pipeline_variables: z.array(zPipelineVariableResponse), tool_published: z.boolean(), updated_at: z.int(), - updated_by: zSimpleAccount.nullish(), + updated_by: zSimpleAccountResponse.nullish(), version: z.string(), }) @@ -2056,116 +2029,6 @@ export const zAppPagination = z.object({ total: z.int(), }) -/** - * LLMMode - * - * Enum class for large language model mode. - */ -export const zLlmMode = z.enum(['chat', 'completion']) - -/** - * ModelConfig - */ -export const zModelConfig = z.object({ - completion_params: z.record(z.string(), z.unknown()).optional(), - mode: zLlmMode, - name: z.string(), - provider: z.string(), -}) - -/** - * AppDetailWithSite - */ -export const zAppDetailWithSite = z.object({ - access_mode: z.string().nullish(), - api_base_url: z.string().nullish(), - app_id: z.string().nullish(), - bound_agent_id: z.string().nullish(), - created_at: z.int().nullish(), - created_by: z.string().nullish(), - deleted_tools: z.array(zDeletedTool).optional(), - description: z.string().nullish(), - enable_api: z.boolean(), - enable_site: z.boolean(), - icon: z.string().nullish(), - icon_background: z.string().nullish(), - icon_type: z.string().nullish(), - icon_url: z.string().nullable(), - id: z.string(), - maintainer: z.string().nullish(), - max_active_requests: z.int().nullish(), - mode: z.string(), - model_config: zModelConfig.nullish(), - name: z.string(), - permission_keys: z.array(z.string()).optional(), - site: zSite.nullish(), - tags: z.array(zTag).optional(), - tracing: zJsonValue.nullish(), - updated_at: z.int().nullish(), - updated_by: z.string().nullish(), - use_icon_as_answer_icon: z.boolean().nullish(), - workflow: zWorkflowPartial.nullish(), -}) - -/** - * AppDetail - */ -export const zAppDetail = z.object({ - access_mode: z.string().nullish(), - app_model_config: zModelConfig.nullish(), - created_at: z.int().nullish(), - created_by: z.string().nullish(), - description: z.string().nullish(), - enable_api: z.boolean(), - enable_site: z.boolean(), - icon: z.string().nullish(), - icon_background: z.string().nullish(), - id: z.string(), - maintainer: z.string().nullish(), - mode_compatible_with_agent: z.string(), - name: z.string(), - permission_keys: z.array(z.string()).optional(), - tags: z.array(zTag).optional(), - tracing: zJsonValue.nullish(), - updated_at: z.int().nullish(), - updated_by: z.string().nullish(), - use_icon_as_answer_icon: z.boolean().nullish(), - workflow: zWorkflowPartial.nullish(), -}) - -/** - * ConversationDetail - */ -export const zConversationDetail = z.object({ - admin_feedback_stats: zFeedbackStat.nullish(), - annotated: z.boolean(), - created_at: z.int().nullish(), - from_account_id: z.string().nullish(), - from_end_user_id: z.string().nullish(), - from_source: z.string(), - id: z.string(), - introduction: z.string().nullish(), - message_count: z.int(), - model_config: zModelConfig.nullish(), - status: z.string(), - updated_at: z.int().nullish(), - user_feedback_stats: zFeedbackStat.nullish(), -}) - -/** - * ConversationMessageDetail - */ -export const zConversationMessageDetail = z.object({ - created_at: z.int().nullish(), - first_message: zMessageDetail.nullish(), - from_account_id: z.string().nullish(), - from_end_user_id: z.string().nullish(), - from_source: z.string(), - id: z.string(), - model_config: zModelConfig.nullish(), - status: z.string(), -}) - /** * Type */ @@ -2366,6 +2229,26 @@ export const zSimpleMessageDetail = z.object({ query: z.string(), }) +/** + * SimpleAccount + */ +export const zSimpleAccount = z.object({ + email: z.string(), + id: z.string(), + name: z.string(), +}) + +/** + * ConversationAnnotation + */ +export const zConversationAnnotation = z.object({ + account: zSimpleAccount.nullish(), + content: z.string(), + created_at: z.int().nullish(), + id: z.string(), + question: z.string().nullish(), +}) + /** * Conversation */ @@ -2398,6 +2281,69 @@ export const zConversationPagination = z.object({ total: z.int(), }) +/** + * ConversationAnnotationHitHistory + */ +export const zConversationAnnotationHitHistory = z.object({ + annotation_create_account: zSimpleAccount.nullish(), + created_at: z.int().nullish(), + id: z.string(), +}) + +/** + * Feedback + */ +export const zFeedback = z.object({ + content: z.string().nullish(), + from_account: zSimpleAccount.nullish(), + from_end_user_id: z.string().nullish(), + from_source: z.string(), + rating: z.string(), +}) + +/** + * MessageDetail + */ +export const zMessageDetail = z.object({ + agent_thoughts: z.array(zAgentThought), + annotation: zConversationAnnotation.nullish(), + annotation_hit_history: zConversationAnnotationHitHistory.nullish(), + answer_tokens: z.int(), + conversation_id: z.string(), + created_at: z.int().nullish(), + error: z.string().nullish(), + feedbacks: z.array(zFeedback), + from_account_id: z.string().nullish(), + from_end_user_id: z.string().nullish(), + from_source: z.string(), + id: z.string(), + inputs: z.record(z.string(), zJsonValue), + message: zJsonValue, + message_files: z.array(zMessageFile), + message_metadata_dict: zJsonValue, + message_tokens: z.int(), + parent_message_id: z.string().nullish(), + provider_response_latency: z.number(), + query: z.string(), + re_sign_file_url_answer: z.string(), + status: z.string(), + workflow_run_id: z.string().nullish(), +}) + +/** + * ConversationMessageDetail + */ +export const zConversationMessageDetail = z.object({ + created_at: z.int().nullish(), + first_message: zMessageDetail.nullish(), + from_account_id: z.string().nullish(), + from_end_user_id: z.string().nullish(), + from_source: z.string(), + id: z.string(), + model_config: zModelConfig.nullish(), + status: z.string(), +}) + /** * ExecutionContentType */ @@ -2425,7 +2371,7 @@ export const zWorkflowRunForLogResponse = z.object({ */ export const zWorkflowAppLogPartialResponse = z.object({ created_at: z.int().nullish(), - created_by_account: zSimpleAccount.nullish(), + created_by_account: zSimpleAccountResponse.nullish(), created_by_end_user: zSimpleEndUser.nullish(), created_by_role: z.string().nullish(), created_from: z.string().nullish(), @@ -2461,7 +2407,7 @@ export const zWorkflowRunForArchivedLogResponse = z.object({ */ export const zWorkflowArchivedLogPartialResponse = z.object({ created_at: z.int().nullish(), - created_by_account: zSimpleAccount.nullish(), + created_by_account: zSimpleAccountResponse.nullish(), created_by_end_user: zSimpleEndUser.nullish(), id: z.string(), trigger_metadata: z.unknown().optional(), @@ -3492,6 +3438,11 @@ export const zMessageInfiniteScrollPaginationResponse = z.object({ */ export const zGeneratedAppResponseWritable = zJsonValue +/** + * HumanInputDeliveryTestResponse + */ +export const zHumanInputDeliveryTestResponseWritable = z.record(z.string(), z.unknown()) + /** * AppPartial */ @@ -3835,65 +3786,11 @@ export const zPostAppsByAppIdAdvancedChatWorkflowsDraftHumanInputNodesByNodeIdFo }) /** - * Human input form preview + * Human input form preview retrieved */ export const zPostAppsByAppIdAdvancedChatWorkflowsDraftHumanInputNodesByNodeIdFormPreviewResponse = zHumanInputFormPreviewResponse -export const zPostAppsByAppIdAdvancedChatWorkflowsDraftHumanInputNodesByNodeIdFormRunBody - = zHumanInputFormSubmitPayload - -export const zPostAppsByAppIdAdvancedChatWorkflowsDraftHumanInputNodesByNodeIdFormRunPath - = z.object({ - app_id: z.uuid(), - node_id: z.string(), - }) - -/** - * Human input form submission result - */ -export const zPostAppsByAppIdAdvancedChatWorkflowsDraftHumanInputNodesByNodeIdFormRunResponse - = zHumanInputFormSubmitResponse - -export const zPostAppsByAppIdAdvancedChatWorkflowsDraftIterationNodesByNodeIdRunBody - = zIterationNodeRunPayload - -export const zPostAppsByAppIdAdvancedChatWorkflowsDraftIterationNodesByNodeIdRunPath = z.object({ - app_id: z.uuid(), - node_id: z.string(), -}) - -/** - * Iteration node run started successfully - */ -export const zPostAppsByAppIdAdvancedChatWorkflowsDraftIterationNodesByNodeIdRunResponse - = zGeneratedAppResponse - -export const zPostAppsByAppIdAdvancedChatWorkflowsDraftLoopNodesByNodeIdRunBody - = zLoopNodeRunPayload - -export const zPostAppsByAppIdAdvancedChatWorkflowsDraftLoopNodesByNodeIdRunPath = z.object({ - app_id: z.uuid(), - node_id: z.string(), -}) - -/** - * Loop node run started successfully - */ -export const zPostAppsByAppIdAdvancedChatWorkflowsDraftLoopNodesByNodeIdRunResponse - = zGeneratedAppResponse - -export const zPostAppsByAppIdAdvancedChatWorkflowsDraftRunBody = zAdvancedChatWorkflowRunPayload - -export const zPostAppsByAppIdAdvancedChatWorkflowsDraftRunPath = z.object({ - app_id: z.uuid(), -}) - -/** - * Workflow run started successfully - */ -export const zPostAppsByAppIdAdvancedChatWorkflowsDraftRunResponse = zGeneratedAppResponse - export const zGetAppsByAppIdAgentDriveFilesPath = z.object({ app_id: z.uuid(), }) @@ -5163,31 +5060,6 @@ export const zGetAppsByAppIdWorkflowsQuery = z.object({ */ export const zGetAppsByAppIdWorkflowsResponse = zWorkflowPaginationResponse -export const zGetAppsByAppIdWorkflowsDefaultWorkflowBlockConfigsPath = z.object({ - app_id: z.uuid(), -}) - -/** - * Default block configurations retrieved successfully - */ -export const zGetAppsByAppIdWorkflowsDefaultWorkflowBlockConfigsResponse - = zDefaultBlockConfigsResponse - -export const zGetAppsByAppIdWorkflowsDefaultWorkflowBlockConfigsByBlockTypePath = z.object({ - app_id: z.uuid(), - block_type: z.string(), -}) - -export const zGetAppsByAppIdWorkflowsDefaultWorkflowBlockConfigsByBlockTypeQuery = z.object({ - q: z.string().optional(), -}) - -/** - * Default block configuration retrieved successfully - */ -export const zGetAppsByAppIdWorkflowsDefaultWorkflowBlockConfigsByBlockTypeResponse - = zDefaultBlockConfigResponse - export const zGetAppsByAppIdWorkflowsDraftPath = z.object({ app_id: z.uuid(), }) @@ -5271,10 +5143,10 @@ export const zPostAppsByAppIdWorkflowsDraftHumanInputNodesByNodeIdDeliveryTestPa }) /** - * Human input delivery test result + * Human input delivery tested */ export const zPostAppsByAppIdWorkflowsDraftHumanInputNodesByNodeIdDeliveryTestResponse - = zEmptyObjectResponse + = zHumanInputDeliveryTestResponse export const zPostAppsByAppIdWorkflowsDraftHumanInputNodesByNodeIdFormPreviewBody = zHumanInputFormPreviewPayload @@ -5285,49 +5157,11 @@ export const zPostAppsByAppIdWorkflowsDraftHumanInputNodesByNodeIdFormPreviewPat }) /** - * Human input form preview + * Human input form preview retrieved */ export const zPostAppsByAppIdWorkflowsDraftHumanInputNodesByNodeIdFormPreviewResponse = zHumanInputFormPreviewResponse -export const zPostAppsByAppIdWorkflowsDraftHumanInputNodesByNodeIdFormRunBody - = zHumanInputFormSubmitPayload - -export const zPostAppsByAppIdWorkflowsDraftHumanInputNodesByNodeIdFormRunPath = z.object({ - app_id: z.uuid(), - node_id: z.string(), -}) - -/** - * Human input form submission result - */ -export const zPostAppsByAppIdWorkflowsDraftHumanInputNodesByNodeIdFormRunResponse - = zHumanInputFormSubmitResponse - -export const zPostAppsByAppIdWorkflowsDraftIterationNodesByNodeIdRunBody = zIterationNodeRunPayload - -export const zPostAppsByAppIdWorkflowsDraftIterationNodesByNodeIdRunPath = z.object({ - app_id: z.uuid(), - node_id: z.string(), -}) - -/** - * Workflow iteration node run started successfully - */ -export const zPostAppsByAppIdWorkflowsDraftIterationNodesByNodeIdRunResponse = zGeneratedAppResponse - -export const zPostAppsByAppIdWorkflowsDraftLoopNodesByNodeIdRunBody = zLoopNodeRunPayload - -export const zPostAppsByAppIdWorkflowsDraftLoopNodesByNodeIdRunPath = z.object({ - app_id: z.uuid(), - node_id: z.string(), -}) - -/** - * Workflow loop node run started successfully - */ -export const zPostAppsByAppIdWorkflowsDraftLoopNodesByNodeIdRunResponse = zGeneratedAppResponse - export const zGetAppsByAppIdWorkflowsDraftNodesByNodeIdAgentComposerPath = z.object({ app_id: z.uuid(), node_id: z.string(), @@ -5451,7 +5285,8 @@ export const zPostAppsByAppIdWorkflowsDraftNodesByNodeIdTriggerRunPath = z.objec /** * Trigger event received and node executed successfully */ -export const zPostAppsByAppIdWorkflowsDraftNodesByNodeIdTriggerRunResponse = zGeneratedAppResponse +export const zPostAppsByAppIdWorkflowsDraftNodesByNodeIdTriggerRunResponse + = zWorkflowRunNodeExecutionResponse export const zDeleteAppsByAppIdWorkflowsDraftNodesByNodeIdVariablesPath = z.object({ app_id: z.uuid(), @@ -5474,17 +5309,6 @@ export const zGetAppsByAppIdWorkflowsDraftNodesByNodeIdVariablesPath = z.object( export const zGetAppsByAppIdWorkflowsDraftNodesByNodeIdVariablesResponse = zWorkflowDraftVariableList -export const zPostAppsByAppIdWorkflowsDraftRunBody = zDraftWorkflowRunPayload - -export const zPostAppsByAppIdWorkflowsDraftRunPath = z.object({ - app_id: z.uuid(), -}) - -/** - * Draft workflow run started successfully - */ -export const zPostAppsByAppIdWorkflowsDraftRunResponse = zGeneratedAppResponse - export const zGetAppsByAppIdWorkflowsDraftRunsByRunIdNodeOutputsPath = z.object({ app_id: z.uuid(), run_id: z.uuid(), @@ -5540,28 +5364,6 @@ export const zGetAppsByAppIdWorkflowsDraftSystemVariablesPath = z.object({ */ export const zGetAppsByAppIdWorkflowsDraftSystemVariablesResponse = zWorkflowDraftVariableList -export const zPostAppsByAppIdWorkflowsDraftTriggerRunBody = zDraftWorkflowTriggerRunRequest - -export const zPostAppsByAppIdWorkflowsDraftTriggerRunPath = z.object({ - app_id: z.uuid(), -}) - -/** - * Trigger event received and workflow executed successfully - */ -export const zPostAppsByAppIdWorkflowsDraftTriggerRunResponse = zGeneratedAppResponse - -export const zPostAppsByAppIdWorkflowsDraftTriggerRunAllBody = zDraftWorkflowTriggerRunAllPayload - -export const zPostAppsByAppIdWorkflowsDraftTriggerRunAllPath = z.object({ - app_id: z.uuid(), -}) - -/** - * Workflow executed successfully - */ -export const zPostAppsByAppIdWorkflowsDraftTriggerRunAllResponse = zGeneratedAppResponse - export const zDeleteAppsByAppIdWorkflowsDraftVariablesPath = z.object({ app_id: z.uuid(), }) @@ -5646,7 +5448,7 @@ export const zPostAppsByAppIdWorkflowsPublishPath = z.object({ /** * Workflow published successfully */ -export const zPostAppsByAppIdWorkflowsPublishResponse = zWorkflowPublishResponse +export const zPostAppsByAppIdWorkflowsPublishResponse = zPublishWorkflowResponse export const zGetAppsByAppIdWorkflowsPublishedRunsByRunIdNodeOutputsPath = z.object({ app_id: z.uuid(), @@ -5739,7 +5541,7 @@ export const zPostAppsByAppIdWorkflowsByWorkflowIdRestorePath = z.object({ /** * Workflow restored successfully */ -export const zPostAppsByAppIdWorkflowsByWorkflowIdRestoreResponse = zWorkflowRestoreResponse +export const zPostAppsByAppIdWorkflowsByWorkflowIdRestoreResponse = zSyncDraftWorkflowResponse export const zGetAppsByResourceIdApiKeysPath = z.object({ resource_id: z.uuid(), diff --git a/packages/contracts/generated/api/console/datasets/orpc.gen.ts b/packages/contracts/generated/api/console/datasets/orpc.gen.ts index a8b096168bb..29becdb7470 100644 --- a/packages/contracts/generated/api/console/datasets/orpc.gen.ts +++ b/packages/contracts/generated/api/console/datasets/orpc.gen.ts @@ -359,8 +359,12 @@ export const get5 = oc .input(z.object({ params: zGetDatasetsExternalKnowledgeApiByExternalKnowledgeApiIdPath })) .output(zGetDatasetsExternalKnowledgeApiByExternalKnowledgeApiIdResponse) +/** + * Update external knowledge API template + */ export const patch = oc .route({ + description: 'Update external knowledge API template', inputStructure: 'detailed', method: 'PATCH', operationId: 'patchDatasetsExternalKnowledgeApiByExternalKnowledgeApiId', @@ -397,8 +401,12 @@ export const get6 = oc .input(z.object({ query: zGetDatasetsExternalKnowledgeApiQuery.optional() })) .output(zGetDatasetsExternalKnowledgeApiResponse) +/** + * Create external knowledge API template + */ export const post4 = oc .route({ + description: 'Create external knowledge API template', inputStructure: 'detailed', method: 'POST', operationId: 'postDatasetsExternalKnowledgeApi', diff --git a/packages/contracts/generated/api/console/datasets/types.gen.ts b/packages/contracts/generated/api/console/datasets/types.gen.ts index f904ea7d717..c919d479780 100644 --- a/packages/contracts/generated/api/console/datasets/types.gen.ts +++ b/packages/contracts/generated/api/console/datasets/types.gen.ts @@ -97,51 +97,12 @@ export type ExternalDatasetCreatePayload = { name: string } -export type DatasetDetail = { - app_count?: number - author_name?: string - built_in_field_enabled?: boolean - chunk_structure?: string - created_at?: number - created_by?: string - data_source_type?: string - description?: string - doc_form?: string - doc_metadata?: Array - document_count?: number - embedding_available?: boolean - embedding_model?: string - embedding_model_provider?: string - enable_api?: boolean - external_knowledge_info?: ExternalKnowledgeInfo - external_retrieval_model?: ExternalRetrievalModel - icon_info?: DatasetIconInfo - id?: string - indexing_technique?: string - is_multimodal?: boolean - is_published?: boolean - name?: string - permission?: string - permission_keys?: Array - pipeline_id?: string - provider?: string - retrieval_model_dict?: DatasetRetrievalModel - runtime_mode?: string - summary_index_setting?: AnonymousInlineModelB1954337D565 - tags?: Array - total_available_documents?: number - total_documents?: number - updated_at?: number - updated_by?: string - word_count?: number -} - export type ExternalKnowledgeApiListResponse = { data: Array has_more: boolean limit: number page: number - total: number + total: number | null } export type ExternalKnowledgeApiPayload = { @@ -154,11 +115,11 @@ export type ExternalKnowledgeApiPayload = { export type ExternalKnowledgeApiResponse = { created_at: string created_by: string - dataset_bindings?: Array + dataset_bindings: Array description: string id: string name: string - settings?: { + settings: { [key: string]: unknown } | null tenant_id: string @@ -479,13 +440,10 @@ export type ExternalHitTestingPayload = { query: string } -export type ExternalRetrievalTestResponse - = | { - [key: string]: unknown - } - | Array<{ - [key: string]: unknown - }> +export type ExternalHitTestingResponse = { + query: ExternalHitTestingQueryResponse + records: Array +} export type HitTestingPayload = { attachment_ids?: Array | null @@ -641,57 +599,7 @@ export type DatasetTagResponse = { type: string } -export type DatasetDocMetadata = { - id?: string - name?: string - type?: string -} - -export type ExternalKnowledgeInfo = { - external_knowledge_api_endpoint?: string - external_knowledge_api_id?: string - external_knowledge_api_name?: string - external_knowledge_id?: string -} - -export type ExternalRetrievalModel = { - score_threshold?: number - score_threshold_enabled?: boolean - top_k?: number -} - -export type DatasetIconInfo = { - icon?: string - icon_background?: string - icon_type?: string - icon_url?: string -} - -export type DatasetRetrievalModel = { - reranking_enable?: boolean - reranking_mode?: string - reranking_model?: DatasetRerankingModel - score_threshold?: number - score_threshold_enabled?: boolean - search_method?: string - top_k?: number - weights?: DatasetWeightedScore -} - -export type AnonymousInlineModelB1954337D565 = { - enable?: boolean - model_name?: string - model_provider_name?: string - summary_prompt?: string -} - -export type Tag = { - id: string - name: string - type: string -} - -export type ExternalKnowledgeDatasetBindingResponse = { +export type ExternalKnowledgeApiBindingResponse = { id: string name: string } @@ -844,6 +752,19 @@ export type ChildChunkUpdateArgs = { id?: string | null } +export type ExternalHitTestingQueryResponse = { + content: string +} + +export type ExternalHitTestingRecordResponse = { + content?: string | null + metadata?: { + [key: string]: unknown + } | null + score?: number | null + title?: string | null +} + export type HitTestingQuery = { content: string } @@ -896,17 +817,6 @@ export type DatasetWeightedScoreResponse = { weight_type?: string | null } -export type DatasetRerankingModel = { - reranking_model_name?: string - reranking_provider_name?: string -} - -export type DatasetWeightedScore = { - keyword_setting?: DatasetKeywordSetting - vector_setting?: DatasetVectorSetting - weight_type?: string -} - export type InfoList = { data_source_type: 'notion_import' | 'upload_file' | 'website_crawl' file_info_list?: FileInfo | null @@ -1018,16 +928,6 @@ export type DatasetVectorSettingResponse = { vector_weight?: number | null } -export type DatasetKeywordSetting = { - keyword_weight?: number -} - -export type DatasetVectorSetting = { - embedding_model_name?: string - embedding_provider_name?: string - vector_weight?: number -} - export type FileInfo = { file_ids: Array } @@ -1264,7 +1164,7 @@ export type PostDatasetsExternalErrors = { } export type PostDatasetsExternalResponses = { - 201: DatasetDetail + 201: DatasetDetailResponse } export type PostDatasetsExternalResponse @@ -1295,6 +1195,10 @@ export type PostDatasetsExternalKnowledgeApiData = { url: '/datasets/external-knowledge-api' } +export type PostDatasetsExternalKnowledgeApiErrors = { + 403: unknown +} + export type PostDatasetsExternalKnowledgeApiResponses = { 201: ExternalKnowledgeApiResponse } @@ -1347,6 +1251,10 @@ export type PatchDatasetsExternalKnowledgeApiByExternalKnowledgeApiIdData = { url: '/datasets/external-knowledge-api/{external_knowledge_api_id}' } +export type PatchDatasetsExternalKnowledgeApiByExternalKnowledgeApiIdErrors = { + 404: unknown +} + export type PatchDatasetsExternalKnowledgeApiByExternalKnowledgeApiIdResponses = { 200: ExternalKnowledgeApiResponse } @@ -2283,7 +2191,7 @@ export type PostDatasetsByDatasetIdExternalHitTestingErrors = { } export type PostDatasetsByDatasetIdExternalHitTestingResponses = { - 200: ExternalRetrievalTestResponse + 200: ExternalHitTestingResponse } export type PostDatasetsByDatasetIdExternalHitTestingResponse diff --git a/packages/contracts/generated/api/console/datasets/zod.gen.ts b/packages/contracts/generated/api/console/datasets/zod.gen.ts index 10ceb11cb5d..ff34b62243d 100644 --- a/packages/contracts/generated/api/console/datasets/zod.gen.ts +++ b/packages/contracts/generated/api/console/datasets/zod.gen.ts @@ -247,14 +247,6 @@ export const zExternalHitTestingPayload = z.object({ query: z.string(), }) -/** - * ExternalRetrievalTestResponse - */ -export const zExternalRetrievalTestResponse = z.union([ - z.record(z.string(), z.unknown()), - z.array(z.record(z.string(), z.unknown())), -]) - /** * MetadataArgs */ @@ -397,52 +389,10 @@ export const zDatasetTagResponse = z.object({ type: z.string(), }) -export const zDatasetDocMetadata = z.object({ - id: z.string().optional(), - name: z.string().optional(), - type: z.string().optional(), -}) - -export const zExternalKnowledgeInfo = z.object({ - external_knowledge_api_endpoint: z.string().optional(), - external_knowledge_api_id: z.string().optional(), - external_knowledge_api_name: z.string().optional(), - external_knowledge_id: z.string().optional(), -}) - -export const zExternalRetrievalModel = z.object({ - score_threshold: z.number().optional(), - score_threshold_enabled: z.boolean().optional(), - top_k: z.int().optional(), -}) - -export const zDatasetIconInfo = z.object({ - icon: z.string().optional(), - icon_background: z.string().optional(), - icon_type: z.string().optional(), - icon_url: z.string().optional(), -}) - -export const zAnonymousInlineModelB1954337D565 = z.object({ - enable: z.boolean().optional(), - model_name: z.string().optional(), - model_provider_name: z.string().optional(), - summary_prompt: z.string().optional(), -}) - /** - * Tag + * ExternalKnowledgeApiBindingResponse */ -export const zTag = z.object({ - id: z.string(), - name: z.string(), - type: z.string(), -}) - -/** - * ExternalKnowledgeDatasetBindingResponse - */ -export const zExternalKnowledgeDatasetBindingResponse = z.object({ +export const zExternalKnowledgeApiBindingResponse = z.object({ id: z.string(), name: z.string(), }) @@ -453,11 +403,11 @@ export const zExternalKnowledgeDatasetBindingResponse = z.object({ export const zExternalKnowledgeApiResponse = z.object({ created_at: z.string(), created_by: z.string(), - dataset_bindings: z.array(zExternalKnowledgeDatasetBindingResponse).optional(), + dataset_bindings: z.array(zExternalKnowledgeApiBindingResponse), description: z.string(), id: z.string(), name: z.string(), - settings: z.record(z.string(), z.unknown()).nullish(), + settings: z.record(z.string(), z.unknown()).nullable(), tenant_id: z.string(), }) @@ -469,7 +419,7 @@ export const zExternalKnowledgeApiListResponse = z.object({ has_more: z.boolean(), limit: z.int(), page: z.int(), - total: z.int(), + total: z.int().nullable(), }) /** @@ -700,6 +650,31 @@ export const zChildChunkBatchUpdatePayload = z.object({ chunks: z.array(zChildChunkUpdateArgs), }) +/** + * ExternalHitTestingQueryResponse + */ +export const zExternalHitTestingQueryResponse = z.object({ + content: z.string(), +}) + +/** + * ExternalHitTestingRecordResponse + */ +export const zExternalHitTestingRecordResponse = z.object({ + content: z.string().nullish(), + metadata: z.record(z.string(), z.unknown()).nullish(), + score: z.number().nullish(), + title: z.string().nullish(), +}) + +/** + * ExternalHitTestingResponse + */ +export const zExternalHitTestingResponse = z.object({ + query: zExternalHitTestingQueryResponse, + records: z.array(zExternalHitTestingRecordResponse), +}) + /** * HitTestingQuery */ @@ -755,11 +730,6 @@ export const zDatasetRerankingModelResponse = z.object({ reranking_provider_name: z.string().nullish(), }) -export const zDatasetRerankingModel = z.object({ - reranking_model_name: z.string().optional(), - reranking_provider_name: z.string().optional(), -}) - /** * ProcessRuleMode * @@ -1079,88 +1049,6 @@ export const zDatasetListResponse = z.object({ total: z.int(), }) -export const zDatasetKeywordSetting = z.object({ - keyword_weight: z.number().optional(), -}) - -export const zDatasetVectorSetting = z.object({ - embedding_model_name: z.string().optional(), - embedding_provider_name: z.string().optional(), - vector_weight: z.number().optional(), -}) - -export const zDatasetWeightedScore = z.object({ - keyword_setting: zDatasetKeywordSetting.optional(), - vector_setting: zDatasetVectorSetting.optional(), - weight_type: z.string().optional(), -}) - -export const zDatasetRetrievalModel = z.object({ - reranking_enable: z.boolean().optional(), - reranking_mode: z.string().optional(), - reranking_model: zDatasetRerankingModel.optional(), - score_threshold: z.number().optional(), - score_threshold_enabled: z.boolean().optional(), - search_method: z.string().optional(), - top_k: z.int().optional(), - weights: zDatasetWeightedScore.optional(), -}) - -export const zDatasetDetail = z.object({ - app_count: z.int().optional(), - author_name: z.string().optional(), - built_in_field_enabled: z.boolean().optional(), - chunk_structure: z.string().optional(), - created_at: z.coerce - .bigint() - .min(BigInt('-9223372036854775808'), { - error: 'Invalid value: Expected int64 to be >= -9223372036854775808', - }) - .max(BigInt('9223372036854775807'), { - error: 'Invalid value: Expected int64 to be <= 9223372036854775807', - }) - .optional(), - created_by: z.string().optional(), - data_source_type: z.string().optional(), - description: z.string().optional(), - doc_form: z.string().optional(), - doc_metadata: z.array(zDatasetDocMetadata).optional(), - document_count: z.int().optional(), - embedding_available: z.boolean().optional(), - embedding_model: z.string().optional(), - embedding_model_provider: z.string().optional(), - enable_api: z.boolean().optional(), - external_knowledge_info: zExternalKnowledgeInfo.optional(), - external_retrieval_model: zExternalRetrievalModel.optional(), - icon_info: zDatasetIconInfo.optional(), - id: z.string().optional(), - indexing_technique: z.string().optional(), - is_multimodal: z.boolean().optional(), - is_published: z.boolean().optional(), - name: z.string().optional(), - permission: z.string().optional(), - permission_keys: z.array(z.string()).optional(), - pipeline_id: z.string().optional(), - provider: z.string().optional(), - retrieval_model_dict: zDatasetRetrievalModel.optional(), - runtime_mode: z.string().optional(), - summary_index_setting: zAnonymousInlineModelB1954337D565.optional(), - tags: z.array(zTag).optional(), - total_available_documents: z.int().optional(), - total_documents: z.int().optional(), - updated_at: z.coerce - .bigint() - .min(BigInt('-9223372036854775808'), { - error: 'Invalid value: Expected int64 to be >= -9223372036854775808', - }) - .max(BigInt('9223372036854775807'), { - error: 'Invalid value: Expected int64 to be <= 9223372036854775807', - }) - .optional(), - updated_by: z.string().optional(), - word_count: z.int().optional(), -}) - /** * FileInfo */ @@ -1558,7 +1446,7 @@ export const zPostDatasetsExternalBody = zExternalDatasetCreatePayload /** * External dataset created successfully */ -export const zPostDatasetsExternalResponse = zDatasetDetail +export const zPostDatasetsExternalResponse = zDatasetDetailResponse export const zGetDatasetsExternalKnowledgeApiQuery = z.object({ keyword: z.string().optional(), @@ -2188,7 +2076,7 @@ export const zPostDatasetsByDatasetIdExternalHitTestingPath = z.object({ /** * External hit testing completed successfully */ -export const zPostDatasetsByDatasetIdExternalHitTestingResponse = zExternalRetrievalTestResponse +export const zPostDatasetsByDatasetIdExternalHitTestingResponse = zExternalHitTestingResponse export const zPostDatasetsByDatasetIdHitTestingBody = zHitTestingPayload diff --git a/packages/contracts/generated/api/console/installed-apps/types.gen.ts b/packages/contracts/generated/api/console/installed-apps/types.gen.ts index f9a5eb01edc..a3e34caf590 100644 --- a/packages/contracts/generated/api/console/installed-apps/types.gen.ts +++ b/packages/contracts/generated/api/console/installed-apps/types.gen.ts @@ -176,16 +176,7 @@ export type InstalledAppResponse = { uninstallable: boolean } -export type JsonValue - = | string - | number - | number - | boolean - | { - [key: string]: unknown - } - | Array - | null +export type JsonValue = unknown export type ExploreMessageListItem = { agent_thoughts: Array diff --git a/packages/contracts/generated/api/console/installed-apps/zod.gen.ts b/packages/contracts/generated/api/console/installed-apps/zod.gen.ts index a4556058506..d911a043f3b 100644 --- a/packages/contracts/generated/api/console/installed-apps/zod.gen.ts +++ b/packages/contracts/generated/api/console/installed-apps/zod.gen.ts @@ -156,16 +156,7 @@ export const zWorkflowRunPayload = z.object({ inputs: z.record(z.string(), z.unknown()), }) -export const zJsonValue = z - .union([ - z.string(), - z.int(), - z.number(), - z.boolean(), - z.record(z.string(), z.unknown()), - z.array(z.unknown()), - ]) - .nullable() +export const zJsonValue = z.unknown() /** * GeneratedAppResponse diff --git a/packages/contracts/generated/api/console/instruction-generate/types.gen.ts b/packages/contracts/generated/api/console/instruction-generate/types.gen.ts index 82a9bee0864..cc08c229421 100644 --- a/packages/contracts/generated/api/console/instruction-generate/types.gen.ts +++ b/packages/contracts/generated/api/console/instruction-generate/types.gen.ts @@ -25,15 +25,33 @@ export type SimpleDataResponse = { } export type ModelConfig = { - completion_params?: { - [key: string]: unknown - } - mode: LlmMode - name: string - provider: string + agent_mode?: JsonValue | null + annotation_reply?: JsonValue | null + chat_prompt_config?: JsonValue | null + completion_prompt_config?: JsonValue | null + created_at?: number | null + created_by?: string | null + dataset_configs?: JsonValue | null + dataset_query_variable?: string | null + external_data_tools?: JsonValue | null + file_upload?: JsonValue | null + model?: JsonValue | null + more_like_this?: JsonValue | null + opening_statement?: string | null + pre_prompt?: string | null + prompt_type?: string | null + retriever_resource?: JsonValue | null + sensitive_word_avoidance?: JsonValue | null + speech_to_text?: JsonValue | null + suggested_questions?: JsonValue | null + suggested_questions_after_answer?: JsonValue | null + text_to_speech?: JsonValue | null + updated_at?: number | null + updated_by?: string | null + user_input_form?: JsonValue | null } -export type LlmMode = 'chat' | 'completion' +export type JsonValue = unknown export type PostInstructionGenerateData = { body: InstructionGeneratePayload diff --git a/packages/contracts/generated/api/console/instruction-generate/zod.gen.ts b/packages/contracts/generated/api/console/instruction-generate/zod.gen.ts index 2d89050e2a0..339f25d605d 100644 --- a/packages/contracts/generated/api/console/instruction-generate/zod.gen.ts +++ b/packages/contracts/generated/api/console/instruction-generate/zod.gen.ts @@ -21,21 +21,36 @@ export const zSimpleDataResponse = z.object({ data: z.string(), }) -/** - * LLMMode - * - * Enum class for large language model mode. - */ -export const zLlmMode = z.enum(['chat', 'completion']) +export const zJsonValue = z.unknown() /** * ModelConfig */ export const zModelConfig = z.object({ - completion_params: z.record(z.string(), z.unknown()).optional(), - mode: zLlmMode, - name: z.string(), - provider: z.string(), + agent_mode: zJsonValue.nullish(), + annotation_reply: zJsonValue.nullish(), + chat_prompt_config: zJsonValue.nullish(), + completion_prompt_config: zJsonValue.nullish(), + created_at: z.int().nullish(), + created_by: z.string().nullish(), + dataset_configs: zJsonValue.nullish(), + dataset_query_variable: z.string().nullish(), + external_data_tools: zJsonValue.nullish(), + file_upload: zJsonValue.nullish(), + model: zJsonValue.nullish(), + more_like_this: zJsonValue.nullish(), + opening_statement: z.string().nullish(), + pre_prompt: z.string().nullish(), + prompt_type: z.string().nullish(), + retriever_resource: zJsonValue.nullish(), + sensitive_word_avoidance: zJsonValue.nullish(), + speech_to_text: zJsonValue.nullish(), + suggested_questions: zJsonValue.nullish(), + suggested_questions_after_answer: zJsonValue.nullish(), + text_to_speech: zJsonValue.nullish(), + updated_at: z.int().nullish(), + updated_by: z.string().nullish(), + user_input_form: zJsonValue.nullish(), }) /** diff --git a/packages/contracts/generated/api/console/rag/orpc.gen.ts b/packages/contracts/generated/api/console/rag/orpc.gen.ts index ea52e39d5f6..8d947e305f5 100644 --- a/packages/contracts/generated/api/console/rag/orpc.gen.ts +++ b/packages/contracts/generated/api/console/rag/orpc.gen.ts @@ -24,11 +24,6 @@ import { zGetRagPipelinesByPipelineIdWorkflowRunsPath, zGetRagPipelinesByPipelineIdWorkflowRunsQuery, zGetRagPipelinesByPipelineIdWorkflowRunsResponse, - zGetRagPipelinesByPipelineIdWorkflowsDefaultWorkflowBlockConfigsByBlockTypePath, - zGetRagPipelinesByPipelineIdWorkflowsDefaultWorkflowBlockConfigsByBlockTypeQuery, - zGetRagPipelinesByPipelineIdWorkflowsDefaultWorkflowBlockConfigsByBlockTypeResponse, - zGetRagPipelinesByPipelineIdWorkflowsDefaultWorkflowBlockConfigsPath, - zGetRagPipelinesByPipelineIdWorkflowsDefaultWorkflowBlockConfigsResponse, zGetRagPipelinesByPipelineIdWorkflowsDraftEnvironmentVariablesPath, zGetRagPipelinesByPipelineIdWorkflowsDraftEnvironmentVariablesResponse, zGetRagPipelinesByPipelineIdWorkflowsDraftNodesByNodeIdLastRunPath, @@ -93,35 +88,17 @@ import { zPostRagPipelinesByPipelineIdWorkflowsByWorkflowIdRestorePath, zPostRagPipelinesByPipelineIdWorkflowsByWorkflowIdRestoreResponse, zPostRagPipelinesByPipelineIdWorkflowsDraftBody, - zPostRagPipelinesByPipelineIdWorkflowsDraftDatasourceNodesByNodeIdRunBody, - zPostRagPipelinesByPipelineIdWorkflowsDraftDatasourceNodesByNodeIdRunPath, - zPostRagPipelinesByPipelineIdWorkflowsDraftDatasourceNodesByNodeIdRunResponse, zPostRagPipelinesByPipelineIdWorkflowsDraftDatasourceVariablesInspectBody, zPostRagPipelinesByPipelineIdWorkflowsDraftDatasourceVariablesInspectPath, zPostRagPipelinesByPipelineIdWorkflowsDraftDatasourceVariablesInspectResponse, - zPostRagPipelinesByPipelineIdWorkflowsDraftIterationNodesByNodeIdRunBody, - zPostRagPipelinesByPipelineIdWorkflowsDraftIterationNodesByNodeIdRunPath, - zPostRagPipelinesByPipelineIdWorkflowsDraftIterationNodesByNodeIdRunResponse, - zPostRagPipelinesByPipelineIdWorkflowsDraftLoopNodesByNodeIdRunBody, - zPostRagPipelinesByPipelineIdWorkflowsDraftLoopNodesByNodeIdRunPath, - zPostRagPipelinesByPipelineIdWorkflowsDraftLoopNodesByNodeIdRunResponse, zPostRagPipelinesByPipelineIdWorkflowsDraftNodesByNodeIdRunBody, zPostRagPipelinesByPipelineIdWorkflowsDraftNodesByNodeIdRunPath, zPostRagPipelinesByPipelineIdWorkflowsDraftNodesByNodeIdRunResponse, zPostRagPipelinesByPipelineIdWorkflowsDraftPath, zPostRagPipelinesByPipelineIdWorkflowsDraftResponse, - zPostRagPipelinesByPipelineIdWorkflowsDraftRunBody, - zPostRagPipelinesByPipelineIdWorkflowsDraftRunPath, - zPostRagPipelinesByPipelineIdWorkflowsDraftRunResponse, zPostRagPipelinesByPipelineIdWorkflowsPublishedDatasourceNodesByNodeIdPreviewBody, zPostRagPipelinesByPipelineIdWorkflowsPublishedDatasourceNodesByNodeIdPreviewPath, zPostRagPipelinesByPipelineIdWorkflowsPublishedDatasourceNodesByNodeIdPreviewResponse, - zPostRagPipelinesByPipelineIdWorkflowsPublishedDatasourceNodesByNodeIdRunBody, - zPostRagPipelinesByPipelineIdWorkflowsPublishedDatasourceNodesByNodeIdRunPath, - zPostRagPipelinesByPipelineIdWorkflowsPublishedDatasourceNodesByNodeIdRunResponse, - zPostRagPipelinesByPipelineIdWorkflowsPublishedRunBody, - zPostRagPipelinesByPipelineIdWorkflowsPublishedRunPath, - zPostRagPipelinesByPipelineIdWorkflowsPublishedRunResponse, zPostRagPipelinesByPipelineIdWorkflowsPublishPath, zPostRagPipelinesByPipelineIdWorkflowsPublishResponse, zPostRagPipelinesImportsBody, @@ -506,87 +483,10 @@ export const workflowRuns = { byRunId, } -/** - * Get default block config - */ -export const get10 = oc - .route({ - inputStructure: 'detailed', - method: 'GET', - operationId: 'getRagPipelinesByPipelineIdWorkflowsDefaultWorkflowBlockConfigsByBlockType', - path: '/rag/pipelines/{pipeline_id}/workflows/default-workflow-block-configs/{block_type}', - summary: 'Get default block config', - tags: ['console'], - }) - .input( - z.object({ - params: zGetRagPipelinesByPipelineIdWorkflowsDefaultWorkflowBlockConfigsByBlockTypePath, - query: - zGetRagPipelinesByPipelineIdWorkflowsDefaultWorkflowBlockConfigsByBlockTypeQuery.optional(), - }), - ) - .output(zGetRagPipelinesByPipelineIdWorkflowsDefaultWorkflowBlockConfigsByBlockTypeResponse) - -export const byBlockType = { - get: get10, -} - -/** - * Get default block config - */ -export const get11 = oc - .route({ - inputStructure: 'detailed', - method: 'GET', - operationId: 'getRagPipelinesByPipelineIdWorkflowsDefaultWorkflowBlockConfigs', - path: '/rag/pipelines/{pipeline_id}/workflows/default-workflow-block-configs', - summary: 'Get default block config', - tags: ['console'], - }) - .input(z.object({ params: zGetRagPipelinesByPipelineIdWorkflowsDefaultWorkflowBlockConfigsPath })) - .output(zGetRagPipelinesByPipelineIdWorkflowsDefaultWorkflowBlockConfigsResponse) - -export const defaultWorkflowBlockConfigs = { - get: get11, - byBlockType, -} - -/** - * Run rag pipeline datasource - */ -export const post9 = oc - .route({ - inputStructure: 'detailed', - method: 'POST', - operationId: 'postRagPipelinesByPipelineIdWorkflowsDraftDatasourceNodesByNodeIdRun', - path: '/rag/pipelines/{pipeline_id}/workflows/draft/datasource/nodes/{node_id}/run', - summary: 'Run rag pipeline datasource', - tags: ['console'], - }) - .input( - z.object({ - body: zPostRagPipelinesByPipelineIdWorkflowsDraftDatasourceNodesByNodeIdRunBody, - params: zPostRagPipelinesByPipelineIdWorkflowsDraftDatasourceNodesByNodeIdRunPath, - }), - ) - .output(zPostRagPipelinesByPipelineIdWorkflowsDraftDatasourceNodesByNodeIdRunResponse) - -export const run = { - post: post9, -} - -export const byNodeId = { - run, -} - -export const nodes = { - byNodeId, -} - /** * Set datasource variables */ -export const post10 = oc +export const post9 = oc .route({ inputStructure: 'detailed', method: 'POST', @@ -604,18 +504,17 @@ export const post10 = oc .output(zPostRagPipelinesByPipelineIdWorkflowsDraftDatasourceVariablesInspectResponse) export const variablesInspect = { - post: post10, + post: post9, } export const datasource = { - nodes, variablesInspect, } /** * Get draft workflow */ -export const get12 = oc +export const get10 = oc .route({ inputStructure: 'detailed', method: 'GET', @@ -628,82 +527,10 @@ export const get12 = oc .output(zGetRagPipelinesByPipelineIdWorkflowsDraftEnvironmentVariablesResponse) export const environmentVariables = { - get: get12, + get: get10, } -/** - * Run draft workflow iteration node - */ -export const post11 = oc - .route({ - inputStructure: 'detailed', - method: 'POST', - operationId: 'postRagPipelinesByPipelineIdWorkflowsDraftIterationNodesByNodeIdRun', - path: '/rag/pipelines/{pipeline_id}/workflows/draft/iteration/nodes/{node_id}/run', - summary: 'Run draft workflow iteration node', - tags: ['console'], - }) - .input( - z.object({ - body: zPostRagPipelinesByPipelineIdWorkflowsDraftIterationNodesByNodeIdRunBody, - params: zPostRagPipelinesByPipelineIdWorkflowsDraftIterationNodesByNodeIdRunPath, - }), - ) - .output(zPostRagPipelinesByPipelineIdWorkflowsDraftIterationNodesByNodeIdRunResponse) - -export const run2 = { - post: post11, -} - -export const byNodeId2 = { - run: run2, -} - -export const nodes2 = { - byNodeId: byNodeId2, -} - -export const iteration = { - nodes: nodes2, -} - -/** - * Run draft workflow loop node - */ -export const post12 = oc - .route({ - inputStructure: 'detailed', - method: 'POST', - operationId: 'postRagPipelinesByPipelineIdWorkflowsDraftLoopNodesByNodeIdRun', - path: '/rag/pipelines/{pipeline_id}/workflows/draft/loop/nodes/{node_id}/run', - summary: 'Run draft workflow loop node', - tags: ['console'], - }) - .input( - z.object({ - body: zPostRagPipelinesByPipelineIdWorkflowsDraftLoopNodesByNodeIdRunBody, - params: zPostRagPipelinesByPipelineIdWorkflowsDraftLoopNodesByNodeIdRunPath, - }), - ) - .output(zPostRagPipelinesByPipelineIdWorkflowsDraftLoopNodesByNodeIdRunResponse) - -export const run3 = { - post: post12, -} - -export const byNodeId3 = { - run: run3, -} - -export const nodes3 = { - byNodeId: byNodeId3, -} - -export const loop = { - nodes: nodes3, -} - -export const get13 = oc +export const get11 = oc .route({ inputStructure: 'detailed', method: 'GET', @@ -715,13 +542,13 @@ export const get13 = oc .output(zGetRagPipelinesByPipelineIdWorkflowsDraftNodesByNodeIdLastRunResponse) export const lastRun = { - get: get13, + get: get11, } /** * Run draft workflow node */ -export const post13 = oc +export const post10 = oc .route({ inputStructure: 'detailed', method: 'POST', @@ -738,8 +565,8 @@ export const post13 = oc ) .output(zPostRagPipelinesByPipelineIdWorkflowsDraftNodesByNodeIdRunResponse) -export const run4 = { - post: post13, +export const run = { + post: post10, } export const delete2 = oc @@ -756,7 +583,7 @@ export const delete2 = oc ) .output(zDeleteRagPipelinesByPipelineIdWorkflowsDraftNodesByNodeIdVariablesResponse) -export const get14 = oc +export const get12 = oc .route({ inputStructure: 'detailed', method: 'GET', @@ -769,23 +596,23 @@ export const get14 = oc export const variables = { delete: delete2, - get: get14, + get: get12, } -export const byNodeId4 = { +export const byNodeId = { lastRun, - run: run4, + run, variables, } -export const nodes4 = { - byNodeId: byNodeId4, +export const nodes = { + byNodeId, } /** * Get first step parameters of rag pipeline */ -export const get15 = oc +export const get13 = oc .route({ inputStructure: 'detailed', method: 'GET', @@ -803,7 +630,7 @@ export const get15 = oc .output(zGetRagPipelinesByPipelineIdWorkflowsDraftPreProcessingParametersResponse) export const parameters = { - get: get15, + get: get13, } export const preProcessing = { @@ -813,7 +640,7 @@ export const preProcessing = { /** * Get second step parameters of rag pipeline */ -export const get16 = oc +export const get14 = oc .route({ inputStructure: 'detailed', method: 'GET', @@ -831,38 +658,14 @@ export const get16 = oc .output(zGetRagPipelinesByPipelineIdWorkflowsDraftProcessingParametersResponse) export const parameters2 = { - get: get16, + get: get14, } export const processing = { parameters: parameters2, } -/** - * Run draft workflow - */ -export const post14 = oc - .route({ - inputStructure: 'detailed', - method: 'POST', - operationId: 'postRagPipelinesByPipelineIdWorkflowsDraftRun', - path: '/rag/pipelines/{pipeline_id}/workflows/draft/run', - summary: 'Run draft workflow', - tags: ['console'], - }) - .input( - z.object({ - body: zPostRagPipelinesByPipelineIdWorkflowsDraftRunBody, - params: zPostRagPipelinesByPipelineIdWorkflowsDraftRunPath, - }), - ) - .output(zPostRagPipelinesByPipelineIdWorkflowsDraftRunResponse) - -export const run5 = { - post: post14, -} - -export const get17 = oc +export const get15 = oc .route({ inputStructure: 'detailed', method: 'GET', @@ -874,7 +677,7 @@ export const get17 = oc .output(zGetRagPipelinesByPipelineIdWorkflowsDraftSystemVariablesResponse) export const systemVariables = { - get: get17, + get: get15, } export const put = oc @@ -908,7 +711,7 @@ export const delete3 = oc ) .output(zDeleteRagPipelinesByPipelineIdWorkflowsDraftVariablesByVariableIdResponse) -export const get18 = oc +export const get16 = oc .route({ inputStructure: 'detailed', method: 'GET', @@ -937,7 +740,7 @@ export const patch2 = oc export const byVariableId = { delete: delete3, - get: get18, + get: get16, patch: patch2, reset, } @@ -957,7 +760,7 @@ export const delete4 = oc /** * Get draft workflow */ -export const get19 = oc +export const get17 = oc .route({ inputStructure: 'detailed', method: 'GET', @@ -976,14 +779,14 @@ export const get19 = oc export const variables2 = { delete: delete4, - get: get19, + get: get17, byVariableId, } /** * Get draft rag pipeline's workflow */ -export const get20 = oc +export const get18 = oc .route({ inputStructure: 'detailed', method: 'GET', @@ -998,7 +801,7 @@ export const get20 = oc /** * Sync draft workflow */ -export const post15 = oc +export const post11 = oc .route({ inputStructure: 'detailed', method: 'POST', @@ -1016,16 +819,13 @@ export const post15 = oc .output(zPostRagPipelinesByPipelineIdWorkflowsDraftResponse) export const draft = { - get: get20, - post: post15, + get: get18, + post: post11, datasource, environmentVariables, - iteration, - loop, - nodes: nodes4, + nodes, preProcessing, processing, - run: run5, systemVariables, variables: variables2, } @@ -1033,7 +833,7 @@ export const draft = { /** * Get published pipeline */ -export const get21 = oc +export const get19 = oc .route({ inputStructure: 'detailed', method: 'GET', @@ -1048,7 +848,7 @@ export const get21 = oc /** * Publish workflow */ -export const post16 = oc +export const post12 = oc .route({ inputStructure: 'detailed', method: 'POST', @@ -1061,14 +861,14 @@ export const post16 = oc .output(zPostRagPipelinesByPipelineIdWorkflowsPublishResponse) export const publish2 = { - get: get21, - post: post16, + get: get19, + post: post12, } /** * Run datasource content preview */ -export const post17 = oc +export const post13 = oc .route({ inputStructure: 'detailed', method: 'POST', @@ -1086,50 +886,25 @@ export const post17 = oc .output(zPostRagPipelinesByPipelineIdWorkflowsPublishedDatasourceNodesByNodeIdPreviewResponse) export const preview = { - post: post17, + post: post13, } -/** - * Run rag pipeline datasource - */ -export const post18 = oc - .route({ - inputStructure: 'detailed', - method: 'POST', - operationId: 'postRagPipelinesByPipelineIdWorkflowsPublishedDatasourceNodesByNodeIdRun', - path: '/rag/pipelines/{pipeline_id}/workflows/published/datasource/nodes/{node_id}/run', - summary: 'Run rag pipeline datasource', - tags: ['console'], - }) - .input( - z.object({ - body: zPostRagPipelinesByPipelineIdWorkflowsPublishedDatasourceNodesByNodeIdRunBody, - params: zPostRagPipelinesByPipelineIdWorkflowsPublishedDatasourceNodesByNodeIdRunPath, - }), - ) - .output(zPostRagPipelinesByPipelineIdWorkflowsPublishedDatasourceNodesByNodeIdRunResponse) - -export const run6 = { - post: post18, -} - -export const byNodeId5 = { +export const byNodeId2 = { preview, - run: run6, } -export const nodes5 = { - byNodeId: byNodeId5, +export const nodes2 = { + byNodeId: byNodeId2, } export const datasource2 = { - nodes: nodes5, + nodes: nodes2, } /** * Get first step parameters of rag pipeline */ -export const get22 = oc +export const get20 = oc .route({ inputStructure: 'detailed', method: 'GET', @@ -1147,7 +922,7 @@ export const get22 = oc .output(zGetRagPipelinesByPipelineIdWorkflowsPublishedPreProcessingParametersResponse) export const parameters3 = { - get: get22, + get: get20, } export const preProcessing2 = { @@ -1157,7 +932,7 @@ export const preProcessing2 = { /** * Get second step parameters of rag pipeline */ -export const get23 = oc +export const get21 = oc .route({ inputStructure: 'detailed', method: 'GET', @@ -1175,45 +950,20 @@ export const get23 = oc .output(zGetRagPipelinesByPipelineIdWorkflowsPublishedProcessingParametersResponse) export const parameters4 = { - get: get23, + get: get21, } export const processing2 = { parameters: parameters4, } -/** - * Run published workflow - */ -export const post19 = oc - .route({ - inputStructure: 'detailed', - method: 'POST', - operationId: 'postRagPipelinesByPipelineIdWorkflowsPublishedRun', - path: '/rag/pipelines/{pipeline_id}/workflows/published/run', - summary: 'Run published workflow', - tags: ['console'], - }) - .input( - z.object({ - body: zPostRagPipelinesByPipelineIdWorkflowsPublishedRunBody, - params: zPostRagPipelinesByPipelineIdWorkflowsPublishedRunPath, - }), - ) - .output(zPostRagPipelinesByPipelineIdWorkflowsPublishedRunResponse) - -export const run7 = { - post: post19, -} - export const published = { datasource: datasource2, preProcessing: preProcessing2, processing: processing2, - run: run7, } -export const post20 = oc +export const post14 = oc .route({ inputStructure: 'detailed', method: 'POST', @@ -1225,7 +975,7 @@ export const post20 = oc .output(zPostRagPipelinesByPipelineIdWorkflowsByWorkflowIdRestoreResponse) export const restore = { - post: post20, + post: post14, } /** @@ -1273,7 +1023,7 @@ export const byWorkflowId = { /** * Get published workflows */ -export const get24 = oc +export const get22 = oc .route({ inputStructure: 'detailed', method: 'GET', @@ -1291,8 +1041,7 @@ export const get24 = oc .output(zGetRagPipelinesByPipelineIdWorkflowsResponse) export const workflows = { - get: get24, - defaultWorkflowBlockConfigs, + get: get22, draft, publish: publish2, published, diff --git a/packages/contracts/generated/api/console/rag/types.gen.ts b/packages/contracts/generated/api/console/rag/types.gen.ts index b9862a8d1e8..99ffbff6d7f 100644 --- a/packages/contracts/generated/api/console/rag/types.gen.ts +++ b/packages/contracts/generated/api/console/rag/types.gen.ts @@ -89,7 +89,7 @@ export type PipelineTemplateDetailResponse = { name: string } -export type RagPipelineOpaqueResponse = unknown +export type DatasourcePluginListResponse = Array export type RagPipelineImportPayload = { description?: string | null @@ -107,6 +107,21 @@ export type RagPipelineImportCheckDependenciesResponse = { leaked_dependencies?: Array } +export type RagPipelineRecommendedPluginResponse = { + installed_recommended_plugins: Array<{ + [key: string]: unknown + }> + uninstalled_recommended_plugins: Array<{ + [key: string]: unknown + }> +} + +export type RagPipelineTransformResponse = { + dataset_id: string + pipeline_id: string + status: string +} + export type WorkflowRunPaginationResponse = { data: Array has_more: boolean @@ -119,7 +134,7 @@ export type SimpleResultResponse = { export type WorkflowRunDetailResponse = { created_at?: number | null - created_by_account?: SimpleAccount | null + created_by_account?: SimpleAccountResponse | null created_by_end_user?: SimpleEndUser | null created_by_role?: string | null elapsed_time?: number | null @@ -147,18 +162,10 @@ export type WorkflowPaginationResponse = { page: number } -export type DefaultBlockConfigsResponse = Array<{ - [key: string]: unknown -}> - -export type DefaultBlockConfigResponse = { - [key: string]: unknown -} - export type WorkflowResponse = { conversation_variables: Array created_at: number - created_by?: SimpleAccount | null + created_by?: SimpleAccountResponse | null environment_variables: Array features: { [key: string]: unknown @@ -173,7 +180,7 @@ export type WorkflowResponse = { rag_pipeline_variables: Array tool_published: boolean updated_at: number - updated_by?: SimpleAccount | null + updated_by?: SimpleAccountResponse | null version: string } @@ -202,14 +209,6 @@ export type RagPipelineWorkflowSyncResponse = { updated_at: number } -export type DatasourceNodeRunPayload = { - credential_id?: string | null - datasource_type: string - inputs: { - [key: string]: unknown - } -} - export type DatasourceVariablesPayload = { datasource_info: { [key: string]: unknown @@ -221,7 +220,7 @@ export type DatasourceVariablesPayload = { export type WorkflowRunNodeExecutionResponse = { created_at?: number | null - created_by_account?: SimpleAccount | null + created_by_account?: SimpleAccountResponse | null created_by_end_user?: SimpleEndUser | null created_by_role?: string | null elapsed_time?: number | null @@ -248,12 +247,6 @@ export type EnvironmentVariableListResponse = { items: Array } -export type NodeRunPayload = { - inputs?: { - [key: string]: unknown - } | null -} - export type NodeRunRequiredPayload = { inputs: { [key: string]: unknown @@ -264,21 +257,10 @@ export type WorkflowDraftVariableList = { items?: Array } -export type RagPipelineStepParametersResponse = { +export type RagPipelineVariablesResponse = { variables: unknown } -export type DraftWorkflowRunPayload = { - datasource_info_list: Array<{ - [key: string]: unknown - }> - datasource_type: string - inputs: { - [key: string]: unknown - } - start_node_id: string -} - export type WorkflowDraftVariableListWithoutValue = { items?: Array total?: number @@ -329,20 +311,6 @@ export type Parser = { export type DataSourceContentPreviewResponse = unknown -export type PublishedWorkflowRunPayload = { - datasource_info_list: Array<{ - [key: string]: unknown - }> - datasource_type: string - inputs: { - [key: string]: unknown - } - is_preview?: boolean - original_document_id?: string | null - response_mode?: 'blocking' | 'streaming' - start_node_id: string -} - export type WorkflowUpdatePayload = { marked_comment?: string | null marked_name?: string | null @@ -413,6 +381,14 @@ export type PipelineTemplateItemResponse = { privacy_policy?: string | null } +export type PluginDatasourceProviderEntity = { + declaration: DatasourceProviderEntityWithPlugin + is_authorized?: boolean + plugin_id: string + plugin_unique_identifier: string + provider: string +} + export type PluginDependency = { current_identifier?: string | null type: Type @@ -421,7 +397,7 @@ export type PluginDependency = { export type WorkflowRunForListResponse = { created_at?: number | null - created_by_account?: SimpleAccount | null + created_by_account?: SimpleAccountResponse | null elapsed_time?: number | null exceptions_count?: number | null finished_at?: number | null @@ -433,7 +409,7 @@ export type WorkflowRunForListResponse = { version?: string | null } -export type SimpleAccount = { +export type SimpleAccountResponse = { email: string id: string name: string @@ -515,6 +491,14 @@ export type DatasetWeightedScoreResponse = { weight_type?: string | null } +export type DatasourceProviderEntityWithPlugin = { + credentials_schema?: Array + datasources?: Array + identity: DatasourceProviderIdentity + oauth_schema?: OAuthSchema | null + provider_type: DatasourceProviderType +} + export type Type = 'github' | 'marketplace' | 'package' export type Github = { @@ -544,6 +528,162 @@ export type DatasetVectorSettingResponse = { vector_weight?: number | null } +export type ProviderConfig = { + default?: number | string | number | boolean | null + help?: I18nObject | null + label?: I18nObject | null + multiple?: boolean + name: string + options?: Array