From 326374a82c53433dcb91f1594f26a2945364330a Mon Sep 17 00:00:00 2001 From: Sreeram Sreedhar Date: Mon, 1 Jun 2026 21:26:20 -0400 Subject: [PATCH] add baseUrl to config --- README.md | 3 +++ src/config.ts | 31 ++++++++++++++++++++++++++++++- src/services/client.ts | 4 ++-- 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 7c626d2..9c524ea 100644 --- a/README.md +++ b/README.md @@ -209,6 +209,9 @@ Create `~/.config/opencode/supermemory.jsonc`: // API key (can also use SUPERMEMORY_API_KEY env var) "apiKey": "sm_...", + // Supermemory API base URL (SUPERMEMORY_API_URL/SUPERMEMORY_BASE_URL env vars take precedence) + "baseUrl": "https://api.supermemory.ai", + // Min similarity for memory retrieval (0-1) "similarityThreshold": 0.6, diff --git a/src/config.ts b/src/config.ts index 0aca56b..b4ace76 100644 --- a/src/config.ts +++ b/src/config.ts @@ -10,8 +10,11 @@ const CONFIG_FILES = [ join(CONFIG_DIR, "supermemory.json"), ]; +export const DEFAULT_BASE_URL = "https://api.supermemory.ai"; + interface SupermemoryConfig { apiKey?: string; + baseUrl?: string; similarityThreshold?: number; maxMemories?: number; maxProjectMemories?: number; @@ -44,7 +47,7 @@ const DEFAULT_KEYWORD_PATTERNS = [ "always\\s+remember", ]; -const DEFAULTS: Required> = { +const DEFAULTS: Required> = { similarityThreshold: 0.6, maxMemories: 5, maxProjectMemories: 10, @@ -99,6 +102,32 @@ function getApiKey(): string | undefined { export const SUPERMEMORY_API_KEY = getApiKey(); +function normalizeBaseUrl(baseUrl: unknown): string | null { + if (typeof baseUrl !== "string" || !baseUrl.trim()) return null; + + const trimmed = baseUrl.trim(); + try { + const url = new URL(trimmed); + if (url.protocol !== "http:" && url.protocol !== "https:") return null; + return trimmed; + } catch { + return null; + } +} + +export function getBaseUrl(): string { + const configured = + process.env.SUPERMEMORY_API_URL || + process.env.SUPERMEMORY_BASE_URL || + fileConfig.baseUrl || + DEFAULT_BASE_URL; + const normalized = normalizeBaseUrl(configured); + if (!normalized) { + throw new Error("Invalid baseUrl: expected an absolute http(s) URL"); + } + return normalized; +} + export const CONFIG = { similarityThreshold: fileConfig.similarityThreshold ?? DEFAULTS.similarityThreshold, maxMemories: fileConfig.maxMemories ?? DEFAULTS.maxMemories, diff --git a/src/services/client.ts b/src/services/client.ts index 6fb3c3c..31c23d0 100644 --- a/src/services/client.ts +++ b/src/services/client.ts @@ -1,5 +1,5 @@ import Supermemory from "supermemory"; -import { CONFIG, SUPERMEMORY_API_KEY, isConfigured } from "../config.js"; +import { CONFIG, SUPERMEMORY_API_KEY, isConfigured, getBaseUrl } from "../config.js"; import { log } from "./logger.js"; import type { ConversationIngestResponse, @@ -52,7 +52,7 @@ export class SupermemoryClient { if (!isConfigured()) { throw new Error("SUPERMEMORY_API_KEY not set"); } - this.client = new Supermemory({ apiKey: SUPERMEMORY_API_KEY }); + this.client = new Supermemory({ apiKey: SUPERMEMORY_API_KEY, baseURL: getBaseUrl() }); this.client.settings.update({ shouldLLMFilter: true, filterPrompt: CONFIG.filterPrompt