@agentica/core 0.43.2 → 0.44.0-dev.20260313

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 (205) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +218 -218
  3. package/lib/constants/AgenticaSystemPrompt.js +1 -1
  4. package/lib/constants/AgenticaSystemPrompt.js.map +1 -1
  5. package/lib/context/AgenticaOperation.d.ts +3 -2
  6. package/lib/context/internal/AgenticaOperationComposer.js.map +1 -1
  7. package/lib/context/internal/AgenticaTokenUsageAggregator.js.map +1 -1
  8. package/lib/context/internal/__IChatInitialApplication.d.ts +1 -1
  9. package/lib/errors/AgenticaJsonParseError.d.ts +5 -8
  10. package/lib/errors/AgenticaJsonParseError.js +11 -6
  11. package/lib/errors/AgenticaJsonParseError.js.map +1 -1
  12. package/lib/errors/AgenticaValidationError.d.ts +1 -1
  13. package/lib/events/AgenticaExecuteEvent.d.ts +1 -1
  14. package/lib/events/AgenticaJsonParseErrorEvent.d.ts +2 -2
  15. package/lib/factory/events.d.ts +2 -3
  16. package/lib/factory/events.js +1 -2
  17. package/lib/factory/events.js.map +1 -1
  18. package/lib/functional/assertHttpController.d.ts +2 -3
  19. package/lib/functional/assertHttpController.js +3939 -2656
  20. package/lib/functional/assertHttpController.js.map +1 -1
  21. package/lib/functional/assertHttpLlmApplication.d.ts +3 -3
  22. package/lib/functional/assertHttpLlmApplication.js +3939 -2656
  23. package/lib/functional/assertHttpLlmApplication.js.map +1 -1
  24. package/lib/functional/assertMcpController.d.ts +2 -2
  25. package/lib/functional/assertMcpController.js +202 -629
  26. package/lib/functional/assertMcpController.js.map +1 -1
  27. package/lib/functional/createMcpLlmApplication.d.ts +6 -0
  28. package/lib/functional/createMcpLlmApplication.js +56 -0
  29. package/lib/functional/createMcpLlmApplication.js.map +1 -0
  30. package/lib/functional/validateHttpController.d.ts +3 -3
  31. package/lib/functional/validateHttpController.js +3367 -2268
  32. package/lib/functional/validateHttpController.js.map +1 -1
  33. package/lib/functional/validateHttpLlmApplication.d.ts +3 -4
  34. package/lib/functional/validateHttpLlmApplication.js +3367 -2268
  35. package/lib/functional/validateHttpLlmApplication.js.map +1 -1
  36. package/lib/functional/validateMcpController.d.ts +2 -2
  37. package/lib/functional/validateMcpController.js +388 -1161
  38. package/lib/functional/validateMcpController.js.map +1 -1
  39. package/lib/histories/AgenticaExecuteHistory.d.ts +1 -1
  40. package/lib/index.mjs +21256 -18948
  41. package/lib/index.mjs.map +1 -1
  42. package/lib/orchestrate/call.js +43 -56
  43. package/lib/orchestrate/call.js.map +1 -1
  44. package/lib/orchestrate/cancel.js +9 -66
  45. package/lib/orchestrate/cancel.js.map +1 -1
  46. package/lib/orchestrate/initialize.js +4 -947
  47. package/lib/orchestrate/initialize.js.map +1 -1
  48. package/lib/orchestrate/select.js +11 -68
  49. package/lib/orchestrate/select.js.map +1 -1
  50. package/lib/structures/IAgenticaController.d.ts +143 -151
  51. package/lib/structures/IMcpTool.d.ts +52 -0
  52. package/lib/structures/IMcpTool.js +3 -0
  53. package/lib/structures/IMcpTool.js.map +1 -0
  54. package/lib/utils/ChatGptCompletionMessageUtil.js +16 -5
  55. package/lib/utils/ChatGptCompletionMessageUtil.js.map +1 -1
  56. package/lib/utils/ChatGptCompletionMessageUtil.spec.js +0 -5
  57. package/lib/utils/ChatGptCompletionMessageUtil.spec.js.map +1 -1
  58. package/package.json +7 -9
  59. package/prompts/cancel.md +5 -5
  60. package/prompts/common.md +3 -3
  61. package/prompts/describe.md +7 -7
  62. package/prompts/execute.md +122 -122
  63. package/prompts/initialize.md +3 -3
  64. package/prompts/json_parse_error.md +35 -33
  65. package/prompts/select.md +7 -7
  66. package/prompts/validate.md +123 -123
  67. package/prompts/validate_repeated.md +31 -31
  68. package/src/Agentica.ts +367 -367
  69. package/src/MicroAgentica.ts +357 -357
  70. package/src/constants/AgenticaConstant.ts +4 -4
  71. package/src/constants/AgenticaDefaultPrompt.ts +44 -44
  72. package/src/constants/AgenticaSystemPrompt.ts +1 -1
  73. package/src/constants/index.ts +2 -2
  74. package/src/context/AgenticaContext.ts +136 -136
  75. package/src/context/AgenticaContextRequestResult.ts +14 -14
  76. package/src/context/AgenticaOperation.ts +73 -72
  77. package/src/context/AgenticaOperationCollection.ts +49 -49
  78. package/src/context/AgenticaOperationSelection.ts +9 -9
  79. package/src/context/AgenticaTokenUsage.ts +186 -186
  80. package/src/context/MicroAgenticaContext.ts +99 -99
  81. package/src/context/index.ts +5 -5
  82. package/src/context/internal/AgenticaOperationComposer.ts +177 -177
  83. package/src/context/internal/AgenticaTokenUsageAggregator.ts +66 -66
  84. package/src/context/internal/__IChatCancelFunctionsApplication.ts +23 -23
  85. package/src/context/internal/__IChatFunctionReference.ts +21 -21
  86. package/src/context/internal/__IChatInitialApplication.ts +15 -15
  87. package/src/context/internal/__IChatSelectFunctionsApplication.ts +24 -24
  88. package/src/context/internal/isAgenticaContext.ts +11 -11
  89. package/src/errors/AgenticaJsonParseError.ts +52 -47
  90. package/src/errors/AgenticaValidationError.ts +49 -49
  91. package/src/errors/index.ts +2 -2
  92. package/src/events/AgenticaAssistantMessageEvent.ts +12 -12
  93. package/src/events/AgenticaCallEvent.ts +27 -27
  94. package/src/events/AgenticaCancelEvent.ts +9 -9
  95. package/src/events/AgenticaDescribeEvent.ts +14 -14
  96. package/src/events/AgenticaEvent.ts +59 -59
  97. package/src/events/AgenticaEvent.type.ts +19 -19
  98. package/src/events/AgenticaEventBase.ts +18 -18
  99. package/src/events/AgenticaEventSource.ts +6 -6
  100. package/src/events/AgenticaExecuteEvent.ts +45 -45
  101. package/src/events/AgenticaInitializeEvent.ts +7 -7
  102. package/src/events/AgenticaJsonParseErrorEvent.ts +16 -15
  103. package/src/events/AgenticaRequestEvent.ts +27 -27
  104. package/src/events/AgenticaResponseEvent.ts +32 -32
  105. package/src/events/AgenticaSelectEvent.ts +11 -11
  106. package/src/events/AgenticaUserMessageEvent.ts +12 -12
  107. package/src/events/AgenticaValidateEvent.ts +32 -32
  108. package/src/events/MicroAgenticaEvent.ts +45 -45
  109. package/src/events/index.ts +15 -15
  110. package/src/factory/events.ts +357 -359
  111. package/src/factory/histories.ts +348 -348
  112. package/src/factory/index.ts +3 -3
  113. package/src/factory/operations.ts +16 -16
  114. package/src/functional/assertHttpController.ts +106 -104
  115. package/src/functional/assertHttpLlmApplication.ts +52 -57
  116. package/src/functional/assertMcpController.ts +47 -44
  117. package/src/functional/createMcpLlmApplication.ts +72 -0
  118. package/src/functional/index.ts +7 -7
  119. package/src/functional/validateHttpController.ts +113 -110
  120. package/src/functional/validateHttpLlmApplication.ts +65 -70
  121. package/src/functional/validateMcpController.ts +53 -50
  122. package/src/histories/AgenticaAssistantMessageHistory.ts +10 -10
  123. package/src/histories/AgenticaCancelHistory.ts +8 -8
  124. package/src/histories/AgenticaDescribeHistory.ts +18 -18
  125. package/src/histories/AgenticaExecuteHistory.ts +64 -64
  126. package/src/histories/AgenticaHistory.ts +28 -28
  127. package/src/histories/AgenticaHistoryBase.ts +35 -35
  128. package/src/histories/AgenticaSelectHistory.ts +8 -8
  129. package/src/histories/AgenticaSystemMessageHistory.ts +10 -10
  130. package/src/histories/AgenticaUserMessageHistory.ts +11 -11
  131. package/src/histories/MicroAgenticaHistory.ts +19 -19
  132. package/src/histories/contents/AgenticaUserMessageAudioContent.ts +21 -21
  133. package/src/histories/contents/AgenticaUserMessageContent.ts +19 -19
  134. package/src/histories/contents/AgenticaUserMessageContentBase.ts +6 -6
  135. package/src/histories/contents/AgenticaUserMessageFileContent.ts +25 -25
  136. package/src/histories/contents/AgenticaUserMessageImageContent.ts +33 -33
  137. package/src/histories/contents/AgenticaUserMessageTextContent.ts +15 -15
  138. package/src/histories/contents/index.ts +5 -5
  139. package/src/histories/index.ts +10 -10
  140. package/src/index.ts +15 -15
  141. package/src/json/IAgenticaEventJson.ts +265 -265
  142. package/src/json/IAgenticaEventJson.type.ts +19 -19
  143. package/src/json/IAgenticaHistoryJson.ts +165 -165
  144. package/src/json/IAgenticaHistoryJson.type.ts +19 -19
  145. package/src/json/IAgenticaOperationJson.ts +36 -36
  146. package/src/json/IAgenticaOperationSelectionJson.ts +26 -26
  147. package/src/json/IAgenticaTokenUsageJson.ts +107 -107
  148. package/src/json/IMicroAgenticaEventJson.ts +22 -22
  149. package/src/json/IMicroAgenticaHistoryJson.ts +25 -25
  150. package/src/json/index.ts +7 -7
  151. package/src/orchestrate/call.ts +542 -558
  152. package/src/orchestrate/cancel.ts +265 -269
  153. package/src/orchestrate/describe.ts +66 -66
  154. package/src/orchestrate/execute.ts +61 -61
  155. package/src/orchestrate/index.ts +6 -6
  156. package/src/orchestrate/initialize.ts +102 -102
  157. package/src/orchestrate/internal/cancelFunctionFromContext.ts +33 -33
  158. package/src/orchestrate/internal/selectFunctionFromContext.ts +34 -34
  159. package/src/orchestrate/select.ts +320 -322
  160. package/src/structures/IAgenticaConfig.ts +83 -83
  161. package/src/structures/IAgenticaConfigBase.ts +87 -87
  162. package/src/structures/IAgenticaController.ts +143 -151
  163. package/src/structures/IAgenticaExecutor.ts +167 -167
  164. package/src/structures/IAgenticaProps.ts +78 -78
  165. package/src/structures/IAgenticaSystemPrompt.ts +236 -236
  166. package/src/structures/IAgenticaVendor.ts +54 -54
  167. package/src/structures/IMcpTool.ts +60 -0
  168. package/src/structures/IMicroAgenticaConfig.ts +56 -56
  169. package/src/structures/IMicroAgenticaExecutor.ts +67 -67
  170. package/src/structures/IMicroAgenticaProps.ts +77 -77
  171. package/src/structures/IMicroAgenticaSystemPrompt.ts +169 -169
  172. package/src/structures/index.ts +10 -10
  173. package/src/transformers/transformHistory.ts +172 -172
  174. package/src/utils/AssistantMessageEmptyError.ts +20 -20
  175. package/src/utils/AsyncQueue.spec.ts +355 -355
  176. package/src/utils/AsyncQueue.ts +95 -95
  177. package/src/utils/ByteArrayUtil.ts +5 -5
  178. package/src/utils/ChatGptCompletionMessageUtil.spec.ts +314 -320
  179. package/src/utils/ChatGptCompletionMessageUtil.ts +210 -195
  180. package/src/utils/ChatGptCompletionStreamingUtil.spec.ts +909 -909
  181. package/src/utils/ChatGptCompletionStreamingUtil.ts +91 -91
  182. package/src/utils/ChatGptTokenUsageAggregator.spec.ts +226 -226
  183. package/src/utils/ChatGptTokenUsageAggregator.ts +57 -57
  184. package/src/utils/MPSC.spec.ts +276 -276
  185. package/src/utils/MPSC.ts +42 -42
  186. package/src/utils/Singleton.spec.ts +138 -138
  187. package/src/utils/Singleton.ts +42 -42
  188. package/src/utils/StreamUtil.spec.ts +512 -512
  189. package/src/utils/StreamUtil.ts +87 -87
  190. package/src/utils/__map_take.spec.ts +140 -140
  191. package/src/utils/__map_take.ts +13 -13
  192. package/src/utils/__retry.spec.ts +198 -198
  193. package/src/utils/__retry.ts +18 -18
  194. package/src/utils/assertExecuteFailure.ts +16 -16
  195. package/src/utils/index.ts +4 -4
  196. package/src/utils/request.ts +140 -140
  197. package/src/utils/types.ts +50 -50
  198. package/lib/context/internal/AgenticaOperationComposer.spec.d.ts +0 -1
  199. package/lib/context/internal/AgenticaOperationComposer.spec.js +0 -353
  200. package/lib/context/internal/AgenticaOperationComposer.spec.js.map +0 -1
  201. package/lib/utils/JsonUtil.d.ts +0 -8
  202. package/lib/utils/JsonUtil.js +0 -350
  203. package/lib/utils/JsonUtil.js.map +0 -1
  204. package/src/context/internal/AgenticaOperationComposer.spec.ts +0 -401
  205. package/src/utils/JsonUtil.ts +0 -462
package/src/Agentica.ts CHANGED
@@ -1,367 +1,367 @@
1
- import { Semaphore } from "tstl";
2
-
3
- import type { AgenticaContext } from "./context/AgenticaContext";
4
- import type { AgenticaOperation } from "./context/AgenticaOperation";
5
- import type { AgenticaOperationCollection } from "./context/AgenticaOperationCollection";
6
- import type { AgenticaOperationSelection } from "./context/AgenticaOperationSelection";
7
- import type { AgenticaEvent } from "./events/AgenticaEvent";
8
- import type { AgenticaUserMessageEvent } from "./events/AgenticaUserMessageEvent";
9
- import type { AgenticaUserMessageContent } from "./histories";
10
- import type { AgenticaHistory } from "./histories/AgenticaHistory";
11
- import type { AgenticaUserMessageHistory } from "./histories/AgenticaUserMessageHistory";
12
- import type { IAgenticaConfig } from "./structures/IAgenticaConfig";
13
- import type { IAgenticaController } from "./structures/IAgenticaController";
14
- import type { IAgenticaProps } from "./structures/IAgenticaProps";
15
- import type { IAgenticaVendor } from "./structures/IAgenticaVendor";
16
-
17
- import { AgenticaTokenUsage } from "./context/AgenticaTokenUsage";
18
- import { AgenticaOperationComposer } from "./context/internal/AgenticaOperationComposer";
19
- import { createInitializeEvent, createUserMessageEvent } from "./factory/events";
20
- import { execute } from "./orchestrate/execute";
21
- import { transformHistory } from "./transformers/transformHistory";
22
- import { __map_take } from "./utils/__map_take";
23
- import { getChatCompletionFunction } from "./utils/request";
24
-
25
- /**
26
- * Agentica AI chatbot agent.
27
- *
28
- * `Agentica` is a facade class for the super AI chatbot agent
29
- * which performs LLM (Large Language Model) function calling from the
30
- * {@link conversate user's conversation}, and manages the
31
- * {@link getHistories prompt histories}.
32
- *
33
- * To understand and compose the `Agentica` class exactly, reference
34
- * below types concentrating on the documentation comments please.
35
- * Especially, you have to be careful about the {@link IAgenticaProps}
36
- * type which is used in the {@link constructor} function.
37
- *
38
- * - Constructors
39
- * - {@link IAgenticaProps}
40
- * - {@link IAgenticaVendor}
41
- * - {@link IAgenticaController}
42
- * - {@link IAgenticaConfig}
43
- * - {@link IAgenticaSystemPrompt}
44
- * - Accessors
45
- * - {@link IAgenticaOperation}
46
- * - {@link IAgenticaHistoryJson}
47
- * - {@link IAgenticaEventJson}
48
- * - {@link IAgenticaTokenUsageJson}
49
- *
50
- * @author Samchon
51
- */
52
- export class Agentica {
53
- // THE OPERATIONS
54
- private readonly operations_: AgenticaOperationCollection;
55
-
56
- // STACK
57
- private readonly stack_: AgenticaOperationSelection[];
58
- private readonly histories_: AgenticaHistory[];
59
- private readonly listeners_: Map<string, Set<(event: AgenticaEvent) => Promise<void> | void>>;
60
-
61
- // STATUS
62
- private readonly executor_: (ctx: AgenticaContext) => Promise<void>;
63
- private readonly semaphore_: Semaphore | null;
64
- private readonly token_usage_: AgenticaTokenUsage;
65
- private ready_: boolean;
66
-
67
- /* -----------------------------------------------------------
68
- CONSTRUCTOR
69
- ----------------------------------------------------------- */
70
- /**
71
- * Initializer constructor.
72
- *
73
- * @param props Properties to construct the agent
74
- */
75
- public constructor(private readonly props: IAgenticaProps) {
76
- // OPERATIONS
77
- this.operations_ = AgenticaOperationComposer.compose({
78
- controllers: props.controllers,
79
- config: props.config,
80
- });
81
-
82
- // STACK
83
- this.stack_ = [];
84
- this.listeners_ = new Map();
85
- this.histories_ = (props.histories ?? []).map(input =>
86
- transformHistory({
87
- operations: this.operations_.group,
88
- history: input,
89
- }),
90
- );
91
-
92
- // STATUS
93
- this.executor_
94
- = typeof props.config?.executor === "function"
95
- ? props.config.executor
96
- : execute(props.config?.executor ?? null);
97
- this.semaphore_ = props.vendor.semaphore != null
98
- ? typeof props.vendor.semaphore === "object"
99
- ? props.vendor.semaphore
100
- : new Semaphore(props.vendor.semaphore)
101
- : null;
102
- this.token_usage_ = this.props.tokenUsage !== undefined
103
- ? this.props.tokenUsage instanceof AgenticaTokenUsage
104
- ? this.props.tokenUsage
105
- : new AgenticaTokenUsage(this.props.tokenUsage)
106
- : AgenticaTokenUsage.zero();
107
- this.ready_ = false;
108
- }
109
-
110
- /**
111
- * @internal
112
- */
113
- public clone(): Agentica {
114
- return new Agentica({
115
- ...this.props,
116
- histories: this.props.histories?.slice(),
117
- });
118
- }
119
-
120
- /* -----------------------------------------------------------
121
- ACCESSORS
122
- ----------------------------------------------------------- */
123
- /**
124
- * Conversate with the AI chatbot.
125
- *
126
- * User talks to the AI chatbot with the given content.
127
- *
128
- * When the user's conversation implies the AI chatbot to execute a
129
- * function calling, the returned chat prompts will contain the
130
- * function calling information like {@link AgenticaExecuteHistory}.
131
- *
132
- * @param content The content to talk
133
- * @param options Options
134
- * @param options.abortSignal Abort signal
135
- * @throws AbortError
136
- * @returns List of newly created chat prompts
137
- */
138
- public async conversate(
139
- content: string | AgenticaUserMessageContent | Array<AgenticaUserMessageContent>,
140
- options: {
141
- abortSignal?: AbortSignal;
142
- } = {},
143
- ): Promise<AgenticaHistory[]> {
144
- const historyGetters: Array<() => Promise<AgenticaHistory>> = [];
145
- const dispatch = async (event: AgenticaEvent): Promise<void> => {
146
- try {
147
- await this.dispatch(event);
148
- if ("toHistory" in event) {
149
- if ("join" in event) {
150
- historyGetters.push(async () => {
151
- await event.join();
152
- return event.toHistory();
153
- });
154
- }
155
- else {
156
- historyGetters.push(async () => event.toHistory());
157
- }
158
- }
159
- }
160
- catch {}
161
- };
162
-
163
- const prompt: AgenticaUserMessageEvent = createUserMessageEvent({
164
- contents: Array.isArray(content)
165
- ? content
166
- : typeof content === "string"
167
- ? [{
168
- type: "text",
169
- text: content,
170
- }]
171
- : [content],
172
- });
173
- void dispatch(prompt).catch(() => {});
174
-
175
- await this.executor_(
176
- this.getContext({
177
- dispatch,
178
- prompt: prompt.toHistory(),
179
- abortSignal: options.abortSignal,
180
- usage: this.token_usage_,
181
- }),
182
- );
183
-
184
- const completed: AgenticaHistory[] = await Promise.all(
185
- historyGetters.map(async h => h()),
186
- );
187
- this.histories_.push(...completed);
188
- return completed;
189
- }
190
-
191
- /**
192
- * Get configuration.
193
- */
194
- public getConfig(): IAgenticaConfig | undefined {
195
- return this.props.config;
196
- }
197
-
198
- /**
199
- * Get LLM vendor.
200
- */
201
- public getVendor(): IAgenticaVendor {
202
- return this.props.vendor;
203
- }
204
-
205
- /**
206
- * Get controllers.
207
- *
208
- * Get list of controllers, which are the collection of functions that
209
- * the "Super AI Chatbot" can execute.
210
- */
211
- public getControllers(): ReadonlyArray<IAgenticaController> {
212
- return this.props.controllers;
213
- }
214
-
215
- /**
216
- * Get operations.
217
- *
218
- * Get list of operations, which has capsuled the pair of controller
219
- * and function from the {@link getControllers controllers}.
220
- *
221
- * @returns List of operations
222
- */
223
- public getOperations(): ReadonlyArray<AgenticaOperation> {
224
- return this.operations_.array;
225
- }
226
-
227
- /**
228
- * Get the chatbot's histories.
229
- *
230
- * Get list of chat histories that the chatbot has been conversated.
231
- *
232
- * @returns List of chat histories
233
- */
234
- public getHistories(): AgenticaHistory[] {
235
- return this.histories_;
236
- }
237
-
238
- /**
239
- * Get token usage of the AI chatbot.
240
- *
241
- * Entire token usage of the AI chatbot during the conversating
242
- * with the user by {@link conversate} method callings.
243
- *
244
- * @returns Cost of the AI chatbot
245
- */
246
- public getTokenUsage(): AgenticaTokenUsage {
247
- return this.token_usage_;
248
- }
249
-
250
- /**
251
- * @internal
252
- */
253
- public getContext(props: {
254
- prompt: AgenticaUserMessageHistory;
255
- usage: AgenticaTokenUsage;
256
- dispatch: (event: AgenticaEvent) => Promise<void>;
257
- abortSignal?: AbortSignal;
258
- }): AgenticaContext {
259
- const request = getChatCompletionFunction({
260
- vendor: this.props.vendor,
261
- config: this.props.config,
262
- dispatch: props.dispatch,
263
- abortSignal: props.abortSignal,
264
- usage: this.token_usage_,
265
- });
266
-
267
- return {
268
- // APPLICATION
269
- operations: this.operations_,
270
- config: this.props.config,
271
-
272
- // STATES
273
- histories: this.histories_,
274
- stack: this.stack_,
275
- ready: () => this.ready_,
276
- prompt: props.prompt,
277
- abortSignal: props.abortSignal,
278
-
279
- // HANDLERS
280
- dispatch: props.dispatch,
281
- request: this.semaphore_ === null
282
- ? request
283
- : async (source, body) => {
284
- await this.semaphore_!.acquire();
285
- try {
286
- return await request(source, body);
287
- }
288
- finally {
289
- void this.semaphore_!.release().catch(() => {});
290
- }
291
- },
292
- initialize: async () => {
293
- this.ready_ = true;
294
- void props.dispatch(createInitializeEvent()).catch(() => {});
295
- },
296
- };
297
- }
298
-
299
- /* -----------------------------------------------------------
300
- EVENT HANDLERS
301
- ----------------------------------------------------------- */
302
- /**
303
- * Add an event listener.
304
- *
305
- * Add an event listener to be called whenever the event is emitted.
306
- *
307
- * @param type Type of event
308
- * @param listener Callback function to be called whenever the event is emitted
309
- */
310
- public on<Type extends AgenticaEvent.Type>(
311
- type: Type,
312
- listener: (
313
- event: AgenticaEvent.Mapper[Type],
314
- ) => void | Promise<void>,
315
- ): this {
316
- /**
317
- * @TODO remove `as`
318
- */
319
- __map_take(this.listeners_, type, () => new Set()).add(listener as (event: AgenticaEvent) => void | Promise<void>);
320
- return this;
321
- }
322
-
323
- /**
324
- * Erase an event listener.
325
- *
326
- * Erase an event listener to stop calling the callback function.
327
- *
328
- * @param type Type of event
329
- * @param listener Callback function to erase
330
- */
331
- public off<Type extends AgenticaEvent.Type>(
332
- type: Type,
333
- listener: (
334
- event: AgenticaEvent.Mapper[Type],
335
- ) => void | Promise<void>,
336
- ): this {
337
- const set = this.listeners_.get(type);
338
- if (set !== undefined) {
339
- /**
340
- * @TODO remove `as`
341
- */
342
- set.delete(listener as (event: AgenticaEvent) => void | Promise<void>);
343
- if (set.size === 0) {
344
- this.listeners_.delete(type);
345
- }
346
- }
347
- return this;
348
- }
349
-
350
- private async dispatch<Event extends AgenticaEvent>(
351
- event: Event,
352
- ): Promise<void> {
353
- const set = this.listeners_.get(event.type);
354
- if (set !== undefined) {
355
- await Promise.all(
356
- Array.from(set).map(async (listener) => {
357
- try {
358
- await listener(event);
359
- }
360
- catch {
361
- /* empty */
362
- }
363
- }),
364
- );
365
- }
366
- }
367
- }
1
+ import { Semaphore } from "tstl";
2
+
3
+ import type { AgenticaContext } from "./context/AgenticaContext";
4
+ import type { AgenticaOperation } from "./context/AgenticaOperation";
5
+ import type { AgenticaOperationCollection } from "./context/AgenticaOperationCollection";
6
+ import type { AgenticaOperationSelection } from "./context/AgenticaOperationSelection";
7
+ import type { AgenticaEvent } from "./events/AgenticaEvent";
8
+ import type { AgenticaUserMessageEvent } from "./events/AgenticaUserMessageEvent";
9
+ import type { AgenticaUserMessageContent } from "./histories";
10
+ import type { AgenticaHistory } from "./histories/AgenticaHistory";
11
+ import type { AgenticaUserMessageHistory } from "./histories/AgenticaUserMessageHistory";
12
+ import type { IAgenticaConfig } from "./structures/IAgenticaConfig";
13
+ import type { IAgenticaController } from "./structures/IAgenticaController";
14
+ import type { IAgenticaProps } from "./structures/IAgenticaProps";
15
+ import type { IAgenticaVendor } from "./structures/IAgenticaVendor";
16
+
17
+ import { AgenticaTokenUsage } from "./context/AgenticaTokenUsage";
18
+ import { AgenticaOperationComposer } from "./context/internal/AgenticaOperationComposer";
19
+ import { createInitializeEvent, createUserMessageEvent } from "./factory/events";
20
+ import { execute } from "./orchestrate/execute";
21
+ import { transformHistory } from "./transformers/transformHistory";
22
+ import { __map_take } from "./utils/__map_take";
23
+ import { getChatCompletionFunction } from "./utils/request";
24
+
25
+ /**
26
+ * Agentica AI chatbot agent.
27
+ *
28
+ * `Agentica` is a facade class for the super AI chatbot agent
29
+ * which performs LLM (Large Language Model) function calling from the
30
+ * {@link conversate user's conversation}, and manages the
31
+ * {@link getHistories prompt histories}.
32
+ *
33
+ * To understand and compose the `Agentica` class exactly, reference
34
+ * below types concentrating on the documentation comments please.
35
+ * Especially, you have to be careful about the {@link IAgenticaProps}
36
+ * type which is used in the {@link constructor} function.
37
+ *
38
+ * - Constructors
39
+ * - {@link IAgenticaProps}
40
+ * - {@link IAgenticaVendor}
41
+ * - {@link IAgenticaController}
42
+ * - {@link IAgenticaConfig}
43
+ * - {@link IAgenticaSystemPrompt}
44
+ * - Accessors
45
+ * - {@link IAgenticaOperation}
46
+ * - {@link IAgenticaHistoryJson}
47
+ * - {@link IAgenticaEventJson}
48
+ * - {@link IAgenticaTokenUsageJson}
49
+ *
50
+ * @author Samchon
51
+ */
52
+ export class Agentica {
53
+ // THE OPERATIONS
54
+ private readonly operations_: AgenticaOperationCollection;
55
+
56
+ // STACK
57
+ private readonly stack_: AgenticaOperationSelection[];
58
+ private readonly histories_: AgenticaHistory[];
59
+ private readonly listeners_: Map<string, Set<(event: AgenticaEvent) => Promise<void> | void>>;
60
+
61
+ // STATUS
62
+ private readonly executor_: (ctx: AgenticaContext) => Promise<void>;
63
+ private readonly semaphore_: Semaphore | null;
64
+ private readonly token_usage_: AgenticaTokenUsage;
65
+ private ready_: boolean;
66
+
67
+ /* -----------------------------------------------------------
68
+ CONSTRUCTOR
69
+ ----------------------------------------------------------- */
70
+ /**
71
+ * Initializer constructor.
72
+ *
73
+ * @param props Properties to construct the agent
74
+ */
75
+ public constructor(private readonly props: IAgenticaProps) {
76
+ // OPERATIONS
77
+ this.operations_ = AgenticaOperationComposer.compose({
78
+ controllers: props.controllers,
79
+ config: props.config,
80
+ });
81
+
82
+ // STACK
83
+ this.stack_ = [];
84
+ this.listeners_ = new Map();
85
+ this.histories_ = (props.histories ?? []).map(input =>
86
+ transformHistory({
87
+ operations: this.operations_.group,
88
+ history: input,
89
+ }),
90
+ );
91
+
92
+ // STATUS
93
+ this.executor_
94
+ = typeof props.config?.executor === "function"
95
+ ? props.config.executor
96
+ : execute(props.config?.executor ?? null);
97
+ this.semaphore_ = props.vendor.semaphore != null
98
+ ? typeof props.vendor.semaphore === "object"
99
+ ? props.vendor.semaphore
100
+ : new Semaphore(props.vendor.semaphore)
101
+ : null;
102
+ this.token_usage_ = this.props.tokenUsage !== undefined
103
+ ? this.props.tokenUsage instanceof AgenticaTokenUsage
104
+ ? this.props.tokenUsage
105
+ : new AgenticaTokenUsage(this.props.tokenUsage)
106
+ : AgenticaTokenUsage.zero();
107
+ this.ready_ = false;
108
+ }
109
+
110
+ /**
111
+ * @internal
112
+ */
113
+ public clone(): Agentica {
114
+ return new Agentica({
115
+ ...this.props,
116
+ histories: this.props.histories?.slice(),
117
+ });
118
+ }
119
+
120
+ /* -----------------------------------------------------------
121
+ ACCESSORS
122
+ ----------------------------------------------------------- */
123
+ /**
124
+ * Conversate with the AI chatbot.
125
+ *
126
+ * User talks to the AI chatbot with the given content.
127
+ *
128
+ * When the user's conversation implies the AI chatbot to execute a
129
+ * function calling, the returned chat prompts will contain the
130
+ * function calling information like {@link AgenticaExecuteHistory}.
131
+ *
132
+ * @param content The content to talk
133
+ * @param options Options
134
+ * @param options.abortSignal Abort signal
135
+ * @throws AbortError
136
+ * @returns List of newly created chat prompts
137
+ */
138
+ public async conversate(
139
+ content: string | AgenticaUserMessageContent | Array<AgenticaUserMessageContent>,
140
+ options: {
141
+ abortSignal?: AbortSignal;
142
+ } = {},
143
+ ): Promise<AgenticaHistory[]> {
144
+ const historyGetters: Array<() => Promise<AgenticaHistory>> = [];
145
+ const dispatch = async (event: AgenticaEvent): Promise<void> => {
146
+ try {
147
+ await this.dispatch(event);
148
+ if ("toHistory" in event) {
149
+ if ("join" in event) {
150
+ historyGetters.push(async () => {
151
+ await event.join();
152
+ return event.toHistory();
153
+ });
154
+ }
155
+ else {
156
+ historyGetters.push(async () => event.toHistory());
157
+ }
158
+ }
159
+ }
160
+ catch {}
161
+ };
162
+
163
+ const prompt: AgenticaUserMessageEvent = createUserMessageEvent({
164
+ contents: Array.isArray(content)
165
+ ? content
166
+ : typeof content === "string"
167
+ ? [{
168
+ type: "text",
169
+ text: content,
170
+ }]
171
+ : [content],
172
+ });
173
+ void dispatch(prompt).catch(() => {});
174
+
175
+ await this.executor_(
176
+ this.getContext({
177
+ dispatch,
178
+ prompt: prompt.toHistory(),
179
+ abortSignal: options.abortSignal,
180
+ usage: this.token_usage_,
181
+ }),
182
+ );
183
+
184
+ const completed: AgenticaHistory[] = await Promise.all(
185
+ historyGetters.map(async h => h()),
186
+ );
187
+ this.histories_.push(...completed);
188
+ return completed;
189
+ }
190
+
191
+ /**
192
+ * Get configuration.
193
+ */
194
+ public getConfig(): IAgenticaConfig | undefined {
195
+ return this.props.config;
196
+ }
197
+
198
+ /**
199
+ * Get LLM vendor.
200
+ */
201
+ public getVendor(): IAgenticaVendor {
202
+ return this.props.vendor;
203
+ }
204
+
205
+ /**
206
+ * Get controllers.
207
+ *
208
+ * Get list of controllers, which are the collection of functions that
209
+ * the "Super AI Chatbot" can execute.
210
+ */
211
+ public getControllers(): ReadonlyArray<IAgenticaController> {
212
+ return this.props.controllers;
213
+ }
214
+
215
+ /**
216
+ * Get operations.
217
+ *
218
+ * Get list of operations, which has capsuled the pair of controller
219
+ * and function from the {@link getControllers controllers}.
220
+ *
221
+ * @returns List of operations
222
+ */
223
+ public getOperations(): ReadonlyArray<AgenticaOperation> {
224
+ return this.operations_.array;
225
+ }
226
+
227
+ /**
228
+ * Get the chatbot's histories.
229
+ *
230
+ * Get list of chat histories that the chatbot has been conversated.
231
+ *
232
+ * @returns List of chat histories
233
+ */
234
+ public getHistories(): AgenticaHistory[] {
235
+ return this.histories_;
236
+ }
237
+
238
+ /**
239
+ * Get token usage of the AI chatbot.
240
+ *
241
+ * Entire token usage of the AI chatbot during the conversating
242
+ * with the user by {@link conversate} method callings.
243
+ *
244
+ * @returns Cost of the AI chatbot
245
+ */
246
+ public getTokenUsage(): AgenticaTokenUsage {
247
+ return this.token_usage_;
248
+ }
249
+
250
+ /**
251
+ * @internal
252
+ */
253
+ public getContext(props: {
254
+ prompt: AgenticaUserMessageHistory;
255
+ usage: AgenticaTokenUsage;
256
+ dispatch: (event: AgenticaEvent) => Promise<void>;
257
+ abortSignal?: AbortSignal;
258
+ }): AgenticaContext {
259
+ const request = getChatCompletionFunction({
260
+ vendor: this.props.vendor,
261
+ config: this.props.config,
262
+ dispatch: props.dispatch,
263
+ abortSignal: props.abortSignal,
264
+ usage: this.token_usage_,
265
+ });
266
+
267
+ return {
268
+ // APPLICATION
269
+ operations: this.operations_,
270
+ config: this.props.config,
271
+
272
+ // STATES
273
+ histories: this.histories_,
274
+ stack: this.stack_,
275
+ ready: () => this.ready_,
276
+ prompt: props.prompt,
277
+ abortSignal: props.abortSignal,
278
+
279
+ // HANDLERS
280
+ dispatch: props.dispatch,
281
+ request: this.semaphore_ === null
282
+ ? request
283
+ : async (source, body) => {
284
+ await this.semaphore_!.acquire();
285
+ try {
286
+ return await request(source, body);
287
+ }
288
+ finally {
289
+ void this.semaphore_!.release().catch(() => {});
290
+ }
291
+ },
292
+ initialize: async () => {
293
+ this.ready_ = true;
294
+ void props.dispatch(createInitializeEvent()).catch(() => {});
295
+ },
296
+ };
297
+ }
298
+
299
+ /* -----------------------------------------------------------
300
+ EVENT HANDLERS
301
+ ----------------------------------------------------------- */
302
+ /**
303
+ * Add an event listener.
304
+ *
305
+ * Add an event listener to be called whenever the event is emitted.
306
+ *
307
+ * @param type Type of event
308
+ * @param listener Callback function to be called whenever the event is emitted
309
+ */
310
+ public on<Type extends AgenticaEvent.Type>(
311
+ type: Type,
312
+ listener: (
313
+ event: AgenticaEvent.Mapper[Type],
314
+ ) => void | Promise<void>,
315
+ ): this {
316
+ /**
317
+ * @TODO remove `as`
318
+ */
319
+ __map_take(this.listeners_, type, () => new Set()).add(listener as (event: AgenticaEvent) => void | Promise<void>);
320
+ return this;
321
+ }
322
+
323
+ /**
324
+ * Erase an event listener.
325
+ *
326
+ * Erase an event listener to stop calling the callback function.
327
+ *
328
+ * @param type Type of event
329
+ * @param listener Callback function to erase
330
+ */
331
+ public off<Type extends AgenticaEvent.Type>(
332
+ type: Type,
333
+ listener: (
334
+ event: AgenticaEvent.Mapper[Type],
335
+ ) => void | Promise<void>,
336
+ ): this {
337
+ const set = this.listeners_.get(type);
338
+ if (set !== undefined) {
339
+ /**
340
+ * @TODO remove `as`
341
+ */
342
+ set.delete(listener as (event: AgenticaEvent) => void | Promise<void>);
343
+ if (set.size === 0) {
344
+ this.listeners_.delete(type);
345
+ }
346
+ }
347
+ return this;
348
+ }
349
+
350
+ private async dispatch<Event extends AgenticaEvent>(
351
+ event: Event,
352
+ ): Promise<void> {
353
+ const set = this.listeners_.get(event.type);
354
+ if (set !== undefined) {
355
+ await Promise.all(
356
+ Array.from(set).map(async (listener) => {
357
+ try {
358
+ await listener(event);
359
+ }
360
+ catch {
361
+ /* empty */
362
+ }
363
+ }),
364
+ );
365
+ }
366
+ }
367
+ }