legion-llm 0.7.8 → 0.8.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 (165) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/CHANGELOG.md +54 -1
  4. data/CLAUDE.md +376 -151
  5. data/Gemfile +1 -0
  6. data/README.md +229 -13
  7. data/advisory_prompt.txt +20 -0
  8. data/lib/legion/llm/api/anthropic/messages.rb +168 -0
  9. data/lib/legion/llm/api/auth.rb +63 -0
  10. data/lib/legion/llm/api/native/chat.rb +127 -0
  11. data/lib/legion/llm/api/native/helpers.rb +346 -0
  12. data/lib/legion/llm/api/native/inference.rb +246 -0
  13. data/lib/legion/llm/api/native/providers.rb +95 -0
  14. data/lib/legion/llm/api/openai/chat_completions.rb +137 -0
  15. data/lib/legion/llm/api/openai/embeddings.rb +66 -0
  16. data/lib/legion/llm/api/openai/models.rb +109 -0
  17. data/lib/legion/llm/api/translators/anthropic_request.rb +110 -0
  18. data/lib/legion/llm/api/translators/anthropic_response.rb +190 -0
  19. data/lib/legion/llm/api/translators/openai_request.rb +88 -0
  20. data/lib/legion/llm/api/translators/openai_response.rb +141 -0
  21. data/lib/legion/llm/api.rb +48 -0
  22. data/lib/legion/llm/audit.rb +35 -13
  23. data/lib/legion/llm/bedrock_bearer_auth.rb +2 -51
  24. data/lib/legion/llm/cache/response.rb +151 -0
  25. data/lib/legion/llm/call/bedrock_auth.rb +53 -0
  26. data/lib/legion/llm/call/claude_config_loader.rb +65 -0
  27. data/lib/legion/llm/call/codex_config_loader.rb +113 -0
  28. data/lib/legion/llm/call/daemon_client.rb +249 -0
  29. data/lib/legion/llm/call/dispatch.rb +142 -0
  30. data/lib/legion/llm/call/embeddings.rb +486 -0
  31. data/lib/legion/llm/call/providers.rb +339 -0
  32. data/lib/legion/llm/call/registry.rb +42 -0
  33. data/lib/legion/llm/call/structured_output.rb +83 -0
  34. data/lib/legion/llm/call.rb +18 -0
  35. data/lib/legion/llm/compat.rb +112 -0
  36. data/lib/legion/llm/config/settings.rb +341 -0
  37. data/lib/legion/llm/config.rb +46 -0
  38. data/lib/legion/llm/context/compressor.rb +205 -0
  39. data/lib/legion/llm/context/curator.rb +332 -0
  40. data/lib/legion/llm/context.rb +11 -0
  41. data/lib/legion/llm/discovery.rb +189 -0
  42. data/lib/legion/llm/fleet/dispatcher.rb +5 -6
  43. data/lib/legion/llm/fleet/handler.rb +1 -6
  44. data/lib/legion/llm/fleet.rb +28 -9
  45. data/lib/legion/llm/helper.rb +5 -5
  46. data/lib/legion/llm/hooks/budget_guard.rb +3 -3
  47. data/lib/legion/llm/hooks/cost_tracking.rb +15 -10
  48. data/lib/legion/llm/hooks/metering.rb +42 -40
  49. data/lib/legion/llm/hooks.rb +10 -7
  50. data/lib/legion/llm/{pipeline → inference}/audit_publisher.rb +20 -4
  51. data/lib/legion/llm/inference/conversation.rb +550 -0
  52. data/lib/legion/llm/{pipeline → inference}/enrichment_injector.rb +1 -1
  53. data/lib/legion/llm/{pipeline → inference}/executor.rb +121 -73
  54. data/lib/legion/llm/{pipeline → inference}/gaia_caller.rb +1 -1
  55. data/lib/legion/llm/{pipeline → inference}/profile.rb +1 -1
  56. data/lib/legion/llm/inference/prompt.rb +222 -0
  57. data/lib/legion/llm/{pipeline → inference}/request.rb +1 -1
  58. data/lib/legion/llm/{pipeline → inference}/response.rb +1 -1
  59. data/lib/legion/llm/{pipeline → inference}/steps/billing.rb +2 -2
  60. data/lib/legion/llm/inference/steps/classification.rb +254 -0
  61. data/lib/legion/llm/{pipeline → inference}/steps/confidence_scoring.rb +2 -2
  62. data/lib/legion/llm/{pipeline → inference}/steps/debate.rb +1 -1
  63. data/lib/legion/llm/{pipeline → inference}/steps/gaia_advisory.rb +1 -1
  64. data/lib/legion/llm/{pipeline → inference}/steps/knowledge_capture.rb +1 -1
  65. data/lib/legion/llm/{pipeline → inference}/steps/mcp_discovery.rb +1 -1
  66. data/lib/legion/llm/{pipeline → inference}/steps/metering.rb +2 -1
  67. data/lib/legion/llm/{pipeline → inference}/steps/post_response.rb +22 -22
  68. data/lib/legion/llm/{pipeline → inference}/steps/prompt_cache.rb +1 -1
  69. data/lib/legion/llm/{pipeline → inference}/steps/rag_context.rb +1 -1
  70. data/lib/legion/llm/{pipeline → inference}/steps/rag_guard.rb +7 -2
  71. data/lib/legion/llm/{pipeline → inference}/steps/rbac.rb +17 -9
  72. data/lib/legion/llm/{pipeline → inference}/steps/skill_injector.rb +4 -4
  73. data/lib/legion/llm/{pipeline → inference}/steps/span_annotator.rb +1 -1
  74. data/lib/legion/llm/{pipeline → inference}/steps/sticky_helpers.rb +1 -1
  75. data/lib/legion/llm/{pipeline → inference}/steps/sticky_persist.rb +3 -3
  76. data/lib/legion/llm/{pipeline → inference}/steps/sticky_runners.rb +4 -4
  77. data/lib/legion/llm/{pipeline → inference}/steps/tier_assigner.rb +1 -1
  78. data/lib/legion/llm/{pipeline → inference}/steps/token_budget.rb +4 -4
  79. data/lib/legion/llm/{pipeline → inference}/steps/tool_calls.rb +1 -1
  80. data/lib/legion/llm/{pipeline → inference}/steps/tool_discovery.rb +1 -1
  81. data/lib/legion/llm/{pipeline → inference}/steps/tool_history.rb +2 -2
  82. data/lib/legion/llm/{pipeline → inference}/steps/trigger_match.rb +1 -1
  83. data/lib/legion/llm/{pipeline → inference}/steps.rb +1 -1
  84. data/lib/legion/llm/{pipeline → inference}/timeline.rb +1 -1
  85. data/lib/legion/llm/{pipeline → inference}/tool_adapter.rb +1 -1
  86. data/lib/legion/llm/{pipeline → inference}/tool_dispatcher.rb +1 -1
  87. data/lib/legion/llm/{pipeline → inference}/tracing.rb +1 -1
  88. data/lib/legion/llm/inference.rb +736 -0
  89. data/lib/legion/llm/metering/estimator.rb +53 -0
  90. data/lib/legion/llm/metering/tokens.rb +122 -0
  91. data/lib/legion/llm/metering/tracker.rb +101 -0
  92. data/lib/legion/llm/metering.rb +76 -7
  93. data/lib/legion/llm/quality/checker.rb +85 -0
  94. data/lib/legion/llm/quality/confidence/score.rb +53 -0
  95. data/lib/legion/llm/quality/confidence/scorer.rb +239 -0
  96. data/lib/legion/llm/quality/shadow_eval.rb +133 -0
  97. data/lib/legion/llm/quality.rb +13 -0
  98. data/lib/legion/llm/router/arbitrage.rb +117 -0
  99. data/lib/legion/llm/router.rb +1 -1
  100. data/lib/legion/llm/scheduling/batch.rb +180 -0
  101. data/lib/legion/llm/scheduling/off_peak.rb +37 -0
  102. data/lib/legion/llm/skills/base.rb +5 -5
  103. data/lib/legion/llm/tools/confidence.rb +179 -0
  104. data/lib/legion/llm/tools/dispatcher.rb +5 -5
  105. data/lib/legion/llm/tools.rb +13 -0
  106. data/lib/legion/llm/transport/exchanges/fleet.rb +14 -0
  107. data/lib/legion/llm/transport/messages/fleet_error.rb +63 -0
  108. data/lib/legion/llm/transport/messages/fleet_request.rb +32 -0
  109. data/lib/legion/llm/transport/messages/fleet_response.rb +51 -0
  110. data/lib/legion/llm/transport/messages/metering_event.rb +34 -0
  111. data/lib/legion/llm/transport/messages/prompt_event.rb +58 -0
  112. data/lib/legion/llm/transport/messages/skill_event.rb +46 -0
  113. data/lib/legion/llm/transport/messages/tool_event.rb +48 -0
  114. data/lib/legion/llm/transport.rb +19 -0
  115. data/lib/legion/llm/types/chunk.rb +45 -0
  116. data/lib/legion/llm/types/content_block.rb +55 -0
  117. data/lib/legion/llm/types/message.rb +73 -0
  118. data/lib/legion/llm/types/tool_call.rb +69 -0
  119. data/lib/legion/llm/types.rb +13 -0
  120. data/lib/legion/llm/version.rb +1 -1
  121. data/lib/legion/llm.rb +102 -1055
  122. metadata +105 -79
  123. data/lib/legion/llm/arbitrage.rb +0 -115
  124. data/lib/legion/llm/audit/exchange.rb +0 -11
  125. data/lib/legion/llm/audit/prompt_event.rb +0 -56
  126. data/lib/legion/llm/audit/skill_event.rb +0 -44
  127. data/lib/legion/llm/audit/tool_event.rb +0 -46
  128. data/lib/legion/llm/batch.rb +0 -178
  129. data/lib/legion/llm/claude_config_loader.rb +0 -63
  130. data/lib/legion/llm/codex_config_loader.rb +0 -111
  131. data/lib/legion/llm/compressor.rb +0 -203
  132. data/lib/legion/llm/confidence_score.rb +0 -49
  133. data/lib/legion/llm/confidence_scorer.rb +0 -235
  134. data/lib/legion/llm/context_curator.rb +0 -313
  135. data/lib/legion/llm/conversation_store.rb +0 -548
  136. data/lib/legion/llm/cost_estimator.rb +0 -51
  137. data/lib/legion/llm/cost_tracker.rb +0 -99
  138. data/lib/legion/llm/daemon_client.rb +0 -249
  139. data/lib/legion/llm/embeddings.rb +0 -481
  140. data/lib/legion/llm/fleet/error.rb +0 -61
  141. data/lib/legion/llm/fleet/exchange.rb +0 -12
  142. data/lib/legion/llm/fleet/request.rb +0 -30
  143. data/lib/legion/llm/fleet/response.rb +0 -49
  144. data/lib/legion/llm/metering/event.rb +0 -32
  145. data/lib/legion/llm/metering/exchange.rb +0 -11
  146. data/lib/legion/llm/native_dispatch.rb +0 -140
  147. data/lib/legion/llm/off_peak.rb +0 -35
  148. data/lib/legion/llm/override_confidence.rb +0 -177
  149. data/lib/legion/llm/pipeline/steps/classification.rb +0 -115
  150. data/lib/legion/llm/pipeline.rb +0 -22
  151. data/lib/legion/llm/prompt.rb +0 -220
  152. data/lib/legion/llm/provider_registry.rb +0 -40
  153. data/lib/legion/llm/providers.rb +0 -257
  154. data/lib/legion/llm/quality_checker.rb +0 -83
  155. data/lib/legion/llm/response_cache.rb +0 -149
  156. data/lib/legion/llm/routes.rb +0 -739
  157. data/lib/legion/llm/settings.rb +0 -328
  158. data/lib/legion/llm/shadow_eval.rb +0 -131
  159. data/lib/legion/llm/structured_output.rb +0 -81
  160. data/lib/legion/llm/token_tracker.rb +0 -120
  161. /data/lib/legion/llm/{pipeline → inference}/mcp_tool_adapter.rb +0 -0
  162. /data/lib/legion/llm/{usage.rb → metering/usage.rb} +0 -0
  163. /data/lib/legion/llm/router/{escalation_chain.rb → escalation/chain.rb} +0 -0
  164. /data/lib/legion/llm/{escalation_history.rb → router/escalation/history.rb} +0 -0
  165. /data/lib/legion/llm/{escalation_tracker.rb → router/escalation/tracker.rb} +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 95918a13b81cc27203ad7eaccf52b06b7989735cb669febc7e94abd8c8c5452c
4
- data.tar.gz: a7887cd39bbeda75313f37c134ef8461d7d6bd240be811dbf77e91f64343fc30
3
+ metadata.gz: df10648acc8e54784f2c3e097d4fdf585e914264f78d1584f34483243eeea22a
4
+ data.tar.gz: dd01e52bb2a5b5f1096c2f4c91662252930531d8e96617511f1471b31a232566
5
5
  SHA512:
6
- metadata.gz: e389df67e9855d573a195948123e6aae6760da6e461d54148edd0cd1faa8535445c744ce02b3512e89fd7603197370f4ea8d84bb9dd82588d3e545dea308bc2b
7
- data.tar.gz: 965932e45bf5905b77ba667d43d24e70380a203b048f01daaa17cc72c835a952fd9ee474a78a868bd8fef538b1dca9843d599f13249cb88d7c67eca6b53fd64b
6
+ metadata.gz: c86a186203b5398f95c05e27c4cde7e07d0d981bfc53a316e5cf2e2d363332f5cfdb96acb961e3d8565fe10b4b88078cfd713cb9b61fb7a58bd598597e403ef7
7
+ data.tar.gz: 0b98ce0936adebd8f55cb6fd1075343e698b5c27c9b264ebb884bfe640177a9594bee0b0076c93fb3714e346dbd4d5acf797316c40d2ea3045d299cdf3f6779f
data/.gitignore CHANGED
@@ -18,3 +18,4 @@ legion.log
18
18
  .DS_Store
19
19
  .worktrees/
20
20
  .claude/
21
+ docs/
data/CHANGELOG.md CHANGED
@@ -1,6 +1,59 @@
1
1
  # Legion LLM Changelog
2
2
 
3
- ## [Unreleased]
3
+ ## [0.8.0] - 2026-04-21
4
+
5
+ ### Changed
6
+ - BREAKING: Module hierarchy restructured — see compat.rb for full alias list
7
+ - Dead `lex-llm-gateway` references removed
8
+ - `hooks/metering.rb` + `hooks/cost_tracking.rb` collapsed into `Metering.install_hook`
9
+
10
+ ### Added
11
+ - OpenAI-compatible API: POST /v1/chat/completions, GET /v1/models, POST /v1/embeddings
12
+ - Anthropic-compatible API: POST /v1/messages
13
+ - Config-driven /v1/ auth: settings[:llm][:api][:auth]
14
+ - Backward compat aliases via compat.rb with deprecation warnings
15
+
16
+ ## [0.7.15] - 2026-04-20
17
+
18
+ ### Added
19
+ - PHI cloud provider gate: `compliance.phi_block_cloud` (default: `false`) blocks restricted-classified requests from cloud providers when enabled. Warns on permit when disabled. Cloud provider list configurable via `compliance.cloud_providers`. Fixes #72
20
+
21
+ ## [0.7.14] - 2026-04-20
22
+
23
+ ### Added
24
+ - PII/PHI redaction mode: `compliance.redact_pii` (default: `false`) replaces detected patterns with configurable placeholder token before pipeline continues. Placeholder configurable via `compliance.redaction_placeholder` (default: `[REDACTED]`)
25
+ - `compliance.strict_hipaa` setting (default: `false`): when enabled, scans all 12 HIPAA patterns; when disabled, scans only core 3 (SSN, email, phone) for lighter processing. Closes #73
26
+
27
+ ## [0.7.13] - 2026-04-20
28
+
29
+ ### Fixed
30
+ - Classification step now always runs the PII/PHI scan, even on unclassified requests — defaults to `:public` baseline. Configurable via `compliance.default_level` (default: `:public`) and `compliance.classification_scan` (default: `true`). Fixes #70
31
+
32
+ ## [0.7.12] - 2026-04-20
33
+
34
+ ### Fixed
35
+ - RBAC step now respects `rbac.fail_open` setting (default: `true`) when `Legion::Rbac` is unavailable. Fleet callers are always blocked. Non-fleet callers are permitted with a warning when `fail_open` is true, or blocked with 503 when false. Fixes #69
36
+
37
+ ## [0.7.11] - 2026-04-20
38
+
39
+ ### Fixed
40
+ - RAG faithfulness check now logs a warning when RAG context is present but no `Hooks::RagGuard` is registered, instead of silently skipping. Fixes #71
41
+ - RAG faithfulness failure now logs at warn level in addition to appending to pipeline warnings array
42
+
43
+ ## [0.7.10] - 2026-04-20
44
+
45
+ ### Fixed
46
+ - `configure_anthropic` now passes `base_url` through to RubyLLM (`anthropic_api_base`) when present, enabling custom API gateways and proxies. Fixes #68
47
+ - `configure_openai` now passes `base_url` through to RubyLLM (`openai_api_base`) when present, for consistency with Anthropic and Ollama providers
48
+ - `configure_gemini` now passes `base_url` through to RubyLLM (`gemini_api_base`) when present, for consistency with Anthropic and Ollama providers
49
+
50
+ ## [0.7.9] - 2026-04-18
51
+ ### Added
52
+ - Expanded PII/PHI classification to cover 12 HIPAA Safe Harbor identifier patterns (was 3) and 20 PHI keywords (was 11). Partial fix for #73
53
+
54
+ ### Fixed
55
+ - `web_fetch` client tool now delegates to `Legion::CLI::Chat::WebFetch.fetch` instead of bare `Net::HTTP.get` — gains SSL, redirect following, HTML-to-markdown conversion, and `maxLength` truncation (LegionIO/LegionIO#153)
56
+ - Added `web_search` client tool dispatch via `Legion::CLI::Chat::WebSearch.search` — previously fell through to generic "not executable server-side" error (LegionIO/LegionIO#154)
4
57
 
5
58
  ## [0.7.8] - 2026-04-17
6
59
  ### Fixed