Repository navigation
Expand file tree
/
Copy pathassistant-message.ts
More file actions
90 lines (76 loc) · 2.37 KB
/
Copy pathassistant-message.ts
File metadata and controls
90 lines (76 loc) · 2.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import { createLogger } from "./sdk-logger";
const logger = createLogger("AssistantLogger");
export interface AssistantMessageInfo {
id: string;
content: string;
model: string;
provider: string;
created: string;
tokens: {
input: number;
output: number;
reasoning: number;
};
cost: number;
}
export async function getLastAssistantMessage(
client: any,
sessionID: string,
directory?: string
): Promise<AssistantMessageInfo | null> {
try {
const response = await client.Session.messages({
path: { id: sessionID },
query: {
limit: 50,
directory: directory || ""
}
});
if (!response.data || response.data.length === 0) {
logger.warn("No messages found in session");
return null;
}
// Filter for assistant messages and get the last one
const assistantMessages = response.data.filter(
(msg: any) => msg.info.role === "assistant"
);
if (assistantMessages.length === 0) {
logger.warn("No assistant messages found in session");
return null;
}
const lastAssistant = assistantMessages[assistantMessages.length - 1];
const info = lastAssistant.info as any;
// Extract text content from parts
const textContent = lastAssistant.parts
.filter((part: any) => part.type === "text")
.map((part: any) => part.text)
.join("\n");
const result: AssistantMessageInfo = {
id: info.id,
content: textContent.slice(0, 200) + (textContent.length > 200 ? "..." : ""),
model: `${info.providerID}/${info.modelID}`,
provider: info.providerID,
created: new Date(info.time.created).toISOString(),
tokens: info.tokens || { input: 0, output: 0, reasoning: 0 },
cost: info.cost || 0,
};
logger.info("Retrieved last assistant message", {
messageID: result.id,
model: result.model,
tokens: result.tokens,
cost: result.cost
});
return result;
} catch (error) {
logger.error("Failed to fetch assistant message", error);
return null;
}
}
// Example usage in a plugin hook:
// "chat.message": async ({ sessionID }, { message }) => {
// const lastAssistant = await getLastAssistantMessage(ctx.client, sessionID, ctx.directory);
// if (lastAssistant) {
// logger.info("Last assistant message:", { content: lastAssistant.content });
// }
// }
export default getLastAssistantMessage;