




















@@ -25,6 +25,28 @@ function createProviderWithoutMaxInputTokens(params: {
2525};
2626}
272728+type EmbeddingChunks = ReturnType<typeof enforceEmbeddingMaxInputTokens>;
29+30+function expectChunksWithinUtf8Bytes(chunks: EmbeddingChunks, maxBytes: number) {
31+const oversized = chunks
32+.map((chunk, index) => ({ index, bytes: estimateUtf8Bytes(chunk.text) }))
33+.filter((entry) => entry.bytes > maxBytes);
34+expect(oversized).toEqual([]);
35+}
36+37+function expectChunksLineRange(chunks: EmbeddingChunks, startLine: number, endLine: number) {
38+expect(chunks.map((chunk) => ({ startLine: chunk.startLine, endLine: chunk.endLine }))).toEqual(
39+chunks.map(() => ({ startLine, endLine })),
40+);
41+}
42+43+function expectChunksHaveHashes(chunks: EmbeddingChunks) {
44+const invalidHashes = chunks
45+.map((chunk, index) => ({ index, hash: chunk.hash }))
46+.filter((entry) => typeof entry.hash !== "string" || entry.hash.length === 0);
47+expect(invalidHashes).toEqual([]);
48+}
49+2850describe("embedding chunk limits", () => {
2951it("splits oversized chunks so each embedding input stays <= maxInputTokens bytes", () => {
3052const provider = createProvider(8192);
@@ -38,11 +60,9 @@ describe("embedding chunk limits", () => {
3860const out = enforceEmbeddingMaxInputTokens(provider, [input]);
3961expect(out.length).toBeGreaterThan(1);
4062expect(out.map((chunk) => chunk.text).join("")).toBe(input.text);
41-expect(out.every((chunk) => estimateUtf8Bytes(chunk.text) <= 8192)).toBe(true);
42-expect(out.every((chunk) => chunk.startLine === 1 && chunk.endLine === 1)).toBe(true);
43-expect(out.every((chunk) => typeof chunk.hash === "string" && chunk.hash.length > 0)).toBe(
44-true,
45-);
63+expectChunksWithinUtf8Bytes(out, 8192);
64+expectChunksLineRange(out, 1, 1);
65+expectChunksHaveHashes(out);
4666});
47674868it("does not split inside surrogate pairs (emoji)", () => {
@@ -56,7 +76,7 @@ describe("embedding chunk limits", () => {
56765777expect(out.length).toBeGreaterThan(1);
5878expect(out.map((chunk) => chunk.text).join("")).toBe(inputText);
59-expect(out.every((chunk) => estimateUtf8Bytes(chunk.text) <= 8192)).toBe(true);
79+expectChunksWithinUtf8Bytes(out, 8192);
60806181// If we split inside surrogate pairs we'd likely end up with replacement chars.
6282expect(out.map((chunk) => chunk.text).join("")).not.toContain("\uFFFD");
@@ -78,7 +98,7 @@ describe("embedding chunk limits", () => {
7898]);
799980100expect(out.length).toBeGreaterThan(1);
81-expect(out.every((chunk) => estimateUtf8Bytes(chunk.text) <= 2048)).toBe(true);
101+expectChunksWithinUtf8Bytes(out, 2048);
82102});
8310384104it("honors hard safety caps lower than provider maxInputTokens", () => {
@@ -97,6 +117,6 @@ describe("embedding chunk limits", () => {
97117);
9811899119expect(out.length).toBeGreaterThan(1);
100-expect(out.every((chunk) => estimateUtf8Bytes(chunk.text) <= 8000)).toBe(true);
120+expectChunksWithinUtf8Bytes(out, 8000);
101121});
102122});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。