raif 1.3.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (206) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +8 -7
  3. data/app/assets/builds/raif.css +4 -1
  4. data/app/assets/builds/raif_admin.css +52 -2
  5. data/app/assets/builds/raif_admin_sprockets.js +2709 -0
  6. data/app/assets/javascript/raif/admin/copy_to_clipboard_controller.js +132 -0
  7. data/app/assets/javascript/raif/admin/cost_estimate_controller.js +80 -0
  8. data/app/assets/javascript/raif/admin/judge_config_controller.js +23 -0
  9. data/app/assets/javascript/raif/admin/select_all_checkboxes_controller.js +33 -0
  10. data/app/assets/javascript/raif/admin/sortable_table_controller.js +51 -0
  11. data/app/assets/javascript/raif/admin/table_search_controller.js +15 -0
  12. data/app/assets/javascript/raif/admin/tom_select_controller.js +33 -0
  13. data/app/assets/javascript/raif/controllers/conversations_controller.js +1 -1
  14. data/app/assets/javascript/raif_admin.js +23 -0
  15. data/app/assets/javascript/raif_admin_sprockets.js +24 -0
  16. data/app/assets/stylesheets/raif/admin/conversation.scss +16 -0
  17. data/app/assets/stylesheets/raif/conversations.scss +3 -0
  18. data/app/assets/stylesheets/raif.scss +2 -1
  19. data/app/assets/stylesheets/raif_admin.scss +50 -1
  20. data/app/controllers/raif/admin/agents_controller.rb +27 -1
  21. data/app/controllers/raif/admin/application_controller.rb +16 -0
  22. data/app/controllers/raif/admin/configs_controller.rb +95 -0
  23. data/app/controllers/raif/admin/llms_controller.rb +27 -0
  24. data/app/controllers/raif/admin/model_completions_controller.rb +24 -1
  25. data/app/controllers/raif/admin/model_tool_invocations_controller.rb +7 -1
  26. data/app/controllers/raif/admin/prompt_studio/agents_controller.rb +25 -0
  27. data/app/controllers/raif/admin/prompt_studio/base_controller.rb +32 -0
  28. data/app/controllers/raif/admin/prompt_studio/batch_runs_controller.rb +102 -0
  29. data/app/controllers/raif/admin/prompt_studio/conversations_controller.rb +25 -0
  30. data/app/controllers/raif/admin/prompt_studio/tasks_controller.rb +64 -0
  31. data/app/controllers/raif/admin/stats/model_tool_invocations_controller.rb +21 -0
  32. data/app/controllers/raif/admin/stats/tasks_controller.rb +15 -6
  33. data/app/controllers/raif/admin/stats_controller.rb +32 -3
  34. data/app/controllers/raif/admin/tasks_controller.rb +5 -0
  35. data/app/controllers/raif/conversation_entries_controller.rb +1 -0
  36. data/app/controllers/raif/conversations_controller.rb +10 -2
  37. data/app/helpers/raif/application_helper.rb +40 -0
  38. data/app/jobs/raif/conversation_entry_job.rb +8 -6
  39. data/app/jobs/raif/prompt_studio_batch_run_item_job.rb +11 -0
  40. data/app/jobs/raif/prompt_studio_batch_run_job.rb +15 -0
  41. data/app/jobs/raif/prompt_studio_task_run_job.rb +36 -0
  42. data/app/models/raif/admin/task_stat.rb +7 -0
  43. data/app/models/raif/agent.rb +98 -6
  44. data/app/models/raif/agents/native_tool_calling_agent.rb +179 -52
  45. data/app/models/raif/application_record.rb +18 -0
  46. data/app/models/raif/concerns/agent_inference_stats.rb +35 -0
  47. data/app/models/raif/concerns/has_prompt_templates.rb +88 -0
  48. data/app/models/raif/concerns/has_runtime_duration.rb +41 -0
  49. data/app/models/raif/concerns/json_schema_definition.rb +54 -6
  50. data/app/models/raif/concerns/llm_prompt_caching.rb +20 -0
  51. data/app/models/raif/concerns/llms/anthropic/message_formatting.rb +34 -0
  52. data/app/models/raif/concerns/llms/anthropic/response_tool_calls.rb +24 -0
  53. data/app/models/raif/concerns/llms/anthropic/tool_formatting.rb +8 -0
  54. data/app/models/raif/concerns/llms/bedrock/message_formatting.rb +43 -0
  55. data/app/models/raif/concerns/llms/bedrock/response_tool_calls.rb +26 -0
  56. data/app/models/raif/concerns/llms/bedrock/tool_formatting.rb +8 -0
  57. data/app/models/raif/concerns/llms/google/message_formatting.rb +112 -0
  58. data/app/models/raif/concerns/llms/google/response_tool_calls.rb +32 -0
  59. data/app/models/raif/concerns/llms/google/tool_formatting.rb +76 -0
  60. data/app/models/raif/concerns/llms/message_formatting.rb +41 -5
  61. data/app/models/raif/concerns/llms/open_ai/json_schema_validation.rb +3 -3
  62. data/app/models/raif/concerns/llms/open_ai_completions/message_formatting.rb +22 -0
  63. data/app/models/raif/concerns/llms/open_ai_completions/response_tool_calls.rb +22 -0
  64. data/app/models/raif/concerns/llms/open_ai_completions/tool_formatting.rb +8 -0
  65. data/app/models/raif/concerns/llms/open_ai_responses/message_formatting.rb +17 -0
  66. data/app/models/raif/concerns/llms/open_ai_responses/response_tool_calls.rb +26 -0
  67. data/app/models/raif/concerns/llms/open_ai_responses/tool_formatting.rb +8 -0
  68. data/app/models/raif/concerns/provider_managed_tool_calls.rb +162 -0
  69. data/app/models/raif/concerns/run_with.rb +127 -0
  70. data/app/models/raif/conversation.rb +112 -8
  71. data/app/models/raif/conversation_entry.rb +38 -4
  72. data/app/models/raif/embedding_model.rb +2 -1
  73. data/app/models/raif/embedding_models/bedrock.rb +10 -1
  74. data/app/models/raif/embedding_models/google.rb +37 -0
  75. data/app/models/raif/embedding_models/open_ai.rb +1 -1
  76. data/app/models/raif/evals/llm_judge.rb +70 -0
  77. data/{lib → app/models}/raif/evals/llm_judges/binary.rb +41 -3
  78. data/{lib → app/models}/raif/evals/llm_judges/comparative.rb +41 -3
  79. data/{lib → app/models}/raif/evals/llm_judges/scored.rb +39 -1
  80. data/{lib → app/models}/raif/evals/llm_judges/summarization.rb +40 -2
  81. data/app/models/raif/llm.rb +104 -4
  82. data/app/models/raif/llms/anthropic.rb +32 -22
  83. data/app/models/raif/llms/bedrock.rb +64 -24
  84. data/app/models/raif/llms/google.rb +166 -0
  85. data/app/models/raif/llms/open_ai_base.rb +23 -5
  86. data/app/models/raif/llms/open_ai_completions.rb +14 -12
  87. data/app/models/raif/llms/open_ai_responses.rb +14 -17
  88. data/app/models/raif/llms/open_router.rb +16 -15
  89. data/app/models/raif/model_completion.rb +103 -1
  90. data/app/models/raif/model_tool.rb +55 -5
  91. data/app/models/raif/model_tool_invocation.rb +68 -6
  92. data/app/models/raif/model_tools/agent_final_answer.rb +2 -7
  93. data/app/models/raif/model_tools/provider_managed/code_execution.rb +4 -0
  94. data/app/models/raif/model_tools/provider_managed/image_generation.rb +4 -0
  95. data/app/models/raif/model_tools/provider_managed/web_search.rb +4 -0
  96. data/app/models/raif/prompt_studio_batch_run.rb +155 -0
  97. data/app/models/raif/prompt_studio_batch_run_item.rb +220 -0
  98. data/app/models/raif/streaming_responses/bedrock.rb +60 -1
  99. data/app/models/raif/streaming_responses/google.rb +71 -0
  100. data/app/models/raif/task.rb +85 -18
  101. data/app/models/raif/user_tool_invocation.rb +19 -0
  102. data/app/views/layouts/raif/admin.html.erb +43 -2
  103. data/app/views/raif/admin/agents/_agent.html.erb +9 -0
  104. data/app/views/raif/admin/agents/_conversation_message.html.erb +28 -6
  105. data/app/views/raif/admin/agents/index.html.erb +50 -0
  106. data/app/views/raif/admin/agents/show.html.erb +50 -1
  107. data/app/views/raif/admin/configs/show.html.erb +117 -0
  108. data/app/views/raif/admin/conversations/_conversation_entry.html.erb +29 -34
  109. data/app/views/raif/admin/conversations/show.html.erb +2 -0
  110. data/app/views/raif/admin/llms/index.html.erb +110 -0
  111. data/app/views/raif/admin/model_completions/_model_completion.html.erb +10 -5
  112. data/app/views/raif/admin/model_completions/index.html.erb +40 -1
  113. data/app/views/raif/admin/model_completions/show.html.erb +256 -84
  114. data/app/views/raif/admin/model_tool_invocations/index.html.erb +22 -1
  115. data/app/views/raif/admin/model_tool_invocations/show.html.erb +18 -0
  116. data/app/views/raif/admin/model_tools/_list.html.erb +16 -0
  117. data/app/views/raif/admin/model_tools/_model_tool.html.erb +36 -0
  118. data/app/views/raif/admin/prompt_studio/agents/index.html.erb +56 -0
  119. data/app/views/raif/admin/prompt_studio/agents/show.html.erb +57 -0
  120. data/app/views/raif/admin/prompt_studio/batch_runs/_batch_run_item.html.erb +54 -0
  121. data/app/views/raif/admin/prompt_studio/batch_runs/_judge_config_fields.html.erb +76 -0
  122. data/app/views/raif/admin/prompt_studio/batch_runs/_judge_detail_modal.html.erb +27 -0
  123. data/app/views/raif/admin/prompt_studio/batch_runs/_modal.html.erb +35 -0
  124. data/app/views/raif/admin/prompt_studio/batch_runs/_progress.html.erb +78 -0
  125. data/app/views/raif/admin/prompt_studio/batch_runs/show.html.erb +49 -0
  126. data/app/views/raif/admin/prompt_studio/conversations/index.html.erb +48 -0
  127. data/app/views/raif/admin/prompt_studio/conversations/show.html.erb +36 -0
  128. data/app/views/raif/admin/prompt_studio/shared/_nav_tabs.html.erb +17 -0
  129. data/app/views/raif/admin/prompt_studio/shared/_prompt_comparison.html.erb +87 -0
  130. data/app/views/raif/admin/prompt_studio/shared/_type_filter.html.erb +54 -0
  131. data/app/views/raif/admin/prompt_studio/tasks/_task_result.html.erb +145 -0
  132. data/app/views/raif/admin/prompt_studio/tasks/_task_row.html.erb +12 -0
  133. data/app/views/raif/admin/prompt_studio/tasks/_task_type_filter.html.erb +58 -0
  134. data/app/views/raif/admin/prompt_studio/tasks/_tasks_table.html.erb +22 -0
  135. data/app/views/raif/admin/prompt_studio/tasks/index.html.erb +35 -0
  136. data/app/views/raif/admin/prompt_studio/tasks/show.html.erb +19 -0
  137. data/app/views/raif/admin/stats/_stats_tile.html.erb +34 -0
  138. data/app/views/raif/admin/stats/index.html.erb +71 -88
  139. data/app/views/raif/admin/stats/model_tool_invocations/index.html.erb +43 -0
  140. data/app/views/raif/admin/stats/tasks/index.html.erb +20 -6
  141. data/app/views/raif/admin/tasks/_task.html.erb +1 -0
  142. data/app/views/raif/admin/tasks/index.html.erb +23 -6
  143. data/app/views/raif/admin/tasks/show.html.erb +56 -3
  144. data/app/views/raif/conversation_entries/_form.html.erb +3 -0
  145. data/app/views/raif/conversation_entries/_message.html.erb +10 -6
  146. data/app/views/raif/conversations/_conversation.html.erb +10 -0
  147. data/app/views/raif/conversations/_entry_processed.turbo_stream.erb +12 -0
  148. data/app/views/raif/conversations/index.html.erb +23 -0
  149. data/config/importmap.rb +8 -0
  150. data/config/locales/admin.en.yml +161 -1
  151. data/config/locales/en.yml +67 -4
  152. data/config/routes.rb +10 -0
  153. data/db/migrate/20250904194456_add_generating_entry_response_to_raif_conversations.rb +7 -0
  154. data/db/migrate/20250911125234_add_source_to_raif_tasks.rb +7 -0
  155. data/db/migrate/20251020005853_add_source_to_raif_agents.rb +7 -0
  156. data/db/migrate/20251020011346_rename_task_run_args_to_run_with.rb +7 -0
  157. data/db/migrate/20251020011405_add_run_with_to_raif_agents.rb +13 -0
  158. data/db/migrate/20251024160119_add_llm_messages_max_length_to_raif_conversations.rb +14 -0
  159. data/db/migrate/20251124185033_add_provider_tool_call_id_to_raif_model_tool_invocations.rb +7 -0
  160. data/db/migrate/20251128202941_add_tool_choice_to_raif_model_completions.rb +7 -0
  161. data/db/migrate/20260118144846_add_source_to_raif_conversations.rb +7 -0
  162. data/db/migrate/20260119000000_add_failure_tracking_to_raif_model_completions.rb +10 -0
  163. data/db/migrate/20260119000001_add_completed_at_to_raif_model_completions.rb +8 -0
  164. data/db/migrate/20260119000002_add_started_at_to_raif_model_completions.rb +8 -0
  165. data/db/migrate/20260307000000_add_prompt_studio_run_to_raif_tasks.rb +7 -0
  166. data/db/migrate/20260308000000_create_raif_prompt_studio_batch_runs.rb +27 -0
  167. data/db/migrate/20260308000001_create_raif_prompt_studio_batch_run_items.rb +24 -0
  168. data/db/migrate/20260407000000_add_cache_token_columns_to_raif_model_completions.rb +8 -0
  169. data/lib/generators/raif/agent/agent_generator.rb +18 -0
  170. data/lib/generators/raif/agent/templates/agent.rb.tt +7 -5
  171. data/lib/generators/raif/agent/templates/application_agent.rb.tt +1 -1
  172. data/lib/generators/raif/agent/templates/system_prompt.erb.tt +3 -0
  173. data/lib/generators/raif/conversation/conversation_generator.rb +19 -1
  174. data/lib/generators/raif/conversation/templates/conversation.rb.tt +6 -0
  175. data/lib/generators/raif/conversation/templates/system_prompt.erb.tt +4 -0
  176. data/lib/generators/raif/install/templates/initializer.rb +117 -8
  177. data/lib/generators/raif/task/task_generator.rb +18 -0
  178. data/lib/generators/raif/task/templates/prompt.erb.tt +4 -0
  179. data/lib/generators/raif/task/templates/task.rb.tt +10 -9
  180. data/lib/raif/configuration.rb +47 -2
  181. data/lib/raif/embedding_model_registry.rb +8 -0
  182. data/lib/raif/engine.rb +24 -1
  183. data/lib/raif/errors/blank_response_error.rb +8 -0
  184. data/lib/raif/errors/instance_dependent_schema_error.rb +8 -0
  185. data/lib/raif/errors/prompt_template_error.rb +15 -0
  186. data/lib/raif/errors/streaming_error.rb +6 -3
  187. data/lib/raif/errors.rb +3 -0
  188. data/lib/raif/evals/run.rb +1 -0
  189. data/lib/raif/evals.rb +0 -6
  190. data/lib/raif/json_schema_builder.rb +14 -0
  191. data/lib/raif/llm_registry.rb +433 -42
  192. data/lib/raif/messages.rb +180 -0
  193. data/lib/raif/prompt_studio_comparison_builder.rb +138 -0
  194. data/lib/raif/token_estimator.rb +28 -0
  195. data/lib/raif/version.rb +1 -1
  196. data/lib/raif.rb +11 -0
  197. data/lib/tasks/annotate_rb.rake +10 -0
  198. data/spec/support/rspec_helpers.rb +15 -9
  199. data/spec/support/test_task.rb +9 -0
  200. data/spec/support/test_template_task.rb +41 -0
  201. metadata +108 -15
  202. data/app/models/raif/agents/re_act_agent.rb +0 -127
  203. data/app/models/raif/agents/re_act_step.rb +0 -32
  204. data/app/models/raif/concerns/task_run_args.rb +0 -62
  205. data/lib/raif/evals/llm_judge.rb +0 -32
  206. /data/{lib → app/models}/raif/evals/scoring_rubric.rb +0 -0
@@ -1,18 +1,23 @@
1
- <h1 class="my-4"><%= t("raif.admin.common.tasks") %></h1>
1
+ <div class="d-flex justify-content-between align-items-center my-4">
2
+ <h1 class="mb-0"><%= t("raif.admin.common.tasks") %></h1>
3
+ <%= link_to raif.admin_stats_tasks_path, class: "btn btn-outline-primary" do %>
4
+ <%= t("raif.admin.common.stats") %> &raquo;
5
+ <% end %>
6
+ </div>
2
7
 
3
8
  <div class="row">
4
9
  <div class="col-12">
5
10
  <%= form_tag raif.admin_tasks_path, method: :get, class: "mb-4" do %>
6
11
  <div class="row align-items-end">
7
- <div class="col-md-4">
12
+ <div class="col-md-3">
8
13
  <div class="form-group">
9
14
  <label for="task_types"><%= t("raif.admin.common.type") %></label>
10
15
  <%= select_tag :task_types,
11
- options_for_select([["All", "all"]] + @task_types.map{|type| [type, type] }, @selected_type),
12
- { class: "form-select" } %>
16
+ options_for_select([[t("raif.admin.common.all"), "all"]] + @task_types.map{|type| [type, type] }, @selected_type),
17
+ { class: "form-select", data: { controller: "raif--tom-select" } } %>
13
18
  </div>
14
19
  </div>
15
- <div class="col-md-4">
20
+ <div class="col-md-3">
16
21
  <div class="form-group">
17
22
  <label for="task_statuses"><%= t("raif.admin.common.status") %></label>
18
23
  <%= select_tag :task_statuses,
@@ -26,7 +31,18 @@
26
31
  ],
27
32
  @selected_statuses
28
33
  ),
29
- { class: "form-select" } %>
34
+ { class: "form-select", data: { controller: "raif--tom-select" } } %>
35
+ </div>
36
+ </div>
37
+ <div class="col-md-3">
38
+ <div class="form-group">
39
+ <label for="llm_model_key"><%= t("raif.admin.common.model") %></label>
40
+ <%= select_tag :llm_model_key,
41
+ options_for_select(
42
+ [[t("raif.admin.common.all"), ""]] + @llm_model_keys.map { |key| [key, key] },
43
+ @selected_llm_model_key
44
+ ),
45
+ { class: "form-select", data: { controller: "raif--tom-select" } } %>
30
46
  </div>
31
47
  </div>
32
48
  <div class="col-md-2">
@@ -46,6 +62,7 @@
46
62
  <th><%= t("raif.admin.common.creator") %></th>
47
63
  <th><%= t("raif.admin.common.model") %></th>
48
64
  <th><%= t("raif.admin.common.status") %></th>
65
+ <th><%= t("raif.admin.common.duration") %></th>
49
66
  <th><%= t("raif.admin.common.prompt") %></th>
50
67
  </tr>
51
68
  </thead>
@@ -68,12 +68,24 @@
68
68
  <% end %>
69
69
  </div>
70
70
  </div>
71
+ <div class="row mb-3">
72
+ <div class="col-md-3"><strong><%= t("raif.admin.common.duration") %>:</strong></div>
73
+ <div class="col-md-9"><%= @task.runtime_duration %></div>
74
+ </div>
71
75
  <% if @task.requested_language_key.present? %>
72
76
  <div class="row mb-3">
73
77
  <div class="col-md-3"><strong><%= t("raif.admin.common.requested_language") %>:</strong></div>
74
78
  <div class="col-md-9"><%= @task.requested_language_key %></div>
75
79
  </div>
76
80
  <% end %>
81
+ <% if @task.run_with.present? %>
82
+ <div class="row mb-3">
83
+ <div class="col-md-3"><strong><%= t("raif.admin.common.run_with") %>:</strong></div>
84
+ <div class="col-md-9">
85
+ <pre class="pre-wrap mb-0"><%= JSON.pretty_generate(@task.run_with) %></pre>
86
+ </div>
87
+ </div>
88
+ <% end %>
77
89
  </div>
78
90
  </div>
79
91
 
@@ -93,22 +105,63 @@
93
105
  <div class="col-md-3"><strong><%= t("raif.admin.common.created_at") %>:</strong></div>
94
106
  <div class="col-md-9"><%= @task.raif_model_completion.created_at.rfc822 %></div>
95
107
  </div>
108
+ <div class="row mb-3">
109
+ <div class="col-md-3"><strong><%= t("raif.admin.common.retry_count") %>:</strong></div>
110
+ <div class="col-md-9"><%= @task.raif_model_completion.retry_count %></div>
111
+ </div>
96
112
  <div class="row mb-3">
97
113
  <div class="col-md-3"><strong><%= t("raif.admin.common.prompt_tokens") %>:</strong></div>
98
- <div class="col-md-9"><%= @task.raif_model_completion.prompt_tokens ? number_with_delimiter(@task.raif_model_completion.prompt_tokens) : "-" %></div>
114
+ <div class="col-md-9">
115
+ <% if @task.raif_model_completion.prompt_tokens %>
116
+ <%= number_with_delimiter(@task.raif_model_completion.prompt_tokens) %>
117
+ <% if @task.raif_model_completion.prompt_token_cost %>
118
+ <small>(<%= t("raif.admin.common.est_cost") %>: <%= "$" %><%= number_with_precision(@task.raif_model_completion.prompt_token_cost, precision: 6) %>)</small>
119
+ <% end %>
120
+ <% else %>
121
+ -
122
+ <% end %>
123
+ </div>
99
124
  </div>
100
125
  <div class="row mb-3">
101
126
  <div class="col-md-3"><strong><%= t("raif.admin.common.completion_tokens") %>:</strong></div>
102
- <div class="col-md-9"><%= @task.raif_model_completion.completion_tokens ? number_with_delimiter(@task.raif_model_completion.completion_tokens) : "-" %></div>
127
+ <div class="col-md-9">
128
+ <% if @task.raif_model_completion.completion_tokens %>
129
+ <%= number_with_delimiter(@task.raif_model_completion.completion_tokens) %>
130
+ <% if @task.raif_model_completion.output_token_cost %>
131
+ <small>(<%= t("raif.admin.common.est_cost") %>: <%= "$" %><%= number_with_precision(@task.raif_model_completion.output_token_cost, precision: 6) %>)</small>
132
+ <% end %>
133
+ <% else %>
134
+ -
135
+ <% end %>
136
+ </div>
103
137
  </div>
104
138
  <div class="row mb-3">
105
139
  <div class="col-md-3"><strong><%= t("raif.admin.common.total_tokens") %>:</strong></div>
106
- <div class="col-md-9"><%= @task.raif_model_completion.total_tokens ? number_with_delimiter(@task.raif_model_completion.total_tokens) : "-" %></div>
140
+ <div class="col-md-9">
141
+ <% if @task.raif_model_completion.total_tokens %>
142
+ <%= number_with_delimiter(@task.raif_model_completion.total_tokens) %>
143
+ <% if @task.raif_model_completion.total_cost %>
144
+ <small>(<%= t("raif.admin.common.est_cost") %>: <%= "$" %><%= number_with_precision(@task.raif_model_completion.total_cost, precision: 6) %>)</small>
145
+ <% end %>
146
+ <% else %>
147
+ -
148
+ <% end %>
149
+ </div>
150
+ </div>
151
+ <div class="row mb-3">
152
+ <div class="col-md-3"><strong><%= t("raif.admin.common.cache_read_input_tokens") %>:</strong></div>
153
+ <div class="col-md-9"><%= @task.raif_model_completion.cache_read_input_tokens ? number_with_delimiter(@task.raif_model_completion.cache_read_input_tokens) : "-" %></div>
154
+ </div>
155
+ <div class="row mb-3">
156
+ <div class="col-md-3"><strong><%= t("raif.admin.common.cache_creation_input_tokens") %>:</strong></div>
157
+ <div class="col-md-9"><%= @task.raif_model_completion.cache_creation_input_tokens ? number_with_delimiter(@task.raif_model_completion.cache_creation_input_tokens) : "-" %></div>
107
158
  </div>
108
159
  </div>
109
160
  </div>
110
161
  <% end %>
111
162
 
163
+ <%= render "raif/admin/model_tools/list", model_tools: @task.available_model_tools_map %>
164
+
112
165
  <div class="card mb-4">
113
166
  <div class="card-header">
114
167
  <h5 class="mb-0"><%= t("raif.admin.common.system_prompt") %></h5>
@@ -1,5 +1,8 @@
1
+ <%# locals: (conversation:, conversation_entry:) %>
2
+
1
3
  <%= form_with model: conversation_entry,
2
4
  url: raif.conversation_entries_path(conversation),
5
+ id: dom_id(conversation, "entry_form"),
3
6
  local: true do |f| %>
4
7
 
5
8
  <% if conversation_entry.raif_user_tool_invocation %>
@@ -6,13 +6,17 @@
6
6
 
7
7
  <% if content.present? %>
8
8
  <div class="mb-1 rounded-2 p-3 <%= message_type == :user ? "bg-primary text-white" : "border" %>">
9
- <% case local_assigns[:conversation_entry]&.response_format %>
10
- <% when "text" %>
11
- <%= simple_format content %>
12
- <% when "html" %>
13
- <%= sanitize content %>
9
+ <% if message_type == :user %>
10
+ <%= simple_format h(content), {}, sanitize: false %>
14
11
  <% else %>
15
- <%= content %>
12
+ <% case local_assigns[:conversation_entry]&.response_format %>
13
+ <% when "text" %>
14
+ <%= simple_format content %>
15
+ <% when "html" %>
16
+ <%= sanitize content %>
17
+ <% else %>
18
+ <%= content %>
19
+ <% end %>
16
20
  <% end %>
17
21
 
18
22
  <% if message_type == :model_response && local_assigns[:conversation_entry]&.citations.present? %>
@@ -0,0 +1,10 @@
1
+ <%# locals: (conversation:) %>
2
+
3
+ <tr>
4
+ <td class="ps-2"><%= conversation.created_at.strftime("%B %d, %Y") %></td>
5
+ <td>
6
+ <%= link_to t("raif.conversations.index.table.view"),
7
+ raif.conversation_path(conversation),
8
+ class: "btn btn-sm btn-primary" %>
9
+ </td>
10
+ </tr>
@@ -0,0 +1,12 @@
1
+ <%# locals: (conversation:, conversation_entry:) %>
2
+
3
+ <%# Update the conversation entry now that it's been processed & has a model response %>
4
+ <%= turbo_stream.replace conversation_entry do %>
5
+ <%= render conversation_entry %>
6
+ <% end %>
7
+
8
+ <%= turbo_stream.replace dom_id(conversation, "entry_form") do %>
9
+ <%= render "raif/conversation_entries/form", conversation: conversation, conversation_entry: Raif::ConversationEntry.new %>
10
+ <% end %>
11
+
12
+ <%= turbo_stream.action :raif_scroll_to_bottom, ActionView::RecordIdentifier.dom_id(conversation, :entries) %>
@@ -0,0 +1,23 @@
1
+ <div class="conversation-history p-4">
2
+ <h2><%= t("raif.conversations.index.title") %></h2>
3
+
4
+ <% if @conversations.any? %>
5
+ <div class="table-responsive">
6
+ <table class="table table-striped">
7
+ <thead>
8
+ <tr>
9
+ <th><%= t("raif.conversations.index.table.started") %></th>
10
+ <th><%= t("raif.conversations.index.table.actions") %></th>
11
+ </tr>
12
+ </thead>
13
+ <tbody>
14
+ <%= render collection: @conversations, partial: "raif/conversations/conversation" %>
15
+ </tbody>
16
+ </table>
17
+ </div>
18
+ <% else %>
19
+ <div class="text-center py-4">
20
+ <p class="text-muted"><%= t("raif.conversations.index.no_conversations") %></p>
21
+ </div>
22
+ <% end %>
23
+ </div>
data/config/importmap.rb CHANGED
@@ -1,6 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  pin "raif", to: "raif.js"
4
+ pin "raif_admin", to: "raif_admin.js"
4
5
 
5
6
  pin "raif/controllers/conversations_controller", to: "raif/controllers/conversations_controller.js"
7
+ pin "raif/admin/judge_config_controller", to: "raif/admin/judge_config_controller.js"
8
+ pin "raif/admin/select_all_checkboxes_controller", to: "raif/admin/select_all_checkboxes_controller.js"
9
+ pin "raif/admin/cost_estimate_controller", to: "raif/admin/cost_estimate_controller.js"
10
+ pin "raif/admin/tom_select_controller", to: "raif/admin/tom_select_controller.js"
11
+ pin "raif/admin/table_search_controller", to: "raif/admin/table_search_controller.js"
12
+ pin "raif/admin/sortable_table_controller", to: "raif/admin/sortable_table_controller.js"
13
+ pin "raif/admin/copy_to_clipboard_controller", to: "raif/admin/copy_to_clipboard_controller.js"
6
14
  pin "raif/stream_actions/raif_scroll_to_bottom", to: "raif/stream_actions/raif_scroll_to_bottom.js"
@@ -10,31 +10,46 @@ en:
10
10
  agents: Agents
11
11
  all: All
12
12
  arguments: Arguments
13
+ arguments_schema: Arguments Schema
13
14
  at: at
15
+ available_tools: Available Tools
16
+ cache_creation_input_tokens: Cache Creation Tokens
17
+ cache_read_input_tokens: Cache Read Tokens
14
18
  citations: Citations
15
19
  completed: Completed
16
20
  completed_at: Completed At
17
21
  completion_tokens: Completion Tokens
22
+ config: Config
18
23
  conversation_entries: Conversation Entries
19
24
  conversation_history: Conversation History
20
25
  conversations: Conversations
21
26
  count: Count
22
27
  created_at: Created At
23
28
  creator: Creator
29
+ default: default
30
+ description: Description
24
31
  details: Details
32
+ duration: Duration
25
33
  entries_count: Entries Count
26
34
  entry: Entry
27
35
  est_cost: est. cost
36
+ est_costs: est. costs
28
37
  failed: Failed
29
38
  failed_at: Failed At
39
+ failure_error: Failure Error
40
+ failure_reason: Failure Reason
30
41
  filter: Filter
31
42
  final_answer: Final Answer
32
43
  id: ID
33
44
  in_progress: In Progress
45
+ inferred_from_citations: Inferred from response citations.
34
46
  initial_task: Initial Task
47
+ input: Input
48
+ input_token_cost: Input Token Cost
35
49
  invalid_json: Invalid JSON
36
50
  iterations: Iterations
37
51
  language: Language
52
+ llms: LLMs
38
53
  messages: Messages
39
54
  model: Model
40
55
  model_completion: Model Completion
@@ -48,6 +63,9 @@ en:
48
63
  no_model_tool_invocations: No model tool invocations found.
49
64
  no_tasks: No tasks found.
50
65
  no_tool_calls: No tool calls
66
+ none: None
67
+ output: Output
68
+ output_token_cost: Output Token Cost
51
69
  pending: Pending
52
70
  period_all: All time
53
71
  period_day: Past 24 hours
@@ -56,16 +74,21 @@ en:
56
74
  prettified: Prettified
57
75
  prompt: Prompt
58
76
  prompt_tokens: Prompt Tokens
77
+ provider_managed_tool_calls: Provider-Managed Tool Calls
78
+ provider_tool_call_id: Provider Tool Call ID
59
79
  raw: Raw
60
80
  rendered: Rendered
61
81
  requested_language: Requested Language
62
82
  response: Response
83
+ response_array: Response Array
63
84
  response_format: Response Format
64
- response_format_parameter: Response Format Parameter
65
85
  result: Result
86
+ retry_count: Retry Count
87
+ run_with: Run With
66
88
  running: Running
67
89
  since: Since
68
90
  source: Source
91
+ sources: Sources
69
92
  started_at: Started At
70
93
  stats: Stats
71
94
  status: Status
@@ -73,15 +96,31 @@ en:
73
96
  task: Task
74
97
  tasks: Tasks
75
98
  tool_arguments: Tool Arguments
99
+ tool_call: Tool Call
76
100
  tool_calls: Tool Calls
77
101
  tool_invocations: Tool Invocations
78
102
  tool_name: Tool Name
103
+ tool_result: Tool Result
79
104
  tool_type: Tool Type
105
+ total: Total
80
106
  total_cost: Total Cost
81
107
  total_tokens: Total Tokens
82
108
  type: Type
83
109
  update: Update
84
110
  user_message: User Message
111
+ config:
112
+ show:
113
+ configuration_settings: Configuration Settings
114
+ default: default
115
+ key: Key
116
+ no_embedding_models_registered: No embedding models registered
117
+ no_llms_registered: No LLMs registered
118
+ not_set: Not set
119
+ registered_embedding_models: Registered Embedding Models
120
+ registered_llms: Registered LLMs
121
+ setting: Setting
122
+ title: Raif Configuration
123
+ value: Value
85
124
  conversations:
86
125
  show:
87
126
  back_to_conversations: Back to Conversations
@@ -89,6 +128,18 @@ en:
89
128
  layouts:
90
129
  admin:
91
130
  title: Raif Admin
131
+ llms:
132
+ index:
133
+ api_name: API Name
134
+ cost_note: Costs shown are per 1,000,000 tokens.
135
+ default_badge: default
136
+ input_cost: Input Cost (per 1M tokens)
137
+ name: Name
138
+ no_llms: No LLMs are currently registered.
139
+ output_cost: Output Cost (per 1M tokens)
140
+ provider: Provider
141
+ search_placeholder: Search by name, provider, or API name...
142
+ title: Registered LLMs
92
143
  model_completions:
93
144
  show:
94
145
  back_to_model_completions: Back to Model Completions
@@ -96,10 +147,119 @@ en:
96
147
  model_tool_invocations:
97
148
  show:
98
149
  back_to_model_tool_invocations: Back to Model Tool Invocations
150
+ observation_disclaimer: This observation is regenerated from current data and code. It may differ from what was originally sent to the model.
151
+ observation_sent_to_model: Observation Sent to Model
152
+ observation_unavailable: 'Could not generate observation: %{error}'
99
153
  title: 'Model Tool Invocation #%{id}'
154
+ prompt_studio:
155
+ agents:
156
+ show:
157
+ agent_details: Agent Details
158
+ page_title: 'Prompt Studio - Agent #%{id}'
159
+ batch_runs:
160
+ create:
161
+ confirm: This will create a batch run and send requests to the selected LLM. Continue?
162
+ error: 'Batch run failed: %{message}'
163
+ new_batch_run: New Batch Run
164
+ no_tasks_selected: Please select at least one task.
165
+ submit: Run Selected Batch
166
+ tasks_selected: tasks selected
167
+ title: Batch Run
168
+ judge:
169
+ new_response: New Response
170
+ original_response: Original Response
171
+ tie: Tie
172
+ winner: 'Winner: %{name}'
173
+ judge_config:
174
+ comparison_criteria_label: Comparison Criteria
175
+ comparison_criteria_placeholder: Which response better addresses the prompt
176
+ criteria_label: Criteria
177
+ criteria_placeholder: Response is accurate and complete
178
+ description: Optionally evaluate each result with an LLM judge.
179
+ include_original_prompt_as_context_description: Provides the original task prompt to the judge as additional context for evaluation.
180
+ include_original_prompt_as_context_label: Include original prompt as context
181
+ judge_model_label: Judge Model
182
+ rubric_accuracy: Accuracy
183
+ rubric_clarity: Clarity
184
+ rubric_helpfulness: Helpfulness
185
+ rubric_label: Scoring Rubric
186
+ strict_mode_label: Strict Mode
187
+ summarization_description: Uses the original task prompt as the source content and the new response as the summary to evaluate.
188
+ title: LLM Judge Configuration
189
+ type_binary: Binary (Pass/Fail)
190
+ type_comparative: Comparative (A vs B)
191
+ type_label: Judge Type
192
+ type_none: None
193
+ type_scored: Scored (Rubric)
194
+ type_summarization: Summarization
195
+ show:
196
+ average_score: Average Score
197
+ judge_reasoning: Judge Reasoning
198
+ judge_result: Judge Result
199
+ new_response: New Response
200
+ original_response: Original Response
201
+ page_title: 'Batch Run #%{id}'
202
+ pass_rate: Pass Rate
203
+ progress: Progress
204
+ results: Results
205
+ source_task: Source Task
206
+ summary: Summary
207
+ status:
208
+ completed: Completed
209
+ failed: Failed
210
+ in_progress: In Progress
211
+ judging: Judging
212
+ pending: Pending
213
+ running: Running
214
+ common:
215
+ back: Back
216
+ created_after: Created After
217
+ created_before: Created Before
218
+ current_prompt: Current Prompt
219
+ current_system_prompt: Current System Prompt
220
+ estimated_cost: "~%{cost} (estimate)"
221
+ estimated_tokens: "~%{count} tokens (estimate)"
222
+ no_instances: No instances found.
223
+ original_prompt: Original Prompt
224
+ original_system_prompt: Original System Prompt
225
+ prompt_changed: Prompt Changed
226
+ prompt_studio: Prompt Studio
227
+ prompt_tokens: "%{count} tokens"
228
+ prompt_unchanged: Prompt Unchanged
229
+ run_in_prompt_studio: Run in Prompt Studio
230
+ runs_disabled: Prompt Studio runs are not enabled in this environment.
231
+ select_type: Select a type to browse instances
232
+ system_prompt_changed: System Prompt Changed
233
+ system_prompt_unchanged: System Prompt Unchanged
234
+ type: Type
235
+ warning_stale_reference: 'Warning: Some run_with references could not be loaded. The current prompt may differ from what would be generated with the original data.'
236
+ conversations:
237
+ show:
238
+ conversation_details: Conversation Details
239
+ page_title: 'Prompt Studio - Conversation #%{id}'
240
+ tasks:
241
+ rerun:
242
+ confirm: This will create a new task and send a request to the selected LLM. Continue?
243
+ description: Re-run this task with the current prompt templates and a selected model. This will create a new task record.
244
+ error: 'Re-run failed: %{message}'
245
+ invalid_model: Please select a valid model.
246
+ running: Running...
247
+ submit: Re-run Task
248
+ title: Re-run with Current Prompts
249
+ show:
250
+ new_response: New Response
251
+ original_response: Original Response
252
+ page_title: 'Prompt Studio - Task #%{id}'
253
+ response_comparison: Response Comparison
254
+ task_details: Task Details
255
+ view_response: View Response
100
256
  stats:
257
+ model_tool_invocations:
258
+ back_to_stats: Back to Stats
259
+ title: Model Tool Invocation Stats
101
260
  tasks:
102
261
  back_to_stats: Back to Stats
262
+ show_model_breakdown: Show model breakdown
103
263
  title: Task Stats
104
264
  tasks:
105
265
  show:
@@ -6,10 +6,7 @@ en:
6
6
  errors:
7
7
  available_model_tools:
8
8
  too_short: must have at least 1 tool in addition to the agent_final_answer tool
9
- re_act_agent:
10
- errors:
11
- available_model_tools:
12
- too_short: must have at least 1 tool
9
+ final_answer_warning: 'Warning: This is your final iteration. You must provide your final answer using the agent_final_answer tool.'
13
10
  common:
14
11
  send: Send
15
12
  sources: Sources
@@ -18,8 +15,17 @@ en:
18
15
  type_your_message: Type your message...
19
16
  conversation:
20
17
  initial_chat_message: Hello, how can I help you today?
18
+ conversations:
19
+ index:
20
+ no_conversations: No conversations found.
21
+ table:
22
+ actions: Actions
23
+ started: Started
24
+ view: View
25
+ title: Past Conversations
21
26
  embedding_model_names:
22
27
  bedrock_titan_embed_text_v2: AWS Bedrock Titan Text Embeddings v2
28
+ google_gemini_embedding_2: Google Gemini Embedding 2
23
29
  open_ai_text_embedding_3_large: OpenAI Text Embedding 3 Large
24
30
  open_ai_text_embedding_3_small: OpenAI Text Embedding 3 Small
25
31
  open_ai_text_embedding_ada_002: OpenAI Text Embedding Ada 002
@@ -51,6 +57,13 @@ en:
51
57
  anthropic_claude_3_5_sonnet: Anthropic Claude 3.5 Sonnet
52
58
  anthropic_claude_3_7_sonnet: Anthropic Claude 3.7 Sonnet
53
59
  anthropic_claude_3_opus: Anthropic Claude 3 Opus
60
+ anthropic_claude_4_1_opus: Anthropic Claude 4.1 Opus
61
+ anthropic_claude_4_5_haiku: Anthropic Claude 4.5 Haiku
62
+ anthropic_claude_4_5_opus: Anthropic Claude 4.5 Opus
63
+ anthropic_claude_4_5_sonnet: Anthropic Claude 4.5 Sonnet
64
+ anthropic_claude_4_6_opus: Anthropic Claude 4.6 Opus
65
+ anthropic_claude_4_6_sonnet: Anthropic Claude 4.6 Sonnet
66
+ anthropic_claude_4_7_opus: Anthropic Claude 4.7 Opus
54
67
  anthropic_claude_4_opus: Anthropic Claude 4 Opus
55
68
  anthropic_claude_4_sonnet: Anthropic Claude 4 Sonnet
56
69
  bedrock_amazon_nova_lite: Amazon Nova Lite (via AWS Bedrock)
@@ -60,8 +73,25 @@ en:
60
73
  bedrock_claude_3_5_sonnet: Anthropic Claude 3.5 Sonnet (via AWS Bedrock)
61
74
  bedrock_claude_3_7_sonnet: Anthropic Claude 3.7 Sonnet (via AWS Bedrock)
62
75
  bedrock_claude_3_opus: Anthropic Claude 3 Opus (via AWS Bedrock)
76
+ bedrock_claude_4_1_opus: Claude 4.1 Opus (via AWS Bedrock)
77
+ bedrock_claude_4_5_haiku: Anthropic Claude 4.5 Haiku (via AWS Bedrock)
78
+ bedrock_claude_4_5_opus: Anthropic Claude 4.5 Opus (via AWS Bedrock)
79
+ bedrock_claude_4_5_sonnet: Anthropic Claude 4.5 Sonnet (via AWS Bedrock)
80
+ bedrock_claude_4_6_opus: Anthropic Claude 4.6 Opus (via AWS Bedrock)
81
+ bedrock_claude_4_6_sonnet: Anthropic Claude 4.6 Sonnet (via AWS Bedrock)
82
+ bedrock_claude_4_7_opus: Anthropic Claude 4.7 Opus (via AWS Bedrock)
63
83
  bedrock_claude_4_opus: Anthropic Claude 4 Opus (via AWS Bedrock)
64
84
  bedrock_claude_4_sonnet: Anthropic Claude 4 Sonnet (via AWS Bedrock)
85
+ bedrock_deepseek_r1: DeepSeek R1 (via AWS Bedrock)
86
+ bedrock_deepseek_v3_2: DeepSeek v3.2 (via AWS Bedrock)
87
+ bedrock_gpt_oss_120b: OpenAI GPT-OSS 120B (via AWS Bedrock)
88
+ bedrock_gpt_oss_20b: OpenAI GPT-OSS 20B (via AWS Bedrock)
89
+ google_gemini_2_5_flash: Google Gemini 2.5 Flash
90
+ google_gemini_2_5_pro: Google Gemini 2.5 Pro
91
+ google_gemini_3_0_flash: Google Gemini 3 Flash
92
+ google_gemini_3_0_pro: Google Gemini 3 Pro
93
+ google_gemini_3_1_flash_lite: Google Gemini 3.1 Flash-Lite
94
+ google_gemini_3_1_pro: Google Gemini 3.1 Pro
65
95
  open_ai_gpt_3_5_turbo: OpenAI GPT-3.5 Turbo
66
96
  open_ai_gpt_4_1: OpenAI GPT-4.1
67
97
  open_ai_gpt_4_1_mini: OpenAI GPT-4.1 Mini
@@ -69,6 +99,12 @@ en:
69
99
  open_ai_gpt_4o: OpenAI GPT-4o
70
100
  open_ai_gpt_4o_mini: OpenAI GPT-4o Mini
71
101
  open_ai_gpt_5: OpenAI GPT-5
102
+ open_ai_gpt_5_1: OpenAI GPT-5.1
103
+ open_ai_gpt_5_2: OpenAI GPT-5.2
104
+ open_ai_gpt_5_3: OpenAI GPT-5.3
105
+ open_ai_gpt_5_4: OpenAI GPT-5.4
106
+ open_ai_gpt_5_4_mini: OpenAI GPT-5.4 Mini
107
+ open_ai_gpt_5_4_nano: OpenAI GPT-5.4 Nano
72
108
  open_ai_gpt_5_mini: OpenAI GPT-5 Mini
73
109
  open_ai_gpt_5_nano: OpenAI GPT-5 Nano
74
110
  open_ai_o1: OpenAI o1
@@ -83,8 +119,17 @@ en:
83
119
  open_ai_responses_gpt_4o: OpenAI GPT-4o (Responses API)
84
120
  open_ai_responses_gpt_4o_mini: OpenAI GPT-4o Mini (Responses API)
85
121
  open_ai_responses_gpt_5: OpenAI GPT-5 (Responses API)
122
+ open_ai_responses_gpt_5_1: OpenAI GPT-5.1 (Responses API)
123
+ open_ai_responses_gpt_5_2: OpenAI GPT-5.2 (Responses API)
124
+ open_ai_responses_gpt_5_2_pro: OpenAI GPT-5.2 Pro (Responses API)
125
+ open_ai_responses_gpt_5_3: OpenAI GPT-5.3 (Responses API)
126
+ open_ai_responses_gpt_5_4: OpenAI GPT-5.4 (Responses API)
127
+ open_ai_responses_gpt_5_4_mini: OpenAI GPT-5.4 Mini (Responses API)
128
+ open_ai_responses_gpt_5_4_nano: OpenAI GPT-5.4 Nano (Responses API)
129
+ open_ai_responses_gpt_5_4_pro: OpenAI GPT-5.4 Pro (Responses API)
86
130
  open_ai_responses_gpt_5_mini: OpenAI GPT-5 Mini (Responses API)
87
131
  open_ai_responses_gpt_5_nano: OpenAI GPT-5 Nano (Responses API)
132
+ open_ai_responses_gpt_5_pro: OpenAI GPT-5 Pro (Responses API)
88
133
  open_ai_responses_o1: OpenAI o1 (Responses API)
89
134
  open_ai_responses_o1_mini: OpenAI o1 Mini (Responses API)
90
135
  open_ai_responses_o1_pro: OpenAI o1 Pro (Responses API)
@@ -94,11 +139,29 @@ en:
94
139
  open_ai_responses_o4_mini: OpenAI o4 Mini (Responses API)
95
140
  open_router_claude_3_7_sonnet: Anthropic Claude 3.7 Sonnet (via OpenRouter)
96
141
  open_router_deepseek_chat_v3: DeepSeek Chat v3 (via OpenRouter)
142
+ open_router_deepseek_v3_1: DeepSeek v3.1 (via OpenRouter)
143
+ open_router_deepseek_v3_2: DeepSeek v3.2 (via OpenRouter)
97
144
  open_router_gemini_2_0_flash: Google Gemini 2.0 Flash (via OpenRouter)
145
+ open_router_gemini_2_5_flash: Gemini 2.5 Flash (via OpenRouter)
146
+ open_router_gemini_2_5_pro: Gemini 2.5 Pro (via OpenRouter)
147
+ open_router_gemini_3_1_flash_lite_preview: Gemini 3.1 Flash-Lite Preview (via OpenRouter)
148
+ open_router_gemini_3_1_pro_preview: Gemini 3.1 Pro Preview (via OpenRouter)
149
+ open_router_gemini_3_pro_preview: Gemini 3 Pro Preview (via OpenRouter)
150
+ open_router_google_gemma_4_31b_it: Google Gemma 4 31B IT (via OpenRouter)
151
+ open_router_grok_4: Grok 4 (via OpenRouter)
152
+ open_router_grok_4_1_fast: Grok 4.1 Fast (via OpenRouter)
153
+ open_router_grok_4_20: Grok 4.20 (via OpenRouter)
154
+ open_router_kimi_k2_5: Kimi K2.5 (via OpenRouter)
155
+ open_router_kimi_k2_thinking: Kimi K2 Thinking (via OpenRouter)
98
156
  open_router_llama_3_1_8b_instruct: Meta Llama 3.1 8B Instruct (via OpenRouter)
99
157
  open_router_llama_3_3_70b_instruct: Meta Llama 3.3 70B Instruct (via OpenRouter)
100
158
  open_router_llama_4_maverick: Meta Llama 4 Maverick (via OpenRouter)
101
159
  open_router_llama_4_scout: Meta Llama 4 Scout (via OpenRouter)
160
+ open_router_minimax_m2: Minimax M2 (via OpenRouter)
161
+ open_router_minimax_m2_1: Minimax M2.1 (via OpenRouter)
162
+ open_router_minimax_m2_5: Minimax M2.5 (via OpenRouter)
163
+ open_router_mistral_large_3_2512: Mistral Large 3 (via OpenRouter)
164
+ open_router_mistral_small_3_2_24b: Mistral Small 3.2 24B (via OpenRouter)
102
165
  open_router_open_ai_gpt_oss_120b: OpenAI GPT-OSS 120B (via OpenRouter)
103
166
  open_router_open_ai_gpt_oss_20b: OpenAI GPT-OSS 20B (via OpenRouter)
104
167
  raif_test_llm: Raif Test LLM
data/config/routes.rb CHANGED
@@ -17,6 +17,7 @@ Raif::Engine.routes.draw do
17
17
 
18
18
  namespace :stats do
19
19
  resources :tasks, only: [:index]
20
+ resources :model_tool_invocations, only: [:index]
20
21
  end
21
22
 
22
23
  resources :tasks, only: [:index, :show]
@@ -24,5 +25,14 @@ Raif::Engine.routes.draw do
24
25
  resources :model_completions, only: [:index, :show]
25
26
  resources :agents, only: [:index, :show]
26
27
  resources :model_tool_invocations, only: [:index, :show]
28
+ resources :llms, only: [:index]
29
+ resource :config, only: [:show]
30
+
31
+ namespace :prompt_studio do
32
+ resources :tasks, only: [:index, :show, :create]
33
+ resources :conversations, only: [:index, :show]
34
+ resources :agents, only: [:index, :show]
35
+ resources :batch_runs, only: [:create, :show]
36
+ end
27
37
  end
28
38
  end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AddGeneratingEntryResponseToRaifConversations < ActiveRecord::Migration[7.1]
4
+ def change
5
+ add_column :raif_conversations, :generating_entry_response, :boolean, default: false, null: false
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AddSourceToRaifTasks < ActiveRecord::Migration[7.1]
4
+ def change
5
+ add_reference :raif_tasks, :source, polymorphic: true, index: true
6
+ end
7
+ end