activeagent 0.6.3 → 1.0.0.rc1

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 (282) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +210 -2
  3. data/README.md +15 -24
  4. data/lib/active_agent/base.rb +389 -39
  5. data/lib/active_agent/concerns/callbacks.rb +251 -0
  6. data/lib/active_agent/concerns/observers.rb +147 -0
  7. data/lib/active_agent/concerns/parameterized.rb +292 -0
  8. data/lib/active_agent/concerns/provider.rb +120 -0
  9. data/lib/active_agent/concerns/queueing.rb +36 -0
  10. data/lib/active_agent/concerns/rescue.rb +64 -0
  11. data/lib/active_agent/concerns/streaming.rb +282 -0
  12. data/lib/active_agent/concerns/tooling.rb +23 -0
  13. data/lib/active_agent/concerns/view.rb +150 -0
  14. data/lib/active_agent/configuration.rb +442 -20
  15. data/lib/active_agent/generation.rb +141 -47
  16. data/lib/active_agent/generation_provider/open_router/types.rb +505 -0
  17. data/lib/active_agent/generation_provider/xai_provider.rb +144 -0
  18. data/lib/active_agent/providers/_base_provider.rb +410 -0
  19. data/lib/active_agent/providers/anthropic/_types.rb +63 -0
  20. data/lib/active_agent/providers/anthropic/options.rb +53 -0
  21. data/lib/active_agent/providers/anthropic/request.rb +109 -0
  22. data/lib/active_agent/providers/anthropic/requests/_types.rb +190 -0
  23. data/lib/active_agent/providers/anthropic/requests/container_params.rb +19 -0
  24. data/lib/active_agent/providers/anthropic/requests/content/base.rb +21 -0
  25. data/lib/active_agent/providers/anthropic/requests/content/sources/base.rb +22 -0
  26. data/lib/active_agent/providers/anthropic/requests/context_management_config.rb +18 -0
  27. data/lib/active_agent/providers/anthropic/requests/messages/_types.rb +189 -0
  28. data/lib/active_agent/providers/anthropic/requests/messages/assistant.rb +23 -0
  29. data/lib/active_agent/providers/anthropic/requests/messages/base.rb +63 -0
  30. data/lib/active_agent/providers/anthropic/requests/messages/content/_types.rb +143 -0
  31. data/lib/active_agent/providers/anthropic/requests/messages/content/base.rb +21 -0
  32. data/lib/active_agent/providers/anthropic/requests/messages/content/document.rb +26 -0
  33. data/lib/active_agent/providers/anthropic/requests/messages/content/image.rb +23 -0
  34. data/lib/active_agent/providers/anthropic/requests/messages/content/redacted_thinking.rb +21 -0
  35. data/lib/active_agent/providers/anthropic/requests/messages/content/search_result.rb +27 -0
  36. data/lib/active_agent/providers/anthropic/requests/messages/content/sources/_types.rb +171 -0
  37. data/lib/active_agent/providers/anthropic/requests/messages/content/sources/base.rb +22 -0
  38. data/lib/active_agent/providers/anthropic/requests/messages/content/sources/document_base64.rb +25 -0
  39. data/lib/active_agent/providers/anthropic/requests/messages/content/sources/document_file.rb +23 -0
  40. data/lib/active_agent/providers/anthropic/requests/messages/content/sources/document_text.rb +25 -0
  41. data/lib/active_agent/providers/anthropic/requests/messages/content/sources/document_url.rb +23 -0
  42. data/lib/active_agent/providers/anthropic/requests/messages/content/sources/image_base64.rb +27 -0
  43. data/lib/active_agent/providers/anthropic/requests/messages/content/sources/image_file.rb +23 -0
  44. data/lib/active_agent/providers/anthropic/requests/messages/content/sources/image_url.rb +23 -0
  45. data/lib/active_agent/providers/anthropic/requests/messages/content/text.rb +22 -0
  46. data/lib/active_agent/providers/anthropic/requests/messages/content/thinking.rb +23 -0
  47. data/lib/active_agent/providers/anthropic/requests/messages/content/tool_result.rb +24 -0
  48. data/lib/active_agent/providers/anthropic/requests/messages/content/tool_use.rb +28 -0
  49. data/lib/active_agent/providers/anthropic/requests/messages/user.rb +21 -0
  50. data/lib/active_agent/providers/anthropic/requests/metadata.rb +18 -0
  51. data/lib/active_agent/providers/anthropic/requests/response_format.rb +22 -0
  52. data/lib/active_agent/providers/anthropic/requests/thinking_config/_types.rb +60 -0
  53. data/lib/active_agent/providers/anthropic/requests/thinking_config/base.rb +20 -0
  54. data/lib/active_agent/providers/anthropic/requests/thinking_config/disabled.rb +16 -0
  55. data/lib/active_agent/providers/anthropic/requests/thinking_config/enabled.rb +20 -0
  56. data/lib/active_agent/providers/anthropic/requests/tool_choice/_types.rb +78 -0
  57. data/lib/active_agent/providers/anthropic/requests/tool_choice/any.rb +17 -0
  58. data/lib/active_agent/providers/anthropic/requests/tool_choice/auto.rb +17 -0
  59. data/lib/active_agent/providers/anthropic/requests/tool_choice/base.rb +20 -0
  60. data/lib/active_agent/providers/anthropic/requests/tool_choice/none.rb +16 -0
  61. data/lib/active_agent/providers/anthropic/requests/tool_choice/tool.rb +20 -0
  62. data/lib/active_agent/providers/anthropic_provider.rb +211 -0
  63. data/lib/active_agent/providers/common/messages/_types.rb +124 -0
  64. data/lib/active_agent/providers/common/messages/assistant.rb +57 -0
  65. data/lib/active_agent/providers/common/messages/base.rb +17 -0
  66. data/lib/active_agent/providers/common/messages/system.rb +20 -0
  67. data/lib/active_agent/providers/common/messages/tool.rb +21 -0
  68. data/lib/active_agent/providers/common/messages/user.rb +20 -0
  69. data/lib/active_agent/providers/common/model.rb +361 -0
  70. data/lib/active_agent/providers/common/response.rb +13 -0
  71. data/lib/active_agent/providers/common/responses/_types.rb +51 -0
  72. data/lib/active_agent/providers/common/responses/base.rb +151 -0
  73. data/lib/active_agent/providers/common/responses/embed.rb +33 -0
  74. data/lib/active_agent/providers/common/responses/format.rb +31 -0
  75. data/lib/active_agent/providers/common/responses/message.rb +3 -0
  76. data/lib/active_agent/providers/common/responses/prompt.rb +42 -0
  77. data/lib/active_agent/providers/concerns/exception_handler.rb +72 -0
  78. data/lib/active_agent/providers/concerns/previewable.rb +150 -0
  79. data/lib/active_agent/providers/log_subscriber.rb +360 -0
  80. data/lib/active_agent/providers/mock/_types.rb +77 -0
  81. data/lib/active_agent/providers/mock/embedding_request.rb +17 -0
  82. data/lib/active_agent/providers/mock/messages/_types.rb +103 -0
  83. data/lib/active_agent/providers/mock/messages/assistant.rb +26 -0
  84. data/lib/active_agent/providers/mock/messages/base.rb +63 -0
  85. data/lib/active_agent/providers/mock/messages/user.rb +18 -0
  86. data/lib/active_agent/providers/mock/options.rb +30 -0
  87. data/lib/active_agent/providers/mock/request.rb +38 -0
  88. data/lib/active_agent/providers/mock_provider.rb +311 -0
  89. data/lib/active_agent/providers/ollama/_types.rb +5 -0
  90. data/lib/active_agent/providers/ollama/chat/_types.rb +44 -0
  91. data/lib/active_agent/providers/ollama/chat/request.rb +70 -0
  92. data/lib/active_agent/providers/ollama/chat/requests/_types.rb +3 -0
  93. data/lib/active_agent/providers/ollama/chat/requests/messages/_types.rb +116 -0
  94. data/lib/active_agent/providers/ollama/chat/requests/messages/assistant.rb +19 -0
  95. data/lib/active_agent/providers/ollama/chat/requests/messages/user.rb +19 -0
  96. data/lib/active_agent/providers/ollama/embedding/_types.rb +44 -0
  97. data/lib/active_agent/providers/ollama/embedding/request.rb +77 -0
  98. data/lib/active_agent/providers/ollama/embedding/requests/_types.rb +83 -0
  99. data/lib/active_agent/providers/ollama/embedding/requests/options.rb +104 -0
  100. data/lib/active_agent/providers/ollama/options.rb +27 -0
  101. data/lib/active_agent/providers/ollama_provider.rb +95 -0
  102. data/lib/active_agent/providers/open_ai/_base.rb +58 -0
  103. data/lib/active_agent/providers/open_ai/_types.rb +5 -0
  104. data/lib/active_agent/providers/open_ai/chat/_types.rb +44 -0
  105. data/lib/active_agent/providers/open_ai/chat/request.rb +215 -0
  106. data/lib/active_agent/providers/open_ai/chat/requests/_types.rb +229 -0
  107. data/lib/active_agent/providers/open_ai/chat/requests/audio.rb +24 -0
  108. data/lib/active_agent/providers/open_ai/chat/requests/messages/_types.rb +123 -0
  109. data/lib/active_agent/providers/open_ai/chat/requests/messages/assistant.rb +42 -0
  110. data/lib/active_agent/providers/open_ai/chat/requests/messages/base.rb +78 -0
  111. data/lib/active_agent/providers/open_ai/chat/requests/messages/content/_types.rb +133 -0
  112. data/lib/active_agent/providers/open_ai/chat/requests/messages/content/audio.rb +35 -0
  113. data/lib/active_agent/providers/open_ai/chat/requests/messages/content/base.rb +24 -0
  114. data/lib/active_agent/providers/open_ai/chat/requests/messages/content/file.rb +26 -0
  115. data/lib/active_agent/providers/open_ai/chat/requests/messages/content/files/_types.rb +60 -0
  116. data/lib/active_agent/providers/open_ai/chat/requests/messages/content/files/details.rb +41 -0
  117. data/lib/active_agent/providers/open_ai/chat/requests/messages/content/image.rb +37 -0
  118. data/lib/active_agent/providers/open_ai/chat/requests/messages/content/refusal.rb +25 -0
  119. data/lib/active_agent/providers/open_ai/chat/requests/messages/content/text.rb +25 -0
  120. data/lib/active_agent/providers/open_ai/chat/requests/messages/developer.rb +25 -0
  121. data/lib/active_agent/providers/open_ai/chat/requests/messages/function.rb +25 -0
  122. data/lib/active_agent/providers/open_ai/chat/requests/messages/system.rb +25 -0
  123. data/lib/active_agent/providers/open_ai/chat/requests/messages/tool.rb +26 -0
  124. data/lib/active_agent/providers/open_ai/chat/requests/messages/user.rb +32 -0
  125. data/lib/active_agent/providers/open_ai/chat/requests/prediction.rb +46 -0
  126. data/lib/active_agent/providers/open_ai/chat/requests/response_format.rb +53 -0
  127. data/lib/active_agent/providers/open_ai/chat/requests/stream_options.rb +24 -0
  128. data/lib/active_agent/providers/open_ai/chat/requests/tool_choice.rb +26 -0
  129. data/lib/active_agent/providers/open_ai/chat/requests/tools/_types.rb +5 -0
  130. data/lib/active_agent/providers/open_ai/chat/requests/tools/base.rb +22 -0
  131. data/lib/active_agent/providers/open_ai/chat/requests/tools/custom_tool.rb +41 -0
  132. data/lib/active_agent/providers/open_ai/chat/requests/tools/function_tool.rb +51 -0
  133. data/lib/active_agent/providers/open_ai/chat/requests/web_search_options.rb +45 -0
  134. data/lib/active_agent/providers/open_ai/chat_provider.rb +198 -0
  135. data/lib/active_agent/providers/open_ai/embedding/_types.rb +45 -0
  136. data/lib/active_agent/providers/open_ai/embedding/request.rb +85 -0
  137. data/lib/active_agent/providers/open_ai/embedding/requests/_types.rb +49 -0
  138. data/lib/active_agent/providers/open_ai/options.rb +74 -0
  139. data/lib/active_agent/providers/open_ai/responses/_types.rb +50 -0
  140. data/lib/active_agent/providers/open_ai/responses/request.rb +163 -0
  141. data/lib/active_agent/providers/open_ai/responses/requests/_types.rb +231 -0
  142. data/lib/active_agent/providers/open_ai/responses/requests/conversation.rb +23 -0
  143. data/lib/active_agent/providers/open_ai/responses/requests/inputs/_types.rb +264 -0
  144. data/lib/active_agent/providers/open_ai/responses/requests/inputs/assistant_message.rb +22 -0
  145. data/lib/active_agent/providers/open_ai/responses/requests/inputs/base.rb +89 -0
  146. data/lib/active_agent/providers/open_ai/responses/requests/inputs/code_interpreter_tool_call.rb +30 -0
  147. data/lib/active_agent/providers/open_ai/responses/requests/inputs/computer_tool_call.rb +28 -0
  148. data/lib/active_agent/providers/open_ai/responses/requests/inputs/computer_tool_call_output.rb +33 -0
  149. data/lib/active_agent/providers/open_ai/responses/requests/inputs/content/_types.rb +207 -0
  150. data/lib/active_agent/providers/open_ai/responses/requests/inputs/content/base.rb +22 -0
  151. data/lib/active_agent/providers/open_ai/responses/requests/inputs/content/input_audio.rb +26 -0
  152. data/lib/active_agent/providers/open_ai/responses/requests/inputs/content/input_file.rb +28 -0
  153. data/lib/active_agent/providers/open_ai/responses/requests/inputs/content/input_image.rb +28 -0
  154. data/lib/active_agent/providers/open_ai/responses/requests/inputs/content/input_text.rb +25 -0
  155. data/lib/active_agent/providers/open_ai/responses/requests/inputs/custom_tool_call.rb +28 -0
  156. data/lib/active_agent/providers/open_ai/responses/requests/inputs/custom_tool_call_output.rb +27 -0
  157. data/lib/active_agent/providers/open_ai/responses/requests/inputs/developer_message.rb +20 -0
  158. data/lib/active_agent/providers/open_ai/responses/requests/inputs/file_search_tool_call.rb +25 -0
  159. data/lib/active_agent/providers/open_ai/responses/requests/inputs/function_call_output.rb +32 -0
  160. data/lib/active_agent/providers/open_ai/responses/requests/inputs/function_tool_call.rb +28 -0
  161. data/lib/active_agent/providers/open_ai/responses/requests/inputs/image_gen_tool_call.rb +27 -0
  162. data/lib/active_agent/providers/open_ai/responses/requests/inputs/input_message.rb +31 -0
  163. data/lib/active_agent/providers/open_ai/responses/requests/inputs/item_reference.rb +23 -0
  164. data/lib/active_agent/providers/open_ai/responses/requests/inputs/local_shell_tool_call.rb +26 -0
  165. data/lib/active_agent/providers/open_ai/responses/requests/inputs/local_shell_tool_call_output.rb +33 -0
  166. data/lib/active_agent/providers/open_ai/responses/requests/inputs/mcp_approval_request.rb +30 -0
  167. data/lib/active_agent/providers/open_ai/responses/requests/inputs/mcp_approval_response.rb +28 -0
  168. data/lib/active_agent/providers/open_ai/responses/requests/inputs/mcp_list_tools.rb +29 -0
  169. data/lib/active_agent/providers/open_ai/responses/requests/inputs/mcp_tool_call.rb +35 -0
  170. data/lib/active_agent/providers/open_ai/responses/requests/inputs/output_message.rb +35 -0
  171. data/lib/active_agent/providers/open_ai/responses/requests/inputs/reasoning.rb +33 -0
  172. data/lib/active_agent/providers/open_ai/responses/requests/inputs/system_message.rb +20 -0
  173. data/lib/active_agent/providers/open_ai/responses/requests/inputs/tool_call_base.rb +27 -0
  174. data/lib/active_agent/providers/open_ai/responses/requests/inputs/tool_message.rb +23 -0
  175. data/lib/active_agent/providers/open_ai/responses/requests/inputs/user_message.rb +20 -0
  176. data/lib/active_agent/providers/open_ai/responses/requests/inputs/web_search_tool_call.rb +24 -0
  177. data/lib/active_agent/providers/open_ai/responses/requests/prompt_reference.rb +23 -0
  178. data/lib/active_agent/providers/open_ai/responses/requests/reasoning.rb +23 -0
  179. data/lib/active_agent/providers/open_ai/responses/requests/stream_options.rb +20 -0
  180. data/lib/active_agent/providers/open_ai/responses/requests/text/_types.rb +89 -0
  181. data/lib/active_agent/providers/open_ai/responses/requests/text/base.rb +22 -0
  182. data/lib/active_agent/providers/open_ai/responses/requests/text/json_object.rb +20 -0
  183. data/lib/active_agent/providers/open_ai/responses/requests/text/json_schema.rb +48 -0
  184. data/lib/active_agent/providers/open_ai/responses/requests/text/plain.rb +20 -0
  185. data/lib/active_agent/providers/open_ai/responses/requests/text.rb +41 -0
  186. data/lib/active_agent/providers/open_ai/responses/requests/tool_choice.rb +26 -0
  187. data/lib/active_agent/providers/open_ai/responses/requests/tools/_types.rb +112 -0
  188. data/lib/active_agent/providers/open_ai/responses/requests/tools/base.rb +25 -0
  189. data/lib/active_agent/providers/open_ai/responses/requests/tools/code_interpreter_tool.rb +23 -0
  190. data/lib/active_agent/providers/open_ai/responses/requests/tools/computer_tool.rb +27 -0
  191. data/lib/active_agent/providers/open_ai/responses/requests/tools/custom_tool.rb +28 -0
  192. data/lib/active_agent/providers/open_ai/responses/requests/tools/file_search_tool.rb +27 -0
  193. data/lib/active_agent/providers/open_ai/responses/requests/tools/function_tool.rb +29 -0
  194. data/lib/active_agent/providers/open_ai/responses/requests/tools/image_generation_tool.rb +37 -0
  195. data/lib/active_agent/providers/open_ai/responses/requests/tools/local_shell_tool.rb +21 -0
  196. data/lib/active_agent/providers/open_ai/responses/requests/tools/mcp_tool.rb +41 -0
  197. data/lib/active_agent/providers/open_ai/responses/requests/tools/web_search_preview_tool.rb +24 -0
  198. data/lib/active_agent/providers/open_ai/responses/requests/tools/web_search_tool.rb +25 -0
  199. data/lib/active_agent/providers/open_ai/responses_provider.rb +153 -0
  200. data/lib/active_agent/providers/open_ai/schema.yml +65937 -0
  201. data/lib/active_agent/providers/open_ai_provider.rb +97 -0
  202. data/lib/active_agent/providers/open_router/_types.rb +45 -0
  203. data/lib/active_agent/providers/open_router/options.rb +93 -0
  204. data/lib/active_agent/providers/open_router/request.rb +83 -0
  205. data/lib/active_agent/providers/open_router/requests/_types.rb +198 -0
  206. data/lib/active_agent/providers/open_router/requests/message.rb +1 -0
  207. data/lib/active_agent/providers/open_router/requests/messages/_types.rb +59 -0
  208. data/lib/active_agent/providers/open_router/requests/messages/assistant.rb +20 -0
  209. data/lib/active_agent/providers/open_router/requests/messages/content/_types.rb +97 -0
  210. data/lib/active_agent/providers/open_router/requests/messages/content/file.rb +27 -0
  211. data/lib/active_agent/providers/open_router/requests/messages/content/files/_types.rb +61 -0
  212. data/lib/active_agent/providers/open_router/requests/messages/content/files/details.rb +26 -0
  213. data/lib/active_agent/providers/open_router/requests/messages/user.rb +30 -0
  214. data/lib/active_agent/providers/open_router/requests/plugin.rb +25 -0
  215. data/lib/active_agent/providers/open_router/requests/plugins/_types.rb +46 -0
  216. data/lib/active_agent/providers/open_router/requests/plugins/pdf_config.rb +29 -0
  217. data/lib/active_agent/providers/open_router/requests/prediction.rb +17 -0
  218. data/lib/active_agent/providers/open_router/requests/provider_preferences/_types.rb +44 -0
  219. data/lib/active_agent/providers/open_router/requests/provider_preferences/max_price.rb +30 -0
  220. data/lib/active_agent/providers/open_router/requests/provider_preferences.rb +64 -0
  221. data/lib/active_agent/providers/open_router/requests/response_format.rb +49 -0
  222. data/lib/active_agent/providers/open_router_provider.rb +53 -0
  223. data/lib/active_agent/providers/openai_provider.rb +2 -0
  224. data/lib/active_agent/providers/openrouter_provider.rb +2 -0
  225. data/lib/active_agent/railtie.rb +8 -6
  226. data/lib/active_agent/schema_generator.rb +333 -166
  227. data/lib/active_agent/version.rb +1 -1
  228. data/lib/active_agent.rb +112 -36
  229. data/lib/generators/active_agent/agent/USAGE +78 -0
  230. data/lib/generators/active_agent/{agent_generator.rb → agent/agent_generator.rb} +14 -4
  231. data/lib/generators/active_agent/install/USAGE +25 -0
  232. data/lib/generators/active_agent/{install_generator.rb → install/install_generator.rb} +1 -19
  233. data/lib/generators/active_agent/templates/agent.rb.tt +7 -3
  234. data/lib/generators/active_agent/templates/application_agent.rb.tt +0 -2
  235. data/lib/generators/erb/agent_generator.rb +31 -16
  236. data/lib/generators/erb/templates/instructions.md.erb.tt +3 -0
  237. data/lib/generators/erb/templates/instructions.md.tt +3 -0
  238. data/lib/generators/erb/templates/instructions.text.tt +1 -0
  239. data/lib/generators/erb/templates/message.md.erb.tt +5 -0
  240. data/lib/generators/erb/templates/schema.json.tt +10 -0
  241. data/lib/generators/test_unit/agent_generator.rb +1 -1
  242. data/lib/generators/test_unit/templates/functional_test.rb.tt +4 -2
  243. metadata +320 -65
  244. data/lib/active_agent/action_prompt/action.rb +0 -13
  245. data/lib/active_agent/action_prompt/base.rb +0 -623
  246. data/lib/active_agent/action_prompt/message.rb +0 -126
  247. data/lib/active_agent/action_prompt/prompt.rb +0 -136
  248. data/lib/active_agent/action_prompt.rb +0 -19
  249. data/lib/active_agent/callbacks.rb +0 -33
  250. data/lib/active_agent/generation_provider/anthropic_provider.rb +0 -163
  251. data/lib/active_agent/generation_provider/base.rb +0 -55
  252. data/lib/active_agent/generation_provider/base_adapter.rb +0 -19
  253. data/lib/active_agent/generation_provider/error_handling.rb +0 -167
  254. data/lib/active_agent/generation_provider/log_subscriber.rb +0 -92
  255. data/lib/active_agent/generation_provider/message_formatting.rb +0 -107
  256. data/lib/active_agent/generation_provider/ollama_provider.rb +0 -66
  257. data/lib/active_agent/generation_provider/open_ai_provider.rb +0 -279
  258. data/lib/active_agent/generation_provider/open_router_provider.rb +0 -385
  259. data/lib/active_agent/generation_provider/parameter_builder.rb +0 -119
  260. data/lib/active_agent/generation_provider/response.rb +0 -75
  261. data/lib/active_agent/generation_provider/responses_adapter.rb +0 -44
  262. data/lib/active_agent/generation_provider/stream_processing.rb +0 -58
  263. data/lib/active_agent/generation_provider/tool_management.rb +0 -142
  264. data/lib/active_agent/generation_provider.rb +0 -67
  265. data/lib/active_agent/log_subscriber.rb +0 -44
  266. data/lib/active_agent/parameterized.rb +0 -75
  267. data/lib/active_agent/prompt_helper.rb +0 -19
  268. data/lib/active_agent/queued_generation.rb +0 -12
  269. data/lib/active_agent/rescuable.rb +0 -34
  270. data/lib/active_agent/sanitizers.rb +0 -40
  271. data/lib/active_agent/streaming.rb +0 -34
  272. data/lib/active_agent/test_case.rb +0 -125
  273. data/lib/generators/USAGE +0 -47
  274. data/lib/generators/active_agent/USAGE +0 -56
  275. data/lib/generators/erb/install_generator.rb +0 -44
  276. data/lib/generators/erb/templates/layout.html.erb.tt +0 -1
  277. data/lib/generators/erb/templates/layout.json.erb.tt +0 -1
  278. data/lib/generators/erb/templates/layout.text.erb.tt +0 -1
  279. data/lib/generators/erb/templates/view.html.erb.tt +0 -5
  280. data/lib/generators/erb/templates/view.json.erb.tt +0 -16
  281. /data/lib/active_agent/{preview.rb → concerns/preview.rb} +0 -0
  282. /data/lib/generators/erb/templates/{view.text.erb.tt → message.text.erb.tt} +0 -0
@@ -1,167 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ActiveAgent
4
- module GenerationProvider
5
- module ErrorHandling
6
- extend ActiveSupport::Concern
7
- include ActiveSupport::Rescuable
8
-
9
- included do
10
- class_attribute :retry_on_errors, default: []
11
- class_attribute :max_retries, default: 3
12
- class_attribute :verbose_errors_enabled, default: false
13
-
14
- # Use rescue_from for provider-specific error handling
15
- rescue_from StandardError, with: :handle_generation_error
16
- end
17
-
18
- def with_error_handling
19
- retries = 0
20
- begin
21
- yield
22
- rescue => e
23
- if should_retry?(e) && retries < max_retries
24
- retries += 1
25
- log_retry(e, retries) if verbose_errors?
26
- sleep(retry_delay(retries))
27
- retry
28
- else
29
- # Use rescue_with_handler from Rescuable
30
- rescue_with_handler(e) || raise
31
- end
32
- end
33
- end
34
-
35
- protected
36
-
37
- def should_retry?(error)
38
- return false if retry_on_errors.empty?
39
- retry_on_errors.any? { |klass| error.is_a?(klass) }
40
- end
41
-
42
- def retry_delay(attempt)
43
- # Exponential backoff: 1s, 2s, 4s...
44
- 2 ** (attempt - 1)
45
- end
46
-
47
- def handle_generation_error(error)
48
- error_message = format_error_message(error)
49
- # Create new error with original backtrace preserved
50
- new_error = ActiveAgent::GenerationProvider::Base::GenerationProviderError.new(error_message)
51
- new_error.set_backtrace(error.backtrace) if error.respond_to?(:backtrace)
52
-
53
- # Log detailed error if verbose mode is enabled
54
- log_error_details(error) if verbose_errors?
55
-
56
- # Instrument the error for LogSubscriber
57
- instrument_error(error, new_error)
58
-
59
- raise new_error
60
- end
61
-
62
- def format_error_message(error)
63
- message = if error.respond_to?(:response) && error.response
64
- error.response[:body]
65
- elsif error.respond_to?(:message)
66
- error.message
67
- elsif error.respond_to?(:to_s)
68
- error.to_s
69
- else
70
- "An unknown error occurred: #{error.class.name}"
71
- end
72
-
73
- # Include error class in verbose mode
74
- if verbose_errors?
75
- "[#{error.class.name}] #{message}"
76
- else
77
- message
78
- end
79
- end
80
-
81
- def verbose_errors?
82
- # Check multiple sources for verbose setting (in priority order)
83
- # 1. Instance config (highest priority)
84
- return true if @config&.dig("verbose_errors")
85
-
86
- # 2. Class-level setting
87
- return true if self.class.verbose_errors_enabled
88
-
89
- # 3. ActiveAgent global configuration
90
- if defined?(ActiveAgent) && ActiveAgent.respond_to?(:configuration)
91
- return true if ActiveAgent.configuration.verbose_generation_errors?
92
- end
93
-
94
- # 4. Environment variable (lowest priority)
95
- ENV["ACTIVE_AGENT_VERBOSE_ERRORS"] == "true"
96
- end
97
-
98
- def log_error_details(error)
99
- logger = find_logger
100
- return unless logger
101
-
102
- logger.error "[ActiveAgent::GenerationProvider] Error: #{error.class.name}: #{error.message}"
103
- if logger.respond_to?(:debug) && error.respond_to?(:backtrace)
104
- logger.debug "Backtrace:\n #{error.backtrace&.first(10)&.join("\n ")}"
105
- end
106
- end
107
-
108
- def log_retry(error, attempt)
109
- logger = find_logger
110
- return unless logger
111
-
112
- message = "[ActiveAgent::GenerationProvider] Retry attempt #{attempt}/#{max_retries} after #{error.class.name}"
113
- logger.info message
114
- end
115
-
116
- def find_logger
117
- # Try multiple logger sources (in priority order)
118
- # 1. Instance config
119
- return @config["logger"] if @config&.dig("logger")
120
-
121
- # 2. ActiveAgent configuration logger
122
- if defined?(ActiveAgent) && ActiveAgent.respond_to?(:configuration)
123
- config_logger = ActiveAgent.configuration.generation_provider_logger
124
- return config_logger if config_logger
125
- end
126
-
127
- # 3. Rails logger
128
- return Rails.logger if defined?(Rails) && Rails.logger
129
-
130
- # 4. ActiveAgent::Base logger
131
- return ActiveAgent::Base.logger if defined?(ActiveAgent::Base) && ActiveAgent::Base.respond_to?(:logger)
132
-
133
- nil
134
- end
135
-
136
- def instrument_error(original_error, wrapped_error)
137
- if defined?(ActiveSupport::Notifications)
138
- ActiveSupport::Notifications.instrument("error.active_agent", {
139
- error_class: original_error.class.name,
140
- error_message: original_error.message,
141
- wrapped_error: wrapped_error,
142
- provider: self.class.name
143
- })
144
- end
145
- end
146
-
147
- module ClassMethods
148
- def retry_on(*errors, max_attempts: 3, **options)
149
- self.retry_on_errors = errors
150
- self.max_retries = max_attempts
151
-
152
- # Also register with rescue_from for more complex handling
153
- errors.each do |error_class|
154
- rescue_from error_class do |error|
155
- # This will be caught by with_error_handling for retry logic
156
- raise error
157
- end
158
- end
159
- end
160
-
161
- def enable_verbose_errors!
162
- self.verbose_errors_enabled = true
163
- end
164
- end
165
- end
166
- end
167
- end
@@ -1,92 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "active_support/log_subscriber"
4
-
5
- module ActiveAgent
6
- module GenerationProvider
7
- # = Generation Provider \\LogSubscriber
8
- #
9
- # Implements the ActiveSupport::LogSubscriber for logging notifications when
10
- # generation providers make API calls and handle responses.
11
- class LogSubscriber < ActiveSupport::LogSubscriber
12
- # A generation request was made
13
- def generate(event)
14
- info do
15
- provider = event.payload[:provider]
16
- model = event.payload[:model]
17
-
18
- if exception = event.payload[:exception_object]
19
- "Failed generation with #{provider} model=#{model} error_class=#{exception.class} error_message=#{exception.message.inspect}"
20
- else
21
- "Generated response with #{provider} model=#{model} (#{event.duration.round(1)}ms)"
22
- end
23
- end
24
-
25
- debug { event.payload[:prompt] } if event.payload[:prompt]
26
- end
27
- subscribe_log_level :generate, :debug
28
-
29
- # Streaming chunk received
30
- def stream_chunk(event)
31
- debug do
32
- provider = event.payload[:provider]
33
- chunk_size = event.payload[:chunk_size]
34
- "#{provider}: received stream chunk (#{chunk_size} bytes)"
35
- end
36
- end
37
- subscribe_log_level :stream_chunk, :debug
38
-
39
- # Tool/function call executed
40
- def tool_call(event)
41
- info do
42
- tool_name = event.payload[:tool_name]
43
- tool_id = event.payload[:tool_id]
44
-
45
- if exception = event.payload[:exception_object]
46
- "Failed tool call #{tool_name} id=#{tool_id} error=#{exception.class}"
47
- else
48
- "Executed tool call #{tool_name} id=#{tool_id} (#{event.duration.round(1)}ms)"
49
- end
50
- end
51
- end
52
- subscribe_log_level :tool_call, :debug
53
-
54
- # Retry attempt
55
- def retry(event)
56
- warn do
57
- provider = event.payload[:provider]
58
- attempt = event.payload[:attempt]
59
- max_attempts = event.payload[:max_attempts]
60
- error_class = event.payload[:error_class]
61
-
62
- "#{provider}: Retry attempt #{attempt}/#{max_attempts} after #{error_class}"
63
- end
64
- end
65
- subscribe_log_level :retry, :warn
66
-
67
- # Error occurred
68
- def error(event)
69
- error do
70
- provider = event.payload[:provider]
71
- error_class = event.payload[:error_class]
72
- error_message = event.payload[:error_message]
73
-
74
- "#{provider}: Error #{error_class} - #{error_message}"
75
- end
76
- end
77
- subscribe_log_level :error, :error
78
-
79
- # Use the logger configured for ActiveAgent::Base if available
80
- def logger
81
- if defined?(ActiveAgent::Base) && ActiveAgent::Base.respond_to?(:logger)
82
- ActiveAgent::Base.logger
83
- else
84
- super
85
- end
86
- end
87
- end
88
- end
89
- end
90
-
91
- # Attach to active_agent.generation_provider namespace
92
- ActiveAgent::GenerationProvider::LogSubscriber.attach_to :"active_agent.generation_provider"
@@ -1,107 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ActiveAgent
4
- module GenerationProvider
5
- module MessageFormatting
6
- extend ActiveSupport::Concern
7
-
8
- def provider_messages(messages)
9
- messages.map do |message|
10
- format_message(message)
11
- end
12
- end
13
-
14
- protected
15
-
16
- def format_message(message)
17
- base_message = {
18
- role: convert_role(message.role),
19
- content: format_content(message)
20
- }
21
-
22
- add_tool_fields(base_message, message)
23
- add_metadata_fields(base_message, message)
24
-
25
- base_message.compact
26
- end
27
-
28
- def convert_role(role)
29
- # Default role conversion - override in provider for specific mappings
30
- role.to_s
31
- end
32
-
33
- def format_content(message)
34
- # Handle multimodal content
35
- case message.content_type
36
- when "image_url"
37
- format_image_content(message)
38
- when "multipart/mixed", "array"
39
- format_multimodal_content(message)
40
- else
41
- message.content
42
- end
43
- end
44
-
45
- def format_image_content(message)
46
- # Default implementation - override in provider
47
- message.content
48
- end
49
-
50
- def format_multimodal_content(message)
51
- # Default implementation for multimodal content
52
- if message.content.is_a?(Array)
53
- message.content.map do |item|
54
- format_content_item(item)
55
- end
56
- else
57
- message.content
58
- end
59
- end
60
-
61
- def format_content_item(item)
62
- # Format individual content items in multimodal messages
63
- # Override in provider for specific formatting
64
- item
65
- end
66
-
67
- def add_tool_fields(base_message, message)
68
- # Add tool-specific fields based on role
69
- case message.role.to_s
70
- when "assistant"
71
- if message.action_requested && message.requested_actions.any?
72
- base_message[:tool_calls] = format_tool_calls(message.requested_actions)
73
- elsif message.raw_actions.present? && message.raw_actions.is_a?(Array)
74
- base_message[:tool_calls] = message.raw_actions
75
- end
76
- when "tool"
77
- base_message[:tool_call_id] = message.action_id if message.action_id
78
- base_message[:name] = message.action_name if message.action_name
79
- end
80
- end
81
-
82
- def add_metadata_fields(base_message, message)
83
- # Override to add provider-specific metadata
84
- # For example: message IDs, timestamps, etc.
85
- end
86
-
87
- def format_tool_calls(actions)
88
- # Default implementation - override in provider for specific format
89
- actions.map do |action|
90
- format_single_tool_call(action)
91
- end
92
- end
93
-
94
- def format_single_tool_call(action)
95
- # Default tool call format (OpenAI style)
96
- {
97
- id: action.id,
98
- type: "function",
99
- function: {
100
- name: action.name,
101
- arguments: action.params.is_a?(String) ? action.params : action.params.to_json
102
- }
103
- }
104
- end
105
- end
106
- end
107
- end
@@ -1,66 +0,0 @@
1
- require "openai"
2
- require_relative "open_ai_provider"
3
-
4
- module ActiveAgent
5
- module GenerationProvider
6
- class OllamaProvider < OpenAIProvider
7
- def initialize(config)
8
- @config = config
9
- @access_token ||= config["api_key"] || config["access_token"] || ENV["OLLAMA_API_KEY"] || ENV["OLLAMA_ACCESS_TOKEN"]
10
- @model_name = config["model"]
11
- @host = config["host"] || "http://localhost:11434"
12
- @api_version = config["api_version"] || "v1"
13
- @api_type = config["api_type"] || nil
14
- @client = OpenAI::Client.new(uri_base: @host, access_token: @access_token, log_errors: Rails.env.development?, api_version: @api_version, api_type: @api_type)
15
- end
16
-
17
- protected
18
-
19
- def format_error_message(error)
20
- # Check for various connection-related errors
21
- connection_errors = [
22
- Errno::ECONNREFUSED,
23
- Errno::EADDRNOTAVAIL,
24
- Errno::EHOSTUNREACH,
25
- Net::OpenTimeout,
26
- Net::ReadTimeout,
27
- SocketError,
28
- Faraday::ConnectionFailed
29
- ]
30
-
31
- if connection_errors.any? { |klass| error.is_a?(klass) } ||
32
- (error.message&.include?("Failed to open TCP connection") ||
33
- error.message&.include?("Connection refused"))
34
- "Unable to connect to Ollama at #{@host}. Please ensure Ollama is running on the configured host and port.\n" \
35
- "You can start Ollama with: `ollama serve`\n" \
36
- "Or update your configuration to point to the correct host."
37
- else
38
- super
39
- end
40
- end
41
-
42
- def embeddings_parameters(input: prompt.message.content, model: "nomic-embed-text")
43
- {
44
- model: @config["embedding_model"] || model,
45
- input: input
46
- }
47
- end
48
-
49
- def embeddings_response(response, request_params = nil)
50
- # Ollama can return either format:
51
- # 1. OpenAI-compatible: { "data": [{ "embedding": [...] }] }
52
- # 2. Native Ollama: { "embedding": [...] }
53
- embedding = response.dig("data", 0, "embedding") || response.dig("embedding")
54
-
55
- message = ActiveAgent::ActionPrompt::Message.new(content: embedding, role: "assistant")
56
-
57
- @response = ActiveAgent::GenerationProvider::Response.new(
58
- prompt: prompt,
59
- message: message,
60
- raw_response: response,
61
- raw_request: request_params
62
- )
63
- end
64
- end
65
- end
66
- end