"""Embedding client for Icarus.
Provides document embedding vectors via Ollama.
Sovereign: Zero imports from costco_route.
"""
import httpx
from icarus.core.config.staging import OLLAMA_BASE_URL, OLLAMA_EMBED_MODEL as EMBEDDING_MODEL
def get_embedding(text: str, timeout: float = 30.0) -> list[float]:
"""Get an embedding vector from Ollama.
Args:
text: Text to embed
timeout: Request timeout in seconds
Returns:
List of floats (embedding vector)
"""
payload = {
"model": EMBEDDING_MODEL or "nomic-embed-text",
"prompt": text
}
try:
with httpx.Client(timeout=timeout) as client:
resp = client.post(
f"{OLLAMA_BASE_URL}/api/embeddings",
json=payload
)
resp.raise_for_status()
return resp.json()["embedding"]
except Exception as e:
print(f"Embedding error: {e}")
# Return zero vector as fallback (will not match anything)
return [0.0] * 768 # nomic-embed-text dimension
async def get_embedding_async(text: str, timeout: float = 30.0) -> list[float]:
"""Async version of get_embedding."""
payload = {
"model": EMBEDDING_MODEL or "nomic-embed-text",
"prompt": text
}
try:
async with httpx.AsyncClient(timeout=timeout) as client:
resp = await client.post(
f"{OLLAMA_BASE_URL}/api/embeddings",
json=payload
)
resp.raise_for_status()
return resp.json()["embedding"]
except Exception as e:
print(f"Embedding error: {e}")
return [0.0] * 768