All checks were successful
Deploy Development / deploy (push) Successful in 44s
Test Suite / pytest-backend (push) Successful in 2m2s
Test Suite / lint-backend (push) Successful in 2s
Test Suite / compose-smoke (push) Has been skipped
Test Suite / k6 /api/health Baseline (push) Successful in 18s
Test Suite / playwright-smoke (push) Successful in 17s
Steering PATCH akzeptiert alle registrierten method_keys (nicht nur Legacy-Literal). Co-authored-by: Cursor <cursoragent@cursor.com>
61 lines
1.9 KiB
Python
61 lines
1.9 KiB
Python
"""Steering API — methods and context (AP1.1)."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Optional
|
|
|
|
from capabilities import require_capability
|
|
from fastapi import APIRouter, Depends, HTTPException
|
|
from pydantic import BaseModel, Field
|
|
from services import initiatives as initiative_service
|
|
from services import steering_context as sc_service
|
|
from steering.context import get_steering_context_dto
|
|
from steering.methods.registry import list_methods
|
|
from tenant_context import TenantContext
|
|
|
|
router = APIRouter(prefix="/api/steering", tags=["steering"])
|
|
|
|
|
|
class SteeringContextUpdateRequest(BaseModel):
|
|
method_key: str = Field(..., min_length=1)
|
|
|
|
|
|
@router.get("/methods")
|
|
def list_steering_methods(
|
|
ctx: TenantContext = Depends(require_capability("kairo.initiative.read")),
|
|
):
|
|
return [
|
|
{
|
|
"key": m.key,
|
|
"version": m.version,
|
|
"label": m.label,
|
|
"description": m.description,
|
|
"next_action_strategy_key": m.next_action_strategy_key,
|
|
}
|
|
for m in list_methods()
|
|
]
|
|
|
|
|
|
@router.patch("/initiatives/{initiative_id}/context")
|
|
def patch_initiative_steering_context(
|
|
initiative_id: str,
|
|
body: SteeringContextUpdateRequest,
|
|
ctx: TenantContext = Depends(require_capability("kairo.initiative.manage")),
|
|
):
|
|
if not initiative_service.get_initiative(
|
|
tenant_id=ctx.tenant_id, initiative_id=initiative_id
|
|
):
|
|
raise HTTPException(status_code=404, detail="Vorhaben nicht gefunden")
|
|
if not body.method_key:
|
|
raise HTTPException(status_code=400, detail="method_key erforderlich")
|
|
try:
|
|
sc_service.update_method_key(
|
|
tenant_id=ctx.tenant_id,
|
|
initiative_id=initiative_id,
|
|
method_key=body.method_key,
|
|
user_id=ctx.user_id,
|
|
)
|
|
except ValueError as exc:
|
|
raise HTTPException(status_code=400, detail=str(exc)) from exc
|
|
return get_steering_context_dto(ctx, initiative_id=initiative_id)
|