ruby_llm-agents 1.3.4 → 2.1.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 (191) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +112 -336
  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 +52 -12
  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 +89 -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 +13 -17
  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 +33 -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 +77 -259
  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 +54 -23
  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 +97 -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/infrastructure/execution_logger_job.rb +8 -0
  102. data/lib/ruby_llm/agents/pipeline/context.rb +0 -1
  103. data/lib/ruby_llm/agents/pipeline/middleware/budget.rb +28 -4
  104. data/lib/ruby_llm/agents/pipeline/middleware/cache.rb +3 -10
  105. data/lib/ruby_llm/agents/pipeline/middleware/instrumentation.rb +88 -55
  106. data/lib/ruby_llm/agents/pipeline/middleware/tenant.rb +5 -41
  107. data/lib/ruby_llm/agents/rails/engine.rb +6 -6
  108. data/lib/ruby_llm/agents/results/base.rb +1 -49
  109. data/lib/ruby_llm/agents/text/embedder.rb +0 -1
  110. data/lib/ruby_llm/agents.rb +1 -9
  111. data/lib/tasks/ruby_llm_agents.rake +34 -0
  112. metadata +14 -83
  113. data/app/controllers/ruby_llm/agents/api_configurations_controller.rb +0 -214
  114. data/app/controllers/ruby_llm/agents/workflows_controller.rb +0 -544
  115. data/app/mailers/ruby_llm/agents/alert_mailer.rb +0 -84
  116. data/app/mailers/ruby_llm/agents/application_mailer.rb +0 -28
  117. data/app/models/ruby_llm/agents/api_configuration.rb +0 -386
  118. data/app/models/ruby_llm/agents/execution/workflow.rb +0 -170
  119. data/app/models/ruby_llm/agents/tenant/configurable.rb +0 -135
  120. data/app/views/ruby_llm/agents/agents/_agent.html.erb +0 -98
  121. data/app/views/ruby_llm/agents/agents/_version_comparison.html.erb +0 -186
  122. data/app/views/ruby_llm/agents/agents/_workflow.html.erb +0 -126
  123. data/app/views/ruby_llm/agents/alert_mailer/alert_notification.html.erb +0 -107
  124. data/app/views/ruby_llm/agents/alert_mailer/alert_notification.text.erb +0 -18
  125. data/app/views/ruby_llm/agents/api_configurations/_api_key_field.html.erb +0 -34
  126. data/app/views/ruby_llm/agents/api_configurations/_form.html.erb +0 -288
  127. data/app/views/ruby_llm/agents/api_configurations/edit.html.erb +0 -95
  128. data/app/views/ruby_llm/agents/api_configurations/edit_tenant.html.erb +0 -97
  129. data/app/views/ruby_llm/agents/api_configurations/show.html.erb +0 -214
  130. data/app/views/ruby_llm/agents/api_configurations/tenant.html.erb +0 -179
  131. data/app/views/ruby_llm/agents/dashboard/_agent_comparison.html.erb +0 -73
  132. data/app/views/ruby_llm/agents/dashboard/_alerts_feed.html.erb +0 -62
  133. data/app/views/ruby_llm/agents/dashboard/_breaker_strip.html.erb +0 -47
  134. data/app/views/ruby_llm/agents/dashboard/_budgets_bar.html.erb +0 -75
  135. data/app/views/ruby_llm/agents/dashboard/_model_comparison.html.erb +0 -56
  136. data/app/views/ruby_llm/agents/dashboard/_model_cost_breakdown.html.erb +0 -115
  137. data/app/views/ruby_llm/agents/dashboard/_now_strip.html.erb +0 -59
  138. data/app/views/ruby_llm/agents/dashboard/_top_errors.html.erb +0 -60
  139. data/app/views/ruby_llm/agents/executions/_workflow_summary.html.erb +0 -86
  140. data/app/views/ruby_llm/agents/executions/dry_run.html.erb +0 -149
  141. data/app/views/ruby_llm/agents/shared/_breadcrumbs.html.erb +0 -48
  142. data/app/views/ruby_llm/agents/shared/_nav_link.html.erb +0 -27
  143. data/app/views/ruby_llm/agents/shared/_stat_card.html.erb +0 -14
  144. data/app/views/ruby_llm/agents/shared/_workflow_type_badge.html.erb +0 -35
  145. data/app/views/ruby_llm/agents/workflows/_empty_state.html.erb +0 -22
  146. data/app/views/ruby_llm/agents/workflows/_step_performance.html.erb +0 -228
  147. data/app/views/ruby_llm/agents/workflows/_structure_dsl.html.erb +0 -539
  148. data/app/views/ruby_llm/agents/workflows/_structure_parallel.html.erb +0 -76
  149. data/app/views/ruby_llm/agents/workflows/_structure_pipeline.html.erb +0 -74
  150. data/app/views/ruby_llm/agents/workflows/_structure_router.html.erb +0 -108
  151. data/app/views/ruby_llm/agents/workflows/_workflow_diagram.html.erb +0 -920
  152. data/app/views/ruby_llm/agents/workflows/index.html.erb +0 -179
  153. data/app/views/ruby_llm/agents/workflows/show.html.erb +0 -467
  154. data/lib/generators/ruby_llm_agents/api_configuration_generator.rb +0 -100
  155. data/lib/generators/ruby_llm_agents/templates/add_workflow_migration.rb.tt +0 -38
  156. data/lib/generators/ruby_llm_agents/templates/application_workflow.rb.tt +0 -48
  157. data/lib/generators/ruby_llm_agents/templates/create_api_configurations_migration.rb.tt +0 -90
  158. data/lib/generators/ruby_llm_agents/templates/skills/WORKFLOWS.md.tt +0 -551
  159. data/lib/ruby_llm/agents/core/base/moderation_dsl.rb +0 -181
  160. data/lib/ruby_llm/agents/core/base/moderation_execution.rb +0 -274
  161. data/lib/ruby_llm/agents/core/resolved_config.rb +0 -348
  162. data/lib/ruby_llm/agents/image/generator/content_policy.rb +0 -95
  163. data/lib/ruby_llm/agents/infrastructure/redactor.rb +0 -130
  164. data/lib/ruby_llm/agents/results/moderation_result.rb +0 -158
  165. data/lib/ruby_llm/agents/text/moderator.rb +0 -237
  166. data/lib/ruby_llm/agents/workflow/approval.rb +0 -205
  167. data/lib/ruby_llm/agents/workflow/approval_store.rb +0 -179
  168. data/lib/ruby_llm/agents/workflow/async.rb +0 -220
  169. data/lib/ruby_llm/agents/workflow/async_executor.rb +0 -156
  170. data/lib/ruby_llm/agents/workflow/dsl/executor.rb +0 -467
  171. data/lib/ruby_llm/agents/workflow/dsl/input_schema.rb +0 -244
  172. data/lib/ruby_llm/agents/workflow/dsl/iteration_executor.rb +0 -289
  173. data/lib/ruby_llm/agents/workflow/dsl/parallel_group.rb +0 -107
  174. data/lib/ruby_llm/agents/workflow/dsl/route_builder.rb +0 -150
  175. data/lib/ruby_llm/agents/workflow/dsl/schedule_helpers.rb +0 -187
  176. data/lib/ruby_llm/agents/workflow/dsl/step_config.rb +0 -352
  177. data/lib/ruby_llm/agents/workflow/dsl/step_executor.rb +0 -415
  178. data/lib/ruby_llm/agents/workflow/dsl/wait_config.rb +0 -257
  179. data/lib/ruby_llm/agents/workflow/dsl/wait_executor.rb +0 -317
  180. data/lib/ruby_llm/agents/workflow/dsl.rb +0 -576
  181. data/lib/ruby_llm/agents/workflow/instrumentation.rb +0 -249
  182. data/lib/ruby_llm/agents/workflow/notifiers/base.rb +0 -117
  183. data/lib/ruby_llm/agents/workflow/notifiers/email.rb +0 -117
  184. data/lib/ruby_llm/agents/workflow/notifiers/slack.rb +0 -180
  185. data/lib/ruby_llm/agents/workflow/notifiers/webhook.rb +0 -121
  186. data/lib/ruby_llm/agents/workflow/notifiers.rb +0 -70
  187. data/lib/ruby_llm/agents/workflow/orchestrator.rb +0 -416
  188. data/lib/ruby_llm/agents/workflow/result.rb +0 -592
  189. data/lib/ruby_llm/agents/workflow/thread_pool.rb +0 -185
  190. data/lib/ruby_llm/agents/workflow/throttle_manager.rb +0 -206
  191. data/lib/ruby_llm/agents/workflow/wait_result.rb +0 -213
@@ -1,235 +1,88 @@
1
- <%# Configuration partial for Base Agent types %>
2
- <div class="bg-white dark:bg-gray-800 rounded-lg shadow p-6 mb-6">
3
- <h3 class="text-lg font-semibold text-gray-900 dark:text-gray-100 mb-4">
4
- Configuration
5
- </h3>
1
+ <%# Configuration partial for Base Agent types - grid layout %>
2
+ <%
3
+ retries_config = config[:retries] || {}
4
+ fallback_models = Array(config[:fallback_models]).compact
5
+ has_retries = (retries_config[:max] || 0) > 0
6
+ has_fallbacks = fallback_models.any?
7
+ has_total_timeout = config[:total_timeout].present?
8
+ has_circuit_breaker = config[:circuit_breaker].present?
9
+ has_any_reliability = has_retries || has_fallbacks || has_total_timeout || has_circuit_breaker
10
+ %>
6
11
 
7
- <!-- Basic Configuration -->
8
- <p class="text-xs text-gray-500 dark:text-gray-400 uppercase tracking-wider mb-3">
9
- Basic
10
- </p>
11
-
12
- <div class="grid grid-cols-2 md:grid-cols-4 gap-4 mb-6">
13
- <div>
14
- <p class="text-sm text-gray-500 dark:text-gray-400">Model</p>
15
- <p class="font-medium text-gray-900 dark:text-gray-100">
16
- <%= config[:model] %>
17
- </p>
18
- </div>
19
-
20
- <div>
21
- <p class="text-sm text-gray-500 dark:text-gray-400">Temperature</p>
22
- <p class="font-medium text-gray-900 dark:text-gray-100">
23
- <%= config[:temperature] %>
24
- </p>
25
- </div>
26
-
27
- <div>
28
- <p class="text-sm text-gray-500 dark:text-gray-400">Timeout</p>
29
- <p class="font-medium text-gray-900 dark:text-gray-100">
30
- <%= config[:timeout] %> seconds
31
- </p>
32
- </div>
33
-
34
- <div>
35
- <p class="text-sm text-gray-500 dark:text-gray-400">Cache</p>
36
- <p class="font-medium text-gray-900 dark:text-gray-100">
12
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-x-8 gap-y-4 font-mono text-xs">
13
+ <!-- Basic -->
14
+ <div>
15
+ <span class="text-[10px] text-gray-400 dark:text-gray-600 uppercase tracking-wider">basic</span>
16
+ <div class="mt-1.5 space-y-0.5">
17
+ <div class="flex items-center gap-3 py-1">
18
+ <span class="w-20 text-gray-400 dark:text-gray-600">model</span>
19
+ <span class="text-gray-900 dark:text-gray-200"><%= config[:model] %></span>
20
+ </div>
21
+ <div class="flex items-center gap-3 py-1">
22
+ <span class="w-20 text-gray-400 dark:text-gray-600">temperature</span>
23
+ <span class="text-gray-900 dark:text-gray-200"><%= config[:temperature] %></span>
24
+ </div>
25
+ <div class="flex items-center gap-3 py-1">
26
+ <span class="w-20 text-gray-400 dark:text-gray-600">timeout</span>
27
+ <span class="text-gray-900 dark:text-gray-200"><%= config[:timeout] %>s</span>
28
+ </div>
29
+ <div class="flex items-center gap-3 py-1">
30
+ <span class="w-20 text-gray-400 dark:text-gray-600">cache</span>
37
31
  <% if config[:cache_enabled] %>
38
- Enabled (<%= config[:cache_ttl].inspect %>)
32
+ <span class="text-green-500">enabled</span>
33
+ <span class="text-gray-400 dark:text-gray-600">(<%= config[:cache_ttl].inspect %>)</span>
39
34
  <% else %>
40
- <span class="text-gray-400 dark:text-gray-500">Disabled</span>
35
+ <span class="text-gray-400 dark:text-gray-600">disabled</span>
41
36
  <% end %>
42
- </p>
37
+ </div>
43
38
  </div>
44
39
  </div>
45
40
 
46
- <!-- Reliability Configuration -->
47
- <% retries_config = config[:retries] || {}
48
- fallback_models = Array(config[:fallback_models]).compact
49
- has_retries = (retries_config[:max] || 0) > 0
50
- has_fallbacks = fallback_models.any?
51
- has_total_timeout = config[:total_timeout].present?
52
- has_circuit_breaker = config[:circuit_breaker].present?
53
- has_any_reliability = has_retries || has_fallbacks || has_total_timeout || has_circuit_breaker %>
54
-
55
- <div class="border-t border-gray-100 dark:border-gray-700 pt-4 mb-6">
56
- <p class="text-xs text-gray-500 dark:text-gray-400 uppercase tracking-wider mb-3">
57
- Reliability
58
- </p>
59
-
41
+ <!-- Reliability -->
42
+ <div>
43
+ <span class="text-[10px] text-gray-400 dark:text-gray-600 uppercase tracking-wider">reliability</span>
60
44
  <% if has_any_reliability %>
61
- <div class="grid grid-cols-1 md:grid-cols-2 gap-4">
62
- <!-- Retries -->
63
- <div class="flex items-start gap-3 p-3 rounded-lg <%= has_retries ? 'bg-green-50 dark:bg-green-900/20' : 'bg-gray-50 dark:bg-gray-700/50' %>">
64
- <div class="flex-shrink-0 mt-0.5">
65
- <% if has_retries %>
66
- <svg class="w-5 h-5 text-green-500" fill="currentColor" viewBox="0 0 20 20">
67
- <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"/>
68
- </svg>
69
- <% else %>
70
- <svg class="w-5 h-5 text-gray-400" fill="currentColor" viewBox="0 0 20 20">
71
- <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z" clip-rule="evenodd"/>
72
- </svg>
73
- <% end %>
74
- </div>
75
- <div>
76
- <p class="text-sm font-medium text-gray-900 dark:text-gray-100">Retries</p>
77
- <% if has_retries %>
78
- <p class="text-xs text-gray-600 dark:text-gray-400 mt-1">
79
- Max: <%= retries_config[:max] %> &middot; Backoff: <%= retries_config[:backoff] %> &middot; Base: <%= retries_config[:base] %>s &middot; Max delay: <%= retries_config[:max_delay] %>s
80
- </p>
81
- <% else %>
82
- <p class="text-xs text-gray-400 dark:text-gray-500 mt-1">Not configured</p>
83
- <% end %>
84
- </div>
45
+ <div class="mt-1.5 space-y-0.5">
46
+ <div class="flex items-center gap-2 py-1">
47
+ <span class="w-1.5 h-1.5 rounded-full flex-shrink-0 <%= has_retries ? 'bg-green-500' : 'bg-gray-400' %>"></span>
48
+ <span class="w-16 text-gray-400 dark:text-gray-600">retries</span>
49
+ <% if has_retries %>
50
+ <span class="text-gray-900 dark:text-gray-200"><%= retries_config[:max] %> max</span>
51
+ <% else %>
52
+ <span class="text-gray-400 dark:text-gray-600">&mdash;</span>
53
+ <% end %>
85
54
  </div>
86
-
87
- <!-- Fallback Models -->
88
- <div class="flex items-start gap-3 p-3 rounded-lg <%= has_fallbacks ? 'bg-green-50 dark:bg-green-900/20' : 'bg-gray-50 dark:bg-gray-700/50' %>">
89
- <div class="flex-shrink-0 mt-0.5">
90
- <% if has_fallbacks %>
91
- <svg class="w-5 h-5 text-green-500" fill="currentColor" viewBox="0 0 20 20">
92
- <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"/>
93
- </svg>
94
- <% else %>
95
- <svg class="w-5 h-5 text-gray-400" fill="currentColor" viewBox="0 0 20 20">
96
- <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z" clip-rule="evenodd"/>
97
- </svg>
98
- <% end %>
99
- </div>
100
- <div>
101
- <p class="text-sm font-medium text-gray-900 dark:text-gray-100">Fallback Models</p>
102
- <% if has_fallbacks %>
103
- <p class="text-xs text-gray-600 dark:text-gray-400 mt-1"><%= fallback_models.join(" → ") %></p>
104
- <% else %>
105
- <p class="text-xs text-gray-400 dark:text-gray-500 mt-1">Not configured</p>
106
- <% end %>
107
- </div>
55
+ <div class="flex items-center gap-2 py-1">
56
+ <span class="w-1.5 h-1.5 rounded-full flex-shrink-0 <%= has_fallbacks ? 'bg-green-500' : 'bg-gray-400' %>"></span>
57
+ <span class="w-16 text-gray-400 dark:text-gray-600">fallbacks</span>
58
+ <% if has_fallbacks %>
59
+ <span class="text-gray-900 dark:text-gray-200 truncate"><%= fallback_models.join(" → ") %></span>
60
+ <% else %>
61
+ <span class="text-gray-400 dark:text-gray-600">&mdash;</span>
62
+ <% end %>
108
63
  </div>
109
-
110
- <!-- Total Timeout -->
111
- <div class="flex items-start gap-3 p-3 rounded-lg <%= has_total_timeout ? 'bg-green-50 dark:bg-green-900/20' : 'bg-gray-50 dark:bg-gray-700/50' %>">
112
- <div class="flex-shrink-0 mt-0.5">
113
- <% if has_total_timeout %>
114
- <svg class="w-5 h-5 text-green-500" fill="currentColor" viewBox="0 0 20 20">
115
- <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"/>
116
- </svg>
117
- <% else %>
118
- <svg class="w-5 h-5 text-gray-400" fill="currentColor" viewBox="0 0 20 20">
119
- <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z" clip-rule="evenodd"/>
120
- </svg>
121
- <% end %>
122
- </div>
123
- <div>
124
- <p class="text-sm font-medium text-gray-900 dark:text-gray-100">Total Timeout</p>
125
- <% if has_total_timeout %>
126
- <p class="text-xs text-gray-600 dark:text-gray-400 mt-1"><%= config[:total_timeout] %> seconds across all attempts</p>
127
- <% else %>
128
- <p class="text-xs text-gray-400 dark:text-gray-500 mt-1">Not configured</p>
129
- <% end %>
130
- </div>
64
+ <div class="flex items-center gap-2 py-1">
65
+ <span class="w-1.5 h-1.5 rounded-full flex-shrink-0 <%= has_total_timeout ? 'bg-green-500' : 'bg-gray-400' %>"></span>
66
+ <span class="w-16 text-gray-400 dark:text-gray-600">timeout</span>
67
+ <% if has_total_timeout %>
68
+ <span class="text-gray-900 dark:text-gray-200"><%= config[:total_timeout] %>s total</span>
69
+ <% else %>
70
+ <span class="text-gray-400 dark:text-gray-600">&mdash;</span>
71
+ <% end %>
131
72
  </div>
132
-
133
- <!-- Circuit Breaker -->
134
- <div class="flex items-start gap-3 p-3 rounded-lg <%= has_circuit_breaker ? 'bg-green-50 dark:bg-green-900/20' : 'bg-gray-50 dark:bg-gray-700/50' %>">
135
- <div class="flex-shrink-0 mt-0.5">
136
- <% if has_circuit_breaker %>
137
- <svg class="w-5 h-5 text-green-500" fill="currentColor" viewBox="0 0 20 20">
138
- <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"/>
139
- </svg>
140
- <% else %>
141
- <svg class="w-5 h-5 text-gray-400" fill="currentColor" viewBox="0 0 20 20">
142
- <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z" clip-rule="evenodd"/>
143
- </svg>
144
- <% end %>
145
- </div>
146
- <div>
147
- <p class="text-sm font-medium text-gray-900 dark:text-gray-100">Circuit Breaker</p>
148
- <% if has_circuit_breaker %>
149
- <% cb = config[:circuit_breaker] %>
150
- <p class="text-xs text-gray-600 dark:text-gray-400 mt-1">
151
- Opens after <%= cb[:errors] %> errors within <%= cb[:within] %>s &middot; Cooldown: <%= cb[:cooldown] %>s
152
- </p>
153
- <% else %>
154
- <p class="text-xs text-gray-400 dark:text-gray-500 mt-1">Not configured</p>
155
- <% end %>
156
- </div>
73
+ <div class="flex items-center gap-2 py-1">
74
+ <span class="w-1.5 h-1.5 rounded-full flex-shrink-0 <%= has_circuit_breaker ? 'bg-green-500' : 'bg-gray-400' %>"></span>
75
+ <span class="w-16 text-gray-400 dark:text-gray-600">breaker</span>
76
+ <% if has_circuit_breaker %>
77
+ <% cb = config[:circuit_breaker] %>
78
+ <span class="text-gray-900 dark:text-gray-200"><%= cb[:errors] %>/<%= cb[:within] %>s</span>
79
+ <% else %>
80
+ <span class="text-gray-400 dark:text-gray-600">&mdash;</span>
81
+ <% end %>
157
82
  </div>
158
83
  </div>
159
84
  <% else %>
160
- <p class="text-sm text-gray-400 dark:text-gray-500">No reliability features configured</p>
161
- <% end %>
162
- </div>
163
-
164
- <!-- Parameters -->
165
- <% if config[:params].present? && config[:params].any? %>
166
- <div class="border-t border-gray-100 dark:border-gray-700 pt-4">
167
- <p class="text-xs text-gray-500 dark:text-gray-400 uppercase tracking-wider mb-3">
168
- Parameters
169
- </p>
170
- <div class="space-y-2">
171
- <% config[:params].each do |name, opts| %>
172
- <div class="flex items-center text-sm">
173
- <code class="bg-gray-100 dark:bg-gray-700 dark:text-gray-200 px-2 py-0.5 rounded font-mono">
174
- <%= name %>
175
- </code>
176
- <% if opts[:required] %>
177
- <span class="ml-2 text-xs text-red-500 dark:text-red-400 font-medium">required</span>
178
- <% elsif opts[:default].present? %>
179
- <span class="ml-2 text-xs text-gray-400 dark:text-gray-500">default: <%= opts[:default].inspect %></span>
180
- <% else %>
181
- <span class="ml-2 text-xs text-gray-400 dark:text-gray-500">optional</span>
182
- <% end %>
183
- </div>
184
- <% end %>
185
- </div>
186
- </div>
187
- <% end %>
188
-
189
- <!-- Available Tools -->
190
- <%
191
- class_tools = @agent_class.respond_to?(:tools) ? (@agent_class.tools || []) : []
192
- has_dynamic_tools = @agent_class.instance_methods(false).include?(:tools)
193
- %>
194
- <div class="border-t border-gray-100 dark:border-gray-700 pt-4">
195
- <p class="text-xs text-gray-500 dark:text-gray-400 uppercase tracking-wider mb-3">
196
- Available Tools
197
- <% if class_tools.any? %>
198
- <span class="inline-flex items-center ml-2 px-1.5 py-0.5 rounded-full text-xs font-medium bg-blue-100 dark:bg-blue-900/50 text-blue-800 dark:text-blue-300">
199
- <%= class_tools.size %>
200
- </span>
201
- <% elsif has_dynamic_tools %>
202
- <span class="inline-flex items-center ml-2 px-1.5 py-0.5 rounded-full text-xs font-medium bg-purple-100 dark:bg-purple-900/50 text-purple-800 dark:text-purple-300">
203
- Dynamic
204
- </span>
205
- <% else %>
206
- <span class="inline-flex items-center ml-2 px-1.5 py-0.5 rounded-full text-xs font-medium bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-400">
207
- 0
208
- </span>
209
- <% end %>
210
- </p>
211
-
212
- <% if class_tools.any? %>
213
- <div class="space-y-2">
214
- <% class_tools.each do |tool_class| %>
215
- <div class="flex items-center text-sm">
216
- <code class="bg-gray-100 dark:bg-gray-700 dark:text-gray-200 px-2 py-0.5 rounded font-mono">
217
- <%= tool_class.respond_to?(:tool_name) ? tool_class.tool_name : tool_class.name.demodulize %>
218
- </code>
219
- </div>
220
- <% end %>
221
- </div>
222
- <% elsif has_dynamic_tools %>
223
- <p class="text-sm text-purple-600 dark:text-purple-400">
224
- This agent configures tools dynamically at runtime based on context.
225
- </p>
226
- <p class="text-xs text-gray-400 dark:text-gray-500 mt-1">
227
- Tools vary per execution based on feature flags and configuration.
228
- </p>
229
- <% else %>
230
- <p class="text-sm text-gray-400 dark:text-gray-500 italic">
231
- No tools configured for this agent.
232
- </p>
85
+ <div class="mt-1 py-1 text-gray-400 dark:text-gray-600">none configured</div>
233
86
  <% end %>
234
87
  </div>
235
88
  </div>
@@ -1,70 +1,27 @@
1
1
  <%# Configuration partial for Embedder types %>
2
- <div class="bg-white dark:bg-gray-800 rounded-lg shadow p-6 mb-6">
3
- <h3 class="text-lg font-semibold text-gray-900 dark:text-gray-100 mb-4">
4
- Configuration
5
- </h3>
6
-
7
- <!-- Embedding Configuration -->
8
- <p class="text-xs text-gray-500 dark:text-gray-400 uppercase tracking-wider mb-3">
9
- Embedding Settings
10
- </p>
11
-
12
- <div class="grid grid-cols-2 md:grid-cols-4 gap-4 mb-6">
13
- <div>
14
- <p class="text-sm text-gray-500 dark:text-gray-400">Model</p>
15
- <p class="font-medium text-gray-900 dark:text-gray-100">
16
- <%= config[:model] %>
17
- </p>
2
+ <div class="font-mono text-xs">
3
+ <span class="text-[10px] text-gray-400 dark:text-gray-600 uppercase tracking-wider">embedding settings</span>
4
+ <div class="mt-1 space-y-px">
5
+ <div class="flex items-center gap-3 py-1 px-2 -mx-2">
6
+ <span class="w-24 text-gray-400 dark:text-gray-600">model</span>
7
+ <span class="text-gray-900 dark:text-gray-200"><%= config[:model] %></span>
18
8
  </div>
19
-
20
- <div>
21
- <p class="text-sm text-gray-500 dark:text-gray-400">Dimensions</p>
22
- <p class="font-medium text-gray-900 dark:text-gray-100">
23
- <% if config[:dimensions] %>
24
- <%= config[:dimensions] %>
25
- <% else %>
26
- <span class="text-gray-400 dark:text-gray-500">Default</span>
27
- <% end %>
28
- </p>
9
+ <div class="flex items-center gap-3 py-1 px-2 -mx-2">
10
+ <span class="w-24 text-gray-400 dark:text-gray-600">dimensions</span>
11
+ <span class="text-gray-900 dark:text-gray-200"><%= config[:dimensions] || 'default' %></span>
29
12
  </div>
30
-
31
- <div>
32
- <p class="text-sm text-gray-500 dark:text-gray-400">Batch Size</p>
33
- <p class="font-medium text-gray-900 dark:text-gray-100">
34
- <% if config[:batch_size] %>
35
- <%= config[:batch_size] %> texts
36
- <% else %>
37
- <span class="text-gray-400 dark:text-gray-500">Default</span>
38
- <% end %>
39
- </p>
13
+ <div class="flex items-center gap-3 py-1 px-2 -mx-2">
14
+ <span class="w-24 text-gray-400 dark:text-gray-600">batch size</span>
15
+ <span class="text-gray-900 dark:text-gray-200"><%= config[:batch_size] ? "#{config[:batch_size]} texts" : 'default' %></span>
40
16
  </div>
41
-
42
- <div>
43
- <p class="text-sm text-gray-500 dark:text-gray-400">Cache</p>
44
- <p class="font-medium text-gray-900 dark:text-gray-100">
45
- <% if config[:cache_enabled] %>
46
- Enabled (<%= config[:cache_ttl].inspect %>)
47
- <% else %>
48
- <span class="text-gray-400 dark:text-gray-500">Disabled</span>
49
- <% end %>
50
- </p>
51
- </div>
52
- </div>
53
-
54
- <!-- Info Section -->
55
- <div class="border-t border-gray-100 dark:border-gray-700 pt-4">
56
- <div class="flex items-start gap-3 p-3 rounded-lg bg-blue-50 dark:bg-blue-900/20">
57
- <div class="flex-shrink-0 mt-0.5">
58
- <svg class="w-5 h-5 text-blue-500" fill="currentColor" viewBox="0 0 20 20">
59
- <path fill-rule="evenodd" d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z" clip-rule="evenodd"/>
60
- </svg>
61
- </div>
62
- <div>
63
- <p class="text-sm font-medium text-gray-900 dark:text-gray-100">Embedder</p>
64
- <p class="text-xs text-gray-600 dark:text-gray-400 mt-1">
65
- Generates vector embeddings for text content. Use for semantic search, similarity matching, and RAG applications.
66
- </p>
67
- </div>
17
+ <div class="flex items-center gap-3 py-1 px-2 -mx-2">
18
+ <span class="w-24 text-gray-400 dark:text-gray-600">cache</span>
19
+ <% if config[:cache_enabled] %>
20
+ <span class="text-green-500">enabled</span>
21
+ <span class="text-gray-400 dark:text-gray-600">(<%= config[:cache_ttl].inspect %>)</span>
22
+ <% else %>
23
+ <span class="text-gray-400 dark:text-gray-600">disabled</span>
24
+ <% end %>
68
25
  </div>
69
26
  </div>
70
27
  </div>
@@ -1,152 +1,65 @@
1
1
  <%# Configuration partial for ImageGenerator types %>
2
- <div class="bg-white dark:bg-gray-800 rounded-lg shadow p-6 mb-6">
3
- <h3 class="text-lg font-semibold text-gray-900 dark:text-gray-100 mb-4">
4
- Configuration
5
- </h3>
6
-
7
- <!-- Image Generation Configuration -->
8
- <p class="text-xs text-gray-500 dark:text-gray-400 uppercase tracking-wider mb-3">
9
- Image Generation Settings
10
- </p>
11
-
12
- <div class="grid grid-cols-2 md:grid-cols-4 gap-4 mb-6">
13
- <div>
14
- <p class="text-sm text-gray-500 dark:text-gray-400">Model</p>
15
- <p class="font-medium text-gray-900 dark:text-gray-100">
16
- <%= config[:model] %>
17
- </p>
2
+ <div class="font-mono text-xs">
3
+ <span class="text-[10px] text-gray-400 dark:text-gray-600 uppercase tracking-wider">image generation settings</span>
4
+ <div class="mt-1 space-y-px">
5
+ <div class="flex items-center gap-3 py-1 px-2 -mx-2">
6
+ <span class="w-28 text-gray-400 dark:text-gray-600">model</span>
7
+ <span class="text-gray-900 dark:text-gray-200"><%= config[:model] %></span>
18
8
  </div>
19
-
20
- <div>
21
- <p class="text-sm text-gray-500 dark:text-gray-400">Size</p>
22
- <p class="font-medium text-gray-900 dark:text-gray-100">
23
- <% if config[:size] %>
24
- <%= config[:size] %>
25
- <% else %>
26
- <span class="text-gray-400 dark:text-gray-500">Default</span>
27
- <% end %>
28
- </p>
9
+ <div class="flex items-center gap-3 py-1 px-2 -mx-2">
10
+ <span class="w-28 text-gray-400 dark:text-gray-600">size</span>
11
+ <span class="text-gray-900 dark:text-gray-200"><%= config[:size] || 'default' %></span>
29
12
  </div>
30
-
31
- <div>
32
- <p class="text-sm text-gray-500 dark:text-gray-400">Quality</p>
33
- <p class="font-medium text-gray-900 dark:text-gray-100">
34
- <% if config[:quality] %>
35
- <span class="<%= config[:quality] == 'hd' ? 'text-green-600 dark:text-green-400' : '' %>">
36
- <%= config[:quality].to_s.upcase %>
37
- </span>
38
- <% else %>
39
- <span class="text-gray-400 dark:text-gray-500">Standard</span>
40
- <% end %>
41
- </p>
13
+ <div class="flex items-center gap-3 py-1 px-2 -mx-2">
14
+ <span class="w-28 text-gray-400 dark:text-gray-600">quality</span>
15
+ <span class="text-gray-900 dark:text-gray-200"><%= config[:quality] ? config[:quality].to_s.upcase : 'standard' %></span>
42
16
  </div>
43
-
44
- <div>
45
- <p class="text-sm text-gray-500 dark:text-gray-400">Style</p>
46
- <p class="font-medium text-gray-900 dark:text-gray-100">
47
- <% if config[:style] %>
48
- <%= config[:style].to_s.titleize %>
49
- <% else %>
50
- <span class="text-gray-400 dark:text-gray-500">Default</span>
51
- <% end %>
52
- </p>
17
+ <div class="flex items-center gap-3 py-1 px-2 -mx-2">
18
+ <span class="w-28 text-gray-400 dark:text-gray-600">style</span>
19
+ <span class="text-gray-900 dark:text-gray-200"><%= config[:style] ? config[:style].to_s.titleize : 'default' %></span>
53
20
  </div>
54
- </div>
55
-
56
- <div class="grid grid-cols-2 md:grid-cols-4 gap-4 mb-6">
57
- <div>
58
- <p class="text-sm text-gray-500 dark:text-gray-400">Content Policy</p>
59
- <p class="font-medium text-gray-900 dark:text-gray-100">
60
- <% policy = config[:content_policy] || :standard %>
61
- <% policy_colors = {
62
- none: 'text-gray-400 dark:text-gray-500',
63
- standard: 'text-blue-600 dark:text-blue-400',
64
- moderate: 'text-yellow-600 dark:text-yellow-400',
65
- strict: 'text-green-600 dark:text-green-400'
66
- } %>
67
- <span class="<%= policy_colors[policy.to_sym] || 'text-gray-600' %>">
68
- <%= policy.to_s.titleize %>
69
- </span>
70
- </p>
21
+ <div class="flex items-center gap-3 py-1 px-2 -mx-2">
22
+ <span class="w-28 text-gray-400 dark:text-gray-600">content policy</span>
23
+ <span class="text-gray-900 dark:text-gray-200"><%= (config[:content_policy] || :standard).to_s %></span>
71
24
  </div>
72
-
73
- <div>
74
- <p class="text-sm text-gray-500 dark:text-gray-400">Cache</p>
75
- <p class="font-medium text-gray-900 dark:text-gray-100">
76
- <% if config[:cache_enabled] %>
77
- Enabled (<%= config[:cache_ttl].inspect %>)
78
- <% else %>
79
- <span class="text-gray-400 dark:text-gray-500">Disabled</span>
80
- <% end %>
81
- </p>
25
+ <div class="flex items-center gap-3 py-1 px-2 -mx-2">
26
+ <span class="w-28 text-gray-400 dark:text-gray-600">cache</span>
27
+ <% if config[:cache_enabled] %>
28
+ <span class="text-green-500">enabled</span>
29
+ <span class="text-gray-400 dark:text-gray-600">(<%= config[:cache_ttl].inspect %>)</span>
30
+ <% else %>
31
+ <span class="text-gray-400 dark:text-gray-600">disabled</span>
32
+ <% end %>
82
33
  </div>
83
-
84
34
  <% if config[:seed] %>
85
- <div>
86
- <p class="text-sm text-gray-500 dark:text-gray-400">Seed</p>
87
- <p class="font-medium text-gray-900 dark:text-gray-100">
88
- <%= config[:seed] %>
89
- </p>
35
+ <div class="flex items-center gap-3 py-1 px-2 -mx-2">
36
+ <span class="w-28 text-gray-400 dark:text-gray-600">seed</span>
37
+ <span class="text-gray-900 dark:text-gray-200"><%= config[:seed] %></span>
90
38
  </div>
91
39
  <% end %>
92
-
93
40
  <% if config[:guidance_scale] %>
94
- <div>
95
- <p class="text-sm text-gray-500 dark:text-gray-400">Guidance Scale</p>
96
- <p class="font-medium text-gray-900 dark:text-gray-100">
97
- <%= config[:guidance_scale] %>
98
- </p>
41
+ <div class="flex items-center gap-3 py-1 px-2 -mx-2">
42
+ <span class="w-28 text-gray-400 dark:text-gray-600">guidance scale</span>
43
+ <span class="text-gray-900 dark:text-gray-200"><%= config[:guidance_scale] %></span>
99
44
  </div>
100
45
  <% end %>
101
- </div>
102
-
103
- <% if config[:steps] %>
104
- <div class="grid grid-cols-2 md:grid-cols-4 gap-4 mb-6">
105
- <div>
106
- <p class="text-sm text-gray-500 dark:text-gray-400">Inference Steps</p>
107
- <p class="font-medium text-gray-900 dark:text-gray-100">
108
- <%= config[:steps] %>
109
- </p>
46
+ <% if config[:steps] %>
47
+ <div class="flex items-center gap-3 py-1 px-2 -mx-2">
48
+ <span class="w-28 text-gray-400 dark:text-gray-600">inference steps</span>
49
+ <span class="text-gray-900 dark:text-gray-200"><%= config[:steps] %></span>
110
50
  </div>
111
- </div>
112
- <% end %>
113
-
51
+ <% end %>
52
+ </div>
114
53
  <% if config[:template].present? %>
115
- <div class="mb-6">
116
- <p class="text-sm text-gray-500 dark:text-gray-400 mb-2">Prompt Template</p>
117
- <div class="bg-gray-50 dark:bg-gray-700 rounded-lg p-3">
118
- <code class="text-sm text-gray-700 dark:text-gray-300">
119
- <%= config[:template] %>
120
- </code>
121
- </div>
54
+ <div class="mt-3">
55
+ <span class="text-[10px] text-gray-400 dark:text-gray-600 uppercase tracking-wider">prompt template</span>
56
+ <div class="mt-1 py-1.5 px-2 -mx-2 text-gray-900 dark:text-gray-200"><%= config[:template] %></div>
122
57
  </div>
123
58
  <% end %>
124
-
125
59
  <% if config[:negative_prompt].present? %>
126
- <div class="mb-6">
127
- <p class="text-sm text-gray-500 dark:text-gray-400 mb-2">Negative Prompt</p>
128
- <div class="bg-gray-50 dark:bg-gray-700 rounded-lg p-3">
129
- <code class="text-sm text-gray-700 dark:text-gray-300">
130
- <%= config[:negative_prompt] %>
131
- </code>
132
- </div>
60
+ <div class="mt-3">
61
+ <span class="text-[10px] text-gray-400 dark:text-gray-600 uppercase tracking-wider">negative prompt</span>
62
+ <div class="mt-1 py-1.5 px-2 -mx-2 text-gray-900 dark:text-gray-200"><%= config[:negative_prompt] %></div>
133
63
  </div>
134
64
  <% end %>
135
-
136
- <!-- Info Section -->
137
- <div class="border-t border-gray-100 dark:border-gray-700 pt-4">
138
- <div class="flex items-start gap-3 p-3 rounded-lg bg-teal-50 dark:bg-teal-900/20">
139
- <div class="flex-shrink-0 mt-0.5">
140
- <svg class="w-5 h-5 text-teal-500" fill="currentColor" viewBox="0 0 20 20">
141
- <path fill-rule="evenodd" d="M4 3a2 2 0 00-2 2v10a2 2 0 002 2h12a2 2 0 002-2V5a2 2 0 00-2-2H4zm12 12H4l4-8 3 6 2-4 3 6z" clip-rule="evenodd"/>
142
- </svg>
143
- </div>
144
- <div>
145
- <p class="text-sm font-medium text-gray-900 dark:text-gray-100">Image Generator</p>
146
- <p class="text-xs text-gray-600 dark:text-gray-400 mt-1">
147
- Generates images from text prompts using AI models. Supports various sizes, quality levels, and style presets.
148
- </p>
149
- </div>
150
- </div>
151
- </div>
152
65
  </div>