mirror of
https://wget.la/https://github.com/leookun/cursor-byok
synced 2026-08-18 03:57:06 +08:00
122 lines
2.8 KiB
Go
122 lines
2.8 KiB
Go
package modeladapter
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
"strings"
|
|
)
|
|
|
|
func cloneRequestBodyOverride(input map[string]any) map[string]any {
|
|
if len(input) == 0 {
|
|
return nil
|
|
}
|
|
payload, err := json.Marshal(input)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
var cloned map[string]any
|
|
if err := json.Unmarshal(payload, &cloned); err != nil {
|
|
return nil
|
|
}
|
|
return cloned
|
|
}
|
|
|
|
func requestBodyToMap(input any) (map[string]any, error) {
|
|
if body, ok := input.(map[string]any); ok {
|
|
return body, nil
|
|
}
|
|
payload, err := json.Marshal(input)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var body map[string]any
|
|
if err := json.Unmarshal(payload, &body); err != nil {
|
|
return nil, err
|
|
}
|
|
if body == nil {
|
|
body = map[string]any{}
|
|
}
|
|
return body, nil
|
|
}
|
|
|
|
func ApplyOpenAIExtraParams(body map[string]any, enabled bool, paramsJSON string) error {
|
|
return applyExtraParams(body, enabled, paramsJSON, "openai extra params json")
|
|
}
|
|
|
|
func ApplyAnthropicExtraParams(body map[string]any, enabled bool, paramsJSON string) error {
|
|
return applyExtraParams(body, enabled, paramsJSON, "anthropic extra params json")
|
|
}
|
|
|
|
func applyExtraParams(body map[string]any, enabled bool, paramsJSON string, label string) error {
|
|
if !enabled {
|
|
return nil
|
|
}
|
|
if body == nil {
|
|
return fmt.Errorf("%s target body is nil", label)
|
|
}
|
|
extraParams, err := parseJSONMap(paramsJSON, label)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
for key, value := range extraParams {
|
|
name := strings.TrimSpace(key)
|
|
if name == "" {
|
|
continue
|
|
}
|
|
body[name] = value
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func ApplyCustomHeaders(httpReq *http.Request, enabled bool, headersJSON string) error {
|
|
if !enabled {
|
|
return nil
|
|
}
|
|
if httpReq == nil {
|
|
return fmt.Errorf("custom headers target request is nil")
|
|
}
|
|
headers, err := parseStringJSONMap(headersJSON, "custom headers json")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
for key, value := range headers {
|
|
name := strings.TrimSpace(key)
|
|
if name == "" {
|
|
continue
|
|
}
|
|
httpReq.Header.Set(name, value)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func parseJSONMap(value string, label string) (map[string]any, error) {
|
|
text := strings.TrimSpace(value)
|
|
if text == "" {
|
|
return nil, fmt.Errorf("%s is empty", label)
|
|
}
|
|
var parsed map[string]any
|
|
if err := json.Unmarshal([]byte(text), &parsed); err != nil {
|
|
return nil, fmt.Errorf("%s must be an object: %w", label, err)
|
|
}
|
|
if parsed == nil {
|
|
return nil, fmt.Errorf("%s must be an object", label)
|
|
}
|
|
return parsed, nil
|
|
}
|
|
|
|
func parseStringJSONMap(value string, label string) (map[string]string, error) {
|
|
text := strings.TrimSpace(value)
|
|
if text == "" {
|
|
return nil, fmt.Errorf("%s is empty", label)
|
|
}
|
|
var parsed map[string]string
|
|
if err := json.Unmarshal([]byte(text), &parsed); err != nil {
|
|
return nil, fmt.Errorf("%s must be an object with string values: %w", label, err)
|
|
}
|
|
if parsed == nil {
|
|
return nil, fmt.Errorf("%s must be an object", label)
|
|
}
|
|
return parsed, nil
|
|
}
|