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.
Files changed (31) hide show
  1. {shiftgate-0.1.0 → shiftgate-0.1.2}/PKG-INFO +87 -49
  2. {shiftgate-0.1.0 → shiftgate-0.1.2}/README.md +86 -48
  3. {shiftgate-0.1.0 → shiftgate-0.1.2}/pyproject.toml +1 -1
  4. {shiftgate-0.1.0 → shiftgate-0.1.2}/shiftgate/cli.py +207 -51
  5. shiftgate-0.1.2/shiftgate/registry/adapter_registry.py +253 -0
  6. shiftgate-0.1.2/shiftgate/registry/schemas.py +187 -0
  7. shiftgate-0.1.2/shiftgate/router/matcher.py +209 -0
  8. {shiftgate-0.1.0 → shiftgate-0.1.2}/shiftgate/router/router.py +23 -23
  9. {shiftgate-0.1.0 → shiftgate-0.1.2}/shiftgate/utils/display.py +139 -23
  10. shiftgate-0.1.2/tests/test_registry.py +448 -0
  11. {shiftgate-0.1.0 → shiftgate-0.1.2}/tests/test_router.py +99 -44
  12. shiftgate-0.1.0/data/default_adapters.json +0 -1
  13. shiftgate-0.1.0/shiftgate/registry/adapter_registry.py +0 -162
  14. shiftgate-0.1.0/shiftgate/registry/schemas.py +0 -115
  15. shiftgate-0.1.0/shiftgate/router/matcher.py +0 -115
  16. shiftgate-0.1.0/tests/test_registry.py +0 -218
  17. {shiftgate-0.1.0 → shiftgate-0.1.2}/.github/workflows/release.yml +0 -0
  18. {shiftgate-0.1.0 → shiftgate-0.1.2}/.gitignore +0 -0
  19. {shiftgate-0.1.0 → shiftgate-0.1.2}/data/default_tasks.json +0 -0
  20. {shiftgate-0.1.0 → shiftgate-0.1.2}/shiftgate/__init__.py +0 -0
  21. {shiftgate-0.1.0 → shiftgate-0.1.2}/shiftgate/feedback/__init__.py +0 -0
  22. {shiftgate-0.1.0 → shiftgate-0.1.2}/shiftgate/feedback/loop.py +0 -0
  23. {shiftgate-0.1.0 → shiftgate-0.1.2}/shiftgate/registry/__init__.py +0 -0
  24. {shiftgate-0.1.0 → shiftgate-0.1.2}/shiftgate/registry/task_registry.py +0 -0
  25. {shiftgate-0.1.0 → shiftgate-0.1.2}/shiftgate/router/__init__.py +0 -0
  26. {shiftgate-0.1.0 → shiftgate-0.1.2}/shiftgate/router/embedder.py +0 -0
  27. {shiftgate-0.1.0 → shiftgate-0.1.2}/shiftgate/runtime/__init__.py +0 -0
  28. {shiftgate-0.1.0 → shiftgate-0.1.2}/shiftgate/runtime/backend.py +0 -0
  29. {shiftgate-0.1.0 → shiftgate-0.1.2}/shiftgate/utils/__init__.py +0 -0
  30. {shiftgate-0.1.0 → shiftgate-0.1.2}/tests/__init__.py +0 -0
  31. {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.0
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
- 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. Think of it as "npm for LoRA adapters + an automatic brain that picks the right one per task."
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
- Inspired by the [LORAUTER paper](https://arxiv.org/abs/2406.08213) (EPFL, 2026).
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 add shiftgate
50
+ uv tool install shiftgate (or pip install shiftgate)
49
51
 
50
- # 2. Initialise: sets up ~/.shiftgate/, downloads the embedding model,
51
- # and computes task centroids
52
+ # 2. Initialise: sets up ~/.shiftgate/ and computes task embeddings
52
53
  shiftgate init
53
54
 
54
- # 3. Register a LoRA adapter from HuggingFace
55
- shiftgate adapter add monology/pmc-llama-13b-lora --base meta-llama/Meta-Llama-3-8B --tags medical qa
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, no inference needed)
58
- shiftgate route "explain the mechanism of action of ibuprofen"
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. Route + run (requires Ollama or vLLM running locally)
61
- shiftgate run "explain the mechanism of action of ibuprofen"
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
- | Command | Description |
119
- |---|---|
120
- | `shiftgate init` | First-time setup: copy defaults to `~/.shiftgate/`, compute embeddings |
121
- | `shiftgate route "<query>"` | Route a query and show the decision — no inference |
122
- | `shiftgate run "<query>"` | Route + run via Ollama or vLLM |
123
- | `shiftgate adapter add <hf_repo>` | Register a new LoRA adapter |
124
- | `shiftgate adapter list` | Table of all registered adapters |
125
- | `shiftgate adapter remove <id>` | Remove an adapter |
126
- | `shiftgate task list` | Table of all task clusters |
127
- | `shiftgate task add` | Interactively add a new task cluster |
128
- | `shiftgate feedback accept` | Mark last routing as good |
129
- | `shiftgate feedback reject` | Mark last routing as bad |
130
- | `shiftgate feedback stats` | Adapter acceptance rate table |
131
- | `shiftgate status` | Backend connectivity + registry summary |
132
- | `shiftgate demo` | Animated demo with fake routing traces |
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
- ## Using with Ollama
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
- Ollama supports LoRA adapters via custom Modelfiles. Create one per adapter:
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/my-adapter.safetensors
162
+ ADAPTER /path/to/sql-lora.safetensors
144
163
  ```
145
164
 
146
165
  ```bash
147
- ollama create my-lora-model -f my-lora.Modelfile
166
+ ollama create sql-lora-ollama -f my-sql-lora.Modelfile
148
167
  ollama serve
149
168
  ```
150
169
 
151
- Register the adapter in shiftgate using the same ID:
170
+ Register in shiftgate using the Ollama model name as `--runtime`:
152
171
 
153
172
  ```bash
154
- shiftgate adapter add my-org/my-lora --base meta-llama/Meta-Llama-3-8B
155
- # The adapter id defaults to the repo slug: "my-lora"
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
- ## Using with vLLM
177
+ shiftgate passes `runtime_name` (or falls back to `id`) as the Ollama model name.
160
178
 
161
- vLLM loads LoRA adapters at startup via `--lora-modules`:
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 my-lora=/path/to/adapter
187
+ --lora-modules sql-lora=/path/to/sql-lora
168
188
  ```
169
189
 
170
- shiftgate sends `"model": "<adapter_id>"` in each `/v1/chat/completions` request, which vLLM maps to the named LoRA module.
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
- | Version | Focus |
199
- |---|---|
200
- | **v0.1** | Single base model, multi-adapter routing ← _current_ |
201
- | v0.2 | Feedback loop + adapter scoring (auto-demote bad adapters) |
202
- | v0.3 | Multi-model routing (route to different base models per task) |
203
- | v1.0 | Community registry + web UI |
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
- using [Trusted Publishing (OIDC)](https://docs.pypi.org/trusted-publishers/)
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
- 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. Think of it as "npm for LoRA adapters + an automatic brain that picks the right one per task."
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
- Inspired by the [LORAUTER paper](https://arxiv.org/abs/2406.08213) (EPFL, 2026).
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 add shiftgate
17
+ uv tool install shiftgate (or pip install shiftgate)
16
18
 
17
- # 2. Initialise: sets up ~/.shiftgate/, downloads the embedding model,
18
- # and computes task centroids
19
+ # 2. Initialise: sets up ~/.shiftgate/ and computes task embeddings
19
20
  shiftgate init
20
21
 
21
- # 3. Register a LoRA adapter from HuggingFace
22
- shiftgate adapter add monology/pmc-llama-13b-lora --base meta-llama/Meta-Llama-3-8B --tags medical qa
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, no inference needed)
25
- shiftgate route "explain the mechanism of action of ibuprofen"
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. Route + run (requires Ollama or vLLM running locally)
28
- shiftgate run "explain the mechanism of action of ibuprofen"
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
- | Command | Description |
86
- |---|---|
87
- | `shiftgate init` | First-time setup: copy defaults to `~/.shiftgate/`, compute embeddings |
88
- | `shiftgate route "<query>"` | Route a query and show the decision — no inference |
89
- | `shiftgate run "<query>"` | Route + run via Ollama or vLLM |
90
- | `shiftgate adapter add <hf_repo>` | Register a new LoRA adapter |
91
- | `shiftgate adapter list` | Table of all registered adapters |
92
- | `shiftgate adapter remove <id>` | Remove an adapter |
93
- | `shiftgate task list` | Table of all task clusters |
94
- | `shiftgate task add` | Interactively add a new task cluster |
95
- | `shiftgate feedback accept` | Mark last routing as good |
96
- | `shiftgate feedback reject` | Mark last routing as bad |
97
- | `shiftgate feedback stats` | Adapter acceptance rate table |
98
- | `shiftgate status` | Backend connectivity + registry summary |
99
- | `shiftgate demo` | Animated demo with fake routing traces |
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
- ## Using with Ollama
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
- Ollama supports LoRA adapters via custom Modelfiles. Create one per adapter:
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/my-adapter.safetensors
129
+ ADAPTER /path/to/sql-lora.safetensors
111
130
  ```
112
131
 
113
132
  ```bash
114
- ollama create my-lora-model -f my-lora.Modelfile
133
+ ollama create sql-lora-ollama -f my-sql-lora.Modelfile
115
134
  ollama serve
116
135
  ```
117
136
 
118
- Register the adapter in shiftgate using the same ID:
137
+ Register in shiftgate using the Ollama model name as `--runtime`:
119
138
 
120
139
  ```bash
121
- shiftgate adapter add my-org/my-lora --base meta-llama/Meta-Llama-3-8B
122
- # The adapter id defaults to the repo slug: "my-lora"
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
- ## Using with vLLM
144
+ shiftgate passes `runtime_name` (or falls back to `id`) as the Ollama model name.
127
145
 
128
- vLLM loads LoRA adapters at startup via `--lora-modules`:
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 my-lora=/path/to/adapter
154
+ --lora-modules sql-lora=/path/to/sql-lora
135
155
  ```
136
156
 
137
- shiftgate sends `"model": "<adapter_id>"` in each `/v1/chat/completions` request, which vLLM maps to the named LoRA module.
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
- | Version | Focus |
166
- |---|---|
167
- | **v0.1** | Single base model, multi-adapter routing ← _current_ |
168
- | v0.2 | Feedback loop + adapter scoring (auto-demote bad adapters) |
169
- | v0.3 | Multi-model routing (route to different base models per task) |
170
- | v1.0 | Community registry + web UI |
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
- using [Trusted Publishing (OIDC)](https://docs.pypi.org/trusted-publishers/)
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.0"
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"