raif 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 +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +678 -0
- data/Rakefile +20 -0
- data/app/assets/builds/raif.css +74 -0
- data/app/assets/builds/raif_admin.css +266 -0
- data/app/assets/config/raif_manifest.js +1 -0
- data/app/assets/javascript/raif/controllers/conversations_controller.js +11 -0
- data/app/assets/javascript/raif/stream_actions/raif_scroll_to_bottom.js +12 -0
- data/app/assets/javascript/raif.js +10 -0
- data/app/assets/stylesheets/raif/admin/conversation.scss +64 -0
- data/app/assets/stylesheets/raif/loader.scss +85 -0
- data/app/assets/stylesheets/raif.scss +1 -0
- data/app/assets/stylesheets/raif_admin.scss +299 -0
- data/app/controllers/raif/admin/agents_controller.rb +17 -0
- data/app/controllers/raif/admin/application_controller.rb +20 -0
- data/app/controllers/raif/admin/conversations_controller.rb +17 -0
- data/app/controllers/raif/admin/model_completions_controller.rb +17 -0
- data/app/controllers/raif/admin/model_tool_invocations_controller.rb +17 -0
- data/app/controllers/raif/admin/tasks_controller.rb +23 -0
- data/app/controllers/raif/application_controller.rb +20 -0
- data/app/controllers/raif/conversation_entries_controller.rb +60 -0
- data/app/controllers/raif/conversations_controller.rb +58 -0
- data/app/helpers/raif/application_helper.rb +7 -0
- data/app/helpers/raif/shared/conversations_helper.rb +13 -0
- data/app/jobs/raif/application_job.rb +8 -0
- data/app/jobs/raif/conversation_entry_job.rb +30 -0
- data/app/models/raif/agent.rb +133 -0
- data/app/models/raif/agents/native_tool_calling_agent.rb +127 -0
- data/app/models/raif/agents/re_act_agent.rb +121 -0
- data/app/models/raif/agents/re_act_step.rb +33 -0
- data/app/models/raif/application_record.rb +14 -0
- data/app/models/raif/concerns/boolean_timestamp.rb +69 -0
- data/app/models/raif/concerns/has_available_model_tools.rb +13 -0
- data/app/models/raif/concerns/has_llm.rb +19 -0
- data/app/models/raif/concerns/has_requested_language.rb +20 -0
- data/app/models/raif/concerns/invokes_model_tools.rb +13 -0
- data/app/models/raif/concerns/llm_response_parsing.rb +44 -0
- data/app/models/raif/conversation.rb +67 -0
- data/app/models/raif/conversation_entry.rb +85 -0
- data/app/models/raif/llm.rb +88 -0
- data/app/models/raif/llms/anthropic.rb +120 -0
- data/app/models/raif/llms/bedrock_claude.rb +134 -0
- data/app/models/raif/llms/open_ai.rb +259 -0
- data/app/models/raif/model_completion.rb +28 -0
- data/app/models/raif/model_tool.rb +69 -0
- data/app/models/raif/model_tool_invocation.rb +43 -0
- data/app/models/raif/model_tools/agent_final_answer.rb +46 -0
- data/app/models/raif/model_tools/fetch_url.rb +57 -0
- data/app/models/raif/model_tools/wikipedia_search.rb +78 -0
- data/app/models/raif/task.rb +137 -0
- data/app/models/raif/user_tool_invocation.rb +29 -0
- data/app/views/layouts/raif/admin.html.erb +98 -0
- data/app/views/raif/admin/agents/_agent.html.erb +18 -0
- data/app/views/raif/admin/agents/_conversation_message.html.erb +15 -0
- data/app/views/raif/admin/agents/index.html.erb +33 -0
- data/app/views/raif/admin/agents/show.html.erb +131 -0
- data/app/views/raif/admin/conversations/_conversation.html.erb +7 -0
- data/app/views/raif/admin/conversations/_conversation_entry.html.erb +34 -0
- data/app/views/raif/admin/conversations/index.html.erb +32 -0
- data/app/views/raif/admin/conversations/show.html.erb +56 -0
- data/app/views/raif/admin/model_completions/_model_completion.html.erb +9 -0
- data/app/views/raif/admin/model_completions/index.html.erb +34 -0
- data/app/views/raif/admin/model_completions/show.html.erb +117 -0
- data/app/views/raif/admin/model_tool_invocations/_model_tool_invocation.html.erb +16 -0
- data/app/views/raif/admin/model_tool_invocations/index.html.erb +33 -0
- data/app/views/raif/admin/model_tool_invocations/show.html.erb +66 -0
- data/app/views/raif/admin/tasks/_task.html.erb +19 -0
- data/app/views/raif/admin/tasks/index.html.erb +49 -0
- data/app/views/raif/admin/tasks/show.html.erb +176 -0
- data/app/views/raif/conversation_entries/_conversation_entry.html.erb +26 -0
- data/app/views/raif/conversation_entries/_form.html.erb +25 -0
- data/app/views/raif/conversation_entries/_form_with_available_tools.html.erb +4 -0
- data/app/views/raif/conversation_entries/_form_with_user_tool_invocation.html.erb +18 -0
- data/app/views/raif/conversation_entries/_message.html.erb +17 -0
- data/app/views/raif/conversation_entries/_model_response_avatar.html.erb +1 -0
- data/app/views/raif/conversation_entries/_user_avatar.html.erb +1 -0
- data/app/views/raif/conversation_entries/create.turbo_stream.erb +11 -0
- data/app/views/raif/conversation_entries/new.turbo_stream.erb +6 -0
- data/app/views/raif/conversations/_available_user_tools.html.erb +11 -0
- data/app/views/raif/conversations/_full_conversation.html.erb +15 -0
- data/app/views/raif/conversations/show.html.erb +1 -0
- data/config/i18n-tasks.yml +181 -0
- data/config/importmap.rb +6 -0
- data/config/initializers/pagy.rb +14 -0
- data/config/locales/admin.en.yml +91 -0
- data/config/locales/en.yml +50 -0
- data/config/routes.rb +22 -0
- data/db/migrate/20250224234252_create_raif_tables.rb +114 -0
- data/lib/generators/raif/agent/agent_generator.rb +22 -0
- data/lib/generators/raif/agent/templates/agent.rb.tt +28 -0
- data/lib/generators/raif/conversation/conversation_generator.rb +27 -0
- data/lib/generators/raif/conversation/templates/conversation.rb.tt +37 -0
- data/lib/generators/raif/install/install_generator.rb +31 -0
- data/lib/generators/raif/install/templates/initializer.rb +81 -0
- data/lib/generators/raif/model_tool/model_tool_generator.rb +27 -0
- data/lib/generators/raif/model_tool/templates/model_tool.rb.tt +74 -0
- data/lib/generators/raif/task/task_generator.rb +28 -0
- data/lib/generators/raif/task/templates/application_task.rb.tt +7 -0
- data/lib/generators/raif/task/templates/task.rb.tt +52 -0
- data/lib/generators/raif/views_generator.rb +22 -0
- data/lib/raif/configuration.rb +82 -0
- data/lib/raif/default_llms.rb +37 -0
- data/lib/raif/engine.rb +86 -0
- data/lib/raif/errors/action_not_authorized_error.rb +8 -0
- data/lib/raif/errors/anthropic/api_error.rb +10 -0
- data/lib/raif/errors/invalid_config_error.rb +8 -0
- data/lib/raif/errors/invalid_conversation_type_error.rb +8 -0
- data/lib/raif/errors/invalid_user_tool_type_error.rb +8 -0
- data/lib/raif/errors/open_ai/api_error.rb +10 -0
- data/lib/raif/errors/open_ai/json_schema_error.rb +10 -0
- data/lib/raif/errors.rb +9 -0
- data/lib/raif/languages.rb +33 -0
- data/lib/raif/rspec.rb +7 -0
- data/lib/raif/utils/html_to_markdown_converter.rb +7 -0
- data/lib/raif/utils/readable_content_extractor.rb +61 -0
- data/lib/raif/utils.rb +6 -0
- data/lib/raif/version.rb +5 -0
- data/lib/raif.rb +65 -0
- data/lib/tasks/raif_tasks.rake +6 -0
- metadata +294 -0
@@ -0,0 +1,131 @@
|
|
1
|
+
<div class="d-flex justify-content-between align-items-center my-4">
|
2
|
+
<h1><%= t(".title", id: @agent.id) %></h1>
|
3
|
+
<%= link_to t(".back_to_agents"), raif.admin_agents_path, class: "btn btn-outline-secondary" %>
|
4
|
+
</div>
|
5
|
+
|
6
|
+
<div class="card mb-4">
|
7
|
+
<div class="card-header">
|
8
|
+
<h5 class="mb-0"><%= t("raif.admin.common.details") %></h5>
|
9
|
+
</div>
|
10
|
+
<div class="card-body">
|
11
|
+
<div class="row mb-3">
|
12
|
+
<div class="col-md-3"><strong><%= t("raif.admin.common.id") %>:</strong></div>
|
13
|
+
<div class="col-md-9"><%= @agent.id %></div>
|
14
|
+
</div>
|
15
|
+
<div class="row mb-3">
|
16
|
+
<div class="col-md-3"><strong><%= t("raif.admin.common.created_at") %>:</strong></div>
|
17
|
+
<div class="col-md-9"><%= @agent.created_at.rfc822 %></div>
|
18
|
+
</div>
|
19
|
+
<div class="row mb-3">
|
20
|
+
<div class="col-md-3"><strong><%= t("raif.admin.common.creator") %>:</strong></div>
|
21
|
+
<div class="col-md-9"><%= @agent.creator_type %> #<%= @agent.creator_id %></div>
|
22
|
+
</div>
|
23
|
+
<div class="row mb-3">
|
24
|
+
<div class="col-md-3"><strong><%= t("raif.admin.common.status") %>:</strong></div>
|
25
|
+
<div class="col-md-9">
|
26
|
+
<% if @agent.completed_at? %>
|
27
|
+
<span class="badge bg-success"><%= t("raif.admin.common.completed") %></span> <%= t("raif.admin.common.at") %> <%= @agent.completed_at.rfc822 %>
|
28
|
+
<% elsif @agent.failed_at? %>
|
29
|
+
<span class="badge bg-danger"><%= t("raif.admin.common.failed") %></span> <%= t("raif.admin.common.at") %> <%= @agent.failed_at.rfc822 %>
|
30
|
+
<% elsif @agent.started_at? %>
|
31
|
+
<span class="badge bg-warning"><%= t("raif.admin.common.running") %></span> <%= t("raif.admin.common.since") %> <%= @agent.started_at.rfc822 %>
|
32
|
+
<% else %>
|
33
|
+
<span class="badge bg-secondary"><%= t("raif.admin.common.pending") %></span>
|
34
|
+
<% end %>
|
35
|
+
</div>
|
36
|
+
</div>
|
37
|
+
<div class="row mb-3">
|
38
|
+
<div class="col-md-3"><strong><%= t("raif.admin.common.iterations") %>:</strong></div>
|
39
|
+
<div class="col-md-9"><%= @agent.iteration_count %> / <%= @agent.max_iterations %></div>
|
40
|
+
</div>
|
41
|
+
<div class="row mb-3">
|
42
|
+
<div class="col-md-3"><strong><%= t("raif.admin.common.model") %>:</strong></div>
|
43
|
+
<div class="col-md-9"><%= @agent.llm_model_key %></div>
|
44
|
+
</div>
|
45
|
+
<% if @agent.requested_language_key.present? %>
|
46
|
+
<div class="row mb-3">
|
47
|
+
<div class="col-md-3"><strong><%= t("raif.admin.common.language") %>:</strong></div>
|
48
|
+
<div class="col-md-9"><%= @agent.requested_language_key %></div>
|
49
|
+
</div>
|
50
|
+
<% end %>
|
51
|
+
</div>
|
52
|
+
</div>
|
53
|
+
|
54
|
+
<div class="card mb-4">
|
55
|
+
<div class="card-header">
|
56
|
+
<h5 class="mb-0"><%= t("raif.admin.common.task") %></h5>
|
57
|
+
</div>
|
58
|
+
<div class="card-body">
|
59
|
+
<pre class="pre-wrap"><%= @agent.task %></pre>
|
60
|
+
</div>
|
61
|
+
</div>
|
62
|
+
|
63
|
+
<% if @agent.final_answer.present? %>
|
64
|
+
<div class="card mb-4">
|
65
|
+
<div class="card-header">
|
66
|
+
<h5 class="mb-0"><%= t("raif.admin.common.final_answer") %></h5>
|
67
|
+
</div>
|
68
|
+
<div class="card-body">
|
69
|
+
<pre class="pre-wrap"><%= @agent.final_answer %></pre>
|
70
|
+
</div>
|
71
|
+
</div>
|
72
|
+
<% end %>
|
73
|
+
|
74
|
+
<div class="card mb-4">
|
75
|
+
<div class="card-header">
|
76
|
+
<h5 class="mb-0"><%= t("raif.admin.common.system_prompt") %></h5>
|
77
|
+
</div>
|
78
|
+
<div class="card-body">
|
79
|
+
<pre class="pre-wrap"><%= @agent.system_prompt %></pre>
|
80
|
+
</div>
|
81
|
+
</div>
|
82
|
+
|
83
|
+
<% if @agent.conversation_history.present? %>
|
84
|
+
<div class="card mb-4 conversation-card">
|
85
|
+
<div class="card-header">
|
86
|
+
<h5 class="mb-0"><%= t("raif.admin.common.conversation_history") %></h5>
|
87
|
+
</div>
|
88
|
+
<div class="card-body p-0">
|
89
|
+
<div class="conversation-history p-3">
|
90
|
+
<% @agent.conversation_history.each_with_index do |message, index| %>
|
91
|
+
<%= render partial: "raif/admin/agents/conversation_message",
|
92
|
+
locals: { message: message, message_count: index + 1 } %>
|
93
|
+
<% end %>
|
94
|
+
</div>
|
95
|
+
</div>
|
96
|
+
</div>
|
97
|
+
<% end %>
|
98
|
+
|
99
|
+
<% if @agent.raif_model_completions.any? %>
|
100
|
+
<div class="card mb-4">
|
101
|
+
<div class="card-header">
|
102
|
+
<h5 class="mb-0"><%= t("raif.admin.common.model_completions") %></h5>
|
103
|
+
</div>
|
104
|
+
<div class="card-body">
|
105
|
+
<div class="table-responsive">
|
106
|
+
<table class="table table-striped table-hover">
|
107
|
+
<thead class="table-light">
|
108
|
+
<tr>
|
109
|
+
<th><%= t("raif.admin.common.id") %></th>
|
110
|
+
<th><%= t("raif.admin.common.created_at") %></th>
|
111
|
+
<th><%= t("raif.admin.common.model") %></th>
|
112
|
+
<th><%= t("raif.admin.common.total_tokens") %></th>
|
113
|
+
<th><%= t("raif.admin.common.response") %></th>
|
114
|
+
</tr>
|
115
|
+
</thead>
|
116
|
+
<tbody>
|
117
|
+
<% @agent.raif_model_completions.order(created_at: :asc).each do |model_completion| %>
|
118
|
+
<tr>
|
119
|
+
<td><%= link_to "##{model_completion.id}", raif.admin_model_completion_path(model_completion) %></td>
|
120
|
+
<td><small class="text-muted"><%= model_completion.created_at.rfc822 %></small></td>
|
121
|
+
<td><%= model_completion.llm_model_key %></td>
|
122
|
+
<td><%= model_completion.total_tokens ? number_with_delimiter(model_completion.total_tokens) : "-" %></td>
|
123
|
+
<td><small class="text-muted"><%= truncate(model_completion.raw_response, length: 100) %></small></td>
|
124
|
+
</tr>
|
125
|
+
<% end %>
|
126
|
+
</tbody>
|
127
|
+
</table>
|
128
|
+
</div>
|
129
|
+
</div>
|
130
|
+
</div>
|
131
|
+
<% end %>
|
@@ -0,0 +1,7 @@
|
|
1
|
+
<tr id="<%= dom_id(conversation) %>" class="raif-conversation">
|
2
|
+
<td><%= link_to "##{conversation.id}", raif.admin_conversation_path(conversation) %></td>
|
3
|
+
<td><small class="text-muted"><%= conversation.created_at.rfc822 %></small></td>
|
4
|
+
<td><%= conversation.creator_type %> #<%= conversation.creator_id %></td>
|
5
|
+
<td><%= conversation.type %></td>
|
6
|
+
<td><%= conversation.conversation_entries_count %></td>
|
7
|
+
</tr>
|
@@ -0,0 +1,34 @@
|
|
1
|
+
<div class="list-group-item">
|
2
|
+
<div class="d-flex w-100 justify-content-between">
|
3
|
+
<div class="d-flex align-items-center gap-2">
|
4
|
+
<h5 class="mb-1"><%= t("raif.admin.common.entry") %> #<%= entry.id %></h5>
|
5
|
+
<% if entry.completed_at? %>
|
6
|
+
<span class="badge bg-success"><%= t("raif.admin.common.completed") %></span>
|
7
|
+
<% elsif entry.failed_at? %>
|
8
|
+
<span class="badge bg-danger"><%= t("raif.admin.common.failed") %></span>
|
9
|
+
<% elsif entry.started_at? %>
|
10
|
+
<span class="badge bg-warning text-dark"><%= t("raif.admin.common.in_progress") %></span>
|
11
|
+
<% else %>
|
12
|
+
<span class="badge bg-secondary"><%= t("raif.admin.common.pending") %></span>
|
13
|
+
<% end %>
|
14
|
+
</div>
|
15
|
+
|
16
|
+
<span><%= entry.llm_model_key %></span>
|
17
|
+
|
18
|
+
<small class="text-muted"><%= entry.created_at.rfc822 %></small>
|
19
|
+
|
20
|
+
<% if entry.raif_model_completion.present? %>
|
21
|
+
<%= link_to t("raif.admin.common.model_completion"), raif.admin_model_completion_path(entry.raif_model_completion) %>
|
22
|
+
<% end %>
|
23
|
+
</div>
|
24
|
+
<div class="mb-3">
|
25
|
+
<strong><%= t("raif.admin.common.user_message") %>:</strong>
|
26
|
+
<pre class="mt-2"><%= entry.user_message %></pre>
|
27
|
+
</div>
|
28
|
+
<% if entry.model_response_message.present? %>
|
29
|
+
<div class="mb-3">
|
30
|
+
<strong><%= t("raif.admin.common.model_response") %>:</strong>
|
31
|
+
<pre class="mt-2"><%= entry.model_response_message %></pre>
|
32
|
+
</div>
|
33
|
+
<% end %>
|
34
|
+
</div>
|
@@ -0,0 +1,32 @@
|
|
1
|
+
<h1 class="my-4"><%= t("raif.admin.common.conversations") %></h1>
|
2
|
+
|
3
|
+
<div class="row">
|
4
|
+
<div class="col-12">
|
5
|
+
<% if @conversations.any? %>
|
6
|
+
<div class="table-responsive">
|
7
|
+
<table class="table table-striped table-hover">
|
8
|
+
<thead class="table-light">
|
9
|
+
<tr>
|
10
|
+
<th><%= t("raif.admin.common.id") %></th>
|
11
|
+
<th><%= t("raif.admin.common.created_at") %></th>
|
12
|
+
<th><%= t("raif.admin.common.creator") %></th>
|
13
|
+
<th><%= t("raif.admin.common.type") %></th>
|
14
|
+
<th><%= t("raif.admin.common.entries_count") %></th>
|
15
|
+
</tr>
|
16
|
+
</thead>
|
17
|
+
<tbody>
|
18
|
+
<%= render collection: @conversations, partial: "raif/admin/conversations/conversation" %>
|
19
|
+
</tbody>
|
20
|
+
</table>
|
21
|
+
</div>
|
22
|
+
|
23
|
+
<div class="mt-4">
|
24
|
+
<%== pagy_bootstrap_nav(@pagy) %>
|
25
|
+
</div>
|
26
|
+
<% else %>
|
27
|
+
<div class="alert alert-info">
|
28
|
+
<%= t("raif.admin.common.no_conversations") %>
|
29
|
+
</div>
|
30
|
+
<% end %>
|
31
|
+
</div>
|
32
|
+
</div>
|
@@ -0,0 +1,56 @@
|
|
1
|
+
<div class="d-flex justify-content-between align-items-center my-4">
|
2
|
+
<h1><%= t(".title", id: @conversation.id) %></h1>
|
3
|
+
<%= link_to t(".back_to_conversations"), raif.admin_conversations_path, class: "btn btn-outline-secondary" %>
|
4
|
+
</div>
|
5
|
+
|
6
|
+
<div class="card mb-4">
|
7
|
+
<div class="card-header">
|
8
|
+
<h5 class="mb-0"><%= t("raif.admin.common.details") %></h5>
|
9
|
+
</div>
|
10
|
+
<div class="card-body">
|
11
|
+
<div class="row mb-3">
|
12
|
+
<div class="col-md-3"><strong><%= t("raif.admin.common.id") %>:</strong></div>
|
13
|
+
<div class="col-md-9"><%= @conversation.id %></div>
|
14
|
+
</div>
|
15
|
+
<div class="row mb-3">
|
16
|
+
<div class="col-md-3"><strong><%= t("raif.admin.common.creator") %>:</strong></div>
|
17
|
+
<div class="col-md-9"><%= @conversation.creator_type %> #<%= @conversation.creator_id %></div>
|
18
|
+
</div>
|
19
|
+
<div class="row mb-3">
|
20
|
+
<div class="col-md-3"><strong><%= t("raif.admin.common.type") %>:</strong></div>
|
21
|
+
<div class="col-md-9"><%= @conversation.type %></div>
|
22
|
+
</div>
|
23
|
+
<div class="row mb-3">
|
24
|
+
<div class="col-md-3"><strong><%= t("raif.admin.common.created_at") %>:</strong></div>
|
25
|
+
<div class="col-md-9"><%= @conversation.created_at.rfc822 %></div>
|
26
|
+
</div>
|
27
|
+
<div class="row mb-3">
|
28
|
+
<div class="col-md-3"><strong><%= t("raif.admin.common.entries_count") %>:</strong></div>
|
29
|
+
<div class="col-md-9"><%= @conversation.conversation_entries_count %></div>
|
30
|
+
</div>
|
31
|
+
</div>
|
32
|
+
</div>
|
33
|
+
|
34
|
+
<div class="card mb-4">
|
35
|
+
<div class="card-header">
|
36
|
+
<h5 class="mb-0"><%= t("raif.admin.common.system_prompt") %></h5>
|
37
|
+
</div>
|
38
|
+
<div class="card-body">
|
39
|
+
<pre><%= @conversation.entries.last&.system_prompt %></pre>
|
40
|
+
</div>
|
41
|
+
</div>
|
42
|
+
|
43
|
+
<% if @conversation.entries.any? %>
|
44
|
+
<div class="card mb-4">
|
45
|
+
<div class="card-header">
|
46
|
+
<h5 class="mb-0"><%= t("raif.admin.common.conversation_entries") %></h5>
|
47
|
+
</div>
|
48
|
+
<div class="card-body">
|
49
|
+
<div class="list-group">
|
50
|
+
<%= render collection: @conversation.entries.order(created_at: :asc).includes(:raif_model_completion),
|
51
|
+
partial: "raif/admin/conversations/conversation_entry",
|
52
|
+
as: :entry %>
|
53
|
+
</div>
|
54
|
+
</div>
|
55
|
+
</div>
|
56
|
+
<% end %>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<tr id="<%= dom_id(model_completion) %>" class="raif-model-completion">
|
2
|
+
<td><%= link_to "##{model_completion.id}", raif.admin_model_completion_path(model_completion) %></td>
|
3
|
+
<td><small class="text-muted"><%= model_completion.created_at.rfc822 %></small></td>
|
4
|
+
<td><%= model_completion.source_type %> #<%= model_completion.source_id %></td>
|
5
|
+
<td><%= model_completion.llm_model_key %></td>
|
6
|
+
<td><%= model_completion.response_format %></td>
|
7
|
+
<td><%= model_completion.total_tokens ? number_with_delimiter(model_completion.total_tokens) : "-" %></td>
|
8
|
+
<td><small class="text-muted"><%= truncate(model_completion.raw_response, length: 100) %></small></td>
|
9
|
+
</tr>
|
@@ -0,0 +1,34 @@
|
|
1
|
+
<h1 class="my-4"><%= t("raif.admin.common.model_completions") %></h1>
|
2
|
+
|
3
|
+
<div class="row">
|
4
|
+
<div class="col-12">
|
5
|
+
<% if @model_completions.any? %>
|
6
|
+
<div class="table-responsive">
|
7
|
+
<table class="table table-striped table-hover">
|
8
|
+
<thead class="table-light">
|
9
|
+
<tr>
|
10
|
+
<th><%= t("raif.admin.common.id") %></th>
|
11
|
+
<th><%= t("raif.admin.common.created_at") %></th>
|
12
|
+
<th><%= t("raif.admin.common.source") %></th>
|
13
|
+
<th><%= t("raif.admin.common.model") %></th>
|
14
|
+
<th><%= t("raif.admin.common.response_format") %></th>
|
15
|
+
<th><%= t("raif.admin.common.total_tokens") %></th>
|
16
|
+
<th><%= t("raif.admin.common.response") %></th>
|
17
|
+
</tr>
|
18
|
+
</thead>
|
19
|
+
<tbody>
|
20
|
+
<%= render partial: "raif/admin/model_completions/model_completion", collection: @model_completions %>
|
21
|
+
</tbody>
|
22
|
+
</table>
|
23
|
+
</div>
|
24
|
+
|
25
|
+
<div class="mt-4">
|
26
|
+
<%== pagy_bootstrap_nav(@pagy) %>
|
27
|
+
</div>
|
28
|
+
<% else %>
|
29
|
+
<div class="alert alert-info">
|
30
|
+
<%= t("raif.admin.common.no_model_completions") %>
|
31
|
+
</div>
|
32
|
+
<% end %>
|
33
|
+
</div>
|
34
|
+
</div>
|
@@ -0,0 +1,117 @@
|
|
1
|
+
<div class="d-flex justify-content-between align-items-center my-4">
|
2
|
+
<h1><%= t(".title", id: @model_completion.id) %></h1>
|
3
|
+
<%= link_to t(".back_to_model_completions"), raif.admin_model_completions_path, class: "btn btn-outline-secondary" %>
|
4
|
+
</div>
|
5
|
+
|
6
|
+
<div class="card mb-4">
|
7
|
+
<div class="card-header">
|
8
|
+
<h5 class="mb-0"><%= t("raif.admin.common.details") %></h5>
|
9
|
+
</div>
|
10
|
+
<div class="card-body">
|
11
|
+
<div class="row mb-3">
|
12
|
+
<div class="col-md-3"><strong><%= t("raif.admin.common.id") %>:</strong></div>
|
13
|
+
<div class="col-md-9"><%= @model_completion.id %></div>
|
14
|
+
</div>
|
15
|
+
<div class="row mb-3">
|
16
|
+
<div class="col-md-3"><strong><%= t("raif.admin.common.source") %>:</strong></div>
|
17
|
+
<div class="col-md-9"><%= @model_completion.source_type %> #<%= @model_completion.source_id %></div>
|
18
|
+
</div>
|
19
|
+
<div class="row mb-3">
|
20
|
+
<div class="col-md-3"><strong><%= t("raif.admin.common.model") %>:</strong></div>
|
21
|
+
<div class="col-md-9"><%= @model_completion.llm_model_key %></div>
|
22
|
+
</div>
|
23
|
+
<div class="row mb-3">
|
24
|
+
<div class="col-md-3"><strong><%= t("raif.admin.common.response_format") %>:</strong></div>
|
25
|
+
<div class="col-md-9"><%= @model_completion.response_format %></div>
|
26
|
+
</div>
|
27
|
+
<div class="row mb-3">
|
28
|
+
<div class="col-md-3"><strong><%= t("raif.admin.common.response_format_parameter") %>:</strong></div>
|
29
|
+
<div class="col-md-9"><%= @model_completion.response_format_parameter %></div>
|
30
|
+
</div>
|
31
|
+
<div class="row mb-3">
|
32
|
+
<div class="col-md-3"><strong><%= t("raif.admin.common.created_at") %>:</strong></div>
|
33
|
+
<div class="col-md-9"><%= @model_completion.created_at.rfc822 %></div>
|
34
|
+
</div>
|
35
|
+
<div class="row mb-3">
|
36
|
+
<div class="col-md-3"><strong><%= t("raif.admin.common.prompt_tokens") %>:</strong></div>
|
37
|
+
<div class="col-md-9"><%= @model_completion.prompt_tokens ? number_with_delimiter(@model_completion.prompt_tokens) : "-" %></div>
|
38
|
+
</div>
|
39
|
+
<div class="row mb-3">
|
40
|
+
<div class="col-md-3"><strong><%= t("raif.admin.common.completion_tokens") %>:</strong></div>
|
41
|
+
<div class="col-md-9"><%= @model_completion.completion_tokens ? number_with_delimiter(@model_completion.completion_tokens) : "-" %></div>
|
42
|
+
</div>
|
43
|
+
<div class="row mb-3">
|
44
|
+
<div class="col-md-3"><strong><%= t("raif.admin.common.total_tokens") %>:</strong></div>
|
45
|
+
<div class="col-md-9"><%= @model_completion.total_tokens ? number_with_delimiter(@model_completion.total_tokens) : "-" %></div>
|
46
|
+
</div>
|
47
|
+
</div>
|
48
|
+
</div>
|
49
|
+
|
50
|
+
<% if @model_completion.messages.present? %>
|
51
|
+
<div class="card mb-4">
|
52
|
+
<div class="card-header">
|
53
|
+
<h5 class="mb-0"><%= t("raif.admin.common.messages") %></h5>
|
54
|
+
</div>
|
55
|
+
<div class="card-body">
|
56
|
+
<% @model_completion.messages.each do |message| %>
|
57
|
+
<div class="mb-3">
|
58
|
+
<strong><%= message["role"].titleize %>:</strong>
|
59
|
+
<pre class="mt-2"><%= message["content"] %></pre>
|
60
|
+
</div>
|
61
|
+
<% end %>
|
62
|
+
</div>
|
63
|
+
</div>
|
64
|
+
<% end %>
|
65
|
+
|
66
|
+
<% if @model_completion.system_prompt.present? %>
|
67
|
+
<div class="card mb-4">
|
68
|
+
<div class="card-header">
|
69
|
+
<h5 class="mb-0"><%= t("raif.admin.common.system_prompt") %></h5>
|
70
|
+
</div>
|
71
|
+
<div class="card-body">
|
72
|
+
<pre class="pre-wrap"><%= @model_completion.system_prompt %></pre>
|
73
|
+
</div>
|
74
|
+
</div>
|
75
|
+
<% end %>
|
76
|
+
|
77
|
+
<div class="card mb-4">
|
78
|
+
<div class="card-header">
|
79
|
+
<h5 class="mb-0"><%= t("raif.admin.common.response") %> (<%= @model_completion.response_format %>)</h5>
|
80
|
+
</div>
|
81
|
+
<div class="card-body">
|
82
|
+
<% if @model_completion.response_format_json? %>
|
83
|
+
<h5 class="mb-0"><%= t("raif.admin.common.raw") %></h5>
|
84
|
+
<pre class="pre-wrap"><%= @model_completion.raw_response %></pre>
|
85
|
+
|
86
|
+
<h5 class="mb-0 mt-4"><%= t("raif.admin.common.prettified") %></h5>
|
87
|
+
<% begin %>
|
88
|
+
<pre class="pre-wrap"><%= JSON.pretty_generate(@model_completion.parsed_response) %></pre>
|
89
|
+
<% rescue StandardError %>
|
90
|
+
<%= t("raif.admin.common.invalid_json") %>
|
91
|
+
<% end %>
|
92
|
+
<% elsif @model_completion.response_format_html? %>
|
93
|
+
<h5 class="mb-0"><%= t("raif.admin.common.raw") %></h5>
|
94
|
+
<pre class="pre-wrap"><%= @model_completion.raw_response %></pre>
|
95
|
+
|
96
|
+
<h5 class="mb-0 mt-4"><%= t("raif.admin.common.rendered") %></h5>
|
97
|
+
<div class="border p-3 bg-light">
|
98
|
+
<%= sanitize @model_completion.parsed_response %>
|
99
|
+
</div>
|
100
|
+
<% else %>
|
101
|
+
<pre class="pre-wrap"><%= @model_completion.raw_response %></pre>
|
102
|
+
<% end %>
|
103
|
+
</div>
|
104
|
+
</div>
|
105
|
+
|
106
|
+
<div class="card mb-4">
|
107
|
+
<div class="card-header">
|
108
|
+
<h5 class="mb-0"><%= t("raif.admin.common.tool_calls") %></h5>
|
109
|
+
</div>
|
110
|
+
<div class="card-body">
|
111
|
+
<% if @model_completion.response_tool_calls.present? %>
|
112
|
+
<pre class="pre-wrap"><%= JSON.pretty_generate(@model_completion.response_tool_calls) %></pre>
|
113
|
+
<% else %>
|
114
|
+
<%= t("raif.admin.common.no_tool_calls") %>
|
115
|
+
<% end %>
|
116
|
+
</div>
|
117
|
+
</div>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<tr id="<%= dom_id(model_tool_invocation) %>" class="raif-model-tool-invocation">
|
2
|
+
<td><%= link_to "##{model_tool_invocation.id}", raif.admin_model_tool_invocation_path(model_tool_invocation) %></td>
|
3
|
+
<td><small class="text-muted"><%= model_tool_invocation.created_at.rfc822 %></small></td>
|
4
|
+
<td><%= model_tool_invocation.source_type %> #<%= model_tool_invocation.source_id %></td>
|
5
|
+
<td><%= model_tool_invocation.tool_type.demodulize %></td>
|
6
|
+
<td>
|
7
|
+
<% if model_tool_invocation.completed_at? %>
|
8
|
+
<span class="badge bg-success"><%= t("raif.admin.common.completed") %></span>
|
9
|
+
<% elsif model_tool_invocation.failed_at? %>
|
10
|
+
<span class="badge bg-danger"><%= t("raif.admin.common.failed") %></span>
|
11
|
+
<% else %>
|
12
|
+
<span class="badge bg-secondary"><%= t("raif.admin.common.pending") %></span>
|
13
|
+
<% end %>
|
14
|
+
</td>
|
15
|
+
<td><small class="text-muted"><%= truncate(model_tool_invocation.tool_arguments.to_json, length: 100) %></small></td>
|
16
|
+
</tr>
|
@@ -0,0 +1,33 @@
|
|
1
|
+
<h1 class="my-4"><%= t("raif.admin.common.model_tool_invocations") %></h1>
|
2
|
+
|
3
|
+
<div class="row">
|
4
|
+
<div class="col-12">
|
5
|
+
<% if @model_tool_invocations.any? %>
|
6
|
+
<div class="table-responsive">
|
7
|
+
<table class="table table-striped table-hover">
|
8
|
+
<thead class="table-light">
|
9
|
+
<tr>
|
10
|
+
<th><%= t("raif.admin.common.id") %></th>
|
11
|
+
<th><%= t("raif.admin.common.created_at") %></th>
|
12
|
+
<th><%= t("raif.admin.common.source") %></th>
|
13
|
+
<th><%= t("raif.admin.common.tool_type") %></th>
|
14
|
+
<th><%= t("raif.admin.common.status") %></th>
|
15
|
+
<th><%= t("raif.admin.common.tool_arguments") %></th>
|
16
|
+
</tr>
|
17
|
+
</thead>
|
18
|
+
<tbody>
|
19
|
+
<%= render partial: "raif/admin/model_tool_invocations/model_tool_invocation", collection: @model_tool_invocations %>
|
20
|
+
</tbody>
|
21
|
+
</table>
|
22
|
+
</div>
|
23
|
+
|
24
|
+
<div class="mt-4">
|
25
|
+
<%== pagy_bootstrap_nav(@pagy) %>
|
26
|
+
</div>
|
27
|
+
<% else %>
|
28
|
+
<div class="alert alert-info">
|
29
|
+
<%= t("raif.admin.common.no_model_tool_invocations") %>
|
30
|
+
</div>
|
31
|
+
<% end %>
|
32
|
+
</div>
|
33
|
+
</div>
|
@@ -0,0 +1,66 @@
|
|
1
|
+
<div class="d-flex justify-content-between align-items-center my-4">
|
2
|
+
<h1><%= t(".title", id: @model_tool_invocation.id) %></h1>
|
3
|
+
<%= link_to t(".back_to_model_tool_invocations"), raif.admin_model_tool_invocations_path, class: "btn btn-outline-secondary" %>
|
4
|
+
</div>
|
5
|
+
|
6
|
+
<div class="card mb-4">
|
7
|
+
<div class="card-header">
|
8
|
+
<h5 class="mb-0"><%= t("raif.admin.common.details") %></h5>
|
9
|
+
</div>
|
10
|
+
<div class="card-body">
|
11
|
+
<div class="row mb-3">
|
12
|
+
<div class="col-md-3"><strong><%= t("raif.admin.common.id") %>:</strong></div>
|
13
|
+
<div class="col-md-9"><%= @model_tool_invocation.id %></div>
|
14
|
+
</div>
|
15
|
+
<div class="row mb-3">
|
16
|
+
<div class="col-md-3"><strong><%= t("raif.admin.common.source") %>:</strong></div>
|
17
|
+
<div class="col-md-9"><%= @model_tool_invocation.source_type %> #<%= @model_tool_invocation.source_id %></div>
|
18
|
+
</div>
|
19
|
+
<div class="row mb-3">
|
20
|
+
<div class="col-md-3"><strong><%= t("raif.admin.common.tool_type") %>:</strong></div>
|
21
|
+
<div class="col-md-9"><%= @model_tool_invocation.tool_type %></div>
|
22
|
+
</div>
|
23
|
+
<div class="row mb-3">
|
24
|
+
<div class="col-md-3"><strong><%= t("raif.admin.common.tool_name") %>:</strong></div>
|
25
|
+
<div class="col-md-9"><%= @model_tool_invocation.tool_name %></div>
|
26
|
+
</div>
|
27
|
+
<div class="row mb-3">
|
28
|
+
<div class="col-md-3"><strong><%= t("raif.admin.common.created_at") %>:</strong></div>
|
29
|
+
<div class="col-md-9"><%= @model_tool_invocation.created_at.rfc822 %></div>
|
30
|
+
</div>
|
31
|
+
<div class="row mb-3">
|
32
|
+
<div class="col-md-3"><strong><%= t("raif.admin.common.status") %>:</strong></div>
|
33
|
+
<div class="col-md-9">
|
34
|
+
<% if @model_tool_invocation.completed? %>
|
35
|
+
<span class="badge bg-success"><%= t("raif.admin.common.completed") %></span>
|
36
|
+
<small class="text-muted ms-2"><%= @model_tool_invocation.completed_at.rfc822 %></small>
|
37
|
+
<% elsif @model_tool_invocation.failed? %>
|
38
|
+
<span class="badge bg-danger"><%= t("raif.admin.common.failed") %></span>
|
39
|
+
<small class="text-muted ms-2"><%= @model_tool_invocation.failed_at.rfc822 %></small>
|
40
|
+
<% else %>
|
41
|
+
<span class="badge bg-secondary"><%= t("raif.admin.common.pending") %></span>
|
42
|
+
<% end %>
|
43
|
+
</div>
|
44
|
+
</div>
|
45
|
+
</div>
|
46
|
+
</div>
|
47
|
+
|
48
|
+
<div class="card mb-4">
|
49
|
+
<div class="card-header">
|
50
|
+
<h5 class="mb-0"><%= t("raif.admin.common.tool_arguments") %></h5>
|
51
|
+
</div>
|
52
|
+
<div class="card-body">
|
53
|
+
<pre class="pre-wrap"><%= JSON.pretty_generate(@model_tool_invocation.tool_arguments) %></pre>
|
54
|
+
</div>
|
55
|
+
</div>
|
56
|
+
|
57
|
+
<% if @model_tool_invocation.result.present? %>
|
58
|
+
<div class="card mb-4">
|
59
|
+
<div class="card-header">
|
60
|
+
<h5 class="mb-0"><%= t("raif.admin.common.result") %></h5>
|
61
|
+
</div>
|
62
|
+
<div class="card-body">
|
63
|
+
<pre class="pre-wrap"><%= JSON.pretty_generate(@model_tool_invocation.result) %></pre>
|
64
|
+
</div>
|
65
|
+
</div>
|
66
|
+
<% end %>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<tr id="<%= dom_id(task) %>" class="raif-task">
|
2
|
+
<td><%= link_to "##{task.id}", raif.admin_task_path(task) %></td>
|
3
|
+
<td><%= task.type %></td>
|
4
|
+
<td><small class="text-muted"><%= task.created_at.rfc822 %></small></td>
|
5
|
+
<td><%= task.creator_type %> #<%= task.creator_id %></td>
|
6
|
+
<td><%= task.llm_model_key %></td>
|
7
|
+
<td>
|
8
|
+
<% if task.completed_at? %>
|
9
|
+
<span class="badge bg-success"><%= t("raif.admin.common.completed") %></span>
|
10
|
+
<% elsif task.failed_at? %>
|
11
|
+
<span class="badge bg-danger"><%= t("raif.admin.common.failed") %></span>
|
12
|
+
<% elsif task.started_at? %>
|
13
|
+
<span class="badge bg-warning text-dark"><%= t("raif.admin.common.in_progress") %></span>
|
14
|
+
<% else %>
|
15
|
+
<span class="badge bg-secondary"><%= t("raif.admin.common.pending") %></span>
|
16
|
+
<% end %>
|
17
|
+
</td>
|
18
|
+
<td><small class="text-muted"><%= truncate(task.prompt, length: 100) %></small></td>
|
19
|
+
</tr>
|
@@ -0,0 +1,49 @@
|
|
1
|
+
<h1 class="my-4"><%= t("raif.admin.common.tasks") %></h1>
|
2
|
+
|
3
|
+
<div class="row">
|
4
|
+
<div class="col-12">
|
5
|
+
<%= form_tag raif.admin_tasks_path, method: :get, class: "mb-4" do %>
|
6
|
+
<div class="row align-items-end">
|
7
|
+
<div class="col-md-6">
|
8
|
+
<div class="form-group">
|
9
|
+
<%= select_tag :task_types,
|
10
|
+
options_for_select(@task_types.map{|type| [type, type] }, @selected_types),
|
11
|
+
{ class: "form-select" } %>
|
12
|
+
</div>
|
13
|
+
</div>
|
14
|
+
<div class="col-md-2">
|
15
|
+
<%= submit_tag t("raif.admin.common.filter"), class: "btn btn-primary" %>
|
16
|
+
</div>
|
17
|
+
</div>
|
18
|
+
<% end %>
|
19
|
+
|
20
|
+
<% if @tasks.any? %>
|
21
|
+
<div class="table-responsive">
|
22
|
+
<table class="table table-striped table-hover">
|
23
|
+
<thead class="table-light">
|
24
|
+
<tr>
|
25
|
+
<th><%= t("raif.admin.common.id") %></th>
|
26
|
+
<th><%= t("raif.admin.common.type") %></th>
|
27
|
+
<th><%= t("raif.admin.common.created_at") %></th>
|
28
|
+
<th><%= t("raif.admin.common.creator") %></th>
|
29
|
+
<th><%= t("raif.admin.common.model") %></th>
|
30
|
+
<th><%= t("raif.admin.common.status") %></th>
|
31
|
+
<th><%= t("raif.admin.common.prompt") %></th>
|
32
|
+
</tr>
|
33
|
+
</thead>
|
34
|
+
<tbody>
|
35
|
+
<%= render partial: "raif/admin/tasks/task", collection: @tasks %>
|
36
|
+
</tbody>
|
37
|
+
</table>
|
38
|
+
</div>
|
39
|
+
|
40
|
+
<div class="mt-4">
|
41
|
+
<%== pagy_bootstrap_nav(@pagy) %>
|
42
|
+
</div>
|
43
|
+
<% else %>
|
44
|
+
<div class="alert alert-info">
|
45
|
+
<%= t("raif.admin.common.no_tasks") %>
|
46
|
+
</div>
|
47
|
+
<% end %>
|
48
|
+
</div>
|
49
|
+
</div>
|