diff --git a/relay/channel/openai/relay-openai.go b/relay/channel/openai/relay-openai.go index d6a354f71a22..788da980b423 100644 --- a/relay/channel/openai/relay-openai.go +++ b/relay/channel/openai/relay-openai.go @@ -240,7 +240,12 @@ func OpenaiHandler(c *gin.Context, info *relaycommon.RelayInfo, resp *http.Respo completionTokens := simpleResponse.Usage.CompletionTokens if completionTokens == 0 { for _, choice := range simpleResponse.Choices { - ctkm := service.CountTextToken(choice.Message.StringContent()+choice.Message.GetReasoningContent(), info.UpstreamModelName) + textContent := choice.Message.StringContent() + choice.Message.GetReasoningContent() + // Count tool call name/arguments too, otherwise completion tokens are undercounted when upstream omits usage for tool-calling responses. + for _, tool := range choice.Message.ParseToolCalls() { + textContent += tool.Function.Name + tool.Function.Arguments + } + ctkm := service.CountTextToken(textContent, info.UpstreamModelName) completionTokens += ctkm } }