112 lines
4.3 KiB
Go
112 lines
4.3 KiB
Go
// Package handlers provides HTTP request handlers for the Bifrost HTTP transport.
|
|
// This file contains integration management handlers for AI provider integrations.
|
|
package handlers
|
|
|
|
import (
|
|
"github.com/fasthttp/router"
|
|
bifrost "github.com/maximhq/bifrost/core"
|
|
"github.com/maximhq/bifrost/core/schemas"
|
|
"github.com/maximhq/bifrost/transports/bifrost-http/integrations"
|
|
"github.com/maximhq/bifrost/transports/bifrost-http/lib"
|
|
)
|
|
|
|
// IntegrationHandler manages HTTP requests for AI provider integrations
|
|
type IntegrationHandler struct {
|
|
extensions []integrations.ExtensionRouter
|
|
wsResponses *WSResponsesHandler
|
|
wsRealtime *WSRealtimeHandler
|
|
webrtcRealtime *WebRTCRealtimeHandler
|
|
realtimeClientSecrets *RealtimeClientSecretsHandler
|
|
}
|
|
|
|
// NewIntegrationHandler creates a new integration handler instance.
|
|
// WebSocket handlers may be nil if WebSocket support is not configured.
|
|
func NewIntegrationHandler(client *bifrost.Bifrost, handlerStore lib.HandlerStore, wsResponses *WSResponsesHandler, wsRealtime *WSRealtimeHandler, webrtcRealtime *WebRTCRealtimeHandler, realtimeClientSecrets *RealtimeClientSecretsHandler) *IntegrationHandler {
|
|
// Initialize all available integration routers
|
|
extensions := []integrations.ExtensionRouter{
|
|
integrations.NewOpenAIRouter(client, handlerStore, logger),
|
|
integrations.NewAnthropicRouter(client, handlerStore, logger),
|
|
integrations.NewGenAIRouter(client, handlerStore, logger),
|
|
integrations.NewLiteLLMRouter(client, handlerStore, logger),
|
|
integrations.NewCohereRouter(client, handlerStore, logger),
|
|
integrations.NewLangChainRouter(client, handlerStore, logger),
|
|
integrations.NewPydanticAIRouter(client, handlerStore, logger),
|
|
integrations.NewBedrockRouter(client, handlerStore, logger),
|
|
// passthrough routers
|
|
integrations.NewGenAIPassthroughRouter(client, handlerStore, logger),
|
|
integrations.NewOpenAIPassthroughRouter(client, handlerStore, logger),
|
|
integrations.NewAnthropicPassthroughRouter(client, handlerStore, logger),
|
|
integrations.NewAzurePassthroughRouter(client, handlerStore, logger),
|
|
integrations.NewCursorRouter(client, handlerStore, logger),
|
|
}
|
|
|
|
return &IntegrationHandler{
|
|
extensions: extensions,
|
|
wsResponses: wsResponses,
|
|
wsRealtime: wsRealtime,
|
|
webrtcRealtime: webrtcRealtime,
|
|
realtimeClientSecrets: realtimeClientSecrets,
|
|
}
|
|
}
|
|
|
|
// RegisterRoutes registers all integration routes for AI provider compatibility endpoints
|
|
func (h *IntegrationHandler) RegisterRoutes(r *router.Router, middlewares ...schemas.BifrostHTTPMiddleware) {
|
|
// Register routes for each integration extension
|
|
for _, extension := range h.extensions {
|
|
extension.RegisterRoutes(r, middlewares...)
|
|
}
|
|
// Register WebSocket routes (base path + integration paths)
|
|
if h.wsResponses != nil {
|
|
h.wsResponses.RegisterRoutes(r, middlewares...)
|
|
}
|
|
if h.wsRealtime != nil {
|
|
h.wsRealtime.RegisterRoutes(r, middlewares...)
|
|
}
|
|
if h.webrtcRealtime != nil {
|
|
h.webrtcRealtime.RegisterRoutes(r, middlewares...)
|
|
}
|
|
if h.realtimeClientSecrets != nil {
|
|
h.realtimeClientSecrets.RegisterRoutes(r, middlewares...)
|
|
}
|
|
}
|
|
|
|
func (h *IntegrationHandler) Close() {
|
|
if h == nil {
|
|
return
|
|
}
|
|
if h.wsResponses != nil {
|
|
h.wsResponses.Close()
|
|
}
|
|
if h.wsRealtime != nil {
|
|
h.wsRealtime.Close()
|
|
}
|
|
if h.webrtcRealtime != nil {
|
|
h.webrtcRealtime.Close()
|
|
}
|
|
}
|
|
|
|
// SetLargePayloadHook sets the large payload detection hook on all integration routers
|
|
// that support it. This is used by enterprise to inject large payload optimization.
|
|
func (h *IntegrationHandler) SetLargePayloadHook(hook integrations.LargePayloadHook) {
|
|
for _, extension := range h.extensions {
|
|
if setter, ok := extension.(interface {
|
|
SetLargePayloadHook(integrations.LargePayloadHook)
|
|
}); ok {
|
|
setter.SetLargePayloadHook(hook)
|
|
}
|
|
}
|
|
}
|
|
|
|
// SetLargeResponseHook sets the large response scanning hook on all integration routers
|
|
// that support it. Enterprise uses this to inject Phase B usage extraction into the
|
|
// response stream without embedding scanning logic in the OSS router.
|
|
func (h *IntegrationHandler) SetLargeResponseHook(hook integrations.LargeResponseHook) {
|
|
for _, extension := range h.extensions {
|
|
if setter, ok := extension.(interface {
|
|
SetLargeResponseHook(integrations.LargeResponseHook)
|
|
}); ok {
|
|
setter.SetLargeResponseHook(hook)
|
|
}
|
|
}
|
|
}
|