feat(platform): Agent 与媒体能力 - 完善角色卡、音频协议与任务恢复链路

This commit is contained in:
ddcat666 committed 2026-10-01 09:42:51 +08:00
1 parent a8f83fedd5
commit 5650da6d31
91 files changed
+3438 -380

No files matched your search

@@ -68,7 +68,57 @@ func registerAdminAPILogRoutes(r *gin.RouterGroup, svc *service.Service) {
failService(c, err)
return
}
result, err := svc.AdminQueryFailedVideoTask(c.Request.Context(), user, c.Param("id"))
var req struct {
ProviderRequestID string `json:"providerRequestId"`
}
if c.Request.ContentLength != 0 {
if err := c.ShouldBindJSON(&req); err != nil {
fail(c, http.StatusBadRequest, err)
return
}
}
result, err := svc.AdminQueryFailedVideoTask(c.Request.Context(), user, c.Param("id"), req.ProviderRequestID)
if err != nil {
failService(c, err)
return
}
ok(c, result)
})
r.POST("/admin/api-logs/:id/recover-url", func(c *gin.Context) {
user, err := currentUser(c, svc)
if err != nil {
failService(c, err)
return
}
var req struct {
URL string `json:"url"`
ProviderRequestID string `json:"providerRequestId"`
}
if err := c.ShouldBindJSON(&req); err != nil {
fail(c, http.StatusBadRequest, err)
return
}
result, err := svc.AdminRecoverVideoByURL(c.Request.Context(), user, c.Param("id"), req.URL, req.ProviderRequestID)
if err != nil {
failService(c, err)
return
}
ok(c, result)
})
r.POST("/admin/api-logs/recover-batch", func(c *gin.Context) {
user, err := currentUser(c, svc)
if err != nil {
failService(c, err)
return
}
var req struct {
IDs []string `json:"ids"`
}
if err := c.ShouldBindJSON(&req); err != nil {
fail(c, http.StatusBadRequest, err)
return
}
result, err := svc.AdminBatchQueryFailedVideoTasks(c.Request.Context(), user, req.IDs)
if err != nil {
failService(c, err)
return
@@ -4,6 +4,7 @@ package handler
import (
"net/http"
"strings"
"infinite-canvas/backend/internal/service"
@@ -128,6 +129,136 @@ func registerProjectAssetRoutes(r *gin.RouterGroup, svc *service.Service) {
}
ok(c, gin.H{"id": c.Param("folderId")})
})
r.GET("/characters", func(c *gin.Context) {
user, err := currentUser(c, svc)
if err != nil {
failService(c, err)
return
}
page, pageSize, parseErr := parsePaginationQuery(c, 12)
if parseErr != nil {
fail(c, http.StatusBadRequest, parseErr)
return
}
if pageSize > 48 {
pageSize = 48
}
ids := []string{}
for _, id := range strings.Split(c.Query("ids"), ",") {
if id = strings.TrimSpace(id); id != "" {
ids = append(ids, id)
}
}
characters, err := svc.ListCharacters(user.ID, c.Query("q"), page, pageSize, ids)
if err != nil {
failService(c, err)
return
}
ok(c, characters)
})
r.POST("/characters", func(c *gin.Context) {
user, err := currentUser(c, svc)
if err != nil {
failService(c, err)
return
}
c.Request.Body = http.MaxBytesReader(c.Writer, c.Request.Body, 256<<10)
var req service.CreateCharacterRequest
if err := c.ShouldBindJSON(&req); err != nil {
fail(c, http.StatusBadRequest, err)
return
}
character, err := svc.CreateCharacter(user.ID, req)
if err != nil {
failService(c, err)
return
}
ok(c, character)
})
r.GET("/characters/:assetId", func(c *gin.Context) {
user, err := currentUser(c, svc)
if err != nil {
failService(c, err)
return
}
character, err := svc.Character(user.ID, c.Param("assetId"))
if err != nil {
failService(c, err)
return
}
ok(c, character)
})
r.PATCH("/characters/:assetId", func(c *gin.Context) {
user, err := currentUser(c, svc)
if err != nil {
failService(c, err)
return
}
c.Request.Body = http.MaxBytesReader(c.Writer, c.Request.Body, 256<<10)
var req service.UpdateProjectCharacterRequest
if err := c.ShouldBindJSON(&req); err != nil {
fail(c, http.StatusBadRequest, err)
return
}
character, err := svc.UpdateCharacter(user.ID, c.Param("assetId"), req)
if err != nil {
failService(c, err)
return
}
ok(c, character)
})
r.PUT("/characters/:assetId/representations", func(c *gin.Context) {
user, err := currentUser(c, svc)
if err != nil {
failService(c, err)
return
}
c.Request.Body = http.MaxBytesReader(c.Writer, c.Request.Body, 128<<10)
var req service.ReplaceCharacterRepresentationsRequest
if err := c.ShouldBindJSON(&req); err != nil {
fail(c, http.StatusBadRequest, err)
return
}
character, err := svc.ReplaceCharacterRepresentations(user.ID, c.Param("assetId"), req)
if err != nil {
failService(c, err)
return
}
ok(c, character)
})
r.PUT("/characters/:assetId/voice", func(c *gin.Context) {
user, err := currentUser(c, svc)
if err != nil {
failService(c, err)
return
}
c.Request.Body = http.MaxBytesReader(c.Writer, c.Request.Body, 64<<10)
var req service.BindCharacterVoiceRequest
if err := c.ShouldBindJSON(&req); err != nil {
fail(c, http.StatusBadRequest, err)
return
}
character, err := svc.BindCharacterVoice(user.ID, c.Param("assetId"), req)
if err != nil {
failService(c, err)
return
}
ok(c, character)
})
r.DELETE("/characters/:assetId/voice", func(c *gin.Context) {
user, err := currentUser(c, svc)
if err != nil {
failService(c, err)
return
}
character, err := svc.UnbindCharacterVoice(user.ID, c.Param("assetId"))
if err != nil {
failService(c, err)
return
}
ok(c, character)
})
r.POST("/projects/:id/characters", func(c *gin.Context) {
user, err := currentUser(c, svc)
if err != nil {