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 +4 -4
- data/CHANGELOG.md +8 -0
- data/lib/legion/api/gaia.rb +11 -0
- data/lib/legion/api/llm.rb +17 -2
- data/lib/legion/service.rb +8 -0
- data/lib/legion/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 60d6e7e501be5410e50a0096185b33af3f10b500ac766d2138efa67bb80908e0
|
|
4
|
+
data.tar.gz: 10d105942a000d3eb726125a6e55c3dbe1c70474623671ac09a69278a5c998db
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
data/lib/legion/api/gaia.rb
CHANGED
|
@@ -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?
|
data/lib/legion/api/llm.rb
CHANGED
|
@@ -60,15 +60,17 @@ module Legion
|
|
|
60
60
|
end
|
|
61
61
|
|
|
62
62
|
define_method(:cached_mcp_tools) do
|
|
63
|
-
|
|
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:
|
|
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 },
|
data/lib/legion/service.rb
CHANGED
|
@@ -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]
|
data/lib/legion/version.rb
CHANGED