@relevanceai/sdk 3.0.0-alpha.2 → 3.0.0-alpha.4
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/README.md +422 -193
- package/esm/agent.d.ts +20 -8
- package/esm/agent.js +32 -12
- package/esm/client.d.ts +4 -8
- package/esm/client.js +11 -12
- package/esm/emitter.d.ts +16 -0
- package/esm/emitter.js +15 -0
- package/{script/events.d.ts → esm/event.d.ts} +10 -13
- package/esm/{events.js → event.js} +0 -6
- package/esm/message/agent-error.d.ts +6 -0
- package/esm/message/agent-error.js +3 -0
- package/esm/message/agent.d.ts +9 -0
- package/esm/message/agent.js +9 -0
- package/esm/message/task.d.ts +42 -0
- package/esm/message/task.js +38 -0
- package/esm/message/tool.d.ts +108 -0
- package/esm/message/tool.js +109 -0
- package/esm/message/user.d.ts +20 -0
- package/esm/message/user.js +19 -0
- package/esm/mod.d.ts +6 -3
- package/esm/mod.js +1 -0
- package/esm/task.d.ts +50 -18
- package/esm/task.js +228 -65
- package/esm/utils.d.ts +1 -5
- package/esm/utils.js +1 -13
- package/package.json +1 -1
- package/script/agent.d.ts +20 -8
- package/script/agent.js +32 -12
- package/script/client.d.ts +4 -8
- package/script/client.js +11 -12
- package/script/emitter.d.ts +16 -0
- package/script/emitter.js +19 -0
- package/{esm/events.d.ts → script/event.d.ts} +10 -13
- package/script/{events.js → event.js} +1 -8
- package/script/message/agent-error.d.ts +6 -0
- package/script/message/agent-error.js +7 -0
- package/script/message/agent.d.ts +9 -0
- package/script/message/agent.js +13 -0
- package/script/message/task.d.ts +42 -0
- package/script/message/task.js +42 -0
- package/script/message/tool.d.ts +108 -0
- package/script/message/tool.js +113 -0
- package/script/message/user.d.ts +20 -0
- package/script/message/user.js +23 -0
- package/script/mod.d.ts +6 -3
- package/script/mod.js +3 -1
- package/script/task.d.ts +50 -18
- package/script/task.js +228 -65
- package/script/utils.d.ts +1 -5
- package/script/utils.js +1 -14
- package/esm/agent-task.d.ts +0 -61
- package/esm/agent-task.js +0 -112
- package/esm/message.d.ts +0 -18
- package/esm/message.js +0 -18
- package/script/agent-task.d.ts +0 -61
- package/script/agent-task.js +0 -116
- package/script/message.d.ts +0 -18
- package/script/message.js +0 -22
package/esm/mod.js
CHANGED
package/esm/task.d.ts
CHANGED
|
@@ -1,25 +1,57 @@
|
|
|
1
|
+
import { Agent } from "./agent.js";
|
|
1
2
|
import { Client } from "./client.js";
|
|
2
|
-
import
|
|
3
|
+
import { Emitter } from "./emitter.js";
|
|
4
|
+
import { AgentMessage } from "./message/agent.js";
|
|
5
|
+
import type { AnyTaskMessage } from "./message/task.js";
|
|
6
|
+
import { ToolMessage } from "./message/tool.js";
|
|
7
|
+
import { UserMessage } from "./message/user.js";
|
|
8
|
+
export type TaskState = "idle" | "starting-up" | "running" | "pending-approval" | "waiting-for-capacity" | "cancelled" | "timed-out" | "escalated" | "unrecoverable" | "paused" | "completed" | "errored-pending-approval" | "queued-for-approval" | "queued-for-rerun";
|
|
3
9
|
export type TaskStatus = "not-started" | "idle" | "queued" | "running" | "action" | "complete" | "error";
|
|
4
|
-
|
|
10
|
+
type TaskMetadata = {
|
|
11
|
+
knowledge_set: string;
|
|
12
|
+
insert_date: string;
|
|
13
|
+
update_date: string;
|
|
14
|
+
conversation: {
|
|
15
|
+
created_by_user_id: string;
|
|
16
|
+
state: TaskState;
|
|
17
|
+
title: string;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
type TaskEventMap = {
|
|
21
|
+
start: {
|
|
22
|
+
status: TaskStatus;
|
|
23
|
+
};
|
|
24
|
+
status: {
|
|
25
|
+
status: TaskStatus;
|
|
26
|
+
};
|
|
27
|
+
message: {
|
|
28
|
+
message: AgentMessage | UserMessage;
|
|
29
|
+
};
|
|
30
|
+
update: {
|
|
31
|
+
message: ToolMessage;
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
export declare const resetSubscribeBackoff: unique symbol;
|
|
35
|
+
export declare class Task extends Emitter<TaskEventMap> {
|
|
5
36
|
#private;
|
|
6
|
-
|
|
37
|
+
static get(id: string, agentOrAgentId: Agent | string, client?: Client): Promise<Task>;
|
|
38
|
+
readonly agent: Agent;
|
|
7
39
|
protected readonly client: Client;
|
|
8
|
-
|
|
9
|
-
|
|
40
|
+
protected constructor(metadata: TaskMetadata, agent: Agent, client?: Client);
|
|
41
|
+
get id(): string;
|
|
42
|
+
get title(): string;
|
|
43
|
+
get status(): TaskStatus;
|
|
44
|
+
isRunning(): boolean;
|
|
45
|
+
getMessages({ from }?: {
|
|
10
46
|
from?: Date;
|
|
11
|
-
}): Promise<
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
protected
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
addEventListener<K extends keyof E>(type: Extract<K, string>, listener: ((event: CustomEvent<E[K]>) => void) | {
|
|
20
|
-
handleEvent: (event: CustomEvent<E[K]>) => void;
|
|
21
|
-
} | null, options?: boolean | AddEventListenerOptions): void;
|
|
22
|
-
removeEventListener<K extends keyof E>(type: Extract<K, string>, listener: ((event: CustomEvent<E[K]>) => void) | {
|
|
23
|
-
handleEvent: (event: CustomEvent<E[K]>) => void;
|
|
47
|
+
}): Promise<AnyTaskMessage[]>;
|
|
48
|
+
protected refresh(): Promise<void>;
|
|
49
|
+
[resetSubscribeBackoff](): void;
|
|
50
|
+
subscribe(): void;
|
|
51
|
+
protected isSubscribed(): boolean;
|
|
52
|
+
unsubscribe(): void;
|
|
53
|
+
addEventListener<K extends keyof TaskEventMap>(type: Extract<K, string>, listener: ((event: CustomEvent<TaskEventMap[K]>) => void) | {
|
|
54
|
+
handleEvent: (event: CustomEvent<TaskEventMap[K]>) => void;
|
|
24
55
|
} | null, options?: boolean | AddEventListenerOptions): void;
|
|
25
56
|
}
|
|
57
|
+
export {};
|
package/esm/task.js
CHANGED
|
@@ -1,88 +1,254 @@
|
|
|
1
|
+
import { Agent } from "./agent.js";
|
|
1
2
|
import { Client } from "./client.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
import { Emitter } from "./emitter.js";
|
|
4
|
+
import { TaskErrorEvent, TaskMessageEvent, TaskStatusEvent, TaskUpdateEvent, } from "./event.js";
|
|
5
|
+
import { AgentErrorMessage, } from "./message/agent-error.js";
|
|
6
|
+
import { AgentMessage } from "./message/agent.js";
|
|
7
|
+
import { ToolMessage } from "./message/tool.js";
|
|
8
|
+
import { UserMessage } from "./message/user.js";
|
|
9
|
+
import { abortPromise, delay } from "./utils.js";
|
|
10
|
+
/**
|
|
11
|
+
* Converts an AgentTaskState to a simplified TaskStatus.
|
|
12
|
+
*
|
|
13
|
+
* @internal
|
|
14
|
+
*
|
|
15
|
+
* @param {AgentTaskState} state The agent task state to convert.
|
|
16
|
+
* @returns {TaskStatus} The simplified task status.
|
|
17
|
+
*/
|
|
18
|
+
function stateToStatus(state) {
|
|
19
|
+
switch (state) {
|
|
20
|
+
case "paused":
|
|
21
|
+
case "idle":
|
|
22
|
+
return "idle";
|
|
23
|
+
case "starting-up":
|
|
24
|
+
case "waiting-for-capacity":
|
|
25
|
+
case "queued-for-approval":
|
|
26
|
+
case "queued-for-rerun":
|
|
27
|
+
return "queued";
|
|
28
|
+
case "running":
|
|
29
|
+
return "running";
|
|
30
|
+
case "pending-approval":
|
|
31
|
+
case "escalated":
|
|
32
|
+
return "action";
|
|
33
|
+
case "timed-out":
|
|
34
|
+
return "error";
|
|
35
|
+
case "cancelled":
|
|
36
|
+
case "completed":
|
|
37
|
+
return "complete";
|
|
38
|
+
case "unrecoverable":
|
|
39
|
+
case "errored-pending-approval":
|
|
40
|
+
return "error";
|
|
41
|
+
default:
|
|
42
|
+
throw new Error(`unhandled task state: ${state}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export const resetSubscribeBackoff = Symbol("resetSubscribeBackoff");
|
|
46
|
+
export class Task extends Emitter {
|
|
47
|
+
static async get(id, agentOrAgentId, client = Client.default()) {
|
|
48
|
+
const agent = typeof agentOrAgentId === "string"
|
|
49
|
+
? await Agent.get(agentOrAgentId, client)
|
|
50
|
+
: agentOrAgentId;
|
|
51
|
+
const metadata = await Task.#fetchMetadata(id, agent.id, client);
|
|
52
|
+
return new Task(metadata, agent, client);
|
|
53
|
+
}
|
|
54
|
+
static #fetchMetadata(id, agentId, client) {
|
|
55
|
+
return client.fetch(`/agents/${agentId}/tasks/${id}/metadata`).then(({ metadata }) => metadata);
|
|
56
|
+
}
|
|
57
|
+
#controller;
|
|
58
|
+
#backoffMs = 1000;
|
|
59
|
+
#lastUpdatedAt;
|
|
60
|
+
#delayController;
|
|
61
|
+
#metadata;
|
|
62
|
+
agent;
|
|
6
63
|
client;
|
|
7
|
-
|
|
8
|
-
listenController;
|
|
9
|
-
constructor(subject, id = undefined, client = Client.default()) {
|
|
64
|
+
constructor(metadata, agent, client = Client.default()) {
|
|
10
65
|
super();
|
|
11
|
-
this
|
|
66
|
+
this.#metadata = metadata;
|
|
67
|
+
this.agent = agent;
|
|
12
68
|
this.client = client;
|
|
13
|
-
this.#id = id;
|
|
14
69
|
}
|
|
15
70
|
get id() {
|
|
16
|
-
return this.#
|
|
71
|
+
return this.#metadata.knowledge_set;
|
|
72
|
+
}
|
|
73
|
+
get title() {
|
|
74
|
+
return this.#metadata.conversation.title ?? "";
|
|
75
|
+
}
|
|
76
|
+
get status() {
|
|
77
|
+
return stateToStatus(this.#metadata.conversation.state);
|
|
17
78
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
79
|
+
isRunning() {
|
|
80
|
+
switch (this.status) {
|
|
81
|
+
case "queued":
|
|
82
|
+
case "running":
|
|
83
|
+
return true;
|
|
84
|
+
default:
|
|
85
|
+
return false;
|
|
21
86
|
}
|
|
22
|
-
// @ts-ignore: allow assignment to readonly in this special case
|
|
23
|
-
this.#id = id;
|
|
24
|
-
this.dispatchEvent(new TaskStartEvent(id, status));
|
|
25
87
|
}
|
|
26
|
-
|
|
27
|
-
|
|
88
|
+
async getMessages({ from = new Date(0) } = {}) {
|
|
89
|
+
const url = `/agents/${this.agent.id}/tasks/${this.id}/view`;
|
|
90
|
+
const res = await this.client.fetch(url, {
|
|
91
|
+
method: "POST",
|
|
92
|
+
body: JSON.stringify({
|
|
93
|
+
page_size: 1_000, // @todo: pagination
|
|
94
|
+
cursor: {
|
|
95
|
+
after: from.toISOString(),
|
|
96
|
+
},
|
|
97
|
+
}),
|
|
98
|
+
});
|
|
99
|
+
// message should be in ascending order
|
|
100
|
+
return res.results.reverse().map((data) => {
|
|
101
|
+
switch (data.content.type) {
|
|
102
|
+
case "agent-error":
|
|
103
|
+
return new AgentErrorMessage(data);
|
|
104
|
+
case "agent-message":
|
|
105
|
+
return new AgentMessage(data);
|
|
106
|
+
case "tool-run":
|
|
107
|
+
return new ToolMessage(data);
|
|
108
|
+
case "user-message":
|
|
109
|
+
return new UserMessage(data);
|
|
110
|
+
default:
|
|
111
|
+
throw new Error("unknown message response");
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
async refresh() {
|
|
116
|
+
this.#metadata = await Task.#fetchMetadata(this.id, this.agent.id, this.client);
|
|
117
|
+
}
|
|
118
|
+
[resetSubscribeBackoff]() {
|
|
119
|
+
this.#backoffMs = 1000;
|
|
120
|
+
this.#delayController?.abort();
|
|
121
|
+
}
|
|
122
|
+
subscribe() {
|
|
123
|
+
if (this.isSubscribed()) {
|
|
28
124
|
return;
|
|
29
125
|
}
|
|
30
|
-
this
|
|
31
|
-
const signal = this.
|
|
32
|
-
let currentStatus =
|
|
126
|
+
this.#controller = new AbortController();
|
|
127
|
+
const signal = this.#controller.signal;
|
|
128
|
+
let currentStatus = this.status;
|
|
33
129
|
const messagesCursor = new Date(0);
|
|
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
|
-
|
|
130
|
+
const emitted = new Set();
|
|
131
|
+
let lastMessage = null;
|
|
132
|
+
const pendingTools = new Map();
|
|
133
|
+
// Initialize backoff and tracking
|
|
134
|
+
this.#backoffMs = 1000;
|
|
135
|
+
this.#lastUpdatedAt = this.#metadata.update_date;
|
|
136
|
+
void (async () => {
|
|
137
|
+
while (this.isSubscribed() && !signal.aborted) {
|
|
138
|
+
try {
|
|
139
|
+
const [, result] = await Promise.allSettled([
|
|
140
|
+
this.refresh(),
|
|
141
|
+
this.getMessages({ from: messagesCursor }),
|
|
142
|
+
]);
|
|
143
|
+
if (!this.isSubscribed() || signal.aborted) {
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
const messages = result.status === "fulfilled" ? result.value : [];
|
|
147
|
+
// Track if any changes occurred
|
|
148
|
+
let hasChanges = false;
|
|
149
|
+
// Check for status changes
|
|
150
|
+
if (this.status !== currentStatus) {
|
|
151
|
+
currentStatus = this.status;
|
|
152
|
+
this.dispatchEvent(new TaskStatusEvent(this.status));
|
|
153
|
+
hasChanges = true;
|
|
154
|
+
}
|
|
155
|
+
// Check for metadata update_date changes
|
|
156
|
+
if (this.#metadata.update_date !== this.#lastUpdatedAt) {
|
|
157
|
+
this.#lastUpdatedAt = this.#metadata.update_date;
|
|
158
|
+
hasChanges = true;
|
|
159
|
+
}
|
|
160
|
+
// Process messages
|
|
161
|
+
if (messages.length) {
|
|
162
|
+
hasChanges = true;
|
|
163
|
+
for (const message of messages) {
|
|
164
|
+
if (emitted.has(message.id)) {
|
|
165
|
+
switch (message.type) {
|
|
166
|
+
case "agent-error":
|
|
167
|
+
case "agent-message":
|
|
168
|
+
case "user-message":
|
|
169
|
+
// don't re-fire
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
emitted.add(message.id);
|
|
174
|
+
switch (message.type) {
|
|
175
|
+
case "agent-error":
|
|
176
|
+
this.dispatchEvent(new TaskErrorEvent(message));
|
|
177
|
+
break;
|
|
178
|
+
case "tool-run": {
|
|
179
|
+
const { status } = message;
|
|
180
|
+
if (pendingTools.get(message.id)?.status == status) {
|
|
181
|
+
// no change to the tool status
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
if (["pending", "running"].includes(status)) {
|
|
185
|
+
pendingTools.set(message.id, message);
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
pendingTools.delete(message.id);
|
|
189
|
+
}
|
|
190
|
+
this.dispatchEvent(new TaskUpdateEvent(message));
|
|
191
|
+
break;
|
|
192
|
+
}
|
|
193
|
+
case "agent-message":
|
|
194
|
+
case "user-message":
|
|
195
|
+
this.dispatchEvent(new TaskMessageEvent(message));
|
|
196
|
+
}
|
|
197
|
+
lastMessage = message;
|
|
198
|
+
}
|
|
199
|
+
// +1 the api treats after inclusively
|
|
200
|
+
let nextCursor = messages.at(-1).createdAt.getTime() + 1;
|
|
201
|
+
// set the cursor as the earliest pending tool
|
|
202
|
+
for (const pending of pendingTools.values()) {
|
|
203
|
+
if (nextCursor > pending.createdAt.getTime()) {
|
|
204
|
+
nextCursor = pending.createdAt.getTime();
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
messagesCursor.setTime(nextCursor);
|
|
208
|
+
}
|
|
209
|
+
// Apply backoff logic
|
|
210
|
+
if (hasChanges) {
|
|
211
|
+
// Reset backoff on any changes
|
|
212
|
+
this.#backoffMs = 1000;
|
|
213
|
+
}
|
|
214
|
+
else if (!this.isRunning() && lastMessage?.isAgent()) {
|
|
215
|
+
// Apply exponential backoff when idle with last message from agent
|
|
216
|
+
this.#backoffMs = Math.min(this.#backoffMs * 2, 60000);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
finally {
|
|
220
|
+
// Wait for the backoff period or abort signal
|
|
221
|
+
if (!signal.aborted) {
|
|
222
|
+
// Create a new controller for this delay that can be aborted independently
|
|
223
|
+
this.#delayController = new AbortController();
|
|
224
|
+
await Promise.race([
|
|
225
|
+
delay(this.#backoffMs),
|
|
226
|
+
abortPromise(AbortSignal.any([
|
|
227
|
+
signal,
|
|
228
|
+
this.#delayController.signal,
|
|
229
|
+
])),
|
|
230
|
+
]);
|
|
64
231
|
}
|
|
65
232
|
}
|
|
66
|
-
messagesCursor.setTime(
|
|
67
|
-
// +1 the api treats after inclusively
|
|
68
|
-
messages.at(-1).createdAt.getTime() + 1);
|
|
69
233
|
}
|
|
70
|
-
}
|
|
234
|
+
})();
|
|
71
235
|
}
|
|
72
|
-
|
|
73
|
-
return this
|
|
236
|
+
isSubscribed() {
|
|
237
|
+
return this.#controller !== undefined;
|
|
74
238
|
}
|
|
75
|
-
|
|
76
|
-
this
|
|
77
|
-
this
|
|
239
|
+
unsubscribe() {
|
|
240
|
+
this.#delayController?.abort();
|
|
241
|
+
this.#controller?.abort();
|
|
242
|
+
this.#delayController = undefined;
|
|
243
|
+
this.#controller = undefined;
|
|
78
244
|
}
|
|
79
245
|
addEventListener(type, listener, options) {
|
|
80
|
-
this.
|
|
246
|
+
this.subscribe();
|
|
81
247
|
const signal = AbortSignal.any([
|
|
82
248
|
...(options && typeof options === "object" && options.signal
|
|
83
249
|
? [options.signal]
|
|
84
250
|
: []),
|
|
85
|
-
this.
|
|
251
|
+
this.#controller.signal,
|
|
86
252
|
]);
|
|
87
253
|
const capture = typeof options === "boolean"
|
|
88
254
|
? options
|
|
@@ -90,7 +256,4 @@ export class Task extends EventTarget {
|
|
|
90
256
|
const addOptions = Object.assign({}, options, { signal, capture });
|
|
91
257
|
super.addEventListener(type, listener, addOptions);
|
|
92
258
|
}
|
|
93
|
-
removeEventListener(type, listener, options) {
|
|
94
|
-
super.removeEventListener(type, listener, options);
|
|
95
|
-
}
|
|
96
259
|
}
|
package/esm/utils.d.ts
CHANGED
|
@@ -1,8 +1,4 @@
|
|
|
1
1
|
export declare function abortPromise(signal: AbortSignal, reject?: boolean): Promise<void>;
|
|
2
|
-
export declare function delay(timeout: number): Promise<void>;
|
|
3
|
-
export declare function runInterval(runner: () => Promise<void> | void, interval: number, { signal, }?: {
|
|
4
|
-
signal?: AbortSignal;
|
|
5
|
-
immediate?: boolean;
|
|
6
|
-
}): Promise<void>;
|
|
2
|
+
export declare function delay(timeout: number | (() => number)): Promise<void>;
|
|
7
3
|
export declare function cleanPath(path: string, version?: string): string;
|
|
8
4
|
export declare function randomUUID(): Promise<any>;
|
package/esm/utils.js
CHANGED
|
@@ -2,19 +2,7 @@ export function abortPromise(signal, reject) {
|
|
|
2
2
|
return new Promise((res, rej) => signal.addEventListener("abort", () => reject ? rej() : res()));
|
|
3
3
|
}
|
|
4
4
|
export function delay(timeout) {
|
|
5
|
-
return new Promise((done) => setTimeout(done, timeout));
|
|
6
|
-
}
|
|
7
|
-
export async function runInterval(runner, interval, { signal, } = {}) {
|
|
8
|
-
while (true) {
|
|
9
|
-
if (signal?.aborted) {
|
|
10
|
-
break;
|
|
11
|
-
}
|
|
12
|
-
await runner();
|
|
13
|
-
await Promise.race([
|
|
14
|
-
delay(interval),
|
|
15
|
-
signal ? abortPromise(signal) : new Promise(() => { }),
|
|
16
|
-
]);
|
|
17
|
-
}
|
|
5
|
+
return new Promise((done) => setTimeout(done, typeof timeout === "number" ? timeout : timeout()));
|
|
18
6
|
}
|
|
19
7
|
export function cleanPath(path, version = "latest") {
|
|
20
8
|
return `/${version}/${path.trim().replace(/^\/+/, "")}`;
|
package/package.json
CHANGED
package/script/agent.d.ts
CHANGED
|
@@ -1,17 +1,29 @@
|
|
|
1
|
-
import type { AgentTaskState } from "./agent-task.js";
|
|
2
1
|
import { Client } from "./client.js";
|
|
2
|
+
import type { Region } from "./region.js";
|
|
3
|
+
import { Task } from "./task.js";
|
|
4
|
+
interface AgentConfig {
|
|
5
|
+
agent_id: string;
|
|
6
|
+
public: boolean;
|
|
7
|
+
name?: string;
|
|
8
|
+
description?: string;
|
|
9
|
+
emoji?: string;
|
|
10
|
+
insert_date_: string;
|
|
11
|
+
update_date_: string;
|
|
12
|
+
}
|
|
3
13
|
export declare class Agent {
|
|
4
14
|
#private;
|
|
5
15
|
private readonly client;
|
|
6
|
-
static
|
|
7
|
-
|
|
16
|
+
static get(id: string, client?: Client): Promise<Agent>;
|
|
17
|
+
constructor(config: AgentConfig, client: Client);
|
|
8
18
|
get id(): string;
|
|
9
19
|
get name(): string | undefined;
|
|
10
20
|
get description(): string | undefined;
|
|
11
21
|
get avatar(): string | undefined;
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
22
|
+
get createdAt(): Date;
|
|
23
|
+
get updatedAt(): Date;
|
|
24
|
+
get region(): Region;
|
|
25
|
+
get project(): string;
|
|
26
|
+
getTask(taskId: string): Promise<Task>;
|
|
27
|
+
sendMessage(message: string, task?: Task): Promise<Task>;
|
|
17
28
|
}
|
|
29
|
+
export {};
|
package/script/agent.js
CHANGED
|
@@ -2,18 +2,22 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Agent = void 0;
|
|
4
4
|
const client_js_1 = require("./client.js");
|
|
5
|
+
const task_js_1 = require("./task.js");
|
|
5
6
|
const utils_js_1 = require("./utils.js");
|
|
6
7
|
const taskPrefixDelimiter = "_-_";
|
|
7
8
|
class Agent {
|
|
8
9
|
#config;
|
|
9
10
|
client;
|
|
10
|
-
static async
|
|
11
|
-
const config = await
|
|
12
|
-
return new Agent(config
|
|
11
|
+
static async get(id, client = client_js_1.Client.default()) {
|
|
12
|
+
const config = await Agent.#fetchConfig(id, client);
|
|
13
|
+
return new Agent(config, client);
|
|
14
|
+
}
|
|
15
|
+
static #fetchConfig(agentId, client = client_js_1.Client.default()) {
|
|
16
|
+
return client.fetch(`/agents/${agentId}/get`).then(({ agent }) => agent);
|
|
13
17
|
}
|
|
14
18
|
constructor(config, client) {
|
|
15
|
-
this.#config = config;
|
|
16
19
|
this.client = client;
|
|
20
|
+
this.#config = config;
|
|
17
21
|
}
|
|
18
22
|
get id() {
|
|
19
23
|
return this.#config.agent_id;
|
|
@@ -27,14 +31,30 @@ class Agent {
|
|
|
27
31
|
get avatar() {
|
|
28
32
|
return this.#config.emoji;
|
|
29
33
|
}
|
|
30
|
-
|
|
31
|
-
return this.#config.
|
|
34
|
+
get createdAt() {
|
|
35
|
+
return new Date(this.#config.insert_date_);
|
|
36
|
+
}
|
|
37
|
+
get updatedAt() {
|
|
38
|
+
return new Date(this.#config.update_date_);
|
|
39
|
+
}
|
|
40
|
+
get region() {
|
|
41
|
+
return this.client.region;
|
|
32
42
|
}
|
|
33
|
-
|
|
43
|
+
get project() {
|
|
44
|
+
return this.client.project;
|
|
45
|
+
}
|
|
46
|
+
getTask(taskId) {
|
|
47
|
+
return task_js_1.Task.get(taskId, this, this.client);
|
|
48
|
+
}
|
|
49
|
+
async sendMessage(message, task) {
|
|
50
|
+
let taskId;
|
|
34
51
|
// embed keys require a task prefixing for new tasks
|
|
35
|
-
if (!
|
|
52
|
+
if (!task && this.client.isEmbedKey()) {
|
|
36
53
|
taskId = [this.client.key.taskPrefix, await (0, utils_js_1.randomUUID)()].join(taskPrefixDelimiter);
|
|
37
54
|
}
|
|
55
|
+
else if (task) {
|
|
56
|
+
taskId = task.id;
|
|
57
|
+
}
|
|
38
58
|
const res = await this.client.fetch("/agents/trigger", {
|
|
39
59
|
method: "POST",
|
|
40
60
|
body: JSON.stringify({
|
|
@@ -47,10 +67,10 @@ class Agent {
|
|
|
47
67
|
},
|
|
48
68
|
}),
|
|
49
69
|
});
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
70
|
+
if (task) {
|
|
71
|
+
task[task_js_1.resetSubscribeBackoff]();
|
|
72
|
+
}
|
|
73
|
+
return task ?? this.getTask(res.conversation_id);
|
|
54
74
|
}
|
|
55
75
|
}
|
|
56
76
|
exports.Agent = Agent;
|
package/script/client.d.ts
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import { Agent } from "./agent.js";
|
|
2
1
|
import { type Region } from "./region.js";
|
|
3
|
-
import { AgentTask } from "./agent-task.js";
|
|
4
2
|
import { Key } from "./key.js";
|
|
5
3
|
type CreateClientOptions = {
|
|
6
4
|
apiKey: string;
|
|
@@ -11,7 +9,7 @@ type CreateClientOptions = {
|
|
|
11
9
|
* Creates and returns the _default_ client instance.
|
|
12
10
|
*
|
|
13
11
|
* @throws {Error} if a default client already exists.
|
|
14
|
-
* @see {Client.default}
|
|
12
|
+
* @see {@link Client.default}
|
|
15
13
|
*/
|
|
16
14
|
export declare function createClient(keyOrOptions: Key | CreateClientOptions): Client;
|
|
17
15
|
export declare class Client {
|
|
@@ -19,7 +17,7 @@ export declare class Client {
|
|
|
19
17
|
* Returns the _default_ client instance.
|
|
20
18
|
*
|
|
21
19
|
* @throws {Error} if there is no default client.
|
|
22
|
-
* @see {createClient}
|
|
20
|
+
* @see {@link createClient}
|
|
23
21
|
*/
|
|
24
22
|
static default(): Client;
|
|
25
23
|
readonly key: Key;
|
|
@@ -28,9 +26,7 @@ export declare class Client {
|
|
|
28
26
|
get region(): Region;
|
|
29
27
|
get project(): string;
|
|
30
28
|
isEmbedKey(): boolean;
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
}): Promise<AgentTask>;
|
|
34
|
-
fetch<T>(input: `/agents/trigger` | `/agents/${string}/get` | `/agents/${string}/tasks/${string}/metadata` | `/agents/${string}/tasks/${string}/view`, init?: RequestInit): Promise<T>;
|
|
29
|
+
fetch<T>(input: "/agents/trigger" | `/agents/${string}/get` | `/agents/${string}/tasks/${string}/metadata` | `/agents/${string}/tasks/${string}/view` | "/agents/conversations/list", init?: RequestInit): Promise<T>;
|
|
30
|
+
url(path: string): URL;
|
|
35
31
|
}
|
|
36
32
|
export {};
|
package/script/client.js
CHANGED
|
@@ -2,9 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Client = void 0;
|
|
4
4
|
exports.createClient = createClient;
|
|
5
|
-
const agent_js_1 = require("./agent.js");
|
|
6
5
|
const region_js_1 = require("./region.js");
|
|
7
|
-
const agent_task_js_1 = require("./agent-task.js");
|
|
8
6
|
const utils_js_1 = require("./utils.js");
|
|
9
7
|
const key_js_1 = require("./key.js");
|
|
10
8
|
let defaultClient;
|
|
@@ -12,7 +10,7 @@ let defaultClient;
|
|
|
12
10
|
* Creates and returns the _default_ client instance.
|
|
13
11
|
*
|
|
14
12
|
* @throws {Error} if a default client already exists.
|
|
15
|
-
* @see {Client.default}
|
|
13
|
+
* @see {@link Client.default}
|
|
16
14
|
*/
|
|
17
15
|
function createClient(keyOrOptions) {
|
|
18
16
|
if (defaultClient) {
|
|
@@ -31,7 +29,7 @@ class Client {
|
|
|
31
29
|
* Returns the _default_ client instance.
|
|
32
30
|
*
|
|
33
31
|
* @throws {Error} if there is no default client.
|
|
34
|
-
* @see {createClient}
|
|
32
|
+
* @see {@link createClient}
|
|
35
33
|
*/
|
|
36
34
|
static default() {
|
|
37
35
|
if (!defaultClient) {
|
|
@@ -54,21 +52,22 @@ class Client {
|
|
|
54
52
|
isEmbedKey() {
|
|
55
53
|
return this.key.isEmbed();
|
|
56
54
|
}
|
|
57
|
-
async createTask({ agent }) {
|
|
58
|
-
if (agent) {
|
|
59
|
-
return new agent_task_js_1.AgentTask(typeof agent === "string" ? await agent_js_1.Agent.fetch(agent) : agent, undefined, this);
|
|
60
|
-
}
|
|
61
|
-
throw new Error("task not implemented");
|
|
62
|
-
}
|
|
63
55
|
async fetch(input, init) {
|
|
64
|
-
const url =
|
|
56
|
+
const url = this.url(input);
|
|
65
57
|
const headers = new Headers(this.key.fetchHeaders());
|
|
66
58
|
const response = await fetch(url, Object.assign({ headers }, init));
|
|
67
59
|
if (!response.ok) {
|
|
68
|
-
|
|
60
|
+
const body = await response.text();
|
|
61
|
+
console.error(url, init, headers, body);
|
|
69
62
|
throw new Error(response.statusText);
|
|
70
63
|
}
|
|
71
64
|
return response.json();
|
|
72
65
|
}
|
|
66
|
+
url(path) {
|
|
67
|
+
if (/^https?:\/\//.test(path)) {
|
|
68
|
+
return new URL(path);
|
|
69
|
+
}
|
|
70
|
+
return new URL((0, utils_js_1.cleanPath)(path), this.baseURL);
|
|
71
|
+
}
|
|
73
72
|
}
|
|
74
73
|
exports.Client = Client;
|