Skip to main content

gproxy_transform/transform/count_tokens/
gemini_to_openai.rs

1//! Gemini -> OpenAI count-token transforms.
2
3use crate::protocol::{gemini, openai};
4use crate::transform::{TransformContext, TransformError};
5
6use super::common;
7
8pub fn request(
9    input: gemini::CountTokensRequest,
10    _: &TransformContext,
11) -> Result<openai::ResponseInputTokensRequest, TransformError> {
12    let request = common::split_gemini_count_token_request(input);
13
14    Ok(openai::ResponseInputTokensRequest {
15        conversation: None,
16        input: common::text_to_openai_input(common::gemini_contents_to_text(request.contents)),
17        instructions: request.system_instruction.map(common::gemini_content_text),
18        model: Some(common::gemini_model_string(request.model).into()),
19        parallel_tool_calls: None,
20        personality: None,
21        previous_response_id: None,
22        prompt_cache_options: None,
23        reasoning: common::gemini_generation_to_openai_reasoning(
24            request.generation_config.as_ref(),
25        ),
26        service_tier: common::gemini_service_tier_to_openai(request.service_tier),
27        text: common::gemini_generation_to_openai_text(request.generation_config.as_ref()),
28        tool_choice: common::gemini_tool_config_to_openai(request.tool_config),
29        tools: common::gemini_tools_to_openai(request.tools),
30        truncation: None,
31        extra: Default::default(),
32    })
33}
34
35pub fn response(
36    input: gemini::CountTokensResponse,
37    _: &TransformContext,
38) -> openai::ResponseInputTokensResponse {
39    openai::ResponseInputTokensResponse {
40        input_tokens: input
41            .total_tokens
42            .map(common::i32_to_u32)
43            .unwrap_or_default(),
44        object: openai::ResponseInputTokensObjectType::ResponseInputTokens,
45        extra: Default::default(),
46    }
47}