lex-xai 0.1.4 → 0.1.5

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: f122be7885c3d5f79b22015679579e69bbf8ccbb841a4e5f903688e2ae2d1221
4
- data.tar.gz: 7738c16fc492d2f975702b535d9b1d54ca370bbe8013a0d03946b7203070386b
3
+ metadata.gz: 68b63fbc6b6bf1522fa9d02196661d696f988f51c27955f1f4d9fe75af2f05e4
4
+ data.tar.gz: 610e5fddafd6cdc9a38adc9fc43750cce8bd5bc216fed3d7594da83613538ff6
5
5
  SHA512:
6
- metadata.gz: 6b39da9f13c8445ca28b69402162d9323fc280eb84770c96040a0979f4890eae53c7acc1017ed7f07c4db8e140a57b38c51abb065cee872b82423e5c59b77aec
7
- data.tar.gz: 9aea0da6fc20892bad4346e9c72d27c25244987b10d650b79f273fc0db53b313f965b4f605b4e00960c11d34f893a77e0fc85b1cef28c4651c082d6c8d2b8fea
6
+ metadata.gz: c319c74d16f878256c34689399f97975575feedce876cbb511ad982fd6b585c522fe955613f967ef725a0aa82aae76301f83aee3081115abd205aac81640c361
7
+ data.tar.gz: '061680b95c34d13bbfb460aabfc66bd652a73f01ce5a81ded3c29865b804cd1d4aef9ecbf369ff12dbcc560bf5052061278414e4068f996f9017b59d06ad60e1'
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.1.5] - 2026-04-06
4
+
5
+ ### Added
6
+ - Credential-only identity module for Phase 8 Broker integration (`Identity` module with `provide_token`)
7
+
3
8
  ## [0.1.4] - 2026-03-31
4
9
 
5
10
  ### Added
data/CLAUDE.md CHANGED
@@ -10,8 +10,8 @@ Legion Extension that connects LegionIO to the xAI Grok API. Provides runners fo
10
10
 
11
11
  **GitHub**: https://github.com/LegionIO/lex-xai
12
12
  **License**: MIT
13
- **Version**: 0.1.2
14
- **Specs**: 23 examples
13
+ **Version**: 0.1.5
14
+ **Specs**: 43 examples (4 spec files)
15
15
 
16
16
  ## Architecture
17
17
 
@@ -26,7 +26,7 @@ Legion::Extensions::Xai
26
26
  └── Client # Standalone client class (includes all runners, holds @config)
27
27
  ```
28
28
 
29
- `Helpers::Client` is a **module** with a `client(api_key:, base_url: DEFAULT_BASE_URL, ...)` factory method. `DEFAULT_BASE_URL` is `'https://api.x.ai'`. Authentication uses `Authorization: Bearer #{api_key}` header. Runner modules `extend` it to gain `client(...)` as a module-level method.
29
+ `Helpers::Client` is a **module** with a `client(api_key:, base_url: DEFAULT_BASE_URL, ...)` factory method. `DEFAULT_BASE_URL = 'https://api.x.ai'`. Authentication uses `Authorization: Bearer #{api_key}` header. Runner modules `extend` it to gain `client(...)` as a module-level method.
30
30
 
31
31
  `Client` (class) provides a standalone instantiable wrapper that holds `@config` and delegates through `Helpers::Client`.
32
32
 
@@ -37,6 +37,7 @@ Legion::Extensions::Xai
37
37
  - `Chat#create` supports `stream: false` kwarg (passed through to API body) but does not handle streaming responses internally.
38
38
  - API paths use `/v1/` prefix: `/v1/chat/completions`, `/v1/models`, `/v1/models/:model`, `/v1/embeddings`.
39
39
  - `Models#retrieve` uses the method name `retrieve` (not `get`) for consistency with lex-claude and lex-openai.
40
+ - `Chat` and `Embeddings` return `{ result: response.body }`. `Models` returns `{ models: ... }` / `{ model: ... }`.
40
41
  - `include Legion::Extensions::Helpers::Lex` is guarded with `const_defined?` pattern.
41
42
 
42
43
  ## Dependencies
@@ -45,15 +46,17 @@ Legion::Extensions::Xai
45
46
  |-----|---------|
46
47
  | `faraday` >= 2.0 | HTTP client for xAI API |
47
48
  | `multi_json` | JSON parser abstraction |
49
+ | `legion-cache`, `legion-crypt`, `legion-data`, `legion-json`, `legion-logging`, `legion-settings`, `legion-transport` | LegionIO core |
48
50
 
49
51
  ## Testing
50
52
 
51
53
  ```bash
52
54
  bundle install
53
- bundle exec rspec # 23 examples
55
+ bundle exec rspec # 43 examples
54
56
  bundle exec rubocop
55
57
  ```
56
58
 
57
59
  ---
58
60
 
59
61
  **Maintained By**: Matthew Iverson (@Esity)
62
+ **Last Updated**: 2026-04-06
data/README.md CHANGED
@@ -23,34 +23,68 @@ require 'legion/extensions/xai/client'
23
23
 
24
24
  client = Legion::Extensions::Xai::Client.new(api_key: 'your-xai-api-key')
25
25
 
26
- # Chat completions
27
- result = client.create(messages: [{ role: 'user', content: 'Hello!' }])
26
+ # Chat completions (default model: grok-3)
27
+ result = client.create(
28
+ messages: [{ role: 'user', content: 'Hello!' }]
29
+ )
30
+ # => { result: { 'choices' => [...], ... } }
31
+
32
+ # With explicit model
33
+ result = client.create(
34
+ model: 'grok-3',
35
+ messages: [{ role: 'user', content: 'What is 2+2?' }]
36
+ )
28
37
 
29
38
  # List models
30
39
  result = client.list
40
+ # => { models: [...] }
31
41
 
32
- # Retrieve a model
42
+ # Retrieve a specific model
33
43
  result = client.retrieve(model: 'grok-3')
44
+ # => { model: { ... } }
34
45
 
35
- # Create embeddings
36
- result = client.create(input: 'Hello world')
46
+ # Create embeddings (default model: embedding-beta)
47
+ result = client.create(
48
+ input: 'Hello world'
49
+ )
50
+ # => { result: { 'data' => [...], ... } }
37
51
  ```
38
52
 
39
53
  ### Runner Modules
40
54
 
41
55
  ```ruby
42
- include Legion::Extensions::Xai::Runners::Chat
43
-
44
- result = create(api_key: 'your-key', messages: [{ role: 'user', content: 'Hello!' }])
56
+ result = Legion::Extensions::Xai::Runners::Chat.create(
57
+ api_key: 'your-key',
58
+ messages: [{ role: 'user', content: 'Hello!' }]
59
+ )
60
+
61
+ result = Legion::Extensions::Xai::Runners::Embeddings.create(
62
+ api_key: 'your-key',
63
+ input: 'text to embed'
64
+ )
65
+
66
+ result = Legion::Extensions::Xai::Runners::Models.list(api_key: 'your-key')
67
+ result = Legion::Extensions::Xai::Runners::Models.retrieve(api_key: 'your-key', model: 'grok-3')
45
68
  ```
46
69
 
47
70
  ## API Coverage
48
71
 
49
- | Runner | Methods |
50
- |--------|---------|
51
- | `Chat` | `create` |
52
- | `Models` | `list`, `retrieve` |
53
- | `Embeddings` | `create` |
72
+ | Runner | Methods | Default Model |
73
+ |--------|---------|---------------|
74
+ | `Chat` | `create` | `grok-3` |
75
+ | `Embeddings` | `create` | `embedding-beta` |
76
+ | `Models` | `list`, `retrieve` | — |
77
+
78
+ ## Dependencies
79
+
80
+ - `faraday` >= 2.0 - HTTP client
81
+ - `multi_json` - JSON parser abstraction
82
+
83
+ ## Requirements
84
+
85
+ - Ruby >= 3.4
86
+ - [LegionIO](https://github.com/LegionIO/LegionIO) framework (optional for standalone client usage)
87
+ - xAI API key
54
88
 
55
89
  ## Related
56
90
 
@@ -58,6 +92,10 @@ result = create(api_key: 'your-key', messages: [{ role: 'user', content: 'Hello!
58
92
  - `legion-llm` — High-level LLM interface across providers
59
93
  - `extensions-ai/CLAUDE.md` — Architecture patterns shared across all AI extensions
60
94
 
95
+ ## Version
96
+
97
+ 0.1.4
98
+
61
99
  ## License
62
100
 
63
101
  MIT
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Xai
6
+ module Identity
7
+ module_function
8
+
9
+ def provider_name = :xai
10
+ def provider_type = :credential
11
+ def facing = nil
12
+ def capabilities = %i[credentials]
13
+
14
+ def resolve(canonical_name: nil) # rubocop:disable Lint/UnusedMethodArgument
15
+ nil
16
+ end
17
+
18
+ def provide_token
19
+ api_key = resolve_api_key
20
+ return nil unless api_key
21
+
22
+ Legion::Identity::Lease.new(
23
+ provider: :xai,
24
+ credential: api_key,
25
+ expires_at: nil,
26
+ renewable: false,
27
+ issued_at: Time.now,
28
+ metadata: { credential_type: :api_key }
29
+ )
30
+ end
31
+
32
+ def resolve_api_key
33
+ return nil unless defined?(Legion::Settings)
34
+
35
+ value = Legion::Settings.dig(:llm, :providers, :xai, :api_key)
36
+ value = value.find { |v| v && !v.empty? } if value.is_a?(Array)
37
+ value unless value.nil? || (value.is_a?(String) && (value.empty? || value.start_with?('env://')))
38
+ end
39
+
40
+ private_class_method :resolve_api_key
41
+ end
42
+ end
43
+ end
44
+ end
@@ -3,7 +3,7 @@
3
3
  module Legion
4
4
  module Extensions
5
5
  module Xai
6
- VERSION = '0.1.4'
6
+ VERSION = '0.1.5'
7
7
  end
8
8
  end
9
9
  end
@@ -5,6 +5,7 @@ require 'legion/extensions/xai/helpers/client'
5
5
  require 'legion/extensions/xai/runners/chat'
6
6
  require 'legion/extensions/xai/runners/models'
7
7
  require 'legion/extensions/xai/runners/embeddings'
8
+ require 'legion/extensions/xai/identity'
8
9
 
9
10
  module Legion
10
11
  module Extensions
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lex-xai
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Esity
@@ -157,6 +157,7 @@ files:
157
157
  - lib/legion/extensions/xai.rb
158
158
  - lib/legion/extensions/xai/client.rb
159
159
  - lib/legion/extensions/xai/helpers/client.rb
160
+ - lib/legion/extensions/xai/identity.rb
160
161
  - lib/legion/extensions/xai/runners/chat.rb
161
162
  - lib/legion/extensions/xai/runners/embeddings.rb
162
163
  - lib/legion/extensions/xai/runners/models.rb