From 511ca69e4ee5bce27e50710a10407de0b0165498 Mon Sep 17 00:00:00 2001
From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com>
Date: Tue, 28 Jul 2026 07:17:11 +0000
Subject: [PATCH] [autofix.ci] apply automated fixes
---
api/openapi/markdown/console-openapi.md | 730 +++++++++++++++++-
api/services/skill_management_service.py | 4 +-
api/services/tag_service.py | 4 +-
.../services/test_agent_config_service.py | 4 +-
.../generated/api/console/agent/zod.gen.ts | 8 +-
.../generated/api/console/apps/zod.gen.ts | 8 +-
.../generated/api/console/tags/types.gen.ts | 2 +-
.../generated/api/console/tags/zod.gen.ts | 2 +-
.../api/console/workspaces/types.gen.ts | 32 +-
.../api/console/workspaces/zod.gen.ts | 78 +-
10 files changed, 802 insertions(+), 70 deletions(-)
diff --git a/api/openapi/markdown/console-openapi.md b/api/openapi/markdown/console-openapi.md
index e4d46101bb3..71ce17a07b2 100644
--- a/api/openapi/markdown/console-openapi.md
+++ b/api/openapi/markdown/console-openapi.md
@@ -9551,7 +9551,7 @@ Remove one or more tag bindings from a target.
| Name | Located in | Description | Required | Schema |
| ---- | ---------- | ----------- | -------- | ------ |
| keyword | query | Search keyword | No | string |
-| type | query | Tag type filter | No | string,
**Available values:** "", "app", "knowledge", "snippet" |
+| type | query | Tag type filter | No | string |
#### Responses
@@ -10087,6 +10087,38 @@ Get list of available agent providers
| ---- | ----------- | ------ |
| 200 | Success | **application/json**: [AgentProviderListResponse](#agentproviderlistresponse)
|
+### [GET] /workspaces/current/agents/{agent_id}/skills
+#### Parameters
+
+| Name | Located in | Description | Required | Schema |
+| ---- | ---------- | ----------- | -------- | ------ |
+| agent_id | path | | Yes | string |
+
+#### Responses
+
+| Code | Description | Schema |
+| ---- | ----------- | ------ |
+| 200 | Agent Skill bindings | **application/json**: [AgentSkillBindingsResponse](#agentskillbindingsresponse)
|
+
+### [PUT] /workspaces/current/agents/{agent_id}/skills
+#### Parameters
+
+| Name | Located in | Description | Required | Schema |
+| ---- | ---------- | ----------- | -------- | ------ |
+| agent_id | path | | Yes | string |
+
+#### Request Body
+
+| Required | Schema |
+| -------- | ------ |
+| Yes | **application/json**: [AgentSkillBindingsPayload](#agentskillbindingspayload)
|
+
+#### Responses
+
+| Code | Description | Schema |
+| ---- | ----------- | ------ |
+| 200 | Agent Skill bindings replaced | **application/json**: [AgentSkillBindingsResponse](#agentskillbindingsresponse)
|
+
### [GET] /workspaces/current/customized-snippets
**List customized snippets with pagination and search**
@@ -11988,6 +12020,341 @@ Returns permission flags that control workspace features like member invitations
| ---- | ----------- | ------ |
| 200 | Success | **application/json**: [WorkspaceAccessMatrix](#workspaceaccessmatrix)
|
+### [GET] /workspaces/current/skills
+#### Parameters
+
+| Name | Located in | Description | Required | Schema |
+| ---- | ---------- | ----------- | -------- | ------ |
+| keyword | query | Search keyword matching skill name or description. | No | string |
+| limit | query | Number of items per page. | No | integer,
**Default:** 20 |
+| page | query | Page number. | No | integer,
**Default:** 1 |
+| tag | query | Skill tag filters. Repeat the parameter for multiple tags. | No | [ string ] |
+
+#### Responses
+
+| Code | Description | Schema |
+| ---- | ----------- | ------ |
+| 200 | Workspace skills | **application/json**: [SkillListResponse](#skilllistresponse)
|
+
+### [POST] /workspaces/current/skills
+#### Request Body
+
+| Required | Schema |
+| -------- | ------ |
+| Yes | **application/json**: [SkillCreatePayload](#skillcreatepayload)
|
+
+#### Responses
+
+| Code | Description | Schema |
+| ---- | ----------- | ------ |
+| 201 | Skill created | **application/json**: [SkillDetailResponse](#skilldetailresponse)
|
+
+### [POST] /workspaces/current/skills/files/upload
+#### Request Body
+
+| Required | Schema |
+| -------- | ------ |
+| Yes | **multipart/form-data**: { **"file"**: binary }
|
+
+#### Responses
+
+| Code | Description | Schema |
+| ---- | ----------- | ------ |
+| 201 | Skill draft file uploaded | **application/json**: [SkillFileUploadResponse](#skillfileuploadresponse)
|
+
+### [POST] /workspaces/current/skills/import
+Import a Skill zip package from multipart form field `file`.
+
+#### Responses
+
+| Code | Description | Schema |
+| ---- | ----------- | ------ |
+| 201 | Skill imported | **application/json**: [SkillDetailResponse](#skilldetailresponse)
|
+
+### [GET] /workspaces/current/skills/tags
+#### Responses
+
+| Code | Description | Schema |
+| ---- | ----------- | ------ |
+| 200 | Workspace Skill tags | **application/json**: [SkillTagListResponse](#skilltaglistresponse)
|
+
+### [DELETE] /workspaces/current/skills/{skill_id}
+#### Parameters
+
+| Name | Located in | Description | Required | Schema |
+| ---- | ---------- | ----------- | -------- | ------ |
+| skill_id | path | | Yes | string |
+
+#### Request Body
+
+| Required | Schema |
+| -------- | ------ |
+| Yes | **application/json**: [SkillDeletePayload](#skilldeletepayload)
|
+
+#### Responses
+
+| Code | Description | Schema |
+| ---- | ----------- | ------ |
+| 200 | Skill deleted | **application/json**: [SkillDeleteResponse](#skilldeleteresponse)
|
+
+### [GET] /workspaces/current/skills/{skill_id}
+#### Parameters
+
+| Name | Located in | Description | Required | Schema |
+| ---- | ---------- | ----------- | -------- | ------ |
+| skill_id | path | | Yes | string |
+
+#### Responses
+
+| Code | Description | Schema |
+| ---- | ----------- | ------ |
+| 200 | Skill detail | **application/json**: [SkillDetailResponse](#skilldetailresponse)
|
+
+### [PATCH] /workspaces/current/skills/{skill_id}
+#### Parameters
+
+| Name | Located in | Description | Required | Schema |
+| ---- | ---------- | ----------- | -------- | ------ |
+| skill_id | path | | Yes | string |
+
+#### Request Body
+
+| Required | Schema |
+| -------- | ------ |
+| Yes | **application/json**: [SkillMetadataPayload](#skillmetadatapayload)
|
+
+#### Responses
+
+| Code | Description | Schema |
+| ---- | ----------- | ------ |
+| 200 | Skill updated | **application/json**: [SkillResponse](#skillresponse)
|
+
+### [POST] /workspaces/current/skills/{skill_id}/assist/messages
+#### Parameters
+
+| Name | Located in | Description | Required | Schema |
+| ---- | ---------- | ----------- | -------- | ------ |
+| skill_id | path | | Yes | string |
+
+#### Request Body
+
+| Required | Schema |
+| -------- | ------ |
+| Yes | **application/json**: [SkillAssistMessagePayload](#skillassistmessagepayload)
|
+
+#### Responses
+
+| Code | Description |
+| ---- | ----------- |
+| 200 | Skill Authoring assistant event stream |
+
+### [POST] /workspaces/current/skills/{skill_id}/duplicate
+#### Parameters
+
+| Name | Located in | Description | Required | Schema |
+| ---- | ---------- | ----------- | -------- | ------ |
+| skill_id | path | | Yes | string |
+
+#### Responses
+
+| Code | Description | Schema |
+| ---- | ----------- | ------ |
+| 201 | Skill duplicated | **application/json**: [SkillDetailResponse](#skilldetailresponse)
|
+
+### [GET] /workspaces/current/skills/{skill_id}/export
+#### Parameters
+
+| Name | Located in | Description | Required | Schema |
+| ---- | ---------- | ----------- | -------- | ------ |
+| skill_id | path | | Yes | string |
+
+#### Responses
+
+| Code | Description |
+| ---- | ----------- |
+| 200 | Published Skill zip archive |
+
+### [PATCH] /workspaces/current/skills/{skill_id}/files
+#### Parameters
+
+| Name | Located in | Description | Required | Schema |
+| ---- | ---------- | ----------- | -------- | ------ |
+| skill_id | path | | Yes | string |
+
+#### Request Body
+
+| Required | Schema |
+| -------- | ------ |
+| Yes | **application/json**: [SkillDraftFileOperationPayload](#skilldraftfileoperationpayload)
|
+
+#### Responses
+
+| Code | Description | Schema |
+| ---- | ----------- | ------ |
+| 200 | Draft file operation applied | **application/json**: [SkillDetailResponse](#skilldetailresponse)
|
+
+### [PUT] /workspaces/current/skills/{skill_id}/files
+#### Parameters
+
+| Name | Located in | Description | Required | Schema |
+| ---- | ---------- | ----------- | -------- | ------ |
+| skill_id | path | | Yes | string |
+
+#### Request Body
+
+| Required | Schema |
+| -------- | ------ |
+| Yes | **application/json**: [SkillDraftTreePayload](#skilldrafttreepayload)
|
+
+#### Responses
+
+| Code | Description | Schema |
+| ---- | ----------- | ------ |
+| 200 | Draft files replaced | **application/json**: [SkillDetailResponse](#skilldetailresponse)
|
+
+### [GET] /workspaces/current/skills/{skill_id}/files/content
+#### Parameters
+
+| Name | Located in | Description | Required | Schema |
+| ---- | ---------- | ----------- | -------- | ------ |
+| download | query | Return as an attachment when 1. | No | string |
+| path | query | Skill file path relative to the Skill root. | Yes | string |
+| version_id | query | Optional published version ID. Omit for current draft. | No | string |
+| skill_id | path | | Yes | string |
+
+#### Responses
+
+| Code | Description | Schema |
+| ---- | ----------- | ------ |
+| 200 | Skill file content | **application/json**: [BinaryFileResponse](#binaryfileresponse)
|
+
+### [GET] /workspaces/current/skills/{skill_id}/files/preview
+#### Parameters
+
+| Name | Located in | Description | Required | Schema |
+| ---- | ---------- | ----------- | -------- | ------ |
+| path | query | Skill file path relative to the Skill root. | Yes | string |
+| version_id | query | Optional published version ID. Omit for current draft. | No | string |
+| skill_id | path | | Yes | string |
+
+#### Responses
+
+| Code | Description | Schema |
+| ---- | ----------- | ------ |
+| 200 | Skill file text preview | **application/json**: [SkillFilePreviewResponse](#skillfilepreviewresponse)
|
+
+### [POST] /workspaces/current/skills/{skill_id}/publish
+#### Parameters
+
+| Name | Located in | Description | Required | Schema |
+| ---- | ---------- | ----------- | -------- | ------ |
+| skill_id | path | | Yes | string |
+
+#### Request Body
+
+| Required | Schema |
+| -------- | ------ |
+| Yes | **application/json**: [SkillPublishPayload](#skillpublishpayload)
|
+
+#### Responses
+
+| Code | Description | Schema |
+| ---- | ----------- | ------ |
+| 200 | Skill published | **application/json**: [SkillVersionResponse](#skillversionresponse)
|
+
+### [GET] /workspaces/current/skills/{skill_id}/references
+#### Parameters
+
+| Name | Located in | Description | Required | Schema |
+| ---- | ---------- | ----------- | -------- | ------ |
+| skill_id | path | | Yes | string |
+
+#### Responses
+
+| Code | Description | Schema |
+| ---- | ----------- | ------ |
+| 200 | Skill references | **application/json**: [SkillReferenceListResponse](#skillreferencelistresponse)
|
+
+### [POST] /workspaces/current/skills/{skill_id}/restore
+#### Parameters
+
+| Name | Located in | Description | Required | Schema |
+| ---- | ---------- | ----------- | -------- | ------ |
+| skill_id | path | | Yes | string |
+
+#### Request Body
+
+| Required | Schema |
+| -------- | ------ |
+| Yes | **application/json**: [SkillRestorePayload](#skillrestorepayload)
|
+
+#### Responses
+
+| Code | Description | Schema |
+| ---- | ----------- | ------ |
+| 200 | Skill version restored | **application/json**: [SkillVersionResponse](#skillversionresponse)
|
+
+### [GET] /workspaces/current/skills/{skill_id}/versions
+#### Parameters
+
+| Name | Located in | Description | Required | Schema |
+| ---- | ---------- | ----------- | -------- | ------ |
+| skill_id | path | | Yes | string |
+
+#### Responses
+
+| Code | Description | Schema |
+| ---- | ----------- | ------ |
+| 200 | Skill versions | **application/json**: [SkillVersionListResponse](#skillversionlistresponse)
|
+
+### [DELETE] /workspaces/current/skills/{skill_id}/versions/{version_id}
+#### Parameters
+
+| Name | Located in | Description | Required | Schema |
+| ---- | ---------- | ----------- | -------- | ------ |
+| skill_id | path | | Yes | string |
+| version_id | path | | Yes | string |
+
+#### Responses
+
+| Code | Description | Schema |
+| ---- | ----------- | ------ |
+| 200 | Skill version deleted | **application/json**: [SkillVersionDeleteResponse](#skillversiondeleteresponse)
|
+
+### [GET] /workspaces/current/skills/{skill_id}/versions/{version_id}
+#### Parameters
+
+| Name | Located in | Description | Required | Schema |
+| ---- | ---------- | ----------- | -------- | ------ |
+| skill_id | path | | Yes | string |
+| version_id | path | | Yes | string |
+
+#### Responses
+
+| Code | Description | Schema |
+| ---- | ----------- | ------ |
+| 200 | Skill version detail | **application/json**: [SkillVersionDetailResponse](#skillversiondetailresponse)
|
+
+### [PATCH] /workspaces/current/skills/{skill_id}/versions/{version_id}
+#### Parameters
+
+| Name | Located in | Description | Required | Schema |
+| ---- | ---------- | ----------- | -------- | ------ |
+| skill_id | path | | Yes | string |
+| version_id | path | | Yes | string |
+
+#### Request Body
+
+| Required | Schema |
+| -------- | ------ |
+| Yes | **application/json**: [SkillVersionUpdatePayload](#skillversionupdatepayload)
|
+
+#### Responses
+
+| Code | Description | Schema |
+| ---- | ----------- | ------ |
+| 200 | Skill version updated | **application/json**: [SkillVersionResponse](#skillversionresponse)
|
+
### [GET] /workspaces/current/tool-labels
#### Responses
@@ -14709,6 +15076,37 @@ Visibility and lifecycle scope of an Agent record.
| ---- | ---- | ----------- | -------- |
| result | string | | Yes |
+#### AgentSkillBindingItemResponse
+
+| Name | Type | Description | Required |
+| ---- | ---- | ----------- | -------- |
+| description | string | | Yes |
+| display_name | string | | Yes |
+| file_count | integer | | Yes |
+| icon | string | | Yes |
+| id | string | | Yes |
+| latest_published_at | integer | | No |
+| latest_published_version_id | string | | No |
+| name | string | | Yes |
+| priority | integer | | Yes |
+| status | string | | Yes |
+| tags | [ string ] | | No |
+| updated_at | integer | | Yes |
+
+#### AgentSkillBindingsPayload
+
+| Name | Type | Description | Required |
+| ---- | ---- | ----------- | -------- |
+| skill_ids | [ string ] | Ordered Skill IDs bound to the Agent. | No |
+
+#### AgentSkillBindingsResponse
+
+| Name | Type | Description | Required |
+| ---- | ---- | ----------- | -------- |
+| agent_id | string | | Yes |
+| data | [ [AgentSkillBindingItemResponse](#agentskillbindingitemresponse) ] | | No |
+| skill_ids | [ string ] | | No |
+
#### AgentSkillRefConfig
| Name | Type | Description | Required |
@@ -21665,6 +22063,186 @@ Simple provider entity response.
| title | string | | Yes |
| use_icon_as_answer_icon | boolean | | Yes |
+#### SkillAssistAttachmentPayload
+
+| Name | Type | Description | Required |
+| ---- | ---- | ----------- | -------- |
+| mime_type | string | | No |
+| name | string | | Yes |
+| size | integer | | No |
+| tool_file_id | string | | Yes |
+
+#### SkillAssistMessagePayload
+
+One user message and optional uploaded context for the read-only Skill Authoring assistant.
+
+| Name | Type | Description | Required |
+| ---- | ---- | ----------- | -------- |
+| attachments | [ [SkillAssistAttachmentPayload](#skillassistattachmentpayload) ] | | No |
+| message | string | | Yes |
+| model | [SkillAssistModelPayload](#skillassistmodelpayload) | | No |
+
+#### SkillAssistModelPayload
+
+| Name | Type | Description | Required |
+| ---- | ---- | ----------- | -------- |
+| model | string | | Yes |
+| model_settings | object | | No |
+| plugin_id | string | | No |
+| provider | string | | Yes |
+
+#### SkillCreatePayload
+
+| Name | Type | Description | Required |
+| ---- | ---- | ----------- | -------- |
+| description | string | | No |
+| display_name | string | | No |
+| icon | string,
**Default:** 📄 | | No |
+| name | string | | No |
+| tags | [ string ] | | No |
+
+#### SkillDeletePayload
+
+| Name | Type | Description | Required |
+| ---- | ---- | ----------- | -------- |
+| confirmation_name | string | Required when deleting a referenced Skill. Must match the Skill name. | No |
+
+#### SkillDeleteResponse
+
+| Name | Type | Description | Required |
+| ---- | ---- | ----------- | -------- |
+| deleted | boolean | | Yes |
+| id | string | | Yes |
+
+#### SkillDetailResponse
+
+| Name | Type | Description | Required |
+| ---- | ---- | ----------- | -------- |
+| created_at | integer | | Yes |
+| created_by | string | | No |
+| created_by_name | string | | No |
+| description | string | | Yes |
+| display_name | string | | Yes |
+| files | [ [SkillFileResponse](#skillfileresponse) ] | | No |
+| icon | string | | Yes |
+| id | string | | Yes |
+| latest_published_version_id | string | | No |
+| name | string | | Yes |
+| name_manually_edited | boolean | | No |
+| reference_count | integer | | No |
+| tags | [ string ] | | No |
+| updated_at | integer | | Yes |
+| updated_by | string | | No |
+| updated_by_name | string | | No |
+| visibility | string | | Yes |
+
+#### SkillDraftFileOperation
+
+| Name | Type | Description | Required |
+| ---- | ---- | ----------- | -------- |
+| SkillDraftFileOperation | string | | |
+
+#### SkillDraftFileOperationPayload
+
+| Name | Type | Description | Required |
+| ---- | ---- | ----------- | -------- |
+| content | string | | No |
+| expected_updated_at | integer | | No |
+| hash | string | | No |
+| mime_type | string | | No |
+| operation | [SkillDraftFileOperation](#skilldraftfileoperation) | | Yes |
+| path | string | | Yes |
+| size | integer | | No |
+| target_path | string | | No |
+| tool_file_id | string | | No |
+
+#### SkillDraftTreeItemPayload
+
+| Name | Type | Description | Required |
+| ---- | ---- | ----------- | -------- |
+| content | string | | No |
+| hash | string | | No |
+| kind | [SkillFileKind](#skillfilekind) | | No |
+| mime_type | string | | No |
+| path | string | | Yes |
+| size | integer | | No |
+| storage | [SkillFileStorage](#skillfilestorage) | | No |
+| tool_file_id | string | | No |
+
+#### SkillDraftTreePayload
+
+| Name | Type | Description | Required |
+| ---- | ---- | ----------- | -------- |
+| expected_updated_at | integer | | No |
+| files | [ [SkillDraftTreeItemPayload](#skilldrafttreeitempayload) ] | | No |
+
+#### SkillFileKind
+
+Draft file entry kind.
+
+| Name | Type | Description | Required |
+| ---- | ---- | ----------- | -------- |
+| SkillFileKind | string | Draft file entry kind. | |
+
+#### SkillFilePreviewResponse
+
+| Name | Type | Description | Required |
+| ---- | ---- | ----------- | -------- |
+| content | string | | Yes |
+| hash | string | | Yes |
+| mime_type | string | | Yes |
+| path | string | | Yes |
+| size | integer | | Yes |
+
+#### SkillFileQuery
+
+| Name | Type | Description | Required |
+| ---- | ---- | ----------- | -------- |
+| path | string | Skill file path relative to the Skill root. | Yes |
+| version_id | string | Optional published version ID. Omit for current draft. | No |
+
+#### SkillFileResponse
+
+| Name | Type | Description | Required |
+| ---- | ---- | ----------- | -------- |
+| content | string | | No |
+| hash | string | | No |
+| id | string | | No |
+| kind | string | | Yes |
+| mime_type | string | | No |
+| path | string | | Yes |
+| size | integer | | No |
+| storage | string | | No |
+| tool_file_id | string | | No |
+
+#### SkillFileStorage
+
+How a draft file's content is stored.
+
+| Name | Type | Description | Required |
+| ---- | ---- | ----------- | -------- |
+| SkillFileStorage | string | How a draft file's content is stored. | |
+
+#### SkillFileUploadResponse
+
+| Name | Type | Description | Required |
+| ---- | ---- | ----------- | -------- |
+| hash | string | | Yes |
+| id | string | | Yes |
+| mime_type | string | | Yes |
+| name | string | | Yes |
+| size | integer | | Yes |
+
+#### SkillListResponse
+
+| Name | Type | Description | Required |
+| ---- | ---- | ----------- | -------- |
+| data | [ [SkillResponse](#skillresponse) ] | | No |
+| has_more | boolean | | No |
+| limit | integer,
**Default:** 20 | | No |
+| page | integer,
**Default:** 1 | | No |
+| total | integer | | No |
+
#### SkillManifest
Validated metadata extracted from a Skill package.
@@ -21678,6 +22256,91 @@ Validated metadata extracted from a Skill package.
| name | string | | Yes |
| size | integer | | Yes |
+#### SkillMetadataPayload
+
+| Name | Type | Description | Required |
+| ---- | ---- | ----------- | -------- |
+| display_name | string | | No |
+| expected_updated_at | integer | | No |
+| icon | string | | No |
+| tags | [ string ] | | No |
+
+#### SkillPublishPayload
+
+| Name | Type | Description | Required |
+| ---- | ---- | ----------- | -------- |
+| publish_note | string | | No |
+| version_name | string | | No |
+
+#### SkillReferenceListResponse
+
+| Name | Type | Description | Required |
+| ---- | ---- | ----------- | -------- |
+| data | [ [SkillReferenceResponse](#skillreferenceresponse) ] | | No |
+
+#### SkillReferenceResponse
+
+| Name | Type | Description | Required |
+| ---- | ---- | ----------- | -------- |
+| agent_icon | string | | No |
+| agent_icon_background | string | | No |
+| agent_icon_type | string | | No |
+| agent_id | string | | Yes |
+| app_id | string | | No |
+| display_name | string | | Yes |
+| name | string | | Yes |
+| node_id | string | | No |
+| node_name | string | | No |
+| type | string | | Yes |
+| workflow_icon | string | | No |
+| workflow_icon_background | string | | No |
+| workflow_icon_type | string | | No |
+| workflow_id | string | | No |
+| workflow_name | string | | No |
+| workflow_version | string | | No |
+
+#### SkillResponse
+
+| Name | Type | Description | Required |
+| ---- | ---- | ----------- | -------- |
+| created_at | integer | | Yes |
+| created_by | string | | No |
+| created_by_name | string | | No |
+| description | string | | Yes |
+| display_name | string | | Yes |
+| icon | string | | Yes |
+| id | string | | Yes |
+| latest_published_version_id | string | | No |
+| name | string | | Yes |
+| name_manually_edited | boolean | | No |
+| reference_count | integer | | No |
+| tags | [ string ] | | No |
+| updated_at | integer | | Yes |
+| updated_by | string | | No |
+| updated_by_name | string | | No |
+| visibility | string | | Yes |
+
+#### SkillRestorePayload
+
+| Name | Type | Description | Required |
+| ---- | ---- | ----------- | -------- |
+| publish_note | string | | No |
+| version_id | string | | Yes |
+| version_name | string | | No |
+
+#### SkillTagListResponse
+
+| Name | Type | Description | Required |
+| ---- | ---- | ----------- | -------- |
+| data | [ [SkillTagResponse](#skilltagresponse) ] | | No |
+
+#### SkillTagResponse
+
+| Name | Type | Description | Required |
+| ---- | ---- | ----------- | -------- |
+| count | integer | | Yes |
+| tag | string | | Yes |
+
#### SkillToolInferenceResult
| Name | Type | Description | Required |
@@ -21686,6 +22349,60 @@ Validated metadata extracted from a Skill package.
| inferable | boolean | | Yes |
| reason | string | | No |
+#### SkillVersionDeleteResponse
+
+| Name | Type | Description | Required |
+| ---- | ---- | ----------- | -------- |
+| deleted | boolean | | Yes |
+| id | string | | Yes |
+| latest_published_version_id | string | | No |
+
+#### SkillVersionDetailResponse
+
+| Name | Type | Description | Required |
+| ---- | ---- | ----------- | -------- |
+| archive_size | integer | | Yes |
+| created_at | integer | | Yes |
+| files | [ [SkillFileResponse](#skillfileresponse) ] | | No |
+| hash_code | string | | Yes |
+| id | string | | Yes |
+| is_latest | boolean | | No |
+| publish_note | string | | Yes |
+| published_by | string | | No |
+| published_by_name | string | | No |
+| skill_id | string | | Yes |
+| version_name | string | | Yes |
+| version_number | integer | | Yes |
+
+#### SkillVersionListResponse
+
+| Name | Type | Description | Required |
+| ---- | ---- | ----------- | -------- |
+| data | [ [SkillVersionResponse](#skillversionresponse) ] | | No |
+
+#### SkillVersionResponse
+
+| Name | Type | Description | Required |
+| ---- | ---- | ----------- | -------- |
+| archive_size | integer | | Yes |
+| created_at | integer | | Yes |
+| hash_code | string | | Yes |
+| id | string | | Yes |
+| is_latest | boolean | | No |
+| publish_note | string | | Yes |
+| published_by | string | | No |
+| published_by_name | string | | No |
+| skill_id | string | | Yes |
+| version_name | string | | Yes |
+| version_number | integer | | Yes |
+
+#### SkillVersionUpdatePayload
+
+| Name | Type | Description | Required |
+| ---- | ---- | ----------- | -------- |
+| publish_note | string | | No |
+| version_name | string | | No |
+
#### SnippetDependencyCheckResponse
| Name | Type | Description | Required |
@@ -22153,7 +22870,7 @@ Non-sensitive bootstrap snapshot exposed before Console or Web authentication.
| Name | Type | Description | Required |
| ---- | ---- | ----------- | -------- |
| keyword | string | Search keyword | No |
-| type | string,
**Available values:** "", "app", "knowledge", "snippet" | Tag type filter
*Enum:* `""`, `"app"`, `"knowledge"`, `"snippet"` | No |
+| type | [TagType](#tagtype)
string | Tag type filter | No |
#### TagListResponse
@@ -24339,6 +25056,15 @@ Workflow tool configuration
| ---- | ---- | ----------- | -------- |
| permission_keys | [ string ] | | No |
+#### WorkspaceSkillsQuery
+
+| Name | Type | Description | Required |
+| ---- | ---- | ----------- | -------- |
+| keyword | string | Search keyword matching skill name or description. | No |
+| limit | integer,
**Default:** 20 | Number of items per page. | No |
+| page | integer,
**Default:** 1 | Page number. | No |
+| tag | [ string ] | Skill tag filters. Repeat the parameter for multiple tags. | No |
+
#### WorkspaceTenantResultResponse
| Name | Type | Description | Required |
diff --git a/api/services/skill_management_service.py b/api/services/skill_management_service.py
index f2a57b88afe..e978168b155 100644
--- a/api/services/skill_management_service.py
+++ b/api/services/skill_management_service.py
@@ -1337,8 +1337,8 @@ class SkillManagementService:
AgentSkillBinding.tenant_id == tenant_id,
AgentSkillBinding.skill_id == skill.id,
).delete(synchronize_session=False)
- session.query(SkillVersion).filter(SkillVersion.skill_id == skill.id).delete(synchronize_session=False)
- session.query(SkillDraftFile).filter(SkillDraftFile.skill_id == skill.id).delete(synchronize_session=False)
+ session.query(SkillVersion).where(SkillVersion.skill_id == skill.id).delete(synchronize_session=False)
+ session.query(SkillDraftFile).where(SkillDraftFile.skill_id == skill.id).delete(synchronize_session=False)
session.query(TagBinding).filter(
TagBinding.tenant_id == tenant_id,
TagBinding.target_id == skill.id,
diff --git a/api/services/tag_service.py b/api/services/tag_service.py
index 8ec560ed449..fbcb1969952 100644
--- a/api/services/tag_service.py
+++ b/api/services/tag_service.py
@@ -285,9 +285,7 @@ class TagService:
raise NotFound("Snippet not found")
elif type == "skill":
skill = session.scalar(
- select(Skill)
- .where(Skill.tenant_id == current_user.current_tenant_id, Skill.id == target_id)
- .limit(1)
+ select(Skill).where(Skill.tenant_id == current_user.current_tenant_id, Skill.id == target_id).limit(1)
)
if not skill:
raise NotFound("Skill not found")
diff --git a/api/tests/unit_tests/services/test_agent_config_service.py b/api/tests/unit_tests/services/test_agent_config_service.py
index 60519f4c279..ccc90b73d4d 100644
--- a/api/tests/unit_tests/services/test_agent_config_service.py
+++ b/api/tests/unit_tests/services/test_agent_config_service.py
@@ -616,9 +616,7 @@ def test_manifest_appends_published_workspace_skills() -> None:
kind=AgentConfigVersionKind.DRAFT,
writable=False,
soul=_soul(
- config_skills=[
- AgentConfigSkillRefConfig(name="alpha", description="Alpha skill", file_id="tool-file-1")
- ]
+ config_skills=[AgentConfigSkillRefConfig(name="alpha", description="Alpha skill", file_id="tool-file-1")]
),
)
diff --git a/packages/contracts/generated/api/console/agent/zod.gen.ts b/packages/contracts/generated/api/console/agent/zod.gen.ts
index dfa6917bfb7..6859d70501b 100644
--- a/packages/contracts/generated/api/console/agent/zod.gen.ts
+++ b/packages/contracts/generated/api/console/agent/zod.gen.ts
@@ -997,11 +997,15 @@ export const zSandboxListResponse = z.object({
* Validated metadata extracted from a Skill package.
*/
export const zSkillManifest = z.object({
- description: z.string(),
+ description: z.string().min(1).max(1024),
entry_path: z.string(),
files: z.array(z.string()),
hash: z.string(),
- name: z.string(),
+ name: z
+ .string()
+ .min(1)
+ .max(64)
+ .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),
size: z.int(),
})
diff --git a/packages/contracts/generated/api/console/apps/zod.gen.ts b/packages/contracts/generated/api/console/apps/zod.gen.ts
index 534a11ff431..098e9dcde52 100644
--- a/packages/contracts/generated/api/console/apps/zod.gen.ts
+++ b/packages/contracts/generated/api/console/apps/zod.gen.ts
@@ -1373,11 +1373,15 @@ export const zAgentLogMetaResponse = z.object({
* Validated metadata extracted from a Skill package.
*/
export const zSkillManifest = z.object({
- description: z.string(),
+ description: z.string().min(1).max(1024),
entry_path: z.string(),
files: z.array(z.string()),
hash: z.string(),
- name: z.string(),
+ name: z
+ .string()
+ .min(1)
+ .max(64)
+ .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),
size: z.int(),
})
diff --git a/packages/contracts/generated/api/console/tags/types.gen.ts b/packages/contracts/generated/api/console/tags/types.gen.ts
index c5a4131eeb6..e9320c071e9 100644
--- a/packages/contracts/generated/api/console/tags/types.gen.ts
+++ b/packages/contracts/generated/api/console/tags/types.gen.ts
@@ -29,7 +29,7 @@ export type GetTagsData = {
path?: never
query?: {
keyword?: string
- type?: '' | 'app' | 'knowledge' | 'skill' | 'snippet'
+ type?: string
}
url: '/tags'
}
diff --git a/packages/contracts/generated/api/console/tags/zod.gen.ts b/packages/contracts/generated/api/console/tags/zod.gen.ts
index 60221239e3f..2842f594c95 100644
--- a/packages/contracts/generated/api/console/tags/zod.gen.ts
+++ b/packages/contracts/generated/api/console/tags/zod.gen.ts
@@ -41,7 +41,7 @@ export const zTagBasePayload = z.object({
export const zGetTagsQuery = z.object({
keyword: z.string().optional(),
- type: z.enum(['', 'app', 'knowledge', 'skill', 'snippet']).optional().default(''),
+ type: z.string().optional().default(''),
})
/**
diff --git a/packages/contracts/generated/api/console/workspaces/types.gen.ts b/packages/contracts/generated/api/console/workspaces/types.gen.ts
index b8d8e148e6f..d535c45aeea 100644
--- a/packages/contracts/generated/api/console/workspaces/types.gen.ts
+++ b/packages/contracts/generated/api/console/workspaces/types.gen.ts
@@ -728,20 +728,6 @@ export type SkillResponse = {
visibility: string
}
-export type SkillAssistModelPayload = {
- model: string
- model_settings?: { [key: string]: unknown } | null
- plugin_id?: string | null
- provider: string
-}
-
-export type SkillAssistAttachmentPayload = {
- mime_type?: string | null
- name: string
- size?: number | null
- tool_file_id: string
-}
-
export type SkillAssistMessagePayload = {
attachments?: Array
message: string
@@ -1731,6 +1717,22 @@ export type SkillTagResponse = {
tag: string
}
+export type SkillAssistAttachmentPayload = {
+ mime_type?: string | null
+ name: string
+ size?: number | null
+ tool_file_id: string
+}
+
+export type SkillAssistModelPayload = {
+ model: string
+ model_settings?: {
+ [key: string]: unknown
+ } | null
+ plugin_id?: string | null
+ provider: string
+}
+
export type SkillDraftFileOperation =
| 'delete'
| 'mkdir'
@@ -1750,10 +1752,10 @@ export type SkillDraftTreeItemPayload = {
}
export type SkillReferenceResponse = {
- agent_id: string
agent_icon?: string | null
agent_icon_background?: string | null
agent_icon_type?: string | null
+ agent_id: string
app_id?: string | null
display_name: string
name: string
diff --git a/packages/contracts/generated/api/console/workspaces/zod.gen.ts b/packages/contracts/generated/api/console/workspaces/zod.gen.ts
index ad7bcb669cd..1ffbab2f2c3 100644
--- a/packages/contracts/generated/api/console/workspaces/zod.gen.ts
+++ b/packages/contracts/generated/api/console/workspaces/zod.gen.ts
@@ -517,41 +517,10 @@ export const zSkillResponse = z.object({
*/
export const zSkillListResponse = z.object({
data: z.array(zSkillResponse).optional(),
- has_more: z.boolean().optional(),
- limit: z.number().optional(),
- page: z.number().optional(),
- total: z.number().optional(),
-})
-
-/**
- * SkillAssistModelPayload
- */
-export const zSkillAssistModelPayload = z.object({
- model: z.string().min(1).max(255),
- model_settings: z.record(z.string(), z.unknown()).nullable().optional(),
- plugin_id: z.string().min(1).max(255).nullable().optional(),
- provider: z.string().min(1).max(255),
-})
-
-/**
- * SkillAssistAttachmentPayload
- */
-export const zSkillAssistAttachmentPayload = z.object({
- mime_type: z.string().min(1).max(255).nullable().optional(),
- name: z.string().min(1).max(255),
- size: z.number().gte(0).nullable().optional(),
- tool_file_id: z.string().min(1),
-})
-
-/**
- * SkillAssistMessagePayload
- *
- * One user message and optional uploaded context for the read-only Skill Authoring assistant.
- */
-export const zSkillAssistMessagePayload = z.object({
- attachments: z.array(zSkillAssistAttachmentPayload).max(10).optional(),
- message: z.string().min(1).max(8000),
- model: zSkillAssistModelPayload.nullable().optional(),
+ has_more: z.boolean().optional().default(false),
+ limit: z.int().optional().default(20),
+ page: z.int().optional().default(1),
+ total: z.int().optional().default(0),
})
/**
@@ -1529,6 +1498,37 @@ export const zSkillTagListResponse = z.object({
data: z.array(zSkillTagResponse).optional(),
})
+/**
+ * SkillAssistAttachmentPayload
+ */
+export const zSkillAssistAttachmentPayload = z.object({
+ mime_type: z.string().min(1).max(255).nullish(),
+ name: z.string().min(1).max(255),
+ size: z.int().gte(0).nullish(),
+ tool_file_id: z.string().min(1),
+})
+
+/**
+ * SkillAssistModelPayload
+ */
+export const zSkillAssistModelPayload = z.object({
+ model: z.string().min(1).max(255),
+ model_settings: z.record(z.string(), z.unknown()).nullish(),
+ plugin_id: z.string().min(1).max(255).nullish(),
+ provider: z.string().min(1).max(255),
+})
+
+/**
+ * SkillAssistMessagePayload
+ *
+ * One user message and optional uploaded context for the read-only Skill Authoring assistant.
+ */
+export const zSkillAssistMessagePayload = z.object({
+ attachments: z.array(zSkillAssistAttachmentPayload).max(10).optional(),
+ message: z.string().min(1).max(8000),
+ model: zSkillAssistModelPayload.nullish(),
+})
+
/**
* SkillDraftFileOperation
*/
@@ -1559,10 +1559,10 @@ export const zSkillDraftFileOperationPayload = z.object({
* SkillReferenceResponse
*/
export const zSkillReferenceResponse = z.object({
- agent_id: z.string(),
agent_icon: z.string().nullish(),
agent_icon_background: z.string().nullish(),
agent_icon_type: z.string().nullish(),
+ agent_id: z.string(),
app_id: z.string().nullish(),
display_name: z.string(),
name: z.string(),
@@ -5092,8 +5092,8 @@ export const zGetWorkspacesCurrentRbacWorkspaceDatasetsAccessPolicyResponse = zW
export const zGetWorkspacesCurrentSkillsQuery = z.object({
keyword: z.string().optional(),
- limit: z.number().optional(),
- page: z.number().optional(),
+ limit: z.int().gte(1).lte(100).optional().default(20),
+ page: z.int().gte(1).lte(99999).optional().default(1),
tag: z.array(z.string()).optional(),
})
@@ -5110,7 +5110,7 @@ export const zPostWorkspacesCurrentSkillsBody = zSkillCreatePayload
export const zPostWorkspacesCurrentSkillsResponse = zSkillDetailResponse
export const zPostWorkspacesCurrentSkillsFilesUploadBody = z.object({
- file: z.custom(),
+ file: z.custom((value) => value instanceof Blob || value instanceof File),
})
/**