CI / checks (push) Skipped
CI / checks (pull_request) Successful in 51s
The thresholds Part H says to tune on the real inference hardware were hardcoded, so every adjustment would have been a PR. They now live in a `tuning:` section of a YAML config file, which also replaces flat environment variables as the home for structure (#32). - The file (NISSE_CONFIG, default ./nisse-dev.yaml) carries structure and holds no secrets: credentials are ${VAR} references resolved from the environment, and a reference to an unset variable is an error - The environment still wins: every existing NISSE_* variable overrides its key, and the file is optional, so .env and CI work unchanged - Validation stays fail-fast and reports every problem at once; unknown keys are errors, so a misspelt knob fails at startup instead of silently doing nothing - The config file joins the state store and .env in the check that refuses to start when they sit inside the workspace clone - Tuning covers the executor's turn and failure limits, the consult budget, the delegation caps, the command timeout and the tool output limit, which Workspace now takes as a setting; the defaults are the values the agent already ran with - llm.max_output_tokens reaches both LLM clients from the config docs/Tuning-Guide.md explains the knobs for someone learning local model tuning: how weights, quantization and the KV cache spend VRAM, what each knob does and what goes wrong at either extreme, and an order to tune in. nisse-dev.example.yaml documents every key and is checked by a test so it cannot drift. Closes #32 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
47 lines
1.3 KiB
Python
47 lines
1.3 KiB
Python
"""Entry point for the dev agent.
|
|
|
|
Loads configuration, builds the agent, and stays up until told to stop.
|
|
Shutdown is deliberate rather than abrupt: A2's durability guarantees assume
|
|
the process may die at any moment, but a clean stop still beats relying on
|
|
them.
|
|
"""
|
|
|
|
import os
|
|
import signal
|
|
import sys
|
|
from pathlib import Path
|
|
from types import FrameType
|
|
|
|
from nisse_dev.agent import build_agent
|
|
from nisse_dev.config import AgentConfig, ConfigError
|
|
from nisse_dev.envfile import load_env_file
|
|
|
|
|
|
def main() -> int:
|
|
load_env_file(Path(os.environ.get("NISSE_ENV", ".env")).expanduser())
|
|
try:
|
|
config = AgentConfig.load()
|
|
except ConfigError as exc:
|
|
# Fail here rather than twenty minutes into a milestone on the one
|
|
# call that needed the missing value.
|
|
print(f"nisse-dev: {exc}", file=sys.stderr)
|
|
return 2
|
|
|
|
agent = build_agent(config)
|
|
|
|
def shutdown(_signum: int, _frame: FrameType | None) -> None:
|
|
print("nisse-dev: stopping", file=sys.stderr)
|
|
agent.stop()
|
|
|
|
signal.signal(signal.SIGINT, shutdown)
|
|
signal.signal(signal.SIGTERM, shutdown)
|
|
|
|
agent.start()
|
|
print(f"nisse-dev: ready as {agent.account} on {config.project}", file=sys.stderr)
|
|
agent.wait()
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|