ruby_llm-agents 1.3.4 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +101 -334
  3. data/app/controllers/concerns/ruby_llm/agents/sortable.rb +0 -1
  4. data/app/controllers/ruby_llm/agents/agents_controller.rb +5 -56
  5. data/app/controllers/ruby_llm/agents/dashboard_controller.rb +22 -106
  6. data/app/controllers/ruby_llm/agents/executions_controller.rb +4 -114
  7. data/app/controllers/ruby_llm/agents/tenants_controller.rb +30 -2
  8. data/app/helpers/ruby_llm/agents/application_helper.rb +19 -53
  9. data/app/models/ruby_llm/agents/execution/analytics.rb +13 -54
  10. data/app/models/ruby_llm/agents/execution/scopes.rb +61 -14
  11. data/app/models/ruby_llm/agents/execution.rb +46 -10
  12. data/app/models/ruby_llm/agents/execution_detail.rb +18 -0
  13. data/app/models/ruby_llm/agents/tenant/budgetable.rb +132 -24
  14. data/app/models/ruby_llm/agents/tenant/incrementable.rb +117 -0
  15. data/app/models/ruby_llm/agents/tenant/resettable.rb +128 -0
  16. data/app/models/ruby_llm/agents/tenant/trackable.rb +46 -12
  17. data/app/models/ruby_llm/agents/tenant.rb +2 -3
  18. data/app/models/ruby_llm/agents/tenant_budget.rb +6 -3
  19. data/app/services/ruby_llm/agents/agent_registry.rb +6 -112
  20. data/app/views/layouts/ruby_llm/agents/application.html.erb +87 -252
  21. data/app/views/ruby_llm/agents/agents/_config_agent.html.erb +71 -218
  22. data/app/views/ruby_llm/agents/agents/_config_embedder.html.erb +20 -63
  23. data/app/views/ruby_llm/agents/agents/_config_image_generator.html.erb +44 -131
  24. data/app/views/ruby_llm/agents/agents/_config_moderator.html.erb +16 -57
  25. data/app/views/ruby_llm/agents/agents/_config_speaker.html.erb +39 -104
  26. data/app/views/ruby_llm/agents/agents/_config_transcriber.html.erb +29 -82
  27. data/app/views/ruby_llm/agents/agents/_empty_state.html.erb +4 -14
  28. data/app/views/ruby_llm/agents/agents/index.html.erb +105 -274
  29. data/app/views/ruby_llm/agents/agents/show.html.erb +248 -378
  30. data/app/views/ruby_llm/agents/dashboard/_action_center.html.erb +29 -52
  31. data/app/views/ruby_llm/agents/dashboard/_tenant_budget.html.erb +73 -99
  32. data/app/views/ruby_llm/agents/dashboard/index.html.erb +228 -433
  33. data/app/views/ruby_llm/agents/executions/_execution.html.erb +1 -1
  34. data/app/views/ruby_llm/agents/executions/_filters.html.erb +4 -25
  35. data/app/views/ruby_llm/agents/executions/_list.html.erb +111 -152
  36. data/app/views/ruby_llm/agents/executions/index.html.erb +5 -7
  37. data/app/views/ruby_llm/agents/executions/show.html.erb +526 -1037
  38. data/app/views/ruby_llm/agents/shared/_agent_type_badge.html.erb +5 -21
  39. data/app/views/ruby_llm/agents/shared/_executions_table.html.erb +70 -191
  40. data/app/views/ruby_llm/agents/shared/_filter_dropdown.html.erb +16 -44
  41. data/app/views/ruby_llm/agents/shared/_select_dropdown.html.erb +12 -41
  42. data/app/views/ruby_llm/agents/shared/_status_badge.html.erb +11 -65
  43. data/app/views/ruby_llm/agents/shared/_tenant_filter.html.erb +6 -5
  44. data/app/views/ruby_llm/agents/system_config/show.html.erb +240 -351
  45. data/app/views/ruby_llm/agents/tenants/_form.html.erb +67 -77
  46. data/app/views/ruby_llm/agents/tenants/edit.html.erb +7 -9
  47. data/app/views/ruby_llm/agents/tenants/index.html.erb +100 -122
  48. data/app/views/ruby_llm/agents/tenants/show.html.erb +146 -336
  49. data/config/routes.rb +0 -13
  50. data/lib/generators/ruby_llm_agents/install_generator.rb +9 -14
  51. data/lib/generators/ruby_llm_agents/migrate_structure_generator.rb +2 -12
  52. data/lib/generators/ruby_llm_agents/restructure_generator.rb +0 -2
  53. data/lib/generators/ruby_llm_agents/templates/add_usage_counters_to_tenants_migration.rb.tt +37 -0
  54. data/lib/generators/ruby_llm_agents/templates/agent.rb.tt +1 -2
  55. data/lib/generators/ruby_llm_agents/templates/application_agent.rb.tt +1 -1
  56. data/lib/generators/ruby_llm_agents/templates/application_image_pipeline.rb.tt +0 -1
  57. data/lib/generators/ruby_llm_agents/templates/create_execution_details_migration.rb.tt +27 -0
  58. data/lib/generators/ruby_llm_agents/templates/create_tenants_migration.rb.tt +25 -0
  59. data/lib/generators/ruby_llm_agents/templates/image_pipeline.rb.tt +0 -1
  60. data/lib/generators/ruby_llm_agents/templates/initializer.rb.tt +9 -12
  61. data/lib/generators/ruby_llm_agents/templates/migration.rb.tt +40 -71
  62. data/lib/generators/ruby_llm_agents/templates/remove_agent_version_migration.rb.tt +13 -0
  63. data/lib/generators/ruby_llm_agents/templates/remove_workflow_columns_migration.rb.tt +19 -0
  64. data/lib/generators/ruby_llm_agents/templates/skills/AGENTS.md.tt +2 -4
  65. data/lib/generators/ruby_llm_agents/templates/skills/IMAGE_PIPELINES.md.tt +0 -1
  66. data/lib/generators/ruby_llm_agents/templates/split_execution_details_migration.rb.tt +232 -0
  67. data/lib/generators/ruby_llm_agents/upgrade_generator.rb +58 -262
  68. data/lib/ruby_llm/agents/audio/speaker.rb +0 -1
  69. data/lib/ruby_llm/agents/audio/transcriber.rb +0 -1
  70. data/lib/ruby_llm/agents/base_agent.rb +52 -6
  71. data/lib/ruby_llm/agents/core/base/callbacks.rb +142 -0
  72. data/lib/ruby_llm/agents/core/base.rb +23 -55
  73. data/lib/ruby_llm/agents/core/configuration.rb +58 -117
  74. data/lib/ruby_llm/agents/core/errors.rb +0 -58
  75. data/lib/ruby_llm/agents/core/instrumentation.rb +157 -110
  76. data/lib/ruby_llm/agents/core/llm_tenant.rb +8 -7
  77. data/lib/ruby_llm/agents/core/version.rb +1 -1
  78. data/lib/ruby_llm/agents/dsl/base.rb +157 -17
  79. data/lib/ruby_llm/agents/dsl/caching.rb +33 -2
  80. data/lib/ruby_llm/agents/dsl/reliability.rb +148 -0
  81. data/lib/ruby_llm/agents/dsl.rb +1 -2
  82. data/lib/ruby_llm/agents/image/analyzer/execution.rb +1 -2
  83. data/lib/ruby_llm/agents/image/background_remover/execution.rb +1 -2
  84. data/lib/ruby_llm/agents/image/concerns/image_operation_dsl.rb +1 -13
  85. data/lib/ruby_llm/agents/image/concerns/image_operation_execution.rb +2 -2
  86. data/lib/ruby_llm/agents/image/editor/dsl.rb +0 -14
  87. data/lib/ruby_llm/agents/image/editor/execution.rb +1 -10
  88. data/lib/ruby_llm/agents/image/editor.rb +0 -1
  89. data/lib/ruby_llm/agents/image/generator.rb +0 -21
  90. data/lib/ruby_llm/agents/image/pipeline/dsl.rb +0 -13
  91. data/lib/ruby_llm/agents/image/pipeline/execution.rb +0 -1
  92. data/lib/ruby_llm/agents/image/transformer/dsl.rb +0 -13
  93. data/lib/ruby_llm/agents/image/transformer/execution.rb +1 -10
  94. data/lib/ruby_llm/agents/image/transformer.rb +0 -1
  95. data/lib/ruby_llm/agents/image/upscaler/execution.rb +1 -2
  96. data/lib/ruby_llm/agents/image/variator/execution.rb +1 -2
  97. data/lib/ruby_llm/agents/infrastructure/alert_manager.rb +78 -173
  98. data/lib/ruby_llm/agents/infrastructure/budget/budget_query.rb +66 -2
  99. data/lib/ruby_llm/agents/infrastructure/budget/spend_recorder.rb +0 -12
  100. data/lib/ruby_llm/agents/infrastructure/circuit_breaker.rb +10 -13
  101. data/lib/ruby_llm/agents/pipeline/context.rb +0 -1
  102. data/lib/ruby_llm/agents/pipeline/middleware/budget.rb +28 -4
  103. data/lib/ruby_llm/agents/pipeline/middleware/cache.rb +3 -10
  104. data/lib/ruby_llm/agents/pipeline/middleware/instrumentation.rb +88 -55
  105. data/lib/ruby_llm/agents/pipeline/middleware/tenant.rb +5 -41
  106. data/lib/ruby_llm/agents/rails/engine.rb +6 -6
  107. data/lib/ruby_llm/agents/results/base.rb +1 -49
  108. data/lib/ruby_llm/agents/text/embedder.rb +0 -1
  109. data/lib/ruby_llm/agents.rb +1 -9
  110. data/lib/tasks/ruby_llm_agents.rake +34 -0
  111. metadata +12 -81
  112. data/app/controllers/ruby_llm/agents/api_configurations_controller.rb +0 -214
  113. data/app/controllers/ruby_llm/agents/workflows_controller.rb +0 -544
  114. data/app/mailers/ruby_llm/agents/alert_mailer.rb +0 -84
  115. data/app/mailers/ruby_llm/agents/application_mailer.rb +0 -28
  116. data/app/models/ruby_llm/agents/api_configuration.rb +0 -386
  117. data/app/models/ruby_llm/agents/execution/workflow.rb +0 -170
  118. data/app/models/ruby_llm/agents/tenant/configurable.rb +0 -135
  119. data/app/views/ruby_llm/agents/agents/_agent.html.erb +0 -98
  120. data/app/views/ruby_llm/agents/agents/_version_comparison.html.erb +0 -186
  121. data/app/views/ruby_llm/agents/agents/_workflow.html.erb +0 -126
  122. data/app/views/ruby_llm/agents/alert_mailer/alert_notification.html.erb +0 -107
  123. data/app/views/ruby_llm/agents/alert_mailer/alert_notification.text.erb +0 -18
  124. data/app/views/ruby_llm/agents/api_configurations/_api_key_field.html.erb +0 -34
  125. data/app/views/ruby_llm/agents/api_configurations/_form.html.erb +0 -288
  126. data/app/views/ruby_llm/agents/api_configurations/edit.html.erb +0 -95
  127. data/app/views/ruby_llm/agents/api_configurations/edit_tenant.html.erb +0 -97
  128. data/app/views/ruby_llm/agents/api_configurations/show.html.erb +0 -214
  129. data/app/views/ruby_llm/agents/api_configurations/tenant.html.erb +0 -179
  130. data/app/views/ruby_llm/agents/dashboard/_agent_comparison.html.erb +0 -73
  131. data/app/views/ruby_llm/agents/dashboard/_alerts_feed.html.erb +0 -62
  132. data/app/views/ruby_llm/agents/dashboard/_breaker_strip.html.erb +0 -47
  133. data/app/views/ruby_llm/agents/dashboard/_budgets_bar.html.erb +0 -75
  134. data/app/views/ruby_llm/agents/dashboard/_model_comparison.html.erb +0 -56
  135. data/app/views/ruby_llm/agents/dashboard/_model_cost_breakdown.html.erb +0 -115
  136. data/app/views/ruby_llm/agents/dashboard/_now_strip.html.erb +0 -59
  137. data/app/views/ruby_llm/agents/dashboard/_top_errors.html.erb +0 -60
  138. data/app/views/ruby_llm/agents/executions/_workflow_summary.html.erb +0 -86
  139. data/app/views/ruby_llm/agents/executions/dry_run.html.erb +0 -149
  140. data/app/views/ruby_llm/agents/shared/_breadcrumbs.html.erb +0 -48
  141. data/app/views/ruby_llm/agents/shared/_nav_link.html.erb +0 -27
  142. data/app/views/ruby_llm/agents/shared/_stat_card.html.erb +0 -14
  143. data/app/views/ruby_llm/agents/shared/_workflow_type_badge.html.erb +0 -35
  144. data/app/views/ruby_llm/agents/workflows/_empty_state.html.erb +0 -22
  145. data/app/views/ruby_llm/agents/workflows/_step_performance.html.erb +0 -228
  146. data/app/views/ruby_llm/agents/workflows/_structure_dsl.html.erb +0 -539
  147. data/app/views/ruby_llm/agents/workflows/_structure_parallel.html.erb +0 -76
  148. data/app/views/ruby_llm/agents/workflows/_structure_pipeline.html.erb +0 -74
  149. data/app/views/ruby_llm/agents/workflows/_structure_router.html.erb +0 -108
  150. data/app/views/ruby_llm/agents/workflows/_workflow_diagram.html.erb +0 -920
  151. data/app/views/ruby_llm/agents/workflows/index.html.erb +0 -179
  152. data/app/views/ruby_llm/agents/workflows/show.html.erb +0 -467
  153. data/lib/generators/ruby_llm_agents/api_configuration_generator.rb +0 -100
  154. data/lib/generators/ruby_llm_agents/templates/add_workflow_migration.rb.tt +0 -38
  155. data/lib/generators/ruby_llm_agents/templates/application_workflow.rb.tt +0 -48
  156. data/lib/generators/ruby_llm_agents/templates/create_api_configurations_migration.rb.tt +0 -90
  157. data/lib/generators/ruby_llm_agents/templates/skills/WORKFLOWS.md.tt +0 -551
  158. data/lib/ruby_llm/agents/core/base/moderation_dsl.rb +0 -181
  159. data/lib/ruby_llm/agents/core/base/moderation_execution.rb +0 -274
  160. data/lib/ruby_llm/agents/core/resolved_config.rb +0 -348
  161. data/lib/ruby_llm/agents/image/generator/content_policy.rb +0 -95
  162. data/lib/ruby_llm/agents/infrastructure/redactor.rb +0 -130
  163. data/lib/ruby_llm/agents/results/moderation_result.rb +0 -158
  164. data/lib/ruby_llm/agents/text/moderator.rb +0 -237
  165. data/lib/ruby_llm/agents/workflow/approval.rb +0 -205
  166. data/lib/ruby_llm/agents/workflow/approval_store.rb +0 -179
  167. data/lib/ruby_llm/agents/workflow/async.rb +0 -220
  168. data/lib/ruby_llm/agents/workflow/async_executor.rb +0 -156
  169. data/lib/ruby_llm/agents/workflow/dsl/executor.rb +0 -467
  170. data/lib/ruby_llm/agents/workflow/dsl/input_schema.rb +0 -244
  171. data/lib/ruby_llm/agents/workflow/dsl/iteration_executor.rb +0 -289
  172. data/lib/ruby_llm/agents/workflow/dsl/parallel_group.rb +0 -107
  173. data/lib/ruby_llm/agents/workflow/dsl/route_builder.rb +0 -150
  174. data/lib/ruby_llm/agents/workflow/dsl/schedule_helpers.rb +0 -187
  175. data/lib/ruby_llm/agents/workflow/dsl/step_config.rb +0 -352
  176. data/lib/ruby_llm/agents/workflow/dsl/step_executor.rb +0 -415
  177. data/lib/ruby_llm/agents/workflow/dsl/wait_config.rb +0 -257
  178. data/lib/ruby_llm/agents/workflow/dsl/wait_executor.rb +0 -317
  179. data/lib/ruby_llm/agents/workflow/dsl.rb +0 -576
  180. data/lib/ruby_llm/agents/workflow/instrumentation.rb +0 -249
  181. data/lib/ruby_llm/agents/workflow/notifiers/base.rb +0 -117
  182. data/lib/ruby_llm/agents/workflow/notifiers/email.rb +0 -117
  183. data/lib/ruby_llm/agents/workflow/notifiers/slack.rb +0 -180
  184. data/lib/ruby_llm/agents/workflow/notifiers/webhook.rb +0 -121
  185. data/lib/ruby_llm/agents/workflow/notifiers.rb +0 -70
  186. data/lib/ruby_llm/agents/workflow/orchestrator.rb +0 -416
  187. data/lib/ruby_llm/agents/workflow/result.rb +0 -592
  188. data/lib/ruby_llm/agents/workflow/thread_pool.rb +0 -185
  189. data/lib/ruby_llm/agents/workflow/throttle_manager.rb +0 -206
  190. data/lib/ruby_llm/agents/workflow/wait_result.rb +0 -213
@@ -1,72 +1,18 @@
1
1
  <%
2
- # Status badge with icon and color coding
2
+ # Status badge pill
3
3
  # Usage: render "ruby_llm/agents/shared/status_badge", status: execution.status
4
- # Options: size: :sm (default), :md, :lg
5
4
 
6
- size = local_assigns[:size] || :sm
7
-
8
- config = case status.to_s
9
- when "running"
10
- {
11
- bg: "bg-blue-50 dark:bg-blue-900/50",
12
- text: "text-blue-700 dark:text-blue-300",
13
- dot: "bg-blue-500",
14
- icon: "M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15",
15
- animate: true
16
- }
17
- when "success"
18
- {
19
- bg: "bg-green-50 dark:bg-green-900/50",
20
- text: "text-green-700 dark:text-green-300",
21
- dot: "bg-green-500",
22
- icon: "M5 13l4 4L19 7",
23
- animate: false
24
- }
25
- when "error"
26
- {
27
- bg: "bg-red-50 dark:bg-red-900/50",
28
- text: "text-red-700 dark:text-red-300",
29
- dot: "bg-red-500",
30
- icon: "M6 18L18 6M6 6l12 12",
31
- animate: false
32
- }
33
- when "timeout"
34
- {
35
- bg: "bg-yellow-50 dark:bg-yellow-900/50",
36
- text: "text-yellow-700 dark:text-yellow-300",
37
- dot: "bg-yellow-500",
38
- icon: "M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z",
39
- animate: false
40
- }
41
- else
42
- {
43
- bg: "bg-gray-50 dark:bg-gray-700",
44
- text: "text-gray-700 dark:text-gray-300",
45
- dot: "bg-gray-500",
46
- icon: "M8.228 9c.549-1.165 2.03-2 3.772-2 2.21 0 4 1.343 4 3 0 1.4-1.278 2.575-3.006 2.907-.542.104-.994.54-.994 1.093m0 3h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z",
47
- animate: false
48
- }
49
- end
50
-
51
- size_classes = case size
52
- when :lg
53
- { badge: "px-3 py-1.5", icon: "w-4 h-4", text: "text-sm" }
54
- when :md
55
- { badge: "px-2.5 py-1", icon: "w-3.5 h-3.5", text: "text-sm" }
56
- else # :sm
57
- { badge: "px-2 py-0.5", icon: "w-3 h-3", text: "text-xs" }
58
- end
5
+ badge_class = case status.to_s
6
+ when "running" then "badge-running"
7
+ when "success" then "badge-success"
8
+ when "error" then "badge-error"
9
+ when "timeout" then "badge-timeout"
10
+ else "badge-timeout"
11
+ end
59
12
  %>
60
- <span class="inline-flex items-center gap-1.5 <%= size_classes[:badge] %> rounded-full <%= config[:bg] %> <%= config[:text] %> font-medium">
61
- <svg class="<%= size_classes[:icon] %> <%= config[:animate] ? 'animate-spin' : '' %>" fill="none" stroke="currentColor" viewBox="0 0 24 24">
62
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="<%= config[:icon] %>"/>
63
- </svg>
64
- <span class="<%= size_classes[:text] %>"><%= status.to_s.capitalize %></span>
13
+ <span class="inline-flex items-center gap-1 font-mono">
14
+ <span class="badge badge-sm <%= badge_class %>"><%= status.to_s %></span>
65
15
  <% if local_assigns[:attempts_count] && attempts_count.to_i > 1 %>
66
- <span class="opacity-70" title="<%= attempts_count %> attempts (retried)">
67
- <svg class="<%= size_classes[:icon] %>" fill="none" stroke="currentColor" viewBox="0 0 24 24">
68
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"/>
69
- </svg>
70
- </span>
16
+ <span class="text-xs text-gray-400 dark:text-gray-600" title="<%= attempts_count %> attempts">&times;<%= attempts_count %></span>
71
17
  <% end %>
72
18
  </span>
@@ -1,9 +1,10 @@
1
1
  <% if tenant_filter_enabled? && available_tenants.any? %>
2
- <div class="tenant-filter">
3
- <%= form_with url: request.path, method: :get, local: true, class: "tenant-filter-form" do |f| %>
4
- <label for="tenant_id">Tenant:</label>
5
- <select name="tenant_id" id="tenant_id" onchange="this.form.submit()">
6
- <option value="">All Tenants</option>
2
+ <div class="flex items-center gap-2 font-mono text-xs">
3
+ <span class="text-gray-400 dark:text-gray-600">tenant:</span>
4
+ <%= form_with url: request.path, method: :get, local: true, class: "inline" do |f| %>
5
+ <select name="tenant_id" id="tenant_id" onchange="this.form.submit()"
6
+ class="bg-transparent border border-gray-200 dark:border-gray-800 rounded px-2 py-0.5 text-xs font-mono text-gray-900 dark:text-gray-100 focus:ring-1 focus:ring-gray-400 dark:focus:ring-gray-600 focus:border-gray-400 dark:focus:border-gray-600">
7
+ <option value="">all tenants</option>
7
8
  <% available_tenants.each do |tenant| %>
8
9
  <option value="<%= tenant %>" <%= 'selected' if tenant == current_tenant_id %>>
9
10
  <%= tenant %>