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.
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:
output: