diff --git a/packages/integrations/src/open-webui/open-webui-integration.ts b/packages/integrations/src/open-webui/open-webui-integration.ts index 943d9b2c3..90d6bfa25 100644 --- a/packages/integrations/src/open-webui/open-webui-integration.ts +++ b/packages/integrations/src/open-webui/open-webui-integration.ts @@ -24,7 +24,6 @@ import { openWebUiCollectionQueryResponseSchema, openWebUiCompletionChunkSchema, openWebUiFileListSchema, - openWebUiKnowledgeDetailSchema, openWebUiKnowledgeListSchema, openWebUiModelsResponseSchema, openWebUiNoteListSchema, @@ -99,9 +98,11 @@ export class OpenWebUiIntegration extends Integration { /** * List the files contained in a knowledge base (for the expandable picker). + * The knowledge detail endpoint returns `files: null` on recent versions, so + * we read the files list and filter by the base's collection id instead. */ public async getKnowledgeFilesAsync(knowledgeId: string): Promise { - const response = await fetchWithTrustedCertificatesAsync(this.url(`/api/v1/knowledge/${knowledgeId}`), { + const response = await fetchWithTrustedCertificatesAsync(this.url("/api/v1/files/"), { headers: this.getAuthHeaders(), }); @@ -109,8 +110,11 @@ export class OpenWebUiIntegration extends Integration { throw new ResponseError(response); } - const parsed = openWebUiKnowledgeDetailSchema.parse(await response.json()); - return (parsed.files ?? []).map((file) => ({ id: file.id, name: file.meta?.name ?? file.filename ?? file.id })); + const parsed = openWebUiFileListSchema.parse(await response.json()); + const files = Array.isArray(parsed) ? parsed : parsed.items; + return files + .filter((file) => file.meta?.collection_name === knowledgeId) + .map((file) => ({ id: file.id, name: file.meta?.name ?? file.filename ?? file.id })); } /** diff --git a/packages/integrations/src/open-webui/open-webui-types.ts b/packages/integrations/src/open-webui/open-webui-types.ts index 81c9dd18f..77040ea37 100644 --- a/packages/integrations/src/open-webui/open-webui-types.ts +++ b/packages/integrations/src/open-webui/open-webui-types.ts @@ -87,10 +87,17 @@ export const openWebUiKnowledgeListSchema = z.union([ ]); // A file stored in Open WebUI (uploaded directly or part of a knowledge base). +// `meta.collection_name` is the knowledge base id when the file belongs to one. export const openWebUiFileSchema = z.object({ id: z.string(), filename: z.string().nullish(), - meta: z.object({ name: z.string().nullish(), content_type: z.string().nullish() }).nullish(), + meta: z + .object({ + name: z.string().nullish(), + content_type: z.string().nullish(), + collection_name: z.string().nullish(), + }) + .nullish(), }); export type OpenWebUiFile = z.infer;