shiftgate 0.1.0__tar.gz → 0.1.2__tar.gz
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.
- {shiftgate-0.1.0 → shiftgate-0.1.2}/PKG-INFO +87 -49
- {shiftgate-0.1.0 → shiftgate-0.1.2}/README.md +86 -48
- {shiftgate-0.1.0 → shiftgate-0.1.2}/pyproject.toml +1 -1
- {shiftgate-0.1.0 → shiftgate-0.1.2}/shiftgate/cli.py +207 -51
- shiftgate-0.1.2/shiftgate/registry/adapter_registry.py +253 -0
- shiftgate-0.1.2/shiftgate/registry/schemas.py +187 -0
- shiftgate-0.1.2/shiftgate/router/matcher.py +209 -0
- {shiftgate-0.1.0 → shiftgate-0.1.2}/shiftgate/router/router.py +23 -23
- {shiftgate-0.1.0 → shiftgate-0.1.2}/shiftgate/utils/display.py +139 -23
- shiftgate-0.1.2/tests/test_registry.py +448 -0
- {shiftgate-0.1.0 → shiftgate-0.1.2}/tests/test_router.py +99 -44
- shiftgate-0.1.0/data/default_adapters.json +0 -1
- shiftgate-0.1.0/shiftgate/registry/adapter_registry.py +0 -162
- shiftgate-0.1.0/shiftgate/registry/schemas.py +0 -115
- shiftgate-0.1.0/shiftgate/router/matcher.py +0 -115
- shiftgate-0.1.0/tests/test_registry.py +0 -218
- {shiftgate-0.1.0 → shiftgate-0.1.2}/.github/workflows/release.yml +0 -0
- {shiftgate-0.1.0 → shiftgate-0.1.2}/.gitignore +0 -0
- {shiftgate-0.1.0 → shiftgate-0.1.2}/data/default_tasks.json +0 -0
- {shiftgate-0.1.0 → shiftgate-0.1.2}/shiftgate/__init__.py +0 -0
- {shiftgate-0.1.0 → shiftgate-0.1.2}/shiftgate/feedback/__init__.py +0 -0
- {shiftgate-0.1.0 → shiftgate-0.1.2}/shiftgate/feedback/loop.py +0 -0
- {shiftgate-0.1.0 → shiftgate-0.1.2}/shiftgate/registry/__init__.py +0 -0
- {shiftgate-0.1.0 → shiftgate-0.1.2}/shiftgate/registry/task_registry.py +0 -0
- {shiftgate-0.1.0 → shiftgate-0.1.2}/shiftgate/router/__init__.py +0 -0
- {shiftgate-0.1.0 → shiftgate-0.1.2}/shiftgate/router/embedder.py +0 -0
- {shiftgate-0.1.0 → shiftgate-0.1.2}/shiftgate/runtime/__init__.py +0 -0
- {shiftgate-0.1.0 → shiftgate-0.1.2}/shiftgate/runtime/backend.py +0 -0
- {shiftgate-0.1.0 → shiftgate-0.1.2}/shiftgate/utils/__init__.py +0 -0
- {shiftgate-0.1.0 → shiftgate-0.1.2}/tests/__init__.py +0 -0
- {shiftgate-0.1.0 → shiftgate-0.1.2}/tests/test_feedback.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: shiftgate
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.2
|
|
4
4
|
Summary: Intelligent routing layer that automatically selects the right LoRA adapter for each task in your local agent loop.
|
|
5
5
|
Project-URL: Homepage, https://github.com/shiftgate-ai/shiftgate
|
|
6
6
|
Project-URL: Repository, https://github.com/shiftgate-ai/shiftgate
|
|
@@ -35,9 +35,11 @@ Description-Content-Type: text/markdown
|
|
|
35
35
|
|
|
36
36
|
> **shiftgate is an intelligent routing layer that automatically selects the right LoRA adapter for each task in your local agent loop.**
|
|
37
37
|
|
|
38
|
-
|
|
38
|
+
**Shiftgate is a routing layer. Users manage models and LoRA weights themselves.**
|
|
39
|
+
shiftgate stores only adapter *metadata* — it never downloads, caches, or manages weights.
|
|
40
|
+
Your inference backend (Ollama, vLLM) is responsible for loading the weights; shiftgate just tells it *which* adapter to use for each query.
|
|
39
41
|
|
|
40
|
-
|
|
42
|
+
Instead of hardcoding which adapter to use, shiftgate embeds your query and matches it against a catalog of task clusters using cosine similarity — then routes inference to the best-fit LoRA adapter on your running Ollama or vLLM instance.
|
|
41
43
|
|
|
42
44
|
---
|
|
43
45
|
|
|
@@ -45,20 +47,27 @@ Inspired by the [LORAUTER paper](https://arxiv.org/abs/2406.08213) (EPFL, 2026).
|
|
|
45
47
|
|
|
46
48
|
```bash
|
|
47
49
|
# 1. Install (requires Python 3.10+, uv recommended)
|
|
48
|
-
uv
|
|
50
|
+
uv tool install shiftgate (or pip install shiftgate)
|
|
49
51
|
|
|
50
|
-
# 2. Initialise: sets up ~/.shiftgate
|
|
51
|
-
# and computes task centroids
|
|
52
|
+
# 2. Initialise: sets up ~/.shiftgate/ and computes task embeddings
|
|
52
53
|
shiftgate init
|
|
53
54
|
|
|
54
|
-
# 3. Register
|
|
55
|
-
|
|
55
|
+
# 3. Register an adapter — choose the mode that matches your setup:
|
|
56
|
+
# A) HuggingFace repo (metadata only, no download)
|
|
57
|
+
shiftgate adapter add teknium/sql-lora --tags sql --base llama3
|
|
58
|
+
# B) Local adapter weights already on disk
|
|
59
|
+
shiftgate adapter add sql-lora --local /models/sql-lora --tags sql --base llama3
|
|
60
|
+
# C) Adapter already loaded in your backend (vLLM --lora-modules, Ollama Modelfile)
|
|
61
|
+
shiftgate adapter add sql-lora --runtime sql-lora-vllm --tags sql --base llama3
|
|
56
62
|
|
|
57
|
-
# 4. Route a query (shows decision
|
|
58
|
-
shiftgate route "
|
|
63
|
+
# 4. Route a query (shows decision — no inference needed)
|
|
64
|
+
shiftgate route "write a SQL query to find duplicate rows"
|
|
59
65
|
|
|
60
|
-
# 5.
|
|
61
|
-
shiftgate
|
|
66
|
+
# 5. Show the full decision tree
|
|
67
|
+
shiftgate route "write a SQL query to find duplicate rows" --explain
|
|
68
|
+
|
|
69
|
+
# 6. Route + run (requires Ollama or vLLM running locally)
|
|
70
|
+
shiftgate run "write a SQL query to find duplicate rows"
|
|
62
71
|
```
|
|
63
72
|
|
|
64
73
|
---
|
|
@@ -115,59 +124,86 @@ User query
|
|
|
115
124
|
|
|
116
125
|
## Commands
|
|
117
126
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
|
121
|
-
| `shiftgate
|
|
122
|
-
| `shiftgate
|
|
123
|
-
| `shiftgate
|
|
124
|
-
| `shiftgate
|
|
125
|
-
| `shiftgate adapter
|
|
126
|
-
| `shiftgate
|
|
127
|
-
| `shiftgate
|
|
128
|
-
| `shiftgate
|
|
129
|
-
| `shiftgate
|
|
130
|
-
| `shiftgate
|
|
131
|
-
| `shiftgate
|
|
132
|
-
| `shiftgate
|
|
127
|
+
|
|
128
|
+
| Command | Description |
|
|
129
|
+
| -------------------------------------------------------- | --------------------------------------------------------------------- |
|
|
130
|
+
| `shiftgate init` | First-time setup: initialise `~/.shiftgate/`, compute task embeddings |
|
|
131
|
+
| `shiftgate route "<query>"` | Route a query and show the decision — no inference |
|
|
132
|
+
| `shiftgate route "<query>" --explain` | Full decision tree: task scores, candidates, selection reason |
|
|
133
|
+
| `shiftgate run "<query>"` | Route + run via Ollama or vLLM |
|
|
134
|
+
| `shiftgate adapter add <hf_repo> [--tags …] [--base …]` | Register adapter from HuggingFace (metadata only) |
|
|
135
|
+
| `shiftgate adapter add <id> --local <path> [--tags …]` | Register a local adapter path |
|
|
136
|
+
| `shiftgate adapter add <id> --runtime <name> [--tags …]` | Register a backend-loaded adapter by its runtime name |
|
|
137
|
+
| `shiftgate adapter list` | Table of all registered adapters |
|
|
138
|
+
| `shiftgate adapter remove <id>` | Remove an adapter |
|
|
139
|
+
| `shiftgate task list` | Table of all task clusters |
|
|
140
|
+
| `shiftgate task add` | Interactively add a new task cluster |
|
|
141
|
+
| `shiftgate feedback accept` | Mark last routing as good |
|
|
142
|
+
| `shiftgate feedback reject` | Mark last routing as bad |
|
|
143
|
+
| `shiftgate feedback stats` | Adapter acceptance rate table |
|
|
144
|
+
| `shiftgate status` | Backend connectivity + registry summary |
|
|
145
|
+
| `shiftgate demo` | Animated demo with fake routing traces |
|
|
146
|
+
|
|
133
147
|
|
|
134
148
|
---
|
|
135
149
|
|
|
136
|
-
##
|
|
150
|
+
## Bring Your Own Models
|
|
151
|
+
|
|
152
|
+
Shiftgate is a routing layer. It stores adapter metadata only.
|
|
153
|
+
**You are responsible for loading weights into your inference backend before running `shiftgate run`.**
|
|
154
|
+
|
|
155
|
+
### Using with Ollama (Mode B or C)
|
|
137
156
|
|
|
138
|
-
|
|
157
|
+
Create a Modelfile that bundles your base model and adapter:
|
|
139
158
|
|
|
140
159
|
```dockerfile
|
|
141
|
-
# my-lora.Modelfile
|
|
160
|
+
# my-sql-lora.Modelfile
|
|
142
161
|
FROM llama3
|
|
143
|
-
ADAPTER /path/to/
|
|
162
|
+
ADAPTER /path/to/sql-lora.safetensors
|
|
144
163
|
```
|
|
145
164
|
|
|
146
165
|
```bash
|
|
147
|
-
ollama create
|
|
166
|
+
ollama create sql-lora-ollama -f my-sql-lora.Modelfile
|
|
148
167
|
ollama serve
|
|
149
168
|
```
|
|
150
169
|
|
|
151
|
-
Register
|
|
170
|
+
Register in shiftgate using the Ollama model name as `--runtime`:
|
|
152
171
|
|
|
153
172
|
```bash
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
# shiftgate will pass model="my-lora" to Ollama → activates the Modelfile
|
|
173
|
+
# Mode C — backend already has the adapter loaded
|
|
174
|
+
shiftgate adapter add sql-lora --runtime sql-lora-ollama --tags sql --base llama3
|
|
157
175
|
```
|
|
158
176
|
|
|
159
|
-
|
|
177
|
+
shiftgate passes `runtime_name` (or falls back to `id`) as the Ollama model name.
|
|
160
178
|
|
|
161
|
-
|
|
179
|
+
### Using with vLLM (Mode B or C)
|
|
180
|
+
|
|
181
|
+
Load adapters at server start with `--lora-modules`:
|
|
162
182
|
|
|
163
183
|
```bash
|
|
164
184
|
python -m vllm.entrypoints.openai.api_server \
|
|
165
185
|
--model meta-llama/Meta-Llama-3-8B \
|
|
166
186
|
--enable-lora \
|
|
167
|
-
--lora-modules
|
|
187
|
+
--lora-modules sql-lora=/path/to/sql-lora
|
|
168
188
|
```
|
|
169
189
|
|
|
170
|
-
|
|
190
|
+
Register in shiftgate:
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
# Mode C — adapter name matches the --lora-modules key
|
|
194
|
+
shiftgate adapter add sql-lora --runtime sql-lora --tags sql --base meta-llama/Meta-Llama-3-8B
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
shiftgate sends `"model": "<runtime_name>"` in each `/v1/chat/completions` request.
|
|
198
|
+
|
|
199
|
+
### Registering a HuggingFace adapter (Mode A)
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
# Metadata only — no weights downloaded
|
|
203
|
+
shiftgate adapter add teknium/sql-lora --tags sql --base llama3
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
This is useful for cataloguing adapters before you have pulled their weights.
|
|
171
207
|
|
|
172
208
|
---
|
|
173
209
|
|
|
@@ -195,12 +231,14 @@ To add a task cluster that better matches your domain, edit `data/default_tasks.
|
|
|
195
231
|
|
|
196
232
|
## Roadmap
|
|
197
233
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
|
201
|
-
| v0.
|
|
202
|
-
| v0.
|
|
203
|
-
|
|
|
234
|
+
|
|
235
|
+
| Version | Focus |
|
|
236
|
+
| -------- | ------------------------------------------------------------- |
|
|
237
|
+
| **v0.1** | Single base model, multi-adapter routing ← *current* |
|
|
238
|
+
| v0.2 | Feedback loop + adapter scoring (auto-demote bad adapters) |
|
|
239
|
+
| v0.3 | Multi-model routing (route to different base models per task) |
|
|
240
|
+
| v1.0 | Community registry + web UI |
|
|
241
|
+
|
|
204
242
|
|
|
205
243
|
---
|
|
206
244
|
|
|
@@ -234,8 +272,8 @@ The recommended flow:
|
|
|
234
272
|
1. Bump the version in `pyproject.toml` (`version = "x.y.z"`).
|
|
235
273
|
2. Open a PR, get it reviewed and merged.
|
|
236
274
|
3. Tag the commit: `git tag vx.y.z && git push origin vx.y.z`.
|
|
237
|
-
4. The CI workflow builds the wheel with `uv build` and publishes to PyPI
|
|
238
|
-
|
|
275
|
+
4. The CI workflow builds the wheel with `uv build` and publishes to PyPI
|
|
276
|
+
using [Trusted Publishing (OIDC)](https://docs.pypi.org/trusted-publishers/)
|
|
239
277
|
— no stored API token needed.
|
|
240
278
|
|
|
241
279
|
For a one-off manual publish (maintainers only):
|
|
@@ -270,4 +308,4 @@ shiftgate/
|
|
|
270
308
|
|
|
271
309
|
## License
|
|
272
310
|
|
|
273
|
-
MIT. See [LICENSE](LICENSE).
|
|
311
|
+
MIT. See [LICENSE](LICENSE).
|
|
@@ -2,9 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
> **shiftgate is an intelligent routing layer that automatically selects the right LoRA adapter for each task in your local agent loop.**
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
**Shiftgate is a routing layer. Users manage models and LoRA weights themselves.**
|
|
6
|
+
shiftgate stores only adapter *metadata* — it never downloads, caches, or manages weights.
|
|
7
|
+
Your inference backend (Ollama, vLLM) is responsible for loading the weights; shiftgate just tells it *which* adapter to use for each query.
|
|
6
8
|
|
|
7
|
-
|
|
9
|
+
Instead of hardcoding which adapter to use, shiftgate embeds your query and matches it against a catalog of task clusters using cosine similarity — then routes inference to the best-fit LoRA adapter on your running Ollama or vLLM instance.
|
|
8
10
|
|
|
9
11
|
---
|
|
10
12
|
|
|
@@ -12,20 +14,27 @@ Inspired by the [LORAUTER paper](https://arxiv.org/abs/2406.08213) (EPFL, 2026).
|
|
|
12
14
|
|
|
13
15
|
```bash
|
|
14
16
|
# 1. Install (requires Python 3.10+, uv recommended)
|
|
15
|
-
uv
|
|
17
|
+
uv tool install shiftgate (or pip install shiftgate)
|
|
16
18
|
|
|
17
|
-
# 2. Initialise: sets up ~/.shiftgate
|
|
18
|
-
# and computes task centroids
|
|
19
|
+
# 2. Initialise: sets up ~/.shiftgate/ and computes task embeddings
|
|
19
20
|
shiftgate init
|
|
20
21
|
|
|
21
|
-
# 3. Register
|
|
22
|
-
|
|
22
|
+
# 3. Register an adapter — choose the mode that matches your setup:
|
|
23
|
+
# A) HuggingFace repo (metadata only, no download)
|
|
24
|
+
shiftgate adapter add teknium/sql-lora --tags sql --base llama3
|
|
25
|
+
# B) Local adapter weights already on disk
|
|
26
|
+
shiftgate adapter add sql-lora --local /models/sql-lora --tags sql --base llama3
|
|
27
|
+
# C) Adapter already loaded in your backend (vLLM --lora-modules, Ollama Modelfile)
|
|
28
|
+
shiftgate adapter add sql-lora --runtime sql-lora-vllm --tags sql --base llama3
|
|
23
29
|
|
|
24
|
-
# 4. Route a query (shows decision
|
|
25
|
-
shiftgate route "
|
|
30
|
+
# 4. Route a query (shows decision — no inference needed)
|
|
31
|
+
shiftgate route "write a SQL query to find duplicate rows"
|
|
26
32
|
|
|
27
|
-
# 5.
|
|
28
|
-
shiftgate
|
|
33
|
+
# 5. Show the full decision tree
|
|
34
|
+
shiftgate route "write a SQL query to find duplicate rows" --explain
|
|
35
|
+
|
|
36
|
+
# 6. Route + run (requires Ollama or vLLM running locally)
|
|
37
|
+
shiftgate run "write a SQL query to find duplicate rows"
|
|
29
38
|
```
|
|
30
39
|
|
|
31
40
|
---
|
|
@@ -82,59 +91,86 @@ User query
|
|
|
82
91
|
|
|
83
92
|
## Commands
|
|
84
93
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
|
88
|
-
| `shiftgate
|
|
89
|
-
| `shiftgate
|
|
90
|
-
| `shiftgate
|
|
91
|
-
| `shiftgate
|
|
92
|
-
| `shiftgate adapter
|
|
93
|
-
| `shiftgate
|
|
94
|
-
| `shiftgate
|
|
95
|
-
| `shiftgate
|
|
96
|
-
| `shiftgate
|
|
97
|
-
| `shiftgate
|
|
98
|
-
| `shiftgate
|
|
99
|
-
| `shiftgate
|
|
94
|
+
|
|
95
|
+
| Command | Description |
|
|
96
|
+
| -------------------------------------------------------- | --------------------------------------------------------------------- |
|
|
97
|
+
| `shiftgate init` | First-time setup: initialise `~/.shiftgate/`, compute task embeddings |
|
|
98
|
+
| `shiftgate route "<query>"` | Route a query and show the decision — no inference |
|
|
99
|
+
| `shiftgate route "<query>" --explain` | Full decision tree: task scores, candidates, selection reason |
|
|
100
|
+
| `shiftgate run "<query>"` | Route + run via Ollama or vLLM |
|
|
101
|
+
| `shiftgate adapter add <hf_repo> [--tags …] [--base …]` | Register adapter from HuggingFace (metadata only) |
|
|
102
|
+
| `shiftgate adapter add <id> --local <path> [--tags …]` | Register a local adapter path |
|
|
103
|
+
| `shiftgate adapter add <id> --runtime <name> [--tags …]` | Register a backend-loaded adapter by its runtime name |
|
|
104
|
+
| `shiftgate adapter list` | Table of all registered adapters |
|
|
105
|
+
| `shiftgate adapter remove <id>` | Remove an adapter |
|
|
106
|
+
| `shiftgate task list` | Table of all task clusters |
|
|
107
|
+
| `shiftgate task add` | Interactively add a new task cluster |
|
|
108
|
+
| `shiftgate feedback accept` | Mark last routing as good |
|
|
109
|
+
| `shiftgate feedback reject` | Mark last routing as bad |
|
|
110
|
+
| `shiftgate feedback stats` | Adapter acceptance rate table |
|
|
111
|
+
| `shiftgate status` | Backend connectivity + registry summary |
|
|
112
|
+
| `shiftgate demo` | Animated demo with fake routing traces |
|
|
113
|
+
|
|
100
114
|
|
|
101
115
|
---
|
|
102
116
|
|
|
103
|
-
##
|
|
117
|
+
## Bring Your Own Models
|
|
118
|
+
|
|
119
|
+
Shiftgate is a routing layer. It stores adapter metadata only.
|
|
120
|
+
**You are responsible for loading weights into your inference backend before running `shiftgate run`.**
|
|
121
|
+
|
|
122
|
+
### Using with Ollama (Mode B or C)
|
|
104
123
|
|
|
105
|
-
|
|
124
|
+
Create a Modelfile that bundles your base model and adapter:
|
|
106
125
|
|
|
107
126
|
```dockerfile
|
|
108
|
-
# my-lora.Modelfile
|
|
127
|
+
# my-sql-lora.Modelfile
|
|
109
128
|
FROM llama3
|
|
110
|
-
ADAPTER /path/to/
|
|
129
|
+
ADAPTER /path/to/sql-lora.safetensors
|
|
111
130
|
```
|
|
112
131
|
|
|
113
132
|
```bash
|
|
114
|
-
ollama create
|
|
133
|
+
ollama create sql-lora-ollama -f my-sql-lora.Modelfile
|
|
115
134
|
ollama serve
|
|
116
135
|
```
|
|
117
136
|
|
|
118
|
-
Register
|
|
137
|
+
Register in shiftgate using the Ollama model name as `--runtime`:
|
|
119
138
|
|
|
120
139
|
```bash
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
# shiftgate will pass model="my-lora" to Ollama → activates the Modelfile
|
|
140
|
+
# Mode C — backend already has the adapter loaded
|
|
141
|
+
shiftgate adapter add sql-lora --runtime sql-lora-ollama --tags sql --base llama3
|
|
124
142
|
```
|
|
125
143
|
|
|
126
|
-
|
|
144
|
+
shiftgate passes `runtime_name` (or falls back to `id`) as the Ollama model name.
|
|
127
145
|
|
|
128
|
-
|
|
146
|
+
### Using with vLLM (Mode B or C)
|
|
147
|
+
|
|
148
|
+
Load adapters at server start with `--lora-modules`:
|
|
129
149
|
|
|
130
150
|
```bash
|
|
131
151
|
python -m vllm.entrypoints.openai.api_server \
|
|
132
152
|
--model meta-llama/Meta-Llama-3-8B \
|
|
133
153
|
--enable-lora \
|
|
134
|
-
--lora-modules
|
|
154
|
+
--lora-modules sql-lora=/path/to/sql-lora
|
|
135
155
|
```
|
|
136
156
|
|
|
137
|
-
|
|
157
|
+
Register in shiftgate:
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
# Mode C — adapter name matches the --lora-modules key
|
|
161
|
+
shiftgate adapter add sql-lora --runtime sql-lora --tags sql --base meta-llama/Meta-Llama-3-8B
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
shiftgate sends `"model": "<runtime_name>"` in each `/v1/chat/completions` request.
|
|
165
|
+
|
|
166
|
+
### Registering a HuggingFace adapter (Mode A)
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
# Metadata only — no weights downloaded
|
|
170
|
+
shiftgate adapter add teknium/sql-lora --tags sql --base llama3
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
This is useful for cataloguing adapters before you have pulled their weights.
|
|
138
174
|
|
|
139
175
|
---
|
|
140
176
|
|
|
@@ -162,12 +198,14 @@ To add a task cluster that better matches your domain, edit `data/default_tasks.
|
|
|
162
198
|
|
|
163
199
|
## Roadmap
|
|
164
200
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
|
168
|
-
| v0.
|
|
169
|
-
| v0.
|
|
170
|
-
|
|
|
201
|
+
|
|
202
|
+
| Version | Focus |
|
|
203
|
+
| -------- | ------------------------------------------------------------- |
|
|
204
|
+
| **v0.1** | Single base model, multi-adapter routing ← *current* |
|
|
205
|
+
| v0.2 | Feedback loop + adapter scoring (auto-demote bad adapters) |
|
|
206
|
+
| v0.3 | Multi-model routing (route to different base models per task) |
|
|
207
|
+
| v1.0 | Community registry + web UI |
|
|
208
|
+
|
|
171
209
|
|
|
172
210
|
---
|
|
173
211
|
|
|
@@ -201,8 +239,8 @@ The recommended flow:
|
|
|
201
239
|
1. Bump the version in `pyproject.toml` (`version = "x.y.z"`).
|
|
202
240
|
2. Open a PR, get it reviewed and merged.
|
|
203
241
|
3. Tag the commit: `git tag vx.y.z && git push origin vx.y.z`.
|
|
204
|
-
4. The CI workflow builds the wheel with `uv build` and publishes to PyPI
|
|
205
|
-
|
|
242
|
+
4. The CI workflow builds the wheel with `uv build` and publishes to PyPI
|
|
243
|
+
using [Trusted Publishing (OIDC)](https://docs.pypi.org/trusted-publishers/)
|
|
206
244
|
— no stored API token needed.
|
|
207
245
|
|
|
208
246
|
For a one-off manual publish (maintainers only):
|
|
@@ -237,4 +275,4 @@ shiftgate/
|
|
|
237
275
|
|
|
238
276
|
## License
|
|
239
277
|
|
|
240
|
-
MIT. See [LICENSE](LICENSE).
|
|
278
|
+
MIT. See [LICENSE](LICENSE).
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "shiftgate"
|
|
7
|
-
version = "0.1.
|
|
7
|
+
version = "0.1.2"
|
|
8
8
|
description = "Intelligent routing layer that automatically selects the right LoRA adapter for each task in your local agent loop."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|