ruby_llm-agents 0.5.0 → 1.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.
- checksums.yaml +4 -4
- data/README.md +189 -31
- data/app/controllers/ruby_llm/agents/agents_controller.rb +136 -16
- data/app/controllers/ruby_llm/agents/dashboard_controller.rb +29 -9
- data/app/controllers/ruby_llm/agents/workflows_controller.rb +355 -0
- data/app/helpers/ruby_llm/agents/application_helper.rb +25 -0
- data/app/models/ruby_llm/agents/execution.rb +3 -0
- data/app/models/ruby_llm/agents/tenant_budget.rb +58 -15
- data/app/services/ruby_llm/agents/agent_registry.rb +51 -12
- data/app/views/layouts/ruby_llm/agents/application.html.erb +2 -29
- data/app/views/ruby_llm/agents/agents/_agent.html.erb +13 -1
- data/app/views/ruby_llm/agents/agents/_config_agent.html.erb +235 -0
- data/app/views/ruby_llm/agents/agents/_config_embedder.html.erb +70 -0
- data/app/views/ruby_llm/agents/agents/_config_image_generator.html.erb +152 -0
- data/app/views/ruby_llm/agents/agents/_config_moderator.html.erb +63 -0
- data/app/views/ruby_llm/agents/agents/_config_speaker.html.erb +108 -0
- data/app/views/ruby_llm/agents/agents/_config_transcriber.html.erb +91 -0
- data/app/views/ruby_llm/agents/agents/_workflow.html.erb +1 -1
- data/app/views/ruby_llm/agents/agents/index.html.erb +74 -9
- data/app/views/ruby_llm/agents/agents/show.html.erb +18 -378
- data/app/views/ruby_llm/agents/dashboard/_agent_comparison.html.erb +269 -15
- data/app/views/ruby_llm/agents/executions/show.html.erb +16 -0
- data/app/views/ruby_llm/agents/shared/_agent_type_badge.html.erb +93 -0
- data/app/views/ruby_llm/agents/workflows/_step_performance.html.erb +236 -0
- data/app/views/ruby_llm/agents/workflows/_structure_parallel.html.erb +76 -0
- data/app/views/ruby_llm/agents/workflows/_structure_pipeline.html.erb +74 -0
- data/app/views/ruby_llm/agents/workflows/_structure_router.html.erb +108 -0
- data/app/views/ruby_llm/agents/workflows/show.html.erb +442 -0
- data/config/routes.rb +1 -0
- data/lib/generators/ruby_llm_agents/agent_generator.rb +56 -7
- data/lib/generators/ruby_llm_agents/background_remover_generator.rb +110 -0
- data/lib/generators/ruby_llm_agents/embedder_generator.rb +107 -0
- data/lib/generators/ruby_llm_agents/image_analyzer_generator.rb +115 -0
- data/lib/generators/ruby_llm_agents/image_editor_generator.rb +108 -0
- data/lib/generators/ruby_llm_agents/image_generator_generator.rb +116 -0
- data/lib/generators/ruby_llm_agents/image_pipeline_generator.rb +178 -0
- data/lib/generators/ruby_llm_agents/image_transformer_generator.rb +109 -0
- data/lib/generators/ruby_llm_agents/image_upscaler_generator.rb +103 -0
- data/lib/generators/ruby_llm_agents/image_variator_generator.rb +102 -0
- data/lib/generators/ruby_llm_agents/install_generator.rb +76 -4
- data/lib/generators/ruby_llm_agents/restructure_generator.rb +292 -0
- data/lib/generators/ruby_llm_agents/speaker_generator.rb +121 -0
- data/lib/generators/ruby_llm_agents/templates/add_execution_type_migration.rb.tt +8 -0
- data/lib/generators/ruby_llm_agents/templates/agent.rb.tt +99 -84
- data/lib/generators/ruby_llm_agents/templates/application_agent.rb.tt +42 -40
- data/lib/generators/ruby_llm_agents/templates/application_background_remover.rb.tt +26 -0
- data/lib/generators/ruby_llm_agents/templates/application_embedder.rb.tt +50 -0
- data/lib/generators/ruby_llm_agents/templates/application_image_analyzer.rb.tt +26 -0
- data/lib/generators/ruby_llm_agents/templates/application_image_editor.rb.tt +20 -0
- data/lib/generators/ruby_llm_agents/templates/application_image_generator.rb.tt +38 -0
- data/lib/generators/ruby_llm_agents/templates/application_image_pipeline.rb.tt +139 -0
- data/lib/generators/ruby_llm_agents/templates/application_image_transformer.rb.tt +21 -0
- data/lib/generators/ruby_llm_agents/templates/application_image_upscaler.rb.tt +20 -0
- data/lib/generators/ruby_llm_agents/templates/application_image_variator.rb.tt +20 -0
- data/lib/generators/ruby_llm_agents/templates/application_speaker.rb.tt +49 -0
- data/lib/generators/ruby_llm_agents/templates/application_transcriber.rb.tt +53 -0
- data/lib/generators/ruby_llm_agents/templates/background_remover.rb.tt +44 -0
- data/lib/generators/ruby_llm_agents/templates/embedder.rb.tt +41 -0
- data/lib/generators/ruby_llm_agents/templates/image_analyzer.rb.tt +45 -0
- data/lib/generators/ruby_llm_agents/templates/image_editor.rb.tt +35 -0
- data/lib/generators/ruby_llm_agents/templates/image_generator.rb.tt +47 -0
- data/lib/generators/ruby_llm_agents/templates/image_pipeline.rb.tt +50 -0
- data/lib/generators/ruby_llm_agents/templates/image_transformer.rb.tt +44 -0
- data/lib/generators/ruby_llm_agents/templates/image_upscaler.rb.tt +38 -0
- data/lib/generators/ruby_llm_agents/templates/image_variator.rb.tt +33 -0
- data/lib/generators/ruby_llm_agents/templates/skills/AGENTS.md.tt +228 -0
- data/lib/generators/ruby_llm_agents/templates/skills/BACKGROUND_REMOVERS.md.tt +131 -0
- data/lib/generators/ruby_llm_agents/templates/skills/EMBEDDERS.md.tt +255 -0
- data/lib/generators/ruby_llm_agents/templates/skills/IMAGE_ANALYZERS.md.tt +120 -0
- data/lib/generators/ruby_llm_agents/templates/skills/IMAGE_EDITORS.md.tt +102 -0
- data/lib/generators/ruby_llm_agents/templates/skills/IMAGE_GENERATORS.md.tt +282 -0
- data/lib/generators/ruby_llm_agents/templates/skills/IMAGE_PIPELINES.md.tt +228 -0
- data/lib/generators/ruby_llm_agents/templates/skills/IMAGE_TRANSFORMERS.md.tt +120 -0
- data/lib/generators/ruby_llm_agents/templates/skills/IMAGE_UPSCALERS.md.tt +110 -0
- data/lib/generators/ruby_llm_agents/templates/skills/IMAGE_VARIATORS.md.tt +120 -0
- data/lib/generators/ruby_llm_agents/templates/skills/SPEAKERS.md.tt +212 -0
- data/lib/generators/ruby_llm_agents/templates/skills/TOOLS.md.tt +227 -0
- data/lib/generators/ruby_llm_agents/templates/skills/TRANSCRIBERS.md.tt +251 -0
- data/lib/generators/ruby_llm_agents/templates/skills/WORKFLOWS.md.tt +300 -0
- data/lib/generators/ruby_llm_agents/templates/speaker.rb.tt +56 -0
- data/lib/generators/ruby_llm_agents/templates/transcriber.rb.tt +51 -0
- data/lib/generators/ruby_llm_agents/transcriber_generator.rb +107 -0
- data/lib/generators/ruby_llm_agents/upgrade_generator.rb +152 -1
- data/lib/ruby_llm/agents/audio/speaker.rb +553 -0
- data/lib/ruby_llm/agents/audio/transcriber.rb +669 -0
- data/lib/ruby_llm/agents/base_agent.rb +675 -0
- data/lib/ruby_llm/agents/core/base/moderation_dsl.rb +181 -0
- data/lib/ruby_llm/agents/core/base/moderation_execution.rb +274 -0
- data/lib/ruby_llm/agents/core/base.rb +135 -0
- data/lib/ruby_llm/agents/core/configuration.rb +981 -0
- data/lib/ruby_llm/agents/core/errors.rb +150 -0
- data/lib/ruby_llm/agents/{instrumentation.rb → core/instrumentation.rb} +22 -1
- data/lib/ruby_llm/agents/core/llm_tenant.rb +358 -0
- data/lib/ruby_llm/agents/{version.rb → core/version.rb} +1 -1
- data/lib/ruby_llm/agents/dsl/base.rb +110 -0
- data/lib/ruby_llm/agents/dsl/caching.rb +142 -0
- data/lib/ruby_llm/agents/dsl/reliability.rb +307 -0
- data/lib/ruby_llm/agents/dsl.rb +41 -0
- data/lib/ruby_llm/agents/image/analyzer/dsl.rb +130 -0
- data/lib/ruby_llm/agents/image/analyzer/execution.rb +402 -0
- data/lib/ruby_llm/agents/image/analyzer.rb +90 -0
- data/lib/ruby_llm/agents/image/background_remover/dsl.rb +154 -0
- data/lib/ruby_llm/agents/image/background_remover/execution.rb +240 -0
- data/lib/ruby_llm/agents/image/background_remover.rb +89 -0
- data/lib/ruby_llm/agents/image/concerns/image_operation_dsl.rb +91 -0
- data/lib/ruby_llm/agents/image/concerns/image_operation_execution.rb +165 -0
- data/lib/ruby_llm/agents/image/editor/dsl.rb +56 -0
- data/lib/ruby_llm/agents/image/editor/execution.rb +207 -0
- data/lib/ruby_llm/agents/image/editor.rb +92 -0
- data/lib/ruby_llm/agents/image/generator/active_storage_support.rb +127 -0
- data/lib/ruby_llm/agents/image/generator/content_policy.rb +95 -0
- data/lib/ruby_llm/agents/image/generator/pricing.rb +353 -0
- data/lib/ruby_llm/agents/image/generator/templates.rb +124 -0
- data/lib/ruby_llm/agents/image/generator.rb +455 -0
- data/lib/ruby_llm/agents/image/pipeline/dsl.rb +213 -0
- data/lib/ruby_llm/agents/image/pipeline/execution.rb +382 -0
- data/lib/ruby_llm/agents/image/pipeline.rb +97 -0
- data/lib/ruby_llm/agents/image/transformer/dsl.rb +148 -0
- data/lib/ruby_llm/agents/image/transformer/execution.rb +223 -0
- data/lib/ruby_llm/agents/image/transformer.rb +95 -0
- data/lib/ruby_llm/agents/image/upscaler/dsl.rb +83 -0
- data/lib/ruby_llm/agents/image/upscaler/execution.rb +219 -0
- data/lib/ruby_llm/agents/image/upscaler.rb +81 -0
- data/lib/ruby_llm/agents/image/variator/dsl.rb +62 -0
- data/lib/ruby_llm/agents/image/variator/execution.rb +189 -0
- data/lib/ruby_llm/agents/image/variator.rb +80 -0
- data/lib/ruby_llm/agents/{alert_manager.rb → infrastructure/alert_manager.rb} +17 -22
- data/lib/ruby_llm/agents/infrastructure/budget/budget_query.rb +145 -0
- data/lib/ruby_llm/agents/infrastructure/budget/config_resolver.rb +149 -0
- data/lib/ruby_llm/agents/infrastructure/budget/forecaster.rb +68 -0
- data/lib/ruby_llm/agents/infrastructure/budget/spend_recorder.rb +279 -0
- data/lib/ruby_llm/agents/infrastructure/budget_tracker.rb +275 -0
- data/lib/ruby_llm/agents/{execution_logger_job.rb → infrastructure/execution_logger_job.rb} +17 -1
- data/lib/ruby_llm/agents/{reliability → infrastructure/reliability}/executor.rb +2 -1
- data/lib/ruby_llm/agents/{reliability → infrastructure/reliability}/retry_strategy.rb +9 -3
- data/lib/ruby_llm/agents/{reliability.rb → infrastructure/reliability.rb} +11 -21
- data/lib/ruby_llm/agents/pipeline/builder.rb +215 -0
- data/lib/ruby_llm/agents/pipeline/context.rb +255 -0
- data/lib/ruby_llm/agents/pipeline/executor.rb +86 -0
- data/lib/ruby_llm/agents/pipeline/middleware/base.rb +124 -0
- data/lib/ruby_llm/agents/pipeline/middleware/budget.rb +95 -0
- data/lib/ruby_llm/agents/pipeline/middleware/cache.rb +171 -0
- data/lib/ruby_llm/agents/pipeline/middleware/instrumentation.rb +415 -0
- data/lib/ruby_llm/agents/pipeline/middleware/reliability.rb +276 -0
- data/lib/ruby_llm/agents/pipeline/middleware/tenant.rb +196 -0
- data/lib/ruby_llm/agents/pipeline.rb +68 -0
- data/lib/ruby_llm/agents/{engine.rb → rails/engine.rb} +79 -11
- data/lib/ruby_llm/agents/results/background_removal_result.rb +286 -0
- data/lib/ruby_llm/agents/{result.rb → results/base.rb} +73 -1
- data/lib/ruby_llm/agents/results/embedding_result.rb +243 -0
- data/lib/ruby_llm/agents/results/image_analysis_result.rb +314 -0
- data/lib/ruby_llm/agents/results/image_edit_result.rb +250 -0
- data/lib/ruby_llm/agents/results/image_generation_result.rb +346 -0
- data/lib/ruby_llm/agents/results/image_pipeline_result.rb +399 -0
- data/lib/ruby_llm/agents/results/image_transform_result.rb +251 -0
- data/lib/ruby_llm/agents/results/image_upscale_result.rb +255 -0
- data/lib/ruby_llm/agents/results/image_variation_result.rb +237 -0
- data/lib/ruby_llm/agents/results/moderation_result.rb +158 -0
- data/lib/ruby_llm/agents/results/speech_result.rb +338 -0
- data/lib/ruby_llm/agents/results/transcription_result.rb +408 -0
- data/lib/ruby_llm/agents/text/embedder.rb +444 -0
- data/lib/ruby_llm/agents/text/moderator.rb +237 -0
- data/lib/ruby_llm/agents/workflow/async.rb +220 -0
- data/lib/ruby_llm/agents/workflow/async_executor.rb +156 -0
- data/lib/ruby_llm/agents/{workflow.rb → workflow/orchestrator.rb} +6 -5
- data/lib/ruby_llm/agents/workflow/parallel.rb +34 -17
- data/lib/ruby_llm/agents/workflow/thread_pool.rb +185 -0
- data/lib/ruby_llm/agents.rb +86 -20
- metadata +172 -34
- data/lib/ruby_llm/agents/base/caching.rb +0 -40
- data/lib/ruby_llm/agents/base/cost_calculation.rb +0 -105
- data/lib/ruby_llm/agents/base/dsl.rb +0 -324
- data/lib/ruby_llm/agents/base/execution.rb +0 -366
- data/lib/ruby_llm/agents/base/reliability_dsl.rb +0 -82
- data/lib/ruby_llm/agents/base/reliability_execution.rb +0 -136
- data/lib/ruby_llm/agents/base/response_building.rb +0 -86
- data/lib/ruby_llm/agents/base/tool_tracking.rb +0 -57
- data/lib/ruby_llm/agents/base.rb +0 -210
- data/lib/ruby_llm/agents/budget_tracker.rb +0 -733
- data/lib/ruby_llm/agents/configuration.rb +0 -394
- /data/lib/ruby_llm/agents/{deprecations.rb → core/deprecations.rb} +0 -0
- /data/lib/ruby_llm/agents/{inflections.rb → core/inflections.rb} +0 -0
- /data/lib/ruby_llm/agents/{resolved_config.rb → core/resolved_config.rb} +0 -0
- /data/lib/ruby_llm/agents/{attempt_tracker.rb → infrastructure/attempt_tracker.rb} +0 -0
- /data/lib/ruby_llm/agents/{cache_helper.rb → infrastructure/cache_helper.rb} +0 -0
- /data/lib/ruby_llm/agents/{circuit_breaker.rb → infrastructure/circuit_breaker.rb} +0 -0
- /data/lib/ruby_llm/agents/{redactor.rb → infrastructure/redactor.rb} +0 -0
- /data/lib/ruby_llm/agents/{reliability → infrastructure/reliability}/breaker_manager.rb +0 -0
- /data/lib/ruby_llm/agents/{reliability → infrastructure/reliability}/execution_constraints.rb +0 -0
- /data/lib/ruby_llm/agents/{reliability → infrastructure/reliability}/fallback_routing.rb +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<%= render "ruby_llm/agents/shared/breadcrumbs", items: [
|
|
2
2
|
{ label: "Dashboard", path: ruby_llm_agents.root_path },
|
|
3
|
-
{ label: "Agents", path: ruby_llm_agents.agents_path },
|
|
3
|
+
{ label: "Agents", path: ruby_llm_agents.agents_path(tab: params[:tab], subtab: params[:subtab]) },
|
|
4
4
|
{ label: @agent_type.gsub(/Agent$/, '') }
|
|
5
5
|
] %>
|
|
6
6
|
|
|
@@ -42,8 +42,19 @@
|
|
|
42
42
|
|
|
43
43
|
<% if @config %>
|
|
44
44
|
<p class="text-gray-500 dark:text-gray-400 mt-1">
|
|
45
|
-
<%= @config[:model] %>
|
|
46
|
-
|
|
45
|
+
<%= @config[:model] %>
|
|
46
|
+
<% if @config[:temperature] %>
|
|
47
|
+
· temp <%= @config[:temperature] %>
|
|
48
|
+
<% end %>
|
|
49
|
+
<% if @config[:timeout] %>
|
|
50
|
+
· timeout <%= @config[:timeout] %>s
|
|
51
|
+
<% end %>
|
|
52
|
+
<% if @config[:dimensions] %>
|
|
53
|
+
· <%= @config[:dimensions] %> dims
|
|
54
|
+
<% end %>
|
|
55
|
+
<% if @config[:voice] %>
|
|
56
|
+
· voice: <%= @config[:voice] %>
|
|
57
|
+
<% end %>
|
|
47
58
|
</p>
|
|
48
59
|
<% if @config[:description].present? %>
|
|
49
60
|
<p class="text-gray-600 dark:text-gray-300 mt-2">
|
|
@@ -80,8 +91,8 @@
|
|
|
80
91
|
</div>
|
|
81
92
|
</div>
|
|
82
93
|
|
|
83
|
-
<!-- Circuit Breaker Status (
|
|
84
|
-
<% if @config && @circuit_breaker_status.present? %>
|
|
94
|
+
<!-- Circuit Breaker Status (only for base agents with reliability enabled) -->
|
|
95
|
+
<% if @config && @agent_type_kind == "agent" && @circuit_breaker_status.present? %>
|
|
85
96
|
<div class="bg-white dark:bg-gray-800 rounded-lg shadow p-4 mb-6">
|
|
86
97
|
<div class="flex items-center justify-between mb-3">
|
|
87
98
|
<h3
|
|
@@ -292,379 +303,8 @@
|
|
|
292
303
|
<%= render partial: "ruby_llm/agents/agents/version_comparison",
|
|
293
304
|
locals: { versions: @versions, version_comparison: @version_comparison } %>
|
|
294
305
|
|
|
295
|
-
<% if @config %>
|
|
296
|
-
|
|
297
|
-
<div class="bg-white dark:bg-gray-800 rounded-lg shadow p-6 mb-6">
|
|
298
|
-
<h3 class="text-lg font-semibold text-gray-900 dark:text-gray-100 mb-4">
|
|
299
|
-
Configuration
|
|
300
|
-
</h3>
|
|
301
|
-
|
|
302
|
-
<!-- Basic Configuration -->
|
|
303
|
-
<p class="text-xs text-gray-500 dark:text-gray-400 uppercase tracking-wider mb-3">
|
|
304
|
-
Basic
|
|
305
|
-
</p>
|
|
306
|
-
|
|
307
|
-
<div class="grid grid-cols-2 md:grid-cols-4 gap-4 mb-6">
|
|
308
|
-
<div>
|
|
309
|
-
<p class="text-sm text-gray-500 dark:text-gray-400">Model</p>
|
|
310
|
-
|
|
311
|
-
<p class="font-medium text-gray-900 dark:text-gray-100">
|
|
312
|
-
<%= @config[:model] %>
|
|
313
|
-
</p>
|
|
314
|
-
</div>
|
|
315
|
-
|
|
316
|
-
<div>
|
|
317
|
-
<p class="text-sm text-gray-500 dark:text-gray-400">Temperature</p>
|
|
318
|
-
|
|
319
|
-
<p class="font-medium text-gray-900 dark:text-gray-100">
|
|
320
|
-
<%= @config[:temperature] %>
|
|
321
|
-
</p>
|
|
322
|
-
</div>
|
|
323
|
-
|
|
324
|
-
<div>
|
|
325
|
-
<p class="text-sm text-gray-500 dark:text-gray-400">Timeout</p>
|
|
326
|
-
|
|
327
|
-
<p class="font-medium text-gray-900 dark:text-gray-100">
|
|
328
|
-
<%= @config[:timeout] %> seconds
|
|
329
|
-
</p>
|
|
330
|
-
</div>
|
|
331
|
-
|
|
332
|
-
<div>
|
|
333
|
-
<p class="text-sm text-gray-500 dark:text-gray-400">Cache</p>
|
|
334
|
-
|
|
335
|
-
<p class="font-medium text-gray-900 dark:text-gray-100">
|
|
336
|
-
<% if @config[:cache_enabled] %>
|
|
337
|
-
Enabled (
|
|
338
|
-
<%= @config[:cache_ttl].inspect %>
|
|
339
|
-
)
|
|
340
|
-
<% else %>
|
|
341
|
-
<span class="text-gray-400 dark:text-gray-500">Disabled</span>
|
|
342
|
-
<% end %>
|
|
343
|
-
</p>
|
|
344
|
-
</div>
|
|
345
|
-
</div>
|
|
346
|
-
|
|
347
|
-
<!-- Reliability Configuration -->
|
|
348
|
-
<% retries_config = @config[:retries] || {}
|
|
349
|
-
fallback_models = Array(@config[:fallback_models]).compact
|
|
350
|
-
has_retries = (retries_config[:max] || 0) > 0
|
|
351
|
-
has_fallbacks = fallback_models.any?
|
|
352
|
-
has_total_timeout = @config[:total_timeout].present?
|
|
353
|
-
has_circuit_breaker = @config[:circuit_breaker].present?
|
|
354
|
-
has_any_reliability = has_retries || has_fallbacks || has_total_timeout || has_circuit_breaker %>
|
|
355
|
-
|
|
356
|
-
<div class="border-t border-gray-100 dark:border-gray-700 pt-4 mb-6">
|
|
357
|
-
<p
|
|
358
|
-
class="
|
|
359
|
-
text-xs text-gray-500 dark:text-gray-400 uppercase tracking-wider
|
|
360
|
-
mb-3
|
|
361
|
-
"
|
|
362
|
-
>
|
|
363
|
-
Reliability
|
|
364
|
-
</p>
|
|
365
|
-
|
|
366
|
-
<% if has_any_reliability %>
|
|
367
|
-
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
|
|
368
|
-
<!-- Retries -->
|
|
369
|
-
<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' %>">
|
|
370
|
-
<div class="flex-shrink-0 mt-0.5">
|
|
371
|
-
<% if has_retries %>
|
|
372
|
-
<svg
|
|
373
|
-
class="w-5 h-5 text-green-500"
|
|
374
|
-
fill="currentColor"
|
|
375
|
-
viewBox="0 0 20 20"
|
|
376
|
-
>
|
|
377
|
-
<path
|
|
378
|
-
fill-rule="evenodd"
|
|
379
|
-
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"
|
|
380
|
-
clip-rule="evenodd"
|
|
381
|
-
/>
|
|
382
|
-
</svg>
|
|
383
|
-
<% else %>
|
|
384
|
-
<svg
|
|
385
|
-
class="w-5 h-5 text-gray-400"
|
|
386
|
-
fill="currentColor"
|
|
387
|
-
viewBox="0 0 20 20"
|
|
388
|
-
>
|
|
389
|
-
<path
|
|
390
|
-
fill-rule="evenodd"
|
|
391
|
-
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"
|
|
392
|
-
clip-rule="evenodd"
|
|
393
|
-
/>
|
|
394
|
-
</svg>
|
|
395
|
-
<% end %>
|
|
396
|
-
</div>
|
|
397
|
-
|
|
398
|
-
<div>
|
|
399
|
-
<p class="text-sm font-medium text-gray-900 dark:text-gray-100">
|
|
400
|
-
Retries
|
|
401
|
-
</p>
|
|
402
|
-
|
|
403
|
-
<% if has_retries %>
|
|
404
|
-
<p class="text-xs text-gray-600 dark:text-gray-400 mt-1">
|
|
405
|
-
Max: <%= retries_config[:max] %> · Backoff:
|
|
406
|
-
<%= retries_config[:backoff] %> · Base:
|
|
407
|
-
<%= retries_config[:base] %>s · Max delay:
|
|
408
|
-
<%= retries_config[:max_delay] %>s
|
|
409
|
-
</p>
|
|
410
|
-
<% else %>
|
|
411
|
-
<p class="text-xs text-gray-400 dark:text-gray-500 mt-1">
|
|
412
|
-
Not configured
|
|
413
|
-
</p>
|
|
414
|
-
<% end %>
|
|
415
|
-
</div>
|
|
416
|
-
</div>
|
|
417
|
-
|
|
418
|
-
<!-- Fallback Models -->
|
|
419
|
-
<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' %>">
|
|
420
|
-
<div class="flex-shrink-0 mt-0.5">
|
|
421
|
-
<% if has_fallbacks %>
|
|
422
|
-
<svg
|
|
423
|
-
class="w-5 h-5 text-green-500"
|
|
424
|
-
fill="currentColor"
|
|
425
|
-
viewBox="0 0 20 20"
|
|
426
|
-
>
|
|
427
|
-
<path
|
|
428
|
-
fill-rule="evenodd"
|
|
429
|
-
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"
|
|
430
|
-
clip-rule="evenodd"
|
|
431
|
-
/>
|
|
432
|
-
</svg>
|
|
433
|
-
<% else %>
|
|
434
|
-
<svg
|
|
435
|
-
class="w-5 h-5 text-gray-400"
|
|
436
|
-
fill="currentColor"
|
|
437
|
-
viewBox="0 0 20 20"
|
|
438
|
-
>
|
|
439
|
-
<path
|
|
440
|
-
fill-rule="evenodd"
|
|
441
|
-
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"
|
|
442
|
-
clip-rule="evenodd"
|
|
443
|
-
/>
|
|
444
|
-
</svg>
|
|
445
|
-
<% end %>
|
|
446
|
-
</div>
|
|
447
|
-
|
|
448
|
-
<div>
|
|
449
|
-
<p class="text-sm font-medium text-gray-900 dark:text-gray-100">
|
|
450
|
-
Fallback Models
|
|
451
|
-
</p>
|
|
452
|
-
|
|
453
|
-
<% if has_fallbacks %>
|
|
454
|
-
<p class="text-xs text-gray-600 dark:text-gray-400 mt-1">
|
|
455
|
-
<%= fallback_models.join(" → ") %>
|
|
456
|
-
</p>
|
|
457
|
-
<% else %>
|
|
458
|
-
<p class="text-xs text-gray-400 dark:text-gray-500 mt-1">
|
|
459
|
-
Not configured
|
|
460
|
-
</p>
|
|
461
|
-
<% end %>
|
|
462
|
-
</div>
|
|
463
|
-
</div>
|
|
464
|
-
|
|
465
|
-
<!-- Total Timeout -->
|
|
466
|
-
<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' %>">
|
|
467
|
-
<div class="flex-shrink-0 mt-0.5">
|
|
468
|
-
<% if has_total_timeout %>
|
|
469
|
-
<svg
|
|
470
|
-
class="w-5 h-5 text-green-500"
|
|
471
|
-
fill="currentColor"
|
|
472
|
-
viewBox="0 0 20 20"
|
|
473
|
-
>
|
|
474
|
-
<path
|
|
475
|
-
fill-rule="evenodd"
|
|
476
|
-
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"
|
|
477
|
-
clip-rule="evenodd"
|
|
478
|
-
/>
|
|
479
|
-
</svg>
|
|
480
|
-
<% else %>
|
|
481
|
-
<svg
|
|
482
|
-
class="w-5 h-5 text-gray-400"
|
|
483
|
-
fill="currentColor"
|
|
484
|
-
viewBox="0 0 20 20"
|
|
485
|
-
>
|
|
486
|
-
<path
|
|
487
|
-
fill-rule="evenodd"
|
|
488
|
-
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"
|
|
489
|
-
clip-rule="evenodd"
|
|
490
|
-
/>
|
|
491
|
-
</svg>
|
|
492
|
-
<% end %>
|
|
493
|
-
</div>
|
|
494
|
-
|
|
495
|
-
<div>
|
|
496
|
-
<p class="text-sm font-medium text-gray-900 dark:text-gray-100">
|
|
497
|
-
Total Timeout
|
|
498
|
-
</p>
|
|
499
|
-
|
|
500
|
-
<% if has_total_timeout %>
|
|
501
|
-
<p class="text-xs text-gray-600 dark:text-gray-400 mt-1">
|
|
502
|
-
<%= @config[:total_timeout] %> seconds across all attempts
|
|
503
|
-
</p>
|
|
504
|
-
<% else %>
|
|
505
|
-
<p class="text-xs text-gray-400 dark:text-gray-500 mt-1">
|
|
506
|
-
Not configured
|
|
507
|
-
</p>
|
|
508
|
-
<% end %>
|
|
509
|
-
</div>
|
|
510
|
-
</div>
|
|
511
|
-
|
|
512
|
-
<!-- Circuit Breaker -->
|
|
513
|
-
<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' %>">
|
|
514
|
-
<div class="flex-shrink-0 mt-0.5">
|
|
515
|
-
<% if has_circuit_breaker %>
|
|
516
|
-
<svg
|
|
517
|
-
class="w-5 h-5 text-green-500"
|
|
518
|
-
fill="currentColor"
|
|
519
|
-
viewBox="0 0 20 20"
|
|
520
|
-
>
|
|
521
|
-
<path
|
|
522
|
-
fill-rule="evenodd"
|
|
523
|
-
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"
|
|
524
|
-
clip-rule="evenodd"
|
|
525
|
-
/>
|
|
526
|
-
</svg>
|
|
527
|
-
<% else %>
|
|
528
|
-
<svg
|
|
529
|
-
class="w-5 h-5 text-gray-400"
|
|
530
|
-
fill="currentColor"
|
|
531
|
-
viewBox="0 0 20 20"
|
|
532
|
-
>
|
|
533
|
-
<path
|
|
534
|
-
fill-rule="evenodd"
|
|
535
|
-
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"
|
|
536
|
-
clip-rule="evenodd"
|
|
537
|
-
/>
|
|
538
|
-
</svg>
|
|
539
|
-
<% end %>
|
|
540
|
-
</div>
|
|
541
|
-
|
|
542
|
-
<div>
|
|
543
|
-
<p class="text-sm font-medium text-gray-900 dark:text-gray-100">
|
|
544
|
-
Circuit Breaker
|
|
545
|
-
</p>
|
|
546
|
-
|
|
547
|
-
<% if has_circuit_breaker %>
|
|
548
|
-
<% cb = @config[:circuit_breaker] %>
|
|
549
|
-
<p class="text-xs text-gray-600 dark:text-gray-400 mt-1">
|
|
550
|
-
Opens after <%= cb[:errors] %> errors within
|
|
551
|
-
<%= cb[:within] %>s · Cooldown: <%= cb[:cooldown] %>s
|
|
552
|
-
</p>
|
|
553
|
-
<% else %>
|
|
554
|
-
<p class="text-xs text-gray-400 dark:text-gray-500 mt-1">
|
|
555
|
-
Not configured
|
|
556
|
-
</p>
|
|
557
|
-
<% end %>
|
|
558
|
-
</div>
|
|
559
|
-
</div>
|
|
560
|
-
</div>
|
|
561
|
-
<% else %>
|
|
562
|
-
<p class="text-sm text-gray-400 dark:text-gray-500">
|
|
563
|
-
No reliability features configured
|
|
564
|
-
</p>
|
|
565
|
-
<% end %>
|
|
566
|
-
</div>
|
|
567
|
-
|
|
568
|
-
<!-- Parameters -->
|
|
569
|
-
<% if @config[:params].present? && @config[:params].any? %>
|
|
570
|
-
<div class="border-t border-gray-100 dark:border-gray-700 pt-4">
|
|
571
|
-
<p
|
|
572
|
-
class="
|
|
573
|
-
text-xs text-gray-500 dark:text-gray-400 uppercase
|
|
574
|
-
tracking-wider mb-3
|
|
575
|
-
"
|
|
576
|
-
>
|
|
577
|
-
Parameters
|
|
578
|
-
</p>
|
|
579
|
-
|
|
580
|
-
<div class="space-y-2">
|
|
581
|
-
<% @config[:params].each do |name, opts| %>
|
|
582
|
-
<div class="flex items-center text-sm">
|
|
583
|
-
<code
|
|
584
|
-
class="
|
|
585
|
-
bg-gray-100 dark:bg-gray-700 dark:text-gray-200 px-2
|
|
586
|
-
py-0.5 rounded font-mono
|
|
587
|
-
"
|
|
588
|
-
>
|
|
589
|
-
<%= name %>
|
|
590
|
-
</code>
|
|
591
|
-
|
|
592
|
-
<% if opts[:required] %>
|
|
593
|
-
<span class="ml-2 text-xs text-red-500 dark:text-red-400 font-medium">
|
|
594
|
-
required
|
|
595
|
-
</span>
|
|
596
|
-
<% elsif opts[:default].present? %>
|
|
597
|
-
<span class="ml-2 text-xs text-gray-400 dark:text-gray-500">
|
|
598
|
-
default: <%= opts[:default].inspect %>
|
|
599
|
-
</span>
|
|
600
|
-
<% else %>
|
|
601
|
-
<span class="ml-2 text-xs text-gray-400 dark:text-gray-500">
|
|
602
|
-
optional
|
|
603
|
-
</span>
|
|
604
|
-
<% end %>
|
|
605
|
-
</div>
|
|
606
|
-
<% end %>
|
|
607
|
-
</div>
|
|
608
|
-
</div>
|
|
609
|
-
<% end %>
|
|
610
|
-
|
|
611
|
-
<!-- Available Tools -->
|
|
612
|
-
<%
|
|
613
|
-
class_tools = @agent_class.respond_to?(:tools) ? (@agent_class.tools || []) : []
|
|
614
|
-
has_dynamic_tools = @agent_class.instance_methods(false).include?(:tools)
|
|
615
|
-
%>
|
|
616
|
-
<div class="border-t border-gray-100 dark:border-gray-700 pt-4">
|
|
617
|
-
<p
|
|
618
|
-
class="
|
|
619
|
-
text-xs text-gray-500 dark:text-gray-400 uppercase
|
|
620
|
-
tracking-wider mb-3
|
|
621
|
-
"
|
|
622
|
-
>
|
|
623
|
-
Available Tools
|
|
624
|
-
<% if class_tools.any? %>
|
|
625
|
-
<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">
|
|
626
|
-
<%= class_tools.size %>
|
|
627
|
-
</span>
|
|
628
|
-
<% elsif has_dynamic_tools %>
|
|
629
|
-
<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">
|
|
630
|
-
Dynamic
|
|
631
|
-
</span>
|
|
632
|
-
<% else %>
|
|
633
|
-
<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">
|
|
634
|
-
0
|
|
635
|
-
</span>
|
|
636
|
-
<% end %>
|
|
637
|
-
</p>
|
|
638
|
-
|
|
639
|
-
<% if class_tools.any? %>
|
|
640
|
-
<div class="space-y-2">
|
|
641
|
-
<% class_tools.each do |tool_class| %>
|
|
642
|
-
<div class="flex items-center text-sm">
|
|
643
|
-
<code
|
|
644
|
-
class="
|
|
645
|
-
bg-gray-100 dark:bg-gray-700 dark:text-gray-200 px-2
|
|
646
|
-
py-0.5 rounded font-mono
|
|
647
|
-
"
|
|
648
|
-
>
|
|
649
|
-
<%= tool_class.respond_to?(:tool_name) ? tool_class.tool_name : tool_class.name.demodulize %>
|
|
650
|
-
</code>
|
|
651
|
-
</div>
|
|
652
|
-
<% end %>
|
|
653
|
-
</div>
|
|
654
|
-
<% elsif has_dynamic_tools %>
|
|
655
|
-
<p class="text-sm text-purple-600 dark:text-purple-400">
|
|
656
|
-
This agent configures tools dynamically at runtime based on context.
|
|
657
|
-
</p>
|
|
658
|
-
<p class="text-xs text-gray-400 dark:text-gray-500 mt-1">
|
|
659
|
-
Tools vary per execution based on feature flags and configuration.
|
|
660
|
-
</p>
|
|
661
|
-
<% else %>
|
|
662
|
-
<p class="text-sm text-gray-400 dark:text-gray-500 italic">
|
|
663
|
-
No tools configured for this agent.
|
|
664
|
-
</p>
|
|
665
|
-
<% end %>
|
|
666
|
-
</div>
|
|
667
|
-
</div>
|
|
306
|
+
<% if @config && @agent_type_kind %>
|
|
307
|
+
<%= render "ruby_llm/agents/agents/config_#{@agent_type_kind}", config: @config %>
|
|
668
308
|
<% end %>
|
|
669
309
|
|
|
670
310
|
<!-- Executions -->
|