Skip to content

Commit ca108df

Browse files
committed
Add Ollama Cloud auth wiring and deploy-time provider env support
1 parent 64bd6a3 commit ca108df

4 files changed

Lines changed: 36 additions & 3 deletions

File tree

.env.example

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ MDE_GEMINI_SEMANTIC_MODEL=gemini-2.5-flash
2424

2525
# Ollama provider settings
2626
MDE_OLLAMA_HOST=http://localhost:11434
27+
OLLAMA_API_KEY=
28+
MDE_OLLAMA_API_KEY=
2729
MDE_OLLAMA_EMBEDDING_MODEL=nomic-embed-text
2830
MDE_OLLAMA_SEMANTIC_MODEL=llama3.1
2931

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ RUN python -m pip install --no-cache-dir --upgrade pip \
1919
&& python -m pip install --no-cache-dir \
2020
--index-url https://download.pytorch.org/whl/cpu \
2121
--extra-index-url https://pypi.org/simple \
22-
.
22+
".[ollama]"
2323

2424
RUN chmod +x /app/scripts/docker-entrypoint.sh
2525

scripts/deploy_gcp_cloud_run.sh

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ DB_URL_SECRET_NAME="${DB_URL_SECRET_NAME:-orbit-db-url}"
2626
DB_URL_SECRET_VERSION="${DB_URL_SECRET_VERSION:-latest}"
2727
JWT_SECRET_NAME="${JWT_SECRET_NAME:-orbit-jwt-secret}"
2828
JWT_SECRET_VERSION="${JWT_SECRET_VERSION:-latest}"
29+
OLLAMA_API_KEY_SECRET_NAME="${OLLAMA_API_KEY_SECRET_NAME:-}"
30+
OLLAMA_API_KEY_SECRET_VERSION="${OLLAMA_API_KEY_SECRET_VERSION:-latest}"
2931

3032
ORBIT_ENV="${ORBIT_ENV:-production}"
3133
ORBIT_JWT_ISSUER="${ORBIT_JWT_ISSUER:-orbit}"
@@ -53,6 +55,11 @@ ORBIT_MAX_BATCH_ITEMS="${ORBIT_MAX_BATCH_ITEMS:-100}"
5355
ORBIT_CORS_ALLOW_ORIGINS="${ORBIT_CORS_ALLOW_ORIGINS:-https://your-frontend.vercel.app}"
5456
ORBIT_OTEL_SERVICE_NAME="${ORBIT_OTEL_SERVICE_NAME:-orbit-api}"
5557
ORBIT_OTEL_EXPORTER_ENDPOINT="${ORBIT_OTEL_EXPORTER_ENDPOINT:-}"
58+
MDE_EMBEDDING_PROVIDER="${MDE_EMBEDDING_PROVIDER:-deterministic}"
59+
MDE_SEMANTIC_PROVIDER="${MDE_SEMANTIC_PROVIDER:-context}"
60+
MDE_OLLAMA_HOST="${MDE_OLLAMA_HOST:-}"
61+
MDE_OLLAMA_EMBEDDING_MODEL="${MDE_OLLAMA_EMBEDDING_MODEL:-nomic-embed-text}"
62+
MDE_OLLAMA_SEMANTIC_MODEL="${MDE_OLLAMA_SEMANTIC_MODEL:-llama3.1}"
5663

5764
env_vars=(
5865
"ORBIT_API_HOST=0.0.0.0"
@@ -83,11 +90,18 @@ env_vars=(
8390
"ORBIT_MAX_BATCH_ITEMS=${ORBIT_MAX_BATCH_ITEMS}"
8491
"ORBIT_CORS_ALLOW_ORIGINS=${ORBIT_CORS_ALLOW_ORIGINS}"
8592
"ORBIT_OTEL_SERVICE_NAME=${ORBIT_OTEL_SERVICE_NAME}"
93+
"MDE_EMBEDDING_PROVIDER=${MDE_EMBEDDING_PROVIDER}"
94+
"MDE_SEMANTIC_PROVIDER=${MDE_SEMANTIC_PROVIDER}"
95+
"MDE_OLLAMA_EMBEDDING_MODEL=${MDE_OLLAMA_EMBEDDING_MODEL}"
96+
"MDE_OLLAMA_SEMANTIC_MODEL=${MDE_OLLAMA_SEMANTIC_MODEL}"
8697
)
8798

8899
if [[ -n "${ORBIT_OTEL_EXPORTER_ENDPOINT}" ]]; then
89100
env_vars+=("ORBIT_OTEL_EXPORTER_ENDPOINT=${ORBIT_OTEL_EXPORTER_ENDPOINT}")
90101
fi
102+
if [[ -n "${MDE_OLLAMA_HOST}" ]]; then
103+
env_vars+=("MDE_OLLAMA_HOST=${MDE_OLLAMA_HOST}")
104+
fi
91105

92106
gcloud_args=(
93107
run
@@ -117,6 +131,13 @@ gcloud_args=(
117131
"MDE_DATABASE_URL=${DB_URL_SECRET_NAME}:${DB_URL_SECRET_VERSION},ORBIT_JWT_SECRET=${JWT_SECRET_NAME}:${JWT_SECRET_VERSION}"
118132
)
119133

134+
if [[ -n "${OLLAMA_API_KEY_SECRET_NAME}" ]]; then
135+
gcloud_args+=(
136+
--set-secrets
137+
"OLLAMA_API_KEY=${OLLAMA_API_KEY_SECRET_NAME}:${OLLAMA_API_KEY_SECRET_VERSION}"
138+
)
139+
fi
140+
120141
set_env_vars_value="^#^$(IFS='#'; echo "${env_vars[*]}")"
121142
gcloud_args+=(
122143
--set-env-vars

src/memory_engine/providers/adapters.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,12 @@ def __init__(self, model: str | None = None, host: str | None = None) -> None:
276276
if client_cls is None:
277277
msg = "ollama.Client class is unavailable."
278278
raise RuntimeError(msg)
279-
self._client: Any = client_cls(host=host or os.getenv("MDE_OLLAMA_HOST"))
279+
resolved_host = host or os.getenv("MDE_OLLAMA_HOST")
280+
api_key = os.getenv("MDE_OLLAMA_API_KEY") or os.getenv("OLLAMA_API_KEY")
281+
client_kwargs: dict[str, Any] = {"host": resolved_host}
282+
if api_key:
283+
client_kwargs["headers"] = {"Authorization": f"Bearer {api_key}"}
284+
self._client: Any = client_cls(**client_kwargs)
280285
self._model = model or os.getenv("MDE_OLLAMA_SEMANTIC_MODEL", "llama3.1")
281286

282287
def understand(self, event: RawEvent) -> SemanticUnderstanding:
@@ -315,7 +320,12 @@ def __init__(
315320
if client_cls is None:
316321
msg = "ollama.Client class is unavailable."
317322
raise RuntimeError(msg)
318-
self._client: Any = client_cls(host=host or os.getenv("MDE_OLLAMA_HOST"))
323+
resolved_host = host or os.getenv("MDE_OLLAMA_HOST")
324+
api_key = os.getenv("MDE_OLLAMA_API_KEY") or os.getenv("OLLAMA_API_KEY")
325+
client_kwargs: dict[str, Any] = {"host": resolved_host}
326+
if api_key:
327+
client_kwargs["headers"] = {"Authorization": f"Bearer {api_key}"}
328+
self._client: Any = client_cls(**client_kwargs)
319329
self._model = model or os.getenv(
320330
"MDE_OLLAMA_EMBEDDING_MODEL", "nomic-embed-text"
321331
)

0 commit comments

Comments
 (0)