feat(canvas): 云端 Agent 交互 - 展示错误动作并支持连接器与提示词预填
This commit is contained in:
@@ -4,38 +4,50 @@ import { contextInputTokens, contextPressureRatio, emptyAgentContextUsage, prese
|
||||
const event = (runId: string, type: string, payload: Record<string, unknown>, seq = 1) => ({ runId, type, payload, seq });
|
||||
|
||||
describe("Agent context usage events", () => {
|
||||
it("keeps provider's previous measurement separate from projected next request", () => {
|
||||
it("uses only Pi SDK readings and never reads projected/provider fields", () => {
|
||||
const state = reduceAgentContextUsage(emptyAgentContextUsage("run-1"), event("run-1", "context_pressure", {
|
||||
modelLimitConfigured: true,
|
||||
usableInputTokens: 80_000,
|
||||
contextWindowTokens: 128_000,
|
||||
pressureTokens: 40_000,
|
||||
projectedNextInputTokens: 48_000,
|
||||
projectedPressureRatio: 0.6,
|
||||
estimatedInputTokens: 48_000,
|
||||
pressureRatio: 0.6,
|
||||
tokenSource: "provider",
|
||||
}));
|
||||
expect(contextInputTokens(state.reading)).toBe(48_000);
|
||||
expect(contextPressureRatio(state.reading)).toBe(0.6);
|
||||
expect(state.reading).toBeNull();
|
||||
expect(contextInputTokens({ tokenSource: "provider", estimatedInputTokens: 48_000, projectedNextInputTokens: 99_000 })).toBeUndefined();
|
||||
expect(contextPressureRatio({ tokenSource: "provider", contextWindowTokens: 128_000, projectedPressureRatio: 0.6 })).toBeUndefined();
|
||||
|
||||
const piReading = {
|
||||
modelLimitConfigured: true,
|
||||
contextWindowTokens: 128_000,
|
||||
estimatedInputTokens: 48_000,
|
||||
pressureRatio: 0.6,
|
||||
tokenSource: "pi",
|
||||
projectedNextInputTokens: 99_000,
|
||||
projectedPressureRatio: 0.99,
|
||||
};
|
||||
expect(contextInputTokens(piReading)).toBe(48_000);
|
||||
expect(contextPressureRatio(piReading)).toBe(0.6);
|
||||
});
|
||||
|
||||
it("does not invent percentages when the model window is unknown", () => {
|
||||
const state = reduceAgentContextUsage(emptyAgentContextUsage("run-1"), event("run-1", "context_pressure", {
|
||||
estimatedInputTokens: 12_000,
|
||||
modelLimitConfigured: false,
|
||||
tokenSource: "pi",
|
||||
}));
|
||||
expect(contextInputTokens(state.reading)).toBe(12_000);
|
||||
expect(contextPressureRatio(state.reading)).toBeUndefined();
|
||||
});
|
||||
|
||||
it("marks pre-compaction readings stale until a fresh pressure event arrives", () => {
|
||||
let state = reduceAgentContextUsage(emptyAgentContextUsage("run-1"), event("run-1", "context_pressure", { pressureRatio: 0.8, modelLimitConfigured: true, usableInputTokens: 100, contextWindowTokens: 100 }, 2));
|
||||
let state = reduceAgentContextUsage(emptyAgentContextUsage("run-1"), event("run-1", "context_pressure", { tokenSource: "pi", pressureRatio: 0.8, modelLimitConfigured: true, usableInputTokens: 100, contextWindowTokens: 100 }, 2));
|
||||
state = reduceAgentContextUsage(state, event("run-1", "context_compaction_requested", { basis: "tokens" }, 3));
|
||||
expect(state.compactionPending).toEqual({ basis: "tokens" });
|
||||
state = reduceAgentContextUsage(state, event("run-1", "context_compacted", { mode: "checkpoint", resume: true }, 4));
|
||||
expect(state.readingStale).toBe(true);
|
||||
expect(state.compactionPending).toBeNull();
|
||||
expect(state.lastCompaction).toEqual({ mode: "checkpoint", resume: true });
|
||||
state = reduceAgentContextUsage(state, event("run-1", "context_pressure", { pressureRatio: 0.25, modelLimitConfigured: true, usableInputTokens: 100, contextWindowTokens: 100 }, 5));
|
||||
state = reduceAgentContextUsage(state, event("run-1", "context_pressure", { tokenSource: "pi", pressureRatio: 0.25, modelLimitConfigured: true, usableInputTokens: 100, contextWindowTokens: 100 }, 5));
|
||||
expect(state.readingStale).toBe(false);
|
||||
expect(contextPressureRatio(state.reading)).toBe(0.25);
|
||||
});
|
||||
@@ -43,12 +55,12 @@ describe("Agent context usage events", () => {
|
||||
it("fills the ring against the model context window and keeps the compaction line as a marker", () => {
|
||||
const state = reduceAgentContextUsage(emptyAgentContextUsage("run-1"), event("run-1", "context_pressure", {
|
||||
modelLimitConfigured: true,
|
||||
tokenSource: "provider",
|
||||
tokenSource: "pi",
|
||||
usableInputTokens: 100_000,
|
||||
compactAtTokens: 85_000,
|
||||
contextWindowTokens: 128_000,
|
||||
projectedNextInputTokens: 42_500,
|
||||
projectedPressureRatio: 0.425,
|
||||
estimatedInputTokens: 42_500,
|
||||
pressureRatio: 0.425,
|
||||
breakdown: { buckets: [
|
||||
{ key: "system", label: "系统提示(含画布摘要)", tokens: 8_000, scaledTokens: 9_000, bytes: 12_000 },
|
||||
{ key: "tools", tokens: 4_000, scaledTokens: 4_500, bytes: 18_000 },
|
||||
@@ -75,6 +87,7 @@ describe("Agent context usage events", () => {
|
||||
compactAtTokens: 85,
|
||||
estimatedInputTokens: 90,
|
||||
pressureRatio: 0.9,
|
||||
tokenSource: "pi",
|
||||
}));
|
||||
expect(presentAgentContextUsage(state).phase).toBe("compress");
|
||||
expect(presentAgentContextUsage(state).ring).toBe(0.9);
|
||||
@@ -89,6 +102,7 @@ describe("Agent context usage events", () => {
|
||||
const state = reduceAgentContextUsage(emptyAgentContextUsage("run-1"), event("run-1", "context_pressure", {
|
||||
estimatedInputTokens: 12_000,
|
||||
modelLimitConfigured: false,
|
||||
tokenSource: "pi",
|
||||
}));
|
||||
const view = presentAgentContextUsage(state);
|
||||
expect(view.phase).toBe("unknown");
|
||||
|
||||
Reference in New Issue
Block a user