From 976926c6ea5a907f6b2db3fc50151fd0c051e62c Mon Sep 17 00:00:00 2001 From: chariri Date: Fri, 26 Jun 2026 02:54:52 +0900 Subject: [PATCH 1/2] refactor(api): migrate console explore endpoints to BaseModel --- api/controllers/console/explore/completion.py | 14 +- api/controllers/console/explore/message.py | 5 +- api/controllers/console/explore/trial.py | 154 ++-- api/controllers/console/explore/workflow.py | 9 +- api/controllers/console/extension.py | 78 +- api/controllers/console/tag/tags.py | 48 +- api/openapi/markdown/console-openapi.md | 312 +++----- .../controllers/console/explore/test_trial.py | 228 +++--- .../generated/api/console/agent/types.gen.ts | 32 +- .../generated/api/console/agent/zod.gen.ts | 121 +-- .../console/api-based-extension/zod.gen.ts | 3 + .../generated/api/console/apps/types.gen.ts | 32 +- .../generated/api/console/apps/zod.gen.ts | 233 +++--- .../api/console/installed-apps/orpc.gen.ts | 142 +--- .../api/console/installed-apps/types.gen.ts | 108 --- .../api/console/installed-apps/zod.gen.ts | 96 --- .../console/instruction-generate/types.gen.ts | 41 +- .../console/instruction-generate/zod.gen.ts | 44 +- .../console/rule-code-generate/types.gen.ts | 41 +- .../api/console/rule-code-generate/zod.gen.ts | 44 +- .../api/console/rule-generate/types.gen.ts | 41 +- .../api/console/rule-generate/zod.gen.ts | 44 +- .../types.gen.ts | 41 +- .../zod.gen.ts | 44 +- .../generated/api/console/tags/types.gen.ts | 14 +- .../generated/api/console/tags/zod.gen.ts | 7 +- .../api/console/trial-apps/orpc.gen.ts | 84 +-- .../api/console/trial-apps/types.gen.ts | 544 +++++++------- .../api/console/trial-apps/zod.gen.ts | 686 +++++++++--------- .../console/workflow-generate/types.gen.ts | 41 +- .../api/console/workflow-generate/zod.gen.ts | 44 +- packages/contracts/openapi-ts.api.config.ts | 78 +- 32 files changed, 1673 insertions(+), 1780 deletions(-) diff --git a/api/controllers/console/explore/completion.py b/api/controllers/console/explore/completion.py index 729be6a909b..eb108f6760c 100644 --- a/api/controllers/console/explore/completion.py +++ b/api/controllers/console/explore/completion.py @@ -6,7 +6,7 @@ from pydantic import BaseModel, Field, field_validator from werkzeug.exceptions import InternalServerError, NotFound import services -from controllers.common.fields import GeneratedAppResponse, SimpleResultResponse +from controllers.common.fields import SimpleResultResponse from controllers.common.schema import register_response_schema_models, register_schema_models from controllers.console.app.error import ( AppUnavailableError, @@ -73,7 +73,7 @@ class ChatMessagePayload(BaseModel): register_schema_models(console_ns, CompletionMessageExplorePayload, ChatMessagePayload) -register_response_schema_models(console_ns, GeneratedAppResponse, SimpleResultResponse) +register_response_schema_models(console_ns, SimpleResultResponse) # define completion api for user @@ -83,7 +83,7 @@ register_response_schema_models(console_ns, GeneratedAppResponse, SimpleResultRe ) class CompletionApi(InstalledAppResource): @console_ns.expect(console_ns.models[CompletionMessageExplorePayload.__name__]) - @console_ns.response(200, "Success", console_ns.models[GeneratedAppResponse.__name__]) + @console_ns.response(200, "Success") @with_current_user def post(self, current_user: Account, installed_app: InstalledApp): app_model = installed_app.app @@ -106,6 +106,7 @@ class CompletionApi(InstalledAppResource): app_model=app_model, user=current_user, args=args, invoke_from=InvokeFrom.EXPLORE, streaming=streaming ) + # response-contract:ignore compact_generate_response return helper.compact_generate_response(response) except services.errors.conversation.ConversationNotExistsError: raise NotFound("Conversation Not Exists.") @@ -150,7 +151,7 @@ class CompletionStopApi(InstalledAppResource): app_mode=AppMode.value_of(app_model.mode), ) - return {"result": "success"}, 200 + return SimpleResultResponse(result="success").model_dump(mode="json"), 200 @console_ns.route( @@ -159,7 +160,7 @@ class CompletionStopApi(InstalledAppResource): ) class ChatApi(InstalledAppResource): @console_ns.expect(console_ns.models[ChatMessagePayload.__name__]) - @console_ns.response(200, "Success", console_ns.models[GeneratedAppResponse.__name__]) + @console_ns.response(200, "Success") @with_current_user def post(self, current_user: Account, installed_app: InstalledApp): app_model = installed_app.app @@ -182,6 +183,7 @@ class ChatApi(InstalledAppResource): app_model=app_model, user=current_user, args=args, invoke_from=InvokeFrom.EXPLORE, streaming=True ) + # response-contract:ignore compact_generate_response return helper.compact_generate_response(response) except services.errors.conversation.ConversationNotExistsError: raise NotFound("Conversation Not Exists.") @@ -229,4 +231,4 @@ class ChatStopApi(InstalledAppResource): app_mode=app_mode, ) - return {"result": "success"}, 200 + return SimpleResultResponse(result="success").model_dump(mode="json"), 200 diff --git a/api/controllers/console/explore/message.py b/api/controllers/console/explore/message.py index 2be550b2f28..8f248955709 100644 --- a/api/controllers/console/explore/message.py +++ b/api/controllers/console/explore/message.py @@ -7,7 +7,6 @@ from pydantic import BaseModel, TypeAdapter from werkzeug.exceptions import InternalServerError, NotFound from controllers.common.controller_schemas import MessageFeedbackPayload, MessageListQuery -from controllers.common.fields import GeneratedAppResponse from controllers.common.schema import query_params_from_model, register_response_schema_models, register_schema_models from controllers.console.app.error import ( AppMoreLikeThisDisabledError, @@ -59,7 +58,6 @@ class MoreLikeThisQuery(BaseModel): register_schema_models(console_ns, MessageListQuery, MessageFeedbackPayload, MoreLikeThisQuery) register_response_schema_models( console_ns, - GeneratedAppResponse, ExploreMessageInfiniteScrollPagination, ResultResponse, SuggestedQuestionsResponse, @@ -142,7 +140,7 @@ class MessageFeedbackApi(InstalledAppResource): ) class MessageMoreLikeThisApi(InstalledAppResource): @console_ns.doc(params=query_params_from_model(MoreLikeThisQuery)) - @console_ns.response(200, "Success", console_ns.models[GeneratedAppResponse.__name__]) + @console_ns.response(200, "Success") @with_current_user def get(self, current_user: Account, installed_app: InstalledApp, message_id: UUID): app_model = installed_app.app @@ -165,6 +163,7 @@ class MessageMoreLikeThisApi(InstalledAppResource): invoke_from=InvokeFrom.EXPLORE, streaming=streaming, ) + # response-contract:ignore compact_generate_response return helper.compact_generate_response(response) except MessageNotExistsError: raise NotFound("Message Not Exists.") 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/explore/workflow.py b/api/controllers/console/explore/workflow.py index f4e9e3cd7ef..ad6e23b24d1 100644 --- a/api/controllers/console/explore/workflow.py +++ b/api/controllers/console/explore/workflow.py @@ -3,7 +3,7 @@ import logging from werkzeug.exceptions import InternalServerError from controllers.common.controller_schemas import WorkflowRunPayload -from controllers.common.fields import GeneratedAppResponse, SimpleResultResponse +from controllers.common.fields import SimpleResultResponse from controllers.common.schema import register_response_schema_models, register_schema_model from controllers.console.app.error import ( CompletionRequestError, @@ -36,13 +36,13 @@ from .. import console_ns logger = logging.getLogger(__name__) register_schema_model(console_ns, WorkflowRunPayload) -register_response_schema_models(console_ns, GeneratedAppResponse, SimpleResultResponse) +register_response_schema_models(console_ns, SimpleResultResponse) @console_ns.route("/installed-apps//workflows/run") class InstalledAppWorkflowRunApi(InstalledAppResource): @console_ns.expect(console_ns.models[WorkflowRunPayload.__name__]) - @console_ns.response(200, "Success", console_ns.models[GeneratedAppResponse.__name__]) + @console_ns.response(200, "Success") @with_current_user def post(self, current_user: Account, installed_app: InstalledApp): """ @@ -62,6 +62,7 @@ class InstalledAppWorkflowRunApi(InstalledAppResource): app_model=app_model, user=current_user, args=args, invoke_from=InvokeFrom.EXPLORE, streaming=True ) + # response-contract:ignore compact_generate_response return helper.compact_generate_response(response) except ProviderTokenNotInitError as ex: raise ProviderNotInitializeError(ex.description) @@ -101,4 +102,4 @@ class InstalledAppWorkflowTaskStopApi(InstalledAppResource): # 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/extension.py b/api/controllers/console/extension.py index ec1e01dc460..4b149b9c08d 100644 --- a/api/controllers/console/extension.py +++ b/api/controllers/console/extension.py @@ -4,18 +4,18 @@ from uuid import UUID from flask import request from flask_restx import Resource -from pydantic import BaseModel, Field, TypeAdapter, field_validator +from pydantic import BaseModel, Field, RootModel, field_validator from constants import HIDDEN_VALUE from extensions.ext_database import db from fields.base import ResponseModel -from libs.helper import to_timestamp +from libs.helper import dump_response, to_timestamp from libs.login import login_required from models.api_based_extension import APIBasedExtension from services.api_based_extension_service import APIBasedExtensionService from services.code_based_extension_service import CodeBasedExtensionService -from ..common.schema import DEFAULT_REF_TEMPLATE_OPENAPI_3_0, query_params_from_model, register_schema_models +from ..common.schema import query_params_from_model, register_response_schema_models, register_schema_models from . import console_ns from .wraps import account_initialization_required, setup_required, with_current_tenant_id @@ -61,36 +61,21 @@ class APIBasedExtensionResponse(ResponseModel): return to_timestamp(value) +class APIBasedExtensionListResponse(RootModel[list[APIBasedExtensionResponse]]): + pass + + register_schema_models( console_ns, CodeBasedExtensionQuery, APIBasedExtensionPayload, +) +register_response_schema_models( + console_ns, CodeBasedExtensionResponse, APIBasedExtensionResponse, + APIBasedExtensionListResponse, ) -console_ns.schema_model( - "APIBasedExtensionListResponse", - TypeAdapter(list[APIBasedExtensionResponse]).json_schema(ref_template=DEFAULT_REF_TEMPLATE_OPENAPI_3_0), -) - - -def _serialize_api_based_extension(extension: APIBasedExtension) -> dict[str, Any]: - return APIBasedExtensionResponse.model_validate(extension, from_attributes=True).model_dump(mode="json") - - -def _serialize_saved_api_based_extension(extension: APIBasedExtension, api_key: str) -> dict[str, Any]: - """Serialize a saved extension with the plaintext key used for response masking only. - - APIBasedExtensionService.save mutates the ORM object to hold the encrypted token before returning it. The response - contract, however, should match list/detail responses, where api_key is masked from the decrypted token. - """ - return APIBasedExtensionResponse( - id=extension.id, - name=extension.name, - api_endpoint=extension.api_endpoint, - api_key=api_key, - created_at=to_timestamp(extension.created_at), - ).model_dump(mode="json") @console_ns.route("/code-based-extension") @@ -119,16 +104,16 @@ class CodeBasedExtensionAPI(Resource): class APIBasedExtensionAPI(Resource): @console_ns.doc("get_api_based_extensions") @console_ns.doc(description="Get all API-based extensions for current tenant") - @console_ns.response(200, "Success", console_ns.models["APIBasedExtensionListResponse"]) + @console_ns.response(200, "Success", console_ns.models[APIBasedExtensionListResponse.__name__]) @setup_required @login_required @account_initialization_required @with_current_tenant_id def get(self, current_tenant_id: str): - return [ - _serialize_api_based_extension(extension) - for extension in APIBasedExtensionService.get_all_by_tenant_id(db.session(), current_tenant_id) - ] + return dump_response( + APIBasedExtensionListResponse, + APIBasedExtensionService.get_all_by_tenant_id(db.session(), current_tenant_id), + ) @console_ns.doc("create_api_based_extension") @console_ns.doc(description="Create a new API-based extension") @@ -148,12 +133,14 @@ class APIBasedExtensionAPI(Resource): api_key=payload.api_key, ) - return ( - _serialize_saved_api_based_extension( - APIBasedExtensionService.save(db.session(), extension_data), payload.api_key - ), - 201, - ) + extension = APIBasedExtensionService.save(db.session(), extension_data) + return APIBasedExtensionResponse( + id=extension.id, + name=extension.name, + api_endpoint=extension.api_endpoint, + api_key=payload.api_key, + created_at=to_timestamp(extension.created_at), + ).model_dump(mode="json"), 201 @console_ns.route("/api-based-extension/") @@ -169,8 +156,9 @@ class APIBasedExtensionDetailAPI(Resource): def get(self, current_tenant_id: str, id: UUID): api_based_extension_id = str(id) - return _serialize_api_based_extension( - APIBasedExtensionService.get_with_tenant_id(db.session(), current_tenant_id, api_based_extension_id) + return dump_response( + APIBasedExtensionResponse, + APIBasedExtensionService.get_with_tenant_id(db.session(), current_tenant_id, api_based_extension_id), ) @console_ns.doc("update_api_based_extension") @@ -199,10 +187,14 @@ class APIBasedExtensionDetailAPI(Resource): extension_data_from_db.api_key = payload.api_key api_key_for_response = payload.api_key - return _serialize_saved_api_based_extension( - APIBasedExtensionService.save(db.session(), extension_data_from_db), - api_key_for_response, - ) + APIBasedExtensionService.save(db.session(), extension_data_from_db) + return APIBasedExtensionResponse( + id=extension_data_from_db.id, + name=extension_data_from_db.name, + api_endpoint=extension_data_from_db.api_endpoint, + api_key=api_key_for_response, + created_at=to_timestamp(extension_data_from_db.created_at), + ).model_dump(mode="json") @console_ns.doc("delete_api_based_extension") @console_ns.doc(description="Delete API-based extension") diff --git a/api/controllers/console/tag/tags.py b/api/controllers/console/tag/tags.py index 38e7395ccf8..90fa805e939 100644 --- a/api/controllers/console/tag/tags.py +++ b/api/controllers/console/tag/tags.py @@ -3,7 +3,7 @@ from uuid import UUID from flask import request from flask_restx import Resource -from pydantic import BaseModel, Field, field_validator +from pydantic import BaseModel, Field, RootModel, field_validator from werkzeug.exceptions import Forbidden from controllers.common.fields import SimpleResultResponse @@ -18,6 +18,7 @@ from controllers.console.wraps import ( ) from extensions.ext_database import db from fields.base import ResponseModel +from libs.helper import dump_response from libs.login import login_required from models import Account from models.enums import TagType @@ -79,6 +80,10 @@ class TagResponse(ResponseModel): return str(value) +class TagListResponse(RootModel[list[TagResponse]]): + pass + + register_schema_models( console_ns, TagBasePayload, @@ -86,9 +91,8 @@ register_schema_models( TagBindingPayload, TagBindingRemovePayload, TagListQueryParam, - TagResponse, ) -register_response_schema_models(console_ns, SimpleResultResponse) +register_response_schema_models(console_ns, SimpleResultResponse, TagResponse, TagListResponse) @console_ns.route("/tags") @@ -97,18 +101,14 @@ class TagListApi(Resource): @login_required @account_initialization_required @console_ns.doc(params=query_params_from_model(TagListQueryParam)) - @console_ns.doc(responses={200: ("Success", [console_ns.models[TagResponse.__name__]])}) + @console_ns.response(200, "Success", console_ns.models[TagListResponse.__name__]) @with_current_tenant_id def get(self, current_tenant_id: str): raw_args = request.args.to_dict() param = TagListQueryParam.model_validate(raw_args) tags = TagService.get_tags(db.session(), param.type, current_tenant_id, param.keyword) - serialized_tags = [ - TagResponse.model_validate(tag, from_attributes=True).model_dump(mode="json") for tag in tags - ] - - return serialized_tags, 200 + return dump_response(TagListResponse, tags), 200 @console_ns.expect(console_ns.models[TagBasePayload.__name__]) @console_ns.response(200, "Success", console_ns.models[TagResponse.__name__]) @@ -124,11 +124,7 @@ class TagListApi(Resource): payload = TagBasePayload.model_validate(console_ns.payload or {}) tag = TagService.save_tags(SaveTagPayload(name=payload.name, type=payload.type), db.session) - response = TagResponse.model_validate( - {"id": tag.id, "name": tag.name, "type": tag.type, "binding_count": 0} - ).model_dump(mode="json") - - return response, 200 + return dump_response(TagResponse, {"id": tag.id, "name": tag.name, "type": tag.type, "binding_count": 0}), 200 @console_ns.route("/tags/") @@ -150,11 +146,13 @@ class TagUpdateDeleteApi(Resource): binding_count = TagService.get_tag_binding_count(tag_id_str, db.session) - response = TagResponse.model_validate( - {"id": tag.id, "name": tag.name, "type": tag.type, "binding_count": binding_count} - ).model_dump(mode="json") - - return response, 200 + return ( + dump_response( + TagResponse, + {"id": tag.id, "name": tag.name, "type": tag.type, "binding_count": binding_count}, + ), + 200, + ) @setup_required @login_required @@ -180,7 +178,7 @@ def _require_tag_binding_edit_permission(current_user: Account) -> None: raise Forbidden() -def _create_tag_bindings(current_user: Account) -> tuple[dict[str, str], int]: +def _create_tag_bindings(current_user: Account) -> None: _require_tag_binding_edit_permission(current_user) payload = TagBindingPayload.model_validate(console_ns.payload or {}) @@ -192,10 +190,9 @@ def _create_tag_bindings(current_user: Account) -> tuple[dict[str, str], int]: ), db.session, ) - return {"result": "success"}, 200 -def _remove_tag_bindings(current_user: Account) -> tuple[dict[str, str], int]: +def _remove_tag_bindings(current_user: Account) -> None: _require_tag_binding_edit_permission(current_user) payload = TagBindingRemovePayload.model_validate(console_ns.payload or {}) @@ -207,7 +204,6 @@ def _remove_tag_bindings(current_user: Account) -> tuple[dict[str, str], int]: ), db.session, ) - return {"result": "success"}, 200 @console_ns.route("/tag-bindings") @@ -222,7 +218,8 @@ class TagBindingCollectionApi(Resource): @account_initialization_required @with_current_user def post(self, current_user: Account): - return _create_tag_bindings(current_user) + _create_tag_bindings(current_user) + return SimpleResultResponse(result="success").model_dump(mode="json"), 200 @console_ns.route("/tag-bindings/remove") @@ -238,4 +235,5 @@ class TagBindingRemoveApi(Resource): @account_initialization_required @with_current_user def post(self, current_user: Account): - return _remove_tag_bindings(current_user) + _remove_tag_bindings(current_user) + return SimpleResultResponse(result="success").model_dump(mode="json"), 200 diff --git a/api/openapi/markdown/console-openapi.md b/api/openapi/markdown/console-openapi.md index b3a0b8a6a71..3d1e70c17a5 100644 --- a/api/openapi/markdown/console-openapi.md +++ b/api/openapi/markdown/console-openapi.md @@ -6451,9 +6451,9 @@ Request body: #### Responses -| Code | Description | Schema | -| ---- | ----------- | ------ | -| 200 | Success | **application/json**: [GeneratedAppResponse](#generatedappresponse)
| +| Code | Description | +| ---- | ----------- | +| 200 | Success | ### [POST] /installed-apps/{installed_app_id}/chat-messages/{task_id}/stop #### Parameters @@ -6484,9 +6484,9 @@ Request body: #### Responses -| Code | Description | Schema | -| ---- | ----------- | ------ | -| 200 | Success | **application/json**: [GeneratedAppResponse](#generatedappresponse)
| +| Code | Description | +| ---- | ----------- | +| 200 | Success | ### [POST] /installed-apps/{installed_app_id}/completion-messages/{task_id}/stop #### Parameters @@ -6627,9 +6627,9 @@ Request body: #### Responses -| Code | Description | Schema | -| ---- | ----------- | ------ | -| 200 | Success | **application/json**: [GeneratedAppResponse](#generatedappresponse)
| +| Code | Description | +| ---- | ----------- | +| 200 | Success | ### [GET] /installed-apps/{installed_app_id}/messages/{message_id}/suggested-questions #### Parameters @@ -6759,9 +6759,9 @@ Request body: #### Responses -| Code | Description | Schema | -| ---- | ----------- | ------ | -| 200 | Success | **application/json**: [GeneratedAppResponse](#generatedappresponse)
| +| Code | Description | +| ---- | ----------- | +| 200 | Success | ### [POST] /installed-apps/{installed_app_id}/workflows/tasks/{task_id}/stop **Stop workflow task** @@ -8685,7 +8685,7 @@ Remove one or more tag bindings from a target. | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Success | **application/json**: [ [TagResponse](#tagresponse) ]
| +| 200 | Success | **application/json**: [TagListResponse](#taglistresponse)
| ### [POST] /tags #### Request Body @@ -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** @@ -17181,10 +17181,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 @@ -19669,6 +19689,12 @@ Model class for provider system configuration response. | keyword | string | Search keyword | No | | type | string,
**Available values:** "", "app", "knowledge", "snippet" | Tag type filter
*Enum:* `""`, `"app"`, `"knowledge"`, `"snippet"` | No | +#### TagListResponse + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| TagListResponse | array | | | + #### TagResponse | Name | Type | Description | Required | @@ -19869,97 +19895,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 +19945,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,100 +19961,6 @@ Enum class for tool provider | ---- | ---- | ----------- | -------- | | trial_models | [ string ] | | Yes | -#### TrialPipelineVariable - -| 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 | - -#### TrialSimpleAccount - -| 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 | - #### TriggerOAuthAuthorizeResponse | Name | Type | Description | Required | diff --git a/api/tests/unit_tests/controllers/console/explore/test_trial.py b/api/tests/unit_tests/controllers/console/explore/test_trial.py index be68a3beed6..2ac9fc978d8 100644 --- a/api/tests/unit_tests/controllers/console/explore/test_trial.py +++ b/api/tests/unit_tests/controllers/console/explore/test_trial.py @@ -1,4 +1,4 @@ -from inspect import unwrap as inspect_unwrap +from inspect import unwrap from io import BytesIO from typing import Any from unittest.mock import MagicMock, patch @@ -35,24 +35,16 @@ from models.model import AppMode from services.errors.conversation import ConversationNotExistsError from services.errors.llm import InvokeRateLimitError -unwrap: Any = inspect_unwrap - @pytest.fixture -def account() -> Account: - acc = Account(name="User", email="user@example.com") +def account(): + acc = MagicMock(spec=Account) acc.id = "u1" return acc -def _file_data() -> Any: - file_data: Any = BytesIO(b"fake audio data") - file_data.filename = "test.wav" - return file_data - - @pytest.fixture -def trial_app_chat() -> MagicMock: +def trial_app_chat(): app = MagicMock() app.id = "a-chat" app.mode = AppMode.CHAT @@ -60,7 +52,7 @@ def trial_app_chat() -> MagicMock: @pytest.fixture -def trial_app_completion() -> MagicMock: +def trial_app_completion(): app = MagicMock() app.id = "a-comp" app.mode = AppMode.COMPLETION @@ -68,7 +60,7 @@ def trial_app_completion() -> MagicMock: @pytest.fixture -def trial_app_workflow() -> MagicMock: +def trial_app_workflow(): app = MagicMock() app.id = "a-workflow" app.mode = AppMode.WORKFLOW @@ -76,7 +68,7 @@ def trial_app_workflow() -> MagicMock: @pytest.fixture -def valid_parameters() -> dict[str, object]: +def valid_parameters(): return { "user_input_form": [], "system_parameters": {}, @@ -92,13 +84,54 @@ def valid_parameters() -> dict[str, object]: } -def test_trial_workflow_uses_trial_scoped_simple_account_model() -> None: - assert module.simple_account_model.name == "TrialSimpleAccount" - assert hasattr(module.simple_account_model, "items") +def test_trial_workflow_registers_normalized_simple_account_response_model(): + assert "SimpleAccountResponse" in module.console_ns.models + + +def _response_model_name(entry: object) -> str: + assert isinstance(entry, tuple) + assert len(entry) >= 2 + model = entry[1] + name = getattr(model, "name", None) + assert isinstance(name, str) + return name + + +def test_trial_endpoints_keep_response_and_query_docs(): + untyped_generated_response_views = [ + module.TrialAppWorkflowRunApi.post, + module.TrialChatApi.post, + module.TrialCompletionApi.post, + ] + for view in untyped_generated_response_views: + apidoc = getattr(view, "__apidoc__", {}) + assert apidoc.get("responses", {})["200"] == ("Success", None, {}) + + cases = [ + (module.TrialMessageSuggestedQuestionApi.get, module.SuggestedQuestionsResponse.__name__), + (module.TrialChatAudioApi.post, module.AudioTranscriptResponse.__name__), + (module.TrialChatTextApi.post, module.AudioBinaryResponse.__name__), + (module.TrialSitApi.get, module.SiteResponse.__name__), + (module.TrialAppParameterApi.get, module.ParametersResponse.__name__), + (module.AppApi.get, module.AppDetailWithSite.__name__), + (module.AppWorkflowApi.get, module.WorkflowResponse.__name__), + (module.DatasetListApi.get, module.TrialDatasetListResponse.__name__), + ] + + for view, model_name in cases: + apidoc = getattr(view, "__apidoc__", {}) + responses = apidoc.get("responses", {}) + assert _response_model_name(responses["200"]) == model_name + + dataset_params = module.DatasetListApi.get.__apidoc__["params"] + assert dataset_params["ids"]["in"] == "query" + assert dataset_params["ids"]["type"] == "array" + assert dataset_params["page"]["default"] == 1 + assert dataset_params["limit"]["default"] == 20 class TestTrialAppWorkflowRunApi: - def test_not_workflow_app(self, app: Flask, account: Account) -> None: + def test_not_workflow_app(self, app: Flask, account): api = module.TrialAppWorkflowRunApi() method = unwrap(api.post) @@ -106,7 +139,7 @@ class TestTrialAppWorkflowRunApi: with pytest.raises(NotWorkflowAppError): method(api, account, MagicMock(mode=AppMode.CHAT)) - def test_success(self, app: Flask, trial_app_workflow: MagicMock, account: Account) -> None: + def test_success(self, app: Flask, trial_app_workflow, account): api = module.TrialAppWorkflowRunApi() method = unwrap(api.post) @@ -119,7 +152,7 @@ class TestTrialAppWorkflowRunApi: assert result is not None - def test_workflow_provider_not_init(self, app: Flask, trial_app_workflow: MagicMock, account: Account) -> None: + def test_workflow_provider_not_init(self, app: Flask, trial_app_workflow, account): api = module.TrialAppWorkflowRunApi() method = unwrap(api.post) @@ -134,7 +167,7 @@ class TestTrialAppWorkflowRunApi: with pytest.raises(ProviderNotInitializeError): method(api, account, trial_app_workflow) - def test_workflow_quota_exceeded(self, app: Flask, trial_app_workflow: MagicMock, account: Account) -> None: + def test_workflow_quota_exceeded(self, app: Flask, trial_app_workflow, account): api = module.TrialAppWorkflowRunApi() method = unwrap(api.post) @@ -149,7 +182,7 @@ class TestTrialAppWorkflowRunApi: with pytest.raises(ProviderQuotaExceededError): method(api, account, trial_app_workflow) - def test_workflow_model_not_support(self, app: Flask, trial_app_workflow: MagicMock, account: Account) -> None: + def test_workflow_model_not_support(self, app: Flask, trial_app_workflow, account): api = module.TrialAppWorkflowRunApi() method = unwrap(api.post) @@ -164,7 +197,7 @@ class TestTrialAppWorkflowRunApi: with pytest.raises(ProviderModelCurrentlyNotSupportError): method(api, account, trial_app_workflow) - def test_workflow_invoke_error(self, app: Flask, trial_app_workflow: MagicMock, account: Account) -> None: + def test_workflow_invoke_error(self, app: Flask, trial_app_workflow, account): api = module.TrialAppWorkflowRunApi() method = unwrap(api.post) @@ -179,7 +212,7 @@ class TestTrialAppWorkflowRunApi: with pytest.raises(CompletionRequestError): method(api, account, trial_app_workflow) - def test_workflow_rate_limit_error(self, app: Flask, trial_app_workflow: MagicMock, account: Account) -> None: + def test_workflow_rate_limit_error(self, app: Flask, trial_app_workflow, account): api = module.TrialAppWorkflowRunApi() method = unwrap(api.post) @@ -194,7 +227,7 @@ class TestTrialAppWorkflowRunApi: with pytest.raises(InvokeRateLimitHttpError): method(api, account, trial_app_workflow) - def test_workflow_value_error(self, app: Flask, trial_app_workflow: MagicMock, account: Account) -> None: + def test_workflow_value_error(self, app: Flask, trial_app_workflow, account): api = module.TrialAppWorkflowRunApi() method = unwrap(api.post) @@ -209,7 +242,7 @@ class TestTrialAppWorkflowRunApi: with pytest.raises(ValueError): method(api, account, trial_app_workflow) - def test_workflow_generic_exception(self, app: Flask, trial_app_workflow: MagicMock, account: Account) -> None: + def test_workflow_generic_exception(self, app: Flask, trial_app_workflow, account): api = module.TrialAppWorkflowRunApi() method = unwrap(api.post) @@ -226,7 +259,7 @@ class TestTrialAppWorkflowRunApi: class TestTrialChatApi: - def test_not_chat_app(self, app: Flask, account: Account) -> None: + def test_not_chat_app(self, app: Flask, account): api = module.TrialChatApi() method = unwrap(api.post) @@ -234,7 +267,7 @@ class TestTrialChatApi: with pytest.raises(NotChatAppError): method(api, account, MagicMock(mode="completion")) - def test_success(self, app: Flask, trial_app_chat: MagicMock, account: Account) -> None: + def test_success(self, app: Flask, trial_app_chat, account): api = module.TrialChatApi() method = unwrap(api.post) @@ -247,7 +280,7 @@ class TestTrialChatApi: assert result is not None - def test_chat_conversation_not_exists(self, app: Flask, trial_app_chat: MagicMock, account: Account) -> None: + def test_chat_conversation_not_exists(self, app: Flask, trial_app_chat, account): api = module.TrialChatApi() method = unwrap(api.post) @@ -262,7 +295,7 @@ class TestTrialChatApi: with pytest.raises(NotFound): method(api, account, trial_app_chat) - def test_chat_conversation_completed(self, app: Flask, trial_app_chat: MagicMock, account: Account) -> None: + def test_chat_conversation_completed(self, app: Flask, trial_app_chat, account): api = module.TrialChatApi() method = unwrap(api.post) @@ -277,7 +310,7 @@ class TestTrialChatApi: with pytest.raises(ConversationCompletedError): method(api, account, trial_app_chat) - def test_chat_app_config_broken(self, app: Flask, trial_app_chat: MagicMock, account: Account) -> None: + def test_chat_app_config_broken(self, app: Flask, trial_app_chat, account): api = module.TrialChatApi() method = unwrap(api.post) @@ -292,7 +325,7 @@ class TestTrialChatApi: with pytest.raises(AppUnavailableError): method(api, account, trial_app_chat) - def test_chat_provider_not_init(self, app: Flask, trial_app_chat: MagicMock, account: Account) -> None: + def test_chat_provider_not_init(self, app: Flask, trial_app_chat, account): api = module.TrialChatApi() method = unwrap(api.post) @@ -307,7 +340,7 @@ class TestTrialChatApi: with pytest.raises(ProviderNotInitializeError): method(api, account, trial_app_chat) - def test_chat_quota_exceeded(self, app: Flask, trial_app_chat: MagicMock, account: Account) -> None: + def test_chat_quota_exceeded(self, app: Flask, trial_app_chat, account): api = module.TrialChatApi() method = unwrap(api.post) @@ -322,7 +355,7 @@ class TestTrialChatApi: with pytest.raises(ProviderQuotaExceededError): method(api, account, trial_app_chat) - def test_chat_model_not_support(self, app: Flask, trial_app_chat: MagicMock, account: Account) -> None: + def test_chat_model_not_support(self, app: Flask, trial_app_chat, account): api = module.TrialChatApi() method = unwrap(api.post) @@ -337,7 +370,7 @@ class TestTrialChatApi: with pytest.raises(ProviderModelCurrentlyNotSupportError): method(api, account, trial_app_chat) - def test_chat_invoke_error(self, app: Flask, trial_app_chat: MagicMock, account: Account) -> None: + def test_chat_invoke_error(self, app: Flask, trial_app_chat, account): api = module.TrialChatApi() method = unwrap(api.post) @@ -352,7 +385,7 @@ class TestTrialChatApi: with pytest.raises(CompletionRequestError): method(api, account, trial_app_chat) - def test_chat_rate_limit_error(self, app: Flask, trial_app_chat: MagicMock, account: Account) -> None: + def test_chat_rate_limit_error(self, app: Flask, trial_app_chat, account): api = module.TrialChatApi() method = unwrap(api.post) @@ -367,7 +400,7 @@ class TestTrialChatApi: with pytest.raises(InvokeRateLimitHttpError): method(api, account, trial_app_chat) - def test_chat_value_error(self, app: Flask, trial_app_chat: MagicMock, account: Account) -> None: + def test_chat_value_error(self, app: Flask, trial_app_chat, account): api = module.TrialChatApi() method = unwrap(api.post) @@ -382,7 +415,7 @@ class TestTrialChatApi: with pytest.raises(ValueError): method(api, account, trial_app_chat) - def test_chat_generic_exception(self, app: Flask, trial_app_chat: MagicMock, account: Account) -> None: + def test_chat_generic_exception(self, app: Flask, trial_app_chat, account): api = module.TrialChatApi() method = unwrap(api.post) @@ -399,7 +432,7 @@ class TestTrialChatApi: class TestTrialCompletionApi: - def test_not_completion_app(self, app: Flask, account: Account) -> None: + def test_not_completion_app(self, app: Flask, account): api = module.TrialCompletionApi() method = unwrap(api.post) @@ -407,7 +440,7 @@ class TestTrialCompletionApi: with pytest.raises(NotCompletionAppError): method(api, account, MagicMock(mode=AppMode.CHAT)) - def test_success(self, app: Flask, trial_app_completion: MagicMock, account: Account) -> None: + def test_success(self, app: Flask, trial_app_completion, account): api = module.TrialCompletionApi() method = unwrap(api.post) @@ -420,7 +453,7 @@ class TestTrialCompletionApi: assert result is not None - def test_completion_app_config_broken(self, app: Flask, trial_app_completion: MagicMock, account: Account) -> None: + def test_completion_app_config_broken(self, app: Flask, trial_app_completion, account): api = module.TrialCompletionApi() method = unwrap(api.post) @@ -435,7 +468,7 @@ class TestTrialCompletionApi: with pytest.raises(AppUnavailableError): method(api, account, trial_app_completion) - def test_completion_provider_not_init(self, app: Flask, trial_app_completion: MagicMock, account: Account) -> None: + def test_completion_provider_not_init(self, app: Flask, trial_app_completion, account): api = module.TrialCompletionApi() method = unwrap(api.post) @@ -450,7 +483,7 @@ class TestTrialCompletionApi: with pytest.raises(ProviderNotInitializeError): method(api, account, trial_app_completion) - def test_completion_quota_exceeded(self, app: Flask, trial_app_completion: MagicMock, account: Account) -> None: + def test_completion_quota_exceeded(self, app: Flask, trial_app_completion, account): api = module.TrialCompletionApi() method = unwrap(api.post) @@ -465,7 +498,7 @@ class TestTrialCompletionApi: with pytest.raises(ProviderQuotaExceededError): method(api, account, trial_app_completion) - def test_completion_model_not_support(self, app: Flask, trial_app_completion: MagicMock, account: Account) -> None: + def test_completion_model_not_support(self, app: Flask, trial_app_completion, account): api = module.TrialCompletionApi() method = unwrap(api.post) @@ -480,7 +513,7 @@ class TestTrialCompletionApi: with pytest.raises(ProviderModelCurrentlyNotSupportError): method(api, account, trial_app_completion) - def test_completion_invoke_error(self, app: Flask, trial_app_completion: MagicMock, account: Account) -> None: + def test_completion_invoke_error(self, app: Flask, trial_app_completion, account): api = module.TrialCompletionApi() method = unwrap(api.post) @@ -495,7 +528,7 @@ class TestTrialCompletionApi: with pytest.raises(CompletionRequestError): method(api, account, trial_app_completion) - def test_completion_rate_limit_error(self, app: Flask, trial_app_completion: MagicMock, account: Account) -> None: + def test_completion_rate_limit_error(self, app: Flask, trial_app_completion, account): api = module.TrialCompletionApi() method = unwrap(api.post) @@ -510,7 +543,7 @@ class TestTrialCompletionApi: with pytest.raises(InternalServerError): method(api, account, trial_app_completion) - def test_completion_value_error(self, app: Flask, trial_app_completion: MagicMock, account: Account) -> None: + def test_completion_value_error(self, app: Flask, trial_app_completion, account): api = module.TrialCompletionApi() method = unwrap(api.post) @@ -525,7 +558,7 @@ class TestTrialCompletionApi: with pytest.raises(ValueError): method(api, account, trial_app_completion) - def test_completion_generic_exception(self, app: Flask, trial_app_completion: MagicMock, account: Account) -> None: + def test_completion_generic_exception(self, app: Flask, trial_app_completion, account): api = module.TrialCompletionApi() method = unwrap(api.post) @@ -542,7 +575,7 @@ class TestTrialCompletionApi: class TestTrialMessageSuggestedQuestionApi: - def test_not_chat_app(self, app: Flask, account: Account) -> None: + def test_not_chat_app(self, app: Flask, account): api = module.TrialMessageSuggestedQuestionApi() method = unwrap(api.get) @@ -550,7 +583,7 @@ class TestTrialMessageSuggestedQuestionApi: with pytest.raises(NotChatAppError): method(api, account, MagicMock(mode="completion"), str(uuid4())) - def test_success(self, app: Flask, trial_app_chat: MagicMock, account: Account) -> None: + def test_success(self, app: Flask, trial_app_chat, account): api = module.TrialMessageSuggestedQuestionApi() method = unwrap(api.get) @@ -566,7 +599,7 @@ class TestTrialMessageSuggestedQuestionApi: assert result == {"data": ["q1", "q2"]} - def test_conversation_not_exists(self, app: Flask, trial_app_chat: MagicMock, account: Account) -> None: + def test_conversation_not_exists(self, app: Flask, trial_app_chat, account): api = module.TrialMessageSuggestedQuestionApi() method = unwrap(api.get) @@ -583,14 +616,14 @@ class TestTrialMessageSuggestedQuestionApi: class TestTrialAppParameterApi: - def test_app_unavailable(self) -> None: + def test_app_unavailable(self): api = module.TrialAppParameterApi() method = unwrap(api.get) with pytest.raises(AppUnavailableError): method(api, None) - def test_success_non_workflow(self, valid_parameters: dict[str, object]) -> None: + def test_success_non_workflow(self, valid_parameters): api = module.TrialAppParameterApi() method = unwrap(api.get) @@ -617,11 +650,12 @@ class TestTrialAppParameterApi: class TestTrialChatAudioApi: - def test_success(self, app: Flask, trial_app_chat: MagicMock, account: Account) -> None: + def test_success(self, app: Flask, trial_app_chat, account): api = module.TrialChatAudioApi() method = unwrap(api.post) - file_data = _file_data() + file_data: Any = BytesIO(b"fake audio data") + file_data.filename = "test.wav" with ( app.test_request_context( @@ -634,11 +668,12 @@ class TestTrialChatAudioApi: assert result == {"text": "hello"} - def test_app_config_broken(self, app: Flask, trial_app_chat: MagicMock, account: Account) -> None: + def test_app_config_broken(self, app: Flask, trial_app_chat, account): api = module.TrialChatAudioApi() method = unwrap(api.post) - file_data = _file_data() + file_data: Any = BytesIO(b"fake audio data") + file_data.filename = "test.wav" with ( app.test_request_context( @@ -653,11 +688,12 @@ class TestTrialChatAudioApi: with pytest.raises(module.AppUnavailableError): method(api, account, trial_app_chat) - def test_no_audio_uploaded(self, app: Flask, trial_app_chat: MagicMock, account: Account) -> None: + def test_no_audio_uploaded(self, app: Flask, trial_app_chat, account): api = module.TrialChatAudioApi() method = unwrap(api.post) - file_data = _file_data() + file_data: Any = BytesIO(b"fake audio data") + file_data.filename = "test.wav" with ( app.test_request_context( @@ -672,11 +708,12 @@ class TestTrialChatAudioApi: with pytest.raises(module.NoAudioUploadedError): method(api, account, trial_app_chat) - def test_audio_too_large(self, app: Flask, trial_app_chat: MagicMock, account: Account) -> None: + def test_audio_too_large(self, app: Flask, trial_app_chat, account): api = module.TrialChatAudioApi() method = unwrap(api.post) - file_data = _file_data() + file_data: Any = BytesIO(b"fake audio data") + file_data.filename = "test.wav" with ( app.test_request_context( @@ -691,11 +728,12 @@ class TestTrialChatAudioApi: with pytest.raises(module.AudioTooLargeError): method(api, account, trial_app_chat) - def test_unsupported_audio_type(self, app: Flask, trial_app_chat: MagicMock, account: Account) -> None: + def test_unsupported_audio_type(self, app: Flask, trial_app_chat, account): api = module.TrialChatAudioApi() method = unwrap(api.post) - file_data = _file_data() + file_data: Any = BytesIO(b"fake audio data") + file_data.filename = "test.wav" with ( app.test_request_context( @@ -710,11 +748,12 @@ class TestTrialChatAudioApi: with pytest.raises(module.UnsupportedAudioTypeError): method(api, account, trial_app_chat) - def test_provider_not_support_tts(self, app: Flask, trial_app_chat: MagicMock, account: Account) -> None: + def test_provider_not_support_tts(self, app: Flask, trial_app_chat, account): api = module.TrialChatAudioApi() method = unwrap(api.post) - file_data = _file_data() + file_data: Any = BytesIO(b"fake audio data") + file_data.filename = "test.wav" with ( app.test_request_context( @@ -729,11 +768,12 @@ class TestTrialChatAudioApi: with pytest.raises(module.ProviderNotSupportSpeechToTextError): method(api, account, trial_app_chat) - def test_provider_not_init(self, app: Flask, trial_app_chat: MagicMock, account: Account) -> None: + def test_provider_not_init(self, app: Flask, trial_app_chat, account): api = module.TrialChatAudioApi() method = unwrap(api.post) - file_data = _file_data() + file_data: Any = BytesIO(b"fake audio data") + file_data.filename = "test.wav" with ( app.test_request_context( @@ -744,11 +784,12 @@ class TestTrialChatAudioApi: with pytest.raises(ProviderNotInitializeError): method(api, account, trial_app_chat) - def test_quota_exceeded(self, app: Flask, trial_app_chat: MagicMock, account: Account) -> None: + def test_quota_exceeded(self, app: Flask, trial_app_chat, account): api = module.TrialChatAudioApi() method = unwrap(api.post) - file_data = _file_data() + file_data: Any = BytesIO(b"fake audio data") + file_data.filename = "test.wav" with ( app.test_request_context( @@ -761,7 +802,7 @@ class TestTrialChatAudioApi: class TestTrialChatTextApi: - def test_success(self, app: Flask, trial_app_chat: MagicMock, account: Account) -> None: + def test_success(self, app: Flask, trial_app_chat, account): api = module.TrialChatTextApi() method = unwrap(api.post) @@ -774,7 +815,7 @@ class TestTrialChatTextApi: assert result == {"audio": "base64_data"} - def test_app_config_broken(self, app: Flask, trial_app_chat: MagicMock, account: Account) -> None: + def test_app_config_broken(self, app: Flask, trial_app_chat, account): api = module.TrialChatTextApi() method = unwrap(api.post) @@ -789,7 +830,7 @@ class TestTrialChatTextApi: with pytest.raises(module.AppUnavailableError): method(api, account, trial_app_chat) - def test_provider_not_support(self, app: Flask, trial_app_chat: MagicMock, account: Account) -> None: + def test_provider_not_support(self, app: Flask, trial_app_chat, account): api = module.TrialChatTextApi() method = unwrap(api.post) @@ -804,7 +845,7 @@ class TestTrialChatTextApi: with pytest.raises(module.ProviderNotSupportSpeechToTextError): method(api, account, trial_app_chat) - def test_audio_too_large(self, app: Flask, trial_app_chat: MagicMock, account: Account) -> None: + def test_audio_too_large(self, app: Flask, trial_app_chat, account): api = module.TrialChatTextApi() method = unwrap(api.post) @@ -819,7 +860,7 @@ class TestTrialChatTextApi: with pytest.raises(module.AudioTooLargeError): method(api, account, trial_app_chat) - def test_no_audio_uploaded(self, app: Flask, trial_app_chat: MagicMock, account: Account) -> None: + def test_no_audio_uploaded(self, app: Flask, trial_app_chat, account): api = module.TrialChatTextApi() method = unwrap(api.post) @@ -834,7 +875,7 @@ class TestTrialChatTextApi: with pytest.raises(module.NoAudioUploadedError): method(api, account, trial_app_chat) - def test_provider_not_init(self, app: Flask, trial_app_chat: MagicMock, account: Account) -> None: + def test_provider_not_init(self, app: Flask, trial_app_chat, account): api = module.TrialChatTextApi() method = unwrap(api.post) @@ -845,7 +886,7 @@ class TestTrialChatTextApi: with pytest.raises(ProviderNotInitializeError): method(api, account, trial_app_chat) - def test_quota_exceeded(self, app: Flask, trial_app_chat: MagicMock, account: Account) -> None: + def test_quota_exceeded(self, app: Flask, trial_app_chat, account): api = module.TrialChatTextApi() method = unwrap(api.post) @@ -856,7 +897,7 @@ class TestTrialChatTextApi: with pytest.raises(ProviderQuotaExceededError): method(api, account, trial_app_chat) - def test_model_not_support(self, app: Flask, trial_app_chat: MagicMock, account: Account) -> None: + def test_model_not_support(self, app: Flask, trial_app_chat, account): api = module.TrialChatTextApi() method = unwrap(api.post) @@ -867,7 +908,7 @@ class TestTrialChatTextApi: with pytest.raises(ProviderModelCurrentlyNotSupportError): method(api, account, trial_app_chat) - def test_invoke_error(self, app: Flask, trial_app_chat: MagicMock, account: Account) -> None: + def test_invoke_error(self, app: Flask, trial_app_chat, account): api = module.TrialChatTextApi() method = unwrap(api.post) @@ -880,7 +921,7 @@ class TestTrialChatTextApi: class TestTrialAppWorkflowTaskStopApi: - def test_not_workflow_app(self, app: Flask, trial_app_chat: MagicMock) -> None: + def test_not_workflow_app(self, app: Flask, trial_app_chat): api = module.TrialAppWorkflowTaskStopApi() method = unwrap(api.post) @@ -888,7 +929,7 @@ class TestTrialAppWorkflowTaskStopApi: with pytest.raises(NotWorkflowAppError): method(api, trial_app_chat, str(uuid4())) - def test_success(self, app: Flask, trial_app_workflow: MagicMock) -> None: + def test_success(self, app: Flask, trial_app_workflow, account): api = module.TrialAppWorkflowTaskStopApi() method = unwrap(api.post) @@ -906,7 +947,7 @@ class TestTrialAppWorkflowTaskStopApi: class TestTrialSitApi: - def test_no_site(self, app: Flask) -> None: + def test_no_site(self, app: Flask): api = module.TrialSitApi() method = unwrap(api.get) app_model = MagicMock() @@ -917,7 +958,7 @@ class TestTrialSitApi: with pytest.raises(Forbidden): method(api, app_model) - def test_archived_tenant(self, app: Flask) -> None: + def test_archived_tenant(self, app: Flask): api = module.TrialSitApi() method = unwrap(api.get) @@ -932,7 +973,7 @@ class TestTrialSitApi: with pytest.raises(Forbidden): method(api, app_model) - def test_success(self, app: Flask) -> None: + def test_success(self, app: Flask): api = module.TrialSitApi() method = unwrap(api.get) @@ -957,11 +998,12 @@ class TestTrialSitApi: class TestTrialChatAudioApiExceptionHandlers: - def test_provider_not_init(self, app: Flask, trial_app_chat: MagicMock, account: Account) -> None: + def test_provider_not_init(self, app: Flask, trial_app_chat, account): api = module.TrialChatAudioApi() method = unwrap(api.post) - file_data = _file_data() + file_data: Any = BytesIO(b"fake audio data") + file_data.filename = "test.wav" with ( app.test_request_context( @@ -976,11 +1018,12 @@ class TestTrialChatAudioApiExceptionHandlers: with pytest.raises(ProviderNotInitializeError): method(api, account, trial_app_chat) - def test_quota_exceeded(self, app: Flask, trial_app_chat: MagicMock, account: Account) -> None: + def test_quota_exceeded(self, app: Flask, trial_app_chat, account): api = module.TrialChatAudioApi() method = unwrap(api.post) - file_data = _file_data() + file_data: Any = BytesIO(b"fake audio data") + file_data.filename = "test.wav" with ( app.test_request_context( @@ -995,11 +1038,12 @@ class TestTrialChatAudioApiExceptionHandlers: with pytest.raises(ProviderQuotaExceededError): method(api, account, trial_app_chat) - def test_invoke_error(self, app: Flask, trial_app_chat: MagicMock, account: Account) -> None: + def test_invoke_error(self, app: Flask, trial_app_chat, account): api = module.TrialChatAudioApi() method = unwrap(api.post) - file_data = _file_data() + file_data: Any = BytesIO(b"fake audio data") + file_data.filename = "test.wav" with ( app.test_request_context( @@ -1016,7 +1060,7 @@ class TestTrialChatAudioApiExceptionHandlers: class TestTrialChatTextApiExceptionHandlers: - def test_app_config_broken(self, app: Flask, trial_app_chat: MagicMock, account: Account) -> None: + def test_app_config_broken(self, app: Flask, trial_app_chat, account): api = module.TrialChatTextApi() method = unwrap(api.post) @@ -1031,7 +1075,7 @@ class TestTrialChatTextApiExceptionHandlers: with pytest.raises(module.AppUnavailableError): method(api, account, trial_app_chat) - def test_unsupported_audio_type(self, app: Flask, trial_app_chat: MagicMock, account: Account) -> None: + def test_unsupported_audio_type(self, app: Flask, trial_app_chat, account): api = module.TrialChatTextApi() method = unwrap(api.post) diff --git a/packages/contracts/generated/api/console/agent/types.gen.ts b/packages/contracts/generated/api/console/agent/types.gen.ts index 43119c4f1f4..6e05107fc51 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 = { @@ -879,8 +897,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..d7c29eb68e2 100644 --- a/packages/contracts/generated/api/console/agent/zod.gen.ts +++ b/packages/contracts/generated/api/console/agent/zod.gen.ts @@ -229,6 +229,36 @@ export const zJsonValue = z ]) .nullable() +/** + * 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 +270,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 +840,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/api-based-extension/zod.gen.ts b/packages/contracts/generated/api/console/api-based-extension/zod.gen.ts index 468e9d09efc..745f6ddb107 100644 --- a/packages/contracts/generated/api/console/api-based-extension/zod.gen.ts +++ b/packages/contracts/generated/api/console/api-based-extension/zod.gen.ts @@ -22,6 +22,9 @@ export const zApiBasedExtensionResponse = z.object({ name: z.string(), }) +/** + * APIBasedExtensionListResponse + */ export const zApiBasedExtensionListResponse = z.array(zApiBasedExtensionResponse) /** diff --git a/packages/contracts/generated/api/console/apps/types.gen.ts b/packages/contracts/generated/api/console/apps/types.gen.ts index 9e79518f3cd..956bfd2d6f9 100644 --- a/packages/contracts/generated/api/console/apps/types.gen.ts +++ b/packages/contracts/generated/api/console/apps/types.gen.ts @@ -1223,12 +1223,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 = { @@ -1982,8 +2000,6 @@ export type ModelConfigPartial = { updated_by?: string | null } -export type LlmMode = 'chat' | 'completion' - export type Type = 'github' | 'marketplace' | 'package' export type Github = { diff --git a/packages/contracts/generated/api/console/apps/zod.gen.ts b/packages/contracts/generated/api/console/apps/zod.gen.ts index 9b86fda0a62..d63ecfcf5b2 100644 --- a/packages/contracts/generated/api/console/apps/zod.gen.ts +++ b/packages/contracts/generated/api/console/apps/zod.gen.ts @@ -889,6 +889,36 @@ export const zJsonValue = z */ 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 +930,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 */ @@ -1118,6 +1208,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 */ @@ -1415,6 +1524,20 @@ export const zMessageDetail = z.object({ 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(), +}) + /** * WorkflowRunForListResponse */ @@ -2056,116 +2179,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 */ diff --git a/packages/contracts/generated/api/console/installed-apps/orpc.gen.ts b/packages/contracts/generated/api/console/installed-apps/orpc.gen.ts index 026f3bdf513..d144c852463 100644 --- a/packages/contracts/generated/api/console/installed-apps/orpc.gen.ts +++ b/packages/contracts/generated/api/console/installed-apps/orpc.gen.ts @@ -13,9 +13,6 @@ import { zGetInstalledAppsByInstalledAppIdConversationsPath, zGetInstalledAppsByInstalledAppIdConversationsQuery, zGetInstalledAppsByInstalledAppIdConversationsResponse, - zGetInstalledAppsByInstalledAppIdMessagesByMessageIdMoreLikeThisPath, - zGetInstalledAppsByInstalledAppIdMessagesByMessageIdMoreLikeThisQuery, - zGetInstalledAppsByInstalledAppIdMessagesByMessageIdMoreLikeThisResponse, zGetInstalledAppsByInstalledAppIdMessagesByMessageIdSuggestedQuestionsPath, zGetInstalledAppsByInstalledAppIdMessagesByMessageIdSuggestedQuestionsResponse, zGetInstalledAppsByInstalledAppIdMessagesPath, @@ -40,16 +37,10 @@ import { zPostInstalledAppsBody, zPostInstalledAppsByInstalledAppIdAudioToTextPath, zPostInstalledAppsByInstalledAppIdAudioToTextResponse, - zPostInstalledAppsByInstalledAppIdChatMessagesBody, zPostInstalledAppsByInstalledAppIdChatMessagesByTaskIdStopPath, zPostInstalledAppsByInstalledAppIdChatMessagesByTaskIdStopResponse, - zPostInstalledAppsByInstalledAppIdChatMessagesPath, - zPostInstalledAppsByInstalledAppIdChatMessagesResponse, - zPostInstalledAppsByInstalledAppIdCompletionMessagesBody, zPostInstalledAppsByInstalledAppIdCompletionMessagesByTaskIdStopPath, zPostInstalledAppsByInstalledAppIdCompletionMessagesByTaskIdStopResponse, - zPostInstalledAppsByInstalledAppIdCompletionMessagesPath, - zPostInstalledAppsByInstalledAppIdCompletionMessagesResponse, zPostInstalledAppsByInstalledAppIdConversationsByCIdNameBody, zPostInstalledAppsByInstalledAppIdConversationsByCIdNamePath, zPostInstalledAppsByInstalledAppIdConversationsByCIdNameResponse, @@ -62,9 +53,6 @@ import { zPostInstalledAppsByInstalledAppIdTextToAudioBody, zPostInstalledAppsByInstalledAppIdTextToAudioPath, zPostInstalledAppsByInstalledAppIdTextToAudioResponse, - zPostInstalledAppsByInstalledAppIdWorkflowsRunBody, - zPostInstalledAppsByInstalledAppIdWorkflowsRunPath, - zPostInstalledAppsByInstalledAppIdWorkflowsRunResponse, zPostInstalledAppsByInstalledAppIdWorkflowsTasksByTaskIdStopPath, zPostInstalledAppsByInstalledAppIdWorkflowsTasksByTaskIdStopResponse, zPostInstalledAppsResponse, @@ -104,28 +92,11 @@ export const byTaskId = { stop, } -export const post3 = oc - .route({ - inputStructure: 'detailed', - method: 'POST', - operationId: 'postInstalledAppsByInstalledAppIdChatMessages', - path: '/installed-apps/{installed_app_id}/chat-messages', - tags: ['console'], - }) - .input( - z.object({ - body: zPostInstalledAppsByInstalledAppIdChatMessagesBody, - params: zPostInstalledAppsByInstalledAppIdChatMessagesPath, - }), - ) - .output(zPostInstalledAppsByInstalledAppIdChatMessagesResponse) - export const chatMessages = { - post: post3, byTaskId, } -export const post4 = oc +export const post3 = oc .route({ inputStructure: 'detailed', method: 'POST', @@ -137,35 +108,18 @@ export const post4 = oc .output(zPostInstalledAppsByInstalledAppIdCompletionMessagesByTaskIdStopResponse) export const stop2 = { - post: post4, + post: post3, } export const byTaskId2 = { stop: stop2, } -export const post5 = oc - .route({ - inputStructure: 'detailed', - method: 'POST', - operationId: 'postInstalledAppsByInstalledAppIdCompletionMessages', - path: '/installed-apps/{installed_app_id}/completion-messages', - tags: ['console'], - }) - .input( - z.object({ - body: zPostInstalledAppsByInstalledAppIdCompletionMessagesBody, - params: zPostInstalledAppsByInstalledAppIdCompletionMessagesPath, - }), - ) - .output(zPostInstalledAppsByInstalledAppIdCompletionMessagesResponse) - export const completionMessages = { - post: post5, byTaskId: byTaskId2, } -export const post6 = oc +export const post4 = oc .route({ inputStructure: 'detailed', method: 'POST', @@ -182,7 +136,7 @@ export const post6 = oc .output(zPostInstalledAppsByInstalledAppIdConversationsByCIdNameResponse) export const name = { - post: post6, + post: post4, } export const patch = oc @@ -255,7 +209,7 @@ export const conversations = { byCId, } -export const post7 = oc +export const post5 = oc .route({ inputStructure: 'detailed', method: 'POST', @@ -272,30 +226,10 @@ export const post7 = oc .output(zPostInstalledAppsByInstalledAppIdMessagesByMessageIdFeedbacksResponse) export const feedbacks = { - post: post7, + post: post5, } export const get2 = oc - .route({ - inputStructure: 'detailed', - method: 'GET', - operationId: 'getInstalledAppsByInstalledAppIdMessagesByMessageIdMoreLikeThis', - path: '/installed-apps/{installed_app_id}/messages/{message_id}/more-like-this', - tags: ['console'], - }) - .input( - z.object({ - params: zGetInstalledAppsByInstalledAppIdMessagesByMessageIdMoreLikeThisPath, - query: zGetInstalledAppsByInstalledAppIdMessagesByMessageIdMoreLikeThisQuery, - }), - ) - .output(zGetInstalledAppsByInstalledAppIdMessagesByMessageIdMoreLikeThisResponse) - -export const moreLikeThis = { - get: get2, -} - -export const get3 = oc .route({ inputStructure: 'detailed', method: 'GET', @@ -311,16 +245,15 @@ export const get3 = oc .output(zGetInstalledAppsByInstalledAppIdMessagesByMessageIdSuggestedQuestionsResponse) export const suggestedQuestions = { - get: get3, + get: get2, } export const byMessageId = { feedbacks, - moreLikeThis, suggestedQuestions, } -export const get4 = oc +export const get3 = oc .route({ inputStructure: 'detailed', method: 'GET', @@ -337,14 +270,14 @@ export const get4 = oc .output(zGetInstalledAppsByInstalledAppIdMessagesResponse) export const messages = { - get: get4, + get: get3, byMessageId, } /** * Get app meta */ -export const get5 = oc +export const get4 = oc .route({ inputStructure: 'detailed', method: 'GET', @@ -357,13 +290,13 @@ export const get5 = oc .output(zGetInstalledAppsByInstalledAppIdMetaResponse) export const meta = { - get: get5, + get: get4, } /** * Retrieve app parameters */ -export const get6 = oc +export const get5 = oc .route({ inputStructure: 'detailed', method: 'GET', @@ -376,7 +309,7 @@ export const get6 = oc .output(zGetInstalledAppsByInstalledAppIdParametersResponse) export const parameters = { - get: get6, + get: get5, } export const delete2 = oc @@ -395,7 +328,7 @@ export const byMessageId2 = { delete: delete2, } -export const get7 = oc +export const get6 = oc .route({ inputStructure: 'detailed', method: 'GET', @@ -411,7 +344,7 @@ export const get7 = oc ) .output(zGetInstalledAppsByInstalledAppIdSavedMessagesResponse) -export const post8 = oc +export const post6 = oc .route({ inputStructure: 'detailed', method: 'POST', @@ -428,12 +361,12 @@ export const post8 = oc .output(zPostInstalledAppsByInstalledAppIdSavedMessagesResponse) export const savedMessages = { - get: get7, - post: post8, + get: get6, + post: post6, byMessageId: byMessageId2, } -export const post9 = oc +export const post7 = oc .route({ inputStructure: 'detailed', method: 'POST', @@ -450,37 +383,13 @@ export const post9 = oc .output(zPostInstalledAppsByInstalledAppIdTextToAudioResponse) export const textToAudio = { - post: post9, -} - -/** - * Run workflow - */ -export const post10 = oc - .route({ - inputStructure: 'detailed', - method: 'POST', - operationId: 'postInstalledAppsByInstalledAppIdWorkflowsRun', - path: '/installed-apps/{installed_app_id}/workflows/run', - summary: 'Run workflow', - tags: ['console'], - }) - .input( - z.object({ - body: zPostInstalledAppsByInstalledAppIdWorkflowsRunBody, - params: zPostInstalledAppsByInstalledAppIdWorkflowsRunPath, - }), - ) - .output(zPostInstalledAppsByInstalledAppIdWorkflowsRunResponse) - -export const run = { - post: post10, + post: post7, } /** * Stop workflow task */ -export const post11 = oc +export const post8 = oc .route({ inputStructure: 'detailed', method: 'POST', @@ -493,7 +402,7 @@ export const post11 = oc .output(zPostInstalledAppsByInstalledAppIdWorkflowsTasksByTaskIdStopResponse) export const stop3 = { - post: post11, + post: post8, } export const byTaskId3 = { @@ -505,7 +414,6 @@ export const tasks = { } export const workflows = { - run, tasks, } @@ -552,7 +460,7 @@ export const byInstalledAppId = { workflows, } -export const get8 = oc +export const get7 = oc .route({ inputStructure: 'detailed', method: 'GET', @@ -563,7 +471,7 @@ export const get8 = oc .input(z.object({ query: zGetInstalledAppsQuery.optional() })) .output(zGetInstalledAppsResponse) -export const post12 = oc +export const post9 = oc .route({ inputStructure: 'detailed', method: 'POST', @@ -575,8 +483,8 @@ export const post12 = oc .output(zPostInstalledAppsResponse) export const installedApps = { - get: get8, - post: post12, + get: get7, + post: post9, byInstalledAppId, } 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..1bf62a52aaa 100644 --- a/packages/contracts/generated/api/console/installed-apps/types.gen.ts +++ b/packages/contracts/generated/api/console/installed-apps/types.gen.ts @@ -29,39 +29,10 @@ export type AudioTranscriptResponse = { text: string } -export type ChatMessagePayload = { - conversation_id?: string | null - files?: Array | null - inputs: { - [key: string]: unknown - } - model_config?: { - [key: string]: unknown - } - parent_message_id?: string | null - query: string - response_mode?: 'blocking' | 'streaming' - retriever_from?: string -} - -export type GeneratedAppResponse = JsonValue - export type SimpleResultResponse = { result: string } -export type CompletionMessageExplorePayload = { - files?: Array<{ - [key: string]: unknown - }> | null - inputs: { - [key: string]: unknown - } - query?: string - response_mode?: 'blocking' | 'streaming' | null - retriever_from?: string -} - export type ConversationInfiniteScrollPagination = { data: Array has_more: boolean @@ -154,18 +125,6 @@ export type TextToAudioPayload = { export type AudioBinaryResponse = Blob | File -export type WorkflowRunPayload = { - files?: Array<{ - transfer_method: 'local_file' | 'remote_url' - type: 'audio' | 'custom' | 'document' | 'image' | 'video' - upload_file_id?: string - url?: string - }> | null - inputs: { - [key: string]: unknown - } -} - export type InstalledAppResponse = { app: InstalledAppInfoResponse app_owner_tenant_id: string @@ -477,22 +436,6 @@ export type PostInstalledAppsByInstalledAppIdAudioToTextResponses = { export type PostInstalledAppsByInstalledAppIdAudioToTextResponse = PostInstalledAppsByInstalledAppIdAudioToTextResponses[keyof PostInstalledAppsByInstalledAppIdAudioToTextResponses] -export type PostInstalledAppsByInstalledAppIdChatMessagesData = { - body: ChatMessagePayload - path: { - installed_app_id: string - } - query?: never - url: '/installed-apps/{installed_app_id}/chat-messages' -} - -export type PostInstalledAppsByInstalledAppIdChatMessagesResponses = { - 200: GeneratedAppResponse -} - -export type PostInstalledAppsByInstalledAppIdChatMessagesResponse - = PostInstalledAppsByInstalledAppIdChatMessagesResponses[keyof PostInstalledAppsByInstalledAppIdChatMessagesResponses] - export type PostInstalledAppsByInstalledAppIdChatMessagesByTaskIdStopData = { body?: never path: { @@ -510,22 +453,6 @@ export type PostInstalledAppsByInstalledAppIdChatMessagesByTaskIdStopResponses = export type PostInstalledAppsByInstalledAppIdChatMessagesByTaskIdStopResponse = PostInstalledAppsByInstalledAppIdChatMessagesByTaskIdStopResponses[keyof PostInstalledAppsByInstalledAppIdChatMessagesByTaskIdStopResponses] -export type PostInstalledAppsByInstalledAppIdCompletionMessagesData = { - body: CompletionMessageExplorePayload - path: { - installed_app_id: string - } - query?: never - url: '/installed-apps/{installed_app_id}/completion-messages' -} - -export type PostInstalledAppsByInstalledAppIdCompletionMessagesResponses = { - 200: GeneratedAppResponse -} - -export type PostInstalledAppsByInstalledAppIdCompletionMessagesResponse - = PostInstalledAppsByInstalledAppIdCompletionMessagesResponses[keyof PostInstalledAppsByInstalledAppIdCompletionMessagesResponses] - export type PostInstalledAppsByInstalledAppIdCompletionMessagesByTaskIdStopData = { body?: never path: { @@ -668,25 +595,6 @@ export type PostInstalledAppsByInstalledAppIdMessagesByMessageIdFeedbacksRespons export type PostInstalledAppsByInstalledAppIdMessagesByMessageIdFeedbacksResponse = PostInstalledAppsByInstalledAppIdMessagesByMessageIdFeedbacksResponses[keyof PostInstalledAppsByInstalledAppIdMessagesByMessageIdFeedbacksResponses] -export type GetInstalledAppsByInstalledAppIdMessagesByMessageIdMoreLikeThisData = { - body?: never - path: { - installed_app_id: string - message_id: string - } - query: { - response_mode: 'blocking' | 'streaming' - } - url: '/installed-apps/{installed_app_id}/messages/{message_id}/more-like-this' -} - -export type GetInstalledAppsByInstalledAppIdMessagesByMessageIdMoreLikeThisResponses = { - 200: GeneratedAppResponse -} - -export type GetInstalledAppsByInstalledAppIdMessagesByMessageIdMoreLikeThisResponse - = GetInstalledAppsByInstalledAppIdMessagesByMessageIdMoreLikeThisResponses[keyof GetInstalledAppsByInstalledAppIdMessagesByMessageIdMoreLikeThisResponses] - export type GetInstalledAppsByInstalledAppIdMessagesByMessageIdSuggestedQuestionsData = { body?: never path: { @@ -804,22 +712,6 @@ export type PostInstalledAppsByInstalledAppIdTextToAudioResponses = { export type PostInstalledAppsByInstalledAppIdTextToAudioResponse = PostInstalledAppsByInstalledAppIdTextToAudioResponses[keyof PostInstalledAppsByInstalledAppIdTextToAudioResponses] -export type PostInstalledAppsByInstalledAppIdWorkflowsRunData = { - body: WorkflowRunPayload - path: { - installed_app_id: string - } - query?: never - url: '/installed-apps/{installed_app_id}/workflows/run' -} - -export type PostInstalledAppsByInstalledAppIdWorkflowsRunResponses = { - 200: GeneratedAppResponse -} - -export type PostInstalledAppsByInstalledAppIdWorkflowsRunResponse - = PostInstalledAppsByInstalledAppIdWorkflowsRunResponses[keyof PostInstalledAppsByInstalledAppIdWorkflowsRunResponses] - export type PostInstalledAppsByInstalledAppIdWorkflowsTasksByTaskIdStopData = { body?: never path: { 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..a21d35aec34 100644 --- a/packages/contracts/generated/api/console/installed-apps/zod.gen.ts +++ b/packages/contracts/generated/api/console/installed-apps/zod.gen.ts @@ -38,20 +38,6 @@ export const zAudioTranscriptResponse = z.object({ text: z.string(), }) -/** - * ChatMessagePayload - */ -export const zChatMessagePayload = z.object({ - conversation_id: z.string().nullish(), - files: z.array(z.unknown()).nullish(), - inputs: z.record(z.string(), z.unknown()), - model_config: z.record(z.string(), z.unknown()).optional(), - parent_message_id: z.string().nullish(), - query: z.string(), - response_mode: z.enum(['blocking', 'streaming']).optional().default('blocking'), - retriever_from: z.string().optional().default('dev'), -}) - /** * SimpleResultResponse */ @@ -59,17 +45,6 @@ export const zSimpleResultResponse = z.object({ result: z.string(), }) -/** - * CompletionMessageExplorePayload - */ -export const zCompletionMessageExplorePayload = z.object({ - files: z.array(z.record(z.string(), z.unknown())).nullish(), - inputs: z.record(z.string(), z.unknown()), - query: z.string().optional().default(''), - response_mode: z.enum(['blocking', 'streaming']).nullish(), - retriever_from: z.string().optional().default('explore_app'), -}) - export const zConversationRenamePayload = z.intersection( z.union([ z.object({ @@ -139,23 +114,6 @@ export const zTextToAudioPayload = z.object({ */ export const zAudioBinaryResponse = z.custom() -/** - * WorkflowRunPayload - */ -export const zWorkflowRunPayload = z.object({ - files: z - .array( - z.object({ - transfer_method: z.enum(['local_file', 'remote_url']), - type: z.enum(['audio', 'custom', 'document', 'image', 'video']), - upload_file_id: z.string().optional(), - url: z.string().optional(), - }), - ) - .nullish(), - inputs: z.record(z.string(), z.unknown()), -}) - export const zJsonValue = z .union([ z.string(), @@ -167,11 +125,6 @@ export const zJsonValue = z ]) .nullable() -/** - * GeneratedAppResponse - */ -export const zGeneratedAppResponse = zJsonValue - /** * SimpleConversation */ @@ -577,17 +530,6 @@ export const zPostInstalledAppsByInstalledAppIdAudioToTextPath = z.object({ */ export const zPostInstalledAppsByInstalledAppIdAudioToTextResponse = zAudioTranscriptResponse -export const zPostInstalledAppsByInstalledAppIdChatMessagesBody = zChatMessagePayload - -export const zPostInstalledAppsByInstalledAppIdChatMessagesPath = z.object({ - installed_app_id: z.uuid(), -}) - -/** - * Success - */ -export const zPostInstalledAppsByInstalledAppIdChatMessagesResponse = zGeneratedAppResponse - export const zPostInstalledAppsByInstalledAppIdChatMessagesByTaskIdStopPath = z.object({ installed_app_id: z.uuid(), task_id: z.string(), @@ -599,18 +541,6 @@ export const zPostInstalledAppsByInstalledAppIdChatMessagesByTaskIdStopPath = z. export const zPostInstalledAppsByInstalledAppIdChatMessagesByTaskIdStopResponse = zSimpleResultResponse -export const zPostInstalledAppsByInstalledAppIdCompletionMessagesBody - = zCompletionMessageExplorePayload - -export const zPostInstalledAppsByInstalledAppIdCompletionMessagesPath = z.object({ - installed_app_id: z.uuid(), -}) - -/** - * Success - */ -export const zPostInstalledAppsByInstalledAppIdCompletionMessagesResponse = zGeneratedAppResponse - export const zPostInstalledAppsByInstalledAppIdCompletionMessagesByTaskIdStopPath = z.object({ installed_app_id: z.uuid(), task_id: z.string(), @@ -711,21 +641,6 @@ export const zPostInstalledAppsByInstalledAppIdMessagesByMessageIdFeedbacksPath export const zPostInstalledAppsByInstalledAppIdMessagesByMessageIdFeedbacksResponse = zResultResponse -export const zGetInstalledAppsByInstalledAppIdMessagesByMessageIdMoreLikeThisPath = z.object({ - installed_app_id: z.uuid(), - message_id: z.uuid(), -}) - -export const zGetInstalledAppsByInstalledAppIdMessagesByMessageIdMoreLikeThisQuery = z.object({ - response_mode: z.enum(['blocking', 'streaming']), -}) - -/** - * Success - */ -export const zGetInstalledAppsByInstalledAppIdMessagesByMessageIdMoreLikeThisResponse - = zGeneratedAppResponse - export const zGetInstalledAppsByInstalledAppIdMessagesByMessageIdSuggestedQuestionsPath = z.object({ installed_app_id: z.uuid(), message_id: z.uuid(), @@ -802,17 +717,6 @@ export const zPostInstalledAppsByInstalledAppIdTextToAudioPath = z.object({ */ export const zPostInstalledAppsByInstalledAppIdTextToAudioResponse = zAudioBinaryResponse -export const zPostInstalledAppsByInstalledAppIdWorkflowsRunBody = zWorkflowRunPayload - -export const zPostInstalledAppsByInstalledAppIdWorkflowsRunPath = z.object({ - installed_app_id: z.uuid(), -}) - -/** - * Success - */ -export const zPostInstalledAppsByInstalledAppIdWorkflowsRunResponse = zGeneratedAppResponse - export const zPostInstalledAppsByInstalledAppIdWorkflowsTasksByTaskIdStopPath = z.object({ installed_app_id: z.uuid(), task_id: z.string(), 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..08dc7f85248 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,42 @@ 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 + = | string + | number + | number + | boolean + | { + [key: string]: unknown + } + | Array + | null 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..cbffd4478f7 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,45 @@ 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 + .union([ + z.string(), + z.int(), + z.number(), + z.boolean(), + z.record(z.string(), z.unknown()), + z.array(z.unknown()), + ]) + .nullable() /** * 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/rule-code-generate/types.gen.ts b/packages/contracts/generated/api/console/rule-code-generate/types.gen.ts index a1165a4f8a2..4883b92063d 100644 --- a/packages/contracts/generated/api/console/rule-code-generate/types.gen.ts +++ b/packages/contracts/generated/api/console/rule-code-generate/types.gen.ts @@ -14,15 +14,42 @@ export type RuleCodeGeneratePayload = { export type GeneratorResponse = unknown 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 + = | string + | number + | number + | boolean + | { + [key: string]: unknown + } + | Array + | null export type PostRuleCodeGenerateData = { body: RuleCodeGeneratePayload diff --git a/packages/contracts/generated/api/console/rule-code-generate/zod.gen.ts b/packages/contracts/generated/api/console/rule-code-generate/zod.gen.ts index 97e1b816289..0536774a0c9 100644 --- a/packages/contracts/generated/api/console/rule-code-generate/zod.gen.ts +++ b/packages/contracts/generated/api/console/rule-code-generate/zod.gen.ts @@ -7,21 +7,45 @@ import * as z from 'zod' */ export const zGeneratorResponse = z.unknown() -/** - * LLMMode - * - * Enum class for large language model mode. - */ -export const zLlmMode = z.enum(['chat', 'completion']) +export const zJsonValue = z + .union([ + z.string(), + z.int(), + z.number(), + z.boolean(), + z.record(z.string(), z.unknown()), + z.array(z.unknown()), + ]) + .nullable() /** * 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/rule-generate/types.gen.ts b/packages/contracts/generated/api/console/rule-generate/types.gen.ts index 4e7c1421461..9a09a91374a 100644 --- a/packages/contracts/generated/api/console/rule-generate/types.gen.ts +++ b/packages/contracts/generated/api/console/rule-generate/types.gen.ts @@ -13,15 +13,42 @@ export type RuleGeneratePayload = { export type GeneratorResponse = unknown 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 + = | string + | number + | number + | boolean + | { + [key: string]: unknown + } + | Array + | null export type PostRuleGenerateData = { body: RuleGeneratePayload diff --git a/packages/contracts/generated/api/console/rule-generate/zod.gen.ts b/packages/contracts/generated/api/console/rule-generate/zod.gen.ts index 6e539e63f4e..b1f31427366 100644 --- a/packages/contracts/generated/api/console/rule-generate/zod.gen.ts +++ b/packages/contracts/generated/api/console/rule-generate/zod.gen.ts @@ -7,21 +7,45 @@ import * as z from 'zod' */ export const zGeneratorResponse = z.unknown() -/** - * LLMMode - * - * Enum class for large language model mode. - */ -export const zLlmMode = z.enum(['chat', 'completion']) +export const zJsonValue = z + .union([ + z.string(), + z.int(), + z.number(), + z.boolean(), + z.record(z.string(), z.unknown()), + z.array(z.unknown()), + ]) + .nullable() /** * 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/rule-structured-output-generate/types.gen.ts b/packages/contracts/generated/api/console/rule-structured-output-generate/types.gen.ts index f7da1cd5cc8..c2b459fee56 100644 --- a/packages/contracts/generated/api/console/rule-structured-output-generate/types.gen.ts +++ b/packages/contracts/generated/api/console/rule-structured-output-generate/types.gen.ts @@ -12,15 +12,42 @@ export type RuleStructuredOutputPayload = { export type GeneratorResponse = unknown 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 + = | string + | number + | number + | boolean + | { + [key: string]: unknown + } + | Array + | null export type PostRuleStructuredOutputGenerateData = { body: RuleStructuredOutputPayload diff --git a/packages/contracts/generated/api/console/rule-structured-output-generate/zod.gen.ts b/packages/contracts/generated/api/console/rule-structured-output-generate/zod.gen.ts index 6119b0010d0..0929fccae64 100644 --- a/packages/contracts/generated/api/console/rule-structured-output-generate/zod.gen.ts +++ b/packages/contracts/generated/api/console/rule-structured-output-generate/zod.gen.ts @@ -7,21 +7,45 @@ import * as z from 'zod' */ export const zGeneratorResponse = z.unknown() -/** - * LLMMode - * - * Enum class for large language model mode. - */ -export const zLlmMode = z.enum(['chat', 'completion']) +export const zJsonValue = z + .union([ + z.string(), + z.int(), + z.number(), + z.boolean(), + z.record(z.string(), z.unknown()), + z.array(z.unknown()), + ]) + .nullable() /** * 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/tags/types.gen.ts b/packages/contracts/generated/api/console/tags/types.gen.ts index 33b39716e6e..14c7c9c722b 100644 --- a/packages/contracts/generated/api/console/tags/types.gen.ts +++ b/packages/contracts/generated/api/console/tags/types.gen.ts @@ -4,6 +4,13 @@ export type ClientOptions = { baseUrl: `${string}://${string}/console/api` | (string & {}) } +export type TagListResponse = Array + +export type TagBasePayload = { + name: string + type: TagType +} + export type TagResponse = { binding_count?: string | null id: string @@ -11,11 +18,6 @@ export type TagResponse = { type?: string | null } -export type TagBasePayload = { - name: string - type: TagType -} - export type TagUpdateRequestPayload = { name: string } @@ -33,7 +35,7 @@ export type GetTagsData = { } export type GetTagsResponses = { - 200: Array + 200: TagListResponse } export type GetTagsResponse = GetTagsResponses[keyof GetTagsResponses] diff --git a/packages/contracts/generated/api/console/tags/zod.gen.ts b/packages/contracts/generated/api/console/tags/zod.gen.ts index 20f28eaa059..7cab6b4df9e 100644 --- a/packages/contracts/generated/api/console/tags/zod.gen.ts +++ b/packages/contracts/generated/api/console/tags/zod.gen.ts @@ -12,6 +12,11 @@ export const zTagResponse = z.object({ type: z.string().nullish(), }) +/** + * TagListResponse + */ +export const zTagListResponse = z.array(zTagResponse) + /** * TagUpdateRequestPayload */ @@ -42,7 +47,7 @@ export const zGetTagsQuery = z.object({ /** * Success */ -export const zGetTagsResponse = z.array(zTagResponse) +export const zGetTagsResponse = zTagListResponse export const zPostTagsBody = zTagBasePayload diff --git a/packages/contracts/generated/api/console/trial-apps/orpc.gen.ts b/packages/contracts/generated/api/console/trial-apps/orpc.gen.ts index ebc2624fa19..35859bf863e 100644 --- a/packages/contracts/generated/api/console/trial-apps/orpc.gen.ts +++ b/packages/contracts/generated/api/console/trial-apps/orpc.gen.ts @@ -19,18 +19,9 @@ import { zGetTrialAppsByAppIdWorkflowsResponse, zPostTrialAppsByAppIdAudioToTextPath, zPostTrialAppsByAppIdAudioToTextResponse, - zPostTrialAppsByAppIdChatMessagesBody, - zPostTrialAppsByAppIdChatMessagesPath, - zPostTrialAppsByAppIdChatMessagesResponse, - zPostTrialAppsByAppIdCompletionMessagesBody, - zPostTrialAppsByAppIdCompletionMessagesPath, - zPostTrialAppsByAppIdCompletionMessagesResponse, zPostTrialAppsByAppIdTextToAudioBody, zPostTrialAppsByAppIdTextToAudioPath, zPostTrialAppsByAppIdTextToAudioResponse, - zPostTrialAppsByAppIdWorkflowsRunBody, - zPostTrialAppsByAppIdWorkflowsRunPath, - zPostTrialAppsByAppIdWorkflowsRunResponse, zPostTrialAppsByAppIdWorkflowsTasksByTaskIdStopPath, zPostTrialAppsByAppIdWorkflowsTasksByTaskIdStopResponse, } from './zod.gen' @@ -50,46 +41,6 @@ export const audioToText = { post, } -export const post2 = oc - .route({ - inputStructure: 'detailed', - method: 'POST', - operationId: 'postTrialAppsByAppIdChatMessages', - path: '/trial-apps/{app_id}/chat-messages', - tags: ['console'], - }) - .input( - z.object({ - body: zPostTrialAppsByAppIdChatMessagesBody, - params: zPostTrialAppsByAppIdChatMessagesPath, - }), - ) - .output(zPostTrialAppsByAppIdChatMessagesResponse) - -export const chatMessages = { - post: post2, -} - -export const post3 = oc - .route({ - inputStructure: 'detailed', - method: 'POST', - operationId: 'postTrialAppsByAppIdCompletionMessages', - path: '/trial-apps/{app_id}/completion-messages', - tags: ['console'], - }) - .input( - z.object({ - body: zPostTrialAppsByAppIdCompletionMessagesBody, - params: zPostTrialAppsByAppIdCompletionMessagesPath, - }), - ) - .output(zPostTrialAppsByAppIdCompletionMessagesResponse) - -export const completionMessages = { - post: post3, -} - export const get = oc .route({ inputStructure: 'detailed', @@ -175,7 +126,7 @@ export const site = { get: get4, } -export const post4 = oc +export const post2 = oc .route({ inputStructure: 'detailed', method: 'POST', @@ -192,37 +143,13 @@ export const post4 = oc .output(zPostTrialAppsByAppIdTextToAudioResponse) export const textToAudio = { - post: post4, -} - -/** - * Run workflow - */ -export const post5 = oc - .route({ - inputStructure: 'detailed', - method: 'POST', - operationId: 'postTrialAppsByAppIdWorkflowsRun', - path: '/trial-apps/{app_id}/workflows/run', - summary: 'Run workflow', - tags: ['console'], - }) - .input( - z.object({ - body: zPostTrialAppsByAppIdWorkflowsRunBody, - params: zPostTrialAppsByAppIdWorkflowsRunPath, - }), - ) - .output(zPostTrialAppsByAppIdWorkflowsRunResponse) - -export const run = { - post: post5, + post: post2, } /** * Stop workflow task */ -export const post6 = oc +export const post3 = oc .route({ inputStructure: 'detailed', method: 'POST', @@ -235,7 +162,7 @@ export const post6 = oc .output(zPostTrialAppsByAppIdWorkflowsTasksByTaskIdStopResponse) export const stop = { - post: post6, + post: post3, } export const byTaskId = { @@ -263,7 +190,6 @@ export const get5 = oc export const workflows = { get: get5, - run, tasks, } @@ -285,8 +211,6 @@ export const get6 = oc export const byAppId = { get: get6, audioToText, - chatMessages, - completionMessages, datasets, messages, parameters, diff --git a/packages/contracts/generated/api/console/trial-apps/types.gen.ts b/packages/contracts/generated/api/console/trial-apps/types.gen.ts index 894da1102ee..a9f42362780 100644 --- a/packages/contracts/generated/api/console/trial-apps/types.gen.ts +++ b/packages/contracts/generated/api/console/trial-apps/types.gen.ts @@ -4,66 +4,47 @@ export type ClientOptions = { baseUrl: `${string}://${string}/console/api` | (string & {}) } -export type TrialAppDetailWithSite = { - access_mode?: string - api_base_url?: string - created_at?: number - created_by?: string - deleted_tools?: Array - description?: string - enable_api?: boolean - enable_site?: boolean - icon?: string - icon_background?: string - icon_type?: string - icon_url?: string - id?: string - max_active_requests?: number - mode?: string - model_config?: TrialAppModelConfig - name?: string +export type AppDetailWithSite = { + access_mode?: string | null + api_base_url?: string | null + app_id?: string | null + bound_agent_id?: string | null + created_at?: number | null + created_by?: string | null + deleted_tools?: Array + description?: string | null + enable_api: boolean + enable_site: boolean + icon?: string | null + icon_background?: string | null + icon_type?: string | null + readonly icon_url: string | null + id: string + maintainer?: string | null + max_active_requests?: number | null + mode: string + model_config?: ModelConfig | null + name: string permission_keys?: Array - site?: TrialSite - tags?: Array - updated_at?: number - updated_by?: string - use_icon_as_answer_icon?: boolean - workflow?: TrialWorkflowPartial + site?: Site | null + tags?: Array + tracing?: JsonValue | null + updated_at?: number | null + updated_by?: string | null + use_icon_as_answer_icon?: boolean | null + workflow?: WorkflowPartial | null } export type AudioTranscriptResponse = { text: string } -export type ChatRequest = { - conversation_id?: string | null - files?: Array | null - inputs: { - [key: string]: unknown - } - parent_message_id?: string | null - query: string - retriever_from?: string -} - -export type GeneratedAppResponse = JsonValue - -export type CompletionRequest = { - files?: Array | null - inputs: { - [key: string]: unknown - } - query?: string - response_mode?: 'blocking' | 'streaming' | null - retriever_from?: string -} - -export type TrialDatasetList = { - data?: Array - has_more?: boolean - limit?: number - page?: number - total?: number +export type TrialDatasetListResponse = { + data: Array + has_more: boolean + limit: number + page: number + total: number } export type SuggestedQuestionsResponse = { @@ -111,143 +92,69 @@ export type TextToSpeechRequest = { export type AudioBinaryResponse = Blob | File -export type TrialWorkflow = { - conversation_variables?: Array - created_at?: number - created_by?: TrialSimpleAccount - environment_variables?: Array<{ - [key: string]: unknown - }> - features?: { +export type WorkflowResponse = { + conversation_variables: Array + created_at: number + created_by?: SimpleAccount | null + environment_variables: Array + features: { [key: string]: unknown } - graph?: { - [key: string]: unknown - } - hash?: string - id?: string - marked_comment?: string - marked_name?: string - rag_pipeline_variables?: Array - tool_published?: boolean - updated_at?: number - updated_by?: TrialSimpleAccount - version?: string -} - -export type WorkflowRunRequest = { - files?: Array | null - inputs: { + graph: { [key: string]: unknown } + hash: string + id: string + marked_comment: string + marked_name: string + rag_pipeline_variables: Array + tool_published: boolean + updated_at: number + updated_by?: SimpleAccount | null + version: string } export type SimpleResultResponse = { result: string } -export type TrialDeletedTool = { - provider_id?: string - tool_name?: string - type?: string +export type DeletedTool = { + provider_id: string + tool_name: string + type: string } -export type TrialAppModelConfig = { - agent_mode?: { - [key: string]: unknown - } - annotation_reply?: { - [key: string]: unknown - } - chat_prompt_config?: { - [key: string]: unknown - } - completion_prompt_config?: { - [key: string]: unknown - } - created_at?: number - created_by?: string - dataset_configs?: { - [key: string]: unknown - } - dataset_query_variable?: string - external_data_tools?: Array<{ - [key: string]: unknown - }> - file_upload?: { - [key: string]: unknown - } - model?: { - [key: string]: unknown - } - more_like_this?: { - [key: string]: unknown - } - opening_statement?: string - pre_prompt?: string - prompt_type?: string - retriever_resource?: { - [key: string]: unknown - } - sensitive_word_avoidance?: { - [key: string]: unknown - } - speech_to_text?: { - [key: string]: unknown - } - suggested_questions?: Array - suggested_questions_after_answer?: { - [key: string]: unknown - } - text_to_speech?: { - [key: string]: unknown - } - updated_at?: number - updated_by?: string - user_input_form?: Array<{ - [key: string]: unknown - }> +export type ModelConfig = { + 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 TrialSite = { - access_token?: string - app_base_url?: string - chat_color_theme?: string - chat_color_theme_inverted?: boolean - code?: string - copyright?: string - created_at?: number - created_by?: string - custom_disclaimer?: string - customize_domain?: string - customize_token_strategy?: string - default_language?: string - description?: string - icon?: string - icon_background?: string - icon_type?: string - icon_url?: string - privacy_policy?: string - prompt_public?: boolean - show_workflow_steps?: boolean - title?: string - updated_at?: number - updated_by?: string - use_icon_as_answer_icon?: boolean -} - -export type TrialTag = { - id?: string - name?: string - type?: string -} - -export type TrialWorkflowPartial = { - created_at?: number - created_by?: string - id?: string - updated_at?: number - updated_by?: string +export type Tag = { + id: string + name: string + type: string } export type JsonValue @@ -261,16 +168,52 @@ export type JsonValue | Array | null -export type TrialDataset = { - created_at?: number - created_by?: string - data_source_type?: string - description?: string - id?: string - indexing_technique?: string - name?: string - permission?: string +export type WorkflowPartial = { + created_at?: number | null + created_by?: string | null + id: string + updated_at?: number | null + updated_by?: string | null +} + +export type TrialDatasetListItemResponse = { + app_count: number + author_name: string | null + built_in_field_enabled: boolean + chunk_structure: string | null + created_at: number + created_by: string + data_source_type: string | null + description: string | null + doc_form: string | null + doc_metadata: Array + document_count: number + embedding_available?: boolean | null + embedding_model: string | null + embedding_model_provider: string | null + enable_api: boolean + external_knowledge_info?: DatasetExternalKnowledgeInfoResponse + external_retrieval_model: DatasetExternalRetrievalModelResponse | null + icon_info?: DatasetIconInfoResponse + id: string + indexing_technique: string | null + is_multimodal: boolean + is_published: boolean + maintainer?: string | null + name: string + permission: string permission_keys?: Array + pipeline_id: string | null + provider: string + retrieval_model_dict: DatasetRetrievalModelResponse + runtime_mode: string | null + summary_index_setting?: DatasetSummaryIndexSettingResponse + tags: Array + total_available_documents: number + total_documents: number + updated_at: number + updated_by: string | null + word_count: number } export type JsonObject = { @@ -285,56 +228,145 @@ export type SystemParameters = { workflow_file_upload_limit: number } -export type TrialConversationVariable = { - description?: string - id?: string - name?: string - value?: - | string - | number - | number - | boolean - | { - [key: string]: unknown - } - | Array - | null - value_type?: string +export type WorkflowConversationVariableResponse = { + description: string + id: string + name: string + value: unknown + value_type: string } -export type TrialSimpleAccount = { - email?: string - id?: string - name?: string +export type SimpleAccount = { + email: string + id: string + name: string } -export type TrialPipelineVariable = { - allow_file_extension?: Array - allow_file_upload_methods?: Array - allowed_file_types?: Array - belong_to_node_id?: string - default_value?: - | string - | number - | number - | boolean - | { - [key: string]: unknown - } - | Array - | null - label?: string - max_length?: number - options?: Array - placeholder?: string - required?: boolean - tooltips?: string - type?: string - unit?: string - variable?: string +export type WorkflowEnvironmentVariableResponse = { + description: string + id: string + name: string + value: unknown + value_type: string } -export type GeneratedAppResponseWritable = JsonValue +export type PipelineVariableResponse = { + allowed_file_extensions?: Array | null + allowed_file_types?: Array | null + allowed_file_upload_methods?: Array | null + belong_to_node_id: string + default_value?: unknown + label: string + max_length?: number | null + options?: Array | null + placeholder?: string | null + required: boolean + tooltips?: string | null + type: string + unit?: string | null + variable: string +} + +export type DatasetDocMetadataResponse = { + id: string + name: string + type: string +} + +export type DatasetExternalKnowledgeInfoResponse = { + external_knowledge_api_endpoint?: string | null + external_knowledge_api_id?: string | null + external_knowledge_api_name?: string | null + external_knowledge_id?: string | null +} + +export type DatasetExternalRetrievalModelResponse = { + score_threshold?: number | null + score_threshold_enabled?: boolean | null + top_k: number +} + +export type DatasetIconInfoResponse = { + icon?: string | null + icon_background?: string | null + icon_type?: string | null + icon_url?: string | null +} + +export type DatasetRetrievalModelResponse = { + reranking_enable: boolean + reranking_mode?: string | null + reranking_model?: DatasetRerankingModelResponse + score_threshold?: number | null + score_threshold_enabled: boolean + search_method: string + top_k: number + weights?: DatasetWeightedScoreResponse | null +} + +export type DatasetSummaryIndexSettingResponse = { + enable?: boolean | null + model_name?: string | null + model_provider_name?: string | null + summary_prompt?: string | null +} + +export type DatasetTagResponse = { + id: string + name: string + type: string +} + +export type DatasetRerankingModelResponse = { + reranking_model_name?: string | null + reranking_provider_name?: string | null +} + +export type DatasetWeightedScoreResponse = { + keyword_setting?: DatasetKeywordSettingResponse + vector_setting?: DatasetVectorSettingResponse + weight_type?: string | null +} + +export type DatasetKeywordSettingResponse = { + keyword_weight?: number | null +} + +export type DatasetVectorSettingResponse = { + embedding_model_name?: string | null + embedding_provider_name?: string | null + vector_weight?: number | null +} + +export type AppDetailWithSiteWritable = { + access_mode?: string | null + api_base_url?: string | null + app_id?: string | null + bound_agent_id?: string | null + created_at?: number | null + created_by?: string | null + deleted_tools?: Array + description?: string | null + enable_api: boolean + enable_site: boolean + icon?: string | null + icon_background?: string | null + icon_type?: string | null + id: string + maintainer?: string | null + max_active_requests?: number | null + mode: string + model_config?: ModelConfig | null + name: string + permission_keys?: Array + site?: SiteWritable | null + tags?: Array + tracing?: JsonValue | null + updated_at?: number | null + updated_by?: string | null + use_icon_as_answer_icon?: boolean | null + workflow?: WorkflowPartial | null +} export type SiteWritable = { chat_color_theme?: string | null @@ -362,7 +394,7 @@ export type GetTrialAppsByAppIdData = { } export type GetTrialAppsByAppIdResponses = { - 200: TrialAppDetailWithSite + 200: AppDetailWithSite } export type GetTrialAppsByAppIdResponse @@ -384,38 +416,6 @@ export type PostTrialAppsByAppIdAudioToTextResponses = { export type PostTrialAppsByAppIdAudioToTextResponse = PostTrialAppsByAppIdAudioToTextResponses[keyof PostTrialAppsByAppIdAudioToTextResponses] -export type PostTrialAppsByAppIdChatMessagesData = { - body: ChatRequest - path: { - app_id: string - } - query?: never - url: '/trial-apps/{app_id}/chat-messages' -} - -export type PostTrialAppsByAppIdChatMessagesResponses = { - 200: GeneratedAppResponse -} - -export type PostTrialAppsByAppIdChatMessagesResponse - = PostTrialAppsByAppIdChatMessagesResponses[keyof PostTrialAppsByAppIdChatMessagesResponses] - -export type PostTrialAppsByAppIdCompletionMessagesData = { - body: CompletionRequest - path: { - app_id: string - } - query?: never - url: '/trial-apps/{app_id}/completion-messages' -} - -export type PostTrialAppsByAppIdCompletionMessagesResponses = { - 200: GeneratedAppResponse -} - -export type PostTrialAppsByAppIdCompletionMessagesResponse - = PostTrialAppsByAppIdCompletionMessagesResponses[keyof PostTrialAppsByAppIdCompletionMessagesResponses] - export type GetTrialAppsByAppIdDatasetsData = { body?: never path: { @@ -430,7 +430,7 @@ export type GetTrialAppsByAppIdDatasetsData = { } export type GetTrialAppsByAppIdDatasetsResponses = { - 200: TrialDatasetList + 200: TrialDatasetListResponse } export type GetTrialAppsByAppIdDatasetsResponse @@ -511,28 +511,12 @@ export type GetTrialAppsByAppIdWorkflowsData = { } export type GetTrialAppsByAppIdWorkflowsResponses = { - 200: TrialWorkflow + 200: WorkflowResponse } export type GetTrialAppsByAppIdWorkflowsResponse = GetTrialAppsByAppIdWorkflowsResponses[keyof GetTrialAppsByAppIdWorkflowsResponses] -export type PostTrialAppsByAppIdWorkflowsRunData = { - body: WorkflowRunRequest - path: { - app_id: string - } - query?: never - url: '/trial-apps/{app_id}/workflows/run' -} - -export type PostTrialAppsByAppIdWorkflowsRunResponses = { - 200: GeneratedAppResponse -} - -export type PostTrialAppsByAppIdWorkflowsRunResponse - = PostTrialAppsByAppIdWorkflowsRunResponses[keyof PostTrialAppsByAppIdWorkflowsRunResponses] - export type PostTrialAppsByAppIdWorkflowsTasksByTaskIdStopData = { body?: never path: { diff --git a/packages/contracts/generated/api/console/trial-apps/zod.gen.ts b/packages/contracts/generated/api/console/trial-apps/zod.gen.ts index b8768790ef9..070fdcab1d0 100644 --- a/packages/contracts/generated/api/console/trial-apps/zod.gen.ts +++ b/packages/contracts/generated/api/console/trial-apps/zod.gen.ts @@ -9,29 +9,6 @@ export const zAudioTranscriptResponse = z.object({ text: z.string(), }) -/** - * ChatRequest - */ -export const zChatRequest = z.object({ - conversation_id: z.string().nullish(), - files: z.array(z.unknown()).nullish(), - inputs: z.record(z.string(), z.unknown()), - parent_message_id: z.string().nullish(), - query: z.string(), - retriever_from: z.string().optional().default('explore_app'), -}) - -/** - * CompletionRequest - */ -export const zCompletionRequest = z.object({ - files: z.array(z.unknown()).nullish(), - inputs: z.record(z.string(), z.unknown()), - query: z.string().optional().default(''), - response_mode: z.enum(['blocking', 'streaming']).nullish(), - retriever_from: z.string().optional().default('explore_app'), -}) - /** * SuggestedQuestionsResponse */ @@ -74,14 +51,6 @@ export const zTextToSpeechRequest = z.object({ */ export const zAudioBinaryResponse = z.custom() -/** - * WorkflowRunRequest - */ -export const zWorkflowRunRequest = z.object({ - files: z.array(z.unknown()).nullish(), - inputs: z.record(z.string(), z.unknown()), -}) - /** * SimpleResultResponse */ @@ -89,169 +58,22 @@ export const zSimpleResultResponse = z.object({ result: z.string(), }) -export const zTrialDeletedTool = z.object({ - provider_id: z.string().optional(), - tool_name: z.string().optional(), - type: z.string().optional(), +/** + * DeletedTool + */ +export const zDeletedTool = z.object({ + provider_id: z.string(), + tool_name: z.string(), + type: z.string(), }) -export const zTrialAppModelConfig = z.object({ - agent_mode: z.record(z.string(), z.unknown()).optional(), - annotation_reply: z.record(z.string(), z.unknown()).optional(), - chat_prompt_config: z.record(z.string(), z.unknown()).optional(), - completion_prompt_config: z.record(z.string(), z.unknown()).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(), - dataset_configs: z.record(z.string(), z.unknown()).optional(), - dataset_query_variable: z.string().optional(), - external_data_tools: z.array(z.record(z.string(), z.unknown())).optional(), - file_upload: z.record(z.string(), z.unknown()).optional(), - model: z.record(z.string(), z.unknown()).optional(), - more_like_this: z.record(z.string(), z.unknown()).optional(), - opening_statement: z.string().optional(), - pre_prompt: z.string().optional(), - prompt_type: z.string().optional(), - retriever_resource: z.record(z.string(), z.unknown()).optional(), - sensitive_word_avoidance: z.record(z.string(), z.unknown()).optional(), - speech_to_text: z.record(z.string(), z.unknown()).optional(), - suggested_questions: z.array(z.string()).optional(), - suggested_questions_after_answer: z.record(z.string(), z.unknown()).optional(), - text_to_speech: z.record(z.string(), z.unknown()).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(), - user_input_form: z.array(z.record(z.string(), z.unknown())).optional(), -}) - -export const zTrialSite = z.object({ - access_token: z.string().optional(), - app_base_url: z.string().optional(), - chat_color_theme: z.string().optional(), - chat_color_theme_inverted: z.boolean().optional(), - code: z.string().optional(), - copyright: 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(), - custom_disclaimer: z.string().optional(), - customize_domain: z.string().optional(), - customize_token_strategy: z.string().optional(), - default_language: z.string().optional(), - description: z.string().optional(), - icon: z.string().optional(), - icon_background: z.string().optional(), - icon_type: z.string().optional(), - icon_url: z.string().optional(), - privacy_policy: z.string().optional(), - prompt_public: z.boolean().optional(), - show_workflow_steps: z.boolean().optional(), - title: z.string().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(), - use_icon_as_answer_icon: z.boolean().optional(), -}) - -export const zTrialTag = z.object({ - id: z.string().optional(), - name: z.string().optional(), - type: z.string().optional(), -}) - -export const zTrialWorkflowPartial = z.object({ - 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(), - id: z.string().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(), -}) - -export const zTrialAppDetailWithSite = z.object({ - access_mode: z.string().optional(), - api_base_url: 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(), - deleted_tools: z.array(zTrialDeletedTool).optional(), - description: z.string().optional(), - enable_api: z.boolean().optional(), - enable_site: z.boolean().optional(), - icon: z.string().optional(), - icon_background: z.string().optional(), - icon_type: z.string().optional(), - icon_url: z.string().optional(), - id: z.string().optional(), - max_active_requests: z.int().optional(), - mode: z.string().optional(), - model_config: zTrialAppModelConfig.optional(), - name: z.string().optional(), - permission_keys: z.array(z.string()).optional(), - site: zTrialSite.optional(), - tags: z.array(zTrialTag).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(), - use_icon_as_answer_icon: z.boolean().optional(), - workflow: zTrialWorkflowPartial.optional(), +/** + * Tag + */ +export const zTag = z.object({ + id: z.string(), + name: z.string(), + type: z.string(), }) export const zJsonValue = z @@ -266,36 +88,78 @@ export const zJsonValue = z .nullable() /** - * GeneratedAppResponse + * ModelConfig */ -export const zGeneratedAppResponse = zJsonValue - -export const zTrialDataset = z.object({ - 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(), - id: z.string().optional(), - indexing_technique: z.string().optional(), - name: z.string().optional(), - permission: z.string().optional(), - permission_keys: z.array(z.string()).optional(), +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(), }) -export const zTrialDatasetList = z.object({ - data: z.array(zTrialDataset).optional(), - has_more: z.boolean().optional(), - limit: z.int().optional(), - page: z.int().optional(), - total: z.int().optional(), +/** + * WorkflowPartial + */ +export const zWorkflowPartial = z.object({ + created_at: z.int().nullish(), + created_by: z.string().nullish(), + id: z.string(), + updated_at: z.int().nullish(), + 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(), }) export const zJsonObject = z.record(z.string(), z.unknown()) @@ -329,93 +193,235 @@ export const zParameters = z.object({ user_input_form: z.array(zJsonObject), }) -export const zTrialConversationVariable = z.object({ - description: z.string().optional(), - id: z.string().optional(), - name: z.string().optional(), - value: z - .union([ - z.string(), - z.int(), - z.number(), - z.boolean(), - z.record(z.string(), z.unknown()), - z.array(z.unknown()), - ]) - .nullish(), - value_type: z.string().optional(), -}) - -export const zTrialSimpleAccount = z.object({ - email: z.string().optional(), - id: z.string().optional(), - name: z.string().optional(), -}) - -export const zTrialPipelineVariable = z.object({ - allow_file_extension: z.array(z.string()).optional(), - allow_file_upload_methods: z.array(z.string()).optional(), - allowed_file_types: z.array(z.string()).optional(), - belong_to_node_id: z.string().optional(), - default_value: z - .union([ - z.string(), - z.int(), - z.number(), - z.boolean(), - z.record(z.string(), z.unknown()), - z.array(z.unknown()), - ]) - .nullish(), - label: z.string().optional(), - max_length: z.int().optional(), - options: z.array(z.string()).optional(), - placeholder: z.string().optional(), - required: z.boolean().optional(), - tooltips: z.string().optional(), - type: z.string().optional(), - unit: z.string().optional(), - variable: z.string().optional(), -}) - -export const zTrialWorkflow = z.object({ - conversation_variables: z.array(zTrialConversationVariable).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: zTrialSimpleAccount.optional(), - environment_variables: z.array(z.record(z.string(), z.unknown())).optional(), - features: z.record(z.string(), z.unknown()).optional(), - graph: z.record(z.string(), z.unknown()).optional(), - hash: z.string().optional(), - id: z.string().optional(), - marked_comment: z.string().optional(), - marked_name: z.string().optional(), - rag_pipeline_variables: z.array(zTrialPipelineVariable).optional(), - tool_published: z.boolean().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: zTrialSimpleAccount.optional(), - version: z.string().optional(), +/** + * WorkflowConversationVariableResponse + */ +export const zWorkflowConversationVariableResponse = z.object({ + description: z.string(), + id: z.string(), + name: z.string(), + value: z.unknown(), + value_type: z.string(), }) /** - * GeneratedAppResponse + * SimpleAccount */ -export const zGeneratedAppResponseWritable = zJsonValue +export const zSimpleAccount = z.object({ + email: z.string(), + id: z.string(), + name: z.string(), +}) + +/** + * WorkflowEnvironmentVariableResponse + */ +export const zWorkflowEnvironmentVariableResponse = z.object({ + description: z.string(), + id: z.string(), + name: z.string(), + value: z.unknown(), + value_type: z.string(), +}) + +/** + * PipelineVariableResponse + */ +export const zPipelineVariableResponse = z.object({ + allowed_file_extensions: z.array(z.string()).nullish(), + allowed_file_types: z.array(z.string()).nullish(), + allowed_file_upload_methods: z.array(z.string()).nullish(), + belong_to_node_id: z.string(), + default_value: z.unknown().optional(), + label: z.string(), + max_length: z.int().nullish(), + options: z.array(z.string()).nullish(), + placeholder: z.string().nullish(), + required: z.boolean(), + tooltips: z.string().nullish(), + type: z.string(), + unit: z.string().nullish(), + variable: z.string(), +}) + +/** + * WorkflowResponse + */ +export const zWorkflowResponse = z.object({ + conversation_variables: z.array(zWorkflowConversationVariableResponse), + created_at: z.int(), + created_by: zSimpleAccount.nullish(), + environment_variables: z.array(zWorkflowEnvironmentVariableResponse), + features: z.record(z.string(), z.unknown()), + graph: z.record(z.string(), z.unknown()), + hash: z.string(), + id: z.string(), + marked_comment: z.string(), + marked_name: z.string(), + rag_pipeline_variables: z.array(zPipelineVariableResponse), + tool_published: z.boolean(), + updated_at: z.int(), + updated_by: zSimpleAccount.nullish(), + version: z.string(), +}) + +/** + * DatasetDocMetadataResponse + */ +export const zDatasetDocMetadataResponse = z.object({ + id: z.string(), + name: z.string(), + type: z.string(), +}) + +/** + * DatasetExternalKnowledgeInfoResponse + */ +export const zDatasetExternalKnowledgeInfoResponse = z.object({ + external_knowledge_api_endpoint: z.string().nullish(), + external_knowledge_api_id: z.string().nullish(), + external_knowledge_api_name: z.string().nullish(), + external_knowledge_id: z.string().nullish(), +}) + +/** + * DatasetExternalRetrievalModelResponse + */ +export const zDatasetExternalRetrievalModelResponse = z.object({ + score_threshold: z.number().nullish(), + score_threshold_enabled: z.boolean().nullish(), + top_k: z.int(), +}) + +/** + * DatasetIconInfoResponse + */ +export const zDatasetIconInfoResponse = z.object({ + icon: z.string().nullish(), + icon_background: z.string().nullish(), + icon_type: z.string().nullish(), + icon_url: z.string().nullish(), +}) + +/** + * DatasetSummaryIndexSettingResponse + */ +export const zDatasetSummaryIndexSettingResponse = z.object({ + enable: z.boolean().nullish(), + model_name: z.string().nullish(), + model_provider_name: z.string().nullish(), + summary_prompt: z.string().nullish(), +}) + +/** + * DatasetTagResponse + */ +export const zDatasetTagResponse = z.object({ + id: z.string(), + name: z.string(), + type: z.string(), +}) + +/** + * DatasetRerankingModelResponse + */ +export const zDatasetRerankingModelResponse = z.object({ + reranking_model_name: z.string().nullish(), + reranking_provider_name: z.string().nullish(), +}) + +/** + * DatasetKeywordSettingResponse + */ +export const zDatasetKeywordSettingResponse = z.object({ + keyword_weight: z.number().nullish(), +}) + +/** + * DatasetVectorSettingResponse + */ +export const zDatasetVectorSettingResponse = z.object({ + embedding_model_name: z.string().nullish(), + embedding_provider_name: z.string().nullish(), + vector_weight: z.number().nullish(), +}) + +/** + * DatasetWeightedScoreResponse + */ +export const zDatasetWeightedScoreResponse = z.object({ + keyword_setting: zDatasetKeywordSettingResponse.optional(), + vector_setting: zDatasetVectorSettingResponse.optional(), + weight_type: z.string().nullish(), +}) + +/** + * DatasetRetrievalModelResponse + */ +export const zDatasetRetrievalModelResponse = z.object({ + reranking_enable: z.boolean(), + reranking_mode: z.string().nullish(), + reranking_model: zDatasetRerankingModelResponse.optional(), + score_threshold: z.number().nullish(), + score_threshold_enabled: z.boolean(), + search_method: z.string(), + top_k: z.int(), + weights: zDatasetWeightedScoreResponse.nullish(), +}) + +/** + * TrialDatasetListItemResponse + */ +export const zTrialDatasetListItemResponse = z.object({ + app_count: z.int(), + author_name: z.string().nullable(), + built_in_field_enabled: z.boolean(), + chunk_structure: z.string().nullable(), + created_at: z.int(), + created_by: z.string(), + data_source_type: z.string().nullable(), + description: z.string().nullable(), + doc_form: z.string().nullable(), + doc_metadata: z.array(zDatasetDocMetadataResponse), + document_count: z.int(), + embedding_available: z.boolean().nullish(), + embedding_model: z.string().nullable(), + embedding_model_provider: z.string().nullable(), + enable_api: z.boolean(), + external_knowledge_info: zDatasetExternalKnowledgeInfoResponse.optional(), + external_retrieval_model: zDatasetExternalRetrievalModelResponse.nullable(), + icon_info: zDatasetIconInfoResponse.optional(), + id: z.string(), + indexing_technique: z.string().nullable(), + is_multimodal: z.boolean(), + is_published: z.boolean(), + maintainer: z.string().nullish(), + name: z.string(), + permission: z.string(), + permission_keys: z.array(z.string()).optional(), + pipeline_id: z.string().nullable(), + provider: z.string(), + retrieval_model_dict: zDatasetRetrievalModelResponse, + runtime_mode: z.string().nullable(), + summary_index_setting: zDatasetSummaryIndexSettingResponse.optional(), + tags: z.array(zDatasetTagResponse), + total_available_documents: z.int(), + total_documents: z.int(), + updated_at: z.int(), + updated_by: z.string().nullable(), + word_count: z.int(), +}) + +/** + * TrialDatasetListResponse + */ +export const zTrialDatasetListResponse = z.object({ + data: z.array(zTrialDatasetListItemResponse), + has_more: z.boolean(), + limit: z.int(), + page: z.int(), + total: z.int(), +}) /** * Site @@ -436,14 +442,47 @@ export const zSiteWritable = z.object({ use_icon_as_answer_icon: z.boolean(), }) +/** + * AppDetailWithSite + */ +export const zAppDetailWithSiteWritable = 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(), + 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: zSiteWritable.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(), +}) + export const zGetTrialAppsByAppIdPath = z.object({ app_id: z.uuid(), }) /** - * Success + * App detail retrieved successfully */ -export const zGetTrialAppsByAppIdResponse = zTrialAppDetailWithSite +export const zGetTrialAppsByAppIdResponse = zAppDetailWithSite export const zPostTrialAppsByAppIdAudioToTextPath = z.object({ app_id: z.uuid(), @@ -454,28 +493,6 @@ export const zPostTrialAppsByAppIdAudioToTextPath = z.object({ */ export const zPostTrialAppsByAppIdAudioToTextResponse = zAudioTranscriptResponse -export const zPostTrialAppsByAppIdChatMessagesBody = zChatRequest - -export const zPostTrialAppsByAppIdChatMessagesPath = z.object({ - app_id: z.uuid(), -}) - -/** - * Success - */ -export const zPostTrialAppsByAppIdChatMessagesResponse = zGeneratedAppResponse - -export const zPostTrialAppsByAppIdCompletionMessagesBody = zCompletionRequest - -export const zPostTrialAppsByAppIdCompletionMessagesPath = z.object({ - app_id: z.uuid(), -}) - -/** - * Success - */ -export const zPostTrialAppsByAppIdCompletionMessagesResponse = zGeneratedAppResponse - export const zGetTrialAppsByAppIdDatasetsPath = z.object({ app_id: z.uuid(), }) @@ -489,7 +506,7 @@ export const zGetTrialAppsByAppIdDatasetsQuery = z.object({ /** * Success */ -export const zGetTrialAppsByAppIdDatasetsResponse = zTrialDatasetList +export const zGetTrialAppsByAppIdDatasetsResponse = zTrialDatasetListResponse export const zGetTrialAppsByAppIdMessagesByMessageIdSuggestedQuestionsPath = z.object({ app_id: z.uuid(), @@ -536,20 +553,9 @@ export const zGetTrialAppsByAppIdWorkflowsPath = z.object({ }) /** - * Success + * Workflow detail retrieved successfully */ -export const zGetTrialAppsByAppIdWorkflowsResponse = zTrialWorkflow - -export const zPostTrialAppsByAppIdWorkflowsRunBody = zWorkflowRunRequest - -export const zPostTrialAppsByAppIdWorkflowsRunPath = z.object({ - app_id: z.uuid(), -}) - -/** - * Success - */ -export const zPostTrialAppsByAppIdWorkflowsRunResponse = zGeneratedAppResponse +export const zGetTrialAppsByAppIdWorkflowsResponse = zWorkflowResponse export const zPostTrialAppsByAppIdWorkflowsTasksByTaskIdStopPath = z.object({ app_id: z.uuid(), diff --git a/packages/contracts/generated/api/console/workflow-generate/types.gen.ts b/packages/contracts/generated/api/console/workflow-generate/types.gen.ts index 7f67a572cb5..7fdaec5f4f0 100644 --- a/packages/contracts/generated/api/console/workflow-generate/types.gen.ts +++ b/packages/contracts/generated/api/console/workflow-generate/types.gen.ts @@ -17,15 +17,42 @@ export type WorkflowGeneratePayload = { export type GeneratorResponse = unknown 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 + = | string + | number + | number + | boolean + | { + [key: string]: unknown + } + | Array + | null export type PostWorkflowGenerateData = { body: WorkflowGeneratePayload diff --git a/packages/contracts/generated/api/console/workflow-generate/zod.gen.ts b/packages/contracts/generated/api/console/workflow-generate/zod.gen.ts index c57f0e31412..3076374073e 100644 --- a/packages/contracts/generated/api/console/workflow-generate/zod.gen.ts +++ b/packages/contracts/generated/api/console/workflow-generate/zod.gen.ts @@ -7,21 +7,45 @@ import * as z from 'zod' */ export const zGeneratorResponse = z.unknown() -/** - * LLMMode - * - * Enum class for large language model mode. - */ -export const zLlmMode = z.enum(['chat', 'completion']) +export const zJsonValue = z + .union([ + z.string(), + z.int(), + z.number(), + z.boolean(), + z.record(z.string(), z.unknown()), + z.array(z.unknown()), + ]) + .nullable() /** * 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/openapi-ts.api.config.ts b/packages/contracts/openapi-ts.api.config.ts index 8fce8a25bd3..1adbf4fda8e 100644 --- a/packages/contracts/openapi-ts.api.config.ts +++ b/packages/contracts/openapi-ts.api.config.ts @@ -10,13 +10,21 @@ type SwaggerSchema = JsonObject & { $ref?: string } +type OpenApiMediaType = JsonObject & { + schema?: SwaggerSchema +} + +type OpenApiResponse = JsonObject & { + content?: Record +} + type OpenApiComponents = JsonObject & { schemas?: Record } type SwaggerOperation = JsonObject & { operationId?: string - responses?: Record + responses?: Record } type SwaggerDocument = JsonObject & { @@ -52,6 +60,17 @@ const currentDir = path.dirname(fileURLToPath(import.meta.url)) const apiOpenApiDir = path.resolve(currentDir, 'openapi') const operationMethods = new Set(['delete', 'get', 'patch', 'post', 'put']) +const pydanticDecimalStringPattern = '^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$' +const codegenSafeDecimalStringPattern = '^(?![-+.]*$)[+-]?0*\\d*\\.?\\d*$' + +const opaqueJsonContent = (): Record => ({ + 'application/json': { + schema: { + additionalProperties: true, + type: 'object', + }, + }, +}) const apiSpecs: ApiSpec[] = [ { filename: 'console-openapi.json', name: 'console' }, @@ -182,6 +201,46 @@ const addOperationIds = (document: SwaggerDocument) => { } } +const isOpaqueContractResponse = (response: OpenApiResponse) => { + const content = response.content + if (!isObject(content)) + return false + + return Object.entries(content).some(([mediaType, media]) => { + if (!isObject(media)) + return false + + return (mediaType === 'application/json' || mediaType === 'text/event-stream') && !('schema' in media) + }) +} + +const hasOpaqueContractSuccessResponse = (operation: SwaggerOperation) => { + return Object.entries(operation.responses ?? {}).some(([status, response]) => { + return /^2\d\d$/.test(status) && isObject(response) && isOpaqueContractResponse(response) + }) +} + +const normalizeOpaqueContractResponses = (document: SwaggerDocument) => { + // Some backend endpoints has no schema (e.g. external) and will trap heyapi here + // So we forge an opaque schema here + for (const pathItem of Object.values(document.paths ?? {})) { + for (const [method, operation] of Object.entries(pathItem)) { + if (!operationMethods.has(method) || !isObject(operation)) + continue + + const swaggerOperation = operation as SwaggerOperation + if (!hasOpaqueContractSuccessResponse(swaggerOperation)) + continue + + Object.values(swaggerOperation.responses ?? {}) + .filter(response => isObject(response) && isOpaqueContractResponse(response)) + .forEach((response) => { + response.content = opaqueJsonContent() + }) + } + } +} + const hasSuccessResponse = (operation: SwaggerOperation) => { return Object.entries(operation.responses ?? {}).some(([status, response]) => { if (!/^2\d\d$/.test(status)) @@ -215,6 +274,7 @@ const filterContractOperations = (document: SwaggerDocument) => { } const normalizeApiSwagger = (document: SwaggerDocument) => { + normalizeOpaqueContractResponses(document) filterContractOperations(document) addOperationIds(document) @@ -380,10 +440,20 @@ const createApiConfig = (job: ApiJob): UserConfig => ({ 'name': 'zod', '~resolvers': { string: (ctx) => { - if (ctx.schema.format !== 'binary') - return undefined + if (ctx.schema.format === 'binary') + return $(ctx.symbols.z).attr('custom').call().generic($.type.or($.type('Blob'), $.type('File'))) - return $(ctx.symbols.z).attr('custom').call().generic($.type.or($.type('Blob'), $.type('File'))) + if (ctx.schema.pattern === pydanticDecimalStringPattern) { + // the pydantic generated regex will emit error like + // regexp/no-useless-assertions, so patch the regex here + return $(ctx.symbols.z) + .attr('string') + .call() + .attr('regex') + .call($.regexp(codegenSafeDecimalStringPattern)) + } + + return undefined }, }, }, From dd0db5f97416043b40d01e916879f0672419cc60 Mon Sep 17 00:00:00 2001 From: chariri Date: Fri, 26 Jun 2026 03:07:10 +0900 Subject: [PATCH 2/2] fix(api): document message responses as serialized contracts --- api/controllers/console/app/message.py | 6 +- api/fields/member_fields.py | 18 +- api/openapi/markdown/console-openapi.md | 105 +++++----- api/openapi/markdown/service-openapi.md | 4 +- .../api/console/account/types.gen.ts | 20 +- .../generated/api/console/account/zod.gen.ts | 24 +-- .../generated/api/console/agent/types.gen.ts | 7 +- .../generated/api/console/agent/zod.gen.ts | 7 +- .../generated/api/console/apps/types.gen.ts | 35 ++-- .../generated/api/console/apps/zod.gen.ts | 188 +++++++++--------- .../api/console/installed-apps/types.gen.ts | 1 - .../api/console/installed-apps/zod.gen.ts | 1 - .../generated/api/console/rag/types.gen.ts | 12 +- .../generated/api/console/rag/zod.gen.ts | 14 +- .../api/console/snippets/types.gen.ts | 12 +- .../generated/api/console/snippets/zod.gen.ts | 14 +- .../api/console/trial-apps/types.gen.ts | 6 +- .../api/console/trial-apps/zod.gen.ts | 8 +- .../api/console/workspaces/types.gen.ts | 10 +- .../api/console/workspaces/zod.gen.ts | 14 +- .../generated/api/service/types.gen.ts | 4 +- .../generated/api/service/zod.gen.ts | 6 +- .../configure/components/preview/chat.tsx | 8 +- 23 files changed, 272 insertions(+), 252 deletions(-) diff --git a/api/controllers/console/app/message.py b/api/controllers/console/app/message.py index 195a41f2888..f987ecca745 100644 --- a/api/controllers/console/app/message.py +++ b/api/controllers/console/app/message.py @@ -167,12 +167,16 @@ register_schema_models( ChatMessagesQuery, MessageFeedbackPayload, FeedbackExportQuery, +) +register_response_schema_models( + console_ns, AnnotationCountResponse, SuggestedQuestionsResponse, MessageDetailResponse, MessageInfiniteScrollPaginationResponse, + SimpleResultResponse, + TextFileResponse, ) -register_response_schema_models(console_ns, SimpleResultResponse, TextFileResponse) @console_ns.route("/apps//chat-messages") 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/openapi/markdown/console-openapi.md b/api/openapi/markdown/console-openapi.md index 3d1e70c17a5..e6455ebb7af 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 @@ -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 @@ -11928,23 +11928,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 +12003,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 +12047,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 +12095,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 | @@ -13429,7 +13429,6 @@ Soft lifecycle state for Agent records. | created_at | integer | | No | | files | [ string ] | | Yes | | id | string | | Yes | -| message_chain_id | string | | No | | message_id | string | | Yes | | observation | string | | No | | position | integer | | Yes | @@ -14540,8 +14539,8 @@ Enum class for configurate method of provider model. | Name | Type | Description | Required | | ---- | ---- | ----------- | -------- | | annotation_create_account | [SimpleAccount](#simpleaccount) | | No | +| annotation_id | string | | Yes | | created_at | integer | | No | -| id | string | | Yes | #### ConversationDetail @@ -17079,6 +17078,7 @@ Enum class for large language model mode. | agent_thoughts | [ [AgentThought](#agentthought) ] | | No | | annotation | [ConversationAnnotation](#conversationannotation) | | No | | annotation_hit_history | [ConversationAnnotationHitHistory](#conversationannotationhithistory) | | No | +| answer | string | | Yes | | answer_tokens | integer | | No | | conversation_id | string | | Yes | | created_at | integer | | No | @@ -17092,12 +17092,11 @@ Enum class for large language model mode. | inputs | object | | Yes | | message | [JSONValue](#jsonvalue) | | No | | message_files | [ [MessageFile](#messagefile) ] | | No | -| message_metadata_dict | [JSONValue](#jsonvalue) | | No | | message_tokens | integer | | No | +| metadata | [JSONValue](#jsonvalue) | | No | | parent_message_id | string | | No | | provider_response_latency | number | | No | | query | string | | Yes | -| re_sign_file_url_answer | string | | Yes | | status | string | | Yes | | workflow_run_id | string | | No | @@ -19171,6 +19170,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 | @@ -19478,7 +19485,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 | @@ -19490,7 +19497,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 @@ -20274,7 +20281,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 | @@ -20311,7 +20318,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 | @@ -20412,7 +20419,7 @@ How a workflow node is bound to an Agent. | Name | Type | Description | Required | | ---- | ---- | ----------- | -------- | -| users | [ [AccountWithRole](#accountwithrole) ] | | Yes | +| users | [ [AccountWithRoleResponse](#accountwithroleresponse) ] | | Yes | #### WorkflowCommentReply @@ -20761,7 +20768,7 @@ can reuse its existing handler. | ---- | ---- | ----------- | -------- | | 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 | @@ -20772,7 +20779,7 @@ 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 @@ -20807,7 +20814,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 | @@ -20846,7 +20853,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 | @@ -20893,7 +20900,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 | 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/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 6e05107fc51..c5ef43f6360 100644 --- a/packages/contracts/generated/api/console/agent/types.gen.ts +++ b/packages/contracts/generated/api/console/agent/types.gen.ts @@ -269,6 +269,7 @@ export type MessageDetailResponse = { agent_thoughts?: Array annotation?: ConversationAnnotation | null annotation_hit_history?: ConversationAnnotationHitHistory | null + answer: string answer_tokens?: number | null conversation_id: string created_at?: number | null @@ -284,12 +285,11 @@ export type MessageDetailResponse = { } message?: JsonValue | null message_files?: Array - message_metadata_dict?: JsonValue | null message_tokens?: number | null + metadata?: JsonValue | null parent_message_id?: string | null provider_response_latency?: number | null query: string - re_sign_file_url_answer: string status: string workflow_run_id?: string | null } @@ -741,7 +741,6 @@ export type AgentThought = { created_at?: number | null files: Array id: string - message_chain_id?: string | null message_id: string observation?: string | null position: number @@ -761,8 +760,8 @@ export type ConversationAnnotation = { export type ConversationAnnotationHitHistory = { annotation_create_account?: SimpleAccount | null + annotation_id: string created_at?: number | null - id: string } export type HumanInputContent = { diff --git a/packages/contracts/generated/api/console/agent/zod.gen.ts b/packages/contracts/generated/api/console/agent/zod.gen.ts index d7c29eb68e2..634ab4af2d5 100644 --- a/packages/contracts/generated/api/console/agent/zod.gen.ts +++ b/packages/contracts/generated/api/console/agent/zod.gen.ts @@ -637,7 +637,6 @@ export const zAgentThought = z.object({ created_at: z.int().nullish(), files: z.array(z.string()), id: z.string(), - message_chain_id: z.string().nullish(), message_id: z.string(), observation: z.string().nullish(), position: z.int(), @@ -1069,8 +1068,8 @@ export const zConversationAnnotation = z.object({ */ export const zConversationAnnotationHitHistory = z.object({ annotation_create_account: zSimpleAccount.nullish(), + annotation_id: z.string(), created_at: z.int().nullish(), - id: z.string(), }) /** @@ -2048,6 +2047,7 @@ export const zMessageDetailResponse = z.object({ agent_thoughts: z.array(zAgentThought).optional(), annotation: zConversationAnnotation.nullish(), annotation_hit_history: zConversationAnnotationHitHistory.nullish(), + answer: z.string(), answer_tokens: z.int().nullish(), conversation_id: z.string(), created_at: z.int().nullish(), @@ -2061,12 +2061,11 @@ export const zMessageDetailResponse = z.object({ inputs: z.record(z.string(), zJsonValue), message: zJsonValue.nullish(), message_files: z.array(zMessageFile).optional(), - message_metadata_dict: zJsonValue.nullish(), message_tokens: z.int().nullish(), + metadata: zJsonValue.nullish(), parent_message_id: z.string().nullish(), provider_response_latency: z.number().nullish(), query: z.string(), - re_sign_file_url_answer: z.string(), status: z.string(), workflow_run_id: z.string().nullish(), }) diff --git a/packages/contracts/generated/api/console/apps/types.gen.ts b/packages/contracts/generated/api/console/apps/types.gen.ts index 956bfd2d6f9..db3de71f388 100644 --- a/packages/contracts/generated/api/console/apps/types.gen.ts +++ b/packages/contracts/generated/api/console/apps/types.gen.ts @@ -472,6 +472,7 @@ export type MessageDetailResponse = { agent_thoughts?: Array annotation?: ConversationAnnotation | null annotation_hit_history?: ConversationAnnotationHitHistory | null + answer: string answer_tokens?: number | null conversation_id: string created_at?: number | null @@ -487,12 +488,11 @@ export type MessageDetailResponse = { } message?: JsonValue | null message_files?: Array - message_metadata_dict?: JsonValue | null message_tokens?: number | null + metadata?: JsonValue | null parent_message_id?: string | null provider_response_latency?: number | null query: string - re_sign_file_url_answer: string status: string workflow_run_id?: string | null } @@ -731,7 +731,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 +799,7 @@ export type WorkflowCommentCreate = { } export type WorkflowCommentMentionUsersPayload = { - users: Array + users: Array } export type WorkflowCommentDetail = { @@ -887,7 +887,7 @@ export type DefaultBlockConfigResponse = { 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 +902,7 @@ export type WorkflowResponse = { rag_pipeline_variables: Array tool_published: boolean updated_at: number - updated_by?: SimpleAccount | null + updated_by?: SimpleAccountResponse | null version: string } @@ -1029,7 +1029,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 @@ -1307,7 +1307,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 @@ -1516,7 +1516,6 @@ export type AgentThought = { created_at?: number | null files: Array id: string - message_chain_id?: string | null message_id: string observation?: string | null position: number @@ -1536,8 +1535,8 @@ export type ConversationAnnotation = { export type ConversationAnnotationHitHistory = { annotation_create_account?: SimpleAccount | null + annotation_id: string created_at?: number | null - id: string } export type HumanInputContent = { @@ -1614,7 +1613,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 @@ -1625,7 +1624,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 @@ -1634,7 +1633,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 @@ -1646,7 +1645,7 @@ export type WorkflowRunForListResponse = { version?: string | null } -export type SimpleAccount = { +export type SimpleAccountResponse = { email: string id: string name: string @@ -1689,7 +1688,7 @@ export type WorkflowCommentBasic = { updated_at?: number | null } -export type AccountWithRole = { +export type AccountWithRoleResponse = { avatar?: string | null created_at?: number | null email: string @@ -2070,6 +2069,12 @@ export type SimpleMessageDetail = { query: string } +export type SimpleAccount = { + email: string + id: string + name: string +} + export type HumanInputFormDefinition = { actions?: Array display_in_ui?: boolean diff --git a/packages/contracts/generated/api/console/apps/zod.gen.ts b/packages/contracts/generated/api/console/apps/zod.gen.ts index d63ecfcf5b2..52a44783eda 100644 --- a/packages/contracts/generated/api/console/apps/zod.gen.ts +++ b/packages/contracts/generated/api/console/apps/zod.gen.ts @@ -1259,7 +1259,6 @@ export const zAgentThought = z.object({ created_at: z.int().nullish(), files: z.array(z.string()), id: z.string(), - message_chain_id: z.string().nullish(), message_id: z.string(), observation: z.string().nullish(), position: z.int(), @@ -1428,9 +1427,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(), @@ -1442,7 +1441,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(), @@ -1464,86 +1463,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(), -}) - -/** - * 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(), -}) - /** * 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(), @@ -1579,7 +1504,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(), @@ -1601,7 +1526,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(), @@ -1667,9 +1592,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(), @@ -1686,7 +1611,7 @@ export const zAccountWithRole = z.object({ * WorkflowCommentMentionUsersPayload */ export const zWorkflowCommentMentionUsersPayload = z.object({ - users: z.array(zAccountWithRole), + users: z.array(zAccountWithRoleResponse), }) /** @@ -1875,7 +1800,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()), @@ -1886,7 +1811,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(), }) @@ -2379,6 +2304,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 */ @@ -2411,6 +2356,69 @@ export const zConversationPagination = z.object({ total: z.int(), }) +/** + * ConversationAnnotationHitHistory + */ +export const zConversationAnnotationHitHistory = z.object({ + annotation_create_account: zSimpleAccount.nullish(), + annotation_id: z.string(), + created_at: z.int().nullish(), +}) + +/** + * 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 */ @@ -2438,7 +2446,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(), @@ -2474,7 +2482,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(), @@ -3468,6 +3476,7 @@ export const zMessageDetailResponse = z.object({ agent_thoughts: z.array(zAgentThought).optional(), annotation: zConversationAnnotation.nullish(), annotation_hit_history: zConversationAnnotationHitHistory.nullish(), + answer: z.string(), answer_tokens: z.int().nullish(), conversation_id: z.string(), created_at: z.int().nullish(), @@ -3481,12 +3490,11 @@ export const zMessageDetailResponse = z.object({ inputs: z.record(z.string(), zJsonValue), message: zJsonValue.nullish(), message_files: z.array(zMessageFile).optional(), - message_metadata_dict: zJsonValue.nullish(), message_tokens: z.int().nullish(), + metadata: zJsonValue.nullish(), parent_message_id: z.string().nullish(), provider_response_latency: z.number().nullish(), query: z.string(), - re_sign_file_url_answer: z.string(), status: z.string(), workflow_run_id: z.string().nullish(), }) 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 1bf62a52aaa..e72a09540f8 100644 --- a/packages/contracts/generated/api/console/installed-apps/types.gen.ts +++ b/packages/contracts/generated/api/console/installed-apps/types.gen.ts @@ -205,7 +205,6 @@ export type AgentThought = { created_at?: number | null files: Array id: string - message_chain_id?: string | null message_id: string observation?: string | null position: number 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 a21d35aec34..4ccf06b5f32 100644 --- a/packages/contracts/generated/api/console/installed-apps/zod.gen.ts +++ b/packages/contracts/generated/api/console/installed-apps/zod.gen.ts @@ -219,7 +219,6 @@ export const zAgentThought = z.object({ created_at: z.int().nullish(), files: z.array(z.string()), id: z.string(), - message_chain_id: z.string().nullish(), message_id: z.string(), observation: z.string().nullish(), position: z.int(), diff --git a/packages/contracts/generated/api/console/rag/types.gen.ts b/packages/contracts/generated/api/console/rag/types.gen.ts index b9862a8d1e8..5a6c903c383 100644 --- a/packages/contracts/generated/api/console/rag/types.gen.ts +++ b/packages/contracts/generated/api/console/rag/types.gen.ts @@ -119,7 +119,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 @@ -158,7 +158,7 @@ export type DefaultBlockConfigResponse = { 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 +173,7 @@ export type WorkflowResponse = { rag_pipeline_variables: Array tool_published: boolean updated_at: number - updated_by?: SimpleAccount | null + updated_by?: SimpleAccountResponse | null version: string } @@ -221,7 +221,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 @@ -421,7 +421,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 +433,7 @@ export type WorkflowRunForListResponse = { version?: string | null } -export type SimpleAccount = { +export type SimpleAccountResponse = { email: string id: string name: string diff --git a/packages/contracts/generated/api/console/rag/zod.gen.ts b/packages/contracts/generated/api/console/rag/zod.gen.ts index 717db30baa7..5edc412926a 100644 --- a/packages/contracts/generated/api/console/rag/zod.gen.ts +++ b/packages/contracts/generated/api/console/rag/zod.gen.ts @@ -322,9 +322,9 @@ export const zPipelineTemplateListResponse = z.object({ }) /** - * SimpleAccount + * SimpleAccountResponse */ -export const zSimpleAccount = z.object({ +export const zSimpleAccountResponse = z.object({ email: z.string(), id: z.string(), name: z.string(), @@ -335,7 +335,7 @@ export const zSimpleAccount = z.object({ */ 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(), @@ -371,7 +371,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(), @@ -393,7 +393,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(), @@ -471,7 +471,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()), @@ -482,7 +482,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(), }) diff --git a/packages/contracts/generated/api/console/snippets/types.gen.ts b/packages/contracts/generated/api/console/snippets/types.gen.ts index 631da7bace8..2fc256bcbb4 100644 --- a/packages/contracts/generated/api/console/snippets/types.gen.ts +++ b/packages/contracts/generated/api/console/snippets/types.gen.ts @@ -16,7 +16,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 @@ -51,7 +51,7 @@ export type DefaultBlockConfigsResponse = Array<{ export type SnippetWorkflowResponse = { conversation_variables: Array created_at: number - created_by?: SimpleAccount | null + created_by?: SimpleAccountResponse | null environment_variables: Array features: { [key: string]: unknown @@ -69,7 +69,7 @@ export type SnippetWorkflowResponse = { rag_pipeline_variables: Array tool_published: boolean updated_at: number - updated_by?: SimpleAccount | null + updated_by?: SimpleAccountResponse | null version: string } @@ -120,7 +120,7 @@ export type SnippetLoopNodeRunPayload = { 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 @@ -210,7 +210,7 @@ export type WorkflowPublishResponse = { 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 @@ -222,7 +222,7 @@ export type WorkflowRunForListResponse = { version?: string | null } -export type SimpleAccount = { +export type SimpleAccountResponse = { email: string id: string name: string diff --git a/packages/contracts/generated/api/console/snippets/zod.gen.ts b/packages/contracts/generated/api/console/snippets/zod.gen.ts index 85e5b961547..303fb07c66a 100644 --- a/packages/contracts/generated/api/console/snippets/zod.gen.ts +++ b/packages/contracts/generated/api/console/snippets/zod.gen.ts @@ -134,9 +134,9 @@ export const zWorkflowPublishResponse = z.object({ }) /** - * SimpleAccount + * SimpleAccountResponse */ -export const zSimpleAccount = z.object({ +export const zSimpleAccountResponse = z.object({ email: z.string(), id: z.string(), name: z.string(), @@ -147,7 +147,7 @@ export const zSimpleAccount = z.object({ */ 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(), @@ -183,7 +183,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(), @@ -205,7 +205,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(), @@ -283,7 +283,7 @@ export const zPipelineVariableResponse = z.object({ export const zSnippetWorkflowResponse = 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()), @@ -295,7 +295,7 @@ export const zSnippetWorkflowResponse = 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(), }) diff --git a/packages/contracts/generated/api/console/trial-apps/types.gen.ts b/packages/contracts/generated/api/console/trial-apps/types.gen.ts index a9f42362780..e6892fbfcf5 100644 --- a/packages/contracts/generated/api/console/trial-apps/types.gen.ts +++ b/packages/contracts/generated/api/console/trial-apps/types.gen.ts @@ -95,7 +95,7 @@ export type AudioBinaryResponse = Blob | File export type WorkflowResponse = { conversation_variables: Array created_at: number - created_by?: SimpleAccount | null + created_by?: SimpleAccountResponse | null environment_variables: Array features: { [key: string]: unknown @@ -110,7 +110,7 @@ export type WorkflowResponse = { rag_pipeline_variables: Array tool_published: boolean updated_at: number - updated_by?: SimpleAccount | null + updated_by?: SimpleAccountResponse | null version: string } @@ -236,7 +236,7 @@ export type WorkflowConversationVariableResponse = { value_type: string } -export type SimpleAccount = { +export type SimpleAccountResponse = { email: string id: string name: string diff --git a/packages/contracts/generated/api/console/trial-apps/zod.gen.ts b/packages/contracts/generated/api/console/trial-apps/zod.gen.ts index 070fdcab1d0..74402a204a1 100644 --- a/packages/contracts/generated/api/console/trial-apps/zod.gen.ts +++ b/packages/contracts/generated/api/console/trial-apps/zod.gen.ts @@ -205,9 +205,9 @@ export const zWorkflowConversationVariableResponse = z.object({ }) /** - * SimpleAccount + * SimpleAccountResponse */ -export const zSimpleAccount = z.object({ +export const zSimpleAccountResponse = z.object({ email: z.string(), id: z.string(), name: z.string(), @@ -250,7 +250,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()), @@ -261,7 +261,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(), }) diff --git a/packages/contracts/generated/api/console/workspaces/types.gen.ts b/packages/contracts/generated/api/console/workspaces/types.gen.ts index 29f23567e95..f1c9ca32a61 100644 --- a/packages/contracts/generated/api/console/workspaces/types.gen.ts +++ b/packages/contracts/generated/api/console/workspaces/types.gen.ts @@ -104,8 +104,8 @@ export type SnippetUseCountResponse = { use_count: number } -export type AccountWithRoleList = { - accounts: Array +export type AccountWithRoleListResponse = { + accounts: Array } export type DefaultModelDataResponse = { @@ -921,7 +921,7 @@ export type AnonymousInlineModel7B8B49Ca164e = { type?: string } -export type AccountWithRole = { +export type AccountWithRoleResponse = { avatar?: string | null created_at?: number | null email: string @@ -1777,7 +1777,7 @@ export type GetWorkspacesCurrentDatasetOperatorsData = { } export type GetWorkspacesCurrentDatasetOperatorsResponses = { - 200: AccountWithRoleList + 200: AccountWithRoleListResponse } export type GetWorkspacesCurrentDatasetOperatorsResponse @@ -2004,7 +2004,7 @@ export type GetWorkspacesCurrentMembersData = { } export type GetWorkspacesCurrentMembersResponses = { - 200: AccountWithRoleList + 200: AccountWithRoleListResponse } export type GetWorkspacesCurrentMembersResponse diff --git a/packages/contracts/generated/api/console/workspaces/zod.gen.ts b/packages/contracts/generated/api/console/workspaces/zod.gen.ts index fb6f643d7a9..35a6dede889 100644 --- a/packages/contracts/generated/api/console/workspaces/zod.gen.ts +++ b/packages/contracts/generated/api/console/workspaces/zod.gen.ts @@ -889,9 +889,9 @@ export const zSnippetPagination = 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(), @@ -905,10 +905,10 @@ export const zAccountWithRole = z.object({ }) /** - * AccountWithRoleList + * AccountWithRoleListResponse */ -export const zAccountWithRoleList = z.object({ - accounts: z.array(zAccountWithRole), +export const zAccountWithRoleListResponse = z.object({ + accounts: z.array(zAccountWithRoleResponse), }) /** @@ -2274,7 +2274,7 @@ export const zPostWorkspacesCurrentCustomizedSnippetsBySnippetIdUseCountIncremen /** * Success */ -export const zGetWorkspacesCurrentDatasetOperatorsResponse = zAccountWithRoleList +export const zGetWorkspacesCurrentDatasetOperatorsResponse = zAccountWithRoleListResponse export const zGetWorkspacesCurrentDefaultModelQuery = z.object({ model_type: z.enum(['llm', 'moderation', 'rerank', 'speech2text', 'text-embedding', 'tts']), @@ -2378,7 +2378,7 @@ export const zPatchWorkspacesCurrentEndpointsByIdResponse = zEndpointUpdateRespo /** * Success */ -export const zGetWorkspacesCurrentMembersResponse = zAccountWithRoleList +export const zGetWorkspacesCurrentMembersResponse = zAccountWithRoleListResponse export const zPostWorkspacesCurrentMembersInviteEmailBody = zMemberInvitePayload diff --git a/packages/contracts/generated/api/service/types.gen.ts b/packages/contracts/generated/api/service/types.gen.ts index 97921643514..ebce941aecf 100644 --- a/packages/contracts/generated/api/service/types.gen.ts +++ b/packages/contracts/generated/api/service/types.gen.ts @@ -1414,7 +1414,7 @@ export type SelectInputConfig = { type?: 'select' } -export type SimpleAccount = { +export type SimpleAccountResponse = { email: string id: string name: string @@ -1572,7 +1572,7 @@ export type WorkflowAppLogPaginationResponse = { 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 diff --git a/packages/contracts/generated/api/service/zod.gen.ts b/packages/contracts/generated/api/service/zod.gen.ts index 6ccc5671cb2..1d6c5cec40f 100644 --- a/packages/contracts/generated/api/service/zod.gen.ts +++ b/packages/contracts/generated/api/service/zod.gen.ts @@ -1676,9 +1676,9 @@ export const zProcessRule = z.object({ }) /** - * SimpleAccount + * SimpleAccountResponse */ -export const zSimpleAccount = z.object({ +export const zSimpleAccountResponse = z.object({ email: z.string(), id: z.string(), name: z.string(), @@ -2196,7 +2196,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(), diff --git a/web/features/agent-v2/agent-detail/configure/components/preview/chat.tsx b/web/features/agent-v2/agent-detail/configure/components/preview/chat.tsx index a3127b4bd49..9ad0555d196 100644 --- a/web/features/agent-v2/agent-detail/configure/components/preview/chat.tsx +++ b/web/features/agent-v2/agent-detail/configure/components/preview/chat.tsx @@ -217,14 +217,8 @@ const toFeedback = (feedback: NonNullable[nu } } -type AgentDebugMessageWithLegacyAnswer = MessageDetailResponse & { - answer?: string | null -} - const getAgentDebugMessageAnswer = (message: MessageDetailResponse) => { - const legacyAnswer = (message as AgentDebugMessageWithLegacyAnswer).answer - - return message.re_sign_file_url_answer ?? legacyAnswer ?? '' + return message.answer ?? '' } function getFormattedAgentDebugChatTree(messages: MessageDetailResponse[]): ChatItemInTree[] {