mirror of
https://github.com/router-for-me/CLIProxyAPI.git
synced 2026-02-03 04:50:52 +08:00
feat(translator): add token counting functionality for Gemini, Claude, and CLI - Introduced `TokenCount` handling across various Codex translators (Gemini, Claude, CLI) with respective implementations. - Added utility methods for token counting and formatting responses. - Integrated `tiktoken-go/tokenizer` library for tokenization. - Updated CodexExecutor with token counting logic to support multiple models including GPT-5 variants. - Refined go.mod and go.sum to include new dependencies. feat(runtime): add token counting functionality across executors - Implemented token counting in OpenAICompatExecutor, QwenExecutor, and IFlowExecutor. - Added utilities for token counting and response formatting using `tiktoken-go/tokenizer`. - Integrated token counting into translators for Gemini, Claude, and Gemini CLI. - Enhanced multiple model support, including GPT-5 variants, for token counting. docs: update environment variable instructions for multi-model support - Added details for setting `ANTHROPIC_DEFAULT_OPUS_MODEL`, `ANTHROPIC_DEFAULT_SONNET_MODEL`, and `ANTHROPIC_DEFAULT_HAIKU_MODEL` for version 2.x.x. - Clarified usage of `ANTHROPIC_MODEL` and `ANTHROPIC_SMALL_FAST_MODEL` for version 1.x.x. - Expanded examples for setting environment variables across different models including Gemini, GPT-5, Claude, and Qwen3.
62 lines
3.1 KiB
Go
62 lines
3.1 KiB
Go
// Package geminiCLI provides response translation functionality for Codex to Gemini CLI API compatibility.
|
|
// This package handles the conversion of Codex API responses into Gemini CLI-compatible
|
|
// JSON format, transforming streaming events and non-streaming responses into the format
|
|
// expected by Gemini CLI API clients.
|
|
package geminiCLI
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
. "github.com/router-for-me/CLIProxyAPI/v6/internal/translator/codex/gemini"
|
|
"github.com/tidwall/sjson"
|
|
)
|
|
|
|
// ConvertCodexResponseToGeminiCLI converts Codex streaming response format to Gemini CLI format.
|
|
// This function processes various Codex event types and transforms them into Gemini-compatible JSON responses.
|
|
// It handles text content, tool calls, and usage metadata, outputting responses that match the Gemini CLI API format.
|
|
// The function wraps each converted response in a "response" object to match the Gemini CLI API structure.
|
|
//
|
|
// Parameters:
|
|
// - ctx: The context for the request, used for cancellation and timeout handling
|
|
// - modelName: The name of the model being used for the response
|
|
// - rawJSON: The raw JSON response from the Codex API
|
|
// - param: A pointer to a parameter object for maintaining state between calls
|
|
//
|
|
// Returns:
|
|
// - []string: A slice of strings, each containing a Gemini-compatible JSON response wrapped in a response object
|
|
func ConvertCodexResponseToGeminiCLI(ctx context.Context, modelName string, originalRequestRawJSON, requestRawJSON, rawJSON []byte, param *any) []string {
|
|
outputs := ConvertCodexResponseToGemini(ctx, modelName, originalRequestRawJSON, requestRawJSON, rawJSON, param)
|
|
newOutputs := make([]string, 0)
|
|
for i := 0; i < len(outputs); i++ {
|
|
json := `{"response": {}}`
|
|
output, _ := sjson.SetRaw(json, "response", outputs[i])
|
|
newOutputs = append(newOutputs, output)
|
|
}
|
|
return newOutputs
|
|
}
|
|
|
|
// ConvertCodexResponseToGeminiCLINonStream converts a non-streaming Codex response to a non-streaming Gemini CLI response.
|
|
// This function processes the complete Codex response and transforms it into a single Gemini-compatible
|
|
// JSON response. It wraps the converted response in a "response" object to match the Gemini CLI API structure.
|
|
//
|
|
// Parameters:
|
|
// - ctx: The context for the request, used for cancellation and timeout handling
|
|
// - modelName: The name of the model being used for the response
|
|
// - rawJSON: The raw JSON response from the Codex API
|
|
// - param: A pointer to a parameter object for the conversion
|
|
//
|
|
// Returns:
|
|
// - string: A Gemini-compatible JSON response wrapped in a response object
|
|
func ConvertCodexResponseToGeminiCLINonStream(ctx context.Context, modelName string, originalRequestRawJSON, requestRawJSON, rawJSON []byte, param *any) string {
|
|
// log.Debug(string(rawJSON))
|
|
strJSON := ConvertCodexResponseToGeminiNonStream(ctx, modelName, originalRequestRawJSON, requestRawJSON, rawJSON, param)
|
|
json := `{"response": {}}`
|
|
strJSON, _ = sjson.SetRaw(json, "response", strJSON)
|
|
return strJSON
|
|
}
|
|
|
|
func GeminiCLITokenCount(ctx context.Context, count int64) string {
|
|
return fmt.Sprintf(`{"totalTokens":%d,"promptTokensDetails":[{"modality":"TEXT","tokenCount":%d}]}`, count, count)
|
|
}
|