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
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: raif
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Roesch
@@ -84,16 +84,16 @@ dependencies:
84
84
  name: pagy
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ">="
87
+ - - "<"
88
88
  - !ruby/object:Gem::Version
89
- version: '0'
89
+ version: '10.0'
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ">="
94
+ - - "<"
95
95
  - !ruby/object:Gem::Version
96
- version: '0'
96
+ version: '10.0'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: rails
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -152,21 +152,40 @@ files:
152
152
  - Rakefile
153
153
  - app/assets/builds/raif.css
154
154
  - app/assets/builds/raif_admin.css
155
+ - app/assets/builds/raif_admin_sprockets.js
155
156
  - app/assets/config/raif_manifest.js
156
157
  - app/assets/images/raif-logo-white.svg
157
158
  - app/assets/javascript/raif.js
159
+ - app/assets/javascript/raif/admin/copy_to_clipboard_controller.js
160
+ - app/assets/javascript/raif/admin/cost_estimate_controller.js
161
+ - app/assets/javascript/raif/admin/judge_config_controller.js
162
+ - app/assets/javascript/raif/admin/select_all_checkboxes_controller.js
163
+ - app/assets/javascript/raif/admin/sortable_table_controller.js
164
+ - app/assets/javascript/raif/admin/table_search_controller.js
165
+ - app/assets/javascript/raif/admin/tom_select_controller.js
158
166
  - app/assets/javascript/raif/controllers/conversations_controller.js
159
167
  - app/assets/javascript/raif/stream_actions/raif_scroll_to_bottom.js
168
+ - app/assets/javascript/raif_admin.js
169
+ - app/assets/javascript/raif_admin_sprockets.js
160
170
  - app/assets/stylesheets/raif.scss
161
171
  - app/assets/stylesheets/raif/admin/conversation.scss
162
172
  - app/assets/stylesheets/raif/admin/stats.scss
173
+ - app/assets/stylesheets/raif/conversations.scss
163
174
  - app/assets/stylesheets/raif/loader.scss
164
175
  - app/assets/stylesheets/raif_admin.scss
165
176
  - app/controllers/raif/admin/agents_controller.rb
166
177
  - app/controllers/raif/admin/application_controller.rb
178
+ - app/controllers/raif/admin/configs_controller.rb
167
179
  - app/controllers/raif/admin/conversations_controller.rb
180
+ - app/controllers/raif/admin/llms_controller.rb
168
181
  - app/controllers/raif/admin/model_completions_controller.rb
169
182
  - app/controllers/raif/admin/model_tool_invocations_controller.rb
183
+ - app/controllers/raif/admin/prompt_studio/agents_controller.rb
184
+ - app/controllers/raif/admin/prompt_studio/base_controller.rb
185
+ - app/controllers/raif/admin/prompt_studio/batch_runs_controller.rb
186
+ - app/controllers/raif/admin/prompt_studio/conversations_controller.rb
187
+ - app/controllers/raif/admin/prompt_studio/tasks_controller.rb
188
+ - app/controllers/raif/admin/stats/model_tool_invocations_controller.rb
170
189
  - app/controllers/raif/admin/stats/tasks_controller.rb
171
190
  - app/controllers/raif/admin/stats_controller.rb
172
191
  - app/controllers/raif/admin/tasks_controller.rb
@@ -177,38 +196,60 @@ files:
177
196
  - app/helpers/raif/shared/conversations_helper.rb
178
197
  - app/jobs/raif/application_job.rb
179
198
  - app/jobs/raif/conversation_entry_job.rb
199
+ - app/jobs/raif/prompt_studio_batch_run_item_job.rb
200
+ - app/jobs/raif/prompt_studio_batch_run_job.rb
201
+ - app/jobs/raif/prompt_studio_task_run_job.rb
202
+ - app/models/raif/admin/task_stat.rb
180
203
  - app/models/raif/agent.rb
181
204
  - app/models/raif/agents/native_tool_calling_agent.rb
182
- - app/models/raif/agents/re_act_agent.rb
183
- - app/models/raif/agents/re_act_step.rb
184
205
  - app/models/raif/application_record.rb
206
+ - app/models/raif/concerns/agent_inference_stats.rb
185
207
  - app/models/raif/concerns/boolean_timestamp.rb
186
208
  - app/models/raif/concerns/has_available_model_tools.rb
187
209
  - app/models/raif/concerns/has_llm.rb
210
+ - app/models/raif/concerns/has_prompt_templates.rb
188
211
  - app/models/raif/concerns/has_requested_language.rb
212
+ - app/models/raif/concerns/has_runtime_duration.rb
189
213
  - app/models/raif/concerns/invokes_model_tools.rb
190
214
  - app/models/raif/concerns/json_schema_definition.rb
215
+ - app/models/raif/concerns/llm_prompt_caching.rb
191
216
  - app/models/raif/concerns/llm_response_parsing.rb
192
217
  - app/models/raif/concerns/llm_temperature.rb
193
218
  - app/models/raif/concerns/llms/anthropic/message_formatting.rb
219
+ - app/models/raif/concerns/llms/anthropic/response_tool_calls.rb
194
220
  - app/models/raif/concerns/llms/anthropic/tool_formatting.rb
195
221
  - app/models/raif/concerns/llms/bedrock/message_formatting.rb
222
+ - app/models/raif/concerns/llms/bedrock/response_tool_calls.rb
196
223
  - app/models/raif/concerns/llms/bedrock/tool_formatting.rb
224
+ - app/models/raif/concerns/llms/google/message_formatting.rb
225
+ - app/models/raif/concerns/llms/google/response_tool_calls.rb
226
+ - app/models/raif/concerns/llms/google/tool_formatting.rb
197
227
  - app/models/raif/concerns/llms/message_formatting.rb
198
228
  - app/models/raif/concerns/llms/open_ai/json_schema_validation.rb
199
229
  - app/models/raif/concerns/llms/open_ai_completions/message_formatting.rb
230
+ - app/models/raif/concerns/llms/open_ai_completions/response_tool_calls.rb
200
231
  - app/models/raif/concerns/llms/open_ai_completions/tool_formatting.rb
201
232
  - app/models/raif/concerns/llms/open_ai_responses/message_formatting.rb
233
+ - app/models/raif/concerns/llms/open_ai_responses/response_tool_calls.rb
202
234
  - app/models/raif/concerns/llms/open_ai_responses/tool_formatting.rb
203
- - app/models/raif/concerns/task_run_args.rb
235
+ - app/models/raif/concerns/provider_managed_tool_calls.rb
236
+ - app/models/raif/concerns/run_with.rb
204
237
  - app/models/raif/conversation.rb
205
238
  - app/models/raif/conversation_entry.rb
206
239
  - app/models/raif/embedding_model.rb
207
240
  - app/models/raif/embedding_models/bedrock.rb
241
+ - app/models/raif/embedding_models/google.rb
208
242
  - app/models/raif/embedding_models/open_ai.rb
243
+ - app/models/raif/evals/llm_judge.rb
244
+ - app/models/raif/evals/llm_judges/binary.rb
245
+ - app/models/raif/evals/llm_judges/comparative.rb
246
+ - app/models/raif/evals/llm_judges/scored.rb
247
+ - app/models/raif/evals/llm_judges/summarization.rb
248
+ - app/models/raif/evals/scoring_rubric.rb
209
249
  - app/models/raif/llm.rb
210
250
  - app/models/raif/llms/anthropic.rb
211
251
  - app/models/raif/llms/bedrock.rb
252
+ - app/models/raif/llms/google.rb
212
253
  - app/models/raif/llms/open_ai_base.rb
213
254
  - app/models/raif/llms/open_ai_completions.rb
214
255
  - app/models/raif/llms/open_ai_responses.rb
@@ -225,8 +266,11 @@ files:
225
266
  - app/models/raif/model_tools/provider_managed/image_generation.rb
226
267
  - app/models/raif/model_tools/provider_managed/web_search.rb
227
268
  - app/models/raif/model_tools/wikipedia_search.rb
269
+ - app/models/raif/prompt_studio_batch_run.rb
270
+ - app/models/raif/prompt_studio_batch_run_item.rb
228
271
  - app/models/raif/streaming_responses/anthropic.rb
229
272
  - app/models/raif/streaming_responses/bedrock.rb
273
+ - app/models/raif/streaming_responses/google.rb
230
274
  - app/models/raif/streaming_responses/open_ai_completions.rb
231
275
  - app/models/raif/streaming_responses/open_ai_responses.rb
232
276
  - app/models/raif/task.rb
@@ -236,17 +280,42 @@ files:
236
280
  - app/views/raif/admin/agents/_conversation_message.html.erb
237
281
  - app/views/raif/admin/agents/index.html.erb
238
282
  - app/views/raif/admin/agents/show.html.erb
283
+ - app/views/raif/admin/configs/show.html.erb
239
284
  - app/views/raif/admin/conversations/_conversation.html.erb
240
285
  - app/views/raif/admin/conversations/_conversation_entry.html.erb
241
286
  - app/views/raif/admin/conversations/index.html.erb
242
287
  - app/views/raif/admin/conversations/show.html.erb
288
+ - app/views/raif/admin/llms/index.html.erb
243
289
  - app/views/raif/admin/model_completions/_model_completion.html.erb
244
290
  - app/views/raif/admin/model_completions/index.html.erb
245
291
  - app/views/raif/admin/model_completions/show.html.erb
246
292
  - app/views/raif/admin/model_tool_invocations/_model_tool_invocation.html.erb
247
293
  - app/views/raif/admin/model_tool_invocations/index.html.erb
248
294
  - app/views/raif/admin/model_tool_invocations/show.html.erb
295
+ - app/views/raif/admin/model_tools/_list.html.erb
296
+ - app/views/raif/admin/model_tools/_model_tool.html.erb
297
+ - app/views/raif/admin/prompt_studio/agents/index.html.erb
298
+ - app/views/raif/admin/prompt_studio/agents/show.html.erb
299
+ - app/views/raif/admin/prompt_studio/batch_runs/_batch_run_item.html.erb
300
+ - app/views/raif/admin/prompt_studio/batch_runs/_judge_config_fields.html.erb
301
+ - app/views/raif/admin/prompt_studio/batch_runs/_judge_detail_modal.html.erb
302
+ - app/views/raif/admin/prompt_studio/batch_runs/_modal.html.erb
303
+ - app/views/raif/admin/prompt_studio/batch_runs/_progress.html.erb
304
+ - app/views/raif/admin/prompt_studio/batch_runs/show.html.erb
305
+ - app/views/raif/admin/prompt_studio/conversations/index.html.erb
306
+ - app/views/raif/admin/prompt_studio/conversations/show.html.erb
307
+ - app/views/raif/admin/prompt_studio/shared/_nav_tabs.html.erb
308
+ - app/views/raif/admin/prompt_studio/shared/_prompt_comparison.html.erb
309
+ - app/views/raif/admin/prompt_studio/shared/_type_filter.html.erb
310
+ - app/views/raif/admin/prompt_studio/tasks/_task_result.html.erb
311
+ - app/views/raif/admin/prompt_studio/tasks/_task_row.html.erb
312
+ - app/views/raif/admin/prompt_studio/tasks/_task_type_filter.html.erb
313
+ - app/views/raif/admin/prompt_studio/tasks/_tasks_table.html.erb
314
+ - app/views/raif/admin/prompt_studio/tasks/index.html.erb
315
+ - app/views/raif/admin/prompt_studio/tasks/show.html.erb
316
+ - app/views/raif/admin/stats/_stats_tile.html.erb
249
317
  - app/views/raif/admin/stats/index.html.erb
318
+ - app/views/raif/admin/stats/model_tool_invocations/index.html.erb
250
319
  - app/views/raif/admin/stats/tasks/index.html.erb
251
320
  - app/views/raif/admin/tasks/_task.html.erb
252
321
  - app/views/raif/admin/tasks/index.html.erb
@@ -262,8 +331,11 @@ files:
262
331
  - app/views/raif/conversation_entries/create.turbo_stream.erb
263
332
  - app/views/raif/conversation_entries/new.turbo_stream.erb
264
333
  - app/views/raif/conversations/_available_user_tools.html.erb
334
+ - app/views/raif/conversations/_conversation.html.erb
335
+ - app/views/raif/conversations/_entry_processed.turbo_stream.erb
265
336
  - app/views/raif/conversations/_full_conversation.html.erb
266
337
  - app/views/raif/conversations/_initial_chat_message.html.erb
338
+ - app/views/raif/conversations/index.html.erb
267
339
  - app/views/raif/conversations/show.html.erb
268
340
  - config/i18n-tasks.yml
269
341
  - config/importmap.rb
@@ -282,16 +354,34 @@ files:
282
354
  - db/migrate/20250603202013_add_stream_response_to_raif_model_completions.rb
283
355
  - db/migrate/20250804013843_add_task_run_args_to_raif_tasks.rb
284
356
  - db/migrate/20250811171150_make_raif_task_creator_optional.rb
357
+ - db/migrate/20250904194456_add_generating_entry_response_to_raif_conversations.rb
358
+ - db/migrate/20250911125234_add_source_to_raif_tasks.rb
359
+ - db/migrate/20251020005853_add_source_to_raif_agents.rb
360
+ - db/migrate/20251020011346_rename_task_run_args_to_run_with.rb
361
+ - db/migrate/20251020011405_add_run_with_to_raif_agents.rb
362
+ - db/migrate/20251024160119_add_llm_messages_max_length_to_raif_conversations.rb
363
+ - db/migrate/20251124185033_add_provider_tool_call_id_to_raif_model_tool_invocations.rb
364
+ - db/migrate/20251128202941_add_tool_choice_to_raif_model_completions.rb
365
+ - db/migrate/20260118144846_add_source_to_raif_conversations.rb
366
+ - db/migrate/20260119000000_add_failure_tracking_to_raif_model_completions.rb
367
+ - db/migrate/20260119000001_add_completed_at_to_raif_model_completions.rb
368
+ - db/migrate/20260119000002_add_started_at_to_raif_model_completions.rb
369
+ - db/migrate/20260307000000_add_prompt_studio_run_to_raif_tasks.rb
370
+ - db/migrate/20260308000000_create_raif_prompt_studio_batch_runs.rb
371
+ - db/migrate/20260308000001_create_raif_prompt_studio_batch_run_items.rb
372
+ - db/migrate/20260407000000_add_cache_token_columns_to_raif_model_completions.rb
285
373
  - exe/raif
286
374
  - lib/generators/raif/agent/agent_generator.rb
287
375
  - lib/generators/raif/agent/templates/agent.rb.tt
288
376
  - lib/generators/raif/agent/templates/agent_eval_set.rb.tt
289
377
  - lib/generators/raif/agent/templates/application_agent.rb.tt
378
+ - lib/generators/raif/agent/templates/system_prompt.erb.tt
290
379
  - lib/generators/raif/base_generator.rb
291
380
  - lib/generators/raif/conversation/conversation_generator.rb
292
381
  - lib/generators/raif/conversation/templates/application_conversation.rb.tt
293
382
  - lib/generators/raif/conversation/templates/conversation.rb.tt
294
383
  - lib/generators/raif/conversation/templates/conversation_eval_set.rb.tt
384
+ - lib/generators/raif/conversation/templates/system_prompt.erb.tt
295
385
  - lib/generators/raif/eval_set/eval_set_generator.rb
296
386
  - lib/generators/raif/eval_set/templates/eval_set.rb.tt
297
387
  - lib/generators/raif/evals/setup/setup_generator.rb
@@ -302,6 +392,7 @@ files:
302
392
  - lib/generators/raif/model_tool/templates/model_tool_invocation_partial.html.erb.tt
303
393
  - lib/generators/raif/task/task_generator.rb
304
394
  - lib/generators/raif/task/templates/application_task.rb.tt
395
+ - lib/generators/raif/task/templates/prompt.erb.tt
305
396
  - lib/generators/raif/task/templates/task.rb.tt
306
397
  - lib/generators/raif/task/templates/task_eval_set.rb.tt
307
398
  - lib/generators/raif/views_generator.rb
@@ -315,12 +406,15 @@ files:
315
406
  - lib/raif/engine.rb
316
407
  - lib/raif/errors.rb
317
408
  - lib/raif/errors/action_not_authorized_error.rb
409
+ - lib/raif/errors/blank_response_error.rb
410
+ - lib/raif/errors/instance_dependent_schema_error.rb
318
411
  - lib/raif/errors/invalid_config_error.rb
319
412
  - lib/raif/errors/invalid_conversation_type_error.rb
320
413
  - lib/raif/errors/invalid_model_file_input_error.rb
321
414
  - lib/raif/errors/invalid_model_image_input_error.rb
322
415
  - lib/raif/errors/invalid_user_tool_type_error.rb
323
416
  - lib/raif/errors/open_ai/json_schema_error.rb
417
+ - lib/raif/errors/prompt_template_error.rb
324
418
  - lib/raif/errors/streaming_error.rb
325
419
  - lib/raif/errors/unsupported_feature_error.rb
326
420
  - lib/raif/evals.rb
@@ -329,24 +423,22 @@ files:
329
423
  - lib/raif/evals/eval_sets/expectations.rb
330
424
  - lib/raif/evals/eval_sets/llm_judge_expectations.rb
331
425
  - lib/raif/evals/expectation_result.rb
332
- - lib/raif/evals/llm_judge.rb
333
- - lib/raif/evals/llm_judges/binary.rb
334
- - lib/raif/evals/llm_judges/comparative.rb
335
- - lib/raif/evals/llm_judges/scored.rb
336
- - lib/raif/evals/llm_judges/summarization.rb
337
426
  - lib/raif/evals/run.rb
338
- - lib/raif/evals/scoring_rubric.rb
339
427
  - lib/raif/json_schema_builder.rb
340
428
  - lib/raif/languages.rb
341
429
  - lib/raif/llm_registry.rb
430
+ - lib/raif/messages.rb
342
431
  - lib/raif/migration_checker.rb
432
+ - lib/raif/prompt_studio_comparison_builder.rb
343
433
  - lib/raif/rspec.rb
434
+ - lib/raif/token_estimator.rb
344
435
  - lib/raif/utils.rb
345
436
  - lib/raif/utils/colors.rb
346
437
  - lib/raif/utils/html_fragment_processor.rb
347
438
  - lib/raif/utils/html_to_markdown_converter.rb
348
439
  - lib/raif/utils/readable_content_extractor.rb
349
440
  - lib/raif/version.rb
441
+ - lib/tasks/annotate_rb.rake
350
442
  - lib/tasks/raif_tasks.rake
351
443
  - spec/support/complex_test_tool.rb
352
444
  - spec/support/current_temperature_test_tool.rb
@@ -356,6 +448,7 @@ files:
356
448
  - spec/support/test_llm.rb
357
449
  - spec/support/test_model_tool.rb
358
450
  - spec/support/test_task.rb
451
+ - spec/support/test_template_task.rb
359
452
  homepage: https://github.com/cultivatelabs/raif
360
453
  licenses:
361
454
  - MIT
@@ -378,7 +471,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
378
471
  - !ruby/object:Gem::Version
379
472
  version: '0'
380
473
  requirements: []
381
- rubygems_version: 3.6.7
474
+ rubygems_version: 3.6.9
382
475
  specification_version: 4
383
476
  summary: Raif (Ruby AI Framework) is a Rails engine that helps you add AI-powered
384
477
  features to your Rails apps, such as tasks, conversations, and agents.
@@ -1,127 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Raif
4
- module Agents
5
- class ReActAgent < Raif::Agent
6
- validates :available_model_tools, length: {
7
- minimum: 1,
8
- message: ->(_object, _data) {
9
- I18n.t("raif.agents.re_act_agent.errors.available_model_tools.too_short")
10
- }
11
- }
12
-
13
- def build_system_prompt
14
- <<~PROMPT.strip
15
- You are an intelligent assistant that follows the ReAct (Reasoning + Acting) framework to complete tasks step by step using tool calls.
16
-
17
- # Available Tools
18
- You have access to the following tools:
19
- #{available_model_tools_map.values.map(&:description_for_llm).join("\n---\n")}
20
- # Your Responses
21
- Your responses should follow this structure & format:
22
- <thought>Your step-by-step reasoning about what to do</thought>
23
- <action>JSON object with "tool" and "arguments" keys</action>
24
- <observation>Results from the tool, which will be provided to you</observation>
25
- ... (repeat Thought/Action/Observation as needed until the task is complete)
26
- <thought>Final reasoning based on all observations</thought>
27
- <answer>Your final response to the user</answer>
28
-
29
- # How to Use Tools
30
- When you need to use a tool:
31
- 1. Identify which tool is appropriate for the task
32
- 2. Format your tool call using JSON with the required arguments and place it in the <action> tag
33
- 3. Here is an example: <action>{"tool": "tool_name", "arguments": {...}}</action>
34
-
35
- # Guidelines
36
- - Always think step by step
37
- - Use tools when appropriate, but don't use tools for tasks you can handle directly
38
- - Be concise in your reasoning but thorough in your analysis
39
- - If a tool returns an error, try to understand why and adjust your approach
40
- - If you're unsure about something, explain your uncertainty, but do not make things up
41
- - After each thought, make sure to also include an <action> or <answer>
42
- - Always provide a final answer that directly addresses the user's request
43
-
44
- Remember: Your goal is to be helpful, accurate, and efficient in solving the user's request.#{system_prompt_language_preference}
45
- PROMPT
46
- end
47
-
48
- private
49
-
50
- def process_iteration_model_completion(model_completion)
51
- agent_step = Raif::Agents::ReActStep.new(model_response_text: model_completion.raw_response)
52
-
53
- # Add the thought to conversation history
54
- if agent_step.thought
55
- add_conversation_history_entry({ role: "assistant", content: "<thought>#{agent_step.thought}</thought>" })
56
- end
57
-
58
- # If there's an answer, we're done
59
- if agent_step.answer
60
- self.final_answer = agent_step.answer
61
- add_conversation_history_entry({ role: "assistant", content: "<answer>#{agent_step.answer}</answer>" })
62
- return
63
- end
64
-
65
- # If there's an action, execute it
66
- process_action(agent_step.action) if agent_step.action
67
- end
68
-
69
- def process_action(action)
70
- add_conversation_history_entry({ role: "assistant", content: "<action>#{action}</action>" })
71
-
72
- # The action should always be a JSON object with "tool" and "arguments" keys
73
- parsed_action = begin
74
- JSON.parse(action)
75
- rescue JSON::ParserError => e
76
- add_conversation_history_entry({
77
- role: "assistant",
78
- content: "<observation>Error parsing action JSON: #{e.message}</observation>"
79
- })
80
-
81
- nil
82
- end
83
-
84
- return if parsed_action.blank?
85
-
86
- unless parsed_action["tool"] && parsed_action["arguments"]
87
- add_conversation_history_entry({
88
- role: "assistant",
89
- content: "<observation>Error: Invalid action specified. Please provide a valid action, formatted as a JSON object with 'tool' and 'arguments' keys.</observation>" # rubocop:disable Layout/LineLength
90
- })
91
- return
92
- end
93
-
94
- tool_name = parsed_action["tool"]
95
- tool_arguments = parsed_action["arguments"]
96
- tool_klass = available_model_tools_map[tool_name]
97
-
98
- # The model tried to use a tool that doesn't exist
99
- unless tool_klass
100
- add_conversation_history_entry({
101
- role: "assistant",
102
- content: "<observation>Error: Tool '#{tool_name}' not found. Available tools: #{available_model_tools_map.keys.join(", ")}</observation>"
103
- })
104
- return
105
- end
106
-
107
- unless JSON::Validator.validate(tool_klass.tool_arguments_schema, tool_arguments)
108
- add_conversation_history_entry({
109
- role: "assistant",
110
- content: "<observation>Error: Invalid tool arguments. Please provide valid arguments for the tool '#{tool_name}'. Tool arguments schema: #{tool_klass.tool_arguments_schema.to_json}</observation>" # rubocop:disable Layout/LineLength
111
- })
112
- return
113
- end
114
-
115
- tool_invocation = tool_klass.invoke_tool(tool_arguments: tool_arguments, source: self)
116
- observation = tool_klass.observation_for_invocation(tool_invocation)
117
-
118
- # Add the tool invocation to conversation history
119
- add_conversation_history_entry({
120
- role: "assistant",
121
- content: "<observation>#{observation}</observation>"
122
- })
123
- end
124
-
125
- end
126
- end
127
- end
@@ -1,32 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Raif
4
- module Agents
5
- class ReActStep
6
- attr_reader :model_response_text
7
-
8
- def initialize(model_response_text:)
9
- @model_response_text = model_response_text
10
- end
11
-
12
- def thought
13
- @thought ||= extract_tag_content("thought")
14
- end
15
-
16
- def answer
17
- @answer ||= extract_tag_content("answer")
18
- end
19
-
20
- def action
21
- @action ||= extract_tag_content("action")
22
- end
23
-
24
- private
25
-
26
- def extract_tag_content(tag_name)
27
- match = model_response_text.match(%r{<#{tag_name}>(.*?)</#{tag_name}>}m)
28
- match && match[1] ? match[1].strip : nil
29
- end
30
- end
31
- end
32
- end
@@ -1,62 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Raif::Concerns::TaskRunArgs
4
- extend ActiveSupport::Concern
5
-
6
- included do
7
- class_attribute :_task_run_args, instance_writer: false, default: []
8
- end
9
-
10
- class_methods do
11
- # DSL for declaring persistent task arguments that will be serialized to the database
12
- # @param name [Symbol] The name of the argument
13
- def task_run_arg(name)
14
- # Ensure each class has its own array copy
15
- self._task_run_args = _task_run_args.dup
16
- _task_run_args << name.to_sym
17
-
18
- # Define getter that pulls from task_run_args JSON
19
- define_method(name) do
20
- return instance_variable_get("@#{name}") if instance_variable_defined?("@#{name}")
21
-
22
- value = task_run_args&.dig(name.to_s)
23
- return unless value
24
-
25
- # Deserialize GID if it's a string starting with gid://
26
- deserialized = if value.is_a?(String) && value.start_with?("gid://")
27
- begin
28
- GlobalID::Locator.locate(value)
29
- rescue ActiveRecord::RecordNotFound
30
- nil
31
- end
32
- else
33
- value
34
- end
35
-
36
- instance_variable_set("@#{name}", deserialized)
37
- end
38
-
39
- # Define setter that stores in memory (for use during run)
40
- define_method("#{name}=") do |value|
41
- instance_variable_set("@#{name}", value)
42
- end
43
- end
44
-
45
- # Transform run args into a hash that can be stored in the task_run_args database column
46
- def serialize_task_run_args(args)
47
- serialized_args = {}
48
- _task_run_args.each do |arg_name|
49
- next unless args.key?(arg_name)
50
-
51
- value = args[arg_name]
52
- serialized_args[arg_name.to_s] = if value.respond_to?(:to_global_id)
53
- value.to_global_id.to_s
54
- else
55
- value
56
- end
57
- end
58
-
59
- serialized_args
60
- end
61
- end
62
- end
@@ -1,32 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Raif
4
- module Evals
5
- class LlmJudge < Raif::Task
6
- # Set default temperature for consistent judging
7
- llm_temperature 0.0
8
-
9
- # Default to JSON response format for structured output
10
- llm_response_format :json
11
-
12
- task_run_arg :content_to_judge # the content to judge
13
- task_run_arg :additional_context # additional context to be provided to the judge
14
-
15
- def default_llm_model_key
16
- Raif.config.evals_default_llm_judge_model_key || super
17
- end
18
-
19
- def judgment_reasoning
20
- parsed_response["reasoning"] if completed?
21
- end
22
-
23
- def judgment_confidence
24
- parsed_response["confidence"] if completed?
25
- end
26
-
27
- def low_confidence?
28
- judgment_confidence && judgment_confidence < 0.5
29
- end
30
- end
31
- end
32
- end
File without changes