@economic/agents 2.14.1 → 2.14.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +2 -0
- package/dist/index.mjs +50 -0
- package/package.json +1 -1
- package/schema/0003_agent_chats.sql +24 -0
package/dist/index.d.mts
CHANGED
|
@@ -519,6 +519,8 @@ declare abstract class ChatAgent<RequestContext extends Record<string, unknown>
|
|
|
519
519
|
* returned immediately and each event reaches the client as it is produced.
|
|
520
520
|
*/
|
|
521
521
|
private streamMessage;
|
|
522
|
+
private streamToolApproval;
|
|
523
|
+
private streamTurn;
|
|
522
524
|
/**
|
|
523
525
|
* Submit feedback for a message by its id.
|
|
524
526
|
* @param messageId - The id of the message to give feedback on.
|
package/dist/index.mjs
CHANGED
|
@@ -4,6 +4,7 @@ import { Output, convertToModelMessages, generateText, jsonSchema, pruneMessages
|
|
|
4
4
|
import { createRemoteJWKSet, decodeJwt, errors, jwtVerify } from "jose";
|
|
5
5
|
import { BasicTracerProvider, SimpleSpanProcessor } from "@opentelemetry/sdk-trace-base";
|
|
6
6
|
import { genericObservability } from "agents/observability";
|
|
7
|
+
import { applyToolUpdate, toolApprovalUpdate } from "agents/chat";
|
|
7
8
|
import { createCompactFunction, estimateMessageTokens, estimateStringTokens, sanitizeToolPairs, truncateOlderMessages } from "agents/experimental/memory/utils";
|
|
8
9
|
import { nanoid } from "nanoid";
|
|
9
10
|
//#region src/server/features/auth/index.ts
|
|
@@ -2846,6 +2847,22 @@ var ChatAgent = class extends Agent {
|
|
|
2846
2847
|
if (action === "getMessages" && request.method === "GET") return Response.json(await this.getMessages());
|
|
2847
2848
|
if (action === "getInvocableSkills" && request.method === "GET") return Response.json(await this.getInvocableSkills(auth.userContext));
|
|
2848
2849
|
if (action === "sendMessage" && request.method === "POST") return this.streamMessage(request);
|
|
2850
|
+
if (action === "submitToolApproval" && request.method === "POST") return this.streamToolApproval(request);
|
|
2851
|
+
if (action === "getMessageFeedback" && request.method === "GET") return Response.json(await this.getMessageFeedback());
|
|
2852
|
+
if (action === "submitMessageFeedback" && request.method === "POST") {
|
|
2853
|
+
let payload;
|
|
2854
|
+
try {
|
|
2855
|
+
payload = await request.json();
|
|
2856
|
+
} catch {
|
|
2857
|
+
return Response.json({ error: "Request body must be valid JSON" }, { status: 400 });
|
|
2858
|
+
}
|
|
2859
|
+
if (!payload || typeof payload !== "object" || Array.isArray(payload)) return Response.json({ error: "Request body must be an object" }, { status: 400 });
|
|
2860
|
+
const { messageId, rating, comment } = payload;
|
|
2861
|
+
if (!messageId) return Response.json({ error: "Message ID is required" }, { status: 400 });
|
|
2862
|
+
if (rating !== -1 && rating !== 0 && rating !== 1) return Response.json({ error: "Rating must be -1, 0, or 1" }, { status: 400 });
|
|
2863
|
+
if (comment !== void 0 && typeof comment !== "string") return Response.json({ error: "Comment must be a string" }, { status: 400 });
|
|
2864
|
+
return Response.json(await this.submitMessageFeedback(messageId, rating, comment));
|
|
2865
|
+
}
|
|
2849
2866
|
if (action === "cancelChat" && request.method === "POST") {
|
|
2850
2867
|
const { requestId } = await request.json();
|
|
2851
2868
|
this.cancelChat(requestId);
|
|
@@ -2882,6 +2899,39 @@ var ChatAgent = class extends Agent {
|
|
|
2882
2899
|
this._turn.context = this.createToolContextForCurrentTurn(context);
|
|
2883
2900
|
return [message];
|
|
2884
2901
|
} : message;
|
|
2902
|
+
return this.streamTurn(input);
|
|
2903
|
+
}
|
|
2904
|
+
async streamToolApproval(request) {
|
|
2905
|
+
let payload;
|
|
2906
|
+
try {
|
|
2907
|
+
payload = await request.json();
|
|
2908
|
+
} catch {
|
|
2909
|
+
return Response.json({ error: "Request body must be valid JSON" }, { status: 400 });
|
|
2910
|
+
}
|
|
2911
|
+
if (!payload || typeof payload !== "object" || Array.isArray(payload)) return Response.json({ error: "Request body must be an object" }, { status: 400 });
|
|
2912
|
+
const { toolCallId, approved, context } = payload;
|
|
2913
|
+
if (!toolCallId) return Response.json({ error: "Tool call ID is required" }, { status: 400 });
|
|
2914
|
+
if (typeof approved !== "boolean") return Response.json({ error: "Approved must be a boolean" }, { status: 400 });
|
|
2915
|
+
if (context !== void 0 && (context === null || typeof context !== "object" || Array.isArray(context))) return Response.json({ error: "Context must be an object" }, { status: 400 });
|
|
2916
|
+
return this.streamTurn((messages) => {
|
|
2917
|
+
if (context) this._turn.context = this.createToolContextForCurrentTurn(context);
|
|
2918
|
+
const update = toolApprovalUpdate(toolCallId, approved);
|
|
2919
|
+
let found = false;
|
|
2920
|
+
const updatedMessages = messages.map((message) => {
|
|
2921
|
+
if (found || message.role !== "assistant") return message;
|
|
2922
|
+
const result = applyToolUpdate(message.parts, update);
|
|
2923
|
+
if (!result) return message;
|
|
2924
|
+
found = true;
|
|
2925
|
+
return {
|
|
2926
|
+
...message,
|
|
2927
|
+
parts: result.parts
|
|
2928
|
+
};
|
|
2929
|
+
});
|
|
2930
|
+
if (!found) throw new Error(`No pending tool approval found for ${toolCallId}`);
|
|
2931
|
+
return updatedMessages;
|
|
2932
|
+
});
|
|
2933
|
+
}
|
|
2934
|
+
streamTurn(input) {
|
|
2885
2935
|
const encoder = new TextEncoder();
|
|
2886
2936
|
const readable = new ReadableStream({ start: async (controller) => {
|
|
2887
2937
|
const send = (event, data) => controller.enqueue(encoder.encode(`event: ${event}\ndata: ${data}\n\n`));
|
package/package.json
CHANGED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
-- ─── Global chat list ─────────────────────────────────────────────────────────────
|
|
2
|
+
-- One row per chat across every Assistant, synced by the owning Assistant DO
|
|
3
|
+
-- whenever a chat is created, updated, or deleted. Lets dashboards list and
|
|
4
|
+
-- page through chats without waking each DO.
|
|
5
|
+
--
|
|
6
|
+
-- Same DDL as the eva-dashboard migration 0005_agent_chats.sql; both apply to
|
|
7
|
+
-- the shared D1 database, so IF NOT EXISTS keeps this a no-op there.
|
|
8
|
+
|
|
9
|
+
CREATE TABLE IF NOT EXISTS agent_chats (
|
|
10
|
+
agent_name TEXT NOT NULL,
|
|
11
|
+
assistant_name TEXT NOT NULL,
|
|
12
|
+
chat_id TEXT NOT NULL,
|
|
13
|
+
title TEXT,
|
|
14
|
+
summary TEXT,
|
|
15
|
+
created_at INTEGER NOT NULL,
|
|
16
|
+
updated_at INTEGER NOT NULL,
|
|
17
|
+
positive_feedback_count INTEGER NOT NULL DEFAULT 0,
|
|
18
|
+
negative_feedback_count INTEGER NOT NULL DEFAULT 0,
|
|
19
|
+
|
|
20
|
+
PRIMARY KEY (agent_name, assistant_name, chat_id)
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
CREATE INDEX IF NOT EXISTS agent_chats_page
|
|
24
|
+
ON agent_chats(agent_name, updated_at DESC, assistant_name, chat_id);
|