Skip to content

Commit 12b0952

Browse files
authored
Merge 409e780 into a20c091
2 parents a20c091 + 409e780 commit 12b0952

4 files changed

Lines changed: 89 additions & 3 deletions

File tree

extensions/openai/embedding-provider.test.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,4 +99,30 @@ describe("OpenAI embedding provider", () => {
9999
dimensions: 512,
100100
});
101101
});
102+
103+
it("forwards a custom provider id through resolveRemoteEmbeddingClient (#47884)", async () => {
104+
await createOpenAiEmbeddingProvider(
105+
createOptions({ provider: "bailian-embedding", model: "text-embedding-v3" }),
106+
);
107+
108+
const calls = mocks.resolveRemoteEmbeddingClient.mock.calls as unknown as Array<
109+
[{ provider?: string }]
110+
>;
111+
const [args] = calls.at(-1) ?? [];
112+
expect(args?.provider).toBe("bailian-embedding");
113+
});
114+
115+
it("falls back to 'openai' when no provider id is supplied (#47884)", async () => {
116+
await createOpenAiEmbeddingProvider({
117+
config: {} as MemoryEmbeddingProviderCreateOptions["config"],
118+
model: "text-embedding-3-small",
119+
fallback: "none",
120+
});
121+
122+
const calls = mocks.resolveRemoteEmbeddingClient.mock.calls as unknown as Array<
123+
[{ provider?: string }]
124+
>;
125+
const [args] = calls.at(-1) ?? [];
126+
expect(args?.provider).toBe("openai");
127+
});
102128
});

extensions/openai/embedding-provider.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,14 @@ export async function createOpenAiEmbeddingProvider(
9494
async function resolveOpenAiEmbeddingClient(
9595
options: MemoryEmbeddingProviderCreateOptions,
9696
): Promise<OpenAiEmbeddingClient> {
97+
// Honour the caller-provided custom provider ID so the remote client looks
98+
// up `models.providers[<id>]` for the user's custom `baseUrl`, API key, and
99+
// headers. The adapter still defaults to `"openai"` when nothing custom is
100+
// configured; this only differs when memory-search was pointed at an
101+
// OpenAI-compatible custom provider entry such as `bailian-embedding`.
102+
// See #47884.
97103
const client = await resolveRemoteEmbeddingClient({
98-
provider: "openai",
104+
provider: options.provider ?? "openai",
99105
options,
100106
defaultBaseUrl: DEFAULT_OPENAI_BASE_URL,
101107
normalizeModel: normalizeOpenAiModel,

extensions/openai/memory-embedding-adapter.test.ts

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,4 +79,48 @@ describe("OpenAI memory embedding adapter", () => {
7979
input_type: "document",
8080
});
8181
});
82+
83+
it("preserves the caller's custom provider id when creating the embedding client (#47884)", async () => {
84+
await openAiMemoryEmbeddingProviderAdapter.create({
85+
config: {} as never,
86+
provider: "bailian-embedding",
87+
model: "text-embedding-v3",
88+
fallback: "none",
89+
});
90+
91+
const createCalls = mocks.createOpenAiEmbeddingProvider.mock.calls as unknown as Array<
92+
[{ provider?: string; fallback?: string; model?: string }]
93+
>;
94+
const [opts] = createCalls.at(-1) ?? [];
95+
expect(opts?.provider).toBe("bailian-embedding");
96+
expect(opts?.fallback).toBe("none");
97+
expect(opts?.model).toBe("text-embedding-v3");
98+
});
99+
100+
it("propagates the custom provider id into the embedding runtime cache key (#47884)", async () => {
101+
const result = await openAiMemoryEmbeddingProviderAdapter.create({
102+
config: {} as never,
103+
provider: "bailian-embedding",
104+
model: "text-embedding-v3",
105+
fallback: "none",
106+
});
107+
108+
expect(result.runtime?.cacheKeyData).toMatchObject({
109+
provider: "bailian-embedding",
110+
});
111+
});
112+
113+
it("defaults the lookup id to 'openai' when no provider is supplied (#47884)", async () => {
114+
await openAiMemoryEmbeddingProviderAdapter.create({
115+
config: {} as never,
116+
model: "text-embedding-3-small",
117+
fallback: "none",
118+
});
119+
120+
const createCalls = mocks.createOpenAiEmbeddingProvider.mock.calls as unknown as Array<
121+
[{ provider?: string }]
122+
>;
123+
const [opts] = createCalls.at(-1) ?? [];
124+
expect(opts?.provider).toBe("openai");
125+
});
82126
});

extensions/openai/memory-embedding-adapter.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,27 @@ export const openAiMemoryEmbeddingProviderAdapter: MemoryEmbeddingProviderAdapte
1919
allowExplicitWhenConfiguredAuto: true,
2020
shouldContinueAutoSelection: isMissingEmbeddingApiKeyError,
2121
create: async (options) => {
22+
// Preserve the caller's custom provider ID (e.g. `bailian-embedding`)
23+
// so the downstream remote-client resolves `models.providers[<id>]` for
24+
// its `baseUrl`, API key, and headers. Forcing `"openai"` here dropped
25+
// that custom ID and routed every memory-embedding call back at the
26+
// default OpenAI endpoint with OpenAI auth, which is what made
27+
// `bailian-embedding` (and every other OpenAI-compatible custom
28+
// provider) fail with `fetch failed`. See #47884. The adapter id
29+
// itself stays `"openai"` — only the *provider-config lookup key* is
30+
// preserved.
31+
const resolvedProviderId = options.provider ?? "openai";
2232
const { provider, client } = await createOpenAiEmbeddingProvider({
2333
...options,
24-
provider: "openai",
34+
provider: resolvedProviderId,
2535
fallback: "none",
2636
});
2737
return {
2838
provider,
2939
runtime: {
3040
id: "openai",
3141
cacheKeyData: {
32-
provider: "openai",
42+
provider: resolvedProviderId,
3343
baseUrl: client.baseUrl,
3444
model: client.model,
3545
outputDimensionality: client.outputDimensionality,

0 commit comments

Comments
 (0)