legionio 1.4.94 → 1.4.95

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: 72bd61b58a41c643d7570541ccd32493cc6357e32db64c3649275d7b7a1c159f
4
- data.tar.gz: 05b98ee5d6ee262bdb7909842c827d43f73bca4bc245cfb4e3e453a57939d45c
3
+ metadata.gz: a110098f876265aa1233e4ca1e60baf30f5a23340b8d9de1f4a9c942ea0128fd
4
+ data.tar.gz: 3144aab6b5cab4ed042fee55d344cd2a8493ac48284a74ef431238643d91a863
5
5
  SHA512:
6
- metadata.gz: c339580f9b229475d21752fa56bfcb90c7213c177dd83dc713220e1d872dbbe13ad690122abc5f4c620416a45bbda960c11dc355fe048b756ea5224259576647
7
- data.tar.gz: 2f738e376dc5b147a8e3b4dcc71013fce20cc39b1ec24bbdac922080df327be7f8f743e860a62ee21ab6b935b0d9e7d23b48703adc1ccf274bf5ff713d4f90b3
6
+ metadata.gz: 8a5a7090df59bcf09e9bc2dc5cd2c60a7e774b7551b2cc7583d2eb1afdc5f6b3319ec911a8cce0130c0dc93679260ac83cf57e5c598b17c6d6ccb4ba229058ac
7
+ data.tar.gz: f6a2135e2ce480e7bce8f80eec8ab6e467c9e531ea10960470f2d2e7c3fb7325b84d3b9f256247255cd5c00220d21f53da8520c5b3e3045a6f446ce75f1600d8
data/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # Legion Changelog
2
2
 
3
+ ## [1.4.95] - 2026-03-20
4
+
5
+ ### Added
6
+ - `GET /api/prompts` — list all prompt templates via lex-prompt Client
7
+ - `GET /api/prompts/:name` — show prompt details for the latest version
8
+ - `POST /api/prompts/:name/run` — render a prompt template with variables and run it through Legion::LLM; returns rendered_prompt, response, usage, model, version
9
+ - 503 guard for missing lex-prompt dependency (LoadError rescue in `prompt_client` helper)
10
+ - 503 guard for LLM subsystem unavailable on the `/run` endpoint
11
+ - 404 on prompt not found, 422 on version not found for `/run`
12
+ - 32 new specs in `spec/legion/api/prompts_spec.rb` covering all routes and error paths
13
+
3
14
  ## [1.4.94] - 2026-03-20
4
15
 
5
16
  ### Added
@@ -0,0 +1,107 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ class API < Sinatra::Base
5
+ module Routes
6
+ module Prompts
7
+ def self.registered(app)
8
+ app.helpers do
9
+ define_method(:require_llm!) do
10
+ return if defined?(Legion::LLM) &&
11
+ Legion::LLM.respond_to?(:started?) &&
12
+ Legion::LLM.started?
13
+
14
+ halt 503, json_error('llm_unavailable', 'LLM subsystem is not available', status_code: 503)
15
+ end
16
+
17
+ define_method(:prompt_client) do
18
+ require 'legion/extensions/prompt/client'
19
+ Legion::Extensions::Prompt::Client.new
20
+ rescue LoadError
21
+ halt 503, json_error('prompt_unavailable', 'lex-prompt is not loaded', status_code: 503)
22
+ end
23
+ end
24
+
25
+ register_list(app)
26
+ register_show(app)
27
+ register_run(app)
28
+ end
29
+
30
+ def self.register_list(app)
31
+ app.get '/api/prompts' do
32
+ client = prompt_client
33
+ result = client.list_prompts
34
+ json_response(result)
35
+ rescue StandardError => e
36
+ Legion::Logging.error "API prompts list error: #{e.message}"
37
+ json_error('execution_error', e.message, status_code: 500)
38
+ end
39
+ end
40
+
41
+ def self.register_show(app)
42
+ app.get '/api/prompts/:name' do
43
+ name = params[:name]
44
+ client = prompt_client
45
+ result = client.get_prompt(name: name)
46
+
47
+ halt 404, json_error('not_found', "prompt '#{name}' not found", status_code: 404) if result[:error]
48
+
49
+ json_response(result)
50
+ rescue StandardError => e
51
+ Legion::Logging.error "API prompts show error: #{e.message}"
52
+ json_error('execution_error', e.message, status_code: 500)
53
+ end
54
+ end
55
+
56
+ def self.register_run(app)
57
+ app.post '/api/prompts/:name/run' do
58
+ require_llm!
59
+
60
+ name = params[:name]
61
+ body = parse_request_body
62
+ variables = body[:variables] || {}
63
+ version = body[:version]
64
+ model = body[:model]
65
+ provider = body[:provider]
66
+
67
+ client = prompt_client
68
+ rendered = client.render_prompt(name: name, variables: variables, version: version)
69
+
70
+ if rendered[:error]
71
+ code = rendered[:error] == 'not_found' ? 404 : 422
72
+ halt code, json_error(rendered[:error], "prompt '#{name}' #{rendered[:error].tr('_', ' ')}", status_code: code)
73
+ end
74
+
75
+ session = Legion::LLM.chat_direct(model: model, provider: provider)
76
+ response = session.ask(rendered[:rendered])
77
+
78
+ prompt_version = rendered[:prompt_version]
79
+ model_used = session.model.to_s
80
+
81
+ usage = {
82
+ input_tokens: response.respond_to?(:input_tokens) ? response.input_tokens : nil,
83
+ output_tokens: response.respond_to?(:output_tokens) ? response.output_tokens : nil
84
+ }
85
+
86
+ json_response({
87
+ name: name,
88
+ version: prompt_version,
89
+ rendered_prompt: rendered[:rendered],
90
+ response: response.content,
91
+ usage: usage,
92
+ model: model_used,
93
+ provider: provider
94
+ })
95
+ rescue StandardError => e
96
+ Legion::Logging.error "API prompts run error: #{e.message}"
97
+ json_error('execution_error', e.message, status_code: 500)
98
+ end
99
+ end
100
+
101
+ class << self
102
+ private :register_list, :register_show, :register_run
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
data/lib/legion/api.rb CHANGED
@@ -38,6 +38,7 @@ require_relative 'api/org_chart'
38
38
  require_relative 'api/workflow'
39
39
  require_relative 'api/governance'
40
40
  require_relative 'api/acp'
41
+ require_relative 'api/prompts'
41
42
 
42
43
  module Legion
43
44
  class API < Sinatra::Base
@@ -120,6 +121,7 @@ module Legion
120
121
  register Routes::OrgChart
121
122
  register Routes::Governance
122
123
  register Routes::Acp
124
+ register Routes::Prompts
123
125
 
124
126
  use Legion::Rbac::Middleware if defined?(Legion::Rbac::Middleware)
125
127
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Legion
4
- VERSION = '1.4.94'
4
+ VERSION = '1.4.95'
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.4.94
4
+ version: 1.4.95
5
5
  platform: ruby
6
6
  authors:
7
7
  - Esity
@@ -379,6 +379,7 @@ files:
379
379
  - lib/legion/api/nodes.rb
380
380
  - lib/legion/api/openapi.rb
381
381
  - lib/legion/api/org_chart.rb
382
+ - lib/legion/api/prompts.rb
382
383
  - lib/legion/api/rbac.rb
383
384
  - lib/legion/api/relationships.rb
384
385
  - lib/legion/api/schedules.rb