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), }) /**