@falai/agent 0.1.0-alpha2

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 (499) hide show
  1. package/README.md +797 -0
  2. package/dist/cjs/package.json +1 -0
  3. package/dist/cjs/src/adapters/MemoryAdapter.d.ts +47 -0
  4. package/dist/cjs/src/adapters/MemoryAdapter.d.ts.map +1 -0
  5. package/dist/cjs/src/adapters/MemoryAdapter.js +202 -0
  6. package/dist/cjs/src/adapters/MemoryAdapter.js.map +1 -0
  7. package/dist/cjs/src/adapters/MongoAdapter.d.ts +97 -0
  8. package/dist/cjs/src/adapters/MongoAdapter.d.ts.map +1 -0
  9. package/dist/cjs/src/adapters/MongoAdapter.js +168 -0
  10. package/dist/cjs/src/adapters/MongoAdapter.js.map +1 -0
  11. package/dist/cjs/src/adapters/OpenSearchAdapter.d.ts +169 -0
  12. package/dist/cjs/src/adapters/OpenSearchAdapter.d.ts.map +1 -0
  13. package/dist/cjs/src/adapters/OpenSearchAdapter.js +458 -0
  14. package/dist/cjs/src/adapters/OpenSearchAdapter.js.map +1 -0
  15. package/dist/cjs/src/adapters/PostgreSQLAdapter.d.ts +71 -0
  16. package/dist/cjs/src/adapters/PostgreSQLAdapter.d.ts.map +1 -0
  17. package/dist/cjs/src/adapters/PostgreSQLAdapter.js +260 -0
  18. package/dist/cjs/src/adapters/PostgreSQLAdapter.js.map +1 -0
  19. package/dist/cjs/src/adapters/PrismaAdapter.d.ts +115 -0
  20. package/dist/cjs/src/adapters/PrismaAdapter.d.ts.map +1 -0
  21. package/dist/cjs/src/adapters/PrismaAdapter.js +366 -0
  22. package/dist/cjs/src/adapters/PrismaAdapter.js.map +1 -0
  23. package/dist/cjs/src/adapters/RedisAdapter.d.ts +71 -0
  24. package/dist/cjs/src/adapters/RedisAdapter.d.ts.map +1 -0
  25. package/dist/cjs/src/adapters/RedisAdapter.js +231 -0
  26. package/dist/cjs/src/adapters/RedisAdapter.js.map +1 -0
  27. package/dist/cjs/src/adapters/SQLiteAdapter.d.ts +69 -0
  28. package/dist/cjs/src/adapters/SQLiteAdapter.d.ts.map +1 -0
  29. package/dist/cjs/src/adapters/SQLiteAdapter.js +312 -0
  30. package/dist/cjs/src/adapters/SQLiteAdapter.js.map +1 -0
  31. package/dist/cjs/src/adapters/index.d.ts +17 -0
  32. package/dist/cjs/src/adapters/index.d.ts.map +1 -0
  33. package/dist/cjs/src/adapters/index.js +21 -0
  34. package/dist/cjs/src/adapters/index.js.map +1 -0
  35. package/dist/cjs/src/constants/index.d.ts +10 -0
  36. package/dist/cjs/src/constants/index.d.ts.map +1 -0
  37. package/dist/cjs/src/constants/index.js +13 -0
  38. package/dist/cjs/src/constants/index.js.map +1 -0
  39. package/dist/cjs/src/core/Agent.d.ts +232 -0
  40. package/dist/cjs/src/core/Agent.d.ts.map +1 -0
  41. package/dist/cjs/src/core/Agent.js +741 -0
  42. package/dist/cjs/src/core/Agent.js.map +1 -0
  43. package/dist/cjs/src/core/Events.d.ts +26 -0
  44. package/dist/cjs/src/core/Events.d.ts.map +1 -0
  45. package/dist/cjs/src/core/Events.js +144 -0
  46. package/dist/cjs/src/core/Events.js.map +1 -0
  47. package/dist/cjs/src/core/PersistenceManager.d.ts +98 -0
  48. package/dist/cjs/src/core/PersistenceManager.d.ts.map +1 -0
  49. package/dist/cjs/src/core/PersistenceManager.js +261 -0
  50. package/dist/cjs/src/core/PersistenceManager.js.map +1 -0
  51. package/dist/cjs/src/core/PromptComposer.d.ts +27 -0
  52. package/dist/cjs/src/core/PromptComposer.d.ts.map +1 -0
  53. package/dist/cjs/src/core/PromptComposer.js +194 -0
  54. package/dist/cjs/src/core/PromptComposer.js.map +1 -0
  55. package/dist/cjs/src/core/ResponseEngine.d.ts +32 -0
  56. package/dist/cjs/src/core/ResponseEngine.d.ts.map +1 -0
  57. package/dist/cjs/src/core/ResponseEngine.js +202 -0
  58. package/dist/cjs/src/core/ResponseEngine.js.map +1 -0
  59. package/dist/cjs/src/core/ResponseModal.d.ts +222 -0
  60. package/dist/cjs/src/core/ResponseModal.d.ts.map +1 -0
  61. package/dist/cjs/src/core/ResponseModal.js +1588 -0
  62. package/dist/cjs/src/core/ResponseModal.js.map +1 -0
  63. package/dist/cjs/src/core/ResponsePipeline.d.ts +175 -0
  64. package/dist/cjs/src/core/ResponsePipeline.d.ts.map +1 -0
  65. package/dist/cjs/src/core/ResponsePipeline.js +549 -0
  66. package/dist/cjs/src/core/ResponsePipeline.js.map +1 -0
  67. package/dist/cjs/src/core/Route.d.ts +181 -0
  68. package/dist/cjs/src/core/Route.d.ts.map +1 -0
  69. package/dist/cjs/src/core/Route.js +541 -0
  70. package/dist/cjs/src/core/Route.js.map +1 -0
  71. package/dist/cjs/src/core/RoutingEngine.d.ts +159 -0
  72. package/dist/cjs/src/core/RoutingEngine.d.ts.map +1 -0
  73. package/dist/cjs/src/core/RoutingEngine.js +961 -0
  74. package/dist/cjs/src/core/RoutingEngine.js.map +1 -0
  75. package/dist/cjs/src/core/SessionManager.d.ts +94 -0
  76. package/dist/cjs/src/core/SessionManager.d.ts.map +1 -0
  77. package/dist/cjs/src/core/SessionManager.js +239 -0
  78. package/dist/cjs/src/core/SessionManager.js.map +1 -0
  79. package/dist/cjs/src/core/Step.d.ts +170 -0
  80. package/dist/cjs/src/core/Step.d.ts.map +1 -0
  81. package/dist/cjs/src/core/Step.js +448 -0
  82. package/dist/cjs/src/core/Step.js.map +1 -0
  83. package/dist/cjs/src/core/ToolManager.d.ts +234 -0
  84. package/dist/cjs/src/core/ToolManager.d.ts.map +1 -0
  85. package/dist/cjs/src/core/ToolManager.js +1117 -0
  86. package/dist/cjs/src/core/ToolManager.js.map +1 -0
  87. package/dist/cjs/src/index.d.ts +44 -0
  88. package/dist/cjs/src/index.d.ts.map +1 -0
  89. package/dist/cjs/src/index.js +88 -0
  90. package/dist/cjs/src/index.js.map +1 -0
  91. package/dist/cjs/src/providers/AnthropicProvider.d.ts +43 -0
  92. package/dist/cjs/src/providers/AnthropicProvider.d.ts.map +1 -0
  93. package/dist/cjs/src/providers/AnthropicProvider.js +377 -0
  94. package/dist/cjs/src/providers/AnthropicProvider.js.map +1 -0
  95. package/dist/cjs/src/providers/GeminiProvider.d.ts +58 -0
  96. package/dist/cjs/src/providers/GeminiProvider.d.ts.map +1 -0
  97. package/dist/cjs/src/providers/GeminiProvider.js +489 -0
  98. package/dist/cjs/src/providers/GeminiProvider.js.map +1 -0
  99. package/dist/cjs/src/providers/OpenAIProvider.d.ts +52 -0
  100. package/dist/cjs/src/providers/OpenAIProvider.d.ts.map +1 -0
  101. package/dist/cjs/src/providers/OpenAIProvider.js +395 -0
  102. package/dist/cjs/src/providers/OpenAIProvider.js.map +1 -0
  103. package/dist/cjs/src/providers/OpenRouterProvider.d.ts +56 -0
  104. package/dist/cjs/src/providers/OpenRouterProvider.d.ts.map +1 -0
  105. package/dist/cjs/src/providers/OpenRouterProvider.js +409 -0
  106. package/dist/cjs/src/providers/OpenRouterProvider.js.map +1 -0
  107. package/dist/cjs/src/providers/index.d.ts +13 -0
  108. package/dist/cjs/src/providers/index.d.ts.map +1 -0
  109. package/dist/cjs/src/providers/index.js +16 -0
  110. package/dist/cjs/src/providers/index.js.map +1 -0
  111. package/dist/cjs/src/types/agent.d.ts +181 -0
  112. package/dist/cjs/src/types/agent.d.ts.map +1 -0
  113. package/dist/cjs/src/types/agent.js +21 -0
  114. package/dist/cjs/src/types/agent.js.map +1 -0
  115. package/dist/cjs/src/types/ai.d.ts +143 -0
  116. package/dist/cjs/src/types/ai.d.ts.map +1 -0
  117. package/dist/cjs/src/types/ai.js +6 -0
  118. package/dist/cjs/src/types/ai.js.map +1 -0
  119. package/dist/cjs/src/types/history.d.ts +178 -0
  120. package/dist/cjs/src/types/history.d.ts.map +1 -0
  121. package/dist/cjs/src/types/history.js +33 -0
  122. package/dist/cjs/src/types/history.js.map +1 -0
  123. package/dist/cjs/src/types/index.d.ts +22 -0
  124. package/dist/cjs/src/types/index.d.ts.map +1 -0
  125. package/dist/cjs/src/types/index.js +37 -0
  126. package/dist/cjs/src/types/index.js.map +1 -0
  127. package/dist/cjs/src/types/persistence.d.ts +209 -0
  128. package/dist/cjs/src/types/persistence.d.ts.map +1 -0
  129. package/dist/cjs/src/types/persistence.js +7 -0
  130. package/dist/cjs/src/types/persistence.js.map +1 -0
  131. package/dist/cjs/src/types/route.d.ts +238 -0
  132. package/dist/cjs/src/types/route.d.ts.map +1 -0
  133. package/dist/cjs/src/types/route.js +6 -0
  134. package/dist/cjs/src/types/route.js.map +1 -0
  135. package/dist/cjs/src/types/routing.d.ts +16 -0
  136. package/dist/cjs/src/types/routing.d.ts.map +1 -0
  137. package/dist/cjs/src/types/routing.js +3 -0
  138. package/dist/cjs/src/types/routing.js.map +1 -0
  139. package/dist/cjs/src/types/schema.d.ts +22 -0
  140. package/dist/cjs/src/types/schema.d.ts.map +1 -0
  141. package/dist/cjs/src/types/schema.js +3 -0
  142. package/dist/cjs/src/types/schema.js.map +1 -0
  143. package/dist/cjs/src/types/session.d.ts +65 -0
  144. package/dist/cjs/src/types/session.d.ts.map +1 -0
  145. package/dist/cjs/src/types/session.js +6 -0
  146. package/dist/cjs/src/types/session.js.map +1 -0
  147. package/dist/cjs/src/types/template.d.ts +88 -0
  148. package/dist/cjs/src/types/template.d.ts.map +1 -0
  149. package/dist/cjs/src/types/template.js +3 -0
  150. package/dist/cjs/src/types/template.js.map +1 -0
  151. package/dist/cjs/src/types/tool.d.ts +130 -0
  152. package/dist/cjs/src/types/tool.d.ts.map +1 -0
  153. package/dist/cjs/src/types/tool.js +19 -0
  154. package/dist/cjs/src/types/tool.js.map +1 -0
  155. package/dist/cjs/src/utils/clone.d.ts +8 -0
  156. package/dist/cjs/src/utils/clone.d.ts.map +1 -0
  157. package/dist/cjs/src/utils/clone.js +32 -0
  158. package/dist/cjs/src/utils/clone.js.map +1 -0
  159. package/dist/cjs/src/utils/condition.d.ts +38 -0
  160. package/dist/cjs/src/utils/condition.d.ts.map +1 -0
  161. package/dist/cjs/src/utils/condition.js +168 -0
  162. package/dist/cjs/src/utils/condition.js.map +1 -0
  163. package/dist/cjs/src/utils/event.d.ts +6 -0
  164. package/dist/cjs/src/utils/event.d.ts.map +1 -0
  165. package/dist/cjs/src/utils/event.js +20 -0
  166. package/dist/cjs/src/utils/event.js.map +1 -0
  167. package/dist/cjs/src/utils/history.d.ts +60 -0
  168. package/dist/cjs/src/utils/history.d.ts.map +1 -0
  169. package/dist/cjs/src/utils/history.js +274 -0
  170. package/dist/cjs/src/utils/history.js.map +1 -0
  171. package/dist/cjs/src/utils/id.d.ts +25 -0
  172. package/dist/cjs/src/utils/id.d.ts.map +1 -0
  173. package/dist/cjs/src/utils/id.js +70 -0
  174. package/dist/cjs/src/utils/id.js.map +1 -0
  175. package/dist/cjs/src/utils/index.d.ts +15 -0
  176. package/dist/cjs/src/utils/index.d.ts.map +1 -0
  177. package/dist/cjs/src/utils/index.js +64 -0
  178. package/dist/cjs/src/utils/index.js.map +1 -0
  179. package/dist/cjs/src/utils/json.d.ts +16 -0
  180. package/dist/cjs/src/utils/json.d.ts.map +1 -0
  181. package/dist/cjs/src/utils/json.js +47 -0
  182. package/dist/cjs/src/utils/json.js.map +1 -0
  183. package/dist/cjs/src/utils/logger.d.ts +10 -0
  184. package/dist/cjs/src/utils/logger.d.ts.map +1 -0
  185. package/dist/cjs/src/utils/logger.js +23 -0
  186. package/dist/cjs/src/utils/logger.js.map +1 -0
  187. package/dist/cjs/src/utils/retry.d.ts +10 -0
  188. package/dist/cjs/src/utils/retry.d.ts.map +1 -0
  189. package/dist/cjs/src/utils/retry.js +76 -0
  190. package/dist/cjs/src/utils/retry.js.map +1 -0
  191. package/dist/cjs/src/utils/session.d.ts +51 -0
  192. package/dist/cjs/src/utils/session.d.ts.map +1 -0
  193. package/dist/cjs/src/utils/session.js +170 -0
  194. package/dist/cjs/src/utils/session.js.map +1 -0
  195. package/dist/cjs/src/utils/template.d.ts +155 -0
  196. package/dist/cjs/src/utils/template.d.ts.map +1 -0
  197. package/dist/cjs/src/utils/template.js +383 -0
  198. package/dist/cjs/src/utils/template.js.map +1 -0
  199. package/dist/src/adapters/MemoryAdapter.d.ts +47 -0
  200. package/dist/src/adapters/MemoryAdapter.d.ts.map +1 -0
  201. package/dist/src/adapters/MemoryAdapter.js +198 -0
  202. package/dist/src/adapters/MemoryAdapter.js.map +1 -0
  203. package/dist/src/adapters/MongoAdapter.d.ts +97 -0
  204. package/dist/src/adapters/MongoAdapter.d.ts.map +1 -0
  205. package/dist/src/adapters/MongoAdapter.js +164 -0
  206. package/dist/src/adapters/MongoAdapter.js.map +1 -0
  207. package/dist/src/adapters/OpenSearchAdapter.d.ts +169 -0
  208. package/dist/src/adapters/OpenSearchAdapter.d.ts.map +1 -0
  209. package/dist/src/adapters/OpenSearchAdapter.js +454 -0
  210. package/dist/src/adapters/OpenSearchAdapter.js.map +1 -0
  211. package/dist/src/adapters/PostgreSQLAdapter.d.ts +71 -0
  212. package/dist/src/adapters/PostgreSQLAdapter.d.ts.map +1 -0
  213. package/dist/src/adapters/PostgreSQLAdapter.js +256 -0
  214. package/dist/src/adapters/PostgreSQLAdapter.js.map +1 -0
  215. package/dist/src/adapters/PrismaAdapter.d.ts +115 -0
  216. package/dist/src/adapters/PrismaAdapter.d.ts.map +1 -0
  217. package/dist/src/adapters/PrismaAdapter.js +362 -0
  218. package/dist/src/adapters/PrismaAdapter.js.map +1 -0
  219. package/dist/src/adapters/RedisAdapter.d.ts +71 -0
  220. package/dist/src/adapters/RedisAdapter.d.ts.map +1 -0
  221. package/dist/src/adapters/RedisAdapter.js +227 -0
  222. package/dist/src/adapters/RedisAdapter.js.map +1 -0
  223. package/dist/src/adapters/SQLiteAdapter.d.ts +69 -0
  224. package/dist/src/adapters/SQLiteAdapter.d.ts.map +1 -0
  225. package/dist/src/adapters/SQLiteAdapter.js +308 -0
  226. package/dist/src/adapters/SQLiteAdapter.js.map +1 -0
  227. package/dist/src/adapters/index.d.ts +17 -0
  228. package/dist/src/adapters/index.d.ts.map +1 -0
  229. package/dist/src/adapters/index.js +11 -0
  230. package/dist/src/adapters/index.js.map +1 -0
  231. package/dist/src/constants/index.d.ts +10 -0
  232. package/dist/src/constants/index.d.ts.map +1 -0
  233. package/dist/src/constants/index.js +10 -0
  234. package/dist/src/constants/index.js.map +1 -0
  235. package/dist/src/core/Agent.d.ts +232 -0
  236. package/dist/src/core/Agent.d.ts.map +1 -0
  237. package/dist/src/core/Agent.js +737 -0
  238. package/dist/src/core/Agent.js.map +1 -0
  239. package/dist/src/core/Events.d.ts +26 -0
  240. package/dist/src/core/Events.d.ts.map +1 -0
  241. package/dist/src/core/Events.js +137 -0
  242. package/dist/src/core/Events.js.map +1 -0
  243. package/dist/src/core/PersistenceManager.d.ts +98 -0
  244. package/dist/src/core/PersistenceManager.d.ts.map +1 -0
  245. package/dist/src/core/PersistenceManager.js +257 -0
  246. package/dist/src/core/PersistenceManager.js.map +1 -0
  247. package/dist/src/core/PromptComposer.d.ts +27 -0
  248. package/dist/src/core/PromptComposer.d.ts.map +1 -0
  249. package/dist/src/core/PromptComposer.js +190 -0
  250. package/dist/src/core/PromptComposer.js.map +1 -0
  251. package/dist/src/core/ResponseEngine.d.ts +32 -0
  252. package/dist/src/core/ResponseEngine.d.ts.map +1 -0
  253. package/dist/src/core/ResponseEngine.js +198 -0
  254. package/dist/src/core/ResponseEngine.js.map +1 -0
  255. package/dist/src/core/ResponseModal.d.ts +222 -0
  256. package/dist/src/core/ResponseModal.d.ts.map +1 -0
  257. package/dist/src/core/ResponseModal.js +1583 -0
  258. package/dist/src/core/ResponseModal.js.map +1 -0
  259. package/dist/src/core/ResponsePipeline.d.ts +175 -0
  260. package/dist/src/core/ResponsePipeline.d.ts.map +1 -0
  261. package/dist/src/core/ResponsePipeline.js +545 -0
  262. package/dist/src/core/ResponsePipeline.js.map +1 -0
  263. package/dist/src/core/Route.d.ts +181 -0
  264. package/dist/src/core/Route.d.ts.map +1 -0
  265. package/dist/src/core/Route.js +537 -0
  266. package/dist/src/core/Route.js.map +1 -0
  267. package/dist/src/core/RoutingEngine.d.ts +159 -0
  268. package/dist/src/core/RoutingEngine.d.ts.map +1 -0
  269. package/dist/src/core/RoutingEngine.js +957 -0
  270. package/dist/src/core/RoutingEngine.js.map +1 -0
  271. package/dist/src/core/SessionManager.d.ts +94 -0
  272. package/dist/src/core/SessionManager.d.ts.map +1 -0
  273. package/dist/src/core/SessionManager.js +235 -0
  274. package/dist/src/core/SessionManager.js.map +1 -0
  275. package/dist/src/core/Step.d.ts +170 -0
  276. package/dist/src/core/Step.d.ts.map +1 -0
  277. package/dist/src/core/Step.js +444 -0
  278. package/dist/src/core/Step.js.map +1 -0
  279. package/dist/src/core/ToolManager.d.ts +234 -0
  280. package/dist/src/core/ToolManager.d.ts.map +1 -0
  281. package/dist/src/core/ToolManager.js +1111 -0
  282. package/dist/src/core/ToolManager.js.map +1 -0
  283. package/dist/src/index.d.ts +44 -0
  284. package/dist/src/index.d.ts.map +1 -0
  285. package/dist/src/index.js +37 -0
  286. package/dist/src/index.js.map +1 -0
  287. package/dist/src/providers/AnthropicProvider.d.ts +43 -0
  288. package/dist/src/providers/AnthropicProvider.d.ts.map +1 -0
  289. package/dist/src/providers/AnthropicProvider.js +370 -0
  290. package/dist/src/providers/AnthropicProvider.js.map +1 -0
  291. package/dist/src/providers/GeminiProvider.d.ts +58 -0
  292. package/dist/src/providers/GeminiProvider.d.ts.map +1 -0
  293. package/dist/src/providers/GeminiProvider.js +485 -0
  294. package/dist/src/providers/GeminiProvider.js.map +1 -0
  295. package/dist/src/providers/OpenAIProvider.d.ts +52 -0
  296. package/dist/src/providers/OpenAIProvider.d.ts.map +1 -0
  297. package/dist/src/providers/OpenAIProvider.js +388 -0
  298. package/dist/src/providers/OpenAIProvider.js.map +1 -0
  299. package/dist/src/providers/OpenRouterProvider.d.ts +56 -0
  300. package/dist/src/providers/OpenRouterProvider.d.ts.map +1 -0
  301. package/dist/src/providers/OpenRouterProvider.js +402 -0
  302. package/dist/src/providers/OpenRouterProvider.js.map +1 -0
  303. package/dist/src/providers/index.d.ts +13 -0
  304. package/dist/src/providers/index.d.ts.map +1 -0
  305. package/dist/src/providers/index.js +9 -0
  306. package/dist/src/providers/index.js.map +1 -0
  307. package/dist/src/types/agent.d.ts +181 -0
  308. package/dist/src/types/agent.d.ts.map +1 -0
  309. package/dist/src/types/agent.js +18 -0
  310. package/dist/src/types/agent.js.map +1 -0
  311. package/dist/src/types/ai.d.ts +143 -0
  312. package/dist/src/types/ai.d.ts.map +1 -0
  313. package/dist/src/types/ai.js +5 -0
  314. package/dist/src/types/ai.js.map +1 -0
  315. package/dist/src/types/history.d.ts +178 -0
  316. package/dist/src/types/history.d.ts.map +1 -0
  317. package/dist/src/types/history.js +30 -0
  318. package/dist/src/types/history.js.map +1 -0
  319. package/dist/src/types/index.d.ts +22 -0
  320. package/dist/src/types/index.d.ts.map +1 -0
  321. package/dist/src/types/index.js +12 -0
  322. package/dist/src/types/index.js.map +1 -0
  323. package/dist/src/types/persistence.d.ts +209 -0
  324. package/dist/src/types/persistence.d.ts.map +1 -0
  325. package/dist/src/types/persistence.js +6 -0
  326. package/dist/src/types/persistence.js.map +1 -0
  327. package/dist/src/types/route.d.ts +238 -0
  328. package/dist/src/types/route.d.ts.map +1 -0
  329. package/dist/src/types/route.js +5 -0
  330. package/dist/src/types/route.js.map +1 -0
  331. package/dist/src/types/routing.d.ts +16 -0
  332. package/dist/src/types/routing.d.ts.map +1 -0
  333. package/dist/src/types/routing.js +2 -0
  334. package/dist/src/types/routing.js.map +1 -0
  335. package/dist/src/types/schema.d.ts +22 -0
  336. package/dist/src/types/schema.d.ts.map +1 -0
  337. package/dist/src/types/schema.js +2 -0
  338. package/dist/src/types/schema.js.map +1 -0
  339. package/dist/src/types/session.d.ts +65 -0
  340. package/dist/src/types/session.d.ts.map +1 -0
  341. package/dist/src/types/session.js +5 -0
  342. package/dist/src/types/session.js.map +1 -0
  343. package/dist/src/types/template.d.ts +88 -0
  344. package/dist/src/types/template.d.ts.map +1 -0
  345. package/dist/src/types/template.js +2 -0
  346. package/dist/src/types/template.js.map +1 -0
  347. package/dist/src/types/tool.d.ts +130 -0
  348. package/dist/src/types/tool.d.ts.map +1 -0
  349. package/dist/src/types/tool.js +16 -0
  350. package/dist/src/types/tool.js.map +1 -0
  351. package/dist/src/utils/clone.d.ts +8 -0
  352. package/dist/src/utils/clone.d.ts.map +1 -0
  353. package/dist/src/utils/clone.js +29 -0
  354. package/dist/src/utils/clone.js.map +1 -0
  355. package/dist/src/utils/condition.d.ts +38 -0
  356. package/dist/src/utils/condition.d.ts.map +1 -0
  357. package/dist/src/utils/condition.js +161 -0
  358. package/dist/src/utils/condition.js.map +1 -0
  359. package/dist/src/utils/event.d.ts +6 -0
  360. package/dist/src/utils/event.d.ts.map +1 -0
  361. package/dist/src/utils/event.js +17 -0
  362. package/dist/src/utils/event.js.map +1 -0
  363. package/dist/src/utils/history.d.ts +60 -0
  364. package/dist/src/utils/history.d.ts.map +1 -0
  365. package/dist/src/utils/history.js +263 -0
  366. package/dist/src/utils/history.js.map +1 -0
  367. package/dist/src/utils/id.d.ts +25 -0
  368. package/dist/src/utils/id.d.ts.map +1 -0
  369. package/dist/src/utils/id.js +64 -0
  370. package/dist/src/utils/id.js.map +1 -0
  371. package/dist/src/utils/index.d.ts +15 -0
  372. package/dist/src/utils/index.d.ts.map +1 -0
  373. package/dist/src/utils/index.js +23 -0
  374. package/dist/src/utils/index.js.map +1 -0
  375. package/dist/src/utils/json.d.ts +16 -0
  376. package/dist/src/utils/json.d.ts.map +1 -0
  377. package/dist/src/utils/json.js +43 -0
  378. package/dist/src/utils/json.js.map +1 -0
  379. package/dist/src/utils/logger.d.ts +10 -0
  380. package/dist/src/utils/logger.d.ts.map +1 -0
  381. package/dist/src/utils/logger.js +17 -0
  382. package/dist/src/utils/logger.js.map +1 -0
  383. package/dist/src/utils/retry.d.ts +10 -0
  384. package/dist/src/utils/retry.d.ts.map +1 -0
  385. package/dist/src/utils/retry.js +71 -0
  386. package/dist/src/utils/retry.js.map +1 -0
  387. package/dist/src/utils/session.d.ts +51 -0
  388. package/dist/src/utils/session.d.ts.map +1 -0
  389. package/dist/src/utils/session.js +160 -0
  390. package/dist/src/utils/session.js.map +1 -0
  391. package/dist/src/utils/template.d.ts +155 -0
  392. package/dist/src/utils/template.d.ts.map +1 -0
  393. package/dist/src/utils/template.js +374 -0
  394. package/dist/src/utils/template.js.map +1 -0
  395. package/docs/CONTRIBUTING.md +521 -0
  396. package/docs/README.md +228 -0
  397. package/docs/api/README.md +3258 -0
  398. package/docs/api/overview.md +1134 -0
  399. package/docs/architecture/data-extraction-flow.md +363 -0
  400. package/docs/core/agent/README.md +902 -0
  401. package/docs/core/agent/context-management.md +796 -0
  402. package/docs/core/agent/session-management.md +641 -0
  403. package/docs/core/ai-integration/prompt-composition.md +220 -0
  404. package/docs/core/ai-integration/providers.md +515 -0
  405. package/docs/core/ai-integration/response-processing.md +287 -0
  406. package/docs/core/conversation-flows/data-collection.md +623 -0
  407. package/docs/core/conversation-flows/route-dsl.md +502 -0
  408. package/docs/core/conversation-flows/routes.md +247 -0
  409. package/docs/core/conversation-flows/step-transitions.md +595 -0
  410. package/docs/core/conversation-flows/steps.md +154 -0
  411. package/docs/core/error-handling.md +638 -0
  412. package/docs/core/persistence/adapters.md +255 -0
  413. package/docs/core/persistence/session-storage.md +644 -0
  414. package/docs/core/routing/intelligent-routing.md +466 -0
  415. package/docs/core/tools/tool-definition.md +970 -0
  416. package/docs/core/tools/tool-scoping.md +819 -0
  417. package/docs/guides/advanced-patterns/publishing.md +186 -0
  418. package/docs/guides/error-handling-patterns.md +578 -0
  419. package/docs/guides/getting-started/README.md +696 -0
  420. package/docs/guides/migration/README.md +72 -0
  421. package/docs/guides/migration/flexible-routing-conditions.md +375 -0
  422. package/docs/guides/migration/response-modal-refactor.md +518 -0
  423. package/examples/advanced-patterns/knowledge-based-agent.ts +735 -0
  424. package/examples/advanced-patterns/persistent-onboarding.ts +728 -0
  425. package/examples/advanced-patterns/route-lifecycle-hooks.ts +556 -0
  426. package/examples/advanced-patterns/streaming-responses.ts +578 -0
  427. package/examples/ai-providers/anthropic-integration.ts +388 -0
  428. package/examples/ai-providers/openai-integration.ts +228 -0
  429. package/examples/condition-patterns/function-only-conditions.ts +365 -0
  430. package/examples/condition-patterns/mixed-array-conditions.ts +477 -0
  431. package/examples/condition-patterns/route-skipif-patterns.ts +468 -0
  432. package/examples/condition-patterns/step-skipif-patterns.ts +0 -0
  433. package/examples/condition-patterns/string-only-conditions.ts +296 -0
  434. package/examples/conversation-flows/completion-transitions.ts +318 -0
  435. package/examples/core-concepts/basic-agent.ts +503 -0
  436. package/examples/core-concepts/modern-streaming-api.ts +309 -0
  437. package/examples/core-concepts/schema-driven-extraction.ts +332 -0
  438. package/examples/core-concepts/session-management.ts +494 -0
  439. package/examples/integrations/database-integration.ts +630 -0
  440. package/examples/integrations/healthcare-integration.ts +595 -0
  441. package/examples/integrations/search-integration.ts +530 -0
  442. package/examples/integrations/server-session-management.ts +307 -0
  443. package/examples/persistence/custom-adapter.ts +529 -0
  444. package/examples/persistence/database-persistence.ts +583 -0
  445. package/examples/persistence/memory-sessions.ts +495 -0
  446. package/examples/persistence/prisma-schema.example.prisma +74 -0
  447. package/examples/persistence/redis-persistence.ts +488 -0
  448. package/examples/tools/basic-tools.ts +765 -0
  449. package/examples/tools/data-enrichment-tools.ts +593 -0
  450. package/package.json +125 -0
  451. package/src/adapters/MemoryAdapter.ts +273 -0
  452. package/src/adapters/MongoAdapter.ts +304 -0
  453. package/src/adapters/OpenSearchAdapter.ts +670 -0
  454. package/src/adapters/PostgreSQLAdapter.ts +428 -0
  455. package/src/adapters/PrismaAdapter.ts +553 -0
  456. package/src/adapters/RedisAdapter.ts +377 -0
  457. package/src/adapters/SQLiteAdapter.ts +459 -0
  458. package/src/adapters/index.ts +43 -0
  459. package/src/constants/index.ts +10 -0
  460. package/src/core/Agent.ts +970 -0
  461. package/src/core/Events.ts +164 -0
  462. package/src/core/PersistenceManager.ts +353 -0
  463. package/src/core/PromptComposer.ts +253 -0
  464. package/src/core/ResponseEngine.ts +306 -0
  465. package/src/core/ResponseModal.ts +2050 -0
  466. package/src/core/ResponsePipeline.ts +864 -0
  467. package/src/core/Route.ts +677 -0
  468. package/src/core/RoutingEngine.ts +1396 -0
  469. package/src/core/SessionManager.ts +297 -0
  470. package/src/core/Step.ts +593 -0
  471. package/src/core/ToolManager.ts +1394 -0
  472. package/src/index.ts +155 -0
  473. package/src/providers/AnthropicProvider.ts +560 -0
  474. package/src/providers/GeminiProvider.ts +683 -0
  475. package/src/providers/OpenAIProvider.ts +602 -0
  476. package/src/providers/OpenRouterProvider.ts +613 -0
  477. package/src/providers/index.ts +16 -0
  478. package/src/types/agent.ts +196 -0
  479. package/src/types/ai.ts +158 -0
  480. package/src/types/history.ts +206 -0
  481. package/src/types/index.ts +119 -0
  482. package/src/types/persistence.ts +251 -0
  483. package/src/types/route.ts +272 -0
  484. package/src/types/routing.ts +18 -0
  485. package/src/types/schema.ts +23 -0
  486. package/src/types/session.ts +74 -0
  487. package/src/types/template.ts +104 -0
  488. package/src/types/tool.ts +174 -0
  489. package/src/utils/clone.ts +34 -0
  490. package/src/utils/condition.ts +190 -0
  491. package/src/utils/event.ts +16 -0
  492. package/src/utils/history.ts +306 -0
  493. package/src/utils/id.ts +73 -0
  494. package/src/utils/index.ts +69 -0
  495. package/src/utils/json.ts +46 -0
  496. package/src/utils/logger.ts +19 -0
  497. package/src/utils/retry.ts +97 -0
  498. package/src/utils/session.ts +204 -0
  499. package/src/utils/template.ts +444 -0
@@ -0,0 +1,696 @@
1
+ # Getting Started with @falai/agent
2
+
3
+ Complete guide to building your first conversational AI agent in under 30 minutes.
4
+
5
+ ---
6
+
7
+ ## 🎯 What You'll Build
8
+
9
+ By the end of this guide, you'll have a working AI agent that can:
10
+
11
+ - ✅ Understand natural language queries
12
+ - ✅ Extract structured data from conversations
13
+ - ✅ Maintain context across multiple turns
14
+ - ✅ Use tools to perform actions
15
+ - ✅ Handle complex conversation flows
16
+
17
+ **Time estimate:** 15-30 minutes
18
+
19
+ ---
20
+
21
+ ## 📋 Prerequisites
22
+
23
+ ### Required
24
+
25
+ - **Node.js 18+** or **Bun 1.0+**
26
+ - **API key** for an AI provider (Gemini, OpenAI, or Anthropic)
27
+
28
+ ### Optional
29
+
30
+ - **Redis** (for session persistence)
31
+ - **Database** (PostgreSQL, MySQL, etc. for advanced persistence)
32
+
33
+ ---
34
+
35
+ ## 🚀 Quick Start (5 minutes)
36
+
37
+ ### 1. Create Your Project
38
+
39
+ ```bash
40
+ # Create a new directory
41
+ mkdir my-first-agent && cd my-first-agent
42
+
43
+ # Initialize with your package manager
44
+ bun init -y # or npm init -y
45
+
46
+ # Install @falai/agent
47
+ bun add @falai/agent
48
+ ```
49
+
50
+ ### 2. Set Up Environment
51
+
52
+ Create a `.env` file:
53
+
54
+ ```bash
55
+ # Choose one AI provider
56
+ GEMINI_API_KEY=your_gemini_api_key_here
57
+ # OPENAI_API_KEY=your_openai_api_key_here
58
+ # ANTHROPIC_API_KEY=your_anthropic_api_key_here
59
+ ```
60
+
61
+ ### 3. Create Your First Agent
62
+
63
+ Create `index.ts`:
64
+
65
+ ```typescript
66
+ import { Agent, GeminiProvider } from "@falai/agent";
67
+
68
+ // Create AI provider
69
+ const provider = new GeminiProvider({
70
+ apiKey: process.env.GEMINI_API_KEY!,
71
+ model: "models/gemini-2.5-flash",
72
+ });
73
+
74
+ // Create your agent
75
+ const agent = new Agent({
76
+ name: "MyFirstAgent",
77
+ description: "A helpful AI assistant",
78
+ provider,
79
+ });
80
+
81
+ // Create a simple route with basic string condition
82
+ const generalRoute = agent.createRoute({
83
+ title: "General Help",
84
+ description: "Answers general questions",
85
+ when: ["User needs help or asks a question"], // Simple string condition
86
+ initialStep: {
87
+ prompt: "How can I help you today?",
88
+ },
89
+ });
90
+
91
+ // Test your agent
92
+ async function main() {
93
+ const response = await agent.respond("Hello! Can you tell me about TypeScript?");
94
+
95
+ console.log("🤖 Agent:", response.message);
96
+ }
97
+
98
+ main();
99
+ ```
100
+
101
+ ### 4. Run Your Agent
102
+
103
+ ```bash
104
+ # Run with Bun
105
+ bun run index.ts
106
+
107
+ # Or with Node.js + TypeScript
108
+ npx tsx index.ts
109
+ ```
110
+
111
+ **Congratulations!** 🎉 You now have a working AI agent.
112
+
113
+ ---
114
+
115
+ ## 🏗️ Building a Data-Driven Agent (10 minutes)
116
+
117
+ Now let's build an agent that intelligently collects structured data:
118
+
119
+ ### Define Your Data Schema
120
+
121
+ ```typescript
122
+ // Define the data you want to collect
123
+ interface BookingData {
124
+ destination: string;
125
+ travelDate: string;
126
+ travelers: number;
127
+ budget: number;
128
+ }
129
+ ```
130
+
131
+ ### Create an Agent with Centralized Data Schema
132
+
133
+ ```typescript
134
+ import { Agent, GeminiProvider } from "@falai/agent";
135
+
136
+ // Define data interface first
137
+ interface BookingData {
138
+ destination?: string;
139
+ travelDate?: string;
140
+ travelers?: number;
141
+ budget?: number;
142
+ estimatedPrice?: number;
143
+ availabilityChecked?: boolean;
144
+ }
145
+
146
+ // Create agent with centralized data schema first
147
+ const agent = new Agent<{}, BookingData>({
148
+ name: "TravelAgent",
149
+ provider: new GeminiProvider({
150
+ apiKey: process.env.GEMINI_API_KEY!,
151
+ }),
152
+
153
+ // Agent-level schema defines all possible data fields
154
+ schema: {
155
+ type: "object",
156
+ properties: {
157
+ destination: { type: "string", description: "Travel destination" },
158
+ travelDate: { type: "string", description: "Travel date" },
159
+ travelers: { type: "number", minimum: 1, maximum: 10 },
160
+ budget: { type: "number", description: "Budget in USD" },
161
+ },
162
+ required: ["destination", "travelers"],
163
+ },
164
+
165
+ // Agent-level data validation and enrichment
166
+ hooks: {
167
+ onDataUpdate: async (data, previousData) => {
168
+ // Auto-set budget range based on travelers
169
+ if (data.travelers && !data.budget) {
170
+ data.budget = data.travelers * 500; // Default $500 per person
171
+ }
172
+ return data;
173
+ }
174
+ }
175
+ });
176
+
177
+ // Create booking tool using unified Tool interface - simple return value
178
+ agent.addTool({
179
+ id: "check_availability",
180
+ name: "Availability Checker",
181
+ description: "Check travel availability and pricing",
182
+ parameters: {
183
+ type: "object",
184
+ properties: {},
185
+ },
186
+ handler: async ({ context, data, updateData }) => {
187
+ // Simulate availability check using collected data
188
+ const available = Math.random() > 0.2;
189
+ const price = Math.floor(Math.random() * 1000) + 500;
190
+
191
+ // Update data with pricing information using helper method
192
+ await updateData({
193
+ estimatedPrice: price,
194
+ availabilityChecked: true
195
+ });
196
+
197
+ // Return simple string value - unified interface supports both simple and complex returns
198
+ return available
199
+ ? `✅ Available! Estimated cost: $${price} for ${data.travelers} travelers to ${data.destination}`
200
+ : "❌ Not available for those dates. Please try different dates.";
201
+ },
202
+ };
203
+
204
+ // Routes specify required fields instead of schemas
205
+ const bookingRoute = agent.createRoute({
206
+ title: "Travel Booking",
207
+ description: "Help users book travel",
208
+ when: ["User wants to book travel"],
209
+ requiredFields: ["destination", "travelDate", "travelers"], // Required for completion
210
+ optionalFields: ["budget"], // Nice to have but not required
211
+
212
+ initialStep: {
213
+ prompt: "I'd love to help you book a trip! Where would you like to go?",
214
+ collect: ["destination"],
215
+ },
216
+ });
217
+
218
+ // Build conversation flow with agent-level data awareness
219
+ const askDate = bookingRoute.initialStep.nextStep({
220
+ prompt: "When would you like to travel?",
221
+ collect: ["travelDate"],
222
+ requires: ["destination"], // Must have destination from agent data
223
+ skipIf: (data) => !!data.travelDate, // Skip if already collected
224
+ });
225
+
226
+ const askTravelers = askDate.nextStep({
227
+ prompt: "How many people are traveling?",
228
+ collect: ["travelers"],
229
+ requires: ["destination"], // Prerequisites from agent data
230
+ skipIf: (data) => data.travelers !== undefined,
231
+ });
232
+
233
+ const askBudget = askTravelers.nextStep({
234
+ prompt: "What's your budget for this trip?",
235
+ collect: ["budget"],
236
+ requires: ["destination", "travelers"],
237
+ skipIf: (data) => data.budget !== undefined,
238
+ });
239
+
240
+ const checkAndBook = askBudget.nextStep({
241
+ prompt: "Let me check availability for your trip.",
242
+ tools: ["check_availability"], // Reference tool by ID
243
+ requires: ["destination", "travelers"], // Minimum data needed
244
+ });
245
+ ```
246
+
247
+ ### Test the Agent-Level Data Collection
248
+
249
+ ```typescript
250
+ async function testBookingAgent() {
251
+ // Create agent with automatic session management and agent-level schema
252
+ const sessionAgent = new Agent<{}, BookingData>({
253
+ name: "TravelAgent",
254
+ provider: new GeminiProvider({
255
+ apiKey: process.env.GEMINI_API_KEY!,
256
+ }),
257
+ sessionId: "user-alice", // Automatically manages this session
258
+
259
+ // Same agent-level schema and configuration
260
+ schema: agent.schema,
261
+ hooks: agent.hooks
262
+ });
263
+
264
+ // Add the same tool to the session agent
265
+ sessionAgent.addTool({
266
+ id: "check_availability",
267
+ name: "Availability Checker",
268
+ description: "Check travel availability and pricing",
269
+ handler: async ({ context, data, updateData }) => {
270
+ const available = Math.random() > 0.2;
271
+ const price = Math.floor(Math.random() * 1000) + 500;
272
+ await updateData({ estimatedPrice: price, availabilityChecked: true });
273
+ return {
274
+ data: available
275
+ ? `✅ Available! Estimated cost: $${price} for ${data.travelers} travelers to ${data.destination}`
276
+ : "❌ Not available for those dates. Please try different dates.",
277
+ };
278
+ },
279
+ });
280
+
281
+ // Copy the route to the session agent
282
+ sessionAgent.createRoute(bookingRoute.options);
283
+
284
+ // User provides partial information - simple message API
285
+ const response1 = await sessionAgent.respond("I want to go to Paris");
286
+
287
+ console.log("Bot:", response1.message);
288
+ console.log("Agent data:", sessionAgent.getCollectedData()); // Agent-level data access
289
+
290
+ // User provides more details - session automatically maintained
291
+ const response2 = await sessionAgent.respond("Next Friday, 2 people, $2000 budget");
292
+
293
+ console.log("Bot:", response2.message);
294
+ console.log("Final agent data:", sessionAgent.getCollectedData());
295
+
296
+ // Check route completion
297
+ console.log("Route complete:", bookingRoute.isComplete(sessionAgent.getCollectedData()));
298
+ console.log("Progress:", Math.round(bookingRoute.getCompletionProgress(sessionAgent.getCollectedData()) * 100) + "%");
299
+ }
300
+
301
+ testBookingAgent();
302
+
303
+ // Advanced: Show different tool creation approaches
304
+ function demonstrateToolCreationMethods() {
305
+ // Method 1: Direct addition (simplest)
306
+ agent.addTool({
307
+ id: "simple_search",
308
+ description: "Basic search functionality",
309
+ handler: async ({ context, data }, args) => `Found results for: ${args.query}`
310
+ });
311
+
312
+ // Method 2: Registry for reuse
313
+ agent.tool.register({
314
+ id: "reusable_validator",
315
+ description: "Reusable validation tool",
316
+ handler: async ({ context, data }, args) => ({
317
+ data: "Validation complete",
318
+ success: true,
319
+ contextUpdate: { lastValidated: new Date() }
320
+ })
321
+ });
322
+
323
+ // Method 3: Pattern helpers
324
+ const enrichmentTool = agent.tool.createDataEnrichment({
325
+ id: "enrich_booking",
326
+ fields: ['destination', 'travelers'],
327
+ enricher: async (context, data) => ({
328
+ bookingCode: `${data.destination?.slice(0,3).toUpperCase()}-${data.travelers}`,
329
+ estimatedDuration: data.destination === 'Paris' ? '8 hours' : '12 hours'
330
+ })
331
+ });
332
+
333
+ agent.tool.register(enrichmentTool);
334
+ }
335
+
336
+ demonstrateToolCreationMethods();
337
+
338
+ // Advanced: Tools as Step Lifecycle Hooks
339
+ function demonstrateLifecycleHooks() {
340
+ // Create tools for step lifecycle
341
+ agent.addTool({
342
+ id: "prepare_booking",
343
+ description: "Prepare booking context",
344
+ handler: async ({ context, data, updateContext }) => {
345
+ // Enrich context before AI response
346
+ await updateContext({
347
+ bookingStartTime: new Date().toISOString(),
348
+ userTier: 'premium'
349
+ });
350
+ return "Booking preparation complete"; // Simple return
351
+ }
352
+ });
353
+
354
+ agent.addTool({
355
+ id: "finalize_booking",
356
+ description: "Finalize booking process",
357
+ handler: async ({ context, data }) => {
358
+ // Process after AI response
359
+ const confirmationId = await bookingService.reserve(data);
360
+ return {
361
+ data: `Booking reserved with ID: ${confirmationId}`,
362
+ success: true,
363
+ contextUpdate: { lastBookingId: confirmationId }
364
+ }; // Complex ToolResult
365
+ }
366
+ });
367
+
368
+ // Use tools in step lifecycle
369
+ const bookingStep = agent.createRoute({
370
+ title: "Hotel Booking with Lifecycle",
371
+ steps: [{
372
+ id: "process_booking",
373
+ prompt: "Let me process your booking...",
374
+ prepare: "prepare_booking", // Tool executes before AI response
375
+ finalize: "finalize_booking", // Tool executes after AI response
376
+ collect: ["hotelName", "checkInDate"]
377
+ }]
378
+ });
379
+
380
+ console.log("Lifecycle hooks configured with tools");
381
+ }
382
+
383
+ demonstrateLifecycleHooks();
384
+ ```
385
+
386
+ **Notice how the agent:**
387
+
388
+ - ✅ Automatically extracted destination from "Paris"
389
+ - ✅ Understood "Next Friday, 2 people, $2000 budget" as structured data
390
+ - ✅ Skipped asking for already-known information
391
+ - ✅ Used the ToolManager API to create and execute tools with simplified context
392
+
393
+ ---
394
+
395
+ ## 🎯 Flexible Routing Conditions (5 minutes)
396
+
397
+ Learn how to create sophisticated routing logic with the new `ConditionTemplate` system:
398
+
399
+ ### Simple String Conditions (Beginner)
400
+
401
+ Perfect for AI-driven routing decisions:
402
+
403
+ ```typescript
404
+ // String conditions provide context to AI for routing
405
+ const supportRoute = agent.createRoute({
406
+ title: "Customer Support",
407
+ when: "User needs help or has a problem", // AI understands intent
408
+ initialStep: {
409
+ prompt: "I'm here to help! What can I assist you with?",
410
+ },
411
+ });
412
+
413
+ const feedbackRoute = agent.createRoute({
414
+ title: "Feedback Collection",
415
+ when: "User wants to leave feedback or a review", // AI context
416
+ initialStep: {
417
+ prompt: "I'd love to hear your feedback!",
418
+ },
419
+ });
420
+ ```
421
+
422
+ ### Function Conditions (Advanced)
423
+
424
+ For programmatic logic and precise control:
425
+
426
+ ```typescript
427
+ interface UserContext {
428
+ userType: 'free' | 'premium' | 'enterprise';
429
+ loginCount: number;
430
+ lastActivity: Date;
431
+ }
432
+
433
+ const agent = new Agent<UserContext>({
434
+ name: "SmartAgent",
435
+ provider: new GeminiProvider({ apiKey: process.env.GEMINI_API_KEY! }),
436
+ context: {
437
+ userType: 'free',
438
+ loginCount: 1,
439
+ lastActivity: new Date(),
440
+ },
441
+ });
442
+
443
+ // Function-only conditions for precise control
444
+ const premiumRoute = agent.createRoute({
445
+ title: "Premium Features",
446
+ when: (ctx) => ctx.context?.userType === 'premium', // Programmatic check
447
+ initialStep: {
448
+ prompt: "Welcome to premium features! What would you like to explore?",
449
+ },
450
+ });
451
+
452
+ const onboardingRoute = agent.createRoute({
453
+ title: "User Onboarding",
454
+ when: (ctx) => ctx.context?.loginCount <= 3, // New user logic
455
+ initialStep: {
456
+ prompt: "Welcome! Let me show you around.",
457
+ },
458
+ });
459
+ ```
460
+
461
+ ### Mixed Array Conditions (Expert)
462
+
463
+ Combine AI understanding with programmatic precision:
464
+
465
+ ```typescript
466
+ interface SupportContext {
467
+ userTier: 'basic' | 'premium' | 'enterprise';
468
+ supportTickets: number;
469
+ accountAge: number; // days
470
+ }
471
+
472
+ interface SupportData {
473
+ issueType?: 'technical' | 'billing' | 'general';
474
+ priority?: 'low' | 'medium' | 'high';
475
+ previousAttempts?: number;
476
+ }
477
+
478
+ const agent = new Agent<SupportContext, SupportData>({
479
+ name: "SupportAgent",
480
+ provider: new GeminiProvider({ apiKey: process.env.GEMINI_API_KEY! }),
481
+ });
482
+
483
+ // Mixed conditions: AI context + programmatic logic
484
+ const escalationRoute = agent.createRoute({
485
+ title: "Escalated Support",
486
+ when: [
487
+ "User is frustrated or needs urgent help", // AI context
488
+ (ctx) => ctx.data?.previousAttempts > 2, // Programmatic check
489
+ (ctx) => ctx.context?.userTier === 'enterprise' // Context check
490
+ ],
491
+ skipIf: [
492
+ "Support system is under maintenance", // AI context
493
+ (ctx) => new Date().getHours() < 9 || new Date().getHours() > 17 // Outside hours
494
+ ],
495
+ initialStep: {
496
+ prompt: "I understand this is urgent. Let me connect you with our senior support team.",
497
+ },
498
+ });
499
+
500
+ // Advanced step conditions
501
+ const technicalStep = escalationRoute.initialStep.nextStep({
502
+ when: [
503
+ "User has a technical issue that needs expert help", // AI context
504
+ (ctx) => ctx.data?.issueType === 'technical' // Data check
505
+ ],
506
+ skipIf: (ctx) => ctx.data?.priority === 'low', // Skip low priority technical issues
507
+ prompt: "Let me get our technical expert to help you.",
508
+ collect: ["issueDescription"]
509
+ });
510
+ ```
511
+
512
+ ### Route SkipIf (Dynamic Exclusion)
513
+
514
+ Exclude routes from consideration based on conditions:
515
+
516
+ ```typescript
517
+ const paymentRoute = agent.createRoute({
518
+ title: "Payment Processing",
519
+ when: ["User wants to make a payment or purchase"],
520
+ skipIf: [
521
+ "Payment system is temporarily unavailable", // AI context
522
+ (ctx) => ctx.context?.paymentSystemDown === true, // System check
523
+ (ctx) => ctx.data?.paymentBlocked === true // User-specific block
524
+ ],
525
+ initialStep: {
526
+ prompt: "I'll help you with your payment.",
527
+ },
528
+ });
529
+
530
+ const maintenanceRoute = agent.createRoute({
531
+ title: "Maintenance Notice",
532
+ when: "User asks about system issues or downtime",
533
+ skipIf: (ctx) => ctx.context?.maintenanceMode !== true, // Only show during maintenance
534
+ initialStep: {
535
+ prompt: "We're currently performing scheduled maintenance. Service will resume shortly.",
536
+ },
537
+ });
538
+ ```
539
+
540
+ ### Testing Your Conditions
541
+
542
+ ```typescript
543
+ async function testConditions() {
544
+ // Test with different contexts
545
+ const basicUser = { userTier: 'basic', supportTickets: 1, accountAge: 30 };
546
+ const premiumUser = { userTier: 'premium', supportTickets: 5, accountAge: 365 };
547
+
548
+ // Basic user - should get standard support
549
+ const response1 = await agent.respond("I need help", {
550
+ contextOverride: basicUser
551
+ });
552
+ console.log("Basic user route:", response1.session?.currentRoute?.title);
553
+
554
+ // Premium user with multiple tickets - should get escalated support
555
+ const response2 = await agent.respond("I'm having issues again", {
556
+ contextOverride: premiumUser
557
+ });
558
+ console.log("Premium user route:", response2.session?.currentRoute?.title);
559
+ }
560
+
561
+ testConditions();
562
+ ```
563
+
564
+ **Key Benefits:**
565
+
566
+ - ✅ **Simple strings** for AI-driven routing decisions
567
+ - ✅ **Functions** for precise programmatic control
568
+ - ✅ **Arrays** to combine both approaches
569
+ - ✅ **Route skipIf** for dynamic exclusion
570
+ - ✅ **Context access** in all condition types
571
+
572
+ ---
573
+
574
+ ## 💾 Adding Session Persistence (5 minutes)
575
+
576
+ Make your agent remember conversations across sessions:
577
+
578
+ ```typescript
579
+ import { MemoryAdapter } from "@falai/agent";
580
+
581
+ const agent = new Agent({
582
+ name: "PersistentAgent",
583
+ provider: new GeminiProvider({
584
+ apiKey: process.env.GEMINI_API_KEY!,
585
+ }),
586
+ // Add persistence
587
+ persistence: {
588
+ adapter: new MemoryAdapter(), // Or RedisAdapter, PrismaAdapter, etc.
589
+ },
590
+ });
591
+
592
+ // Create agent with automatic session management and persistence
593
+ const persistentAgent = new Agent({
594
+ name: "PersistentAgent",
595
+ provider: new GeminiProvider({
596
+ apiKey: process.env.GEMINI_API_KEY!,
597
+ }),
598
+ persistence: {
599
+ adapter: new MemoryAdapter(), // Or RedisAdapter, PrismaAdapter, etc.
600
+ },
601
+ sessionId: "user-123", // Automatically loads or creates this session
602
+ });
603
+
604
+ // Sessions are automatically saved and restored
605
+ const response1 = await persistentAgent.respond("Hello, my name is Alice");
606
+ // Session data automatically persisted
607
+
608
+ const response2 = await persistentAgent.respond("What's my name?");
609
+ console.log(response2.message); // Agent remembers: "Your name is Alice"
610
+ ```
611
+
612
+ ---
613
+
614
+ ## 🎯 Next Steps
615
+
616
+ ### Level 2: Core Concepts
617
+
618
+ - **[Schema-Driven Extraction](../core-concepts/schema-driven-extraction.ts)** - Advanced data collection patterns
619
+ - **[Session Management](../core-concepts/session-management.ts)** - Multi-turn conversations
620
+ - **[Context Providers](../core-concepts/context-providers.ts)** - Dynamic context fetching
621
+
622
+ ### Level 3: Conversation Flows
623
+
624
+ - **[Simple Routes](../conversation-flows/simple-route.ts)** - Basic route patterns
625
+ - **[Data-Driven Flows](../conversation-flows/data-driven-flows.ts)** - Conditional logic and requirements
626
+ - **[Branching](../conversation-flows/branching/README.md)** - Non-linear conversations
627
+
628
+ ### Level 4: Advanced Features
629
+
630
+ - **[Custom Providers](../ai-providers/custom-provider.ts)** - Integrate any AI service
631
+ - **[Context Tools](../tools/context-updating-tools.ts)** - Modify agent state
632
+ - **[Multi-Turn Conversations](../advanced-patterns/multi-turn-conversations.ts)** - Complex dialogues
633
+
634
+ ### Level 5: Production
635
+
636
+ - **[Server Deployment](../integrations/server-deployment.ts)** - HTTP API with WebSockets
637
+ - **[Database Persistence](../persistence/custom-adapter.ts)** - Custom storage adapters
638
+ - **[Streaming Responses](../advanced-patterns/streaming-responses.ts)** - Real-time UX
639
+
640
+ ---
641
+
642
+ ## 🆘 Troubleshooting
643
+
644
+ ### Common Issues
645
+
646
+ **"API key not found"**
647
+
648
+ ```bash
649
+ # Make sure your .env file exists and has the correct variable
650
+ echo "GEMINI_API_KEY=your_key_here" > .env
651
+ ```
652
+
653
+ **"Module not found"**
654
+
655
+ ```bash
656
+ # Reinstall dependencies
657
+ rm -rf node_modules package-lock.json
658
+ bun install # or npm install
659
+ ```
660
+
661
+ **"Type errors"**
662
+
663
+ ```typescript
664
+ // Make sure you're using TypeScript 5.3+
665
+ npx tsc --version
666
+
667
+ // Or use tsx for running TypeScript directly
668
+ npx tsx your-file.ts
669
+ ```
670
+
671
+ **"Agent not responding"**
672
+
673
+ ```typescript
674
+ // Check your API key is valid
675
+ curl "https://generativelanguage.googleapis.com/v1beta/models?key=YOUR_KEY"
676
+
677
+ // Verify your provider configuration
678
+ console.log("Provider:", agent.options.provider.name);
679
+ ```
680
+
681
+ ### Getting Help
682
+
683
+ - 📖 **[Full Documentation](../../README.md)** - Complete API reference
684
+ - 💬 **[Examples Directory](../../examples/)** - Working code samples
685
+ - 🐛 **[GitHub Issues](https://github.com/falai-dev/agent/issues)** - Report bugs
686
+ - 💡 **[Discussions](https://github.com/falai-dev/agent/discussions)** - Ask questions
687
+
688
+ ---
689
+
690
+ ## 🎉 You're Done!
691
+
692
+ You now have the foundation to build sophisticated AI agents. The framework is designed to scale with your needs - from simple chatbots to complex, data-driven conversational applications.
693
+
694
+ **What's next?** Explore the examples directory to see more advanced patterns, or dive into the API documentation for detailed method references.
695
+
696
+ Happy building! 🚀