diff --git a/api/controllers/console/app/agent_app_feature.py b/api/controllers/console/app/agent_app_feature.py index 358e552beb0..305dd01feec 100644 --- a/api/controllers/console/app/agent_app_feature.py +++ b/api/controllers/console/app/agent_app_feature.py @@ -30,7 +30,6 @@ from controllers.console.wraps import ( ) from events.app_event import app_model_config_was_updated from extensions.ext_database import db -from libs.helper import dump_response from libs.login import login_required from models import Account from models.agent_config_entities import ( @@ -99,4 +98,4 @@ class AgentAppFeatureConfigResource(Resource): app_model_config_was_updated.send(app_model, app_model_config=new_app_model_config) - return dump_response(SimpleResultResponse, {"result": "success"}) + return SimpleResultResponse(result="success").model_dump(mode="json") diff --git a/api/controllers/console/app/app.py b/api/controllers/console/app/app.py index ff1eeeb8907..da7034de62f 100644 --- a/api/controllers/console/app/app.py +++ b/api/controllers/console/app/app.py @@ -230,13 +230,10 @@ class AppTracePayload(BaseModel): class AppTraceResponse(ResponseModel): - enabled: bool + enabled: bool = False tracing_provider: str | None = None -type JSONValue = Any - - class Tag(ResponseModel): id: str name: str @@ -257,7 +254,7 @@ class WorkflowPartial(ResponseModel): class ModelConfigPartial(ResponseModel): - model: JSONValue | None = Field(default=None, validation_alias=AliasChoices("model_dict", "model")) + model: Any | None = Field(default=None, validation_alias=AliasChoices("model_dict", "model")) pre_prompt: str | None = None created_by: str | None = None created_at: int | None = None @@ -272,54 +269,52 @@ class ModelConfigPartial(ResponseModel): class ModelConfig(ResponseModel): opening_statement: str | None = None - suggested_questions: JSONValue | None = Field( + suggested_questions: Any | None = Field( default=None, validation_alias=AliasChoices("suggested_questions_list", "suggested_questions") ) - suggested_questions_after_answer: JSONValue | None = Field( + suggested_questions_after_answer: Any | None = Field( default=None, validation_alias=AliasChoices("suggested_questions_after_answer_dict", "suggested_questions_after_answer"), ) - speech_to_text: JSONValue | None = Field( + speech_to_text: Any | None = Field( default=None, validation_alias=AliasChoices("speech_to_text_dict", "speech_to_text") ) - text_to_speech: JSONValue | None = Field( + text_to_speech: Any | None = Field( default=None, validation_alias=AliasChoices("text_to_speech_dict", "text_to_speech") ) - retriever_resource: JSONValue | None = Field( + retriever_resource: Any | None = Field( default=None, validation_alias=AliasChoices("retriever_resource_dict", "retriever_resource") ) - annotation_reply: JSONValue | None = Field( + annotation_reply: Any | None = Field( default=None, validation_alias=AliasChoices("annotation_reply_dict", "annotation_reply") ) - more_like_this: JSONValue | None = Field( + more_like_this: Any | None = Field( default=None, validation_alias=AliasChoices("more_like_this_dict", "more_like_this") ) - sensitive_word_avoidance: JSONValue | None = Field( + sensitive_word_avoidance: Any | None = Field( default=None, validation_alias=AliasChoices("sensitive_word_avoidance_dict", "sensitive_word_avoidance") ) - external_data_tools: JSONValue | None = Field( + external_data_tools: Any | None = Field( default=None, validation_alias=AliasChoices("external_data_tools_list", "external_data_tools") ) - model: JSONValue | None = Field(default=None, validation_alias=AliasChoices("model_dict", "model")) - user_input_form: JSONValue | None = Field( + model: Any | None = Field(default=None, validation_alias=AliasChoices("model_dict", "model")) + user_input_form: Any | None = Field( default=None, validation_alias=AliasChoices("user_input_form_list", "user_input_form") ) dataset_query_variable: str | None = None pre_prompt: str | None = None - agent_mode: JSONValue | None = Field(default=None, validation_alias=AliasChoices("agent_mode_dict", "agent_mode")) + agent_mode: Any | None = Field(default=None, validation_alias=AliasChoices("agent_mode_dict", "agent_mode")) prompt_type: str | None = None - chat_prompt_config: JSONValue | None = Field( + chat_prompt_config: Any | None = Field( default=None, validation_alias=AliasChoices("chat_prompt_config_dict", "chat_prompt_config") ) - completion_prompt_config: JSONValue | None = Field( + completion_prompt_config: Any | None = Field( default=None, validation_alias=AliasChoices("completion_prompt_config_dict", "completion_prompt_config") ) - dataset_configs: JSONValue | None = Field( + dataset_configs: Any | None = Field( default=None, validation_alias=AliasChoices("dataset_configs_dict", "dataset_configs") ) - file_upload: JSONValue | None = Field( - default=None, validation_alias=AliasChoices("file_upload_dict", "file_upload") - ) + file_upload: Any | None = Field(default=None, validation_alias=AliasChoices("file_upload_dict", "file_upload")) created_by: str | None = None created_at: int | None = None updated_by: str | None = None @@ -439,7 +434,7 @@ class AppDetail(ResponseModel): alias="model_config", ) workflow: WorkflowPartial | None = None - tracing: JSONValue | None = None + tracing: Any | None = None use_icon_as_answer_icon: bool | None = None created_by: str | None = None created_at: int | None = None @@ -485,6 +480,16 @@ class AppExportResponse(ResponseModel): data: str +class AppImportResponse(ResponseModel): + id: str + status: ImportStatus + app_id: str | None = None + app_mode: str | None = None + current_dsl_version: str + imported_dsl_version: str = "" + error: str = "" + + def _enrich_app_list_items(session: Session, *, apps: Sequence[App], tenant_id: str) -> None: if FeatureService.get_system_features().webapp_auth.enabled: app_ids = [str(app.id) for app in apps] @@ -527,7 +532,9 @@ def _enrich_app_list_items(session: Session, *, apps: Sequence[App], tenant_id: register_enum_models(console_ns, RetrievalMethod, WorkflowExecutionStatus, DatasetPermissionEnum) -register_response_schema_models(console_ns, AppTraceResponse, RedirectUrlResponse, SimpleResultResponse) +register_response_schema_models( + console_ns, RedirectUrlResponse, SimpleResultResponse, AppImportResponse, AppTraceResponse +) register_schema_models( console_ns, @@ -619,8 +626,8 @@ class AppListApi(Resource): app_service = AppService() app_pagination = app_service.get_paginate_apps(current_user_id, current_tenant_id, params, db.session) if not app_pagination: - empty = AppPagination(page=args.page, limit=args.limit, total=0, has_more=False, data=[]) - return empty.model_dump(mode="json"), 200 + response = AppPagination(page=args.page, limit=args.limit, total=0, has_more=False, data=[]) + return response.model_dump(mode="json"), 200 app_ids = [str(app.id) for app in app_pagination.items] permission_keys_map = permissions.app.permission_keys_by_resource_ids(app_ids) @@ -709,9 +716,7 @@ class StarredAppListApi(Resource): return empty.model_dump(mode="json"), 200 _enrich_app_list_items(session, apps=app_pagination.items, tenant_id=current_tenant_id) - - pagination_model = AppPagination.model_validate(app_pagination, from_attributes=True) - return pagination_model.model_dump(mode="json"), 200 + return AppPagination.model_validate(app_pagination, from_attributes=True).model_dump(mode="json"), 200 @console_ns.route("/apps//star") @@ -730,7 +735,7 @@ class AppStarApi(Resource): @get_app_model(mode=None) def post(self, session: Session, current_user_id: str, app_model: App): AppService.star_app(session, app=app_model, account_id=current_user_id) - return dump_response(SimpleResultResponse, {"result": "success"}) + return SimpleResultResponse(result="success").model_dump(mode="json") @console_ns.doc("unstar_app") @console_ns.doc(description="Remove the current account's star from an application") @@ -746,7 +751,7 @@ class AppStarApi(Resource): @get_app_model(mode=None) def delete(self, session: Session, current_user_id: str, app_model: App): AppService.unstar_app(session, app=app_model, account_id=current_user_id) - return dump_response(SimpleResultResponse, {"result": "success"}) + return SimpleResultResponse(result="success").model_dump(mode="json") @console_ns.route("/apps/") @@ -814,8 +819,7 @@ class AppApi(Resource): "max_active_requests": args.max_active_requests or 0, } app_model = app_service.update_app(app_model, args_dict) - response_model = AppDetailWithSite.model_validate(app_model, from_attributes=True) - return response_model.model_dump(mode="json") + return dump_response(AppDetailWithSite, app_model) @console_ns.doc("delete_app") @console_ns.doc(description="Delete application") @@ -843,6 +847,7 @@ class AppCopyApi(Resource): @console_ns.doc(params={"app_id": "Application ID to copy"}) @console_ns.expect(console_ns.models[CopyAppPayload.__name__]) @console_ns.response(201, "App copied successfully", console_ns.models[AppDetailWithSite.__name__]) + @console_ns.response(202, "App copy requires confirmation", console_ns.models[AppImportResponse.__name__]) @console_ns.response(403, "Insufficient permissions") @setup_required @login_required @@ -872,10 +877,10 @@ class AppCopyApi(Resource): ) if result.status == ImportStatus.FAILED: session.rollback() - return result.model_dump(mode="json"), 400 + return dump_response(AppImportResponse, result), 400 if result.status == ImportStatus.PENDING: session.rollback() - return result.model_dump(mode="json"), 202 + return dump_response(AppImportResponse, result), 202 session.commit() # Inherit web app permission from original app @@ -926,14 +931,14 @@ class AppExportApi(Resource): """Export app""" args = AppExportQuery.model_validate(request.args.to_dict(flat=True)) - payload = AppExportResponse( + response = AppExportResponse( data=AppDslService.export_dsl( app_model=app_model, include_secret=args.include_secret, workflow_id=args.workflow_id, ) ) - return payload.model_dump(mode="json") + return response.model_dump(mode="json") @console_ns.route("/apps//publish-to-creators-platform") @@ -959,7 +964,7 @@ class AppPublishToCreatorsPlatformApi(Resource): claim_code = upload_dsl(dsl_bytes) redirect_url = get_redirect_url(current_user_id, claim_code) - return {"redirect_url": redirect_url} + return RedirectUrlResponse(redirect_url=redirect_url).model_dump(mode="json") @console_ns.route("/apps//name") @@ -980,8 +985,7 @@ class AppNameApi(Resource): app_service = AppService() app_model = app_service.update_app_name(app_model, args.name) - response_model = AppDetail.model_validate(app_model, from_attributes=True) - return response_model.model_dump(mode="json") + return dump_response(AppDetail, app_model) @console_ns.route("/apps//icon") @@ -1008,8 +1012,7 @@ class AppIconApi(Resource): args.icon_background or "", args.icon_type, ) - response_model = AppDetail.model_validate(app_model, from_attributes=True) - return response_model.model_dump(mode="json") + return dump_response(AppDetail, app_model) @console_ns.route("/apps//site-enable") @@ -1031,8 +1034,7 @@ class AppSiteStatus(Resource): app_service = AppService() app_model = app_service.update_app_site_status(app_model, args.enable_site) - response_model = AppDetail.model_validate(app_model, from_attributes=True) - return response_model.model_dump(mode="json") + return dump_response(AppDetail, app_model) @console_ns.route("/apps//api-enable") @@ -1054,8 +1056,7 @@ class AppApiStatus(Resource): app_service = AppService() app_model = app_service.update_app_api_status(app_model, args.enable_api) - response_model = AppDetail.model_validate(app_model, from_attributes=True) - return response_model.model_dump(mode="json") + return dump_response(AppDetail, app_model) @console_ns.route("/apps//trace") @@ -1078,7 +1079,7 @@ class AppTraceApi(Resource): """Get app trace""" app_trace_config = OpsTraceManager.get_app_tracing_config(app_model.id, session) - return app_trace_config + return dump_response(AppTraceResponse, app_trace_config) @console_ns.doc("update_app_trace") @console_ns.doc(description="Update app tracing configuration") @@ -1106,4 +1107,4 @@ class AppTraceApi(Resource): tracing_provider=args.tracing_provider, ) - return {"result": "success"} + return SimpleResultResponse(result="success").model_dump(mode="json") diff --git a/api/controllers/console/app/mcp_server.py b/api/controllers/console/app/mcp_server.py index 6d6a56b5e1d..0cdc261ef2f 100644 --- a/api/controllers/console/app/mcp_server.py +++ b/api/controllers/console/app/mcp_server.py @@ -22,7 +22,7 @@ from controllers.console.wraps import ( ) 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.enums import AppMCPServerStatus from models.model import App, AppMCPServer @@ -92,7 +92,7 @@ class AppMCPServerController(Resource): server = db.session.scalar(select(AppMCPServer).where(AppMCPServer.app_id == app_model.id).limit(1)) if server is None: return {} - return AppMCPServerResponse.model_validate(server, from_attributes=True).model_dump(mode="json") + return dump_response(AppMCPServerResponse, server) @console_ns.doc("create_app_mcp_server") @console_ns.doc(description="Create MCP server configuration for an application") @@ -127,7 +127,7 @@ class AppMCPServerController(Resource): ) db.session.add(server) db.session.commit() - return AppMCPServerResponse.model_validate(server, from_attributes=True).model_dump(mode="json"), 201 + return dump_response(AppMCPServerResponse, server), 201 @console_ns.doc("update_app_mcp_server") @console_ns.doc(description="Update MCP server configuration for an application") @@ -165,7 +165,7 @@ class AppMCPServerController(Resource): except ValueError: raise ValueError("Invalid status") db.session.commit() - return AppMCPServerResponse.model_validate(server, from_attributes=True).model_dump(mode="json") + return dump_response(AppMCPServerResponse, server) @console_ns.route("/apps//server/refresh") @@ -192,4 +192,4 @@ class AppMCPServerRefreshController(Resource): raise NotFound() server.server_code = AppMCPServer.generate_server_code(16) db.session.commit() - return AppMCPServerResponse.model_validate(server, from_attributes=True).model_dump(mode="json") + return dump_response(AppMCPServerResponse, server) 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/controllers/console/app/site.py b/api/controllers/console/app/site.py index edc79f8fbc6..e66f66ab2d7 100644 --- a/api/controllers/console/app/site.py +++ b/api/controllers/console/app/site.py @@ -22,6 +22,7 @@ from controllers.console.wraps import ( from extensions.ext_database import db from fields.base import ResponseModel from libs.datetime_utils import naive_utc_now +from libs.helper import dump_response from libs.login import login_required from models import Site from models.account import Account @@ -124,7 +125,7 @@ class AppSite(Resource): site.updated_at = naive_utc_now() db.session.commit() - return AppSiteResponse.model_validate(site, from_attributes=True).model_dump(mode="json") + return dump_response(AppSiteResponse, site) @console_ns.route("/apps//site/access-token-reset") @@ -153,4 +154,4 @@ class AppSiteAccessTokenReset(Resource): site.updated_at = naive_utc_now() db.session.commit() - return AppSiteResponse.model_validate(site, from_attributes=True).model_dump(mode="json") + return dump_response(AppSiteResponse, site) diff --git a/api/controllers/console/app/workflow_trigger.py b/api/controllers/console/app/workflow_trigger.py index 8bd41b3e429..2f45d637256 100644 --- a/api/controllers/console/app/workflow_trigger.py +++ b/api/controllers/console/app/workflow_trigger.py @@ -12,6 +12,7 @@ from configs import dify_config from controllers.common.schema import query_params_from_model, register_schema_models 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.enums import AppTriggerStatus from models.model import App, AppMode @@ -121,7 +122,7 @@ class WebhookTriggerApi(Resource): if not webhook_trigger: raise NotFound("Webhook trigger not found for this node") - return WebhookTriggerResponse.model_validate(webhook_trigger, from_attributes=True).model_dump(mode="json") + return dump_response(WebhookTriggerResponse, webhook_trigger) @console_ns.route("/apps//triggers") @@ -160,9 +161,7 @@ class AppTriggersApi(Resource): else: trigger.icon = "" # type: ignore - return WorkflowTriggerListResponse.model_validate({"data": triggers}, from_attributes=True).model_dump( - mode="json" - ) + return dump_response(WorkflowTriggerListResponse, {"data": triggers}) @console_ns.route("/apps//trigger-enable") @@ -204,4 +203,4 @@ class AppTriggerEnableApi(Resource): else: trigger.icon = "" # type: ignore - return WorkflowTriggerResponse.model_validate(trigger, from_attributes=True).model_dump(mode="json") + return dump_response(WorkflowTriggerResponse, trigger) diff --git a/api/openapi/markdown/console-openapi.md b/api/openapi/markdown/console-openapi.md index b3a0b8a6a71..e6904175223 100644 --- a/api/openapi/markdown/console-openapi.md +++ b/api/openapi/markdown/console-openapi.md @@ -2314,6 +2314,7 @@ Create a copy of an existing application | Code | Description | Schema | | ---- | ----------- | ------ | | 201 | App copied successfully | **application/json**: [AppDetailWithSite](#appdetailwithsite)
| +| 202 | App copy requires confirmation | **application/json**: [AppImportResponse](#appimportresponse)
| | 403 | Insufficient permissions | | ### [GET] /apps/{app_id}/export @@ -12229,7 +12230,7 @@ Default namespace | role | string | | No | | site | [Site](#site) | | No | | tags | [ [Tag](#tag) ] | | No | -| tracing | [JSONValue](#jsonvalue) | | No | +| tracing | | | No | | updated_at | integer | | No | | updated_by | string | | No | | use_icon_as_answer_icon | boolean | | No | @@ -13429,7 +13430,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 | @@ -13748,7 +13748,7 @@ Enum class for api provider schema type. | name | string | | Yes | | permission_keys | [ string ] | | No | | tags | [ [Tag](#tag) ] | | No | -| tracing | [JSONValue](#jsonvalue) | | No | +| tracing | | | No | | updated_at | integer | | No | | updated_by | string | | No | | use_icon_as_answer_icon | boolean | | No | @@ -13781,7 +13781,7 @@ Enum class for api provider schema type. | permission_keys | [ string ] | | No | | site | [Site](#site) | | No | | tags | [ [Tag](#tag) ] | | No | -| tracing | [JSONValue](#jsonvalue) | | No | +| tracing | | | No | | updated_at | integer | | No | | updated_by | string | | No | | use_icon_as_answer_icon | boolean | | No | @@ -13828,6 +13828,18 @@ Enum class for api provider schema type. | yaml_content | string | | No | | yaml_url | string | | No | +#### AppImportResponse + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| app_id | string | | No | +| app_mode | string | | No | +| current_dsl_version | string | | Yes | +| error | string | | No | +| id | string | | Yes | +| imported_dsl_version | string | | No | +| status | [ImportStatus](#importstatus) | | Yes | + #### AppListQuery | Name | Type | Description | Required | @@ -13967,7 +13979,7 @@ AppMCPServer Status Enum | Name | Type | Description | Required | | ---- | ---- | ----------- | -------- | -| enabled | boolean | | Yes | +| enabled | boolean | | No | | tracing_provider | string | | No | #### AppVariableConfig @@ -14540,8 +14552,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 +17091,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 +17105,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 | @@ -17192,7 +17204,7 @@ Metadata operation data | ---- | ---- | ----------- | -------- | | created_at | integer | | No | | created_by | string | | No | -| model | [JSONValue](#jsonvalue) | | No | +| model | | | No | | pre_prompt | string | | No | | updated_at | integer | | No | | updated_by | string | | No | diff --git a/packages/contracts/generated/api/console/agent/types.gen.ts b/packages/contracts/generated/api/console/agent/types.gen.ts index 43119c4f1f4..02903f7709d 100644 --- a/packages/contracts/generated/api/console/agent/types.gen.ts +++ b/packages/contracts/generated/api/console/agent/types.gen.ts @@ -48,7 +48,7 @@ export type AgentAppDetailWithSite = { role?: string | null site?: Site | null tags?: Array - tracing?: JsonValue | null + tracing?: unknown | null updated_at?: number | null updated_by?: string | null use_icon_as_answer_icon?: boolean | null @@ -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 } @@ -436,17 +436,6 @@ export type Tag = { type: string } -export type JsonValue - = | string - | number - | number - | boolean - | { - [key: string]: unknown - } - | Array - | null - export type WorkflowPartial = { created_at?: number | null created_by?: string | null @@ -723,7 +712,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 @@ -743,8 +731,8 @@ export type ConversationAnnotation = { export type ConversationAnnotationHitHistory = { annotation_create_account?: SimpleAccount | null + annotation_id: string created_at?: number | null - id: string } export type HumanInputContent = { @@ -763,6 +751,17 @@ export type Feedback = { rating: string } +export type JsonValue + = | string + | number + | number + | boolean + | { + [key: string]: unknown + } + | Array + | null + export type MessageFile = { belongs_to?: string | null filename: string @@ -865,7 +864,7 @@ export type AgentConfigRevisionResponse = { export type ModelConfigPartial = { created_at?: number | null created_by?: string | null - model?: JsonValue | null + model?: unknown | null pre_prompt?: string | null updated_at?: number | null updated_by?: string | null @@ -1511,7 +1510,7 @@ export type AgentAppDetailWithSiteWritable = { role?: string | null site?: SiteWritable | null tags?: Array - tracing?: JsonValue | null + tracing?: unknown | null updated_at?: number | null updated_by?: string | null use_icon_as_answer_icon?: boolean | null diff --git a/packages/contracts/generated/api/console/agent/zod.gen.ts b/packages/contracts/generated/api/console/agent/zod.gen.ts index d7f5681ffc4..6232891bae1 100644 --- a/packages/contracts/generated/api/console/agent/zod.gen.ts +++ b/packages/contracts/generated/api/console/agent/zod.gen.ts @@ -218,17 +218,6 @@ export const zTag = z.object({ type: z.string(), }) -export const zJsonValue = z - .union([ - z.string(), - z.int(), - z.number(), - z.boolean(), - z.record(z.string(), z.unknown()), - z.array(z.unknown()), - ]) - .nullable() - /** * WorkflowPartial */ @@ -562,6 +551,17 @@ export const zAgentLogMessageListResponse = z.object({ total: z.int(), }) +export const zJsonValue = z + .union([ + z.string(), + z.int(), + z.number(), + z.boolean(), + z.record(z.string(), z.unknown()), + z.array(z.unknown()), + ]) + .nullable() + /** * AgentThought */ @@ -570,7 +570,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(), @@ -708,7 +707,7 @@ export const zAgentStatisticSummaryResponse = z.object({ export const zModelConfigPartial = z.object({ created_at: z.int().nullish(), created_by: z.string().nullish(), - model: zJsonValue.nullish(), + model: z.unknown().nullish(), pre_prompt: z.string().nullish(), updated_at: z.int().nullish(), updated_by: z.string().nullish(), @@ -820,7 +819,7 @@ export const zAgentAppDetailWithSite = z.object({ role: z.string().nullish(), site: zSite.nullish(), tags: z.array(zTag).optional(), - tracing: zJsonValue.nullish(), + tracing: z.unknown().nullish(), updated_at: z.int().nullish(), updated_by: z.string().nullish(), use_icon_as_answer_icon: z.boolean().nullish(), @@ -1056,8 +1055,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(), }) /** @@ -2035,6 +2034,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(), @@ -2048,12 +2048,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(), }) @@ -2162,7 +2161,7 @@ export const zAgentAppDetailWithSiteWritable = z.object({ role: z.string().nullish(), site: zSiteWritable.nullish(), tags: z.array(zTag).optional(), - tracing: zJsonValue.nullish(), + tracing: z.unknown().nullish(), updated_at: z.int().nullish(), updated_by: z.string().nullish(), use_icon_as_answer_icon: z.boolean().nullish(), diff --git a/packages/contracts/generated/api/console/apps/types.gen.ts b/packages/contracts/generated/api/console/apps/types.gen.ts index 9e79518f3cd..237e083b4e5 100644 --- a/packages/contracts/generated/api/console/apps/types.gen.ts +++ b/packages/contracts/generated/api/console/apps/types.gen.ts @@ -45,7 +45,7 @@ export type AppDetailWithSite = { permission_keys?: Array site?: Site | null tags?: Array - tracing?: JsonValue | null + tracing?: unknown | null updated_at?: number | null updated_by?: string | null use_icon_as_answer_icon?: boolean | null @@ -341,7 +341,7 @@ export type AppDetail = { name: string permission_keys?: Array tags?: Array - tracing?: JsonValue | null + tracing?: unknown | null updated_at?: number | null updated_by?: string | null use_icon_as_answer_icon?: boolean | null @@ -450,6 +450,16 @@ export type CopyAppPayload = { name?: string | null } +export type AppImportResponse = { + app_id?: string | null + app_mode?: string | null + current_dsl_version: string + error?: string + id: string + imported_dsl_version?: string + status: ImportStatus +} + export type AppExportResponse = { data: string } @@ -472,6 +482,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 +498,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 } @@ -655,7 +665,7 @@ export type TextToSpeechVoiceListResponse = Array<{ }> export type AppTraceResponse = { - enabled: boolean + enabled?: boolean tracing_provider?: string | null } @@ -1254,17 +1264,6 @@ export type Tag = { type: string } -export type JsonValue - = | string - | number - | number - | boolean - | { - [key: string]: unknown - } - | Array - | null - export type WorkflowPartial = { created_at?: number | null created_by?: string | null @@ -1302,6 +1301,17 @@ export type AdvancedChatWorkflowRunForListResponse = { version?: string | null } +export type JsonValue + = | string + | number + | number + | boolean + | { + [key: string]: unknown + } + | Array + | null + export type AgentDriveItemResponse = { created_at?: number | null file_kind: string @@ -1498,7 +1508,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 @@ -1518,8 +1527,8 @@ export type ConversationAnnotation = { export type ConversationAnnotationHitHistory = { annotation_create_account?: SimpleAccount | null + annotation_id: string created_at?: number | null - id: string } export type HumanInputContent = { @@ -1976,7 +1985,7 @@ export type WorkflowDraftVariableWithoutValue = { export type ModelConfigPartial = { created_at?: number | null created_by?: string | null - model?: JsonValue | null + model?: unknown | null pre_prompt?: string | null updated_at?: number | null updated_by?: string | null @@ -2624,7 +2633,7 @@ export type AppDetailWithSiteWritable = { permission_keys?: Array site?: SiteWritable | null tags?: Array - tracing?: JsonValue | null + tracing?: unknown | null updated_at?: number | null updated_by?: string | null use_icon_as_answer_icon?: boolean | null @@ -3923,6 +3932,7 @@ export type PostAppsByAppIdCopyErrors = { export type PostAppsByAppIdCopyResponses = { 201: AppDetailWithSite + 202: AppImportResponse } export type PostAppsByAppIdCopyResponse diff --git a/packages/contracts/generated/api/console/apps/zod.gen.ts b/packages/contracts/generated/api/console/apps/zod.gen.ts index 9b86fda0a62..af0d9dcb185 100644 --- a/packages/contracts/generated/api/console/apps/zod.gen.ts +++ b/packages/contracts/generated/api/console/apps/zod.gen.ts @@ -417,7 +417,7 @@ export const zTextToSpeechVoiceListResponse = z.array(z.record(z.string(), z.unk * AppTraceResponse */ export const zAppTraceResponse = z.object({ - enabled: z.boolean(), + enabled: z.boolean().optional().default(false), tracing_provider: z.string().nullish(), }) @@ -873,22 +873,6 @@ export const zTag = z.object({ type: z.string(), }) -export const zJsonValue = z - .union([ - z.string(), - z.int(), - z.number(), - z.boolean(), - z.record(z.string(), z.unknown()), - z.array(z.unknown()), - ]) - .nullable() - -/** - * GeneratedAppResponse - */ -export const zGeneratedAppResponse = zJsonValue - /** * WorkflowPartial */ @@ -919,6 +903,35 @@ export const zImport = z.object({ status: zImportStatus, }) +/** + * AppImportResponse + */ +export const zAppImportResponse = z.object({ + app_id: z.string().nullish(), + app_mode: z.string().nullish(), + current_dsl_version: z.string(), + error: z.string().optional().default(''), + id: z.string(), + imported_dsl_version: z.string().optional().default(''), + status: zImportStatus, +}) + +export const zJsonValue = z + .union([ + z.string(), + z.int(), + z.number(), + z.boolean(), + z.record(z.string(), z.unknown()), + z.array(z.unknown()), + ]) + .nullable() + +/** + * GeneratedAppResponse + */ +export const zGeneratedAppResponse = zJsonValue + /** * AgentDriveItemResponse */ @@ -1150,7 +1163,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(), @@ -1371,8 +1383,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(), }) /** @@ -2007,7 +2019,7 @@ export const zWorkflowDraftVariableListWithoutValue = z.object({ export const zModelConfigPartial = z.object({ created_at: z.int().nullish(), created_by: z.string().nullish(), - model: zJsonValue.nullish(), + model: z.unknown().nullish(), pre_prompt: z.string().nullish(), updated_at: z.int().nullish(), updated_by: z.string().nullish(), @@ -2100,7 +2112,7 @@ export const zAppDetailWithSite = z.object({ permission_keys: z.array(z.string()).optional(), site: zSite.nullish(), tags: z.array(zTag).optional(), - tracing: zJsonValue.nullish(), + tracing: z.unknown().nullish(), updated_at: z.int().nullish(), updated_by: z.string().nullish(), use_icon_as_answer_icon: z.boolean().nullish(), @@ -2126,7 +2138,7 @@ export const zAppDetail = z.object({ name: z.string(), permission_keys: z.array(z.string()).optional(), tags: z.array(zTag).optional(), - tracing: zJsonValue.nullish(), + tracing: z.unknown().nullish(), updated_at: z.int().nullish(), updated_by: z.string().nullish(), use_icon_as_answer_icon: z.boolean().nullish(), @@ -3455,6 +3467,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(), @@ -3468,12 +3481,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(), }) @@ -3579,7 +3591,7 @@ export const zAppDetailWithSiteWritable = z.object({ permission_keys: z.array(z.string()).optional(), site: zSiteWritable.nullish(), tags: z.array(zTag).optional(), - tracing: zJsonValue.nullish(), + tracing: z.unknown().nullish(), updated_at: z.int().nullish(), updated_by: z.string().nullish(), use_icon_as_answer_icon: z.boolean().nullish(), @@ -4396,10 +4408,7 @@ export const zPostAppsByAppIdCopyPath = z.object({ app_id: z.uuid(), }) -/** - * App copied successfully - */ -export const zPostAppsByAppIdCopyResponse = zAppDetailWithSite +export const zPostAppsByAppIdCopyResponse = z.union([zAppDetailWithSite, zAppImportResponse]) export const zGetAppsByAppIdExportPath = z.object({ app_id: z.uuid(), 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..61b1303d5b5 100644 --- a/packages/contracts/generated/api/console/installed-apps/types.gen.ts +++ b/packages/contracts/generated/api/console/installed-apps/types.gen.ts @@ -246,7 +246,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 a4556058506..53439d132c8 100644 --- a/packages/contracts/generated/api/console/installed-apps/zod.gen.ts +++ b/packages/contracts/generated/api/console/installed-apps/zod.gen.ts @@ -266,7 +266,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/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[] {