fix(cli): force pathPrefix="" when targeting the managed embeddings daemon

The managed daemon serves /embeddings/compute directly. The default
pathPrefix in @ktx/llm is /api, so omitting sentenceTransformers from
ktx.yaml produced /api/embeddings/compute -> 404. The resolver now
sets pathPrefix='' explicitly when wiring the managed daemon URL,
matching what the daemon actually exposes.
This commit is contained in:
Andrey Avtomonov 2026-05-21 02:15:08 +02:00
parent ef4e113cfe
commit 95021d13ea
2 changed files with 22 additions and 0 deletions

View file

@ -84,6 +84,27 @@ describe('resolveProjectEmbeddingProvider', () => {
expect(ensureManaged).not.toHaveBeenCalled();
});
it('passes pathPrefix="" to the embedding provider when targeting the managed daemon', async () => {
const project = projectWithConfig(withManagedEmbedding(buildDefaultKtxProjectConfig(), undefined));
const tryUseManaged = vi.fn(async () => fakeDaemon);
const createKtxEmbeddingProvider = vi.fn(() => ({ id: 'fake' }) as never);
await resolveProjectEmbeddingProvider(project, {
mode: 'use-if-running',
cliVersion: '0.5.0',
io: noopIo,
createKtxEmbeddingProvider,
tryUseManagedDaemon: tryUseManaged,
});
expect(createKtxEmbeddingProvider).toHaveBeenCalledWith(
expect.objectContaining({
sentenceTransformers: expect.objectContaining({
baseURL: fakeDaemon.baseUrl,
pathPrefix: '',
}),
}),
);
});
it('returns managed-unavailable when no daemon is running and mode is use-if-running', async () => {
const project = projectWithConfig(withManagedEmbedding(buildDefaultKtxProjectConfig(), ''));
const tryUseManaged = vi.fn(async () => null);

View file

@ -99,6 +99,7 @@ function buildManagedProvider(
sentenceTransformers: {
...embeddings.sentenceTransformers,
base_url: baseUrl,
pathPrefix: '',
},
};
const resolved = resolveLocalKtxEmbeddingConfig(merged, process.env);