38 lines
1.2 KiB
Go
38 lines
1.2 KiB
Go
package deepseek
|
|
|
|
import (
|
|
"github.com/QuantumNous/new-api/relaykit/dto"
|
|
|
|
"github.com/tidwall/gjson"
|
|
)
|
|
|
|
// responsesToolUsage bills the Search and Fetch API calls DeepSeek runs for
|
|
// the Responses web_search tool from the web_search_call items of the whole
|
|
// response (output on non-stream bodies, response.output on terminal stream
|
|
// frames); its usage reports tokens only. An open_page action is a Fetch call,
|
|
// any other action a Search call, and a failed call is free. The counts
|
|
// replace the web_search_call items counted under the Search key while the
|
|
// stream was running. An empty output proves nothing, so those counts stay.
|
|
func responsesToolUsage(raw []byte) map[string]int {
|
|
output := gjson.GetBytes(raw, "output")
|
|
if !output.Exists() {
|
|
output = gjson.GetBytes(raw, "response.output")
|
|
}
|
|
items := output.Array()
|
|
if !output.IsArray() || len(items) == 0 {
|
|
return nil
|
|
}
|
|
counts := map[string]int{SearchToolPriceKey: 0, FetchToolPriceKey: 0}
|
|
for _, item := range items {
|
|
if item.Get("type").String() != dto.BuildInCallWebSearchCall || item.Get("status").String() != "completed" {
|
|
continue
|
|
}
|
|
if item.Get("action.type").String() == "open_page" {
|
|
counts[FetchToolPriceKey]++
|
|
} else {
|
|
counts[SearchToolPriceKey]++
|
|
}
|
|
}
|
|
return counts
|
|
}
|