Skip to content

Que: GeminiEmbedding with SemanticChunker sending a lot of requests #434

Description

@kosecki123

Question
We are using OpenAIEmbedding in combo with SemanticChunker which works good, same input after switching to GeminiEmbeddings on default model yields up to 20x more requests to Gemini API, making it slow. Is that by design or a bug?

Additional Context
Test code:

"""Smoke test for chonkie GeminiEmbeddings + SemanticChunker."""

from __future__ import annotations

import argparse
import logging
from pathlib import Path
from typing import Any, Iterable, Optional

from chonkie import SemanticChunker
from chonkie.embeddings import GeminiEmbeddings
from dotenv import load_dotenv

load_dotenv()

SAMPLE_TEXT = """\
This is a short sample used to validate the Gemini embeddings integration.
If embeddings succeed, we should be able to create a few semantic chunks.
This paragraph is only here to add a little bit of length and variation.
"""


def _load_text(input_path: Optional[Path], repeat: int) -> str:
    if input_path:
        return input_path.read_text(encoding="utf-8")
    return SAMPLE_TEXT * max(1, repeat)


def _try_embedding_call(embeddings: Any, text: str) -> None:
    if hasattr(embeddings, "embed_query"):
        vector = embeddings.embed_query(text)
        logging.info("embed_query OK (dim=%s)", len(vector))
        return
    if hasattr(embeddings, "embed_documents"):
        vectors = embeddings.embed_documents([text])
        dim = len(vectors[0]) if vectors else 0
        logging.info("embed_documents OK (dim=%s)", dim)
        return
    logging.warning("No embed_query/embed_documents method found on GeminiEmbeddings")


def _preview_chunks(chunks: Iterable[Any], max_chunks: int) -> None:
    for i, chunk in enumerate(chunks, start=1):
        if i > max_chunks:
            break
        text = getattr(chunk, "text", str(chunk))
        preview = text.replace("\n", " ")[:200]
        logging.info("Chunk %s | chars=%s | preview=%s", i, len(text), preview)


def main() -> None:
    parser = argparse.ArgumentParser(
        description="Smoke test GeminiEmbeddings and SemanticChunker directly."
    )
    parser.add_argument("--input", type=Path, help="UTF-8 text file to chunk.")
    parser.add_argument("--repeat", type=int, default=3)
    parser.add_argument("--model", default="gemini-embedding-001")
    parser.add_argument("--threshold", type=float, default=0.7)
    parser.add_argument("--min-chunk-size", type=int, default=300)
    parser.add_argument("--chunk-size", type=int, default=1000)
    parser.add_argument("--min-sentences-per-chunk", type=int, default=2)
    parser.add_argument("--skip-window", type=int, default=1)
    parser.add_argument("--max-chunks", type=int, default=5)
    args = parser.parse_args()

    logging.basicConfig(
        level=logging.INFO,
        format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
    )

    content = _load_text(args.input, args.repeat)
    embeddings = GeminiEmbeddings(model=args.model)

    logging.info("Running direct embedding call")
    _try_embedding_call(embeddings, "Quick embedding smoke test.")

    logging.info("Running SemanticChunker with GeminiEmbeddings")
    chunker = SemanticChunker(
        embedding_model=embeddings,
        threshold=args.threshold,
        min_chunk_size=args.min_chunk_size,
        chunk_size=args.chunk_size,
        min_sentences_per_chunk=args.min_sentences_per_chunk,
        skip_window=args.skip_window,
    )

    chunks = chunker(content)
    logging.info("Chunk count: %s", len(chunks))
    _preview_chunks(chunks, args.max_chunks)


if __name__ == "__main__":
    main()

output:

2026-01-06 15:55:54,308 - google_genai._api_client - WARNING - Both GOOGLE_API_KEY and GEMINI_API_KEY are set. Using GOOGLE_API_KEY.
2026-01-06 15:55:54,342 - root - INFO - Running direct embedding call
2026-01-06 15:55:54,342 - root - WARNING - No embed_query/embed_documents method found on GeminiEmbeddings
2026-01-06 15:55:54,342 - root - INFO - Running SemanticChunker with GeminiEmbeddings
2026-01-06 15:55:54,488 - httpx - INFO - HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:countTokens "HTTP/1.1 200 OK"
2026-01-06 15:55:54,601 - httpx - INFO - HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:countTokens "HTTP/1.1 200 OK"
2026-01-06 15:55:54,667 - httpx - INFO - HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:countTokens "HTTP/1.1 200 OK"
2026-01-06 15:55:54,777 - httpx - INFO - HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:countTokens "HTTP/1.1 200 OK"
2026-01-06 15:55:54,877 - httpx - INFO - HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:countTokens "HTTP/1.1 200 OK"
2026-01-06 15:55:54,962 - httpx - INFO - HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:countTokens "HTTP/1.1 200 OK"
2026-01-06 15:55:55,067 - httpx - INFO - HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:countTokens "HTTP/1.1 200 OK"
2026-01-06 15:55:55,173 - httpx - INFO - HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:countTokens "HTTP/1.1 200 OK"
2026-01-06 15:55:55,267 - httpx - INFO - HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:countTokens "HTTP/1.1 200 OK"
2026-01-06 15:55:55,344 - httpx - INFO - HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:countTokens "HTTP/1.1 200 OK"
2026-01-06 15:55:55,456 - httpx - INFO - HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:countTokens "HTTP/1.1 200 OK"
2026-01-06 15:55:55,549 - httpx - INFO - HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:countTokens "HTTP/1.1 200 OK"
2026-01-06 15:55:55,657 - httpx - INFO - HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:countTokens "HTTP/1.1 200 OK"
2026-01-06 15:55:55,753 - httpx - INFO - HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:countTokens "HTTP/1.1 200 OK"
2026-01-06 15:55:55,846 - httpx - INFO - HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:countTokens "HTTP/1.1 200 OK"
2026-01-06 15:55:56,144 - httpx - INFO - HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:batchEmbedContents "HTTP/1.1 200 OK"
2026-01-06 15:55:56,430 - httpx - INFO - HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:batchEmbedContents "HTTP/1.1 200 OK"
2026-01-06 15:55:56,707 - httpx - INFO - HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:batchEmbedContents "HTTP/1.1 200 OK"
2026-01-06 15:55:56,973 - httpx - INFO - HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:batchEmbedContents "HTTP/1.1 200 OK"
2026-01-06 15:55:57,297 - httpx - INFO - HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:batchEmbedContents "HTTP/1.1 200 OK"
2026-01-06 15:55:57,601 - httpx - INFO - HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:batchEmbedContents "HTTP/1.1 200 OK"
2026-01-06 15:55:57,664 - httpx - INFO - HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:countTokens "HTTP/1.1 200 OK"
2026-01-06 15:55:57,769 - httpx - INFO - HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:countTokens "HTTP/1.1 200 OK"
2026-01-06 15:55:57,852 - httpx - INFO - HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:countTokens "HTTP/1.1 200 OK"
2026-01-06 15:55:57,943 - httpx - INFO - HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:countTokens "HTTP/1.1 200 OK"
2026-01-06 15:55:58,016 - httpx - INFO - HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:countTokens "HTTP/1.1 200 OK"
2026-01-06 15:55:58,122 - httpx - INFO - HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:countTokens "HTTP/1.1 200 OK"
2026-01-06 15:55:58,399 - httpx - INFO - HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:batchEmbedContents "HTTP/1.1 200 OK"
2026-01-06 15:55:58,656 - httpx - INFO - HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:batchEmbedContents "HTTP/1.1 200 OK"
2026-01-06 15:55:58,917 - httpx - INFO - HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:batchEmbedContents "HTTP/1.1 200 OK"
2026-01-06 15:55:59,239 - httpx - INFO - HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:batchEmbedContents "HTTP/1.1 200 OK"
2026-01-06 15:55:59,549 - httpx - INFO - HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:batchEmbedContents "HTTP/1.1 200 OK"
2026-01-06 15:55:59,818 - httpx - INFO - HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:batchEmbedContents "HTTP/1.1 200 OK"
2026-01-06 15:55:59,898 - httpx - INFO - HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:countTokens "HTTP/1.1 200 OK"
2026-01-06 15:56:00,132 - httpx - INFO - HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:countTokens "HTTP/1.1 200 OK"
2026-01-06 15:56:00,232 - httpx - INFO - HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:countTokens "HTTP/1.1 200 OK"
2026-01-06 15:56:00,524 - httpx - INFO - HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:batchEmbedContents "HTTP/1.1 200 OK"
2026-01-06 15:56:00,783 - httpx - INFO - HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:batchEmbedContents "HTTP/1.1 200 OK"
2026-01-06 15:56:01,058 - httpx - INFO - HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:batchEmbedContents "HTTP/1.1 200 OK"
2026-01-06 15:56:01,065 - root - INFO - Chunk count: 2
2026-01-06 15:56:01,066 - root - INFO - Chunk 1 | chars=593 | preview=This is a short sample used to validate the Gemini embeddings integration. If embeddings succeed, we should be able to create a few semantic chunks. This paragraph is only here to add a little bit of 
2026-01-06 15:56:01,066 - root - INFO - Chunk 2 | chars=73 | preview=This paragraph is only here to add a little bit of length and variation. 

Metadata

Metadata

Assignees

Labels

questionFurther information is requested

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions