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 +4 -4
- data/CHANGELOG.md +11 -0
- data/lib/legion/api/prompts.rb +107 -0
- data/lib/legion/api.rb +2 -0
- data/lib/legion/version.rb +1 -1
- metadata +2 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a110098f876265aa1233e4ca1e60baf30f5a23340b8d9de1f4a9c942ea0128fd
|
|
4
|
+
data.tar.gz: 3144aab6b5cab4ed042fee55d344cd2a8493ac48284a74ef431238643d91a863
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
|
data/lib/legion/version.rb
CHANGED
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.
|
|
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
|