dto.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. package aws
  2. import (
  3. "github.com/QuantumNous/new-api/dto"
  4. )
  5. type AwsClaudeRequest struct {
  6. // AnthropicVersion should be "bedrock-2023-05-31"
  7. AnthropicVersion string `json:"anthropic_version"`
  8. System any `json:"system,omitempty"`
  9. Messages []dto.ClaudeMessage `json:"messages"`
  10. MaxTokens uint `json:"max_tokens,omitempty"`
  11. Temperature *float64 `json:"temperature,omitempty"`
  12. TopP float64 `json:"top_p,omitempty"`
  13. TopK int `json:"top_k,omitempty"`
  14. StopSequences []string `json:"stop_sequences,omitempty"`
  15. Tools any `json:"tools,omitempty"`
  16. ToolChoice any `json:"tool_choice,omitempty"`
  17. Thinking *dto.Thinking `json:"thinking,omitempty"`
  18. }
  19. func copyRequest(req *dto.ClaudeRequest) *AwsClaudeRequest {
  20. return &AwsClaudeRequest{
  21. AnthropicVersion: "bedrock-2023-05-31",
  22. System: req.System,
  23. Messages: req.Messages,
  24. MaxTokens: req.MaxTokens,
  25. Temperature: req.Temperature,
  26. TopP: req.TopP,
  27. TopK: req.TopK,
  28. StopSequences: req.StopSequences,
  29. Tools: req.Tools,
  30. ToolChoice: req.ToolChoice,
  31. Thinking: req.Thinking,
  32. }
  33. }
  34. // NovaMessage Nova模型使用messages-v1格式
  35. type NovaMessage struct {
  36. Role string `json:"role"`
  37. Content []NovaContent `json:"content"`
  38. }
  39. type NovaContent struct {
  40. Text string `json:"text"`
  41. }
  42. type NovaRequest struct {
  43. SchemaVersion string `json:"schemaVersion"` // 请求版本,例如 "1.0"
  44. Messages []NovaMessage `json:"messages"` // 对话消息列表
  45. InferenceConfig *NovaInferenceConfig `json:"inferenceConfig,omitempty"` // 推理配置,可选
  46. }
  47. type NovaInferenceConfig struct {
  48. MaxTokens int `json:"maxTokens,omitempty"` // 最大生成的 token 数
  49. Temperature float64 `json:"temperature,omitempty"` // 随机性 (默认 0.7, 范围 0-1)
  50. TopP float64 `json:"topP,omitempty"` // nucleus sampling (默认 0.9, 范围 0-1)
  51. TopK int `json:"topK,omitempty"` // 限制候选 token 数 (默认 50, 范围 0-128)
  52. StopSequences []string `json:"stopSequences,omitempty"` // 停止生成的序列
  53. }
  54. // 转换OpenAI请求为Nova格式
  55. func convertToNovaRequest(req *dto.GeneralOpenAIRequest) *NovaRequest {
  56. novaMessages := make([]NovaMessage, len(req.Messages))
  57. for i, msg := range req.Messages {
  58. novaMessages[i] = NovaMessage{
  59. Role: msg.Role,
  60. Content: []NovaContent{{Text: msg.StringContent()}},
  61. }
  62. }
  63. novaReq := &NovaRequest{
  64. SchemaVersion: "messages-v1",
  65. Messages: novaMessages,
  66. }
  67. // 设置推理配置
  68. if req.MaxTokens != 0 || (req.Temperature != nil && *req.Temperature != 0) || req.TopP != 0 || req.TopK != 0 || req.Stop != nil {
  69. novaReq.InferenceConfig = &NovaInferenceConfig{}
  70. if req.MaxTokens != 0 {
  71. novaReq.InferenceConfig.MaxTokens = int(req.MaxTokens)
  72. }
  73. if req.Temperature != nil && *req.Temperature != 0 {
  74. novaReq.InferenceConfig.Temperature = *req.Temperature
  75. }
  76. if req.TopP != 0 {
  77. novaReq.InferenceConfig.TopP = req.TopP
  78. }
  79. if req.TopK != 0 {
  80. novaReq.InferenceConfig.TopK = req.TopK
  81. }
  82. if req.Stop != nil {
  83. if stopSequences := parseStopSequences(req.Stop); len(stopSequences) > 0 {
  84. novaReq.InferenceConfig.StopSequences = stopSequences
  85. }
  86. }
  87. }
  88. return novaReq
  89. }
  90. // parseStopSequences 解析停止序列,支持字符串或字符串数组
  91. func parseStopSequences(stop any) []string {
  92. if stop == nil {
  93. return nil
  94. }
  95. switch v := stop.(type) {
  96. case string:
  97. if v != "" {
  98. return []string{v}
  99. }
  100. case []string:
  101. return v
  102. case []interface{}:
  103. var sequences []string
  104. for _, item := range v {
  105. if str, ok := item.(string); ok && str != "" {
  106. sequences = append(sequences, str)
  107. }
  108. }
  109. return sequences
  110. }
  111. return nil
  112. }