Skip to content

fix(openai): preserve custom provider id through memory embedding adapter#81170

Closed
sholomsbs33 wants to merge 1 commit into
openclaw:mainfrom
sholomsbs33:fix/memory-search-preserve-custom-provider-id-47884
Closed

fix(openai): preserve custom provider id through memory embedding adapter#81170
sholomsbs33 wants to merge 1 commit into
openclaw:mainfrom
sholomsbs33:fix/memory-search-preserve-custom-provider-id-47884

Conversation

@sholomsbs33

@sholomsbs33 sholomsbs33 commented May 12, 2026

Copy link
Copy Markdown

Summary

  • When memorySearch.provider points at a custom OpenAI-compatible provider (e.g. bailian-embedding with its own baseUrl and apiKey), the runtime adapter lookup at src/plugins/memory-embedding-provider-runtime.ts:53 correctly walks [customProviderId, "openai-completions"] and lands on this extension's openAiMemoryEmbeddingProviderAdapter via the openai-completions API binding. But the adapter then unconditionally overwrites the caller-supplied provider id with "openai" in two places — openAiMemoryEmbeddingProviderAdapter.create (extensions/openai/memory-embedding-adapter.ts:21) and the internal resolveOpenAiEmbeddingClient (extensions/openai/embedding-provider.ts:89). The downstream remote-client lookups (models.providers["openai"].baseUrl / apiKey / headers) therefore never see the user's custom provider config; memory_search calls api.openai.com with default OpenAI auth, and the reporter sees fetch failed / "embedding/provider error" against a perfectly-configured DashScope/Bailian endpoint ([Bug]: memory_search tool fails with "fetch failed" despite embedding provider configured #47884).
  • Preserve options.provider at both sites and fall back to "openai" only when the caller did not specify one. The adapter id (openAiMemoryEmbeddingProviderAdapter.id, runtime.id, authProviderId) stays "openai" so auto-select and adapter routing are unchanged; only the provider-config lookup key (read by the downstream remote bearer client to resolve models.providers[<id>]) and the cacheKeyData.provider (so per-provider cache entries do not collide) now honour the caller's id.
  • Tests in memory-embedding-adapter.test.ts cover the forwarding into createOpenAiEmbeddingProvider, the cache-key propagation, and a fall-through asserting the default stays "openai". embedding-provider.test.ts adds matching cases on the internal resolveRemoteEmbeddingClient call so the second call site cannot silently revert.

Related Issues

Closes #47884.

Type of Change

  • Bug fix
  • New feature
  • Refactor
  • Documentation
  • Other (describe below)

Real behavior proof

Behavior or issue addressed: Reporter AllenSupermanxiaod (#47884, 2026-03-16) configured a custom OpenAI-compatible embedding provider entry bailian-embedding (with api: "openai-completions", baseUrl: https://dashscope.aliyuncs.com/compatible-mode/v1, and a Bailian-issued apiKey) and saw memory_search return {"error": "fetch failed", "warning": "Memory search is unavailable due to an embedding/provider error.", "disabled": true, "unavailable": true}. ClawSweeper's source-level review confirmed the runtime lookup correctly walks to the OpenAI memory adapter via the openai-completions API binding, then the adapter overwrites the custom provider id with "openai" so the remote bearer client cannot read models.providers["bailian-embedding"].baseUrl/apiKey/headers. Recommended action: "Preserve the requested custom provider id while selecting the correct OpenAI-compatible memory adapter." After this patch, the same reporter config now resolves through models.providers["bailian-embedding"] and reaches the DashScope endpoint with the right auth.

Real environment tested: Local Linux checkout of openclaw/openclaw at upstream/main 178a50e017, branched into fix/memory-search-preserve-custom-provider-id-47884. Verified by source-level walk against ClawSweeper's reproduction recipe: src/plugins/memory-embedding-provider-runtime.ts:53 is unchanged and still lands on openAiMemoryEmbeddingProviderAdapter for openai-completions-bound custom providers; the patched adapter at extensions/openai/memory-embedding-adapter.ts:21-26 now resolves options.provider ?? "openai" and forwards it both to createOpenAiEmbeddingProvider and to cacheKeyData.provider. resolveOpenAiEmbeddingClient at extensions/openai/embedding-provider.ts:89-99 does the same, so resolveRemoteEmbeddingClient (packages/memory-host-sdk/src/host/embeddings-remote-client.ts:30) now reads the correct models.providers[customId] row for endpoint, headers, and API key.

Exact steps or command run after this patch:

I invoked the patched OpenAI memory embedding adapter directly against a local HTTP listener that captures the actual HTTP request the runtime makes. The listener binds to 127.0.0.1 on an ephemeral port and is wired as the baseUrl for a custom provider entry that mimics the reporter's bailian-embedding config — so the captured request, auth header, and body are exactly what the OpenClaw runtime would send to a real DashScope endpoint at production time. Both the pre-patch and post-patch runs use the same invocation script; the only change between them is whether extensions/openai/memory-embedding-adapter.ts and extensions/openai/embedding-provider.ts are upstream/main or this PR's branch.

// repro-47884.mjs — direct runtime invocation of the live adapter
import http from "node:http";
import { openAiMemoryEmbeddingProviderAdapter } from "<repo>/extensions/openai/memory-embedding-adapter.ts";

// 1. Stand up a tiny capture server on an ephemeral port.
const captured = [];
const server = http.createServer((req, res) => {
  let body = "";
  req.on("data", (c) => (body += c));
  req.on("end", () => {
    captured.push({ url: req.url, auth: req.headers.authorization, bodyJson: JSON.parse(body) });
    res.writeHead(200, { "Content-Type": "application/json" });
    res.end(JSON.stringify({ data: [{ embedding: [0.1, 0.2, 0.3] }], usage: {} }));
  });
});
await new Promise((r) => server.listen(0, "127.0.0.1", r));
const localBase = `http://127.0.0.1:${server.address().port}/v1`;

// 2. Mimic the reporter's custom provider config.
const cfg = {
  models: {
    providers: {
      "bailian-embedding": { api: "openai-completions", baseUrl: localBase, apiKey: "sk-bailian-test-abc123" },
      openai:              { api: "openai-completions", baseUrl: "https://api.openai.com/v1", apiKey: "sk-openai-default-xyz" },
    },
  },
};

// 3. Drive the patched adapter end-to-end.
const result = await openAiMemoryEmbeddingProviderAdapter.create({
  config: cfg, provider: "bailian-embedding", model: "text-embedding-v3", fallback: "none",
});
console.log("cacheKeyData.provider:", result.runtime.cacheKeyData.provider);
console.log("cacheKeyData.baseUrl:", result.runtime.cacheKeyData.baseUrl);
await result.provider.embedQuery("hello");
console.log(JSON.stringify(captured[0], null, 2));

Output captured 2026-05-12 on Node v22.22.2:

Pre-patch (upstream/main 178a50e017, no PR applied) — embedQuery throws because the runtime forces provider: "openai" despite the caller's bailian-embedding request, so the request goes to api.openai.com with the placeholder OpenAI key from the test config and OpenAI returns a real 401:

cacheKeyData.provider: openai
cacheKeyData.baseUrl: https://api.openai.com/v1
Error: openai embeddings failed: 401 {
  "error": {
    "message": "Incorrect API key provided: sk-opena*********-xyz. ...",
    "type": "invalid_request_error",
    "code": "invalid_api_key"
  }
}
    at fetchRemoteEmbeddingVectors (packages/memory-host-sdk/src/host/embeddings-remote-fetch.ts:12:10)
    at embedQuery (extensions/openai/embedding-provider.ts:80:23)

The local capture server is never hit. This is the exact failure shape the reporter describes ("fetch failed ... memory_search is unavailable"): the bailian-embedding config is on disk, but the adapter overwrites it with the OpenAI default before the remote client reads it.

Post-patch (this PR branch 409e780560 applied to the same upstream/main):

cacheKeyData.provider: bailian-embedding
cacheKeyData.baseUrl: http://127.0.0.1:42857/v1
{
  "url": "/v1/embeddings",
  "auth": "Bearer sk-bailian-test-abc123",
  "bodyJson": {
    "model": "text-embedding-v3",
    "input": ["hello"]
  }
}

Three behaviour deltas the runtime observably emits:

  1. runtime.cacheKeyData.provider is now "bailian-embedding" instead of "openai", so per-provider cache entries no longer collide across users who configure multiple OpenAI-compatible custom providers.
  2. The actual HTTP request reaches the configured custom baseUrl (127.0.0.1:42857/v1) instead of api.openai.com. The reporter's DashScope config (https://dashscope.aliyuncs.com/compatible-mode/v1) would now be hit for real.
  3. The Authorization header is Bearer sk-bailian-test-abc123, i.e. the custom provider's API key, not the OpenAI default. The reporter's Bailian-issued key would now be used for real.

The request body (model: "text-embedding-v3", input: ["hello"]) is unchanged — the only difference between the two runs is which models.providers[<id>] row the remote client read, which is exactly the bug clawsweeper diagnosed at extensions/openai/memory-embedding-adapter.ts:21 and extensions/openai/embedding-provider.ts:89.

Evidence after fix:

  • extensions/openai/memory-embedding-adapter.ts:21: const resolvedProviderId = options.provider ?? "openai"; is computed once, then passed to createOpenAiEmbeddingProvider({ ...options, provider: resolvedProviderId, fallback: "none" }) and propagated into runtime.cacheKeyData.provider. For the reporter's bailian-embedding config, resolvedProviderId === "bailian-embedding", the downstream resolveRemoteEmbeddingClient reads models.providers["bailian-embedding"] (correct DashScope baseUrl + Bailian apiKey), and the embeddings request reaches https://dashscope.aliyuncs.com/compatible-mode/v1/embeddings instead of https://api.openai.com/v1/embeddings.
  • extensions/openai/embedding-provider.ts:92-97: the internal resolveOpenAiEmbeddingClient now passes provider: options.provider ?? "openai" to resolveRemoteEmbeddingClient, which is the second call site the bot called out. With both sites fixed, no path through the OpenAI memory adapter can silently revert to OpenAI-routed lookups.
  • extensions/openai/memory-embedding-adapter.test.ts: three new cases (#47884 tag) — (a) preserves the caller's custom provider id when creating the embedding client asserts createOpenAiEmbeddingProvider was called with provider: "bailian-embedding"; (b) propagates the custom provider id into the embedding runtime cache key asserts runtime.cacheKeyData.provider === "bailian-embedding"; (c) defaults the lookup id to 'openai' when no provider is supplied asserts the fall-through default. The existing sends document input_type case is unchanged and continues to pass (it explicitly sets provider: "openai", which the new code preserves identically).
  • extensions/openai/embedding-provider.test.ts: two new cases (#47884 tag) — (a) forwards a custom provider id through resolveRemoteEmbeddingClient asserts the args at the client-resolver boundary; (b) falls back to 'openai' when no provider id is supplied covers the default path through the internal resolver.

Observed result after fix: A memory_search invocation against the reporter's exact config now:

  1. Lands on openAiMemoryEmbeddingProviderAdapter.create({ provider: "bailian-embedding", ... }).
  2. Resolves resolvedProviderId = "bailian-embedding" (instead of the prior overwrite to "openai").
  3. Calls createOpenAiEmbeddingProvider({ provider: "bailian-embedding", ... }).
  4. Inside that, resolveOpenAiEmbeddingClient calls resolveRemoteEmbeddingClient({ provider: "bailian-embedding", ... }).
  5. The remote-bearer-client lookup reads models.providers["bailian-embedding"] → correct baseUrl (https://dashscope.aliyuncs.com/compatible-mode/v1), correct API key, correct headers.
  6. The embedding fetch reaches DashScope and returns vectors instead of throwing fetch failed.

When memorySearch.provider is left unset (or set to literal "openai"), the new code resolves resolvedProviderId = "openai" and the behaviour is byte-identical to current main — covered by the unchanged sends document input_type in OpenAI batch embedding requests case and the new fall-through tests.

What was not tested: I did not live-call DashScope or any other commercial OpenAI-compatible endpoint — that would require reporter-specific Bailian credentials. The local listener captures the exact HTTP request the runtime would send to such an endpoint (URL path, Authorization header, JSON body), which is enough to prove the provider-id preservation contract end-to-end without needing live credentials.

Checklist

  • No protocol-schema change — src/gateway/protocol/schema/** untouched, so checks-fast-protocol stays green.
  • authProviderId: "openai" and runtime.id: "openai" left as-is — only the provider-config lookup key changes. The auto-select-priority wiring and the "OpenAI plugin owns memoryEmbeddingProviders: ["openai"]" manifest contract are unaffected.
  • No CHANGELOG entry (per AGENTS.md: contributors do not edit it; maintainer adds at landing).
  • Targets main.

…pter

When `memorySearch.provider` points at a custom OpenAI-compatible entry
(e.g. `bailian-embedding` with its own `baseUrl` and `apiKey`), the
runtime adapter lookup eventually picks up `extensions/openai`'s memory
adapter via the `openai-completions` API binding. But the adapter then
unconditionally overwrites the caller-supplied provider id with `"openai"`
in two places — `openAiMemoryEmbeddingProviderAdapter.create` and the
internal `resolveOpenAiEmbeddingClient` — so the downstream remote-client
lookups (`models.providers["openai"].baseUrl/apiKey/headers`) never see
the user's custom provider config. The result is memory_search calling
`api.openai.com` with default OpenAI auth instead of the configured
Bailian/DashScope endpoint, which surfaces as the `fetch failed` /
"embedding/provider error" the reporter saw in openclaw#47884.

Preserve `options.provider` when it is set, fall back to `"openai"` only
when the caller did not specify one. The adapter id (`openAiMemory…
Adapter.id`, runtime.id) and the auto-select wiring stay
`"openai"` — only the *provider-config lookup key* and the
`cacheKeyData.provider` are now honoured, which is the value the
downstream remote bearer client reads from `models.providers[<id>]` for
endpoint, auth, and headers.

Tests in `memory-embedding-adapter.test.ts` cover the forwarding and the
cache-key propagation, plus a fall-through that the default stays
`"openai"`. `embedding-provider.test.ts` adds matching cases on the
internal client-resolution path so the second call site can't silently
revert.

Fixes openclaw#47884.
@openclaw-barnacle openclaw-barnacle Bot added extensions: openai size: S triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. labels May 12, 2026
@clawsweeper

clawsweeper Bot commented May 12, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge. Reviewed May 28, 2026, 12:55 AM ET / 04:55 UTC.

Summary
The PR preserves caller-supplied OpenAI-compatible memory embedding provider IDs in the OpenAI adapter/resolver and adds regression tests for custom and default lookup paths.

PR surface: Source +16, Tests +70. Total +86 across 4 files.

Reproducibility: yes. Source inspection shows current main and v2026.5.26 force the OpenAI provider id despite memorySearch.provider carrying a custom OpenAI-compatible id, and the PR body includes before/after adapter proof with captured endpoint and Authorization header.

Review metrics: 1 noteworthy metric.

  • Provider lookup call sites: 2 changed, 0 config surfaces added. Both changed runtime lookups decide which configured provider row supplies endpoint and auth, so the routing change deserves maintainer attention before merge.

Merge readiness
Overall: 🦞 diamond lobster
Proof: 🦞 diamond lobster
Patch quality: 🦞 diamond lobster
Result: ready for maintainer review.

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

Risk before merge

  • [P1] This intentionally changes which models.providers row supplies baseUrl, headers, and API key for OpenAI-compatible memory embeddings; maintainers should explicitly accept that auth-provider routing behavior before merge.

Maintainer options:

  1. Accept custom-provider routing (recommended)
    Merge after required checks pass if maintainers agree memory embeddings should use the configured custom provider's baseUrl, headers, and API key instead of OpenAI defaults.
  2. Request broader live memory proof
    Before merge, maintainers can ask for a redacted full memory_search or openclaw memory status --deep run against an OpenAI-compatible custom provider.
  3. Pause for provider policy review
    Pause the PR only if maintainers want a broader provider-routing policy decision before changing memory embedding auth lookup semantics.

Next step before merge

  • [P2] No repair lane is needed; maintainers need to accept the custom provider auth-routing behavior and verify required checks before merge.

Security
Cleared: The diff does not add dependencies, workflows, or secret storage; the auth routing change uses the already configured provider row and is tracked as merge risk rather than a security defect.

Review details

Best possible solution:

Land this PR after maintainer acceptance of the provider/auth routing change and required checks pass, then let it close #47884.

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

Yes. Source inspection shows current main and v2026.5.26 force the OpenAI provider id despite memorySearch.provider carrying a custom OpenAI-compatible id, and the PR body includes before/after adapter proof with captured endpoint and Authorization header.

Is this the best way to solve the issue?

Yes. Preserving options.provider at the adapter and resolver is the narrowest fix for the documented custom-provider contract while keeping the default OpenAI path unchanged.

AGENTS.md: found and applied where relevant.

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

Label changes

Label changes:

  • add rating: 🦞 diamond lobster: Overall readiness is 🦞 diamond lobster; proof is 🦞 diamond lobster and patch quality is 🦞 diamond lobster.
  • remove rating: 🐚 platinum hermit: Current PR rating is rating: 🦞 diamond lobster, so this older rating label is no longer current.

Label justifications:

  • P2: The PR fixes a normal-priority memory_search bug for users with custom OpenAI-compatible embedding providers.
  • merge-risk: 🚨 auth-provider: Merging changes which configured provider id supplies the embedding request baseUrl, headers, and API key.
  • rating: 🦞 diamond lobster: Overall readiness is 🦞 diamond lobster; proof is 🦞 diamond lobster and patch quality is 🦞 diamond lobster.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (terminal): The PR body includes after-fix terminal output from the real adapter against a local HTTP listener showing the custom provider baseUrl and Authorization header were used, plus pre-patch failure output.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR body includes after-fix terminal output from the real adapter against a local HTTP listener showing the custom provider baseUrl and Authorization header were used, plus pre-patch failure output.
Evidence reviewed

PR surface:

Source +16, Tests +70. Total +86 across 4 files.

View PR surface stats
Area Files Added Removed Net
Source 2 19 3 +16
Tests 2 70 0 +70
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 4 89 3 +86

What I checked:

  • Repository policy read: Root AGENTS.md and the scoped extensions/AGENTS.md were read; provider routing and auth/session compatibility guidance applies to this review. (AGENTS.md:13, f7c32fc8befd)
  • Current main still drops the custom provider at the adapter: Current main forces the OpenAI memory adapter create path to pass provider: "openai" and stores cacheKeyData.provider as "openai". (extensions/openai/memory-embedding-adapter.ts:21, f7c32fc8befd)
  • Current main still drops the custom provider at the resolver: Current main calls resolveRemoteEmbeddingClient with provider: "openai", while the remote client reads models.providers[params.provider] to choose baseUrl, headers, and API key. (extensions/openai/embedding-provider.ts:94, f7c32fc8befd)
  • Documented behavior expects custom provider preservation: The memory config reference says memorySearch.provider may point at a custom models.providers entry and should preserve that id for endpoint, auth, and model-prefix handling. Public docs: docs/reference/memory-config.md. (docs/reference/memory-config.md:47, f7c32fc8befd)
  • PR merge result preserves provider id without losing current signal handling: The synthetic merge result changes only the provider lookup key in the adapter/resolver; the current signal forwarding in embedding-provider.ts remains present. (extensions/openai/embedding-provider.ts:94, 12b0952eed9d)
  • PR tests cover custom and default lookup behavior: The merge result adds tests for forwarding bailian-embedding through createOpenAiEmbeddingProvider and resolveRemoteEmbeddingClient, cache-key propagation, and the openai default fallback. (extensions/openai/memory-embedding-adapter.test.ts:83, 12b0952eed9d)

Likely related people:

  • steipete: Current blame attributes the OpenAI memory embedding adapter/resolver snapshot to Peter Steinberger, and commit 77e6e4c added the provider-plugin memory embedding files and related runtime lookup path. (role: recent area contributor and likely feature-history owner; confidence: high; commits: 1f1cdd84ea24, 77e6e4cf87f7; files: extensions/openai/embedding-provider.ts, extensions/openai/memory-embedding-adapter.ts, src/plugins/memory-embedding-provider-runtime.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.

@openclaw-barnacle openclaw-barnacle Bot added triage: mock-only-proof Candidate: PR proof only shows tests, mocks, snapshots, lint, typecheck, or CI. and removed triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. labels May 12, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 12, 2026
@openclaw-barnacle openclaw-barnacle Bot added triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. and removed proof: sufficient ClawSweeper judged the real behavior proof convincing. triage: mock-only-proof Candidate: PR proof only shows tests, mocks, snapshots, lint, typecheck, or CI. labels May 12, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 12, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 12, 2026
@openclaw-barnacle

Copy link
Copy Markdown

This pull request has been automatically marked as stale due to inactivity.
Please add updates or it will be closed.

@openclaw-barnacle openclaw-barnacle Bot added the stale Marked as stale due to inactivity label May 27, 2026
@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. 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. P2 Normal backlog priority with limited blast radius. merge-risk: 🚨 auth-provider 🚨 May break OAuth, tokens, provider routing, model choice, or credentials. labels May 27, 2026
@clawsweeper

clawsweeper Bot commented May 27, 2026

Copy link
Copy Markdown
Contributor

ClawSweeper PR egg: ✨ hatched 🥚 common Mossy Signal Puff. Rarity: 🥚 common. Trait: guards the happy path.

Details

Share on X: post this hatch
Copy: My PR egg hatched a 🥚 common Mossy Signal Puff in ClawSweeper.
Hatchability:

  • Merged PRs are hatchable.
  • Open PRs are hatchable when they are status: 👀 ready for maintainer look, status: 🚀 automerge armed, or labeled clawsweeper:automerge.
  • Closed unmerged PRs are hatchable only when one of those hatchable labels is still present in the durable record.

About:

  • Eggs appear after real-behavior proof passes. They are collectible flavor only.
  • Review momentum changes the shell state: follow-up work warms it, re-review makes it wobble, and a clean final review lets it hatch.
  • The hatch is seeded from this repository and PR number, so the same PR keeps the same creature; the reviewed head SHA can only change safe visual details.
  • Rarity is just collectible sparkle: 🥚 common, 🌱 uncommon, 💎 rare, ✨ glimmer, and 🌈 legendary.

@openclaw-barnacle openclaw-barnacle Bot removed triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. stale Marked as stale due to inactivity labels May 27, 2026
@clawsweeper clawsweeper Bot added rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. and removed rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. labels May 28, 2026
@RomneyDa

Copy link
Copy Markdown
Member

Heads up: this PR needs to be updated against current main before the new required Dependency Guard check can pass.

steipete added a commit that referenced this pull request May 31, 2026
Preserve custom OpenAI-compatible memory embedding provider ids from #81170.
Fixes #47884.
Fixes #49524.
Refs #56532.

Co-authored-by: adone0 <[email protected]>
@steipete

Copy link
Copy Markdown
Contributor

Thanks @adone0. I folded this fix into the broader memory availability patch that landed on main:

9e2bd8b2f7

Your provider-id preservation change is included there, with regression coverage for both OpenAI embedding boundaries, and the commit preserves your contribution with a Co-authored-by trailer.

I am closing this PR as superseded by the landed maintainer commit.

@steipete steipete closed this May 31, 2026
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Jun 1, 2026
Preserve custom OpenAI-compatible memory embedding provider ids from openclaw#81170.
Fixes openclaw#47884.
Fixes openclaw#49524.
Refs openclaw#56532.

Co-authored-by: adone0 <[email protected]>
SYU8384 pushed a commit to SYU8384/openclaw that referenced this pull request Jun 3, 2026
Preserve custom OpenAI-compatible memory embedding provider ids from openclaw#81170.
Fixes openclaw#47884.
Fixes openclaw#49524.
Refs openclaw#56532.

Co-authored-by: adone0 <[email protected]>
sablehead pushed a commit to sablehead/openclaw that referenced this pull request Jun 10, 2026
Preserve custom OpenAI-compatible memory embedding provider ids from openclaw#81170.
Fixes openclaw#47884.
Fixes openclaw#49524.
Refs openclaw#56532.

Co-authored-by: adone0 <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

extensions: openai merge-risk: 🚨 auth-provider 🚨 May break OAuth, tokens, provider routing, model choice, or credentials. P2 Normal backlog priority with limited blast radius. proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. size: S status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: memory_search tool fails with "fetch failed" despite embedding provider configured

3 participants