boxcars 0.8.10 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bdc68194311ad4474d79a19542422630819c12e9e31e53492f124a2f68e4e289
4
- data.tar.gz: 4af69cd36ea2cc96cbd08e6312620ae838382a9c1aca12ff0d11d3fdaa470987
3
+ metadata.gz: 3af5c66747ad41395ee4f9f39f8e76288811162b88eb419183b9e58371985820
4
+ data.tar.gz: 7a762ffdfd83477e035b6a40e4868b931bf94fb2711e07dd95248b567154de03
5
5
  SHA512:
6
- metadata.gz: ba7608a0c52359113c7c52a516690b13fe0a0e6b91b93a306a71e193285ba785d384b82f1f62bf24ffccd1ac6f559c13ec8af60816fd0923c2aea91461f843b5
7
- data.tar.gz: 6a593dc290f477f945622b52c621d301b27c2f42058ef9df682aeb5152886a1307dd31630ff07d9545f85fd6d49ce9340582b8e89513cd93c262d26796268211
6
+ metadata.gz: 196198a1a7308b1ac20c074190dc7a2cbac0742e16a489c55e1c182d803f71c4ca47f0189cf6cef50f5b361021533a041471247d360a446f36589a6f51743804
7
+ data.tar.gz: ee1f206890e45632964c9f04f1d0c91ef75bead546c7fbe0c644f2455e936ef69ed9f85651bbef567cac883f95352c9210f1fbb5f26ee0485178d565f755ae81
data/.rubocop.yml CHANGED
@@ -1,3 +1,9 @@
1
+ inherit_from: .rubocop_todo.yml
2
+
3
+ inherit_mode:
4
+ merge:
5
+ - Exclude
6
+
1
7
  require:
2
8
  - rubocop-rake
3
9
 
data/.rubocop_todo.yml ADDED
@@ -0,0 +1,339 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config`
3
+ # on 2026-02-27 02:41:57 UTC using RuboCop version 1.85.0.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+
9
+ # Offense count: 1
10
+ # This cop supports safe autocorrection (--autocorrect).
11
+ Layout/EmptyLineAfterGuardClause:
12
+ Exclude:
13
+ - 'lib/boxcars/mcp/stdio_client.rb'
14
+
15
+ # Offense count: 1
16
+ # This cop supports safe autocorrection (--autocorrect).
17
+ # Configuration parameters: AllowForAlignment, AllowBeforeTrailingComments, ForceEqualSignAlignment.
18
+ Layout/ExtraSpacing:
19
+ Exclude:
20
+ - 'lib/boxcars/engine/openai.rb'
21
+
22
+ # Offense count: 9
23
+ # This cop supports safe autocorrection (--autocorrect).
24
+ # Configuration parameters: Max, AllowHeredoc, AllowURI, AllowQualifiedName, URISchemes, AllowRBSInlineAnnotation, AllowCopDirectives, AllowedPatterns, SplitStrings.
25
+ # URISchemes: http, https
26
+ Layout/LineLength:
27
+ Exclude:
28
+ - 'db/**/*'
29
+ - 'spec/**/*'
30
+ - 'lib/boxcars/engines.rb'
31
+ - 'lib/boxcars/mcp.rb'
32
+ - 'lib/boxcars/mcp/stdio_client.rb'
33
+ - 'lib/boxcars/mcp/tool_boxcar.rb'
34
+ - 'lib/boxcars/openai_client_adapter.rb'
35
+ - 'lib/boxcars/openai_compatible_client.rb'
36
+ - 'lib/boxcars/train/tool_calling_train.rb'
37
+
38
+ # Offense count: 1
39
+ # This cop supports safe autocorrection (--autocorrect).
40
+ # Configuration parameters: AllowForAlignment, EnforcedStyleForExponentOperator, EnforcedStyleForRationalLiterals.
41
+ # SupportedStylesForExponentOperator: space, no_space
42
+ # SupportedStylesForRationalLiterals: space, no_space
43
+ Layout/SpaceAroundOperators:
44
+ Exclude:
45
+ - 'lib/boxcars/engine/openai.rb'
46
+
47
+ # Offense count: 9
48
+ # Configuration parameters: AllowedMethods.
49
+ # AllowedMethods: enums
50
+ Lint/ConstantDefinitionInBlock:
51
+ Exclude:
52
+ - 'Rakefile'
53
+ - 'spec/notebooks/notebook_examples_spec.rb'
54
+
55
+ # Offense count: 2
56
+ # Configuration parameters: IgnoreLiteralBranches, IgnoreConstantBranches, IgnoreDuplicateElseBranch.
57
+ Lint/DuplicateBranch:
58
+ Exclude:
59
+ - 'lib/boxcars/mcp/tool_boxcar.rb'
60
+ - 'lib/boxcars/openai_client_adapter.rb'
61
+
62
+ # Offense count: 1
63
+ Lint/HashCompareByIdentity:
64
+ Exclude:
65
+ - 'lib/boxcars/mcp.rb'
66
+
67
+ # Offense count: 3
68
+ # Configuration parameters: AllowedParentClasses.
69
+ Lint/MissingSuper:
70
+ Exclude:
71
+ - 'lib/boxcars/mcp/stdio_client.rb'
72
+ - 'spec/boxcars/mcp_helpers_spec.rb'
73
+ - 'spec/boxcars/mcp_tool_boxcar_spec.rb'
74
+
75
+ # Offense count: 1
76
+ # This cop supports safe autocorrection (--autocorrect).
77
+ Lint/ScriptPermission:
78
+ Exclude:
79
+ - 'script/notebooks_live_check.rb'
80
+
81
+ # Offense count: 1
82
+ # This cop supports safe autocorrection (--autocorrect).
83
+ # Configuration parameters: AllowUnusedKeywordArguments, IgnoreEmptyMethods, IgnoreNotImplementedMethods, NotImplementedExceptions.
84
+ # NotImplementedExceptions: NotImplementedError
85
+ Lint/UnusedMethodArgument:
86
+ Exclude:
87
+ - 'lib/boxcars/train/tool_calling_train.rb'
88
+
89
+ # Offense count: 2
90
+ # Configuration parameters: CountComments, CountAsOne, AllowedMethods, AllowedPatterns, inherit_mode.
91
+ # AllowedMethods: refine
92
+ Metrics/BlockLength:
93
+ Max: 81
94
+
95
+ # Offense count: 3
96
+ # Configuration parameters: CountComments, Max, CountAsOne.
97
+ Metrics/ClassLength:
98
+ Exclude:
99
+ - 'lib/boxcars/boxcar.rb'
100
+ - 'lib/boxcars/boxcar/json_engine_boxcar.rb'
101
+ - 'lib/boxcars/train/tool_calling_train.rb'
102
+
103
+ # Offense count: 2
104
+ # Configuration parameters: CountComments, Max, CountAsOne, AllowedMethods, AllowedPatterns.
105
+ Metrics/MethodLength:
106
+ Exclude:
107
+ - 'spec/**/*'
108
+ - 'lib/boxcars/engines.rb'
109
+ - 'lib/boxcars/train/tool_calling_train.rb'
110
+
111
+ # Offense count: 1
112
+ # Configuration parameters: CountComments, CountAsOne.
113
+ Metrics/ModuleLength:
114
+ Max: 214
115
+
116
+ # Offense count: 2
117
+ # Configuration parameters: Max, CountKeywordArgs, MaxOptionalParameters.
118
+ Metrics/ParameterLists:
119
+ Exclude:
120
+ - 'lib/boxcars/boxcar/json_engine_boxcar.rb'
121
+ - 'lib/boxcars/mcp/stdio_client.rb'
122
+
123
+ # Offense count: 2
124
+ # Configuration parameters: AllowedMethods, AllowedPatterns, Max.
125
+ Metrics/PerceivedComplexity:
126
+ Exclude:
127
+ - 'lib/boxcars/boxcar/json_engine_boxcar.rb'
128
+ - 'lib/boxcars/train/tool_calling_train.rb'
129
+
130
+ # Offense count: 2
131
+ # Configuration parameters: Mode, AllowedMethods, AllowedPatterns, AllowBangMethods, WaywardPredicates.
132
+ # AllowedMethods: call
133
+ # WaywardPredicates: infinite?, nonzero?
134
+ Naming/PredicateMethod:
135
+ Exclude:
136
+ - 'lib/boxcars.rb'
137
+ - 'lib/boxcars/openai_compatible_client.rb'
138
+
139
+ # Offense count: 5
140
+ # This cop supports unsafe autocorrection (--autocorrect-all).
141
+ RSpec/BeEq:
142
+ Exclude:
143
+ - 'spec/boxcars/openai_compatible_client_spec.rb'
144
+ - 'spec/boxcars/openai_official_backend_spec.rb'
145
+
146
+ # Offense count: 4
147
+ # Configuration parameters: IgnoredMetadata.
148
+ RSpec/DescribeClass:
149
+ Exclude:
150
+ - '**/spec/features/**/*'
151
+ - '**/spec/requests/**/*'
152
+ - '**/spec/routing/**/*'
153
+ - '**/spec/system/**/*'
154
+ - '**/spec/views/**/*'
155
+ - 'spec/boxcars/engine/capabilities_spec.rb'
156
+ - 'spec/boxcars/openai_compatible_provider_backend_pinning_spec.rb'
157
+ - 'spec/boxcars/openai_official_backend_spec.rb'
158
+ - 'spec/notebooks/notebook_examples_spec.rb'
159
+
160
+ # Offense count: 4
161
+ RSpec/ExpectInHook:
162
+ Exclude:
163
+ - 'spec/boxcars/openai_official_backend_spec.rb'
164
+
165
+ # Offense count: 4
166
+ RSpec/LeakyConstantDeclaration:
167
+ Exclude:
168
+ - 'spec/notebooks/notebook_examples_spec.rb'
169
+
170
+ # Offense count: 11
171
+ RSpec/LeakyLocalVariable:
172
+ Exclude:
173
+ - 'spec/boxcars/active_record_spec.rb'
174
+ - 'spec/boxcars/json_engine_boxcar_spec.rb'
175
+ - 'spec/boxcars/posthog_backend_spec.rb'
176
+ - 'spec/boxcars/ruby_repl_spec.rb'
177
+ - 'spec/boxcars/sql_active_record_spec.rb'
178
+
179
+ # Offense count: 25
180
+ # Configuration parameters: EnforcedStyle.
181
+ # SupportedStyles: have_received, receive
182
+ RSpec/MessageSpies:
183
+ Exclude:
184
+ - 'spec/boxcars/engines_spec.rb'
185
+ - 'spec/boxcars/openai_backend_override_spec.rb'
186
+ - 'spec/boxcars/openai_client_adapter_spec.rb'
187
+ - 'spec/boxcars/openai_compatible_client_spec.rb'
188
+ - 'spec/boxcars/openai_compatible_provider_backend_pinning_spec.rb'
189
+ - 'spec/boxcars/openai_official_backend_spec.rb'
190
+
191
+ # Offense count: 1
192
+ # This cop supports unsafe autocorrection (--autocorrect-all).
193
+ RSpec/Output:
194
+ Exclude:
195
+ - 'spec/boxcars/openai_spec.rb'
196
+
197
+ # Offense count: 2
198
+ # This cop supports unsafe autocorrection (--autocorrect-all).
199
+ RSpec/ReceiveMessages:
200
+ Exclude:
201
+ - 'spec/boxcars/openai_compatible_client_spec.rb'
202
+
203
+ # Offense count: 3
204
+ # Configuration parameters: CustomTransform, IgnoreMethods, IgnoreMetadata, InflectorPath, EnforcedInflector.
205
+ # SupportedInflectors: default, active_support
206
+ RSpec/SpecFilePathFormat:
207
+ Exclude:
208
+ - '**/spec/routing/**/*'
209
+ - 'spec/boxcars/mcp_stdio_client_spec.rb'
210
+ - 'spec/boxcars/openai_client_adapter_spec.rb'
211
+ - 'spec/boxcars/openai_compatible_client_spec.rb'
212
+
213
+ # Offense count: 18
214
+ RSpec/StubbedMock:
215
+ Exclude:
216
+ - 'spec/boxcars/openai_backend_override_spec.rb'
217
+ - 'spec/boxcars/openai_client_adapter_spec.rb'
218
+ - 'spec/boxcars/openai_compatible_client_spec.rb'
219
+ - 'spec/boxcars/openai_official_backend_spec.rb'
220
+
221
+ # Offense count: 6
222
+ # This cop supports safe autocorrection (--autocorrect).
223
+ # Configuration parameters: AllowOnlyRestArgument, UseAnonymousForwarding, RedundantRestArgumentNames, RedundantKeywordRestArgumentNames, RedundantBlockArgumentNames.
224
+ # RedundantRestArgumentNames: args, arguments
225
+ # RedundantKeywordRestArgumentNames: kwargs, options, opts
226
+ # RedundantBlockArgumentNames: blk, block, proc
227
+ Style/ArgumentsForwarding:
228
+ Exclude:
229
+ - 'lib/boxcars/mcp.rb'
230
+ - 'lib/boxcars/mcp/tool_registry.rb'
231
+
232
+ # Offense count: 1
233
+ # This cop supports safe autocorrection (--autocorrect).
234
+ # Configuration parameters: EnforcedStyle.
235
+ # SupportedStyles: class_keyword, class_new, class_definition
236
+ Style/EmptyClassDefinition:
237
+ Exclude:
238
+ - 'lib/boxcars/vector_store.rb'
239
+
240
+ # Offense count: 1
241
+ # This cop supports safe autocorrection (--autocorrect).
242
+ # Configuration parameters: EnforcedStyle.
243
+ # SupportedStyles: trailing_conditional, ternary
244
+ Style/EmptyStringInsideInterpolation:
245
+ Exclude:
246
+ - 'lib/boxcars/mcp/stdio_client.rb'
247
+
248
+ # Offense count: 1
249
+ # This cop supports safe autocorrection (--autocorrect).
250
+ Style/ExplicitBlockArgument:
251
+ Exclude:
252
+ - 'lib/boxcars/mcp/stdio_client.rb'
253
+
254
+ # Offense count: 1
255
+ # This cop supports safe autocorrection (--autocorrect).
256
+ # Configuration parameters: MinBodyLength, AllowConsecutiveConditionals.
257
+ Style/GuardClause:
258
+ Exclude:
259
+ - 'lib/boxcars/train/tool_calling_train.rb'
260
+
261
+ # Offense count: 7
262
+ # This cop supports safe autocorrection (--autocorrect).
263
+ Style/IfUnlessModifier:
264
+ Exclude:
265
+ - 'Rakefile'
266
+ - 'lib/boxcars/boxcar/json_engine_boxcar.rb'
267
+ - 'lib/boxcars/engines.rb'
268
+ - 'lib/boxcars/mcp/stdio_client.rb'
269
+ - 'lib/boxcars/openai_client_adapter.rb'
270
+ - 'lib/boxcars/train/tool_calling_train.rb'
271
+
272
+ # Offense count: 2
273
+ # This cop supports safe autocorrection (--autocorrect).
274
+ # Configuration parameters: AllowMethodComparison, ComparisonsThreshold.
275
+ Style/MultipleComparison:
276
+ Exclude:
277
+ - 'lib/boxcars.rb'
278
+ - 'lib/boxcars/boxcar/json_engine_boxcar.rb'
279
+
280
+ # Offense count: 10
281
+ # Configuration parameters: AllowedClasses.
282
+ Style/OneClassPerFile:
283
+ Exclude:
284
+ - 'example.rb'
285
+ - 'notebooks/helpdesk_sample.rb'
286
+ - 'spec/boxcars/engine/intelligence_base_observability_spec.rb'
287
+ - 'spec/support/helpdesk_sample_app.rb'
288
+
289
+ # Offense count: 4
290
+ # This cop supports unsafe autocorrection (--autocorrect-all).
291
+ Style/PredicateWithKind:
292
+ Exclude:
293
+ - 'lib/boxcars/vector_store/embed_via_open_ai.rb'
294
+ - 'lib/boxcars/vector_store/hnswlib/search.rb'
295
+ - 'lib/boxcars/vector_store/in_memory/search.rb'
296
+ - 'lib/boxcars/vector_store/pgvector/save_to_database.rb'
297
+
298
+ # Offense count: 3
299
+ # This cop supports safe autocorrection (--autocorrect).
300
+ Style/RedundantBegin:
301
+ Exclude:
302
+ - 'lib/boxcars/mcp/stdio_client.rb'
303
+ - 'lib/boxcars/openai_compatible_client.rb'
304
+
305
+ # Offense count: 1
306
+ # This cop supports safe autocorrection (--autocorrect).
307
+ Style/RedundantParentheses:
308
+ Exclude:
309
+ - 'lib/boxcars/mcp.rb'
310
+
311
+ # Offense count: 1
312
+ # This cop supports safe autocorrection (--autocorrect).
313
+ Style/RescueModifier:
314
+ Exclude:
315
+ - 'lib/boxcars/train/tool_calling_train.rb'
316
+
317
+ # Offense count: 1
318
+ # This cop supports safe autocorrection (--autocorrect).
319
+ # Configuration parameters: AllowModifier.
320
+ Style/SoleNestedConditional:
321
+ Exclude:
322
+ - 'lib/boxcars/boxcar/json_engine_boxcar.rb'
323
+
324
+ # Offense count: 1
325
+ # This cop supports unsafe autocorrection (--autocorrect-all).
326
+ # Configuration parameters: AllowMethodsWithArguments, AllowedMethods, AllowedPatterns, AllowComments.
327
+ # AllowedMethods: define_method
328
+ Style/SymbolProc:
329
+ Exclude:
330
+ - 'lib/boxcars/boxcar/json_engine_boxcar.rb'
331
+
332
+ # Offense count: 2
333
+ # This cop supports safe autocorrection (--autocorrect).
334
+ # Configuration parameters: ExactNameMatch, AllowPredicates, AllowDSLWriters, IgnoreClassMethods, AllowedMethods.
335
+ # AllowedMethods: to_ary, to_a, to_c, to_enum, to_h, to_hash, to_i, to_int, to_io, to_open, to_path, to_proc, to_r, to_regexp, to_str, to_s, to_sym
336
+ Style/TrivialAccessors:
337
+ Exclude:
338
+ - 'lib/boxcars.rb'
339
+ - 'lib/boxcars/openai_compatible_client.rb'
data/CHANGELOG.md CHANGED
@@ -1,5 +1,84 @@
1
1
  # Changelog
2
2
 
3
+ ## [Unreleased]
4
+
5
+ ### Upgrade Guide (v0.9 -> v1.0 planned)
6
+
7
+ This section tracks the modernization work that is being added in v0.9 with a compatibility window before v1.0 removals.
8
+
9
+ #### New Runtime / Tooling Foundations (v0.9)
10
+
11
+ - `Boxcars::ToolCallingTrain` added for native LLM tool-calling (chat-completions and OpenAI Responses API style loops).
12
+ - Boxcars now expose normalized tool specs / JSON Schema for tool-calling APIs.
13
+ - `JSONEngineBoxcar` supports JSON Schema validation and can use native structured-output response formats on capable engines.
14
+ - MCP is a first-class integration path:
15
+ - `Boxcars::MCP.stdio(...)` to connect to an MCP server over `stdio`
16
+ - `Boxcars::MCP.boxcars_from_client(...)` to wrap MCP tools as Boxcars
17
+ - `Boxcars::MCP.tool_calling_train(...)` to combine local Boxcars + MCP tools into a `ToolCallingTrain`
18
+ - OpenAI backend migration controls added:
19
+ - Default `openai_client_backend` switched to `:official_openai` (with `:ruby_openai` opt-out)
20
+ - `openai_client_backend` config default (with `OPENAI_CLIENT_BACKEND` env support)
21
+ - `openai_official_client_builder` config hook for official client injection
22
+ - `Boxcars::Openai` per-instance/per-call backend override (`openai_client_backend:`)
23
+ - One-time warning when `:official_openai` falls back to ruby-openai compatibility bridge
24
+ - `openai_official_require_native` toggle to fail fast instead of bridge fallback
25
+ - Backend/client compatibility preflight checks in `OpenAICompatibleClient.validate_backend_configuration!`
26
+ - OpenAI-compatible provider pinning to `:ruby_openai` during migration (Groq/Gemini/Ollama)
27
+ - CI parity lanes via `spec:openai_backend_parity` and `spec:openai_backend_parity_official`
28
+ - Consolidated modernization regression lane via `spec:modernization`
29
+ - Notebook migration setup cells added under `notebooks/` for explicit backend pinning during rollout
30
+ - Upgrade guide includes a notebook compatibility matrix for backend migration expectations
31
+ - Notebook CI lanes added:
32
+ - PR-safe `notebook-smoke` job via `spec:notebooks_smoke`
33
+ - Weekly/manual live compatibility job via `spec:notebooks_live` (requires `OPENAI_ACCESS_TOKEN`)
34
+ - Optional native-only enforcement for live notebook checks via workflow variables (`OPENAI_OFFICIAL_REQUIRE_NATIVE` or `NOTEBOOKS_LIVE_REQUIRE_NATIVE`)
35
+ - Targeted VCR refresh tasks added for OpenAI/embeddings cassette maintenance:
36
+ - `spec:vcr_openai_smoke`
37
+ - `spec:vcr_openai_refresh`
38
+
39
+ #### Model Alias Deprecations (warning now, planned removal in v1.0)
40
+
41
+ Deprecated aliases currently emit a one-time warning (per process) and still work in v0.9.
42
+
43
+ Recommended replacements:
44
+
45
+ - `anthropic` -> `sonnet`
46
+ - `groq` -> `llama-3.3-70b-versatile`
47
+ - `deepseek` -> `deepseek-r1-distill-llama-70b`
48
+ - `mistral` -> `mistral-saba-24b`
49
+ - `online` -> `sonar`
50
+ - `huge` / `online_huge` / `sonar_huge` / `sonar-huge` / `sonar_pro` -> `sonar-pro`
51
+ - `flash` / `gemini-flash` -> `gemini-2.5-flash`
52
+ - `gemini-pro` -> `gemini-2.5-pro`
53
+ - `cerebras` -> `gpt-oss-120b`
54
+ - `qwen` -> `Qwen/Qwen2.5-VL-72B-Instruct`
55
+
56
+ Kept curated aliases (not deprecated):
57
+
58
+ - `sonar`
59
+ - `sonar-pro`
60
+ - `sonnet`
61
+ - `opus`
62
+
63
+ #### Strict Migration Mode (recommended for CI)
64
+
65
+ To fail fast on deprecated aliases during migration testing:
66
+
67
+ ```ruby
68
+ Boxcars.configure do |config|
69
+ config.strict_deprecated_model_aliases = true
70
+ end
71
+
72
+ # or:
73
+ Boxcars::Engines.strict_deprecated_aliases = true
74
+ ```
75
+
76
+ #### Planned v1.0 Direction
77
+
78
+ - Remove deprecated aliases listed above.
79
+ - Prefer explicit model names and a small curated alias set (`sonar`, `sonar-pro`, `sonnet`, `opus`).
80
+ - Continue OpenAI SDK migration behind the internal OpenAI-compatible client factory seam to reduce provider regressions.
81
+
3
82
  ## [v0.8.5](https://github.com/BoxcarsAI/boxcars/tree/v0.8.5) (2025-07-01)
4
83
 
5
84
  [Full Changelog](https://github.com/BoxcarsAI/boxcars/compare/v0.8.4...v0.8.5)