From 0ddb83a2791524571a30feb5dbdaae9774fbe0fc Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 4 Jan 2026 10:04:01 +0000 Subject: [PATCH 1/7] Initial plan From ad077ba8555d58c3d8f037a17c65d64fea981c4e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 4 Jan 2026 10:07:23 +0000 Subject: [PATCH 2/7] Add dimensions parameter support to embedding API Co-authored-by: gszecsenyi <363452+gszecsenyi@users.noreply.github.com> --- server/main.py | 2 ++ server/models.py | 1 + worker/embedder.py | 14 +++++++++----- worker/worker.py | 3 ++- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/server/main.py b/server/main.py index 09a085b..05f3db7 100644 --- a/server/main.py +++ b/server/main.py @@ -164,6 +164,8 @@ async def openai_embeddings(request: OpenAIEmbeddingRequest, token: str = Depend {"id": "task-id"} - poll GET /tasks/{id} for result """ payload = {"text": request.input, "model": request.model} + if request.dimensions is not None: + payload["dimensions"] = request.dimensions task_id = await database.create_task("embedding", payload) max_wait = 30 # Fixed wait time for embeddings deadline = time.time() + max_wait diff --git a/server/models.py b/server/models.py index 0615062..8396822 100644 --- a/server/models.py +++ b/server/models.py @@ -19,6 +19,7 @@ class OpenAIEmbeddingResponse(BaseModel): class OpenAIEmbeddingRequest(BaseModel): input: str # text to embed model: str # Remove default value + dimensions: Optional[int] = None # Optional embedding dimension size # Chat completion models diff --git a/worker/embedder.py b/worker/embedder.py index 87f0400..9341d67 100644 --- a/worker/embedder.py +++ b/worker/embedder.py @@ -2,14 +2,18 @@ from config import OLLAMA_URL, EMBEDDING_MODEL -def get_embedding(text: str, model: str = None) -> list[float]: +def get_embedding(text: str, model: str = None, dimensions: int = None) -> list[float]: """Get embedding from Ollama API.""" + payload = { + "model": model or EMBEDDING_MODEL, + "prompt": text, + } + if dimensions is not None: + payload["dimensions"] = dimensions + response = requests.post( f"{OLLAMA_URL}/api/embeddings", - json={ - "model": model or EMBEDDING_MODEL, - "prompt": text, - }, + json=payload, timeout=60, ) response.raise_for_status() diff --git a/worker/worker.py b/worker/worker.py index 8371761..4138245 100644 --- a/worker/worker.py +++ b/worker/worker.py @@ -50,9 +50,10 @@ def process_embedding_task(task_id: str, payload: dict): if not isinstance(text, str): raise ValueError("Embedding task payload must include a 'text' field of type string.") model = payload.get("model") + dimensions = payload.get("dimensions") print(f"[embedding] {task_id}: {text[:50]}...") - embedding = get_embedding(text, model) + embedding = get_embedding(text, model, dimensions) complete_task(task_id, embedding) print(f"[embedding] {task_id} completed (dim: {len(embedding)})") From 7d40cadf0bef2bda8f4621bcdc8266916968950e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 4 Jan 2026 10:08:50 +0000 Subject: [PATCH 3/7] Add validation for dimensions parameter (must be positive) Co-authored-by: gszecsenyi <363452+gszecsenyi@users.noreply.github.com> --- server/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/models.py b/server/models.py index 8396822..8636a99 100644 --- a/server/models.py +++ b/server/models.py @@ -19,7 +19,7 @@ class OpenAIEmbeddingResponse(BaseModel): class OpenAIEmbeddingRequest(BaseModel): input: str # text to embed model: str # Remove default value - dimensions: Optional[int] = None # Optional embedding dimension size + dimensions: Optional[int] = Field(default=None, gt=0) # Optional embedding dimension size # Chat completion models From 3f6e9e080748b174e732c9fbe591d6b59ebd6981 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 4 Jan 2026 10:10:39 +0000 Subject: [PATCH 4/7] Update README to document dimensions parameter Co-authored-by: gszecsenyi <363452+gszecsenyi@users.noreply.github.com> --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index fe60bfe..11607bb 100644 --- a/README.md +++ b/README.md @@ -82,6 +82,13 @@ response = client.embeddings.create( ) embedding = response.data[0].embedding + +# Optional: Specify embedding dimensions (if model supports it) +response = client.embeddings.create( + input="The quick brown fox jumps over the lazy dog", + model="nomic-embed-text", + dimensions=768 +) ``` **Response (OpenAI format):** @@ -165,6 +172,7 @@ All endpoints require `Authorization: Bearer your-secret-token` header. |-------|------|---------|-------------| | `input` | string | required | Text to embed | | `model` | string | `nomic-embed-text` | Model name (optional) | +| `dimensions` | integer | null | Embedding dimension size (optional, must be positive) | `POST /v1/chat/completions` From 4a3b9f1e06f2663acb40e11ce2b7eb8fb7bbdaf5 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 4 Jan 2026 10:29:45 +0000 Subject: [PATCH 5/7] Clarify dimensions parameter limitation in documentation Co-authored-by: gszecsenyi <363452+gszecsenyi@users.noreply.github.com> --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 11607bb..d283769 100644 --- a/README.md +++ b/README.md @@ -84,6 +84,8 @@ response = client.embeddings.create( embedding = response.data[0].embedding # Optional: Specify embedding dimensions (if model supports it) +# Note: Most Ollama models have fixed dimensions and will ignore this parameter. +# For example, nomic-embed-text always outputs 768 dimensions. response = client.embeddings.create( input="The quick brown fox jumps over the lazy dog", model="nomic-embed-text", @@ -100,6 +102,8 @@ response = client.embeddings.create( } ``` +**Note on dimensions parameter:** While the API accepts the `dimensions` parameter for OpenAI compatibility, most Ollama embedding models have fixed output dimensions and will ignore this parameter. For example, `nomic-embed-text` always returns 768-dimensional embeddings regardless of the dimensions value. + The server waits up to 30 seconds for the result. If processing takes longer, it returns a task ID for polling. #### Chat Completions @@ -172,7 +176,7 @@ All endpoints require `Authorization: Bearer your-secret-token` header. |-------|------|---------|-------------| | `input` | string | required | Text to embed | | `model` | string | `nomic-embed-text` | Model name (optional) | -| `dimensions` | integer | null | Embedding dimension size (optional, must be positive) | +| `dimensions` | integer | null | Embedding dimension size (optional, must be positive). **Note:** Most Ollama models have fixed dimensions and ignore this parameter. | `POST /v1/chat/completions` From 98dfc94d4dffb709793a1d4870913f8954901cd3 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 4 Jan 2026 10:39:35 +0000 Subject: [PATCH 6/7] Update docs: dimensions parameter IS supported in Ollama v0.11.11+ Co-authored-by: gszecsenyi <363452+gszecsenyi@users.noreply.github.com> --- README.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index d283769..05ade9f 100644 --- a/README.md +++ b/README.md @@ -83,13 +83,12 @@ response = client.embeddings.create( embedding = response.data[0].embedding -# Optional: Specify embedding dimensions (if model supports it) -# Note: Most Ollama models have fixed dimensions and will ignore this parameter. -# For example, nomic-embed-text always outputs 768 dimensions. +# Optional: Specify embedding dimensions (requires Ollama v0.11.11+) +# Works with models that support dynamic dimensions (e.g., Qwen3 Embedding with MRL) response = client.embeddings.create( input="The quick brown fox jumps over the lazy dog", model="nomic-embed-text", - dimensions=768 + dimensions=512 # Some models support custom dimensions ) ``` @@ -102,7 +101,10 @@ response = client.embeddings.create( } ``` -**Note on dimensions parameter:** While the API accepts the `dimensions` parameter for OpenAI compatibility, most Ollama embedding models have fixed output dimensions and will ignore this parameter. For example, `nomic-embed-text` always returns 768-dimensional embeddings regardless of the dimensions value. +**Note on dimensions parameter:** The `dimensions` parameter is supported in Ollama v0.11.11 and later. However, model support varies: +- **Models with MRL (Matryoshka Representation Learning)** like Qwen3 Embedding support dynamic dimensions +- **Fixed-dimension models** like `nomic-embed-text` (768) and `all-minilm` (384) will use their default dimensions regardless of this parameter +- Check your model's documentation to see if it supports custom dimensions The server waits up to 30 seconds for the result. If processing takes longer, it returns a task ID for polling. @@ -176,7 +178,7 @@ All endpoints require `Authorization: Bearer your-secret-token` header. |-------|------|---------|-------------| | `input` | string | required | Text to embed | | `model` | string | `nomic-embed-text` | Model name (optional) | -| `dimensions` | integer | null | Embedding dimension size (optional, must be positive). **Note:** Most Ollama models have fixed dimensions and ignore this parameter. | +| `dimensions` | integer | null | Embedding dimension size (optional, must be positive). Requires Ollama v0.11.11+. Support varies by model. | `POST /v1/chat/completions` From 16da083dbc919ee700a00c43b927ed1c45da1a96 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 4 Jan 2026 10:40:48 +0000 Subject: [PATCH 7/7] Fix example to use model that supports dynamic dimensions Co-authored-by: gszecsenyi <363452+gszecsenyi@users.noreply.github.com> --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 05ade9f..201dbc1 100644 --- a/README.md +++ b/README.md @@ -84,11 +84,11 @@ response = client.embeddings.create( embedding = response.data[0].embedding # Optional: Specify embedding dimensions (requires Ollama v0.11.11+) -# Works with models that support dynamic dimensions (e.g., Qwen3 Embedding with MRL) +# Example with a model that supports dynamic dimensions response = client.embeddings.create( input="The quick brown fox jumps over the lazy dog", - model="nomic-embed-text", - dimensions=512 # Some models support custom dimensions + model="qwen3-embedding", # Use a model with MRL support + dimensions=512 # Custom dimension size ) ```