diff --git a/backend/internal/handler/admin/channel_monitor_handler.go b/backend/internal/handler/admin/channel_monitor_handler.go index e92c81fe..5560a513 100644 --- a/backend/internal/handler/admin/channel_monitor_handler.go +++ b/backend/internal/handler/admin/channel_monitor_handler.go @@ -38,6 +38,7 @@ func NewChannelMonitorHandler(monitorService *service.ChannelMonitorService) *Ch type channelMonitorCreateRequest struct { Name string `json:"name" binding:"required,max=100"` Provider string `json:"provider" binding:"required,oneof=openai anthropic gemini"` + APIMode string `json:"api_mode" binding:"omitempty,oneof=chat_completions responses"` Endpoint string `json:"endpoint" binding:"required,max=500"` APIKey string `json:"api_key" binding:"required,max=2000"` PrimaryModel string `json:"primary_model" binding:"required,max=200"` @@ -54,6 +55,7 @@ type channelMonitorCreateRequest struct { type channelMonitorUpdateRequest struct { Name *string `json:"name" binding:"omitempty,max=100"` Provider *string `json:"provider" binding:"omitempty,oneof=openai anthropic gemini"` + APIMode *string `json:"api_mode" binding:"omitempty,oneof=chat_completions responses"` Endpoint *string `json:"endpoint" binding:"omitempty,max=500"` APIKey *string `json:"api_key" binding:"omitempty,max=2000"` PrimaryModel *string `json:"primary_model" binding:"omitempty,max=200"` @@ -72,6 +74,7 @@ type channelMonitorResponse struct { ID int64 `json:"id"` Name string `json:"name"` Provider string `json:"provider"` + APIMode string `json:"api_mode"` Endpoint string `json:"endpoint"` APIKeyMasked string `json:"api_key_masked"` APIKeyDecryptFailed bool `json:"api_key_decrypt_failed"` @@ -138,6 +141,7 @@ func channelMonitorToResponse(m *service.ChannelMonitor) *channelMonitorResponse ID: m.ID, Name: m.Name, Provider: m.Provider, + APIMode: m.APIMode, Endpoint: m.Endpoint, APIKeyMasked: maskAPIKey(m.APIKey), APIKeyDecryptFailed: m.APIKeyDecryptFailed, @@ -303,6 +307,7 @@ func (h *ChannelMonitorHandler) Create(c *gin.Context) { m, err := h.monitorService.Create(c.Request.Context(), service.ChannelMonitorCreateParams{ Name: req.Name, Provider: req.Provider, + APIMode: req.APIMode, Endpoint: req.Endpoint, APIKey: req.APIKey, PrimaryModel: req.PrimaryModel, @@ -338,6 +343,7 @@ func (h *ChannelMonitorHandler) Update(c *gin.Context) { m, err := h.monitorService.Update(c.Request.Context(), id, service.ChannelMonitorUpdateParams{ Name: req.Name, Provider: req.Provider, + APIMode: req.APIMode, Endpoint: req.Endpoint, APIKey: req.APIKey, PrimaryModel: req.PrimaryModel, diff --git a/backend/internal/handler/admin/channel_monitor_template_handler.go b/backend/internal/handler/admin/channel_monitor_template_handler.go index bebe0929..c842f465 100644 --- a/backend/internal/handler/admin/channel_monitor_template_handler.go +++ b/backend/internal/handler/admin/channel_monitor_template_handler.go @@ -27,6 +27,7 @@ func NewChannelMonitorRequestTemplateHandler(templateService *service.ChannelMon type channelMonitorTemplateCreateRequest struct { Name string `json:"name" binding:"required,max=100"` Provider string `json:"provider" binding:"required,oneof=openai anthropic gemini"` + APIMode string `json:"api_mode" binding:"omitempty,oneof=chat_completions responses"` Description string `json:"description" binding:"max=500"` ExtraHeaders map[string]string `json:"extra_headers"` BodyOverrideMode string `json:"body_override_mode" binding:"omitempty,oneof=off merge replace"` @@ -35,6 +36,7 @@ type channelMonitorTemplateCreateRequest struct { type channelMonitorTemplateUpdateRequest struct { Name *string `json:"name" binding:"omitempty,max=100"` + APIMode *string `json:"api_mode" binding:"omitempty,oneof=chat_completions responses"` Description *string `json:"description" binding:"omitempty,max=500"` ExtraHeaders *map[string]string `json:"extra_headers"` BodyOverrideMode *string `json:"body_override_mode" binding:"omitempty,oneof=off merge replace"` @@ -45,6 +47,7 @@ type channelMonitorTemplateResponse struct { ID int64 `json:"id"` Name string `json:"name"` Provider string `json:"provider"` + APIMode string `json:"api_mode"` Description string `json:"description"` ExtraHeaders map[string]string `json:"extra_headers"` BodyOverrideMode string `json:"body_override_mode"` @@ -67,6 +70,7 @@ func (h *ChannelMonitorRequestTemplateHandler) toResponse(c *gin.Context, t *ser ID: t.ID, Name: t.Name, Provider: t.Provider, + APIMode: t.APIMode, Description: t.Description, ExtraHeaders: headers, BodyOverrideMode: t.BodyOverrideMode, @@ -93,6 +97,7 @@ func parseTemplateID(c *gin.Context) (int64, bool) { func (h *ChannelMonitorRequestTemplateHandler) List(c *gin.Context) { items, err := h.templateService.List(c.Request.Context(), service.ChannelMonitorRequestTemplateListParams{ Provider: strings.TrimSpace(c.Query("provider")), + APIMode: strings.TrimSpace(c.Query("api_mode")), }) if err != nil { response.ErrorFrom(c, err) @@ -129,6 +134,7 @@ func (h *ChannelMonitorRequestTemplateHandler) Create(c *gin.Context) { t, err := h.templateService.Create(c.Request.Context(), service.ChannelMonitorRequestTemplateCreateParams{ Name: req.Name, Provider: req.Provider, + APIMode: req.APIMode, Description: req.Description, ExtraHeaders: req.ExtraHeaders, BodyOverrideMode: req.BodyOverrideMode, @@ -154,6 +160,7 @@ func (h *ChannelMonitorRequestTemplateHandler) Update(c *gin.Context) { } t, err := h.templateService.Update(c.Request.Context(), id, service.ChannelMonitorRequestTemplateUpdateParams{ Name: req.Name, + APIMode: req.APIMode, Description: req.Description, ExtraHeaders: req.ExtraHeaders, BodyOverrideMode: req.BodyOverrideMode, @@ -209,6 +216,7 @@ type associatedMonitorBriefResponse struct { ID int64 `json:"id"` Name string `json:"name"` Provider string `json:"provider"` + APIMode string `json:"api_mode"` Enabled bool `json:"enabled"` } @@ -227,7 +235,7 @@ func (h *ChannelMonitorRequestTemplateHandler) AssociatedMonitors(c *gin.Context out := make([]associatedMonitorBriefResponse, 0, len(items)) for _, m := range items { out = append(out, associatedMonitorBriefResponse{ - ID: m.ID, Name: m.Name, Provider: m.Provider, Enabled: m.Enabled, + ID: m.ID, Name: m.Name, Provider: m.Provider, APIMode: m.APIMode, Enabled: m.Enabled, }) } response.Success(c, gin.H{"items": out})