legionio 1.7.15 → 1.7.16

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: de3b6cd94efb3c63cc92dfcd54303a89fa9517b9a525349b2a40750373e6cb2f
4
- data.tar.gz: 8cbee81b7503b87a10502b47b308d614e1c22a2675f881c110c9cc8b753561c5
3
+ metadata.gz: 60d6e7e501be5410e50a0096185b33af3f10b500ac766d2138efa67bb80908e0
4
+ data.tar.gz: 10d105942a000d3eb726125a6e55c3dbe1c70474623671ac09a69278a5c998db
5
5
  SHA512:
6
- metadata.gz: bbaa15bc0e0c87a1f72bc8efc84f005e6a1f6b02bb56464436e7cc3d80ec67a9f691107561b3a817d2bb63b5be0f3c0c2b081a5595a491daa29db5328bffb2f2
7
- data.tar.gz: af119a4f87785f6bc2f05b2c01977e7d352882f20fb1407b6aef7e3ed08f1d96ab5c37f8814f6bd7eb403b554cd9cfb7ea0aa71e46509703e3d34dfe6f6ced2a
6
+ metadata.gz: c3d0342c0a3131bf421c7139ed2917eb94e037713e8d3cb6183680d1c3a04ffcd1bdca68679fadaa3c68237f5c0a994b33814776e56ea9bcdb865c0931b0c5f5
7
+ data.tar.gz: 0df1adc61ab111c31b1c6a87ed5b3e15d4243bf112b9914b01f7e9e0d9c6dc2ac6272708ddc4337187443d028da80447fc33a97a69e296f110f95b83404b1065
data/CHANGELOG.md CHANGED
@@ -2,6 +2,14 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [1.7.16] - 2026-04-03
6
+
7
+ ### Fixed
8
+ - Inference endpoint now injects daemon MCP tools alongside client tools via class-level cached adapters
9
+ - MCP server pre-warmed in background thread during boot to avoid blocking first inference
10
+ - Gaia ticks route added to fallback API routes
11
+ - Reload endpoint disabled (418) to prevent accidental restart loops
12
+
5
13
  ## [1.7.15] - 2026-04-03
6
14
 
7
15
  ### Added
@@ -6,12 +6,23 @@ module Legion
6
6
  module Gaia
7
7
  def self.registered(app)
8
8
  register_status_route(app)
9
+ register_ticks_route(app)
9
10
  register_channels_route(app)
10
11
  register_buffer_route(app)
11
12
  register_sessions_route(app)
12
13
  register_teams_webhook_route(app)
13
14
  end
14
15
 
16
+ def self.register_ticks_route(app)
17
+ app.get '/api/gaia/ticks' do
18
+ halt 503, json_error('gaia_unavailable', 'gaia is not started', status_code: 503) unless gaia_available?
19
+
20
+ limit = (params[:limit] || 50).to_i.clamp(1, 200)
21
+ events = defined?(Legion::Gaia) ? Legion::Gaia.tick_history&.recent(limit: limit) : []
22
+ json_response({ events: events || [] })
23
+ end
24
+ end
25
+
15
26
  def self.register_status_route(app)
16
27
  app.get '/api/gaia/status' do
17
28
  if gaia_available?
@@ -60,15 +60,17 @@ module Legion
60
60
  end
61
61
 
62
62
  define_method(:cached_mcp_tools) do
63
- @cached_mcp_tools ||= begin
63
+ @@cached_mcp_tools ||= begin # rubocop:disable Style/ClassVars
64
64
  all = []
65
65
  begin
66
66
  require 'legion/mcp' unless defined?(Legion::MCP) && Legion::MCP.respond_to?(:server)
67
+ Legion::MCP.server if defined?(Legion::MCP) && Legion::MCP.respond_to?(:server)
67
68
  rescue LoadError => e
68
69
  Legion::Logging.log_exception(e, payload_summary: 'cached_mcp_tools: failed to require legion/mcp', component_type: :api)
69
70
  end
70
71
  if defined?(Legion::MCP::Server) && Legion::MCP::Server.respond_to?(:tool_registry)
71
72
  require 'legion/llm/pipeline/mcp_tool_adapter' unless defined?(Legion::LLM::Pipeline::McpToolAdapter)
73
+ Legion::Logging.info "[llm][api] cached_mcp_tools building from #{Legion::MCP::Server.tool_registry.size} MCP tools"
72
74
  Legion::MCP::Server.tool_registry.each do |tc|
73
75
  all << Legion::LLM::Pipeline::McpToolAdapter.new(tc)
74
76
  rescue StandardError => e
@@ -338,9 +340,22 @@ module Legion
338
340
  build_client_tool_class(ts[:name].to_s, ts[:description].to_s, ts[:parameters] || ts[:input_schema])
339
341
  end
340
342
 
343
+ Legion::Logging.debug "[llm][api] inference inbound client_tools=#{tool_classes.size} requested_tools=#{requested_tools.size}"
344
+
341
345
  # Detect streaming mode
342
346
  streaming = body[:stream] == true && env['HTTP_ACCEPT']&.include?('text/event-stream')
343
347
 
348
+ # Inject MCP tools from daemon alongside client tools
349
+ all_tools = tool_classes.dup
350
+ begin
351
+ mcp_cache = cached_mcp_tools
352
+ mcp_to_inject = requested_tools.empty? ? mcp_cache[:always] : mcp_cache[:all]
353
+ all_tools.concat(mcp_to_inject) if mcp_to_inject&.any?
354
+ Legion::Logging.debug "[llm][api] inference mcp_injected=#{mcp_to_inject&.size || 0} total_tools=#{all_tools.size}"
355
+ rescue StandardError => e
356
+ Legion::Logging.log_exception(e, payload_summary: 'mcp tool injection failed', component_type: :api)
357
+ end
358
+
344
359
  # Build pipeline request
345
360
  require 'legion/llm/pipeline/request' unless defined?(Legion::LLM::Pipeline::Request)
346
361
  require 'legion/llm/pipeline/executor' unless defined?(Legion::LLM::Pipeline::Executor)
@@ -349,7 +364,7 @@ module Legion
349
364
  messages: messages,
350
365
  system: body[:system],
351
366
  routing: { provider: provider, model: model },
352
- tools: tool_classes,
367
+ tools: all_tools,
353
368
  caller: { requested_by: { identity: caller_identity, type: :user, credential: :api } },
354
369
  conversation_id: body[:conversation_id],
355
370
  metadata: { requested_tools: requested_tools },
@@ -159,6 +159,14 @@ module Legion
159
159
  setup_metrics
160
160
  setup_task_outcome_observer
161
161
 
162
+ # Pre-warm MCP server in background so first inference isn't blocked by 837-tool build
163
+ Thread.new do
164
+ require 'legion/mcp' if defined?(Legion::Settings) && !defined?(Legion::MCP)
165
+ Legion::MCP.server if defined?(Legion::MCP) && Legion::MCP.respond_to?(:server)
166
+ rescue StandardError => e
167
+ log.warn("MCP pre-warm failed: #{e.message}")
168
+ end
169
+
162
170
  require 'sinatra/base'
163
171
  require 'legion/api/default_settings'
164
172
  api_settings = Legion::Settings[:api]
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Legion
4
- VERSION = '1.7.15'
4
+ VERSION = '1.7.16'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: legionio
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.15
4
+ version: 1.7.16
5
5
  platform: ruby
6
6
  authors:
7
7
  - Esity