diff --git a/packages/lib/api.ts b/packages/lib/api.ts index 7cf8755f..c3eec68f 100644 --- a/packages/lib/api.ts +++ b/packages/lib/api.ts @@ -8,6 +8,7 @@ import { BulkDeleteMemoriesSchema, ConnectionResponseSchema, ContainerTagSettingsUpdateSchema, + DreamingSchema, CreateProjectSchema, DeleteProjectResponseSchema, DeleteProjectSchema, @@ -231,6 +232,7 @@ export const apiSchema = createSchema({ containerTag: z.string().optional(), entityContext: z.string().max(1500).optional(), metadata: z.record(z.unknown()).optional(), + dreaming: DreamingSchema.optional(), }), output: z.object({ results: z.array( diff --git a/packages/validation/api.test.ts b/packages/validation/api.test.ts index fa52ed89..d76b4f87 100644 --- a/packages/validation/api.test.ts +++ b/packages/validation/api.test.ts @@ -4,6 +4,8 @@ import { BulkDeleteMemoriesSchema, DocumentsWithMemoriesQuerySchema, ListMemoriesQuerySchema, + MemoryAddSchema, + MemoryUpdateSchema, SearchRequestSchema, Searchv4RequestSchema, } from "./api" @@ -175,3 +177,24 @@ describe("pagination query schemas", () => { expect(BulkDeleteMemoriesSchema.safeParse(ok).success).toBe(true) }) }) + +describe("document add schemas", () => { + it("keeps dreaming on add requests", () => { + expect( + MemoryAddSchema.parse({ content: "probe", dreaming: "instant" }), + ).toEqual({ content: "probe", dreaming: "instant" }) + }) + + it("rejects unknown dreaming modes", () => { + expect( + MemoryAddSchema.safeParse({ content: "probe", dreaming: "eager" }) + .success, + ).toBe(false) + }) + + it("does not add dreaming to update requests", () => { + expect( + MemoryUpdateSchema.parse({ content: "probe", dreaming: "instant" }), + ).toEqual({ content: "probe" }) + }) +}) diff --git a/packages/validation/api.ts b/packages/validation/api.ts index ae6ac319..735eecfb 100644 --- a/packages/validation/api.ts +++ b/packages/validation/api.ts @@ -170,7 +170,15 @@ export const MemoryUpdateSchema = z.object({ }), }) -export const MemoryAddSchema = MemoryUpdateSchema +export const DreamingSchema = z.enum(["dynamic", "instant"]).openapi({ + description: + 'Processing mode. "dynamic" (default) groups related documents together before extracting memories; "instant" processes each document on its own right away.', + example: "instant", +}) + +export const MemoryAddSchema = MemoryUpdateSchema.extend({ + dreaming: DreamingSchema.optional(), +}) export const PaginationSchema = z .object({