fix(response): tools 需要处理的参数很少 使用 map

This commit is contained in:
Xyfacai
2025-07-20 11:21:57 +08:00
parent 7aa2972c3f
commit c674c3561a
4 changed files with 73 additions and 68 deletions

View File

@@ -603,26 +603,29 @@ type WebSearchOptions struct {
UserLocation json.RawMessage `json:"user_location,omitempty"` UserLocation json.RawMessage `json:"user_location,omitempty"`
} }
// https://platform.openai.com/docs/api-reference/responses/create
type OpenAIResponsesRequest struct { type OpenAIResponsesRequest struct {
Model string `json:"model"` Model string `json:"model"`
Input json.RawMessage `json:"input,omitempty"` Input json.RawMessage `json:"input,omitempty"`
Include json.RawMessage `json:"include,omitempty"` Include json.RawMessage `json:"include,omitempty"`
Instructions json.RawMessage `json:"instructions,omitempty"` Instructions json.RawMessage `json:"instructions,omitempty"`
MaxOutputTokens uint `json:"max_output_tokens,omitempty"` MaxOutputTokens uint `json:"max_output_tokens,omitempty"`
Metadata json.RawMessage `json:"metadata,omitempty"` Metadata json.RawMessage `json:"metadata,omitempty"`
ParallelToolCalls bool `json:"parallel_tool_calls,omitempty"` ParallelToolCalls bool `json:"parallel_tool_calls,omitempty"`
PreviousResponseID string `json:"previous_response_id,omitempty"` PreviousResponseID string `json:"previous_response_id,omitempty"`
Reasoning *Reasoning `json:"reasoning,omitempty"` Reasoning *Reasoning `json:"reasoning,omitempty"`
ServiceTier string `json:"service_tier,omitempty"` ServiceTier string `json:"service_tier,omitempty"`
Store bool `json:"store,omitempty"` Store bool `json:"store,omitempty"`
Stream bool `json:"stream,omitempty"` Stream bool `json:"stream,omitempty"`
Temperature float64 `json:"temperature,omitempty"` Temperature float64 `json:"temperature,omitempty"`
Text json.RawMessage `json:"text,omitempty"` Text json.RawMessage `json:"text,omitempty"`
ToolChoice json.RawMessage `json:"tool_choice,omitempty"` ToolChoice json.RawMessage `json:"tool_choice,omitempty"`
Tools []ResponsesToolsCall `json:"tools,omitempty"` Tools []map[string]any `json:"tools,omitempty"` // 需要处理的参数很少MCP 参数太多不确定,所以用 map
TopP float64 `json:"top_p,omitempty"` TopP float64 `json:"top_p,omitempty"`
Truncation string `json:"truncation,omitempty"` Truncation string `json:"truncation,omitempty"`
User string `json:"user,omitempty"` User string `json:"user,omitempty"`
MaxToolCalls uint `json:"max_tool_calls,omitempty"`
Prompt json.RawMessage `json:"prompt,omitempty"`
} }
type Reasoning struct { type Reasoning struct {
@@ -630,23 +633,23 @@ type Reasoning struct {
Summary string `json:"summary,omitempty"` Summary string `json:"summary,omitempty"`
} }
type ResponsesToolsCall struct { //type ResponsesToolsCall struct {
Type string `json:"type"` // Type string `json:"type"`
// Web Search // // Web Search
UserLocation json.RawMessage `json:"user_location,omitempty"` // UserLocation json.RawMessage `json:"user_location,omitempty"`
SearchContextSize string `json:"search_context_size,omitempty"` // SearchContextSize string `json:"search_context_size,omitempty"`
// File Search // // File Search
VectorStoreIds []string `json:"vector_store_ids,omitempty"` // VectorStoreIds []string `json:"vector_store_ids,omitempty"`
MaxNumResults uint `json:"max_num_results,omitempty"` // MaxNumResults uint `json:"max_num_results,omitempty"`
Filters json.RawMessage `json:"filters,omitempty"` // Filters json.RawMessage `json:"filters,omitempty"`
// Computer Use // // Computer Use
DisplayWidth uint `json:"display_width,omitempty"` // DisplayWidth uint `json:"display_width,omitempty"`
DisplayHeight uint `json:"display_height,omitempty"` // DisplayHeight uint `json:"display_height,omitempty"`
Environment string `json:"environment,omitempty"` // Environment string `json:"environment,omitempty"`
// Function // // Function
Name string `json:"name,omitempty"` // Name string `json:"name,omitempty"`
Description string `json:"description,omitempty"` // Description string `json:"description,omitempty"`
Parameters json.RawMessage `json:"parameters,omitempty"` // Parameters json.RawMessage `json:"parameters,omitempty"`
Function json.RawMessage `json:"function,omitempty"` // Function json.RawMessage `json:"function,omitempty"`
Container json.RawMessage `json:"container,omitempty"` // Container json.RawMessage `json:"container,omitempty"`
} //}

View File

@@ -200,28 +200,28 @@ type OutputTokenDetails struct {
} }
type OpenAIResponsesResponse struct { type OpenAIResponsesResponse struct {
ID string `json:"id"` ID string `json:"id"`
Object string `json:"object"` Object string `json:"object"`
CreatedAt int `json:"created_at"` CreatedAt int `json:"created_at"`
Status string `json:"status"` Status string `json:"status"`
Error *types.OpenAIError `json:"error,omitempty"` Error *types.OpenAIError `json:"error,omitempty"`
IncompleteDetails *IncompleteDetails `json:"incomplete_details,omitempty"` IncompleteDetails *IncompleteDetails `json:"incomplete_details,omitempty"`
Instructions string `json:"instructions"` Instructions string `json:"instructions"`
MaxOutputTokens int `json:"max_output_tokens"` MaxOutputTokens int `json:"max_output_tokens"`
Model string `json:"model"` Model string `json:"model"`
Output []ResponsesOutput `json:"output"` Output []ResponsesOutput `json:"output"`
ParallelToolCalls bool `json:"parallel_tool_calls"` ParallelToolCalls bool `json:"parallel_tool_calls"`
PreviousResponseID string `json:"previous_response_id"` PreviousResponseID string `json:"previous_response_id"`
Reasoning *Reasoning `json:"reasoning"` Reasoning *Reasoning `json:"reasoning"`
Store bool `json:"store"` Store bool `json:"store"`
Temperature float64 `json:"temperature"` Temperature float64 `json:"temperature"`
ToolChoice string `json:"tool_choice"` ToolChoice string `json:"tool_choice"`
Tools []ResponsesToolsCall `json:"tools"` Tools []map[string]any `json:"tools"`
TopP float64 `json:"top_p"` TopP float64 `json:"top_p"`
Truncation string `json:"truncation"` Truncation string `json:"truncation"`
Usage *Usage `json:"usage"` Usage *Usage `json:"usage"`
User json.RawMessage `json:"user"` User json.RawMessage `json:"user"`
Metadata json.RawMessage `json:"metadata"` Metadata json.RawMessage `json:"metadata"`
} }
type IncompleteDetails struct { type IncompleteDetails struct {

View File

@@ -42,7 +42,7 @@ func OaiResponsesHandler(c *gin.Context, info *relaycommon.RelayInfo, resp *http
usage.TotalTokens = responsesResponse.Usage.TotalTokens usage.TotalTokens = responsesResponse.Usage.TotalTokens
// 解析 Tools 用量 // 解析 Tools 用量
for _, tool := range responsesResponse.Tools { for _, tool := range responsesResponse.Tools {
info.ResponsesUsageInfo.BuiltInTools[tool.Type].CallCount++ info.ResponsesUsageInfo.BuiltInTools[common.Interface2String(tool["type"])].CallCount++
} }
return &usage, nil return &usage, nil
} }

View File

@@ -180,16 +180,18 @@ func GenRelayInfoResponses(c *gin.Context, req *dto.OpenAIResponsesRequest) *Rel
} }
if len(req.Tools) > 0 { if len(req.Tools) > 0 {
for _, tool := range req.Tools { for _, tool := range req.Tools {
info.ResponsesUsageInfo.BuiltInTools[tool.Type] = &BuildInToolInfo{ toolType := common.Interface2String(tool["type"])
ToolName: tool.Type, info.ResponsesUsageInfo.BuiltInTools[toolType] = &BuildInToolInfo{
ToolName: toolType,
CallCount: 0, CallCount: 0,
} }
switch tool.Type { switch toolType {
case dto.BuildInToolWebSearchPreview: case dto.BuildInToolWebSearchPreview:
if tool.SearchContextSize == "" { searchContextSize := common.Interface2String(tool["search_context_size"])
tool.SearchContextSize = "medium" if searchContextSize == "" {
searchContextSize = "medium"
} }
info.ResponsesUsageInfo.BuiltInTools[tool.Type].SearchContextSize = tool.SearchContextSize info.ResponsesUsageInfo.BuiltInTools[toolType].SearchContextSize = searchContextSize
} }
} }
} }