akernel-runtime 0.1.2__tar.gz → 0.1.4__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.
- akernel_runtime-0.1.4/.env.example +4 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/.github/release-notes/v0.1.0.md +1 -1
- akernel_runtime-0.1.4/.github/release-notes/v0.1.3.md +30 -0
- akernel_runtime-0.1.4/.github/release-notes/v0.1.4.md +30 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/CHANGELOG.md +14 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/PKG-INFO +14 -12
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/README.md +9 -7
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/docs/01-architecture.md +5 -5
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/docs/05-local-wake.md +1 -1
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/docs/07-release-and-ci.md +2 -2
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/docs/11-publishing-setup.md +3 -3
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/packages/npm/akernel/README.md +1 -1
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/packages/npm/akernel/package.json +4 -4
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/pyproject.toml +5 -5
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/scripts/install_remote.ps1 +2 -2
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/setup.ps1 +8 -8
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/src/akernel_runtime.egg-info/PKG-INFO +14 -12
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/src/akernel_runtime.egg-info/SOURCES.txt +2 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/src/context_kernel/__init__.py +1 -1
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/src/context_kernel/cli.py +40 -29
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/src/context_kernel/global_memory.py +1 -1
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/src/context_kernel/loop.py +9 -4
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/src/context_kernel/providers.py +21 -7
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/tests/test_runtime.py +13 -13
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/wake.ps1 +3 -3
- akernel_runtime-0.1.2/.env.example +0 -4
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/.github/pull_request_template.md +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/.github/release-notes/v0.1.1.md +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/.github/release-notes/v0.1.2.md +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/.github/workflows/ci.yml +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/.github/workflows/release.yml +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/CODE_OF_CONDUCT.md +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/CONTRIBUTING.md +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/LICENSE +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/MANIFEST.in +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/NOTICE +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/SECURITY.md +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/docs/00-vision.md +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/docs/02-execution-plan.md +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/docs/03-cli-mvp.md +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/docs/04-evaluation.md +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/docs/06-skill-compiler.md +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/docs/08-open-source-plan.md +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/docs/09-product-roadmap.md +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/docs/10-benchmark-evidence.md +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/examples/benchmarks/phase2/01-routing.json +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/examples/benchmarks/phase2/02-memory.json +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/examples/benchmarks/phase2/03-budget-profiles.json +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/examples/benchmarks/scale/01-context-pressure.json +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/examples/benchmarks/scale/02-agent-editing.json +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/examples/benchmarks/scale/03-global-memory-marketplace.json +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/examples/evals/phase2.json +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/examples/marketplace/skills/index.json +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/examples/skills/context_budget.json +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/examples/skills/edit_file.json +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/examples/skills/markdown/context_budget.md +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/packages/npm/akernel/bin/akernel.js +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/scripts/release_check.ps1 +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/setup.cfg +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/setup.cmd +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/src/akernel_runtime.egg-info/dependency_links.txt +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/src/akernel_runtime.egg-info/entry_points.txt +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/src/akernel_runtime.egg-info/requires.txt +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/src/akernel_runtime.egg-info/top_level.txt +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/src/context_kernel/__main__.py +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/src/context_kernel/agent_reports.py +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/src/context_kernel/benchmarks.py +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/src/context_kernel/budget.py +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/src/context_kernel/context.py +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/src/context_kernel/evals.py +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/src/context_kernel/marketplace.py +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/src/context_kernel/marketplace_data/skills/context_budget.json +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/src/context_kernel/marketplace_data/skills/context_compaction.json +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/src/context_kernel/marketplace_data/skills/edit_file.json +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/src/context_kernel/marketplace_data/skills/index.json +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/src/context_kernel/marketplace_data/skills/long_task_planning.json +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/src/context_kernel/marketplace_data/skills/multi_file_bugfix.json +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/src/context_kernel/memory.py +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/src/context_kernel/models.py +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/src/context_kernel/planner.py +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/src/context_kernel/policy.py +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/src/context_kernel/project.py +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/src/context_kernel/report_costs.py +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/src/context_kernel/runner.py +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/src/context_kernel/skills.py +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/src/context_kernel/state_writer.py +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/src/context_kernel/storage.py +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/src/context_kernel/tasks.py +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/src/context_kernel/text.py +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/src/context_kernel/tokenizer.py +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/src/context_kernel/tools.py +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/src/context_kernel/verifier.py +0 -0
- {akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/wake.cmd +0 -0
|
@@ -17,7 +17,7 @@ akernel
|
|
|
17
17
|
Windows users can also install directly from GitHub:
|
|
18
18
|
|
|
19
19
|
```powershell
|
|
20
|
-
irm https://raw.githubusercontent.com/huanxin0825-ctrl/context-
|
|
20
|
+
irm https://raw.githubusercontent.com/huanxin0825-ctrl/context-akernel/main/scripts/install_remote.ps1 | iex
|
|
21
21
|
akernel setup
|
|
22
22
|
akernel
|
|
23
23
|
```
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Context Kernel v0.1.3
|
|
2
|
+
|
|
3
|
+
This release aligns public repository metadata with the npm scope and completes the move toward the `akernel` naming surface.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
Python:
|
|
8
|
+
|
|
9
|
+
```powershell
|
|
10
|
+
python -m pip install --user --upgrade akernel-runtime
|
|
11
|
+
akernel setup
|
|
12
|
+
akernel
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
npm launcher:
|
|
16
|
+
|
|
17
|
+
```powershell
|
|
18
|
+
npm install -g @context-akernel/akernel
|
|
19
|
+
akernel setup
|
|
20
|
+
akernel
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Changes
|
|
24
|
+
|
|
25
|
+
- Updated repository metadata and install links from `context-kernel` to `context-akernel`.
|
|
26
|
+
- Keeps `akernel-runtime` as the Python package and `@context-akernel/akernel` as the npm launcher package.
|
|
27
|
+
|
|
28
|
+
## Notes
|
|
29
|
+
|
|
30
|
+
If you use Trusted Publishing, ensure PyPI and npm publisher settings now point to the GitHub repository `huanxin0825-ctrl/context-akernel`.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Context Kernel v0.1.4
|
|
2
|
+
|
|
3
|
+
This release verifies the refreshed GitHub repository identity after the public move to `context-akernel`.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
Python:
|
|
8
|
+
|
|
9
|
+
```powershell
|
|
10
|
+
python -m pip install --user --upgrade akernel-runtime
|
|
11
|
+
akernel setup
|
|
12
|
+
akernel
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
npm launcher:
|
|
16
|
+
|
|
17
|
+
```powershell
|
|
18
|
+
npm install -g @context-akernel/akernel
|
|
19
|
+
akernel setup
|
|
20
|
+
akernel
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Changes
|
|
24
|
+
|
|
25
|
+
- Publishes a clean patch release after updating Trusted Publisher bindings to `huanxin0825-ctrl/context-akernel`.
|
|
26
|
+
- Keeps the package names stable: `akernel-runtime` on PyPI and `@context-akernel/akernel` on npm.
|
|
27
|
+
|
|
28
|
+
## Notes
|
|
29
|
+
|
|
30
|
+
Use this version to confirm both package registries now trust the renamed GitHub repository.
|
|
@@ -8,11 +8,25 @@ The project follows a pragmatic pre-1.0 changelog: breaking changes may occur, b
|
|
|
8
8
|
|
|
9
9
|
No changes yet.
|
|
10
10
|
|
|
11
|
+
## 0.1.4 - 2026-05-12
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
|
|
15
|
+
- Reissued the repository rename release after refreshing package publisher bindings for `context-akernel`.
|
|
16
|
+
|
|
17
|
+
## 0.1.3 - 2026-05-12
|
|
18
|
+
|
|
19
|
+
### Changed
|
|
20
|
+
|
|
21
|
+
- Renamed repository metadata and install links from `context-kernel` to `context-akernel` to align with the npm scope.
|
|
22
|
+
|
|
11
23
|
## 0.1.2 - 2026-05-12
|
|
12
24
|
|
|
13
25
|
### Changed
|
|
14
26
|
|
|
15
27
|
- Renamed the prepared npm launcher scope from `@context-kernel/akernel` to `@context-akernel/akernel`.
|
|
28
|
+
- Renamed project-local provider environment variables from `CONTEXT_KERNEL_OPENAI_*` to `AKERNEL_OPENAI_*` while keeping legacy names as a compatibility fallback.
|
|
29
|
+
- Moved the default user launcher directory from `%USERPROFILE%\.context-kernel\bin` to `%USERPROFILE%\.akernel\bin`.
|
|
16
30
|
|
|
17
31
|
## 0.1.1 - 2026-05-12
|
|
18
32
|
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: akernel-runtime
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.4
|
|
4
4
|
Summary: Agent Kernel: a CLI-first context-native agent runtime prototype.
|
|
5
5
|
Author: Context Kernel contributors
|
|
6
6
|
License-Expression: Apache-2.0
|
|
7
|
-
Project-URL: Homepage, https://github.com/huanxin0825-ctrl/context-
|
|
8
|
-
Project-URL: Repository, https://github.com/huanxin0825-ctrl/context-
|
|
9
|
-
Project-URL: Issues, https://github.com/huanxin0825-ctrl/context-
|
|
10
|
-
Project-URL: Changelog, https://github.com/huanxin0825-ctrl/context-
|
|
7
|
+
Project-URL: Homepage, https://github.com/huanxin0825-ctrl/context-akernel
|
|
8
|
+
Project-URL: Repository, https://github.com/huanxin0825-ctrl/context-akernel
|
|
9
|
+
Project-URL: Issues, https://github.com/huanxin0825-ctrl/context-akernel/issues
|
|
10
|
+
Project-URL: Changelog, https://github.com/huanxin0825-ctrl/context-akernel/blob/main/CHANGELOG.md
|
|
11
11
|
Keywords: agent,cli,context,llm,token-budget
|
|
12
12
|
Classifier: Development Status :: 3 - Alpha
|
|
13
13
|
Classifier: Intended Audience :: Developers
|
|
@@ -101,7 +101,7 @@ akernel
|
|
|
101
101
|
|
|
102
102
|
`setup.cmd` creates `.venv`, installs the local CLI in editable mode, and prepares project-local `.env` if needed. `wake.cmd` activates the environment, loads `.env`, and prints common commands. The `.cmd` wrappers avoid local PowerShell execution-policy friction.
|
|
103
103
|
|
|
104
|
-
`setup.cmd` also installs user-level launchers in `%USERPROFILE%\.
|
|
104
|
+
`setup.cmd` also installs user-level launchers in `%USERPROFILE%\.akernel\bin` and adds that directory to the user PATH. After opening a new terminal, `akernel` works from any directory, starts the interactive agent session by default, and uses that current directory as the workspace location. Environment lookup prefers the current project `.env`, then falls back to the installed Context Kernel project `.env`. `akernel-chat` remains as a compatibility shortcut.
|
|
105
105
|
|
|
106
106
|
### Manual Python Install
|
|
107
107
|
|
|
@@ -127,7 +127,7 @@ akernel
|
|
|
127
127
|
Windows users can also install directly from GitHub:
|
|
128
128
|
|
|
129
129
|
```powershell
|
|
130
|
-
irm https://raw.githubusercontent.com/huanxin0825-ctrl/context-
|
|
130
|
+
irm https://raw.githubusercontent.com/huanxin0825-ctrl/context-akernel/main/scripts/install_remote.ps1 | iex
|
|
131
131
|
akernel setup
|
|
132
132
|
akernel
|
|
133
133
|
```
|
|
@@ -142,7 +142,7 @@ akernel setup
|
|
|
142
142
|
akernel
|
|
143
143
|
```
|
|
144
144
|
|
|
145
|
-
Set `AKERNEL_PIP_SOURCE=git+https://github.com/huanxin0825-ctrl/context-
|
|
145
|
+
Set `AKERNEL_PIP_SOURCE=git+https://github.com/huanxin0825-ctrl/context-akernel.git` to make the npm launcher bootstrap from GitHub instead of PyPI.
|
|
146
146
|
|
|
147
147
|
## Quick Start
|
|
148
148
|
|
|
@@ -183,12 +183,14 @@ The current deterministic scale snapshot is documented in [Benchmark Evidence](d
|
|
|
183
183
|
Provider configuration is project-local. Copy `.env.example` to `.env` or use `setup.cmd -ForceEnv`.
|
|
184
184
|
|
|
185
185
|
```env
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
186
|
+
AKERNEL_OPENAI_API_KEY=replace-with-your-key
|
|
187
|
+
AKERNEL_OPENAI_BASE_URL=https://clarmy.cloud/v1
|
|
188
|
+
AKERNEL_OPENAI_MODEL=gpt-5.5
|
|
189
|
+
AKERNEL_OPENAI_AUX_MODEL=gpt-5.3-codex
|
|
190
190
|
```
|
|
191
191
|
|
|
192
|
+
Legacy `CONTEXT_KERNEL_OPENAI_*` names are still read as a compatibility fallback, but new projects should use `AKERNEL_OPENAI_*`.
|
|
193
|
+
|
|
192
194
|
Useful checks:
|
|
193
195
|
|
|
194
196
|
```powershell
|
|
@@ -74,7 +74,7 @@ akernel
|
|
|
74
74
|
|
|
75
75
|
`setup.cmd` creates `.venv`, installs the local CLI in editable mode, and prepares project-local `.env` if needed. `wake.cmd` activates the environment, loads `.env`, and prints common commands. The `.cmd` wrappers avoid local PowerShell execution-policy friction.
|
|
76
76
|
|
|
77
|
-
`setup.cmd` also installs user-level launchers in `%USERPROFILE%\.
|
|
77
|
+
`setup.cmd` also installs user-level launchers in `%USERPROFILE%\.akernel\bin` and adds that directory to the user PATH. After opening a new terminal, `akernel` works from any directory, starts the interactive agent session by default, and uses that current directory as the workspace location. Environment lookup prefers the current project `.env`, then falls back to the installed Context Kernel project `.env`. `akernel-chat` remains as a compatibility shortcut.
|
|
78
78
|
|
|
79
79
|
### Manual Python Install
|
|
80
80
|
|
|
@@ -100,7 +100,7 @@ akernel
|
|
|
100
100
|
Windows users can also install directly from GitHub:
|
|
101
101
|
|
|
102
102
|
```powershell
|
|
103
|
-
irm https://raw.githubusercontent.com/huanxin0825-ctrl/context-
|
|
103
|
+
irm https://raw.githubusercontent.com/huanxin0825-ctrl/context-akernel/main/scripts/install_remote.ps1 | iex
|
|
104
104
|
akernel setup
|
|
105
105
|
akernel
|
|
106
106
|
```
|
|
@@ -115,7 +115,7 @@ akernel setup
|
|
|
115
115
|
akernel
|
|
116
116
|
```
|
|
117
117
|
|
|
118
|
-
Set `AKERNEL_PIP_SOURCE=git+https://github.com/huanxin0825-ctrl/context-
|
|
118
|
+
Set `AKERNEL_PIP_SOURCE=git+https://github.com/huanxin0825-ctrl/context-akernel.git` to make the npm launcher bootstrap from GitHub instead of PyPI.
|
|
119
119
|
|
|
120
120
|
## Quick Start
|
|
121
121
|
|
|
@@ -156,12 +156,14 @@ The current deterministic scale snapshot is documented in [Benchmark Evidence](d
|
|
|
156
156
|
Provider configuration is project-local. Copy `.env.example` to `.env` or use `setup.cmd -ForceEnv`.
|
|
157
157
|
|
|
158
158
|
```env
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
159
|
+
AKERNEL_OPENAI_API_KEY=replace-with-your-key
|
|
160
|
+
AKERNEL_OPENAI_BASE_URL=https://clarmy.cloud/v1
|
|
161
|
+
AKERNEL_OPENAI_MODEL=gpt-5.5
|
|
162
|
+
AKERNEL_OPENAI_AUX_MODEL=gpt-5.3-codex
|
|
163
163
|
```
|
|
164
164
|
|
|
165
|
+
Legacy `CONTEXT_KERNEL_OPENAI_*` names are still read as a compatibility fallback, but new projects should use `AKERNEL_OPENAI_*`.
|
|
166
|
+
|
|
165
167
|
Useful checks:
|
|
166
168
|
|
|
167
169
|
```powershell
|
|
@@ -98,14 +98,14 @@ The model provider is an interface. The CLI includes a mock provider for determi
|
|
|
98
98
|
|
|
99
99
|
Provider secrets are loaded from current process environment first, then project-local `.env`. The `.env` file is ignored by git and should stay local to the working copy.
|
|
100
100
|
|
|
101
|
-
- `
|
|
102
|
-
- `
|
|
103
|
-
- `
|
|
104
|
-
- `
|
|
101
|
+
- `AKERNEL_OPENAI_API_KEY`
|
|
102
|
+
- `AKERNEL_OPENAI_BASE_URL`
|
|
103
|
+
- `AKERNEL_OPENAI_MODEL`
|
|
104
|
+
- `AKERNEL_OPENAI_AUX_MODEL`
|
|
105
105
|
|
|
106
106
|
OpenAI-compatible base URLs are normalized to a `/v1` API root, so both `https://host` and `https://host/v1` are accepted.
|
|
107
107
|
|
|
108
|
-
`
|
|
108
|
+
`AKERNEL_OPENAI_MODEL` is the primary execution model used for high-risk, deep, warning-heavy, or synthesis steps. `AKERNEL_OPENAI_AUX_MODEL` is the auxiliary model role used for low/medium first-step planning in automatic routing and for auxiliary review before primary-model steps. Review traces are saved and their tokens are included in agent cost reports.
|
|
109
109
|
|
|
110
110
|
### Verifier
|
|
111
111
|
|
|
@@ -25,7 +25,7 @@ akernel
|
|
|
25
25
|
akernel --help
|
|
26
26
|
```
|
|
27
27
|
|
|
28
|
-
The launchers live in `%USERPROFILE%\.
|
|
28
|
+
The launchers live in `%USERPROFILE%\.akernel\bin`, and that directory is added to the user PATH. Open a new terminal if the commands are not visible immediately. `akernel` uses the current directory as the workspace, stores state in `.akernel`, and initializes it if needed. Environment lookup prefers the current directory `.env`, then falls back to the installed Context Kernel project `.env`. `akernel-chat` is kept as a compatibility shortcut.
|
|
29
29
|
|
|
30
30
|
## Wake The Project
|
|
31
31
|
|
|
@@ -94,7 +94,7 @@ akernel
|
|
|
94
94
|
Until PyPI publishing is enabled, Windows users can install from GitHub with:
|
|
95
95
|
|
|
96
96
|
```powershell
|
|
97
|
-
irm https://raw.githubusercontent.com/huanxin0825-ctrl/context-
|
|
97
|
+
irm https://raw.githubusercontent.com/huanxin0825-ctrl/context-akernel/main/scripts/install_remote.ps1 | iex
|
|
98
98
|
akernel setup
|
|
99
99
|
akernel
|
|
100
100
|
```
|
|
@@ -107,7 +107,7 @@ akernel setup
|
|
|
107
107
|
akernel
|
|
108
108
|
```
|
|
109
109
|
|
|
110
|
-
Before PyPI publication, set `AKERNEL_PIP_SOURCE=git+https://github.com/huanxin0825-ctrl/context-
|
|
110
|
+
Before PyPI publication, set `AKERNEL_PIP_SOURCE=git+https://github.com/huanxin0825-ctrl/context-akernel.git` so the npm wrapper bootstraps from GitHub.
|
|
111
111
|
|
|
112
112
|
`bench gate` also requires the current benchmark report itself to pass its checks. This prevents a bad first run from becoming the new normal just because the relative diff has no regression.
|
|
113
113
|
The release workflow also uploads benchmark evidence as a workflow artifact so release preparation carries a reproducible token-savings snapshot.
|
|
@@ -8,7 +8,7 @@ Do not commit credentials to the repository. Do not paste PyPI or npm tokens int
|
|
|
8
8
|
|
|
9
9
|
You need:
|
|
10
10
|
|
|
11
|
-
- A GitHub account with admin access to `huanxin0825-ctrl/context-
|
|
11
|
+
- A GitHub account with admin access to `huanxin0825-ctrl/context-akernel`.
|
|
12
12
|
- A PyPI account with two-factor authentication enabled.
|
|
13
13
|
- An npm account with two-factor authentication enabled.
|
|
14
14
|
- Either an npm organization or user scope that can publish the package name used by `packages/npm/akernel/package.json`.
|
|
@@ -30,7 +30,7 @@ Configure a PyPI trusted publisher with these values:
|
|
|
30
30
|
| --- | --- |
|
|
31
31
|
| PyPI project name | `akernel-runtime` |
|
|
32
32
|
| Owner | `huanxin0825-ctrl` |
|
|
33
|
-
| Repository name | `context-
|
|
33
|
+
| Repository name | `context-akernel` |
|
|
34
34
|
| Workflow filename | `release.yml` |
|
|
35
35
|
| Environment name | `pypi` |
|
|
36
36
|
|
|
@@ -63,7 +63,7 @@ Recommended path: use npm Trusted Publishing. It avoids a long-lived npm token a
|
|
|
63
63
|
| --- | --- |
|
|
64
64
|
| Package | `@context-akernel/akernel` |
|
|
65
65
|
| Owner | `huanxin0825-ctrl` |
|
|
66
|
-
| Repository name | `context-
|
|
66
|
+
| Repository name | `context-akernel` |
|
|
67
67
|
| Workflow filename | `release.yml` |
|
|
68
68
|
| Environment name | `npm` |
|
|
69
69
|
|
|
@@ -18,7 +18,7 @@ python -m pip install --user --upgrade akernel-runtime
|
|
|
18
18
|
|
|
19
19
|
Useful environment overrides:
|
|
20
20
|
|
|
21
|
-
- `AKERNEL_PIP_SOURCE=git+https://github.com/huanxin0825-ctrl/context-
|
|
21
|
+
- `AKERNEL_PIP_SOURCE=git+https://github.com/huanxin0825-ctrl/context-akernel.git` installs from GitHub instead of PyPI.
|
|
22
22
|
- `AKERNEL_SKIP_BOOTSTRAP=1` disables automatic pip installation.
|
|
23
23
|
|
|
24
24
|
Python 3.10 or newer is required. The Python package remains the source of truth.
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@context-akernel/akernel",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"description": "npm launcher wrapper for the Context Kernel akernel CLI.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
|
-
"homepage": "https://github.com/huanxin0825-ctrl/context-
|
|
6
|
+
"homepage": "https://github.com/huanxin0825-ctrl/context-akernel#readme",
|
|
7
7
|
"repository": {
|
|
8
8
|
"type": "git",
|
|
9
|
-
"url": "git+https://github.com/huanxin0825-ctrl/context-
|
|
9
|
+
"url": "git+https://github.com/huanxin0825-ctrl/context-akernel.git",
|
|
10
10
|
"directory": "packages/npm/akernel"
|
|
11
11
|
},
|
|
12
12
|
"bugs": {
|
|
13
|
-
"url": "https://github.com/huanxin0825-ctrl/context-
|
|
13
|
+
"url": "https://github.com/huanxin0825-ctrl/context-akernel/issues"
|
|
14
14
|
},
|
|
15
15
|
"keywords": [
|
|
16
16
|
"agent",
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "akernel-runtime"
|
|
7
|
-
version = "0.1.
|
|
7
|
+
version = "0.1.4"
|
|
8
8
|
description = "Agent Kernel: a CLI-first context-native agent runtime prototype."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "Apache-2.0"
|
|
@@ -26,10 +26,10 @@ classifiers = [
|
|
|
26
26
|
]
|
|
27
27
|
|
|
28
28
|
[project.urls]
|
|
29
|
-
Homepage = "https://github.com/huanxin0825-ctrl/context-
|
|
30
|
-
Repository = "https://github.com/huanxin0825-ctrl/context-
|
|
31
|
-
Issues = "https://github.com/huanxin0825-ctrl/context-
|
|
32
|
-
Changelog = "https://github.com/huanxin0825-ctrl/context-
|
|
29
|
+
Homepage = "https://github.com/huanxin0825-ctrl/context-akernel"
|
|
30
|
+
Repository = "https://github.com/huanxin0825-ctrl/context-akernel"
|
|
31
|
+
Issues = "https://github.com/huanxin0825-ctrl/context-akernel/issues"
|
|
32
|
+
Changelog = "https://github.com/huanxin0825-ctrl/context-akernel/blob/main/CHANGELOG.md"
|
|
33
33
|
|
|
34
34
|
[project.optional-dependencies]
|
|
35
35
|
dev = ["build>=1.2", "twine>=5.0"]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
param(
|
|
2
|
-
[string]$Source = "git+https://github.com/huanxin0825-ctrl/context-
|
|
3
|
-
[string]$LauncherDir = "$env:USERPROFILE\.
|
|
2
|
+
[string]$Source = "git+https://github.com/huanxin0825-ctrl/context-akernel.git",
|
|
3
|
+
[string]$LauncherDir = "$env:USERPROFILE\.akernel\bin"
|
|
4
4
|
)
|
|
5
5
|
|
|
6
6
|
$ErrorActionPreference = "Stop"
|
|
@@ -13,7 +13,7 @@ $ProjectRoot = Split-Path -Parent $MyInvocation.MyCommand.Path
|
|
|
13
13
|
$VenvPath = Join-Path $ProjectRoot ".venv"
|
|
14
14
|
$PythonPath = Join-Path $VenvPath "Scripts\python.exe"
|
|
15
15
|
$EnvPath = Join-Path $ProjectRoot ".env"
|
|
16
|
-
$LauncherDir = Join-Path $env:USERPROFILE ".
|
|
16
|
+
$LauncherDir = Join-Path $env:USERPROFILE ".akernel\bin"
|
|
17
17
|
|
|
18
18
|
function Install-GlobalLaunchers {
|
|
19
19
|
param(
|
|
@@ -27,7 +27,7 @@ function Install-GlobalLaunchers {
|
|
|
27
27
|
$akernel = @"
|
|
28
28
|
@echo off
|
|
29
29
|
setlocal
|
|
30
|
-
set "
|
|
30
|
+
set "AKERNEL_PROJECT_ROOT=$ProjectRoot"
|
|
31
31
|
"$PythonPath" -m context_kernel %*
|
|
32
32
|
exit /b %ERRORLEVEL%
|
|
33
33
|
"@
|
|
@@ -36,7 +36,7 @@ exit /b %ERRORLEVEL%
|
|
|
36
36
|
$chat = @"
|
|
37
37
|
@echo off
|
|
38
38
|
setlocal
|
|
39
|
-
set "
|
|
39
|
+
set "AKERNEL_PROJECT_ROOT=$ProjectRoot"
|
|
40
40
|
"$PythonPath" -m context_kernel chat %*
|
|
41
41
|
exit /b %ERRORLEVEL%
|
|
42
42
|
"@
|
|
@@ -76,15 +76,15 @@ if ($ForceEnv -or -not (Test-Path -LiteralPath $EnvPath)) {
|
|
|
76
76
|
if (Test-Path -LiteralPath $EnvPath) {
|
|
77
77
|
Write-Host "Keeping existing .env because no ApiKey was provided."
|
|
78
78
|
} else {
|
|
79
|
-
Write-Host "Creating .env from .env.example. Fill in
|
|
79
|
+
Write-Host "Creating .env from .env.example. Fill in AKERNEL_OPENAI_API_KEY before using openai provider."
|
|
80
80
|
Copy-Item -LiteralPath (Join-Path $ProjectRoot ".env.example") -Destination $EnvPath
|
|
81
81
|
}
|
|
82
82
|
} else {
|
|
83
83
|
$lines = @(
|
|
84
|
-
"
|
|
85
|
-
"
|
|
86
|
-
"
|
|
87
|
-
"
|
|
84
|
+
"AKERNEL_OPENAI_API_KEY=$ApiKey",
|
|
85
|
+
"AKERNEL_OPENAI_BASE_URL=$BaseUrl",
|
|
86
|
+
"AKERNEL_OPENAI_MODEL=$Model",
|
|
87
|
+
"AKERNEL_OPENAI_AUX_MODEL=$AuxModel"
|
|
88
88
|
)
|
|
89
89
|
Set-Content -LiteralPath $EnvPath -Value $lines -Encoding UTF8
|
|
90
90
|
Write-Host "Wrote project-local .env."
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: akernel-runtime
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.4
|
|
4
4
|
Summary: Agent Kernel: a CLI-first context-native agent runtime prototype.
|
|
5
5
|
Author: Context Kernel contributors
|
|
6
6
|
License-Expression: Apache-2.0
|
|
7
|
-
Project-URL: Homepage, https://github.com/huanxin0825-ctrl/context-
|
|
8
|
-
Project-URL: Repository, https://github.com/huanxin0825-ctrl/context-
|
|
9
|
-
Project-URL: Issues, https://github.com/huanxin0825-ctrl/context-
|
|
10
|
-
Project-URL: Changelog, https://github.com/huanxin0825-ctrl/context-
|
|
7
|
+
Project-URL: Homepage, https://github.com/huanxin0825-ctrl/context-akernel
|
|
8
|
+
Project-URL: Repository, https://github.com/huanxin0825-ctrl/context-akernel
|
|
9
|
+
Project-URL: Issues, https://github.com/huanxin0825-ctrl/context-akernel/issues
|
|
10
|
+
Project-URL: Changelog, https://github.com/huanxin0825-ctrl/context-akernel/blob/main/CHANGELOG.md
|
|
11
11
|
Keywords: agent,cli,context,llm,token-budget
|
|
12
12
|
Classifier: Development Status :: 3 - Alpha
|
|
13
13
|
Classifier: Intended Audience :: Developers
|
|
@@ -101,7 +101,7 @@ akernel
|
|
|
101
101
|
|
|
102
102
|
`setup.cmd` creates `.venv`, installs the local CLI in editable mode, and prepares project-local `.env` if needed. `wake.cmd` activates the environment, loads `.env`, and prints common commands. The `.cmd` wrappers avoid local PowerShell execution-policy friction.
|
|
103
103
|
|
|
104
|
-
`setup.cmd` also installs user-level launchers in `%USERPROFILE%\.
|
|
104
|
+
`setup.cmd` also installs user-level launchers in `%USERPROFILE%\.akernel\bin` and adds that directory to the user PATH. After opening a new terminal, `akernel` works from any directory, starts the interactive agent session by default, and uses that current directory as the workspace location. Environment lookup prefers the current project `.env`, then falls back to the installed Context Kernel project `.env`. `akernel-chat` remains as a compatibility shortcut.
|
|
105
105
|
|
|
106
106
|
### Manual Python Install
|
|
107
107
|
|
|
@@ -127,7 +127,7 @@ akernel
|
|
|
127
127
|
Windows users can also install directly from GitHub:
|
|
128
128
|
|
|
129
129
|
```powershell
|
|
130
|
-
irm https://raw.githubusercontent.com/huanxin0825-ctrl/context-
|
|
130
|
+
irm https://raw.githubusercontent.com/huanxin0825-ctrl/context-akernel/main/scripts/install_remote.ps1 | iex
|
|
131
131
|
akernel setup
|
|
132
132
|
akernel
|
|
133
133
|
```
|
|
@@ -142,7 +142,7 @@ akernel setup
|
|
|
142
142
|
akernel
|
|
143
143
|
```
|
|
144
144
|
|
|
145
|
-
Set `AKERNEL_PIP_SOURCE=git+https://github.com/huanxin0825-ctrl/context-
|
|
145
|
+
Set `AKERNEL_PIP_SOURCE=git+https://github.com/huanxin0825-ctrl/context-akernel.git` to make the npm launcher bootstrap from GitHub instead of PyPI.
|
|
146
146
|
|
|
147
147
|
## Quick Start
|
|
148
148
|
|
|
@@ -183,12 +183,14 @@ The current deterministic scale snapshot is documented in [Benchmark Evidence](d
|
|
|
183
183
|
Provider configuration is project-local. Copy `.env.example` to `.env` or use `setup.cmd -ForceEnv`.
|
|
184
184
|
|
|
185
185
|
```env
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
186
|
+
AKERNEL_OPENAI_API_KEY=replace-with-your-key
|
|
187
|
+
AKERNEL_OPENAI_BASE_URL=https://clarmy.cloud/v1
|
|
188
|
+
AKERNEL_OPENAI_MODEL=gpt-5.5
|
|
189
|
+
AKERNEL_OPENAI_AUX_MODEL=gpt-5.3-codex
|
|
190
190
|
```
|
|
191
191
|
|
|
192
|
+
Legacy `CONTEXT_KERNEL_OPENAI_*` names are still read as a compatibility fallback, but new projects should use `AKERNEL_OPENAI_*`.
|
|
193
|
+
|
|
192
194
|
Useful checks:
|
|
193
195
|
|
|
194
196
|
```powershell
|
|
@@ -18,6 +18,8 @@ wake.ps1
|
|
|
18
18
|
.github/release-notes/v0.1.0.md
|
|
19
19
|
.github/release-notes/v0.1.1.md
|
|
20
20
|
.github/release-notes/v0.1.2.md
|
|
21
|
+
.github/release-notes/v0.1.3.md
|
|
22
|
+
.github/release-notes/v0.1.4.md
|
|
21
23
|
.github/workflows/ci.yml
|
|
22
24
|
.github/workflows/release.yml
|
|
23
25
|
docs/00-vision.md
|
|
@@ -42,6 +42,18 @@ from .verifier import verify_trace
|
|
|
42
42
|
|
|
43
43
|
DEFAULT_PRIMARY_MODEL = "gpt-5.5"
|
|
44
44
|
DEFAULT_AUXILIARY_MODEL = "gpt-5.3-codex"
|
|
45
|
+
OPENAI_ENV_KEYS = {
|
|
46
|
+
"api_key": "AKERNEL_OPENAI_API_KEY",
|
|
47
|
+
"base_url": "AKERNEL_OPENAI_BASE_URL",
|
|
48
|
+
"model": "AKERNEL_OPENAI_MODEL",
|
|
49
|
+
"aux_model": "AKERNEL_OPENAI_AUX_MODEL",
|
|
50
|
+
}
|
|
51
|
+
LEGACY_OPENAI_ENV_KEYS = {
|
|
52
|
+
"api_key": "CONTEXT_KERNEL_OPENAI_API_KEY",
|
|
53
|
+
"base_url": "CONTEXT_KERNEL_OPENAI_BASE_URL",
|
|
54
|
+
"model": "CONTEXT_KERNEL_OPENAI_MODEL",
|
|
55
|
+
"aux_model": "CONTEXT_KERNEL_OPENAI_AUX_MODEL",
|
|
56
|
+
}
|
|
45
57
|
COMMAND_NAMES = {
|
|
46
58
|
"agent",
|
|
47
59
|
"bench",
|
|
@@ -613,7 +625,7 @@ def cmd_setup(args: argparse.Namespace) -> None:
|
|
|
613
625
|
|
|
614
626
|
api_key = args.api_key
|
|
615
627
|
if api_key is None:
|
|
616
|
-
current_key = existing
|
|
628
|
+
current_key = existing_env_value(existing, "api_key")
|
|
617
629
|
if current_key and interactive:
|
|
618
630
|
typed = getpass("API key [keep existing]: ").strip()
|
|
619
631
|
api_key = typed or current_key
|
|
@@ -626,18 +638,18 @@ def cmd_setup(args: argparse.Namespace) -> None:
|
|
|
626
638
|
|
|
627
639
|
base_url = args.base_url
|
|
628
640
|
if base_url is None:
|
|
629
|
-
default_base_url = existing
|
|
641
|
+
default_base_url = existing_env_value(existing, "base_url") or "https://clarmy.cloud/v1"
|
|
630
642
|
base_url = prompt_text("Base URL", default_base_url, interactive=interactive)
|
|
631
643
|
base_url = normalize_openai_base_url(base_url)
|
|
632
644
|
|
|
633
645
|
model = args.model
|
|
634
646
|
if model is None:
|
|
635
|
-
default_model = existing
|
|
647
|
+
default_model = existing_env_value(existing, "model") or DEFAULT_PRIMARY_MODEL
|
|
636
648
|
model = prompt_text("Primary model", default_model, interactive=interactive)
|
|
637
649
|
|
|
638
650
|
aux_model = args.aux_model
|
|
639
651
|
if aux_model is None:
|
|
640
|
-
default_aux_model = existing
|
|
652
|
+
default_aux_model = existing_env_value(existing, "aux_model") or DEFAULT_AUXILIARY_MODEL
|
|
641
653
|
aux_model = prompt_text("Auxiliary model", default_aux_model, interactive=interactive)
|
|
642
654
|
|
|
643
655
|
write_project_env(env_path, api_key=api_key, base_url=base_url, model=model, aux_model=aux_model)
|
|
@@ -647,17 +659,12 @@ def cmd_setup(args: argparse.Namespace) -> None:
|
|
|
647
659
|
print(f"primary_model: {model}")
|
|
648
660
|
print(f"auxiliary_model: {aux_model}")
|
|
649
661
|
if args.verify:
|
|
650
|
-
previous = {
|
|
651
|
-
"CONTEXT_KERNEL_OPENAI_API_KEY": os.environ.get("CONTEXT_KERNEL_OPENAI_API_KEY"),
|
|
652
|
-
"CONTEXT_KERNEL_OPENAI_BASE_URL": os.environ.get("CONTEXT_KERNEL_OPENAI_BASE_URL"),
|
|
653
|
-
"CONTEXT_KERNEL_OPENAI_MODEL": os.environ.get("CONTEXT_KERNEL_OPENAI_MODEL"),
|
|
654
|
-
"CONTEXT_KERNEL_OPENAI_AUX_MODEL": os.environ.get("CONTEXT_KERNEL_OPENAI_AUX_MODEL"),
|
|
655
|
-
}
|
|
662
|
+
previous = {key: os.environ.get(key) for key in OPENAI_ENV_KEYS.values()}
|
|
656
663
|
try:
|
|
657
|
-
os.environ["
|
|
658
|
-
os.environ["
|
|
659
|
-
os.environ["
|
|
660
|
-
os.environ["
|
|
664
|
+
os.environ[OPENAI_ENV_KEYS["api_key"]] = api_key
|
|
665
|
+
os.environ[OPENAI_ENV_KEYS["base_url"]] = base_url
|
|
666
|
+
os.environ[OPENAI_ENV_KEYS["model"]] = model
|
|
667
|
+
os.environ[OPENAI_ENV_KEYS["aux_model"]] = aux_model
|
|
661
668
|
models = list_provider_models("openai", base_url=base_url)
|
|
662
669
|
finally:
|
|
663
670
|
restore_env(previous)
|
|
@@ -686,13 +693,17 @@ def prompt_text(label: str, default: str, *, interactive: bool) -> str:
|
|
|
686
693
|
return value or default
|
|
687
694
|
|
|
688
695
|
|
|
696
|
+
def existing_env_value(existing: dict[str, str], key: str) -> str:
|
|
697
|
+
return existing.get(OPENAI_ENV_KEYS[key]) or existing.get(LEGACY_OPENAI_ENV_KEYS[key]) or ""
|
|
698
|
+
|
|
699
|
+
|
|
689
700
|
def write_project_env(path: Path, *, api_key: str, base_url: str, model: str, aux_model: str) -> None:
|
|
690
701
|
path.parent.mkdir(parents=True, exist_ok=True)
|
|
691
702
|
lines = [
|
|
692
|
-
f"
|
|
693
|
-
f"
|
|
694
|
-
f"
|
|
695
|
-
f"
|
|
703
|
+
f"{OPENAI_ENV_KEYS['api_key']}={api_key}",
|
|
704
|
+
f"{OPENAI_ENV_KEYS['base_url']}={base_url}",
|
|
705
|
+
f"{OPENAI_ENV_KEYS['model']}={model}",
|
|
706
|
+
f"{OPENAI_ENV_KEYS['aux_model']}={aux_model}",
|
|
696
707
|
]
|
|
697
708
|
path.write_text("\n".join(lines) + "\n", encoding="utf-8")
|
|
698
709
|
|
|
@@ -1145,8 +1156,8 @@ def cmd_chat(args: argparse.Namespace) -> None:
|
|
|
1145
1156
|
|
|
1146
1157
|
def print_chat_header(workspace: Workspace, task_id: str, args: argparse.Namespace) -> None:
|
|
1147
1158
|
model = primary_model(args)
|
|
1148
|
-
base_url = args.base_url or env_value("
|
|
1149
|
-
api_key_set = bool(env_value("
|
|
1159
|
+
base_url = args.base_url or env_value("AKERNEL_OPENAI_BASE_URL") or ""
|
|
1160
|
+
api_key_set = bool(env_value("AKERNEL_OPENAI_API_KEY"))
|
|
1150
1161
|
chat_banner(
|
|
1151
1162
|
"Context Kernel Agent",
|
|
1152
1163
|
"Token-frugal task runner for long-lived AI workspaces.",
|
|
@@ -1831,7 +1842,7 @@ def print_model_panel(args: argparse.Namespace) -> None:
|
|
|
1831
1842
|
("review_role", "auxiliary reviews primary-model steps when enabled"),
|
|
1832
1843
|
("mode", args.model_routing),
|
|
1833
1844
|
("review", args.aux_review),
|
|
1834
|
-
("base_url", args.base_url or env_value("
|
|
1845
|
+
("base_url", args.base_url or env_value("AKERNEL_OPENAI_BASE_URL") or "default"),
|
|
1835
1846
|
],
|
|
1836
1847
|
)
|
|
1837
1848
|
|
|
@@ -1859,8 +1870,8 @@ def print_config_panel() -> None:
|
|
|
1859
1870
|
"Config",
|
|
1860
1871
|
[
|
|
1861
1872
|
("setup", "akernel setup"),
|
|
1862
|
-
("env", "
|
|
1863
|
-
("models", "
|
|
1873
|
+
("env", "AKERNEL_OPENAI_API_KEY, AKERNEL_OPENAI_BASE_URL"),
|
|
1874
|
+
("models", "AKERNEL_OPENAI_MODEL, AKERNEL_OPENAI_AUX_MODEL"),
|
|
1864
1875
|
("scope", "current project .env first, installed Context Kernel .env fallback"),
|
|
1865
1876
|
],
|
|
1866
1877
|
)
|
|
@@ -1872,11 +1883,11 @@ def chat_prompt(args: argparse.Namespace) -> str:
|
|
|
1872
1883
|
|
|
1873
1884
|
|
|
1874
1885
|
def primary_model(args: argparse.Namespace) -> str:
|
|
1875
|
-
return args.model or env_value("
|
|
1886
|
+
return args.model or env_value("AKERNEL_OPENAI_MODEL") or DEFAULT_PRIMARY_MODEL
|
|
1876
1887
|
|
|
1877
1888
|
|
|
1878
1889
|
def auxiliary_model(args: argparse.Namespace) -> str:
|
|
1879
|
-
return getattr(args, "aux_model", None) or env_value("
|
|
1890
|
+
return getattr(args, "aux_model", None) or env_value("AKERNEL_OPENAI_AUX_MODEL") or DEFAULT_AUXILIARY_MODEL
|
|
1880
1891
|
|
|
1881
1892
|
|
|
1882
1893
|
def model_routing_summary(report: dict[str, Any]) -> str:
|
|
@@ -2120,10 +2131,10 @@ def cmd_doctor(args: argparse.Namespace) -> None:
|
|
|
2120
2131
|
workspace = Workspace(Path(args.workspace))
|
|
2121
2132
|
config = workspace.load_config()
|
|
2122
2133
|
command_policy = summarize_command_policy(workspace)
|
|
2123
|
-
base_url = env_value("
|
|
2124
|
-
api_key = env_value("
|
|
2125
|
-
model = env_value("
|
|
2126
|
-
aux_model = env_value("
|
|
2134
|
+
base_url = env_value("AKERNEL_OPENAI_BASE_URL")
|
|
2135
|
+
api_key = env_value("AKERNEL_OPENAI_API_KEY")
|
|
2136
|
+
model = env_value("AKERNEL_OPENAI_MODEL") or DEFAULT_PRIMARY_MODEL
|
|
2137
|
+
aux_model = env_value("AKERNEL_OPENAI_AUX_MODEL") or DEFAULT_AUXILIARY_MODEL
|
|
2127
2138
|
print(f"project_root: {Path.cwd().resolve()}")
|
|
2128
2139
|
print(f"workspace: {workspace.root}")
|
|
2129
2140
|
print(f"workspace_initialized: {workspace.state.exists()}")
|
|
@@ -8,7 +8,7 @@ from .storage import Workspace
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
def global_workspace(root: Path | None = None) -> Workspace:
|
|
11
|
-
workspace = Workspace(root or Path.home() / ".
|
|
11
|
+
workspace = Workspace(root or Path.home() / ".akernel" / "global")
|
|
12
12
|
workspace.init()
|
|
13
13
|
return workspace
|
|
14
14
|
|
|
@@ -855,7 +855,12 @@ def recovery_target_path(request: str) -> str | None:
|
|
|
855
855
|
def diagnose_agent_exception(exc: Exception) -> dict[str, str]:
|
|
856
856
|
message = compact(str(exc), limit=500) or exc.__class__.__name__
|
|
857
857
|
lower = message.casefold()
|
|
858
|
-
if
|
|
858
|
+
if (
|
|
859
|
+
"missing akernel_openai_base_url" in lower
|
|
860
|
+
or "missing akernel_openai_api_key" in lower
|
|
861
|
+
or "missing context_kernel_openai_base_url" in lower
|
|
862
|
+
or "missing context_kernel_openai_api_key" in lower
|
|
863
|
+
):
|
|
859
864
|
return {
|
|
860
865
|
"category": "provider_configuration",
|
|
861
866
|
"message": message,
|
|
@@ -865,7 +870,7 @@ def diagnose_agent_exception(exc: Exception) -> dict[str, str]:
|
|
|
865
870
|
return {
|
|
866
871
|
"category": "provider_auth",
|
|
867
872
|
"message": message,
|
|
868
|
-
"suggestion": "Check `
|
|
873
|
+
"suggestion": "Check `AKERNEL_OPENAI_API_KEY` in the project `.env` and confirm the endpoint accepts it.",
|
|
869
874
|
}
|
|
870
875
|
if "provider http 404" in lower:
|
|
871
876
|
return {
|
|
@@ -1049,8 +1054,8 @@ def resolve_role_model(provider_name: str, model: str | None, aux_model: str | N
|
|
|
1049
1054
|
if provider_name != "openai":
|
|
1050
1055
|
return aux_model if role == "auxiliary" else model
|
|
1051
1056
|
if role == "auxiliary":
|
|
1052
|
-
return aux_model or env_value("
|
|
1053
|
-
return model or env_value("
|
|
1057
|
+
return aux_model or env_value("AKERNEL_OPENAI_AUX_MODEL") or DEFAULT_AUXILIARY_MODEL
|
|
1058
|
+
return model or env_value("AKERNEL_OPENAI_MODEL") or DEFAULT_PRIMARY_MODEL
|
|
1054
1059
|
|
|
1055
1060
|
|
|
1056
1061
|
def run_auxiliary_review(
|
|
@@ -13,6 +13,15 @@ from .policy import command_root_candidates
|
|
|
13
13
|
from .tokenizer import estimate_tokens
|
|
14
14
|
|
|
15
15
|
|
|
16
|
+
ENV_ALIASES = {
|
|
17
|
+
"AKERNEL_OPENAI_API_KEY": "CONTEXT_KERNEL_OPENAI_API_KEY",
|
|
18
|
+
"AKERNEL_OPENAI_BASE_URL": "CONTEXT_KERNEL_OPENAI_BASE_URL",
|
|
19
|
+
"AKERNEL_OPENAI_MODEL": "CONTEXT_KERNEL_OPENAI_MODEL",
|
|
20
|
+
"AKERNEL_OPENAI_AUX_MODEL": "CONTEXT_KERNEL_OPENAI_AUX_MODEL",
|
|
21
|
+
"AKERNEL_PROJECT_ROOT": "CONTEXT_KERNEL_PROJECT_ROOT",
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
|
|
16
25
|
@dataclass(frozen=True)
|
|
17
26
|
class ProviderResponse:
|
|
18
27
|
text: str
|
|
@@ -689,14 +698,14 @@ class OpenAICompatibleProvider:
|
|
|
689
698
|
api_key: str | None = None,
|
|
690
699
|
timeout_seconds: int = 120,
|
|
691
700
|
):
|
|
692
|
-
self.model = model or env_value("
|
|
693
|
-
self.base_url = normalize_openai_base_url(base_url or env_value("
|
|
694
|
-
self.api_key = api_key or env_value("
|
|
701
|
+
self.model = model or env_value("AKERNEL_OPENAI_MODEL") or "gpt-5.5"
|
|
702
|
+
self.base_url = normalize_openai_base_url(base_url or env_value("AKERNEL_OPENAI_BASE_URL") or "")
|
|
703
|
+
self.api_key = api_key or env_value("AKERNEL_OPENAI_API_KEY")
|
|
695
704
|
self.timeout_seconds = timeout_seconds
|
|
696
705
|
if not self.base_url:
|
|
697
|
-
raise ValueError("Missing
|
|
706
|
+
raise ValueError("Missing AKERNEL_OPENAI_BASE_URL for OpenAI-compatible provider.")
|
|
698
707
|
if not self.api_key:
|
|
699
|
-
raise ValueError("Missing
|
|
708
|
+
raise ValueError("Missing AKERNEL_OPENAI_API_KEY for OpenAI-compatible provider.")
|
|
700
709
|
|
|
701
710
|
def run(self, packet: dict[str, Any]) -> ProviderResponse:
|
|
702
711
|
payload = {
|
|
@@ -829,8 +838,13 @@ def env_value(name: str) -> str | None:
|
|
|
829
838
|
value = os.environ.get(name)
|
|
830
839
|
if value:
|
|
831
840
|
return value
|
|
841
|
+
legacy_name = ENV_ALIASES.get(name)
|
|
842
|
+
if legacy_name:
|
|
843
|
+
value = os.environ.get(legacy_name)
|
|
844
|
+
if value:
|
|
845
|
+
return value
|
|
832
846
|
env_file = project_env_values()
|
|
833
|
-
return env_file.get(name)
|
|
847
|
+
return env_file.get(name) or (env_file.get(legacy_name) if legacy_name else None)
|
|
834
848
|
|
|
835
849
|
|
|
836
850
|
def project_env_values() -> dict[str, str]:
|
|
@@ -838,7 +852,7 @@ def project_env_values() -> dict[str, str]:
|
|
|
838
852
|
path = directory / ".env"
|
|
839
853
|
if path.exists():
|
|
840
854
|
return parse_env_file(path)
|
|
841
|
-
project_root = os.environ.get("CONTEXT_KERNEL_PROJECT_ROOT")
|
|
855
|
+
project_root = os.environ.get("AKERNEL_PROJECT_ROOT") or os.environ.get("CONTEXT_KERNEL_PROJECT_ROOT")
|
|
842
856
|
if project_root:
|
|
843
857
|
path = Path(project_root) / ".env"
|
|
844
858
|
if path.exists():
|
|
@@ -305,7 +305,7 @@ class RuntimeTests(unittest.TestCase):
|
|
|
305
305
|
with patch.object(
|
|
306
306
|
AgentRunner,
|
|
307
307
|
"run",
|
|
308
|
-
side_effect=ValueError("Missing
|
|
308
|
+
side_effect=ValueError("Missing AKERNEL_OPENAI_API_KEY for OpenAI-compatible provider."),
|
|
309
309
|
):
|
|
310
310
|
report = AgentLoop(workspace).run(
|
|
311
311
|
"Reply with OK.",
|
|
@@ -1249,7 +1249,7 @@ class RuntimeTests(unittest.TestCase):
|
|
|
1249
1249
|
self.assertIn("Model Roles", output)
|
|
1250
1250
|
self.assertIn("auxiliary", output)
|
|
1251
1251
|
self.assertIn("Models", output)
|
|
1252
|
-
self.assertIn("
|
|
1252
|
+
self.assertIn("AKERNEL_OPENAI_AUX_MODEL", output)
|
|
1253
1253
|
self.assertIn("agent_run:", output)
|
|
1254
1254
|
self.assertIn("Mock agent response", output)
|
|
1255
1255
|
self.assertIn("Step Breakdown", output)
|
|
@@ -1440,10 +1440,10 @@ class RuntimeTests(unittest.TestCase):
|
|
|
1440
1440
|
os.chdir(previous)
|
|
1441
1441
|
|
|
1442
1442
|
values = parse_env_file(Path(tmp) / ".env")
|
|
1443
|
-
self.assertEqual(values["
|
|
1444
|
-
self.assertEqual(values["
|
|
1445
|
-
self.assertEqual(values["
|
|
1446
|
-
self.assertEqual(values["
|
|
1443
|
+
self.assertEqual(values["AKERNEL_OPENAI_API_KEY"], "sk-test123456789012345")
|
|
1444
|
+
self.assertEqual(values["AKERNEL_OPENAI_BASE_URL"], "https://example.test/v1")
|
|
1445
|
+
self.assertEqual(values["AKERNEL_OPENAI_MODEL"], "gpt-5.5")
|
|
1446
|
+
self.assertEqual(values["AKERNEL_OPENAI_AUX_MODEL"], "gpt-5.3-codex")
|
|
1447
1447
|
self.assertIn("api_key: set", stdout.getvalue())
|
|
1448
1448
|
self.assertIn("auxiliary_model: gpt-5.3-codex", stdout.getvalue())
|
|
1449
1449
|
|
|
@@ -1859,12 +1859,12 @@ class RuntimeTests(unittest.TestCase):
|
|
|
1859
1859
|
with tempfile.TemporaryDirectory() as tmp:
|
|
1860
1860
|
path = Path(tmp) / ".env"
|
|
1861
1861
|
path.write_text(
|
|
1862
|
-
"
|
|
1863
|
-
"
|
|
1862
|
+
"AKERNEL_OPENAI_BASE_URL=https://clarmy.cloud/v1\n"
|
|
1863
|
+
"AKERNEL_OPENAI_MODEL='gpt-5.5'\n",
|
|
1864
1864
|
encoding="utf-8",
|
|
1865
1865
|
)
|
|
1866
1866
|
|
|
1867
|
-
self.assertEqual(parse_env_file(path)["
|
|
1867
|
+
self.assertEqual(parse_env_file(path)["AKERNEL_OPENAI_MODEL"], "gpt-5.5")
|
|
1868
1868
|
self.assertEqual(normalize_openai_base_url("https://clarmy.cloud"), "https://clarmy.cloud/v1")
|
|
1869
1869
|
self.assertEqual(normalize_openai_base_url("https://clarmy.cloud/v1"), "https://clarmy.cloud/v1")
|
|
1870
1870
|
|
|
@@ -1873,17 +1873,17 @@ class RuntimeTests(unittest.TestCase):
|
|
|
1873
1873
|
root = Path(root_tmp)
|
|
1874
1874
|
(root / ".env").write_text("CONTEXT_KERNEL_TEST_VALUE=from-project-root\n", encoding="utf-8")
|
|
1875
1875
|
previous = Path.cwd()
|
|
1876
|
-
previous_root = os.environ.get("
|
|
1876
|
+
previous_root = os.environ.get("AKERNEL_PROJECT_ROOT")
|
|
1877
1877
|
os.chdir(work_tmp)
|
|
1878
|
-
os.environ["
|
|
1878
|
+
os.environ["AKERNEL_PROJECT_ROOT"] = str(root)
|
|
1879
1879
|
try:
|
|
1880
1880
|
self.assertEqual(env_value("CONTEXT_KERNEL_TEST_VALUE"), "from-project-root")
|
|
1881
1881
|
finally:
|
|
1882
1882
|
os.chdir(previous)
|
|
1883
1883
|
if previous_root is None:
|
|
1884
|
-
os.environ.pop("
|
|
1884
|
+
os.environ.pop("AKERNEL_PROJECT_ROOT", None)
|
|
1885
1885
|
else:
|
|
1886
|
-
os.environ["
|
|
1886
|
+
os.environ["AKERNEL_PROJECT_ROOT"] = previous_root
|
|
1887
1887
|
|
|
1888
1888
|
def test_eval_runner_can_execute_with_mock_provider(self) -> None:
|
|
1889
1889
|
with tempfile.TemporaryDirectory() as tmp:
|
|
@@ -41,7 +41,7 @@ Import-ProjectEnv $EnvPath
|
|
|
41
41
|
Write-Host "Context Kernel is awake."
|
|
42
42
|
Write-Host "Project: $ProjectRoot"
|
|
43
43
|
Write-Host "Workspace: $Workspace"
|
|
44
|
-
Write-Host "Model: $env:
|
|
44
|
+
Write-Host "Model: $env:AKERNEL_OPENAI_MODEL"
|
|
45
45
|
Write-Host ""
|
|
46
46
|
|
|
47
47
|
if ($InitWorkspace) {
|
|
@@ -53,7 +53,7 @@ if ($ListModels) {
|
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
if ($RunSmoke) {
|
|
56
|
-
akernel --workspace $Workspace run "In one short sentence, say what Context Kernel is testing." --provider openai --model $env:
|
|
56
|
+
akernel --workspace $Workspace run "In one short sentence, say what Context Kernel is testing." --provider openai --model $env:AKERNEL_OPENAI_MODEL --profile lean
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
Write-Host "Useful commands:"
|
|
@@ -65,4 +65,4 @@ Write-Host " akernel chat"
|
|
|
65
65
|
Write-Host " akernel-chat"
|
|
66
66
|
Write-Host " akernel --workspace $Workspace bench run examples\benchmarks\phase2"
|
|
67
67
|
Write-Host " akernel --workspace $Workspace bench gate examples\benchmarks\phase2"
|
|
68
|
-
Write-Host " akernel --workspace $Workspace bench run examples\benchmarks\phase2 --execute --provider openai --model $env:
|
|
68
|
+
Write-Host " akernel --workspace $Workspace bench run examples\benchmarks\phase2 --execute --provider openai --model $env:AKERNEL_OPENAI_MODEL"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/examples/benchmarks/phase2/03-budget-profiles.json
RENAMED
|
File without changes
|
{akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/examples/benchmarks/scale/01-context-pressure.json
RENAMED
|
File without changes
|
{akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/examples/benchmarks/scale/02-agent-editing.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/src/akernel_runtime.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
{akernel_runtime-0.1.2 → akernel_runtime-0.1.4}/src/akernel_runtime.egg-info/entry_points.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|