Skip to content

Commit 96322ce

Browse files
committed
refactor: optimize interrupt handling and remove unnecessary logging in agent flow
1 parent 3de87ee commit 96322ce

4 files changed

Lines changed: 12 additions & 132 deletions

File tree

application/runTurnUseCase.ts

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -244,15 +244,17 @@ export class RunTurnUseCase {
244244
interrupt: unknown,
245245
descriptors: PendingInterrupt[],
246246
) {
247-
const existing = this.pendingInterrupts.get(prepared.sessionId) ?? [];
248-
const merged = new Map(existing.map((item) => [item.id, item.count]));
249-
for (const item of descriptors) {
250-
merged.set(item.id, item.count);
247+
if (!this.deps.hasPersistentCheckpointer) {
248+
const existing = this.pendingInterrupts.get(prepared.sessionId) ?? [];
249+
const merged = new Map(existing.map((item) => [item.id, item.count]));
250+
for (const item of descriptors) {
251+
merged.set(item.id, item.count);
252+
}
253+
this.pendingInterrupts.set(
254+
prepared.sessionId,
255+
[...merged.entries()].map(([id, count]) => ({ id, count })),
256+
);
251257
}
252-
this.pendingInterrupts.set(
253-
prepared.sessionId,
254-
[...merged.entries()].map(([id, count]) => ({ id, count })),
255-
);
256258
await prepared.observability.emit?.({
257259
type: "interrupt",
258260
sessionId: prepared.sessionId,
@@ -312,7 +314,7 @@ export class RunTurnUseCase {
312314
await textBuffer.flush(emit);
313315
return { text: fullResponse };
314316
} finally {
315-
if (!interrupted) {
317+
if (!this.deps.hasPersistentCheckpointer && !interrupted) {
316318
this.pendingInterrupts.delete(prepared.sessionId);
317319
}
318320
}

llm/agentModels.ts

Lines changed: 1 addition & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import type { BaseChatModel } from "@langchain/core/language_models/chat_models";
22
import {
3-
logger,
43
type CompletionAdapter,
54
} from "adminforth";
65
import { BaseCallbackHandler } from "@langchain/core/callbacks/base";
@@ -35,19 +34,8 @@ type AgentChatModelSpec = {
3534
middleware: AgentMiddleware[];
3635
};
3736

38-
type LlmOutputTokenUsage = {
39-
promptTokens?: unknown;
40-
completionTokens?: unknown;
41-
};
42-
43-
type MessageUsageMetadata = {
44-
input_tokens?: unknown;
45-
output_tokens?: unknown;
46-
};
47-
4837
type PendingLlmRun = {
4938
startedAt: number;
50-
firstTokenAt?: number;
5139
};
5240

5341
function isLangChainAgentCompletionAdapter(
@@ -73,61 +61,6 @@ async function getAgentChatModelSpec(params: {
7361
};
7462
}
7563

76-
function getFiniteNumber(value: unknown) {
77-
return typeof value === "number" && Number.isFinite(value)
78-
? value
79-
: undefined;
80-
}
81-
82-
function extractTokenUsage(output: LLMResult) {
83-
const llmOutputTokenUsage = (
84-
output.llmOutput as { tokenUsage?: LlmOutputTokenUsage } | undefined
85-
)?.tokenUsage;
86-
87-
const promptTokens = getFiniteNumber(llmOutputTokenUsage?.promptTokens);
88-
const completionTokens = getFiniteNumber(
89-
llmOutputTokenUsage?.completionTokens,
90-
);
91-
92-
if (promptTokens !== undefined || completionTokens !== undefined) {
93-
return {
94-
InputTokens: promptTokens ?? 0,
95-
outputTokens: completionTokens ?? 0,
96-
};
97-
}
98-
99-
let InputTokens = 0;
100-
let outputTokens = 0;
101-
102-
for (const generationBatch of output.generations) {
103-
for (const generation of generationBatch) {
104-
if (!("message" in generation) || !generation.message) {
105-
continue;
106-
}
107-
108-
const message = generation.message as {
109-
usage_metadata?: MessageUsageMetadata;
110-
response_metadata?: {
111-
tokenUsage?: LlmOutputTokenUsage;
112-
};
113-
};
114-
115-
InputTokens +=
116-
getFiniteNumber(message.usage_metadata?.input_tokens) ??
117-
getFiniteNumber(message.response_metadata?.tokenUsage?.promptTokens) ??
118-
0;
119-
outputTokens +=
120-
getFiniteNumber(message.usage_metadata?.output_tokens) ??
121-
getFiniteNumber(
122-
message.response_metadata?.tokenUsage?.completionTokens,
123-
) ??
124-
0;
125-
}
126-
}
127-
128-
return { InputTokens, outputTokens };
129-
}
130-
13164
class AgentLlmMetricsLogger extends BaseCallbackHandler {
13265
name = "AgentLlmMetricsLogger";
13366
lc_prefer_streaming = true;
@@ -138,41 +71,8 @@ class AgentLlmMetricsLogger extends BaseCallbackHandler {
13871
this.pendingRuns.set(runId, { startedAt: Date.now() });
13972
}
14073

141-
async handleLLMNewToken(
142-
_token: string,
143-
_chunk: unknown,
144-
runId: string,
145-
) {
146-
const pendingRun = this.pendingRuns.get(runId);
147-
148-
if (!pendingRun || pendingRun.firstTokenAt !== undefined) {
149-
return;
150-
}
151-
152-
pendingRun.firstTokenAt = Date.now();
153-
}
154-
155-
async handleLLMEnd(output: LLMResult, runId: string) {
156-
const pendingRun = this.pendingRuns.get(runId);
157-
158-
if (!pendingRun) {
159-
return;
160-
}
161-
74+
async handleLLMEnd(_output: LLMResult, runId: string) {
16275
this.pendingRuns.delete(runId);
163-
164-
const finishedAt = Date.now();
165-
const rtt = finishedAt - pendingRun.startedAt;
166-
const ttft =
167-
pendingRun.firstTokenAt === undefined
168-
? rtt
169-
: pendingRun.firstTokenAt - pendingRun.startedAt;
170-
const { InputTokens, outputTokens } = extractTokenUsage(output);
171-
172-
logger.info(
173-
{ InputTokens, outputTokens, ttft, rtt },
174-
"LLM call finished",
175-
);
17676
}
17777

17878
async handleLLMError(_error: unknown, runId: string) {

llm/middleware/apiToolsMiddleware.ts

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -72,18 +72,13 @@ export function createApiBasedToolsMiddleware(
7272
.map((toolName) => dynamicTools[toolName]);
7373
const availableTools = [...request.tools, ...tools];
7474

75-
logger.info(
76-
`AdminForth Agent callable tools: ${availableTools.map((tool) => tool.name).join(", ")}`,
77-
);
78-
7975
return handler({
8076
...request,
8177
tools: availableTools,
8278
});
8379
},
8480
async wrapToolCall(request, handler) {
8581
const startedAt = Date.now();
86-
const toolInput = JSON.stringify(request.toolCall.args ?? {});
8782
if (!request.toolCall.id) {
8883
throw new Error(`Tool call "${request.toolCall.name}" has no id.`);
8984
}
@@ -128,9 +123,6 @@ export function createApiBasedToolsMiddleware(
128123
startedAt,
129124
});
130125
toolCallTracker.start();
131-
logger.info(
132-
`Invoking tool "${request.toolCall.name}" with input: ${toolInput}`,
133-
);
134126

135127
try {
136128

@@ -164,10 +156,6 @@ export function createApiBasedToolsMiddleware(
164156
status: "error",
165157
content: `Error: ${message}`,
166158
})
167-
} finally {
168-
logger.info(
169-
`Tool "${request.toolCall.name}" finished in ${Date.now() - startedAt}ms`,
170-
);
171159
}
172160
},
173161
});

tools/apiBasedTools.ts

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -574,7 +574,6 @@ async function callOpenApiSchema(params: {
574574
}
575575

576576
const response = createDirectToolResponse();
577-
logger.info(`Calling OpenAPI tool "${toolName}" with direct handler`);
578577
const lang = acceptLanguage ?? "en";
579578
const tr = (
580579
msg: string,
@@ -659,15 +658,6 @@ export function prepareApiBasedTools(
659658
}
660659
}
661660

662-
logger.info(
663-
`AdminForth Agent OpenAPI APIs: ${formatLogNameList(
664-
adminforth.openApi.registeredSchemas.map((schema) => openApiSchemaPathToToolName(schema.path, adminforth)),
665-
)}`,
666-
);
667-
logger.info(
668-
`AdminForth Agent OpenAPI tools connected: ${formatLogNameList([...openApiSchemasByToolName.keys()])}`,
669-
);
670-
671661
for (const [toolName, schema] of openApiSchemasByToolName.entries()) {
672662
apiBasedTools[toolName] = {
673663
description: schema.description,

0 commit comments

Comments
 (0)