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
|
@@ -69,24 +69,10 @@
|
|
|
69
69
|
|
|
70
70
|
<style>[x-cloak] { display: none !important; }</style>
|
|
71
71
|
|
|
72
|
-
<!--
|
|
72
|
+
<!-- Clickable rows -->
|
|
73
73
|
<script type="module">
|
|
74
|
-
function updateClock() {
|
|
75
|
-
const clock = document.getElementById('live-clock');
|
|
76
|
-
if (clock) {
|
|
77
|
-
const now = new Date();
|
|
78
|
-
clock.textContent = now.toLocaleTimeString('en-US', {
|
|
79
|
-
hour: '2-digit',
|
|
80
|
-
minute: '2-digit',
|
|
81
|
-
hour12: false
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
74
|
// Initialize on page load
|
|
87
75
|
document.addEventListener('DOMContentLoaded', function() {
|
|
88
|
-
updateClock();
|
|
89
|
-
|
|
90
76
|
// Handle data-href clickable rows (semantic alternative to onclick)
|
|
91
77
|
document.querySelectorAll('[data-href]').forEach(function(element) {
|
|
92
78
|
element.addEventListener('click', function(e) {
|
|
@@ -281,7 +267,7 @@
|
|
|
281
267
|
class="absolute right-0 mt-1 w-48 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-lg z-50 py-1"
|
|
282
268
|
>
|
|
283
269
|
<a
|
|
284
|
-
href="<%=
|
|
270
|
+
href="<%= all_tenants_url %>"
|
|
285
271
|
class="block px-3 py-2 text-sm hover:bg-gray-100 dark:hover:bg-gray-700 <%= 'bg-blue-50 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300' if current_tenant_id.blank? %>"
|
|
286
272
|
>
|
|
287
273
|
All Tenants
|
|
@@ -299,19 +285,6 @@
|
|
|
299
285
|
</div>
|
|
300
286
|
<% end %>
|
|
301
287
|
|
|
302
|
-
<span id="live-clock" class="tabular-nums"></span>
|
|
303
|
-
|
|
304
|
-
<button
|
|
305
|
-
id="refresh-button"
|
|
306
|
-
onclick="window.location.reload()"
|
|
307
|
-
title="Refresh page"
|
|
308
|
-
class="p-1.5 rounded-md text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors"
|
|
309
|
-
>
|
|
310
|
-
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
311
|
-
<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" />
|
|
312
|
-
</svg>
|
|
313
|
-
</button>
|
|
314
|
-
|
|
315
288
|
<!-- Mobile menu button -->
|
|
316
289
|
<button
|
|
317
290
|
type="button"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<%= link_to ruby_llm_agents.agent_path(ERB::Util.url_encode(agent[:name])), class: "block bg-white dark:bg-gray-800 rounded-lg shadow hover:shadow-md transition-shadow" do %>
|
|
1
|
+
<%= link_to ruby_llm_agents.agent_path(ERB::Util.url_encode(agent[:name]), tab: local_assigns[:current_tab], subtab: local_assigns[:current_subtab]), class: "block bg-white dark:bg-gray-800 rounded-lg shadow hover:shadow-md transition-shadow relative z-10", data: { turbo: false }, style: "pointer-events: auto;" do %>
|
|
2
2
|
<div class="p-4 sm:p-5">
|
|
3
3
|
<!-- Row 1: Agent name + badge + model/timestamp -->
|
|
4
4
|
<div class="flex items-center justify-between gap-2">
|
|
@@ -16,6 +16,18 @@
|
|
|
16
16
|
<% else %>
|
|
17
17
|
<span class="inline-flex items-center px-1.5 py-0.5 rounded text-[10px] font-medium bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-400">Deleted</span>
|
|
18
18
|
<% end %>
|
|
19
|
+
<% if agent[:agent_type] && agent[:agent_type] != "agent" %>
|
|
20
|
+
<span class="inline-flex items-center px-1.5 py-0.5 rounded text-[10px] font-medium
|
|
21
|
+
<%= case agent[:agent_type]
|
|
22
|
+
when 'embedder' then 'bg-purple-100 dark:bg-purple-900/50 text-purple-800 dark:text-purple-300'
|
|
23
|
+
when 'moderator' then 'bg-orange-100 dark:bg-orange-900/50 text-orange-800 dark:text-orange-300'
|
|
24
|
+
when 'speaker' then 'bg-green-100 dark:bg-green-900/50 text-green-800 dark:text-green-300'
|
|
25
|
+
when 'transcriber' then 'bg-pink-100 dark:bg-pink-900/50 text-pink-800 dark:text-pink-300'
|
|
26
|
+
else ''
|
|
27
|
+
end %>">
|
|
28
|
+
<%= agent[:agent_type].capitalize %>
|
|
29
|
+
</span>
|
|
30
|
+
<% end %>
|
|
19
31
|
</div>
|
|
20
32
|
<!-- Desktop: model -->
|
|
21
33
|
<span class="hidden sm:block text-sm text-gray-500 dark:text-gray-400"><%= agent[:model] %></span>
|
|
@@ -0,0 +1,235 @@
|
|
|
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>
|
|
6
|
+
|
|
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">
|
|
37
|
+
<% if config[:cache_enabled] %>
|
|
38
|
+
Enabled (<%= config[:cache_ttl].inspect %>)
|
|
39
|
+
<% else %>
|
|
40
|
+
<span class="text-gray-400 dark:text-gray-500">Disabled</span>
|
|
41
|
+
<% end %>
|
|
42
|
+
</p>
|
|
43
|
+
</div>
|
|
44
|
+
</div>
|
|
45
|
+
|
|
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
|
+
|
|
60
|
+
<% 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] %> · Backoff: <%= retries_config[:backoff] %> · Base: <%= retries_config[:base] %>s · 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>
|
|
85
|
+
</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>
|
|
108
|
+
</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>
|
|
131
|
+
</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 · 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>
|
|
157
|
+
</div>
|
|
158
|
+
</div>
|
|
159
|
+
<% 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>
|
|
233
|
+
<% end %>
|
|
234
|
+
</div>
|
|
235
|
+
</div>
|
|
@@ -0,0 +1,70 @@
|
|
|
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>
|
|
18
|
+
</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>
|
|
29
|
+
</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>
|
|
40
|
+
</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>
|
|
68
|
+
</div>
|
|
69
|
+
</div>
|
|
70
|
+
</div>
|
|
@@ -0,0 +1,152 @@
|
|
|
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>
|
|
18
|
+
</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>
|
|
29
|
+
</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>
|
|
42
|
+
</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>
|
|
53
|
+
</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>
|
|
71
|
+
</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>
|
|
82
|
+
</div>
|
|
83
|
+
|
|
84
|
+
<% 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>
|
|
90
|
+
</div>
|
|
91
|
+
<% end %>
|
|
92
|
+
|
|
93
|
+
<% 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>
|
|
99
|
+
</div>
|
|
100
|
+
<% 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>
|
|
110
|
+
</div>
|
|
111
|
+
</div>
|
|
112
|
+
<% end %>
|
|
113
|
+
|
|
114
|
+
<% 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>
|
|
122
|
+
</div>
|
|
123
|
+
<% end %>
|
|
124
|
+
|
|
125
|
+
<% 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>
|
|
133
|
+
</div>
|
|
134
|
+
<% 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
|
+
</div>
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
<%# Configuration partial for Moderator 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
|
+
<!-- Moderation Configuration -->
|
|
8
|
+
<p class="text-xs text-gray-500 dark:text-gray-400 uppercase tracking-wider mb-3">
|
|
9
|
+
Moderation 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>
|
|
18
|
+
</div>
|
|
19
|
+
|
|
20
|
+
<div>
|
|
21
|
+
<p class="text-sm text-gray-500 dark:text-gray-400">Threshold</p>
|
|
22
|
+
<p class="font-medium text-gray-900 dark:text-gray-100">
|
|
23
|
+
<% if config[:threshold] %>
|
|
24
|
+
<%= config[:threshold] %>
|
|
25
|
+
<% else %>
|
|
26
|
+
<span class="text-gray-400 dark:text-gray-500">Default</span>
|
|
27
|
+
<% end %>
|
|
28
|
+
</p>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
<div class="col-span-2">
|
|
32
|
+
<p class="text-sm text-gray-500 dark:text-gray-400">Categories</p>
|
|
33
|
+
<p class="font-medium text-gray-900 dark:text-gray-100">
|
|
34
|
+
<% if config[:categories].present? %>
|
|
35
|
+
<% config[:categories].each do |category| %>
|
|
36
|
+
<span class="inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-orange-100 dark:bg-orange-900/50 text-orange-800 dark:text-orange-300 mr-1 mb-1">
|
|
37
|
+
<%= category %>
|
|
38
|
+
</span>
|
|
39
|
+
<% end %>
|
|
40
|
+
<% else %>
|
|
41
|
+
<span class="text-gray-400 dark:text-gray-500">All categories</span>
|
|
42
|
+
<% end %>
|
|
43
|
+
</p>
|
|
44
|
+
</div>
|
|
45
|
+
</div>
|
|
46
|
+
|
|
47
|
+
<!-- Info Section -->
|
|
48
|
+
<div class="border-t border-gray-100 dark:border-gray-700 pt-4">
|
|
49
|
+
<div class="flex items-start gap-3 p-3 rounded-lg bg-orange-50 dark:bg-orange-900/20">
|
|
50
|
+
<div class="flex-shrink-0 mt-0.5">
|
|
51
|
+
<svg class="w-5 h-5 text-orange-500" fill="currentColor" viewBox="0 0 20 20">
|
|
52
|
+
<path fill-rule="evenodd" d="M10 1.944A11.954 11.954 0 012.166 5C2.056 5.649 2 6.319 2 7c0 5.225 3.34 9.67 8 11.317C14.66 16.67 18 12.225 18 7c0-.682-.057-1.35-.166-2.001A11.954 11.954 0 0110 1.944zM11 14a1 1 0 11-2 0 1 1 0 012 0zm0-7a1 1 0 10-2 0v3a1 1 0 102 0V7z" clip-rule="evenodd"/>
|
|
53
|
+
</svg>
|
|
54
|
+
</div>
|
|
55
|
+
<div>
|
|
56
|
+
<p class="text-sm font-medium text-gray-900 dark:text-gray-100">Moderator</p>
|
|
57
|
+
<p class="text-xs text-gray-600 dark:text-gray-400 mt-1">
|
|
58
|
+
Checks content for policy violations including hate speech, violence, and other harmful content categories.
|
|
59
|
+
</p>
|
|
60
|
+
</div>
|
|
61
|
+
</div>
|
|
62
|
+
</div>
|
|
63
|
+
</div>
|