nisse-review: a stop ends a review in progress; quieter repo failures
SIGTERM used to stop only new rounds: a review in progress ran on until systemd killed it 90s later. Now the scheduler's stop sets the driver's cancel flag, so the run ends at its next turn, and a model call in flight is broken off (Interruptible, raising Stopped from the signal handler, only ever inside a model call). The item goes back to ready, with nothing drafted posted and no failure counted; replies already posted carry their markers and are not repeated. intake.repo_failed is logged when a repository starts failing or the reason changes, and intake.repo_ok when it lists again, not every round. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01J5Utyfzw7gF7UhjRDEtjTk
This commit is contained in:
1 parent
52d30ccab9
commit
a85e855fc2
8 files changed
+287
-10
No files matched your search
@@ -12,6 +12,7 @@ from nisse_core.loop.driver import Driver
|
||||
from nisse_core.loop.expert import ExpertDesk
|
||||
from nisse_core.models.catalog import ModelCatalog
|
||||
from nisse_core.models.context import BudgetedClient
|
||||
from nisse_core.models.interruptible import Interruptible
|
||||
from nisse_core.models.llm import LiteLLMClient
|
||||
from nisse_core.oplog import OpLog
|
||||
from nisse_core.state.cancel import Cancel
|
||||
@@ -36,6 +37,13 @@ class Built:
|
||||
repositories: list[str]
|
||||
store: StateStore
|
||||
gitea: GiteaClient
|
||||
model: Interruptible
|
||||
|
||||
def stop(self) -> None:
|
||||
"""From the signal handler: no more rounds, the run in progress
|
||||
ends at its next turn, and a model call in flight is broken off."""
|
||||
self.scheduler.stop()
|
||||
self.model.interrupt()
|
||||
|
||||
def close(self) -> None:
|
||||
self.gitea.close()
|
||||
@@ -97,7 +105,8 @@ def build(
|
||||
oplog = oplog or OpLog(AGENT)
|
||||
gitea = gitea or GiteaClient(config.gitea_url, config.gitea_token)
|
||||
account, repos = check_access(gitea, config.repositories, oplog)
|
||||
client = client if client is not None else llm_client(config)
|
||||
# Every model call, the reviewer's and ask_expert's, can be broken off.
|
||||
model = Interruptible(client if client is not None else llm_client(config)) # type: ignore[arg-type]
|
||||
config.state_db.parent.mkdir(parents=True, exist_ok=True)
|
||||
store = StateStore(config.state_db, oplog=oplog)
|
||||
vault = (
|
||||
@@ -116,16 +125,17 @@ def build(
|
||||
else None
|
||||
)
|
||||
tuning = config.tuning
|
||||
cancel = Cancel()
|
||||
reviewer = Reviewer(
|
||||
store,
|
||||
gitea,
|
||||
Driver(client, config.roles.resolve("driver"), cancel=Cancel()), # type: ignore[arg-type]
|
||||
Driver(model, config.roles.resolve("driver"), cancel=cancel), # type: ignore[arg-type]
|
||||
account=account,
|
||||
gitea_url=config.gitea_url,
|
||||
oplog=oplog,
|
||||
knowledge=Knowledge(vault, memory, oplog),
|
||||
expert=ExpertDesk(
|
||||
client, # type: ignore[arg-type]
|
||||
model, # type: ignore[arg-type]
|
||||
config.roles,
|
||||
budget=tuning.expert.consult_budget,
|
||||
),
|
||||
@@ -147,5 +157,6 @@ def build(
|
||||
operators=config.gitea_operators,
|
||||
max_rounds=tuning.review.max_rounds,
|
||||
patterns=config.repositories,
|
||||
cancel=cancel,
|
||||
)
|
||||
return Built(scheduler, account, repos, store, gitea)
|
||||
return Built(scheduler, account, repos, store, gitea, model)
|
||||
Reference in new issue
Block a user