@stack-spot/portal-network 0.149.0 → 0.150.0

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.
Files changed (55) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/api/agent-tools.d.ts +63 -2
  3. package/dist/api/agent-tools.d.ts.map +1 -1
  4. package/dist/api/agent-tools.js +55 -0
  5. package/dist/api/agent-tools.js.map +1 -1
  6. package/dist/api/agent.d.ts +30 -16
  7. package/dist/api/agent.d.ts.map +1 -1
  8. package/dist/api/agent.js +0 -18
  9. package/dist/api/agent.js.map +1 -1
  10. package/dist/client/agent-tools.d.ts +20 -6
  11. package/dist/client/agent-tools.d.ts.map +1 -1
  12. package/dist/client/agent-tools.js +21 -18
  13. package/dist/client/agent-tools.js.map +1 -1
  14. package/dist/client/agent.d.ts +8 -14
  15. package/dist/client/agent.d.ts.map +1 -1
  16. package/dist/client/agent.js +2 -10
  17. package/dist/client/agent.js.map +1 -1
  18. package/dist/client/ai.d.ts +6 -6
  19. package/dist/client/ai.d.ts.map +1 -1
  20. package/dist/client/ai.js +6 -6
  21. package/dist/client/ai.js.map +1 -1
  22. package/dist/client/secrets.d.ts +2 -2
  23. package/dist/client/secrets.d.ts.map +1 -1
  24. package/dist/client/secrets.js +2 -2
  25. package/dist/client/secrets.js.map +1 -1
  26. package/dist/index.d.ts +3 -0
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +2 -0
  29. package/dist/index.js.map +1 -1
  30. package/dist/types.d.ts +2 -0
  31. package/dist/types.d.ts.map +1 -0
  32. package/dist/types.js +2 -0
  33. package/dist/types.js.map +1 -0
  34. package/dist/utils/StreamedArray.d.ts +66 -0
  35. package/dist/utils/StreamedArray.d.ts.map +1 -0
  36. package/dist/utils/StreamedArray.js +148 -0
  37. package/dist/utils/StreamedArray.js.map +1 -0
  38. package/dist/utils/StreamedJson.d.ts +1 -1
  39. package/dist/utils/StreamedJson.d.ts.map +1 -1
  40. package/dist/utils/use-streamed-array.d.ts +4 -0
  41. package/dist/utils/use-streamed-array.d.ts.map +1 -0
  42. package/dist/utils/use-streamed-array.js +15 -0
  43. package/dist/utils/use-streamed-array.js.map +1 -0
  44. package/package.json +1 -1
  45. package/src/api/agent-tools.ts +130 -2
  46. package/src/api/agent.ts +30 -84
  47. package/src/client/agent-tools.ts +16 -17
  48. package/src/client/agent.ts +6 -6
  49. package/src/client/ai.ts +6 -6
  50. package/src/client/secrets.ts +2 -2
  51. package/src/index.ts +3 -1
  52. package/src/types.ts +1 -0
  53. package/src/utils/StreamedArray.tsx +146 -0
  54. package/src/utils/StreamedJson.tsx +1 -1
  55. package/src/utils/use-streamed-array.ts +17 -0
@@ -0,0 +1,148 @@
1
+ import { CompletablePromise } from '@stack-spot/opa';
2
+ import { StreamCanceledError } from '../error/StreamCanceledError.js';
3
+ import { StreamError } from '../error/StreamError.js';
4
+ import { StreamJsonError } from '../error/StreamJsonError.js';
5
+ /**
6
+ * An array represented by a stream where each event contains an item of the array as a JSON string. This can be watched as the stream runs.
7
+ */
8
+ export class StreamedArray {
9
+ /**
10
+ * @param response the fetch response.
11
+ * @param minChangeIntervalMS a stream can be too fast. This sets a minimum interval between running the listeners. The default is 50ms.
12
+ */
13
+ constructor({ eventsPromises, abortController, minChangeIntervalMS = 50, signal }) {
14
+ Object.defineProperty(this, "onChangeListeners", {
15
+ enumerable: true,
16
+ configurable: true,
17
+ writable: true,
18
+ value: []
19
+ });
20
+ Object.defineProperty(this, "error", {
21
+ enumerable: true,
22
+ configurable: true,
23
+ writable: true,
24
+ value: void 0
25
+ });
26
+ Object.defineProperty(this, "data", {
27
+ enumerable: true,
28
+ configurable: true,
29
+ writable: true,
30
+ value: []
31
+ });
32
+ Object.defineProperty(this, "fullPromise", {
33
+ enumerable: true,
34
+ configurable: true,
35
+ writable: true,
36
+ value: new CompletablePromise()
37
+ });
38
+ Object.defineProperty(this, "abortController", {
39
+ enumerable: true,
40
+ configurable: true,
41
+ writable: true,
42
+ value: void 0
43
+ });
44
+ this.abortController = abortController ?? new AbortController();
45
+ eventsPromises.forEach(eventsPromise => this.run(eventsPromise, minChangeIntervalMS));
46
+ if (signal) {
47
+ signal.addEventListener('abort', () => this.cancel());
48
+ }
49
+ }
50
+ async run(eventsPromise, minChangeIntervalMS) {
51
+ let lastChangeCall = 0;
52
+ try {
53
+ const events = await eventsPromise;
54
+ let flushed = true;
55
+ for await (const event of events) {
56
+ if (this.error)
57
+ return;
58
+ if (event.data) {
59
+ this.data.push(JSON.parse(event.data));
60
+ if (new Date().getTime() - lastChangeCall >= minChangeIntervalMS) {
61
+ this.onChangeListeners.forEach(l => l(this.data));
62
+ lastChangeCall = new Date().getTime();
63
+ flushed = true;
64
+ }
65
+ else {
66
+ flushed = false;
67
+ }
68
+ }
69
+ }
70
+ if (!flushed)
71
+ this.onChangeListeners.forEach(l => l(this.data));
72
+ }
73
+ catch (error) {
74
+ if (error instanceof DOMException && error.name === 'AbortError')
75
+ this.fail(new StreamCanceledError());
76
+ if (error instanceof SyntaxError)
77
+ this.fail(new StreamJsonError());
78
+ else if (error instanceof StreamError)
79
+ this.fail(error);
80
+ else
81
+ this.fail(new StreamError(error?.message || `${error}`));
82
+ }
83
+ if (!this.error)
84
+ this.complete();
85
+ }
86
+ clear() {
87
+ this.onChangeListeners = [];
88
+ this.abortController = undefined;
89
+ }
90
+ fail(error) {
91
+ this.error = error;
92
+ this.fullPromise.reject(this.error);
93
+ this.clear();
94
+ }
95
+ complete() {
96
+ this.fullPromise.resolve(this.data);
97
+ this.clear();
98
+ }
99
+ /**
100
+ * Returns the full value of the array once the stream finishes.
101
+ */
102
+ getValue() {
103
+ return this.fullPromise.promise;
104
+ }
105
+ /**
106
+ * Returns the streamed array with every item streamed until now. This will be the complete array if the stream has finished.
107
+ */
108
+ getPartialValue() {
109
+ return this.data;
110
+ }
111
+ /**
112
+ * Watches the array as it's streamed. This doesn't wait for the value to be complete.
113
+ *
114
+ * The listener is called whenever the value changes.
115
+ *
116
+ * @param listener the function to call with the new value.
117
+ * @returns a function that, when called, removes the listener.
118
+ */
119
+ onChange(listener) {
120
+ if (this.fullPromise.resolved) {
121
+ listener(this.data);
122
+ return () => { };
123
+ }
124
+ this.onChangeListeners.push(listener);
125
+ return () => {
126
+ const index = this.onChangeListeners?.findIndex(l => l === listener);
127
+ if (index !== undefined && index >= 0)
128
+ this.onChangeListeners?.splice(index, 1);
129
+ };
130
+ }
131
+ getStatus() {
132
+ if (this.error)
133
+ return 'error';
134
+ if (this.fullPromise.resolved)
135
+ return 'success';
136
+ return 'pending';
137
+ }
138
+ getError() {
139
+ return this.error;
140
+ }
141
+ /**
142
+ * If this is a stream and it's not yet finished, calling this function cancels the stream.
143
+ */
144
+ cancel() {
145
+ this.abortController?.abort(new StreamCanceledError());
146
+ }
147
+ }
148
+ //# sourceMappingURL=StreamedArray.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StreamedArray.js","sourceRoot":"","sources":["../../src/utils/StreamedArray.tsx"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { StreamError } from '../error/StreamError.js';
2
2
  import { FetchEventStream } from '../network/types.js';
3
- type StreamingStatus = 'pending' | 'success' | 'error';
3
+ import { StreamingStatus } from '../types.js';
4
4
  interface ConstructorParams<T> {
5
5
  /**
6
6
  * The promise that results in the EventStream to build the final json.
@@ -1 +1 @@
1
- {"version":3,"file":"StreamedJson.d.ts","sourceRoot":"","sources":["../../src/utils/StreamedJson.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAElD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAEnD,KAAK,eAAe,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAA;AAGtD,UAAU,iBAAiB,CAAC,CAAC;IAC3B;;OAEG;IACH,aAAa,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACzC;;OAEG;IACH,eAAe,EAAE,eAAe,CAAC;IACjC;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1E;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;CAC1B;AAED;;GAEG;AACH,qBAAa,YAAY,CAAC,CAAC;IACzB,OAAO,CAAC,iBAAiB,CAA4B;IACrD,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,IAAI,CAAiB;IAC7B,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,eAAe,CAA6B;IACpD,OAAO,CAAC,SAAS,CAAC,CAA+D;IACjF,OAAO,CAAC,UAAU,CAAC,CAAa;IAEhC;;;OAGG;gBACS,EAAE,aAAa,EAAE,eAAe,EAAE,mBAAwB,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;YAOvG,GAAG;IA8BjB,OAAO,CAAC,KAAK;IAWb,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,IAAI;IAMZ,OAAO,CAAC,QAAQ;IAKhB;;OAEG;IACH,QAAQ,IAAI,OAAO,CAAC,CAAC,CAAC;IAItB;;OAEG;IACH,eAAe,IAAI,OAAO,CAAC,CAAC,CAAC;IAI7B;;;;;;;OAOG;IACH,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI;IAY9C,SAAS,IAAI,eAAe;IAM5B,QAAQ;IAIR;;OAEG;IACH,MAAM;CAGP"}
1
+ {"version":3,"file":"StreamedJson.d.ts","sourceRoot":"","sources":["../../src/utils/StreamedJson.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAElD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAI1C,UAAU,iBAAiB,CAAC,CAAC;IAC3B;;OAEG;IACH,aAAa,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACzC;;OAEG;IACH,eAAe,EAAE,eAAe,CAAC;IACjC;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1E;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;CAC1B;AAED;;GAEG;AACH,qBAAa,YAAY,CAAC,CAAC;IACzB,OAAO,CAAC,iBAAiB,CAA4B;IACrD,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,IAAI,CAAiB;IAC7B,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,eAAe,CAA6B;IACpD,OAAO,CAAC,SAAS,CAAC,CAA+D;IACjF,OAAO,CAAC,UAAU,CAAC,CAAa;IAEhC;;;OAGG;gBACS,EAAE,aAAa,EAAE,eAAe,EAAE,mBAAwB,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;YAOvG,GAAG;IA8BjB,OAAO,CAAC,KAAK;IAWb,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,IAAI;IAMZ,OAAO,CAAC,QAAQ;IAKhB;;OAEG;IACH,QAAQ,IAAI,OAAO,CAAC,CAAC,CAAC;IAItB;;OAEG;IACH,eAAe,IAAI,OAAO,CAAC,CAAC,CAAC;IAI7B;;;;;;;OAOG;IACH,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI;IAY9C,SAAS,IAAI,eAAe;IAM5B,QAAQ;IAIR;;OAEG;IACH,MAAM;CAGP"}
@@ -0,0 +1,4 @@
1
+ import { StreamingStatus } from '../types.js';
2
+ import { StreamedArray } from './StreamedArray.js';
3
+ export declare function useStreamedArray<T>(stream: StreamedArray<T> | undefined): (StreamingStatus | T[])[];
4
+ //# sourceMappingURL=use-streamed-array.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-streamed-array.d.ts","sourceRoot":"","sources":["../../src/utils/use-streamed-array.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE/C,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,SAAS,6BAYvE"}
@@ -0,0 +1,15 @@
1
+ import { useEffect, useState } from 'react';
2
+ export function useStreamedArray(stream) {
3
+ const [array, setArray] = useState(stream?.getPartialValue() ?? []);
4
+ const [status, setStatus] = useState(stream?.getStatus() ?? 'pending');
5
+ useEffect(() => {
6
+ setArray(stream?.getPartialValue() ?? []);
7
+ setStatus(stream?.getStatus() ?? 'pending');
8
+ return stream?.onChange((values) => {
9
+ setArray(values);
10
+ setStatus(stream.getStatus());
11
+ });
12
+ }, [stream]);
13
+ return [array, status];
14
+ }
15
+ //# sourceMappingURL=use-streamed-array.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-streamed-array.js","sourceRoot":"","sources":["../../src/utils/use-streamed-array.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAI3C,MAAM,UAAU,gBAAgB,CAAI,MAAoC;IACtE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAM,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAA;IACxE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAkB,MAAM,EAAE,SAAS,EAAE,IAAI,SAAS,CAAC,CAAA;IACvF,SAAS,CAAC,GAAG,EAAE;QACb,QAAQ,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAA;QACzC,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,SAAS,CAAC,CAAA;QAC3C,OAAO,MAAM,EAAE,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE;YACjC,QAAQ,CAAC,MAAM,CAAC,CAAA;YAChB,SAAS,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAA;QAC/B,CAAC,CAAC,CAAA;IACJ,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;IACZ,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;AACxB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stack-spot/portal-network",
3
- "version": "0.149.0",
3
+ "version": "0.150.0",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -260,6 +260,15 @@ export type DeleteToolsRequest = {
260
260
  /** List of tool IDs to be deleted from the toolkit */
261
261
  tool_ids: string[];
262
262
  };
263
+ export type ListAgentsUsingToolsRequest = {
264
+ /** List of tool IDs to find agents that use at least one of them */
265
+ tool_ids: string[];
266
+ };
267
+ export type AgentUsingToolsResponse = {
268
+ id: string;
269
+ name: string;
270
+ avatar?: string | null;
271
+ };
263
272
  export type AssignCustomToolsAgentRequest = {
264
273
  toolkit_id: string;
265
274
  tools_ids: string[];
@@ -312,7 +321,7 @@ export type ExecuteAgentToolRequest = {
312
321
  export type AgentToolExecutionResponse = {
313
322
  result: string;
314
323
  };
315
- export type AgentVisibilityLevelEnum = "built_in";
324
+ export type AgentVisibilityLevelEnum = "built_in" | "recently_used";
316
325
  export type KnowledgeSourcesConfig = {
317
326
  knowledge_sources: string[];
318
327
  max_number_of_kos?: number;
@@ -328,7 +337,7 @@ export type ListAgentResponse = {
328
337
  created_at: string | null;
329
338
  visibility_level: string;
330
339
  avatar: string | null;
331
- conversation_starter: string[] | null;
340
+ suggested_prompts: string[] | null;
332
341
  knowledge_sources_config: KnowledgeSourcesConfig;
333
342
  "type"?: string;
334
343
  system_prompt?: string;
@@ -465,6 +474,20 @@ export type AgentModel = {
465
474
  updated_by?: string | null;
466
475
  updated_at?: string | null;
467
476
  };
477
+ export type ListAgentResponseV2 = {
478
+ id: string;
479
+ name: string;
480
+ slug: string;
481
+ created_by: string | null;
482
+ created_at: string | null;
483
+ visibility_level: string;
484
+ avatar: string | null;
485
+ conversation_starter: string[] | null;
486
+ knowledge_sources_config: KnowledgeSourcesConfig;
487
+ "type"?: string;
488
+ system_prompt?: string;
489
+ creator_name?: string;
490
+ };
468
491
  export type InternalListToolkitsRequest = {
469
492
  /** List of toolkit IDs to retrieve */
470
493
  toolkit_ids: string[];
@@ -887,6 +910,39 @@ export function splitUploadedFilePreviewV1ToolkitsToolsPreviewFileUploadIdGet({
887
910
  })
888
911
  }));
889
912
  }
913
+ /**
914
+ * List Agents Using Tools
915
+ */
916
+ export function listAgentsUsingToolsV1ToolkitsToolkitIdToolsAgentsPost({ toolkitId, xAccountId, xUsername, xUserId, xUserFullName, authorization, listAgentsUsingToolsRequest }: {
917
+ toolkitId: string;
918
+ xAccountId?: string | null;
919
+ xUsername?: string | null;
920
+ xUserId?: string | null;
921
+ xUserFullName?: string | null;
922
+ authorization: string;
923
+ listAgentsUsingToolsRequest: ListAgentsUsingToolsRequest;
924
+ }, opts?: Oazapfts.RequestOpts) {
925
+ return oazapfts.ok(oazapfts.fetchJson<{
926
+ status: 200;
927
+ data: AgentUsingToolsResponse[];
928
+ } | {
929
+ status: 404;
930
+ } | {
931
+ status: 422;
932
+ data: HttpValidationError;
933
+ }>(`/v1/toolkits/${encodeURIComponent(toolkitId)}/tools/agents`, oazapfts.json({
934
+ ...opts,
935
+ method: "POST",
936
+ body: listAgentsUsingToolsRequest,
937
+ headers: oazapfts.mergeHeaders(opts?.headers, {
938
+ "x-account-id": xAccountId,
939
+ "x-username": xUsername,
940
+ "x-user-id": xUserId,
941
+ "x-user-full-name": xUserFullName,
942
+ authorization
943
+ })
944
+ })));
945
+ }
890
946
  /**
891
947
  * Assign Tools
892
948
  */
@@ -1273,6 +1329,78 @@ export function publishAgentV1AgentsAgentIdPublishPost({ agentId }: {
1273
1329
  method: "POST"
1274
1330
  }));
1275
1331
  }
1332
+ /**
1333
+ * List Agents
1334
+ */
1335
+ export function listAgentsV2AgentsGet({ name, slug, visibility, size, page, xAccountId, xUsername, xUserId, xUserFullName, authorization }: {
1336
+ name?: string | null;
1337
+ slug?: string | null;
1338
+ visibility?: AgentVisibilityLevelEnum | VisibilityLevelEnum;
1339
+ size?: number;
1340
+ page?: number;
1341
+ xAccountId?: string | null;
1342
+ xUsername?: string | null;
1343
+ xUserId?: string | null;
1344
+ xUserFullName?: string | null;
1345
+ authorization: string;
1346
+ }, opts?: Oazapfts.RequestOpts) {
1347
+ return oazapfts.ok(oazapfts.fetchJson<{
1348
+ status: 200;
1349
+ data: ListAgentResponseV2[];
1350
+ } | {
1351
+ status: 404;
1352
+ } | {
1353
+ status: 422;
1354
+ data: HttpValidationError;
1355
+ }>(`/v2/agents${QS.query(QS.explode({
1356
+ name,
1357
+ slug,
1358
+ visibility,
1359
+ size,
1360
+ page
1361
+ }))}`, {
1362
+ ...opts,
1363
+ headers: oazapfts.mergeHeaders(opts?.headers, {
1364
+ "x-account-id": xAccountId,
1365
+ "x-username": xUsername,
1366
+ "x-user-id": xUserId,
1367
+ "x-user-full-name": xUserFullName,
1368
+ authorization
1369
+ })
1370
+ }));
1371
+ }
1372
+ /**
1373
+ * Search Agents
1374
+ */
1375
+ export function searchAgentsV2AgentsSearchPost({ xAccountId, xUsername, xUserId, xUserFullName, authorization, searchAgentsRequest }: {
1376
+ xAccountId?: string | null;
1377
+ xUsername?: string | null;
1378
+ xUserId?: string | null;
1379
+ xUserFullName?: string | null;
1380
+ authorization: string;
1381
+ searchAgentsRequest: SearchAgentsRequest;
1382
+ }, opts?: Oazapfts.RequestOpts) {
1383
+ return oazapfts.ok(oazapfts.fetchJson<{
1384
+ status: 200;
1385
+ data: ListAgentResponseV2[];
1386
+ } | {
1387
+ status: 404;
1388
+ } | {
1389
+ status: 422;
1390
+ data: HttpValidationError;
1391
+ }>("/v2/agents/search", oazapfts.json({
1392
+ ...opts,
1393
+ method: "POST",
1394
+ body: searchAgentsRequest,
1395
+ headers: oazapfts.mergeHeaders(opts?.headers, {
1396
+ "x-account-id": xAccountId,
1397
+ "x-username": xUsername,
1398
+ "x-user-id": xUserId,
1399
+ "x-user-full-name": xUserFullName,
1400
+ authorization
1401
+ })
1402
+ })));
1403
+ }
1276
1404
  /**
1277
1405
  * Internal List Toolkits By Ids
1278
1406
  */
package/src/api/agent.ts CHANGED
@@ -27,6 +27,10 @@ export type KnowledgeSourcesConfigRequestPart = {
27
27
  /** List of knowledge source ids (ULID). */
28
28
  knowledge_sources: string[];
29
29
  };
30
+ export type CustomToolRequest = {
31
+ toolkit_id?: string;
32
+ tools_ids?: string[];
33
+ };
30
34
  export type NewAgentRequest = {
31
35
  name: string;
32
36
  slug: string;
@@ -38,6 +42,7 @@ export type NewAgentRequest = {
38
42
  llm_config?: (LlmConfigRequestPart) | null;
39
43
  knowledge_sources_config?: (KnowledgeSourcesConfigRequestPart) | null;
40
44
  builtin_tools_ids?: string[];
45
+ custom_tools?: CustomToolRequest[];
41
46
  detail_mode?: boolean;
42
47
  model_name?: string | null;
43
48
  model_id?: string | null;
@@ -102,6 +107,7 @@ export type KnowledgeSourceResponse = {
102
107
  knowledge_sources: string[];
103
108
  knowledge_sources_details?: KnowledgeSourceDetailResponse[];
104
109
  };
110
+ export type VisibilityLevel = "PERSONAL" | "SHARED" | "WORKSPACE" | "ACCOUNT" | "FAVORITE";
105
111
  export type ZonedDateTime = string;
106
112
  export type BuiltinToolResponse = {
107
113
  id?: string;
@@ -115,12 +121,28 @@ export type BuiltinToolkitResponse = {
115
121
  image_url?: string;
116
122
  tools?: BuiltinToolResponse[];
117
123
  };
124
+ export type CustomToolResponse = {
125
+ id?: string;
126
+ name?: string;
127
+ description?: string;
128
+ method?: string;
129
+ url?: string;
130
+ };
131
+ export type CustomToolkitResponse = {
132
+ id?: string;
133
+ name?: string;
134
+ description?: string;
135
+ avatar?: string;
136
+ secret_id?: string;
137
+ tools?: CustomToolResponse[];
138
+ };
118
139
  export type ToolkitsInAgentResponse = {
119
140
  builtins?: BuiltinToolkitResponse[];
141
+ customs?: CustomToolkitResponse[];
120
142
  };
121
143
  export type ModifiedAgentRequest = {
122
- name?: string | null;
123
- slug?: string | null;
144
+ name: string;
145
+ slug: string;
124
146
  description?: string | null;
125
147
  avatar?: string | null;
126
148
  suggested_prompts?: string[] | null;
@@ -130,6 +152,7 @@ export type ModifiedAgentRequest = {
130
152
  knowledge_sources_config?: (KnowledgeSourcesConfigRequestPart) | null;
131
153
  use_only?: boolean | null;
132
154
  builtin_tools_ids?: string[];
155
+ custom_tools?: CustomToolRequest[];
133
156
  detail_mode?: boolean | null;
134
157
  model_name?: string | null;
135
158
  model_id?: string | null;
@@ -144,7 +167,6 @@ export type ForkAgentRequest = {
144
167
  slug?: string;
145
168
  name?: string | null;
146
169
  };
147
- export type VisibilityLevel = "PERSONAL" | "SHARED" | "WORKSPACE" | "ACCOUNT" | "FAVORITE";
148
170
  export type PublishRequest = {
149
171
  level: VisibilityLevel;
150
172
  use_only?: boolean;
@@ -160,7 +182,7 @@ export type AgentResponse = {
160
182
  llm_config?: LlmConfigResponse;
161
183
  suggested_prompts?: string[];
162
184
  knowledge_sources_config?: KnowledgeSourceResponse;
163
- visibility_level: string;
185
+ visibility_level: VisibilityLevel;
164
186
  use_only: boolean;
165
187
  creator_name: string;
166
188
  created_by: string;
@@ -380,7 +402,7 @@ export function getV1AgentByAgentId({ agentId }: {
380
402
  llm_config?: LlmConfigResponse;
381
403
  suggested_prompts?: string[];
382
404
  knowledge_sources_config?: KnowledgeSourceResponse;
383
- visibility_level: string;
405
+ visibility_level: VisibilityLevel;
384
406
  use_only: boolean;
385
407
  creator_name: string;
386
408
  created_by: string;
@@ -673,7 +695,7 @@ export function getV1AgentByAgentSlugExists({ agentSlug }: {
673
695
  llm_config?: LlmConfigResponse;
674
696
  suggested_prompts?: string[];
675
697
  knowledge_sources_config?: KnowledgeSourceResponse;
676
- visibility_level: string;
698
+ visibility_level: VisibilityLevel;
677
699
  use_only: boolean;
678
700
  creator_name: string;
679
701
  created_by: string;
@@ -737,44 +759,6 @@ export function getV1Agents({ visibility }: {
737
759
  ...opts
738
760
  }));
739
761
  }
740
- /**
741
- * Create agents trial
742
- */
743
- export function postV1AgentsTrial(opts?: Oazapfts.RequestOpts) {
744
- return oazapfts.ok(oazapfts.fetchJson<{
745
- status: 204;
746
- } | {
747
- status: 404;
748
- data: {
749
- code?: string;
750
- details?: string;
751
- additionalInformation?: {
752
- [key: string]: any;
753
- } | null;
754
- };
755
- } | {
756
- status: 422;
757
- data: {
758
- code?: string;
759
- details?: string;
760
- additionalInformation?: {
761
- [key: string]: any;
762
- } | null;
763
- };
764
- } | {
765
- status: 500;
766
- data: {
767
- code?: string;
768
- details?: string;
769
- additionalInformation?: {
770
- [key: string]: any;
771
- } | null;
772
- };
773
- }>("/v1/agents/trial", {
774
- ...opts,
775
- method: "POST"
776
- }));
777
- }
778
762
  /**
779
763
  * Creates a new built-in AI Agent.
780
764
  */
@@ -836,7 +820,7 @@ export function getV1PublicAgentByAgentId({ agentId }: {
836
820
  llm_config?: LlmConfigResponse;
837
821
  suggested_prompts?: string[];
838
822
  knowledge_sources_config?: KnowledgeSourceResponse;
839
- visibility_level: string;
823
+ visibility_level: VisibilityLevel;
840
824
  use_only: boolean;
841
825
  creator_name: string;
842
826
  created_by: string;
@@ -1033,7 +1017,7 @@ export function getV1PublicAgentByAgentSlugExists({ agentSlug }: {
1033
1017
  llm_config?: LlmConfigResponse;
1034
1018
  suggested_prompts?: string[];
1035
1019
  knowledge_sources_config?: KnowledgeSourceResponse;
1036
- visibility_level: string;
1020
+ visibility_level: VisibilityLevel;
1037
1021
  use_only: boolean;
1038
1022
  creator_name: string;
1039
1023
  created_by: string;
@@ -1097,41 +1081,3 @@ export function getV1PublicAgents({ visibility }: {
1097
1081
  ...opts
1098
1082
  }));
1099
1083
  }
1100
- /**
1101
- * Create agents trial
1102
- */
1103
- export function postV1PublicAgentsTrial(opts?: Oazapfts.RequestOpts) {
1104
- return oazapfts.ok(oazapfts.fetchJson<{
1105
- status: 204;
1106
- } | {
1107
- status: 404;
1108
- data: {
1109
- code?: string;
1110
- details?: string;
1111
- additionalInformation?: {
1112
- [key: string]: any;
1113
- } | null;
1114
- };
1115
- } | {
1116
- status: 422;
1117
- data: {
1118
- code?: string;
1119
- details?: string;
1120
- additionalInformation?: {
1121
- [key: string]: any;
1122
- } | null;
1123
- };
1124
- } | {
1125
- status: 500;
1126
- data: {
1127
- code?: string;
1128
- details?: string;
1129
- additionalInformation?: {
1130
- [key: string]: any;
1131
- } | null;
1132
- };
1133
- }>("/v1/public/agents/trial", {
1134
- ...opts,
1135
- method: "POST"
1136
- }));
1137
- }
@@ -1,9 +1,11 @@
1
1
  import { HttpError } from '@oazapfts/runtime'
2
- import { createToolkitToolsV1ToolkitsToolkitIdToolsPost, createToolkitV1ToolkitsPost, defaults, deleteToolkitToolsV1ToolkitsToolkitIdToolsDelete, deleteToolkitV1ToolkitsToolkitIdDelete, editToolkitToolV1ToolkitsToolkitIdToolsToolIdPut, getPublicToolKitsV1BuiltinToolkitGet, getToolkitToolV1ToolkitsToolkitIdToolsToolIdGet, getToolkitV1ToolkitsToolkitIdGet, HttpValidationError, listToolkitsV1ToolkitsGet, updateToolkitV1ToolkitsToolkitIdPatch } from '../api/agent-tools'
2
+ import { createToolkitToolsV1ToolkitsToolkitIdToolsPost, createToolkitV1ToolkitsPost, defaults, deleteToolkitToolsV1ToolkitsToolkitIdToolsDelete, deleteToolkitV1ToolkitsToolkitIdDelete, editToolkitToolV1ToolkitsToolkitIdToolsToolIdPut, getPublicToolKitsV1BuiltinToolkitGet, getToolkitToolV1ToolkitsToolkitIdToolsToolIdGet, getToolkitV1ToolkitsToolkitIdGet, HttpValidationError, listAgentsUsingToolsV1ToolkitsToolkitIdToolsAgentsPost, listToolkitsV1ToolkitsGet, updateToolkitV1ToolkitsToolkitIdPatch } from '../api/agent-tools'
3
3
  import apis from '../apis.json'
4
4
  import { StackspotAPIError } from '../error/StackspotAPIError'
5
5
  import { ReactQueryNetworkClient } from '../network/ReactQueryNetworkClient'
6
+ import { FetchEventStream } from '../network/types'
6
7
  import { removeAuthorizationParam } from '../utils/remove-authorization-param'
8
+ import { StreamedArray } from '../utils/StreamedArray'
7
9
  import { AgentToolsOpenAPIPreview } from './types'
8
10
 
9
11
  class AgentToolsClient extends ReactQueryNetworkClient {
@@ -21,7 +23,7 @@ class AgentToolsClient extends ReactQueryNetworkClient {
21
23
  })
22
24
  }
23
25
 
24
- tools = this.query(getPublicToolKitsV1BuiltinToolkitGet)
26
+ tools = this.query(removeAuthorizationParam(getPublicToolKitsV1BuiltinToolkitGet))
25
27
 
26
28
  /**
27
29
  * Get list of Toolkits
@@ -60,22 +62,19 @@ class AgentToolsClient extends ReactQueryNetworkClient {
60
62
  */
61
63
  deleteToolFromToolkit = this.mutation(removeAuthorizationParam(deleteToolkitToolsV1ToolkitsToolkitIdToolsDelete))
62
64
  /**
63
- * Previews an uploaded open api file.
65
+ * Previews an uploaded open api file as a stream where each array item is an OpenAPI operation.
64
66
  */
65
- previewUploadedAPI = this.query({
66
- name: 'previewUploadedAPI',
67
- request: async (signal, params: { fileUploadId: string }) => {
68
- const url = `/v1/toolkits/tools/preview/${encodeURIComponent(params.fileUploadId)}`
69
- const events = await this.stream(url, { signal })
70
- const result: AgentToolsOpenAPIPreview[] = []
71
- for await (const event of events) {
72
- if (event.data) {
73
- result.push(JSON.parse(event.data))
74
- }
75
- }
76
- return result
77
- },
78
- })
67
+ streamUploadedAPIs = ({ fileUploadIds, signal }: { fileUploadIds: string[], signal?: AbortSignal }) => {
68
+ const promises: Promise<FetchEventStream>[] = fileUploadIds.map((id) => {
69
+ const url = `/v1/toolkits/tools/preview/${encodeURIComponent(id)}`
70
+ return this.stream(url, { signal })
71
+ })
72
+ return new StreamedArray<AgentToolsOpenAPIPreview>({ eventsPromises: promises, signal })
73
+ }
74
+ /**
75
+ * Lists the agents using the tools passed as parameter.
76
+ */
77
+ agentsUsingTools = this.query(removeAuthorizationParam(listAgentsUsingToolsV1ToolkitsToolkitIdToolsAgentsPost))
79
78
  }
80
79
 
81
80
  export const agentToolsClient = new AgentToolsClient()
@@ -1,5 +1,9 @@
1
1
  import { HttpError } from '@oazapfts/runtime'
2
- import { defaults, deleteV1AgentByAgentIdFavorite, getV1AgentByAgentId, getV1Agents, getV1PublicAgentByAgentId, getV1PublicAgents, postV1AgentByAgentIdFavorite, postV1AgentsTrial, putV1AgentByAgentId, VisibilityLevel } from '../api/agent'
2
+ import {
3
+ defaults, deleteV1AgentByAgentIdFavorite, getV1AgentByAgentId, getV1Agents, getV1PublicAgentByAgentId, getV1PublicAgents,
4
+ postV1AgentByAgentIdFavorite, putV1AgentByAgentId,
5
+ VisibilityLevel,
6
+ } from '../api/agent'
3
7
  import apis from '../apis.json'
4
8
  import { StackspotAPIError } from '../error/StackspotAPIError'
5
9
  import { ReactQueryNetworkClient } from '../network/ReactQueryNetworkClient'
@@ -68,6 +72,7 @@ class AgentClient extends ReactQueryNetworkClient {
68
72
 
69
73
  if (shouldIncludeBuiltInAgent) {
70
74
  const builtInsAgents = publicAgents?.map((agent) => ({ ...agent, builtIn: true, visibility_level: 'BUILT-IN' }))
75
+ // @ts-ignore fixme: above, BUILT-IN is not a valid value for the enum VisibilityLevel.
71
76
  allAgents.push(...builtInsAgents)
72
77
  }
73
78
 
@@ -133,11 +138,6 @@ class AgentClient extends ReactQueryNetworkClient {
133
138
  * Removes the resource of type Agent from the list of favorites.
134
139
  */
135
140
  removeFavoriteAgent = this.mutation(deleteV1AgentByAgentIdFavorite)
136
-
137
- /**
138
- * Create a test agent if it does not exist
139
- */
140
- createTrialAgents = this.mutation(postV1AgentsTrial)
141
141
  /**
142
142
  * Updates an agent
143
143
  */