feat(task): replace built-in task adaptors with a sandboxed JS plugin system (#7076)

This commit is contained in:
Calcium-Ion
2026-08-29 18:51:57 +08:00
committed by GitHub
parent 7037ac15bd
commit eb48396d5f
336 changed files with 52333 additions and 6369 deletions
+52
View File
@@ -0,0 +1,52 @@
package router
import (
"fmt"
"github.com/QuantumNous/new-api/controller"
"github.com/QuantumNous/new-api/middleware"
pluginruntime "github.com/QuantumNous/new-api/pkg/jsplugin"
"github.com/QuantumNous/new-api/relaykit/types"
"github.com/gin-gonic/gin"
)
func SetTaskPluginProtocolRouter(router *gin.Engine) {
for _, protocol := range pluginruntime.HostProtocols() {
for _, operation := range protocol.Operations {
for _, method := range operation.Methods {
handlers, err := taskPluginProtocolHandlers(protocol.Name, operation.Name)
if err != nil {
panic(err)
}
router.Handle(method, operation.Path, handlers...)
}
}
}
}
func taskPluginProtocolHandlers(protocol, operation string) ([]gin.HandlerFunc, error) {
switch protocol + "." + operation {
case "openai_responses.create":
return []gin.HandlerFunc{
middleware.RouteTag("relay"), middleware.SystemPerformanceCheck(), middleware.TokenAuth(),
middleware.ModelRequestRateLimit(), middleware.PinTaskPluginEndpoint(), middleware.PrepareTaskPluginEndpoint(), middleware.Distribute(),
func(c *gin.Context) {
controller.RelayTaskPluginEndpoint(c, func(c *gin.Context) { controller.Relay(c, types.RelayFormatOpenAIResponses) })
},
}, nil
case "openai_video.create":
return []gin.HandlerFunc{
middleware.RouteTag("relay"), middleware.TokenAuth(), middleware.SystemPerformanceCheck(),
middleware.PinTaskPluginEndpoint(), middleware.TaskPluginEndpointOnly(middleware.ModelRequestRateLimit()), middleware.PrepareTaskPluginEndpoint(), middleware.Distribute(),
func(c *gin.Context) { controller.RelayTaskPluginEndpoint(c, controller.RelayTask) },
}, nil
case "openai_responses.retrieve":
return []gin.HandlerFunc{middleware.RouteTag("relay"), middleware.TokenAuth(), controller.RetrieveTaskPluginResponse}, nil
case "openai_video.retrieve":
return []gin.HandlerFunc{middleware.RouteTag("relay"), middleware.TokenAuth(), middleware.Distribute(), controller.RelayTaskFetch}, nil
case "openai_video.content":
return []gin.HandlerFunc{middleware.RouteTag("relay"), middleware.TokenAuth(), controller.VideoProxy}, nil
default:
return nil, fmt.Errorf("host protocol registry operation %s.%s has no handler", protocol, operation)
}
}