first commit
This commit is contained in:
61
plugins/compat/conversion.go
Normal file
61
plugins/compat/conversion.go
Normal file
@@ -0,0 +1,61 @@
|
||||
package compat
|
||||
|
||||
import (
|
||||
"github.com/maximhq/bifrost/core/schemas"
|
||||
)
|
||||
|
||||
// applyParameterConversion rewrites request fields in place for provider compatibility.
|
||||
func applyParameterConversion(req *schemas.BifrostRequest) {
|
||||
if req == nil {
|
||||
return
|
||||
}
|
||||
if req.ChatRequest != nil {
|
||||
normalizeDeveloperRoleForChatRequest(req.ChatRequest)
|
||||
}
|
||||
if req.ResponsesRequest != nil {
|
||||
flattenNamespaceTools(req.ResponsesRequest)
|
||||
}
|
||||
}
|
||||
|
||||
// flattenNamespaceTools expands namespace scoped tools into a flat list of tools.
|
||||
func flattenNamespaceTools(req *schemas.BifrostResponsesRequest) {
|
||||
if req == nil || req.Params == nil {
|
||||
return
|
||||
}
|
||||
// ignore openai models or azure hosted openai models
|
||||
if req.Provider == schemas.OpenAI || (req.Provider == schemas.Azure && !schemas.IsAnthropicModel(req.Model)) {
|
||||
return
|
||||
}
|
||||
hasNamespace := false
|
||||
finalSize := len(req.Params.Tools)
|
||||
for _, tool := range req.Params.Tools {
|
||||
if tool.Type != schemas.ResponsesToolTypeNamespace || tool.ResponsesToolNamespace == nil || tool.ResponsesToolNamespace.Tools == nil {
|
||||
continue
|
||||
}
|
||||
finalSize += len(tool.ResponsesToolNamespace.Tools)
|
||||
hasNamespace = true
|
||||
}
|
||||
if !hasNamespace {
|
||||
return
|
||||
}
|
||||
flattened := make([]schemas.ResponsesTool, 0, finalSize)
|
||||
for _, tool := range req.Params.Tools {
|
||||
if tool.Type != schemas.ResponsesToolTypeNamespace {
|
||||
flattened = append(flattened, tool)
|
||||
} else if tool.ResponsesToolNamespace != nil && tool.ResponsesToolNamespace.Tools != nil {
|
||||
flattened = append(flattened, tool.ResponsesToolNamespace.Tools...)
|
||||
}
|
||||
}
|
||||
req.Params.Tools = flattened
|
||||
}
|
||||
|
||||
func normalizeDeveloperRoleForChatRequest(req *schemas.BifrostChatRequest) {
|
||||
if req.Provider != schemas.Bedrock && req.Provider != schemas.Vertex && req.Provider != schemas.Gemini {
|
||||
return
|
||||
}
|
||||
for i := range req.Input {
|
||||
if req.Input[i].Role == schemas.ChatMessageRoleDeveloper {
|
||||
req.Input[i].Role = schemas.ChatMessageRoleSystem
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user