50 lines
1.1 KiB
Go
50 lines
1.1 KiB
Go
package channel
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"gpt-load/internal/models"
|
|
"net/http"
|
|
"net/url"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
type GeminiChannel struct {
|
|
BaseChannel
|
|
}
|
|
|
|
type GeminiChannelConfig struct {
|
|
BaseURL string `json:"base_url"`
|
|
}
|
|
|
|
func NewGeminiChannel(group *models.Group) (*GeminiChannel, error) {
|
|
var config GeminiChannelConfig
|
|
if err := json.Unmarshal([]byte(group.Config), &config); err != nil {
|
|
return nil, fmt.Errorf("failed to unmarshal channel config: %w", err)
|
|
}
|
|
if config.BaseURL == "" {
|
|
return nil, fmt.Errorf("base_url is required for gemini channel")
|
|
}
|
|
|
|
baseURL, err := url.Parse(config.BaseURL)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to parse base_url: %w", err)
|
|
}
|
|
|
|
return &GeminiChannel{
|
|
BaseChannel: BaseChannel{
|
|
Name: "gemini",
|
|
BaseURL: baseURL,
|
|
HTTPClient: &http.Client{},
|
|
},
|
|
}, nil
|
|
}
|
|
|
|
func (ch *GeminiChannel) Handle(c *gin.Context, apiKey *models.APIKey, group *models.Group) error {
|
|
modifier := func(req *http.Request, key *models.APIKey) {
|
|
q := req.URL.Query()
|
|
q.Set("key", key.KeyValue)
|
|
req.URL.RawQuery = q.Encode()
|
|
}
|
|
return ch.ProcessRequest(c, apiKey, modifier)
|
|
} |