254 lines
9.2 KiB
TypeScript
254 lines
9.2 KiB
TypeScript
import { describe, it } from "node:test";
|
|
import assert from "node:assert/strict";
|
|
import {
|
|
scoreToken,
|
|
pruneByScore,
|
|
STOPWORDS,
|
|
FORCE_PRESERVE_RE,
|
|
} from "../../../open-sse/services/compression/ultraHeuristic.ts";
|
|
import { ultraCompress } from "../../../open-sse/services/compression/ultra.ts";
|
|
import type { UltraConfig } from "../../../open-sse/services/compression/types.ts";
|
|
|
|
describe("scoreToken", () => {
|
|
it("should return 0 for stopword 'the'", () => {
|
|
assert.strictEqual(scoreToken("the"), 0.1);
|
|
});
|
|
|
|
it("should return 0.1 for stopword 'and'", () => {
|
|
assert.strictEqual(scoreToken("and"), 0.1);
|
|
});
|
|
|
|
it("should return 1.0 for URL token", () => {
|
|
assert.strictEqual(scoreToken("https://example.com"), 1.0);
|
|
});
|
|
|
|
it("should return 1.0 for number token", () => {
|
|
assert.strictEqual(scoreToken("123"), 1.0);
|
|
});
|
|
|
|
it("should return 1.0 for file path token", () => {
|
|
assert.strictEqual(scoreToken("/path/to/file"), 1.0);
|
|
});
|
|
|
|
it("should return 1.0 for backslash token", () => {
|
|
assert.strictEqual(scoreToken("\\path\\file"), 1.0);
|
|
});
|
|
|
|
it("should return 1.0 for dot token", () => {
|
|
assert.strictEqual(scoreToken(".txt"), 1.0);
|
|
});
|
|
|
|
it("should return 1.0 for Error: prefix", () => {
|
|
assert.strictEqual(scoreToken("Error:"), 1.0);
|
|
});
|
|
|
|
it("should return 1.0 for Exception: prefix", () => {
|
|
assert.strictEqual(scoreToken("Exception:"), 1.0);
|
|
});
|
|
|
|
it("should return 1.0 for backtick token", () => {
|
|
assert.strictEqual(scoreToken("```"), 1.0);
|
|
});
|
|
|
|
it("should return 0.8 for capitalized word (proper noun)", () => {
|
|
assert.strictEqual(scoreToken("John"), 0.8);
|
|
});
|
|
|
|
it("should return 0.7 for word length >= 6", () => {
|
|
assert.strictEqual(scoreToken("example"), 0.7);
|
|
});
|
|
|
|
it("should return 0.2 for very short word", () => {
|
|
assert.strictEqual(scoreToken("ab"), 0.2);
|
|
});
|
|
|
|
it("should return 0.5 for medium-length word", () => {
|
|
assert.strictEqual(scoreToken("hello"), 0.5);
|
|
});
|
|
|
|
it("should return 0.2 for empty string", () => {
|
|
assert.strictEqual(scoreToken(""), 0.2);
|
|
});
|
|
});
|
|
|
|
describe("pruneByScore", () => {
|
|
it("should return empty array for empty string", () => {
|
|
assert.strictEqual(pruneByScore(""), "");
|
|
});
|
|
|
|
it("should keep all tokens when compressionRate=1.0", () => {
|
|
const text = "the quick brown fox";
|
|
const result = pruneByScore(text, 1.0);
|
|
assert.strictEqual(result, text);
|
|
});
|
|
|
|
it("should remove some tokens when compressionRate=0.5", () => {
|
|
const text = "the quick brown fox jumps over the lazy dog";
|
|
const result = pruneByScore(text, 0.5);
|
|
assert(result.length < text.length);
|
|
});
|
|
|
|
it("should always keep force-preserved tokens (URLs)", () => {
|
|
const text = "check https://example.com for details";
|
|
const result = pruneByScore(text, 0.3);
|
|
assert.notEqual(result.split(/\s+/).indexOf("https://example.com"), -1);
|
|
});
|
|
|
|
it("should always keep force-preserved tokens (numbers)", () => {
|
|
const text = "the value is 42 units";
|
|
const result = pruneByScore(text, 0.3);
|
|
assert(result.includes("42"));
|
|
});
|
|
|
|
it("result length should be <= input length", () => {
|
|
const text = "the quick brown fox jumps over the lazy dog";
|
|
const result = pruneByScore(text, 0.5);
|
|
assert(result.length <= text.length);
|
|
});
|
|
|
|
it("should preserve whitespace structure", () => {
|
|
const text = "word1 word2 word3";
|
|
const result = pruneByScore(text, 1.0);
|
|
assert(result.includes("word1") && result.includes("word2") && result.includes("word3"));
|
|
});
|
|
|
|
it("should handle zero compression rate", () => {
|
|
const text = "the quick brown fox";
|
|
const result = pruneByScore(text, 0.0);
|
|
assert(result.length <= text.length);
|
|
});
|
|
|
|
it("should normalize multiple spaces to single space in pruneByScore", () => {
|
|
const text = "word1 word2";
|
|
const result = pruneByScore(text, 1.0);
|
|
assert(result.includes("word1") && result.includes("word2"));
|
|
});
|
|
});
|
|
|
|
describe("ultraCompress", () => {
|
|
const baseConfig: UltraConfig = {
|
|
enabled: true,
|
|
compressionRate: 0.5,
|
|
minScoreThreshold: 0.3,
|
|
slmFallbackToAggressive: false,
|
|
maxTokensPerMessage: 0,
|
|
};
|
|
|
|
it("should return object with compressed and stats", async () => {
|
|
const messages = [{ role: "user", content: "the quick brown fox" }];
|
|
const result = await ultraCompress(messages, baseConfig);
|
|
assert(result.messages);
|
|
assert(result.stats);
|
|
assert(result.stats.originalTokens !== undefined);
|
|
assert(result.stats.compressedTokens !== undefined);
|
|
});
|
|
|
|
it("should return empty compressed for empty string", async () => {
|
|
const messages = [{ role: "user", content: "" }];
|
|
const result = await ultraCompress(messages, baseConfig);
|
|
assert.strictEqual(result.messages[0].content, "");
|
|
});
|
|
|
|
it("should handle recursion guard for already-compressed strings", async () => {
|
|
const messages = [{ role: "user", content: "[COMPRESSED: already compressed" }];
|
|
const result = await ultraCompress(messages, baseConfig);
|
|
assert.strictEqual(result.messages[0].content, "[COMPRESSED: already compressed");
|
|
});
|
|
|
|
it("should keep all tokens when compressionRate=1.0", async () => {
|
|
const config = { ...baseConfig, compressionRate: 1.0 };
|
|
const messages = [{ role: "user", content: "the quick brown fox jumps" }];
|
|
const result = await ultraCompress(messages, config);
|
|
assert.strictEqual(result.stats.originalTokens, result.stats.compressedTokens);
|
|
});
|
|
|
|
it("should remove tokens when compressionRate=0.5", async () => {
|
|
const config = { ...baseConfig, compressionRate: 0.5 };
|
|
const messages = [{ role: "user", content: "the quick brown fox jumps over lazy dog" }];
|
|
const result = await ultraCompress(messages, config);
|
|
assert(result.stats.compressedTokens < result.stats.originalTokens);
|
|
});
|
|
|
|
it("should keep only force-preserved tokens when compressionRate=0.0", async () => {
|
|
const config = { ...baseConfig, compressionRate: 0.0 };
|
|
const messages = [{ role: "user", content: "check https://example.com here" }];
|
|
const result = await ultraCompress(messages, config);
|
|
assert(result.stats.compressedTokens <= result.stats.originalTokens);
|
|
});
|
|
|
|
it("should ensure compressedTokens <= originalTokens", async () => {
|
|
const config = { ...baseConfig, compressionRate: 0.5 };
|
|
const messages = [{ role: "user", content: "the quick brown fox jumps over the lazy dog" }];
|
|
const result = await ultraCompress(messages, config);
|
|
assert(result.stats.compressedTokens <= result.stats.originalTokens);
|
|
});
|
|
|
|
it("should add [COMPRESSED: prefix to output", async () => {
|
|
const config = { ...baseConfig, compressionRate: 0.5 };
|
|
const messages = [{ role: "user", content: "the quick brown fox" }];
|
|
const result = await ultraCompress(messages, config);
|
|
assert(result.stats.techniquesUsed.includes("ultra-heuristic-pruning"));
|
|
});
|
|
|
|
it("should handle multiple messages", async () => {
|
|
const config = { ...baseConfig, compressionRate: 0.5 };
|
|
const messages = [
|
|
{ role: "user", content: "the quick brown fox" },
|
|
{ role: "assistant", content: "the lazy dog jumped" },
|
|
];
|
|
const result = await ultraCompress(messages, config);
|
|
assert.strictEqual(result.messages.length, 2);
|
|
});
|
|
|
|
it("should preserve message role and other fields", async () => {
|
|
const config = { ...baseConfig, compressionRate: 0.5 };
|
|
const messages = [{ role: "user", content: "hello world", id: "msg1" }];
|
|
const result = await ultraCompress(messages, config);
|
|
assert.strictEqual(result.messages[0].role, "user");
|
|
assert.strictEqual(result.messages[0].id, "msg1");
|
|
});
|
|
|
|
it("should handle multimodal content (text blocks)", async () => {
|
|
const config = { ...baseConfig, compressionRate: 0.5 };
|
|
const messages = [
|
|
{
|
|
role: "user",
|
|
content: [
|
|
{ type: "text", text: "the quick brown fox" },
|
|
{ type: "image", url: "https://example.com/img.png" },
|
|
],
|
|
},
|
|
];
|
|
const result = await ultraCompress(messages, config);
|
|
assert(Array.isArray(result.messages[0].content));
|
|
});
|
|
|
|
it("should include stats with timestamp", async () => {
|
|
const config = { ...baseConfig, compressionRate: 0.5 };
|
|
const messages = [{ role: "user", content: "the quick brown fox" }];
|
|
const result = await ultraCompress(messages, config);
|
|
assert(result.stats.timestamp > 0);
|
|
});
|
|
|
|
it("should include stats with durationMs", async () => {
|
|
const config = { ...baseConfig, compressionRate: 0.5 };
|
|
const messages = [{ role: "user", content: "the quick brown fox" }];
|
|
const result = await ultraCompress(messages, config);
|
|
assert(result.stats.durationMs !== undefined && result.stats.durationMs >= 0);
|
|
});
|
|
|
|
it("should mark mode as 'ultra' in stats", async () => {
|
|
const config = { ...baseConfig, compressionRate: 0.5 };
|
|
const messages = [{ role: "user", content: "the quick brown fox" }];
|
|
const result = await ultraCompress(messages, config);
|
|
assert.strictEqual(result.stats.mode, "ultra");
|
|
});
|
|
|
|
it("should calculate savingsPercent correctly", async () => {
|
|
const config = { ...baseConfig, compressionRate: 1.0 };
|
|
const messages = [{ role: "user", content: "the quick brown fox" }];
|
|
const result = await ultraCompress(messages, config);
|
|
assert.strictEqual(result.stats.savingsPercent, 0);
|
|
});
|
|
});
|