Skip to content

Commit 6858982

Browse files
Lifeng-ChenYehongPanZzzxxxxyDallas98JasonW404
authored
✨ Feature: add agent repository page and APIs (#3289)
* Release/v2.2.1 (#3269) * add_greeting_fields_to_agent-develop * feat(knowledge-base): add preserve_source_file and post-index source cleanup Let knowledge bases opt out of keeping uploaded MinIO copies after indexing while retaining Elasticsearch chunks for retrieval. Default behavior remains preserve_source_file=true for backward compatibility. - Add preserve_source_file column (init.sql + v2.2.0_0601 migration) - Accept preserve_source_file on create/update and northbound/vector APIs - Support document DELETE scope=source_only and source_available in listings - Run cleanup_source Celery task when preserve_source_file is false - UI: create-KB toggle, list tag, knowledge-base preview when copy is missing - Update vector-database SDK docs and backend tests * test(data_process): stub knowledge_db, redis_service, and redis in test_worker Align setup_mocks_for_worker with test_tasks so importing backend.data_process.worker loads package __init__ without real DB/redis deps. * test(data_process): shim cleanup_source for submit_process_forward_chain tests * remove duplicate import * fix: update unit tests for greeting_message and example_questions fields * add init.sql to sonar.properites * ♻️ Improvement: API to MCP conversion service supports configuring headers. (#3194) * ♻️ Improvement: API to MCP conversion service supports configuring headers. [Specification Details] 1. Front-end and back-end modifications * ♻️ Improvement: API to MCP conversion service supports configuring headers. [Specification Details] 1. Modify the frontend, after adding, set the HTTP headers to empty. 2. Modify test cases. * ♻️ Improvement: Enhance processing of ES index names in memory banks. (#3196) [Specification Details] 1. Replace all symbols in the index name that do not meet the rules with "_". 2. Modify test cases. * feat: add active memory tools (StoreMemoryTool, SearchMemoryTool) (#3197) - Implement StoreMemoryTool for explicit memory storage during agent reasoning - Implement SearchMemoryTool for on-demand memory retrieval during conversations - Integrate tools into agent creation flow (create_agent_info.py) - Register tools in nexent_agent.py and tools/__init__.py - Add MEMORY_OPERATION tool sign for proper categorization - Fix memory_core.py cache key to include event loop ID (prevents cross-loop conflicts) - Add comprehensive test coverage for both tools - Add procedural memory verification documentation Tools follow existing patterns: lazy imports, observer integration, error handling, and respect user memory preferences (agent_share_option, disabled_agent_ids). Co-authored-by: Dallas98 <40557804+Dallas98@users.noreply.github.com> * 🐛 Bugfix: skill names and descriptions never load to context (#3205) * 🐛 Bugfix: skill names and descriptions never load to context * 🐛 Bugfix: skill names and descriptions never load to context * 🐛 Bugfix: skill names and descriptions never load to context * 🐛 Bugfix: official skills not copied to target directory * 🐛 Bugfix: official skills not copied to target directory * Feat: add selected count badges to tool/skill pool labels (#3206) Co-authored-by: chase <byzhangxin11@126.com> * 🐛 Bugfix: Fix attribution error when tool calling error (#3208) * ✨ Feat: Add support for Word document generation, preview, and download (#3191) * Feat: Add support for Word document generation, preview, and download * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Restrict uploads to a known safe workspace/output directory * 修改单元测试 * 修复单元测试 * Bugfix: Store uploaded files in Minio for conversation messages to enable file visibility in history --------- Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * ✨Feat:Enhance prompt optimization by integrating openjiuwen and fix related bugs (#3190) * ✨Feat:add prompt optimization * 🐛Bugfix: dockerbuild failed when running pipefail in python3_11 * 🔨Optimize: Optimize prompt optimization display page and interaction methods * 🐛Bugfix: fix dependencies replication * 🎨:Optimize frontend prompts and loading interface * 🔧 Refactor: Update imports and remove redundant ENABLE_JIUWEN_SDK import in prompt_service.py * 🔧 Refactor: Correct import path for NexentCapabilityError and enhance test coverage for prompt optimization service * 🔧 Refactor: Update import paths for exception handling and improve logging formatting in prompt_service.py * 🔧 Refactor: Simplify lazy imports in jiuwen_sdk_adapter.py and update import paths in prompt_service.py * 🔧 Refactor: Enhance Jiuwen SDK adapter handling and improve test stubs in prompt_service.py and related test files * 🧪test:Pydantic model for PromptTemplateRequest in test_prompt_template_app.py * 🔧 Refactor: Remove unnecessary dependency exclusions from pyproject.toml * 🔧 Update: Upgrade huggingface_hub dependency version in pyproject.toml * 🔧 Update: Exclude unnecessary transitive dependencies and adjust huggingface_hub version in pyproject.toml * 🔧 Test: Add mock modules for unstructured inference and set up package paths in test files * 🔧 Test: Enhance test setup by adding optional SDK mocks and cleaning up module imports in data processing tests * 🔧 Test: Consolidate mock module setup for unstructured inference across multiple test files * 🔧 Test: Remove unused optional SDK mocks from test configuration * 🔧 Refactor: Clean up imports and enhance dynamic loading of fastmcp components in Docker client * 📦update:sdk dependence update * Add CAS SSO integration and improve logout handling (#3072) * feat: add CAS SSO integration * Skip CAS logout when CAS_LOGOUT_URL is unset * 取消转义 * Improve CAS logout handling and confirm user logout * Disable account deletion for CAS users * Add CAS session init SQL and k8s config * clean code * Remove agent guardrails design doc from tracking * 补充文档 --------- Co-authored-by: hhhhsc <name> * 🐛Bugfix: Remove unnecessary dependency exclusions and upgrade huggingface_hub version in pyproject.toml (#3211) * refactor: move current time from system prompt to user message for prompt cache stability (#3203) Remove {{time}} from all 4 prompt YAML templates (manager/managed × en/zh) and strip time_str from the context_utils pipeline (_format_app_context, build_skeleton_header_component, build_context_components, build_app_context_string). Also remove time from create_agent_info render kwargs and build_context_components call. In CoreAgent.run, prepend [Current time: ...] to self.task so the timestamp travels with the user message instead of being baked into the system prompt. This makes the rendered system prompt fully deterministic per (agent_id, tenant_id, version_no, language) — enabling prompt/KV cache hits across requests for the same agent config. Sync test_context_utils.py: drop time_str= from 3 test cases. Remove unused datetime imports from context_utils.py and create_agent_info.py. * 🐛 Bugfix: Fixed the issue of being unable to add MCP services via containerization. (#3213) [Specification Details] 1. Modify the DEFAULT_NETWORK_NAME when starting the MCP service in the container to match the name in docker-compose. 2. Modify the parameters passed to the add_mcp_service method; custom_headers defaults to None. * 🐛 Bugfix: Fixed the issue where uploaded text files could not be parsed during a session. (#3219) * 🐛 Bugfix: Fixed the issue where uploaded text files could not be parsed during a session. [Specification Details] 1. The return parameter of the file_process method has changed and needs to be unpacked. * 🐛 Bugfix: Fixed the issue where uploaded text files could not be parsed during a session. [Specification Details] 1. Modify test case. * 🐛 Bugfix: Fixed an issue where the MCP service could not be added correctly after updating the FastMCP version. (#3222) [Specification Details] 1. Add `kwargs` to the `create_httpx_client` function to accept all additional parameters. * 🐛 Bugfix: Fix incomplete display of tenant resources page after window resize (#3215) * Move non-shadcn ui component to other folder * Bugfix: Fix incomplete display of tenant resources page after window resize * Bugfix: Fix incomplete display of tenant resources page after window resize * Add agent marketplace repository and version pinning for sub-agents (#3239) * feat: add agent marketplace repository and pin sub-agent versions at publish Introduce ag_agent_repository_t with list/status/publish/import APIs for frozen agent snapshots. Pin selected_agent_version_no on agent relations when publishing so sub-agents resolve to a fixed version at runtime. Extend agent export/import to bundle skills in ZIP payloads and add embedding model fallback when no model name is provided. * feat: add agent marketplace repository and pin sub-agent versions at publish Introduce ag_agent_repository_t with list/status/publish/import APIs for frozen agent snapshots. Pin selected_agent_version_no on agent relations when publishing so sub-agents resolve to a fixed version at runtime. Extend agent export/import to bundle skills in ZIP payloads and add embedding model fallback when no model name is provided. * feat: add agent marketplace repository and pin sub-agent versions at publish Introduce ag_agent_repository_t with list/status/publish/import APIs for frozen agent snapshots. Pin selected_agent_version_no on agent relations when publishing so sub-agents resolve to a fixed version at runtime. Extend agent export/import to bundle skills in ZIP payloads and add embedding model fallback when no model name is provided. * feat: add agent marketplace repository and pin sub-agent versions at publish Introduce ag_agent_repository_t with list/status/publish/import APIs for frozen agent snapshots. Pin selected_agent_version_no on agent relations when publishing so sub-agents resolve to a fixed version at runtime. Extend agent export/import to bundle skills in ZIP payloads and add embedding model fallback when no model name is provided. * feat(agent): add verification configuration for agents and update related components (#3174) * feat(agent): add verification configuration for agents and update related components * feat(model): update model type labels and add monitoring dashboard translations * 🐛 Bugfix: Fix inability to select agent from agent space to edit (#3240) * Move non-shadcn ui component to other folder * Bugfix: Fix incomplete display of tenant resources page after window resize * Bugfix: Fix incomplete display of tenant resources page after window resize * Bugfix: Fix inability to select agent from agent space to edit * Bugfix: Display correct version info when viewing agent details * Update data agent and ME CAS integration documentation (#3242) * 补充dataagent对接文档 * 补充ME cas对接文档 * 补充ME cas对接文档 --------- Co-authored-by: hhhhsc <name> * ✨ Add several northbound apis (#3223) * ✨ Add several northbound apis * ✨ Add several northbound apis * ✨ Add several northbound apis * ✨ Add several northbound apis * ✨ Add several northbound apis * refactor: simplify deployment script by removing unused variables and functions (#3245) * feat(agent): add verification configuration for agents and update related components * feat(model): update model type labels and add monitoring dashboard translations * refactor(build_offline_package): simplify deployment script by removing unused variables and functions * 🐛 Bugfix: Adjust agent detail UI layout to accommodate newly added "self-verification" field (#3246) * Move non-shadcn ui component to other folder * Bugfix: Fix incomplete display of tenant resources page after window resize * Bugfix: Fix incomplete display of tenant resources page after window resize * Bugfix: Fix inability to select agent from agent space to edit * Bugfix: Display correct version info when viewing agent details * Bugfix: Adjust agent detail UI layout to accommodate newly added "self-verification" field * 补充sql (#3248) * 补充sql * 扩大limit限制 * 🐛 Bugfix: Fixed an issue where the MCP service failed to start in a Kubernetes container. (#3254) [Specification Details] 1. Modify the pod naming logic to convert all non-compliant characters to -. 2. Modify test cases. * 🐛 Bugfix: knowledge_base_search_tool called with TypeError: argument of type 'FieldInfo' is not iterable (#3259) * 🐛 Bugfix: Fixed an issue where the one-click rename function failed after importing an agent. (#3258) [Specification Details] 1. The frontend does not pass `agent_id` when calling the `regenerate_name` API. * Bugfix: Exclude attachments from assistant when saving conversation history (#3261) * Bump APP_VERSION from v2.2.0 to v2.2.1 (#3268) The default setting for client-side self-validation is "False". --------- Co-authored-by: chase <byzhangxin11@126.com> Co-authored-by: Chenlifeng <174292121+Lifeng-Chen@users.noreply.github.com> Co-authored-by: Dallas98 <40557804+Dallas98@users.noreply.github.com> Co-authored-by: Jason Wang <56037774+JasonW404@users.noreply.github.com> Co-authored-by: Xia Yichen <iamjasonxia@126.com> Co-authored-by: JeffWu <45140512+jeffwu-1999@users.noreply.github.com> Co-authored-by: WMC001 <46217886+WMC001@users.noreply.github.com> Co-authored-by: xuyaqi <xuyaqist@gmail.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Co-authored-by: DongJiBao2001 <120021235+DongJiBao2001@users.noreply.github.com> Co-authored-by: hhhhsc701 <56435672+hhhhsc701@users.noreply.github.com> Co-authored-by: Dallas98 <990259227@qq.com> Co-authored-by: frr <64584192+wuyuanfr@users.noreply.github.com> * Revert "Release/v2.2.1 (#3269)" (#3272) This reverts commit 9ff420e. * ✨ Feature: add agent repository page and APIs Introduce Agent Repository backend APIs, database/service support, frontend views, client services, and tests. Migrate Agent Space navigation and permissions to /agent-repository with updated SQL and localization. * ✨ Feature: add agent repository page and APIs Introduce Agent Repository backend APIs, database/service support, frontend views, client services, and tests. Migrate Agent Space navigation and permissions to /agent-repository with updated SQL and localization. * ✨ Feature: add agent repository page and APIs Introduce Agent Repository backend APIs, database/service support, frontend views, client services, and tests. Migrate Agent Space navigation and permissions to /agent-repository with updated SQL and localization. * ✨ Feature: add agent repository page and APIs Introduce Agent Repository backend APIs, database/service support, frontend views, client services, and tests. Migrate Agent Space navigation and permissions to /agent-repository with updated SQL and localization. * ✨ Feature: add agent repository page and APIs Introduce Agent Repository backend APIs, database/service support, frontend views, client services, and tests. Migrate Agent Space navigation and permissions to /agent-repository with updated SQL and localization. --------- Co-authored-by: panyehong <91180085+YehongPan@users.noreply.github.com> Co-authored-by: chase <byzhangxin11@126.com> Co-authored-by: Dallas98 <40557804+Dallas98@users.noreply.github.com> Co-authored-by: Jason Wang <56037774+JasonW404@users.noreply.github.com> Co-authored-by: Xia Yichen <iamjasonxia@126.com> Co-authored-by: JeffWu <45140512+jeffwu-1999@users.noreply.github.com> Co-authored-by: WMC001 <46217886+WMC001@users.noreply.github.com> Co-authored-by: xuyaqi <xuyaqist@gmail.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Co-authored-by: DongJiBao2001 <120021235+DongJiBao2001@users.noreply.github.com> Co-authored-by: hhhhsc701 <56435672+hhhhsc701@users.noreply.github.com> Co-authored-by: Dallas98 <990259227@qq.com> Co-authored-by: frr <64584192+wuyuanfr@users.noreply.github.com>
1 parent 9d4405a commit 6858982

30 files changed

Lines changed: 5735 additions & 1165 deletions

backend/apps/agent_repository_app.py

Lines changed: 75 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,100 @@
1-
import logging
21
from http import HTTPStatus
32
from typing import Optional
43

54
from fastapi import APIRouter, Body, Header, HTTPException, Query
65
from starlette.responses import JSONResponse
76

87
from consts.exceptions import SkillDuplicateError, UnauthorizedError
8+
from consts.model import AgentRepositoryListingCreateRequest
99
from services.agent_repository_service import (
1010
create_agent_repository_listing_impl,
11+
get_agent_repository_listing_detail_impl,
1112
import_agent_from_repository_impl,
1213
list_agent_repository_listings_impl,
14+
list_my_editable_agents_impl,
1315
update_agent_repository_status_impl,
1416
)
1517
from utils.auth_utils import get_current_user_id
1618

1719
agent_repository_router = APIRouter(prefix="/repository/agent")
18-
logger = logging.getLogger("agent_repository_app")
1920

2021

2122
@agent_repository_router.get("")
2223
async def list_agent_repository_listings_api(
2324
status: Optional[str] = Query(None, description="Filter by listing status"),
25+
agent_id: Optional[int] = Query(None, description="Filter by source agent ID"),
26+
deduplicate_by_agent_id: Optional[bool] = Query(
27+
None,
28+
description="Whether to return one listing per agent",
29+
),
30+
category_id: Optional[int] = Query(
31+
None,
32+
description="Filter by marketplace category ID",
33+
),
2434
authorization: str = Header(None),
2535
):
2636
"""List all marketplace repository listings with optional status filter."""
2737
try:
28-
get_current_user_id(authorization)
29-
result = list_agent_repository_listings_impl(status=status)
38+
_, tenant_id = get_current_user_id(authorization)
39+
should_deduplicate = (
40+
agent_id is None
41+
if deduplicate_by_agent_id is None
42+
else deduplicate_by_agent_id
43+
)
44+
result = list_agent_repository_listings_impl(
45+
tenant_id,
46+
status=status,
47+
agent_id=agent_id,
48+
deduplicate_by_agent_id=should_deduplicate,
49+
category_id=category_id,
50+
)
3051
return JSONResponse(status_code=HTTPStatus.OK, content=result)
3152
except UnauthorizedError as e:
3253
raise HTTPException(status_code=HTTPStatus.UNAUTHORIZED, detail=str(e))
3354
except ValueError as e:
3455
raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail=str(e))
35-
except Exception as e:
36-
logger.error(f"List agent repository listings error: {str(e)}")
37-
raise HTTPException(
38-
status_code=HTTPStatus.INTERNAL_SERVER_ERROR,
39-
detail="List agent repository listings error.",
56+
57+
58+
@agent_repository_router.get("/mine")
59+
async def list_my_editable_agents_api(
60+
ownership: Optional[str] = Query(
61+
"all",
62+
description="Filter by ownership: all / created / others",
63+
),
64+
authorization: str = Header(None),
65+
):
66+
"""List editable draft agents for the current user with repository listing info."""
67+
try:
68+
user_id, tenant_id = get_current_user_id(authorization)
69+
result = list_my_editable_agents_impl(
70+
tenant_id=tenant_id,
71+
user_id=user_id,
72+
ownership=ownership or "all",
73+
)
74+
return JSONResponse(status_code=HTTPStatus.OK, content=result)
75+
except UnauthorizedError as e:
76+
raise HTTPException(status_code=HTTPStatus.UNAUTHORIZED, detail=str(e))
77+
except ValueError as e:
78+
raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail=str(e))
79+
80+
81+
@agent_repository_router.get("/{agent_repository_id}")
82+
async def get_agent_repository_listing_detail_api(
83+
agent_repository_id: int,
84+
authorization: str = Header(None),
85+
):
86+
"""Get detailed marketplace repository listing by primary key."""
87+
try:
88+
_, tenant_id = get_current_user_id(authorization)
89+
result = get_agent_repository_listing_detail_impl(
90+
agent_repository_id,
91+
tenant_id,
4092
)
93+
return JSONResponse(status_code=HTTPStatus.OK, content=result)
94+
except UnauthorizedError as e:
95+
raise HTTPException(status_code=HTTPStatus.UNAUTHORIZED, detail=str(e))
96+
except ValueError as e:
97+
raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail=str(e))
4198

4299

43100
@agent_repository_router.patch("/{agent_repository_id}/status")
@@ -47,59 +104,51 @@ async def update_agent_repository_status_api(
47104
...,
48105
embed=True,
49106
description=(
50-
"New status: NOT_SHARED (未共享) / PENDING_REVIEW (待审核) / "
51-
"REJECTED (审核驳回) / SHARED (已共享)"
107+
"New status: not_shared (未共享) / pending_review (待审核) / "
108+
"rejected (审核驳回) / shared (已共享)"
52109
),
53110
),
54111
authorization: str = Header(None),
55112
):
56113
"""Update marketplace repository listing status (share, unshare, approve, reject)."""
57114
try:
58-
user_id, _ = get_current_user_id(authorization)
115+
user_id, tenant_id = get_current_user_id(authorization)
59116
result = update_agent_repository_status_impl(
60117
agent_repository_id=agent_repository_id,
61118
status=status,
62119
user_id=user_id,
120+
tenant_id=tenant_id,
63121
)
64122
return JSONResponse(status_code=HTTPStatus.OK, content=result)
65123
except UnauthorizedError as e:
66124
raise HTTPException(status_code=HTTPStatus.UNAUTHORIZED, detail=str(e))
67125
except ValueError as e:
68126
raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail=str(e))
69-
except Exception as e:
70-
logger.error(f"Update agent repository status error: {str(e)}")
71-
raise HTTPException(
72-
status_code=HTTPStatus.INTERNAL_SERVER_ERROR,
73-
detail="Update agent repository status error.",
74-
)
75127

76128

77129
@agent_repository_router.post("/{agent_id}/versions/{version_no}")
78130
async def create_agent_repository_listing_api(
79131
agent_id: int,
80132
version_no: int,
133+
payload: Optional[AgentRepositoryListingCreateRequest] = Body(None),
81134
authorization: str = Header(None),
82135
):
83136
"""Create or update a marketplace repository listing from an agent version snapshot."""
84137
try:
85138
user_id, tenant_id = get_current_user_id(authorization)
139+
card_fields = payload.model_dump(exclude_none=True) if payload else None
86140
result = await create_agent_repository_listing_impl(
87141
agent_id=agent_id,
88142
tenant_id=tenant_id,
89143
user_id=user_id,
90144
version_no=version_no,
145+
card_fields=card_fields,
91146
)
92147
return JSONResponse(status_code=HTTPStatus.OK, content=result)
93148
except UnauthorizedError as e:
94149
raise HTTPException(status_code=HTTPStatus.UNAUTHORIZED, detail=str(e))
95150
except ValueError as e:
96151
raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail=str(e))
97-
except Exception as e:
98-
logger.error(f"Create agent repository listing error: {str(e)}")
99-
raise HTTPException(
100-
status_code=HTTPStatus.INTERNAL_SERVER_ERROR,
101-
detail="Create agent repository listing error.",
102-
)
103152

104153

105154
@agent_repository_router.post("/{agent_repository_id}/import")
@@ -109,8 +158,10 @@ async def import_agent_from_repository_api(
109158
):
110159
"""Import an agent tree from a marketplace repository listing into the current tenant."""
111160
try:
161+
_, tenant_id = get_current_user_id(authorization)
112162
await import_agent_from_repository_impl(
113163
agent_repository_id=agent_repository_id,
164+
tenant_id=tenant_id,
114165
authorization=authorization,
115166
)
116167
return JSONResponse(status_code=HTTPStatus.OK, content={})
@@ -126,9 +177,3 @@ async def import_agent_from_repository_api(
126177
)
127178
except ValueError as e:
128179
raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail=str(e))
129-
except Exception as e:
130-
logger.error(f"Import agent from repository error: {str(e)}")
131-
raise HTTPException(
132-
status_code=HTTPStatus.INTERNAL_SERVER_ERROR,
133-
detail="Import agent from repository error.",
134-
)

backend/consts/model.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -680,6 +680,42 @@ class AgentRepositorySnapshot(ExportAndImportDataFormat):
680680
skills: Optional[List["SkillZipEntry"]] = None
681681

682682

683+
class AgentRepositoryListingCreateRequest(BaseModel):
684+
"""Request body for creating a marketplace listing from an agent version."""
685+
icon: Optional[str] = Field(None, description="Marketplace card icon (emoji or URL)")
686+
downloads: int = Field(0, ge=0, description="Initial download/copy count for card display")
687+
tags: Optional[List[str]] = Field(None, description="Marketplace tags")
688+
category_id: Optional[int] = Field(0, description="Optional marketplace category ID")
689+
tool_count: Optional[int] = Field(
690+
None, ge=0, description="Total tool count across all agents in the bundle"
691+
)
692+
693+
694+
class AgentRepositoryCategoryItem(BaseModel):
695+
"""Marketplace category option for agent repository filtering."""
696+
id: int
697+
key: str
698+
name: str
699+
700+
701+
class AgentRepositoryListingDetailResponse(BaseModel):
702+
"""Detailed marketplace listing payload for repository detail view."""
703+
agent_repository_id: int
704+
agent_id: Optional[int] = None
705+
name: str
706+
display_name: Optional[str] = None
707+
description: Optional[str] = None
708+
author: Optional[str] = None
709+
icon: Optional[str] = None
710+
status: str
711+
version_label: Optional[str] = None
712+
downloads: int = 0
713+
created_at: Optional[str] = None
714+
model_name: Optional[str] = None
715+
duty_prompt: Optional[str] = None
716+
tools: List[str] = Field(default_factory=list)
717+
718+
683719
class SkillZipEntry(BaseModel):
684720
"""A skill bundled inside an agent export ZIP."""
685721
skill_name: str

0 commit comments

Comments
 (0)