feat(app): Application (agent, workflow) import/export
This commit is contained in:
@@ -1021,12 +1021,12 @@ async def export_app(
|
|||||||
app_id: uuid.UUID,
|
app_id: uuid.UUID,
|
||||||
db: Annotated[Session, Depends(get_db)],
|
db: Annotated[Session, Depends(get_db)],
|
||||||
current_user: Annotated[User, Depends(get_current_user)],
|
current_user: Annotated[User, Depends(get_current_user)],
|
||||||
release_version: Optional[str] = None
|
release_id: Optional[uuid.UUID] = None
|
||||||
):
|
):
|
||||||
"""导出 agent / multi_agent / workflow 应用配置为 YAML 文件流。
|
"""导出 agent / multi_agent / workflow 应用配置为 YAML 文件流。
|
||||||
release_version: 指定发布版本号,不传则导出当前草稿配置。
|
release_version: 指定发布版本号,不传则导出当前草稿配置。
|
||||||
"""
|
"""
|
||||||
yaml_str, filename = AppDslService(db).export_dsl(app_id, release_version)
|
yaml_str, filename = AppDslService(db).export_dsl(app_id, release_id)
|
||||||
encoded = quote(filename, safe=".")
|
encoded = quote(filename, safe=".")
|
||||||
yaml_bytes = yaml_str.encode("utf-8")
|
yaml_bytes = yaml_str.encode("utf-8")
|
||||||
file_stream = io.BytesIO(yaml_bytes)
|
file_stream = io.BytesIO(yaml_bytes)
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ class AppDslService:
|
|||||||
|
|
||||||
# ==================== 导出 ====================
|
# ==================== 导出 ====================
|
||||||
|
|
||||||
def export_dsl(self, app_id: uuid.UUID, release_version: Optional[str] = None) -> tuple[str, str]:
|
def export_dsl(self, app_id: uuid.UUID, release_id: Optional[uuid.UUID] = None) -> tuple[str, str]:
|
||||||
"""构建应用 DSL yaml 字符串,返回 (yaml_str, filename)"""
|
"""构建应用 DSL yaml 字符串,返回 (yaml_str, filename)"""
|
||||||
app = self.db.query(App).filter(App.id == app_id, App.is_active.is_(True)).first()
|
app = self.db.query(App).filter(App.id == app_id, App.is_active.is_(True)).first()
|
||||||
if not app:
|
if not app:
|
||||||
@@ -46,19 +46,19 @@ class AppDslService:
|
|||||||
"tags": app.tags or [],
|
"tags": app.tags or [],
|
||||||
}
|
}
|
||||||
|
|
||||||
if release_version is not None:
|
if release_id is not None:
|
||||||
return self._export_release(app, release_version, meta, app_meta)
|
return self._export_release(app, release_id, meta, app_meta)
|
||||||
|
|
||||||
return self._export_draft(app, meta, app_meta)
|
return self._export_draft(app, meta, app_meta)
|
||||||
|
|
||||||
def _export_release(self, app: App, release_version: str, meta: dict, app_meta: dict) -> tuple[str, str]:
|
def _export_release(self, app: App, release_id: uuid.UUID, meta: dict, app_meta: dict) -> tuple[str, str]:
|
||||||
release = self.db.query(AppRelease).filter(
|
release = self.db.query(AppRelease).filter(
|
||||||
AppRelease.app_id == app.id,
|
AppRelease.app_id == app.id,
|
||||||
AppRelease.id == release_version,
|
AppRelease.id == release_id,
|
||||||
AppRelease.is_active.is_(True)
|
AppRelease.is_active.is_(True)
|
||||||
).first()
|
).first()
|
||||||
if not release:
|
if not release:
|
||||||
raise ResourceNotFoundException("版本", str(release_version))
|
raise ResourceNotFoundException("版本", str(release_id))
|
||||||
|
|
||||||
meta["release_version"] = release.version
|
meta["release_version"] = release.version
|
||||||
meta["release_name"] = release.version_name
|
meta["release_name"] = release.version_name
|
||||||
|
|||||||
Reference in New Issue
Block a user