99 lines
3.7 KiB
Go
99 lines
3.7 KiB
Go
package httpapi
|
||
|
||
import (
|
||
"net/http"
|
||
|
||
gatewaydocs "github.com/easyai/easyai-ai-gateway/apps/api/docs"
|
||
"github.com/easyai/easyai-ai-gateway/apps/api/internal/skillbundle"
|
||
)
|
||
|
||
const (
|
||
opsManagementSkillDownloadPath = "/api/v1/public/skills/ai-gateway-ops-management/download"
|
||
apiDocsJSONPath = "/api-docs-json"
|
||
apiDocsYAMLPath = "/api-docs-yaml"
|
||
)
|
||
|
||
// getOpsManagementSkillMetadata godoc
|
||
// @Summary 获取 AI Gateway 运维管理 SKILL 元数据
|
||
// @Description 返回公开运维管理 SKILL 的名称、版本、模块、下载文件名和机器可读接口文档路径。
|
||
// @Tags agent-resources
|
||
// @Produce json
|
||
// @Success 200 {object} SkillBundleMetadataResponse
|
||
// @Failure 500 {object} ErrorEnvelope
|
||
// @Router /api/v1/public/skills/ai-gateway-ops-management/metadata [get]
|
||
func (s *Server) getOpsManagementSkillMetadata(w http.ResponseWriter, _ *http.Request) {
|
||
metadata, err := skillbundle.LoadMetadata()
|
||
if err != nil {
|
||
s.logger.Error("load operations skill metadata failed", "error", err)
|
||
writeError(w, http.StatusInternalServerError, "operations skill metadata unavailable")
|
||
return
|
||
}
|
||
writeJSON(w, http.StatusOK, opsManagementSkillMetadataResponse(metadata))
|
||
}
|
||
|
||
// downloadOpsManagementSkill godoc
|
||
// @Summary 下载 AI Gateway 运维管理 SKILL
|
||
// @Description 下载可交给 Agent 使用的 ai-gateway-ops-management ZIP 包。
|
||
// @Tags agent-resources
|
||
// @Produce application/zip
|
||
// @Success 200 {file} binary
|
||
// @Failure 500 {object} ErrorEnvelope
|
||
// @Router /api/v1/public/skills/ai-gateway-ops-management/download [get]
|
||
func (s *Server) downloadOpsManagementSkill(w http.ResponseWriter, _ *http.Request) {
|
||
metadata, err := skillbundle.LoadMetadata()
|
||
if err != nil {
|
||
s.logger.Error("load operations skill metadata failed", "error", err)
|
||
writeError(w, http.StatusInternalServerError, "operations skill metadata unavailable")
|
||
return
|
||
}
|
||
archive, err := skillbundle.BuildArchive()
|
||
if err != nil {
|
||
s.logger.Error("build operations skill archive failed", "error", err)
|
||
writeError(w, http.StatusInternalServerError, "operations skill download unavailable")
|
||
return
|
||
}
|
||
w.Header().Set("Content-Type", "application/zip")
|
||
w.Header().Set("Content-Disposition", `attachment; filename="`+skillbundle.FileName(metadata)+`"`)
|
||
w.WriteHeader(http.StatusOK)
|
||
_, _ = w.Write(archive)
|
||
}
|
||
|
||
// apiDocsJSON godoc
|
||
// @Summary 获取 AI Gateway Swagger JSON
|
||
// @Description 返回当前构建内嵌的完整机器可读 Swagger JSON,供 Agent 在 SKILL references 未覆盖接口时查询。
|
||
// @Tags agent-resources
|
||
// @Produce json
|
||
// @Success 200 {object} map[string]interface{}
|
||
// @Router /api-docs-json [get]
|
||
func (s *Server) apiDocsJSON(w http.ResponseWriter, _ *http.Request) {
|
||
w.Header().Set("Content-Type", "application/json; charset=utf-8")
|
||
w.WriteHeader(http.StatusOK)
|
||
_, _ = w.Write(gatewaydocs.SwaggerJSON)
|
||
}
|
||
|
||
// apiDocsYAML godoc
|
||
// @Summary 获取 AI Gateway Swagger YAML
|
||
// @Description 返回当前构建内嵌的完整机器可读 Swagger YAML。
|
||
// @Tags agent-resources
|
||
// @Produce application/yaml
|
||
// @Success 200 {string} string
|
||
// @Router /api-docs-yaml [get]
|
||
func (s *Server) apiDocsYAML(w http.ResponseWriter, _ *http.Request) {
|
||
w.Header().Set("Content-Type", "application/yaml; charset=utf-8")
|
||
w.WriteHeader(http.StatusOK)
|
||
_, _ = w.Write(gatewaydocs.SwaggerYAML)
|
||
}
|
||
|
||
func opsManagementSkillMetadataResponse(metadata skillbundle.Metadata) SkillBundleMetadataResponse {
|
||
return SkillBundleMetadataResponse{
|
||
Name: metadata.Name,
|
||
Version: metadata.Version,
|
||
DisplayName: skillbundle.DisplayName,
|
||
Modules: metadata.Modules,
|
||
FileName: skillbundle.FileName(metadata),
|
||
DownloadPath: opsManagementSkillDownloadPath,
|
||
APIDocsJSONPath: apiDocsJSONPath,
|
||
APIDocsYAMLPath: apiDocsYAMLPath,
|
||
}
|
||
}
|