chore(vendor): import pi 1.3.0
Imported as a linear vendor commit so forge rebases do not replay the upstream root tree. git-subtree-dir: third_party/pi git-subtree-split: 71023aec1546d6d677a65669c5665c0927ce0dd0
This commit is contained in:
1 parent
719370c8f7
commit
6081e3e325
1743 files changed
+205459
-131704
No files matched your search
+26
-10
@@ -1,7 +1,8 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { buildBaseOptions } from "../src/api/simple-options.ts";
|
||||
import type { AssistantMessage, Context, Model, Usage } from "../src/types.ts";
|
||||
import type { AssistantMessage, Model, Usage } from "../src/types.ts";
|
||||
import { estimateContextTokens } from "../src/utils/estimate.ts";
|
||||
import { normalizeContext } from "../src/utils/transcript.ts";
|
||||
|
||||
function createUsage(totalTokens: number): Usage {
|
||||
return {
|
||||
@@ -41,27 +42,42 @@ const model: Model<"openai-responses"> = {
|
||||
};
|
||||
|
||||
describe("context token estimation", () => {
|
||||
// Regression for #10497: large new inputs need more room than chars/4 allows.
|
||||
it("reserves 3.5 characters per token for new text when limiting output", () => {
|
||||
const context = normalizeContext({
|
||||
messages: [createAssistant(100, 2_000), { role: "user", content: "x".repeat(3_500), timestamp: 200 }],
|
||||
});
|
||||
|
||||
expect(estimateContextTokens(context)).toEqual({
|
||||
tokens: 3_000,
|
||||
usageTokens: 2_000,
|
||||
trailingTokens: 1_000,
|
||||
lastUsageIndex: 0,
|
||||
});
|
||||
expect(buildBaseOptions(model, context).maxTokens).toBe(2_904);
|
||||
});
|
||||
|
||||
it("ignores stale assistant usage after a newer message is inserted before it", () => {
|
||||
const context: Context = {
|
||||
const context = normalizeContext({
|
||||
systemPrompt: "system",
|
||||
messages: [
|
||||
{ role: "user", content: "summary", timestamp: 200 },
|
||||
createAssistant(100, 9_500),
|
||||
{ role: "user", content: "x".repeat(4_000), timestamp: 300 },
|
||||
],
|
||||
};
|
||||
});
|
||||
|
||||
expect(estimateContextTokens(context)).toEqual({
|
||||
tokens: 1_005,
|
||||
tokens: 1_149,
|
||||
usageTokens: 0,
|
||||
trailingTokens: 1_005,
|
||||
trailingTokens: 1_149,
|
||||
lastUsageIndex: null,
|
||||
});
|
||||
expect(buildBaseOptions(model, context).maxTokens).toBe(4_899);
|
||||
expect(buildBaseOptions(model, context).maxTokens).toBe(4_755);
|
||||
});
|
||||
|
||||
it("uses assistant usage again after a response to the inserted context", () => {
|
||||
const context: Context = {
|
||||
const context = normalizeContext({
|
||||
messages: [
|
||||
{ role: "user", content: "summary", timestamp: 200 },
|
||||
createAssistant(100, 9_500),
|
||||
@@ -69,12 +85,12 @@ describe("context token estimation", () => {
|
||||
createAssistant(400, 2_000),
|
||||
{ role: "user", content: "tail", timestamp: 500 },
|
||||
],
|
||||
};
|
||||
});
|
||||
|
||||
expect(estimateContextTokens(context)).toEqual({
|
||||
tokens: 2_001,
|
||||
tokens: 2_002,
|
||||
usageTokens: 2_000,
|
||||
trailingTokens: 1,
|
||||
trailingTokens: 2,
|
||||
lastUsageIndex: 3,
|
||||
});
|
||||
});
|
||||
|
||||
Reference in new issue
Block a user