raif 1.2.2 → 1.4.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 (167) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +6 -5
  3. data/app/assets/builds/raif.css +4 -1
  4. data/app/assets/builds/raif_admin.css +13 -1
  5. data/app/assets/javascript/raif/controllers/conversations_controller.js +1 -1
  6. data/app/assets/stylesheets/raif/admin/conversation.scss +16 -0
  7. data/app/assets/stylesheets/raif/conversations.scss +3 -0
  8. data/app/assets/stylesheets/raif.scss +2 -1
  9. data/app/controllers/raif/admin/application_controller.rb +16 -0
  10. data/app/controllers/raif/admin/configs_controller.rb +94 -0
  11. data/app/controllers/raif/admin/model_completions_controller.rb +18 -1
  12. data/app/controllers/raif/admin/model_tool_invocations_controller.rb +7 -1
  13. data/app/controllers/raif/admin/stats/model_tool_invocations_controller.rb +21 -0
  14. data/app/controllers/raif/admin/stats/tasks_controller.rb +15 -6
  15. data/app/controllers/raif/admin/stats_controller.rb +32 -3
  16. data/app/controllers/raif/conversation_entries_controller.rb +1 -0
  17. data/app/controllers/raif/conversations_controller.rb +10 -2
  18. data/app/jobs/raif/conversation_entry_job.rb +8 -6
  19. data/app/models/raif/admin/task_stat.rb +7 -0
  20. data/app/models/raif/agent.rb +63 -2
  21. data/app/models/raif/agents/native_tool_calling_agent.rb +101 -56
  22. data/app/models/raif/application_record.rb +18 -0
  23. data/app/models/raif/concerns/agent_inference_stats.rb +35 -0
  24. data/app/models/raif/concerns/has_llm.rb +1 -1
  25. data/app/models/raif/concerns/json_schema_definition.rb +40 -5
  26. data/app/models/raif/concerns/llms/anthropic/message_formatting.rb +28 -0
  27. data/app/models/raif/concerns/llms/anthropic/response_tool_calls.rb +24 -0
  28. data/app/models/raif/concerns/llms/anthropic/tool_formatting.rb +4 -0
  29. data/app/models/raif/concerns/llms/bedrock/message_formatting.rb +36 -0
  30. data/app/models/raif/concerns/llms/bedrock/response_tool_calls.rb +26 -0
  31. data/app/models/raif/concerns/llms/bedrock/tool_formatting.rb +4 -0
  32. data/app/models/raif/concerns/llms/google/message_formatting.rb +109 -0
  33. data/app/models/raif/concerns/llms/google/response_tool_calls.rb +32 -0
  34. data/app/models/raif/concerns/llms/google/tool_formatting.rb +72 -0
  35. data/app/models/raif/concerns/llms/message_formatting.rb +11 -5
  36. data/app/models/raif/concerns/llms/open_ai/json_schema_validation.rb +3 -3
  37. data/app/models/raif/concerns/llms/open_ai_completions/message_formatting.rb +22 -0
  38. data/app/models/raif/concerns/llms/open_ai_completions/response_tool_calls.rb +22 -0
  39. data/app/models/raif/concerns/llms/open_ai_completions/tool_formatting.rb +4 -0
  40. data/app/models/raif/concerns/llms/open_ai_responses/message_formatting.rb +17 -0
  41. data/app/models/raif/concerns/llms/open_ai_responses/response_tool_calls.rb +26 -0
  42. data/app/models/raif/concerns/llms/open_ai_responses/tool_formatting.rb +4 -0
  43. data/app/models/raif/concerns/run_with.rb +127 -0
  44. data/app/models/raif/conversation.rb +96 -9
  45. data/app/models/raif/conversation_entry.rb +37 -8
  46. data/app/models/raif/embedding_model.rb +2 -1
  47. data/app/models/raif/embedding_models/open_ai.rb +1 -1
  48. data/app/models/raif/llm.rb +28 -3
  49. data/app/models/raif/llms/anthropic.rb +7 -19
  50. data/app/models/raif/llms/bedrock.rb +6 -20
  51. data/app/models/raif/llms/google.rb +140 -0
  52. data/app/models/raif/llms/open_ai_base.rb +19 -5
  53. data/app/models/raif/llms/open_ai_completions.rb +6 -11
  54. data/app/models/raif/llms/open_ai_responses.rb +6 -16
  55. data/app/models/raif/llms/open_router.rb +10 -14
  56. data/app/models/raif/model_completion.rb +61 -0
  57. data/app/models/raif/model_tool.rb +10 -2
  58. data/app/models/raif/model_tool_invocation.rb +38 -6
  59. data/app/models/raif/model_tools/agent_final_answer.rb +2 -7
  60. data/app/models/raif/model_tools/provider_managed/code_execution.rb +4 -0
  61. data/app/models/raif/model_tools/provider_managed/image_generation.rb +4 -0
  62. data/app/models/raif/model_tools/provider_managed/web_search.rb +4 -0
  63. data/app/models/raif/streaming_responses/google.rb +71 -0
  64. data/app/models/raif/task.rb +74 -18
  65. data/app/models/raif/user_tool_invocation.rb +19 -0
  66. data/app/views/layouts/raif/admin.html.erb +12 -1
  67. data/app/views/raif/admin/agents/_agent.html.erb +8 -0
  68. data/app/views/raif/admin/agents/_conversation_message.html.erb +28 -6
  69. data/app/views/raif/admin/agents/index.html.erb +2 -0
  70. data/app/views/raif/admin/agents/show.html.erb +46 -1
  71. data/app/views/raif/admin/configs/show.html.erb +117 -0
  72. data/app/views/raif/admin/conversations/_conversation_entry.html.erb +29 -34
  73. data/app/views/raif/admin/conversations/show.html.erb +2 -0
  74. data/app/views/raif/admin/model_completions/_model_completion.html.erb +9 -0
  75. data/app/views/raif/admin/model_completions/index.html.erb +26 -0
  76. data/app/views/raif/admin/model_completions/show.html.erb +124 -61
  77. data/app/views/raif/admin/model_tool_invocations/index.html.erb +22 -1
  78. data/app/views/raif/admin/model_tools/_list.html.erb +16 -0
  79. data/app/views/raif/admin/model_tools/_model_tool.html.erb +36 -0
  80. data/app/views/raif/admin/stats/_stats_tile.html.erb +34 -0
  81. data/app/views/raif/admin/stats/index.html.erb +71 -88
  82. data/app/views/raif/admin/stats/model_tool_invocations/index.html.erb +43 -0
  83. data/app/views/raif/admin/stats/tasks/index.html.erb +20 -6
  84. data/app/views/raif/admin/tasks/index.html.erb +6 -1
  85. data/app/views/raif/admin/tasks/show.html.erb +36 -3
  86. data/app/views/raif/conversation_entries/_form.html.erb +4 -1
  87. data/app/views/raif/conversations/_conversation.html.erb +10 -0
  88. data/app/views/raif/conversations/_entry_processed.turbo_stream.erb +12 -0
  89. data/app/views/raif/conversations/_full_conversation.html.erb +3 -6
  90. data/app/views/raif/conversations/_initial_chat_message.html.erb +5 -0
  91. data/app/views/raif/conversations/index.html.erb +23 -0
  92. data/config/locales/admin.en.yml +33 -1
  93. data/config/locales/en.yml +41 -4
  94. data/config/routes.rb +2 -0
  95. data/db/migrate/20250804013843_add_task_run_args_to_raif_tasks.rb +13 -0
  96. data/db/migrate/20250811171150_make_raif_task_creator_optional.rb +8 -0
  97. data/db/migrate/20250904194456_add_generating_entry_response_to_raif_conversations.rb +7 -0
  98. data/db/migrate/20250911125234_add_source_to_raif_tasks.rb +7 -0
  99. data/db/migrate/20251020005853_add_source_to_raif_agents.rb +7 -0
  100. data/db/migrate/20251020011346_rename_task_run_args_to_run_with.rb +7 -0
  101. data/db/migrate/20251020011405_add_run_with_to_raif_agents.rb +13 -0
  102. data/db/migrate/20251024160119_add_llm_messages_max_length_to_raif_conversations.rb +14 -0
  103. data/db/migrate/20251124185033_add_provider_tool_call_id_to_raif_model_tool_invocations.rb +7 -0
  104. data/db/migrate/20251128202941_add_tool_choice_to_raif_model_completions.rb +7 -0
  105. data/db/migrate/20260118144846_add_source_to_raif_conversations.rb +7 -0
  106. data/db/migrate/20260119000000_add_failure_tracking_to_raif_model_completions.rb +10 -0
  107. data/db/migrate/20260119000001_add_completed_at_to_raif_model_completions.rb +8 -0
  108. data/db/migrate/20260119000002_add_started_at_to_raif_model_completions.rb +8 -0
  109. data/exe/raif +7 -0
  110. data/lib/generators/raif/agent/agent_generator.rb +22 -7
  111. data/lib/generators/raif/agent/templates/agent.rb.tt +20 -24
  112. data/lib/generators/raif/agent/templates/agent_eval_set.rb.tt +48 -0
  113. data/lib/generators/raif/agent/templates/application_agent.rb.tt +1 -3
  114. data/lib/generators/raif/base_generator.rb +19 -0
  115. data/lib/generators/raif/conversation/conversation_generator.rb +21 -2
  116. data/lib/generators/raif/conversation/templates/application_conversation.rb.tt +0 -2
  117. data/lib/generators/raif/conversation/templates/conversation.rb.tt +34 -32
  118. data/lib/generators/raif/conversation/templates/conversation_eval_set.rb.tt +70 -0
  119. data/lib/generators/raif/eval_set/eval_set_generator.rb +28 -0
  120. data/lib/generators/raif/eval_set/templates/eval_set.rb.tt +21 -0
  121. data/lib/generators/raif/evals/setup/setup_generator.rb +47 -0
  122. data/lib/generators/raif/install/install_generator.rb +15 -0
  123. data/lib/generators/raif/install/templates/initializer.rb +89 -10
  124. data/lib/generators/raif/model_tool/model_tool_generator.rb +5 -5
  125. data/lib/generators/raif/model_tool/templates/model_tool.rb.tt +78 -78
  126. data/lib/generators/raif/model_tool/templates/model_tool_invocation_partial.html.erb.tt +1 -1
  127. data/lib/generators/raif/task/task_generator.rb +22 -3
  128. data/lib/generators/raif/task/templates/application_task.rb.tt +0 -2
  129. data/lib/generators/raif/task/templates/task.rb.tt +55 -59
  130. data/lib/generators/raif/task/templates/task_eval_set.rb.tt +54 -0
  131. data/lib/raif/cli/base.rb +39 -0
  132. data/lib/raif/cli/evals.rb +47 -0
  133. data/lib/raif/cli/evals_setup.rb +27 -0
  134. data/lib/raif/cli.rb +67 -0
  135. data/lib/raif/configuration.rb +57 -8
  136. data/lib/raif/engine.rb +8 -0
  137. data/lib/raif/errors/instance_dependent_schema_error.rb +8 -0
  138. data/lib/raif/errors/streaming_error.rb +6 -3
  139. data/lib/raif/errors.rb +1 -0
  140. data/lib/raif/evals/eval.rb +30 -0
  141. data/lib/raif/evals/eval_set.rb +111 -0
  142. data/lib/raif/evals/eval_sets/expectations.rb +53 -0
  143. data/lib/raif/evals/eval_sets/llm_judge_expectations.rb +255 -0
  144. data/lib/raif/evals/expectation_result.rb +39 -0
  145. data/lib/raif/evals/llm_judge.rb +32 -0
  146. data/lib/raif/evals/llm_judges/binary.rb +94 -0
  147. data/lib/raif/evals/llm_judges/comparative.rb +89 -0
  148. data/lib/raif/evals/llm_judges/scored.rb +63 -0
  149. data/lib/raif/evals/llm_judges/summarization.rb +166 -0
  150. data/lib/raif/evals/run.rb +202 -0
  151. data/lib/raif/evals/scoring_rubric.rb +174 -0
  152. data/lib/raif/evals.rb +26 -0
  153. data/lib/raif/json_schema_builder.rb +14 -0
  154. data/lib/raif/llm_registry.rb +218 -15
  155. data/lib/raif/messages.rb +180 -0
  156. data/lib/raif/migration_checker.rb +3 -3
  157. data/lib/raif/utils/colors.rb +23 -0
  158. data/lib/raif/utils.rb +1 -0
  159. data/lib/raif/version.rb +1 -1
  160. data/lib/raif.rb +13 -0
  161. data/lib/tasks/annotate_rb.rake +10 -0
  162. data/spec/support/current_temperature_test_tool.rb +34 -0
  163. data/spec/support/rspec_helpers.rb +8 -8
  164. data/spec/support/test_conversation.rb +1 -1
  165. metadata +77 -10
  166. data/app/models/raif/agents/re_act_agent.rb +0 -127
  167. data/app/models/raif/agents/re_act_step.rb +0 -33
metadata CHANGED
@@ -1,12 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: raif
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.2
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Roesch
8
8
  - Brian Leslie
9
- bindir: bin
9
+ bindir: exe
10
10
  cert_chain: []
11
11
  date: 1980-01-02 00:00:00.000000000 Z
12
12
  dependencies:
@@ -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
@@ -142,7 +142,8 @@ description: Raif (Ruby AI Framework) is a Rails engine that helps you add AI-po
142
142
  email:
143
143
  - ben@cultivatelabs.com
144
144
  - brian@cultivatelabs.com
145
- executables: []
145
+ executables:
146
+ - raif
146
147
  extensions: []
147
148
  extra_rdoc_files: []
148
149
  files:
@@ -159,13 +160,16 @@ files:
159
160
  - app/assets/stylesheets/raif.scss
160
161
  - app/assets/stylesheets/raif/admin/conversation.scss
161
162
  - app/assets/stylesheets/raif/admin/stats.scss
163
+ - app/assets/stylesheets/raif/conversations.scss
162
164
  - app/assets/stylesheets/raif/loader.scss
163
165
  - app/assets/stylesheets/raif_admin.scss
164
166
  - app/controllers/raif/admin/agents_controller.rb
165
167
  - app/controllers/raif/admin/application_controller.rb
168
+ - app/controllers/raif/admin/configs_controller.rb
166
169
  - app/controllers/raif/admin/conversations_controller.rb
167
170
  - app/controllers/raif/admin/model_completions_controller.rb
168
171
  - app/controllers/raif/admin/model_tool_invocations_controller.rb
172
+ - app/controllers/raif/admin/stats/model_tool_invocations_controller.rb
169
173
  - app/controllers/raif/admin/stats/tasks_controller.rb
170
174
  - app/controllers/raif/admin/stats_controller.rb
171
175
  - app/controllers/raif/admin/tasks_controller.rb
@@ -176,11 +180,11 @@ files:
176
180
  - app/helpers/raif/shared/conversations_helper.rb
177
181
  - app/jobs/raif/application_job.rb
178
182
  - app/jobs/raif/conversation_entry_job.rb
183
+ - app/models/raif/admin/task_stat.rb
179
184
  - app/models/raif/agent.rb
180
185
  - app/models/raif/agents/native_tool_calling_agent.rb
181
- - app/models/raif/agents/re_act_agent.rb
182
- - app/models/raif/agents/re_act_step.rb
183
186
  - app/models/raif/application_record.rb
187
+ - app/models/raif/concerns/agent_inference_stats.rb
184
188
  - app/models/raif/concerns/boolean_timestamp.rb
185
189
  - app/models/raif/concerns/has_available_model_tools.rb
186
190
  - app/models/raif/concerns/has_llm.rb
@@ -190,15 +194,23 @@ files:
190
194
  - app/models/raif/concerns/llm_response_parsing.rb
191
195
  - app/models/raif/concerns/llm_temperature.rb
192
196
  - app/models/raif/concerns/llms/anthropic/message_formatting.rb
197
+ - app/models/raif/concerns/llms/anthropic/response_tool_calls.rb
193
198
  - app/models/raif/concerns/llms/anthropic/tool_formatting.rb
194
199
  - app/models/raif/concerns/llms/bedrock/message_formatting.rb
200
+ - app/models/raif/concerns/llms/bedrock/response_tool_calls.rb
195
201
  - app/models/raif/concerns/llms/bedrock/tool_formatting.rb
202
+ - app/models/raif/concerns/llms/google/message_formatting.rb
203
+ - app/models/raif/concerns/llms/google/response_tool_calls.rb
204
+ - app/models/raif/concerns/llms/google/tool_formatting.rb
196
205
  - app/models/raif/concerns/llms/message_formatting.rb
197
206
  - app/models/raif/concerns/llms/open_ai/json_schema_validation.rb
198
207
  - app/models/raif/concerns/llms/open_ai_completions/message_formatting.rb
208
+ - app/models/raif/concerns/llms/open_ai_completions/response_tool_calls.rb
199
209
  - app/models/raif/concerns/llms/open_ai_completions/tool_formatting.rb
200
210
  - app/models/raif/concerns/llms/open_ai_responses/message_formatting.rb
211
+ - app/models/raif/concerns/llms/open_ai_responses/response_tool_calls.rb
201
212
  - app/models/raif/concerns/llms/open_ai_responses/tool_formatting.rb
213
+ - app/models/raif/concerns/run_with.rb
202
214
  - app/models/raif/conversation.rb
203
215
  - app/models/raif/conversation_entry.rb
204
216
  - app/models/raif/embedding_model.rb
@@ -207,6 +219,7 @@ files:
207
219
  - app/models/raif/llm.rb
208
220
  - app/models/raif/llms/anthropic.rb
209
221
  - app/models/raif/llms/bedrock.rb
222
+ - app/models/raif/llms/google.rb
210
223
  - app/models/raif/llms/open_ai_base.rb
211
224
  - app/models/raif/llms/open_ai_completions.rb
212
225
  - app/models/raif/llms/open_ai_responses.rb
@@ -225,6 +238,7 @@ files:
225
238
  - app/models/raif/model_tools/wikipedia_search.rb
226
239
  - app/models/raif/streaming_responses/anthropic.rb
227
240
  - app/models/raif/streaming_responses/bedrock.rb
241
+ - app/models/raif/streaming_responses/google.rb
228
242
  - app/models/raif/streaming_responses/open_ai_completions.rb
229
243
  - app/models/raif/streaming_responses/open_ai_responses.rb
230
244
  - app/models/raif/task.rb
@@ -234,6 +248,7 @@ files:
234
248
  - app/views/raif/admin/agents/_conversation_message.html.erb
235
249
  - app/views/raif/admin/agents/index.html.erb
236
250
  - app/views/raif/admin/agents/show.html.erb
251
+ - app/views/raif/admin/configs/show.html.erb
237
252
  - app/views/raif/admin/conversations/_conversation.html.erb
238
253
  - app/views/raif/admin/conversations/_conversation_entry.html.erb
239
254
  - app/views/raif/admin/conversations/index.html.erb
@@ -244,7 +259,11 @@ files:
244
259
  - app/views/raif/admin/model_tool_invocations/_model_tool_invocation.html.erb
245
260
  - app/views/raif/admin/model_tool_invocations/index.html.erb
246
261
  - app/views/raif/admin/model_tool_invocations/show.html.erb
262
+ - app/views/raif/admin/model_tools/_list.html.erb
263
+ - app/views/raif/admin/model_tools/_model_tool.html.erb
264
+ - app/views/raif/admin/stats/_stats_tile.html.erb
247
265
  - app/views/raif/admin/stats/index.html.erb
266
+ - app/views/raif/admin/stats/model_tool_invocations/index.html.erb
248
267
  - app/views/raif/admin/stats/tasks/index.html.erb
249
268
  - app/views/raif/admin/tasks/_task.html.erb
250
269
  - app/views/raif/admin/tasks/index.html.erb
@@ -260,7 +279,11 @@ files:
260
279
  - app/views/raif/conversation_entries/create.turbo_stream.erb
261
280
  - app/views/raif/conversation_entries/new.turbo_stream.erb
262
281
  - app/views/raif/conversations/_available_user_tools.html.erb
282
+ - app/views/raif/conversations/_conversation.html.erb
283
+ - app/views/raif/conversations/_entry_processed.turbo_stream.erb
263
284
  - app/views/raif/conversations/_full_conversation.html.erb
285
+ - app/views/raif/conversations/_initial_chat_message.html.erb
286
+ - app/views/raif/conversations/index.html.erb
264
287
  - app/views/raif/conversations/show.html.erb
265
288
  - config/i18n-tasks.yml
266
289
  - config/importmap.rb
@@ -277,12 +300,33 @@ files:
277
300
  - db/migrate/20250527213016_add_response_id_and_response_array_to_model_completions.rb
278
301
  - db/migrate/20250603140622_add_citations_to_raif_model_completions.rb
279
302
  - db/migrate/20250603202013_add_stream_response_to_raif_model_completions.rb
303
+ - db/migrate/20250804013843_add_task_run_args_to_raif_tasks.rb
304
+ - db/migrate/20250811171150_make_raif_task_creator_optional.rb
305
+ - db/migrate/20250904194456_add_generating_entry_response_to_raif_conversations.rb
306
+ - db/migrate/20250911125234_add_source_to_raif_tasks.rb
307
+ - db/migrate/20251020005853_add_source_to_raif_agents.rb
308
+ - db/migrate/20251020011346_rename_task_run_args_to_run_with.rb
309
+ - db/migrate/20251020011405_add_run_with_to_raif_agents.rb
310
+ - db/migrate/20251024160119_add_llm_messages_max_length_to_raif_conversations.rb
311
+ - db/migrate/20251124185033_add_provider_tool_call_id_to_raif_model_tool_invocations.rb
312
+ - db/migrate/20251128202941_add_tool_choice_to_raif_model_completions.rb
313
+ - db/migrate/20260118144846_add_source_to_raif_conversations.rb
314
+ - db/migrate/20260119000000_add_failure_tracking_to_raif_model_completions.rb
315
+ - db/migrate/20260119000001_add_completed_at_to_raif_model_completions.rb
316
+ - db/migrate/20260119000002_add_started_at_to_raif_model_completions.rb
317
+ - exe/raif
280
318
  - lib/generators/raif/agent/agent_generator.rb
281
319
  - lib/generators/raif/agent/templates/agent.rb.tt
320
+ - lib/generators/raif/agent/templates/agent_eval_set.rb.tt
282
321
  - lib/generators/raif/agent/templates/application_agent.rb.tt
322
+ - lib/generators/raif/base_generator.rb
283
323
  - lib/generators/raif/conversation/conversation_generator.rb
284
324
  - lib/generators/raif/conversation/templates/application_conversation.rb.tt
285
325
  - lib/generators/raif/conversation/templates/conversation.rb.tt
326
+ - lib/generators/raif/conversation/templates/conversation_eval_set.rb.tt
327
+ - lib/generators/raif/eval_set/eval_set_generator.rb
328
+ - lib/generators/raif/eval_set/templates/eval_set.rb.tt
329
+ - lib/generators/raif/evals/setup/setup_generator.rb
286
330
  - lib/generators/raif/install/install_generator.rb
287
331
  - lib/generators/raif/install/templates/initializer.rb
288
332
  - lib/generators/raif/model_tool/model_tool_generator.rb
@@ -291,13 +335,19 @@ files:
291
335
  - lib/generators/raif/task/task_generator.rb
292
336
  - lib/generators/raif/task/templates/application_task.rb.tt
293
337
  - lib/generators/raif/task/templates/task.rb.tt
338
+ - lib/generators/raif/task/templates/task_eval_set.rb.tt
294
339
  - lib/generators/raif/views_generator.rb
295
340
  - lib/raif.rb
341
+ - lib/raif/cli.rb
342
+ - lib/raif/cli/base.rb
343
+ - lib/raif/cli/evals.rb
344
+ - lib/raif/cli/evals_setup.rb
296
345
  - lib/raif/configuration.rb
297
346
  - lib/raif/embedding_model_registry.rb
298
347
  - lib/raif/engine.rb
299
348
  - lib/raif/errors.rb
300
349
  - lib/raif/errors/action_not_authorized_error.rb
350
+ - lib/raif/errors/instance_dependent_schema_error.rb
301
351
  - lib/raif/errors/invalid_config_error.rb
302
352
  - lib/raif/errors/invalid_conversation_type_error.rb
303
353
  - lib/raif/errors/invalid_model_file_input_error.rb
@@ -306,18 +356,35 @@ files:
306
356
  - lib/raif/errors/open_ai/json_schema_error.rb
307
357
  - lib/raif/errors/streaming_error.rb
308
358
  - lib/raif/errors/unsupported_feature_error.rb
359
+ - lib/raif/evals.rb
360
+ - lib/raif/evals/eval.rb
361
+ - lib/raif/evals/eval_set.rb
362
+ - lib/raif/evals/eval_sets/expectations.rb
363
+ - lib/raif/evals/eval_sets/llm_judge_expectations.rb
364
+ - lib/raif/evals/expectation_result.rb
365
+ - lib/raif/evals/llm_judge.rb
366
+ - lib/raif/evals/llm_judges/binary.rb
367
+ - lib/raif/evals/llm_judges/comparative.rb
368
+ - lib/raif/evals/llm_judges/scored.rb
369
+ - lib/raif/evals/llm_judges/summarization.rb
370
+ - lib/raif/evals/run.rb
371
+ - lib/raif/evals/scoring_rubric.rb
309
372
  - lib/raif/json_schema_builder.rb
310
373
  - lib/raif/languages.rb
311
374
  - lib/raif/llm_registry.rb
375
+ - lib/raif/messages.rb
312
376
  - lib/raif/migration_checker.rb
313
377
  - lib/raif/rspec.rb
314
378
  - lib/raif/utils.rb
379
+ - lib/raif/utils/colors.rb
315
380
  - lib/raif/utils/html_fragment_processor.rb
316
381
  - lib/raif/utils/html_to_markdown_converter.rb
317
382
  - lib/raif/utils/readable_content_extractor.rb
318
383
  - lib/raif/version.rb
384
+ - lib/tasks/annotate_rb.rake
319
385
  - lib/tasks/raif_tasks.rake
320
386
  - spec/support/complex_test_tool.rb
387
+ - spec/support/current_temperature_test_tool.rb
321
388
  - spec/support/rspec_helpers.rb
322
389
  - spec/support/test_conversation.rb
323
390
  - spec/support/test_embedding_model.rb
@@ -346,7 +413,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
346
413
  - !ruby/object:Gem::Version
347
414
  version: '0'
348
415
  requirements: []
349
- rubygems_version: 3.6.7
416
+ rubygems_version: 3.6.9
350
417
  specification_version: 4
351
418
  summary: Raif (Ruby AI Framework) is a Rails engine that helps you add AI-powered
352
419
  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,33 +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].strip : nil
29
- end
30
-
31
- end
32
- end
33
- end