roast-ai 1.1.0 → 1.2.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 (44) hide show
  1. checksums.yaml +4 -4
  2. data/.claude/commands/docs/write-comments.md +1 -1
  3. data/.rubocop.yml +10 -1
  4. data/Gemfile.lock +123 -18
  5. data/README.md +56 -3
  6. data/examples/custom_logging.rb +4 -2
  7. data/examples/demo/Gemfile.lock +17 -15
  8. data/examples/plugin-gem-example/Gemfile.lock +15 -15
  9. data/examples/simple_chat.rb +1 -1
  10. data/internal/rubocop/cop/roast/no_test_class_nesting.rb +126 -0
  11. data/internal/rubocop/rubocop-roast.yml +6 -0
  12. data/internal/workflows/maintenance/branch_docs_impact.rb +97 -0
  13. data/internal/workflows/maintenance/deprecated_models_docs_updater.rb +78 -0
  14. data/lib/roast/cog/config.rb +1 -1
  15. data/lib/roast/cog_input_manager.rb +28 -7
  16. data/lib/roast/cogs/agent/config.rb +1 -1
  17. data/lib/roast/cogs/agent/providers/claude/claude_invocation.rb +2 -2
  18. data/lib/roast/cogs/agent/providers/claude/messages/result_message.rb +1 -1
  19. data/lib/roast/cogs/agent/providers/claude/tool_result.rb +344 -4
  20. data/lib/roast/cogs/agent/providers/claude/tool_use.rb +356 -1
  21. data/lib/roast/cogs/agent/providers/pi/pi_invocation.rb +2 -2
  22. data/lib/roast/cogs/agent.rb +3 -2
  23. data/lib/roast/cogs/chat/config.rb +28 -2
  24. data/lib/roast/cogs/chat.rb +82 -10
  25. data/lib/roast/event.rb +1 -0
  26. data/lib/roast/event_monitor.rb +35 -3
  27. data/lib/roast/log.rb +21 -0
  28. data/lib/roast/log_formatter.rb +9 -7
  29. data/lib/roast/version.rb +1 -1
  30. data/roast-ai.gemspec +1 -1
  31. data/tutorial/01_your_first_workflow/README.md +9 -5
  32. data/tutorial/01_your_first_workflow/configured_chat.rb +1 -1
  33. data/tutorial/02_chaining_cogs/README.md +2 -2
  34. data/tutorial/02_chaining_cogs/code_review.rb +1 -1
  35. data/tutorial/02_chaining_cogs/session_resumption.rb +1 -1
  36. data/tutorial/03_targets_and_params/README.md +1 -1
  37. data/tutorial/04_configuration_options/README.md +2 -2
  38. data/tutorial/08_iterative_workflows/README.md +1 -1
  39. data/tutorial/README.md +1 -1
  40. metadata +12 -8
  41. /data/internal/documentation/{architectural-notes.md → comments/architectural-notes.md} +0 -0
  42. /data/internal/documentation/{doc-comments-external.md → comments/doc-comments-external.md} +0 -0
  43. /data/internal/documentation/{doc-comments-internal.md → comments/doc-comments-internal.md} +0 -0
  44. /data/internal/documentation/{doc-comments.md → comments/doc-comments.md} +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 493182d7cf3f626050e7e580402cda301cccf7da038072fec060e8e142a067a8
4
- data.tar.gz: b1a789f8383a9644f0a7d91c7485b14def95574ff5a5e59e7be7ca17a1bf3ff5
3
+ metadata.gz: a6062453625ebfdec9aa48a51e5fa8e99deef186142adad84038a6587eba49e5
4
+ data.tar.gz: c95063f6f8ad36084ee36b73e8830f50147e65970e7005a26eea375e33f1a4a1
5
5
  SHA512:
6
- metadata.gz: 30044c47daf5c6c6856b5d947c2740a0df631f59079332cb15d01c02db18aec6a943b193e3b54718162379d186f9e33ca08b163fe1b2d98d13c2da0c5aa6f358
7
- data.tar.gz: 1546e8c8128a4bf80a55faa80b07872bb12faaac9b21b61f75f62a4024f50b033441be0a8f9883b29af15b8d0951121e09c80a68c8c3a4fc69a8df7a298f5704
6
+ metadata.gz: 8272e051e7a093aa6486d9ece57ec3981a93ca92266464ffc72fb2db85f56bf7f27dd9b9be47b3c327771e384e2fa7758b9172f90e51d88ae36ff7bd3a66ed27
7
+ data.tar.gz: fd1c2df5ce3fe87049d30212cfcd6d93f5bb79519a0efc2a519a57a6bb1e1b29837aa0cb4ac80f30cebe0cfab5ac40994ce1beaec2f16ee0fdc1db713b0ffcb4
@@ -8,7 +8,7 @@ Accepts either:
8
8
 
9
9
  ## Task
10
10
 
11
- Following the guidelines in `internal/documentation/`:
11
+ Following the guidelines in `internal/documentation/comments/`:
12
12
 
13
13
  1. **Determine documentation type:**
14
14
  - For Config, Input, Output classes → Use `doc-comments-external.md` (user-facing, thorough)
data/.rubocop.yml CHANGED
@@ -1,4 +1,9 @@
1
- inherit_from: .rubocop_todo.yml
1
+ inherit_from:
2
+ - .rubocop_todo.yml
3
+ - internal/rubocop/rubocop-roast.yml
4
+
5
+ require:
6
+ - ./internal/rubocop/cop/roast/no_test_class_nesting
2
7
 
3
8
  plugins:
4
9
  - rubocop-sorbet
@@ -32,6 +37,10 @@ Sorbet/FalseSigil:
32
37
  - "examples/**/*"
33
38
  - "lib/roast/sorbet_runtime_stub.rb"
34
39
 
40
+ Style/ClassAndModuleChildren:
41
+ Exclude:
42
+ - 'test/**/*.rb'
43
+
35
44
  Style/MethodCallWithArgsParentheses:
36
45
  Enabled: true
37
46
  Exclude:
data/Gemfile.lock CHANGED
@@ -1,18 +1,18 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- roast-ai (1.1.0)
4
+ roast-ai (1.2.0)
5
5
  activesupport (~> 8.0)
6
6
  async (>= 2.34)
7
7
  rainbow (>= 3.0.0)
8
- ruby_llm (>= 1.8)
8
+ ruby_llm (>= 1.13)
9
9
  type_toolkit (>= 0.0.5)
10
10
  zeitwerk (>= 2.6)
11
11
 
12
12
  GEM
13
13
  remote: https://rubygems.org/
14
14
  specs:
15
- activesupport (8.0.2)
15
+ activesupport (8.0.4.1)
16
16
  base64
17
17
  benchmark (>= 0.3)
18
18
  bigdecimal
@@ -21,12 +21,12 @@ GEM
21
21
  drb
22
22
  i18n (>= 1.6, < 2)
23
23
  logger (>= 1.4.2)
24
- minitest (>= 5.1)
24
+ minitest (>= 5.1, < 6)
25
25
  securerandom (>= 0.3)
26
26
  tzinfo (~> 2.0, >= 2.0.5)
27
27
  uri (>= 0.13.1)
28
- addressable (2.8.7)
29
- public_suffix (>= 2.0.2, < 7.0)
28
+ addressable (2.9.0)
29
+ public_suffix (>= 2.0.2, < 8.0)
30
30
  ast (2.4.3)
31
31
  async (2.34.0)
32
32
  console (~> 1.29)
@@ -35,11 +35,11 @@ GEM
35
35
  metrics (~> 0.12)
36
36
  traces (~> 0.18)
37
37
  base64 (0.3.0)
38
- benchmark (0.4.1)
39
- bigdecimal (3.2.2)
38
+ benchmark (0.5.0)
39
+ bigdecimal (4.1.2)
40
40
  coderay (1.1.3)
41
- concurrent-ruby (1.3.5)
42
- connection_pool (2.5.3)
41
+ concurrent-ruby (1.3.7)
42
+ connection_pool (3.0.2)
43
43
  console (1.34.2)
44
44
  fiber-annotation
45
45
  fiber-local (~> 1.1)
@@ -51,13 +51,13 @@ GEM
51
51
  drb (2.2.3)
52
52
  erubi (1.13.1)
53
53
  event_stream_parser (1.0.0)
54
- faraday (2.14.1)
54
+ faraday (2.14.3)
55
55
  faraday-net_http (>= 2.0, < 3.5)
56
56
  json
57
57
  logger
58
58
  faraday-multipart (1.1.1)
59
59
  multipart-post (~> 2.0)
60
- faraday-net_http (3.4.2)
60
+ faraday-net_http (3.4.4)
61
61
  net-http (~> 0.5)
62
62
  faraday-retry (2.3.2)
63
63
  faraday (~> 2.0)
@@ -84,10 +84,10 @@ GEM
84
84
  guard-compat (~> 1.2)
85
85
  minitest (>= 3.0)
86
86
  hashdiff (1.2.0)
87
- i18n (1.14.7)
87
+ i18n (1.15.2)
88
88
  concurrent-ruby (~> 1.0)
89
89
  io-event (1.14.0)
90
- json (2.18.1)
90
+ json (2.20.0)
91
91
  language_server-protocol (3.17.0.5)
92
92
  lint_roller (1.1.0)
93
93
  listen (3.9.0)
@@ -120,7 +120,7 @@ GEM
120
120
  pry (0.15.2)
121
121
  coderay (~> 1.1)
122
122
  method_source (~> 1.0)
123
- public_suffix (6.0.2)
123
+ public_suffix (7.0.5)
124
124
  racc (1.8.1)
125
125
  rainbow (3.1.1)
126
126
  rake (13.3.0)
@@ -158,15 +158,17 @@ GEM
158
158
  rubocop (>= 1.75.2)
159
159
  ruby-progressbar (1.13.0)
160
160
  ruby2_keywords (0.0.5)
161
- ruby_llm (1.8.2)
161
+ ruby_llm (1.15.0)
162
162
  base64
163
163
  event_stream_parser (~> 1)
164
164
  faraday (>= 1.10.0)
165
165
  faraday-multipart (>= 1)
166
166
  faraday-net_http (>= 1)
167
167
  faraday-retry (>= 1)
168
- marcel (~> 1.0)
168
+ marcel (~> 1)
169
+ ruby_llm-schema (~> 0)
169
170
  zeitwerk (~> 2)
171
+ ruby_llm-schema (0.3.0)
170
172
  securerandom (0.4.1)
171
173
  shellany (0.0.1)
172
174
  simplecov (0.22.0)
@@ -222,7 +224,7 @@ GEM
222
224
  addressable (>= 2.8.0)
223
225
  crack (>= 0.3.2)
224
226
  hashdiff (>= 0.4.0, < 2.0.0)
225
- yard (0.9.37)
227
+ yard (0.9.42)
226
228
  yard-sorbet (0.9.0)
227
229
  sorbet-runtime
228
230
  yard
@@ -249,5 +251,108 @@ DEPENDENCIES
249
251
  vcr
250
252
  webmock
251
253
 
254
+ CHECKSUMS
255
+ activesupport (8.0.4.1) sha256=822187e99ebca3e90bf03e6ccef5b57447592657f6b1676ccaaa25794ebfc7e6
256
+ addressable (2.9.0) sha256=7fdf6ac3660f7f4e867a0838be3f6cf722ace541dd97767fa42bc6cfa980c7af
257
+ ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383
258
+ async (2.34.0) sha256=65ab207d4575c05bb6c5bac430f9f8d372d8288686e68e89f44eba094c77e1c1
259
+ base64 (0.3.0) sha256=27337aeabad6ffae05c265c450490628ef3ebd4b67be58257393227588f5a97b
260
+ benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c
261
+ bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd
262
+ coderay (1.1.3) sha256=dc530018a4684512f8f38143cd2a096c9f02a1fc2459edcfe534787a7fc77d4b
263
+ concurrent-ruby (1.3.7) sha256=4412caec3a5ea2e5fdc52076724c071a81f2c0593d83b2ac8cbb8ca63b3151b0
264
+ connection_pool (3.0.2) sha256=33fff5ba71a12d2aa26cb72b1db8bba2a1a01823559fb01d29eb74c286e62e0a
265
+ console (1.34.2) sha256=1c036abf606ccec83f9dc28f0c31710fe5936ffe7ba5d235ae2865590a482d58
266
+ crack (1.0.0) sha256=c83aefdb428cdc7b66c7f287e488c796f055c0839e6e545fec2c7047743c4a49
267
+ docile (1.4.1) sha256=96159be799bfa73cdb721b840e9802126e4e03dfc26863db73647204c727f21e
268
+ drb (2.2.3) sha256=0b00d6fdb50995fe4a45dea13663493c841112e4068656854646f418fda13373
269
+ erubi (1.13.1) sha256=a082103b0885dbc5ecf1172fede897f9ebdb745a4b97a5e8dc63953db1ee4ad9
270
+ event_stream_parser (1.0.0) sha256=a2683bab70126286f8184dc88f7968ffc4028f813161fb073ec90d171f7de3c8
271
+ faraday (2.14.3) sha256=1882247e6766615c8220b4392bf1d27f6ebb63d8e28267587cef1fb0bf37f278
272
+ faraday-multipart (1.1.1) sha256=77a18ff40149030fd1aef55bb4fc7a67ce46419a8a3fcd010e28c2526e8d8903
273
+ faraday-net_http (3.4.4) sha256=0e78af151747ed1b00f33e25973b4bc220d7f16c00c39676817c8b12331eb588
274
+ faraday-retry (2.3.2) sha256=2402d2029032ebd238a2046221e67f6ef0da78c5a8ce8cd4f8b9c62e4d6451d1
275
+ ffi (1.17.2-arm64-darwin) sha256=54dd9789be1d30157782b8de42d8f887a3c3c345293b57ffb6b45b4d1165f813
276
+ ffi (1.17.2-x86_64-linux-gnu) sha256=05d2026fc9dbb7cfd21a5934559f16293815b7ce0314846fee2ac8efbdb823ea
277
+ fiber-annotation (0.2.0) sha256=7abfadf1d119f508867d4103bf231c0354d019cc39a5738945dec2edadaf6c03
278
+ fiber-local (1.1.0) sha256=c885f94f210fb9b05737de65d511136ea602e00c5105953748aa0f8793489f06
279
+ fiber-storage (1.0.1) sha256=f48e5b6d8b0be96dac486332b55cee82240057065dc761c1ea692b2e719240e1
280
+ formatador (1.1.0) sha256=54e23e2af4d60bb9327c7fac62b29968e4cf28cee0111f726d0bdeadc85e06d0
281
+ guard (2.19.1) sha256=b8bc52694be3d8b26730280de7dcec7fe92ea1cff3414246fe96af3f23580f3d
282
+ guard-compat (1.2.1) sha256=3ad21ab0070107f92edfd82610b5cdc2fb8e368851e72362ada9703443d646fe
283
+ guard-minitest (2.4.6) sha256=d89e83d029447c13b191599085d24b6e2fe61e402d275e46491cd3e82f561572
284
+ hashdiff (1.2.0) sha256=c984f13e115bfc9953332e8e83bd9d769cfde9944e2d54e07eb9df7b76e140b5
285
+ i18n (1.15.2) sha256=00f9eb62412fe593b2a65a97daa75300d37abb8f7202ec748e94b6d46a9dd1b5
286
+ io-event (1.14.0) sha256=e52abe4fa1f48e8b4311aa252c4b1f466716a038d01ff7ae83c72385bb209436
287
+ json (2.20.0) sha256=9362bc6e55a952b056abf9167cf053358181c904cb70cd6eee0808ea830fc32b
288
+ language_server-protocol (3.17.0.5) sha256=fd1e39a51a28bf3eec959379985a72e296e9f9acfce46f6a79d31ca8760803cc
289
+ lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87
290
+ listen (3.9.0) sha256=db9e4424e0e5834480385197c139cb6b0ae0ef28cc13310cfd1ca78377d59c67
291
+ logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203
292
+ lumberjack (1.2.10) sha256=bbfe951629341095028ecbf1ad496b58bec3f8bcad6fe35a203a377839c42b6c
293
+ marcel (1.1.0) sha256=fdcfcfa33cc52e93c4308d40e4090a5d4ea279e160a7f6af988260fa970e0bee
294
+ method_source (1.1.0) sha256=181301c9c45b731b4769bc81e8860e72f9161ad7d66dd99103c9ab84f560f5c5
295
+ metrics (0.15.0) sha256=61ded5bac95118e995b1bc9ed4a5f19bc9814928a312a85b200abbdac9039072
296
+ minitest (5.25.5) sha256=391b6c6cb43a4802bfb7c93af1ebe2ac66a210293f4a3fb7db36f2fc7dc2c756
297
+ minitest-rg (5.3.0) sha256=12a1b0ecdd71bc484cff1c65a4a51bdee3a64109bfc8133b67146edbd2ac8f6f
298
+ mocha (2.7.1) sha256=8f7d538d5d3ebc75fc788b3d92fbab913a93a78462d2a3ce99d1bdde7af7f851
299
+ multipart-post (2.4.1) sha256=9872d03a8e552020ca096adadbf5e3cb1cd1cdd6acd3c161136b8a5737cdb4a8
300
+ nenv (0.3.0) sha256=d9de6d8fb7072228463bf61843159419c969edb34b3cef51832b516ae7972765
301
+ net-http (0.9.1) sha256=25ba0b67c63e89df626ed8fac771d0ad24ad151a858af2cc8e6a716ca4336996
302
+ netrc (0.11.0) sha256=de1ce33da8c99ab1d97871726cba75151113f117146becbe45aa85cb3dabee3f
303
+ notiffany (0.1.3) sha256=d37669605b7f8dcb04e004e6373e2a780b98c776f8eb503ac9578557d7808738
304
+ ostruct (0.6.2) sha256=6d7302a299e400a2c248d6ce0dad18fc3a5714e8096facc25ffd0c54ee57cfc0
305
+ parallel (1.27.0) sha256=4ac151e1806b755fb4e2dc2332cbf0e54f2e24ba821ff2d3dcf86bf6dc4ae130
306
+ parser (3.3.8.0) sha256=2476364142b307fa5a1b1ece44f260728be23858a9c71078e956131a75453c45
307
+ prism (1.4.0) sha256=dc0e3e00e93160213dc2a65519d9002a4a1e7b962db57d444cf1a71565bb703e
308
+ pry (0.15.2) sha256=12d54b8640d3fa29c9211dd4ffb08f3fd8bf7a4fd9b5a73ce5b59c8709385b6b
309
+ public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623
310
+ racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f
311
+ rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a
312
+ rake (13.3.0) sha256=96f5092d786ff412c62fde76f793cc0541bd84d2eb579caa529aa8a059934493
313
+ rb-fsevent (0.11.2) sha256=43900b972e7301d6570f64b850a5aa67833ee7d87b458ee92805d56b7318aefe
314
+ rb-inotify (0.11.1) sha256=a0a700441239b0ff18eb65e3866236cd78613d6b9f78fea1f9ac47a85e47be6e
315
+ rbi (0.3.9) sha256=d6a187bd0b376e999d3d82a5e5798a61178be98b894b7b35741c14162c9ea015
316
+ rbs (4.0.0.dev.5) sha256=273938e5a9c7f06b041be583588f2aa1976149bda2ce213e33e129c51534e174
317
+ regexp_parser (2.10.0) sha256=cb6f0ddde88772cd64bff1dbbf68df66d376043fe2e66a9ef77fcb1b0c548c61
318
+ require-hooks (0.2.3) sha256=224be5b4be0fd2a47cb73286c500da366704a54ec195b6627366380c950efac8
319
+ rexml (3.4.2) sha256=1384268554a37af5da5279431ca3f2f37d46f09ffdd6c95e17cc84c83ea7c417
320
+ roast-ai (1.2.0)
321
+ rubocop (1.77.0) sha256=1f360b4575ef7a124be27b0dfffa227a2b2d9420d22d4fd8bf179d702bcc88c0
322
+ rubocop-ast (1.45.1) sha256=94042e49adc17f187ba037b33f941ba7398fede77cdf4bffafba95190a473a3e
323
+ rubocop-shopify (2.17.1) sha256=03850eb1a9c4d1f9f0ac1d8d5aa51bb47a149e532cfb5e8d02ac6a90c8800a5f
324
+ rubocop-sorbet (0.10.5) sha256=221672c096616d908a06aadd5111bfaab6d3c990d2a1caf2714cdec6514f4795
325
+ ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33
326
+ ruby2_keywords (0.0.5) sha256=ffd13740c573b7301cf7a2e61fc857b2a8e3d3aff32545d6f8300d8bae10e3ef
327
+ ruby_llm (1.15.0) sha256=ca207465bca1cca007010a79fce500d4012b1fbe188b025040cd37b884fb98af
328
+ ruby_llm-schema (0.3.0) sha256=a591edc5ca1b7f0304f0e2261de61ba4b3bea17be09f5cf7558153adfda3dec6
329
+ securerandom (0.4.1) sha256=cc5193d414a4341b6e225f0cb4446aceca8e50d5e1888743fac16987638ea0b1
330
+ shellany (0.0.1) sha256=0e127a9132698766d7e752e82cdac8250b6adbd09e6c0a7fbbb6f61964fedee7
331
+ simplecov (0.22.0) sha256=fe2622c7834ff23b98066bb0a854284b2729a569ac659f82621fc22ef36213a5
332
+ simplecov-html (0.13.2) sha256=bd0b8e54e7c2d7685927e8d6286466359b6f16b18cb0df47b508e8d73c777246
333
+ simplecov_json_formatter (0.1.4) sha256=529418fbe8de1713ac2b2d612aa3daa56d316975d307244399fa4838c601b428
334
+ sorbet (0.6.12984) sha256=f7b03699d62eeec2d0ea685e7c27334e81de11842a119d5fc01031112d7c3656
335
+ sorbet-runtime (0.6.12984) sha256=3fff20a5b147a2e191210563d61886ac121fc1cd8b5e0faf6bc18873139e0fe4
336
+ sorbet-static (0.6.12984-universal-darwin) sha256=0ac0a696cbcf422f4fe590064db9a2248fae50ed96094504be72a2709a63ae23
337
+ sorbet-static (0.6.12984-x86_64-linux) sha256=39c03af15badb204d640fbc6398bee171f4026377f31cba08cdb381091159c57
338
+ sorbet-static-and-runtime (0.6.12984) sha256=281b39ef61aee83551333df581a8d53737bc39df19e09e9cbe01ca8f8b93826f
339
+ spoom (1.7.11) sha256=4e27384af6d3fde5aadc0287c51e6f76c0802259cbb3b6a67603bf718352f4cf
340
+ sqlite3 (2.9.0-arm64-darwin) sha256=a917bd9b84285766ff3300b7d79cd583f5a067594c8c1263e6441618c04a6ed3
341
+ sqlite3 (2.9.0-x86_64-linux-gnu) sha256=72fff9bd750070ba3af695511ba5f0e0a2d8a9206f84869640b3e99dfaf3d5a5
342
+ tapioca (0.17.10) sha256=880a682ca8314f798dd09e9f104134fbf1a713c13be51f7dd4741dd434e6471b
343
+ thor (1.4.0) sha256=8763e822ccb0f1d7bee88cde131b19a65606657b847cc7b7b4b82e772bcd8a3d
344
+ traces (0.18.2) sha256=80f1649cb4daace1d7174b81f3b3b7427af0b93047759ba349960cb8f315e214
345
+ tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f
346
+ type_toolkit (0.0.5) sha256=5bb0b6b656728da43db0e1a1a48e99a41e70851ce660ac5759dd077473bd1875
347
+ tzinfo (2.0.6) sha256=8daf828cc77bcf7d63b0e3bdb6caa47e2272dcfaf4fbfe46f8c3a9df087a829b
348
+ unicode-display_width (3.1.4) sha256=8caf2af1c0f2f07ec89ef9e18c7d88c2790e217c482bfc78aaa65eadd5415ac1
349
+ unicode-emoji (4.0.4) sha256=2c2c4ef7f353e5809497126285a50b23056cc6e61b64433764a35eff6c36532a
350
+ uri (1.1.1) sha256=379fa58d27ffb1387eaada68c749d1426738bd0f654d812fcc07e7568f5c57c6
351
+ vcr (6.3.1) sha256=37b56e157e720446a3f4d2d39919cabef8cb7b6c45936acffd2ef8229fec03ed
352
+ webmock (3.25.1) sha256=ab9d5d9353bcbe6322c83e1c60a7103988efc7b67cd72ffb9012629c3d396323
353
+ yard (0.9.42) sha256=4e2be01f8623556093497731d44c801e600d7c9759ec7a35a2dd5dd83bbbba68
354
+ yard-sorbet (0.9.0) sha256=03d1aa461b9e9c82b886919a13aa3e09fcf4d1852239d2967ed97e92723ffe21
355
+ zeitwerk (2.7.3) sha256=b2e86b4a9b57d26ba68a15230dcc7fe6f040f06831ce64417b0621ad96ba3e85
356
+
252
357
  BUNDLED WITH
253
358
  2.6.8
data/README.md CHANGED
@@ -47,7 +47,7 @@ bin/roast execute analyze_codebase.rb
47
47
 
48
48
  ## Core Cogs
49
49
 
50
- - **`chat`** - Send prompts to cloud-based LLMs (OpenAI, Anthropic, Gemini, etc.)
50
+ - **`chat`** - Send prompts to cloud-based LLMs (OpenAI, Anthropic, Perplexity & Gemini)
51
51
  - **`agent`** - Run local coding agents with filesystem access (Claude Code CLI, etc.)
52
52
  - **`ruby`** - Execute custom Ruby code within workflows
53
53
  - **`cmd`** - Run shell commands and capture output
@@ -69,8 +69,61 @@ gem 'roast-ai'
69
69
  ## Requirements
70
70
 
71
71
  - Ruby 3.0+
72
- - API keys for your AI provider (OpenAI/Anthropic)
73
- - Claude Code CLI installed (for agent cog)
72
+ - API keys or local credentials for your AI provider
73
+ - Claude Code CLI installed (for the default agent provider)
74
+
75
+ ## Provider Configuration
76
+
77
+ Roast provider settings are configured in workflow `config` blocks. There is not currently a CLI flag or environment variable that changes the default provider globally; edit the workflow config to select a different provider.
78
+
79
+ ### Chat cog
80
+
81
+ The `chat` cog currently supports the OpenAI provider. It uses `OPENAI_API_KEY` by default, and `OPENAI_API_BASE` can override the default base URL (`https://api.openai.com/v1`).
82
+
83
+ ```bash
84
+ export OPENAI_API_KEY=...
85
+ ```
86
+
87
+ You can also configure chat settings directly in a workflow:
88
+
89
+ ```ruby
90
+ config do
91
+ chat do
92
+ provider :openai
93
+ model "gpt-4o-mini"
94
+ end
95
+ end
96
+ ```
97
+
98
+ ### Agent cog
99
+
100
+ The `agent` cog runs local agent CLIs. It defaults to `:claude` and currently supports:
101
+
102
+ - `:claude` - Claude Code CLI
103
+ - `:pi` - Pi CLI
104
+
105
+ Select a provider in the workflow config:
106
+
107
+ ```ruby
108
+ config do
109
+ agent do
110
+ provider :pi
111
+ end
112
+ end
113
+ ```
114
+
115
+ Agent providers must be installed and authenticated according to their own CLI requirements.
116
+
117
+ ## Configuration
118
+
119
+ Roast currently supports four LLM providers for the `chat` cog: **OpenAI**, **Anthropic**, **Perplexity** and **Gemini**.
120
+
121
+ - Set `OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, `PERPLEXITY_API_KEY` and/or `GEMINI_API_KEY` in your environment.
122
+ - Optionally set `OPENAI_API_BASE`, `ANTHROPIC_API_BASE` and/or `GEMINI_API_BASE` to override the default endpoint. Perplexity does not support base URL override.
123
+
124
+ The default model is set per-provider and can only be overridden inside a `config` block. See the [tutorial](https://github.com/Shopify/roast/blob/main/tutorial/01_your_first_workflow/README.md#adding-configuration) for examples.
125
+
126
+ The `agent` cog is powered by the Claude Code CLI by default, which handles its own authentication.
74
127
 
75
128
  ## Getting Started
76
129
 
@@ -12,9 +12,11 @@
12
12
  # Log to standard output, always at the DEBUG level
13
13
  Roast::Log.logger = Logger.new($stdout).tap { |logger| logger.level = ::Logger::DEBUG }
14
14
 
15
- # Format log lines in a particular way
15
+ # Format log lines in a particular way. `msg` may be a String or a
16
+ # Roast::Log::Message (stdout/stderr output is wrapped to carry its type),
17
+ # so normalise with #to_s before formatting.
16
18
  Roast::Log.logger.formatter = proc do |severity, time, progname, msg|
17
- "#{severity[0..0]}, #{msg.strip} (at #{time})\n"
19
+ "#{severity[0..0]}, #{msg.to_s.strip} (at #{time})\n"
18
20
  end
19
21
 
20
22
 
@@ -1,11 +1,11 @@
1
1
  PATH
2
2
  remote: ../..
3
3
  specs:
4
- roast-ai (1.1.0)
4
+ roast-ai (1.2.0)
5
5
  activesupport (~> 8.0)
6
6
  async (>= 2.34)
7
7
  rainbow (>= 3.0.0)
8
- ruby_llm (>= 1.8)
8
+ ruby_llm (>= 1.13)
9
9
  type_toolkit (>= 0.0.5)
10
10
  zeitwerk (>= 2.6)
11
11
 
@@ -18,7 +18,7 @@ PATH
18
18
  GEM
19
19
  remote: https://rubygems.org/
20
20
  specs:
21
- activesupport (8.0.3)
21
+ activesupport (8.0.4.1)
22
22
  base64
23
23
  benchmark (>= 0.3)
24
24
  bigdecimal
@@ -27,7 +27,7 @@ GEM
27
27
  drb
28
28
  i18n (>= 1.6, < 2)
29
29
  logger (>= 1.4.2)
30
- minitest (>= 5.1)
30
+ minitest (>= 5.1, < 6)
31
31
  securerandom (>= 0.3)
32
32
  tzinfo (~> 2.0, >= 2.0.5)
33
33
  uri (>= 0.13.1)
@@ -39,23 +39,23 @@ GEM
39
39
  metrics (~> 0.12)
40
40
  traces (~> 0.18)
41
41
  base64 (0.3.0)
42
- benchmark (0.4.1)
43
- bigdecimal (3.3.1)
44
- concurrent-ruby (1.3.5)
45
- connection_pool (2.5.4)
42
+ benchmark (0.5.0)
43
+ bigdecimal (4.1.2)
44
+ concurrent-ruby (1.3.7)
45
+ connection_pool (3.0.2)
46
46
  console (1.34.2)
47
47
  fiber-annotation
48
48
  fiber-local (~> 1.1)
49
49
  json
50
50
  drb (2.2.3)
51
51
  event_stream_parser (1.0.0)
52
- faraday (2.14.1)
52
+ faraday (2.14.3)
53
53
  faraday-net_http (>= 2.0, < 3.5)
54
54
  json
55
55
  logger
56
56
  faraday-multipart (1.1.1)
57
57
  multipart-post (~> 2.0)
58
- faraday-net_http (3.4.2)
58
+ faraday-net_http (3.4.4)
59
59
  net-http (~> 0.5)
60
60
  faraday-retry (2.3.2)
61
61
  faraday (~> 2.0)
@@ -63,16 +63,16 @@ GEM
63
63
  fiber-local (1.1.0)
64
64
  fiber-storage
65
65
  fiber-storage (1.0.1)
66
- i18n (1.14.7)
66
+ i18n (1.14.8)
67
67
  concurrent-ruby (~> 1.0)
68
68
  io-event (1.14.0)
69
- json (2.18.1)
69
+ json (2.20.0)
70
70
  language_server-protocol (3.17.0.5)
71
71
  lint_roller (1.1.0)
72
72
  logger (1.7.0)
73
73
  marcel (1.1.0)
74
74
  metrics (0.15.0)
75
- minitest (5.26.0)
75
+ minitest (5.27.0)
76
76
  multipart-post (2.4.1)
77
77
  net-http (0.9.1)
78
78
  uri (>= 0.11.1)
@@ -99,15 +99,17 @@ GEM
99
99
  parser (>= 3.3.7.2)
100
100
  prism (~> 1.7)
101
101
  ruby-progressbar (1.13.0)
102
- ruby_llm (1.8.2)
102
+ ruby_llm (1.15.0)
103
103
  base64
104
104
  event_stream_parser (~> 1)
105
105
  faraday (>= 1.10.0)
106
106
  faraday-multipart (>= 1)
107
107
  faraday-net_http (>= 1)
108
108
  faraday-retry (>= 1)
109
- marcel (~> 1.0)
109
+ marcel (~> 1)
110
+ ruby_llm-schema (~> 0)
110
111
  zeitwerk (~> 2)
112
+ ruby_llm-schema (0.4.0)
111
113
  securerandom (0.4.1)
112
114
  traces (0.18.2)
113
115
  type_toolkit (0.0.5)
@@ -1,11 +1,11 @@
1
1
  PATH
2
2
  remote: ../..
3
3
  specs:
4
- roast-ai (1.1.0)
4
+ roast-ai (1.2.0)
5
5
  activesupport (~> 8.0)
6
6
  async (>= 2.34)
7
7
  rainbow (>= 3.0.0)
8
- ruby_llm (>= 1.8)
8
+ ruby_llm (>= 1.13)
9
9
  type_toolkit (>= 0.0.5)
10
10
  zeitwerk (>= 2.6)
11
11
 
@@ -18,7 +18,7 @@ PATH
18
18
  GEM
19
19
  remote: https://rubygems.org/
20
20
  specs:
21
- activesupport (8.0.3)
21
+ activesupport (8.0.4.1)
22
22
  base64
23
23
  benchmark (>= 0.3)
24
24
  bigdecimal
@@ -27,7 +27,7 @@ GEM
27
27
  drb
28
28
  i18n (>= 1.6, < 2)
29
29
  logger (>= 1.4.2)
30
- minitest (>= 5.1)
30
+ minitest (>= 5.1, < 6)
31
31
  securerandom (>= 0.3)
32
32
  tzinfo (~> 2.0, >= 2.0.5)
33
33
  uri (>= 0.13.1)
@@ -39,19 +39,19 @@ GEM
39
39
  metrics (~> 0.12)
40
40
  traces (~> 0.18)
41
41
  base64 (0.3.0)
42
- benchmark (0.4.1)
43
- bigdecimal (3.3.1)
44
- concurrent-ruby (1.3.5)
45
- connection_pool (2.5.4)
42
+ benchmark (0.5.0)
43
+ bigdecimal (4.1.2)
44
+ concurrent-ruby (1.3.7)
45
+ connection_pool (3.0.2)
46
46
  console (1.34.3)
47
47
  fiber-annotation
48
48
  fiber-local (~> 1.1)
49
49
  json
50
50
  date (3.4.1)
51
51
  drb (2.2.3)
52
- erb (5.1.1)
52
+ erb (6.0.1.1)
53
53
  event_stream_parser (1.0.0)
54
- faraday (2.14.1)
54
+ faraday (2.14.2)
55
55
  faraday-net_http (>= 2.0, < 3.5)
56
56
  json
57
57
  logger
@@ -65,7 +65,7 @@ GEM
65
65
  fiber-local (1.1.0)
66
66
  fiber-storage
67
67
  fiber-storage (1.0.1)
68
- i18n (1.14.7)
68
+ i18n (1.14.8)
69
69
  concurrent-ruby (~> 1.0)
70
70
  io-console (0.8.1)
71
71
  io-event (1.14.2)
@@ -73,7 +73,7 @@ GEM
73
73
  pp (>= 0.6.0)
74
74
  rdoc (>= 4.0.0)
75
75
  reline (>= 0.4.2)
76
- json (2.18.1)
76
+ json (2.19.5)
77
77
  language_server-protocol (3.17.0.5)
78
78
  lint_roller (1.1.0)
79
79
  logger (1.7.0)
@@ -119,15 +119,15 @@ GEM
119
119
  parser (>= 3.3.7.2)
120
120
  prism (~> 1.4)
121
121
  ruby-progressbar (1.13.0)
122
- ruby_llm (1.11.0)
122
+ ruby_llm (1.15.0)
123
123
  base64
124
124
  event_stream_parser (~> 1)
125
125
  faraday (>= 1.10.0)
126
126
  faraday-multipart (>= 1)
127
127
  faraday-net_http (>= 1)
128
128
  faraday-retry (>= 1)
129
- marcel (~> 1.0)
130
- ruby_llm-schema (~> 0.2.1)
129
+ marcel (~> 1)
130
+ ruby_llm-schema (~> 0)
131
131
  zeitwerk (~> 2)
132
132
  ruby_llm-schema (0.2.5)
133
133
  securerandom (0.4.1)
@@ -21,6 +21,6 @@ execute do
21
21
  # Ask a question with a template prompt. You can pass variables to it as you would an ERB template
22
22
  chat { template("examples/prompts/simple_prompt.md.erb", { lake_answer: chat!(:lake).response }) }
23
23
 
24
- # Shorthand template syntax - searches prompts/ directory automatically
24
+ # Shorthand template syntax - searches prompts/ and templates/ directories automatically
25
25
  chat { template("simple_prompt", { lake_answer: chat!(:lake).response }) }
26
26
  end