14bd4e33fb
- KI-Copilot: NL query → proposed actions, execute with RBAC, history, audit logging - LLM client: mock mode (no API key) + OpenAI-compatible mode (AI_MODEL/AI_API_KEY) - Action mapper: NL intent → API calls (create/update/delete/search company/contact) - Workflow engine: step types (action/approval/notification/condition), JSONB steps - Workflow lifecycle: pending → in_progress → completed/rejected/cancelled - Event-triggered workflows: event bus → auto-start instances - Code-engine workflows: onboarding on user.created event - Approval timeout: auto-reject after configured hours - 5 new tenant-scoped tables with RLS: ai_conversations, ai_messages, workflows, workflow_instances, workflow_step_history - Migration 0004: all tables + RLS policies + tenant_id + indexes - 238 tests pass (30 AC + 105 coverage + 103 existing), 84.12% T09 module coverage - MissingGreenlet fix: safe accessor helpers for async ORM attribute access
122 lines
6.0 KiB
Markdown
122 lines
6.0 KiB
Markdown
# T09 — KI-Copilot API + Hybrid Workflow Engine Backend
|
|
|
|
## Project Root
|
|
/a0/usr/workdir/dev-projects/leocrm
|
|
|
|
## Backend Directory
|
|
/a0/usr/workdir/dev-projects/leocrm/app/
|
|
|
|
## Tech Stack (existing)
|
|
- FastAPI + SQLAlchemy 2.0 + asyncpg + Pydantic v2 + ARQ
|
|
- PostgreSQL 18 on localhost:5432 (user/db: leocrm/leocrm + leocrm_test)
|
|
- Redis on localhost:6379
|
|
- venv at /opt/venv (already activated)
|
|
- T01-T03 complete (103 tests pass, commit 7a5a48f)
|
|
|
|
## Requirements (5)
|
|
F-AI-01, F-WF-01, F-CORE-01, F-CORE-06, F-TEST-01
|
|
|
|
## Acceptance Criteria (22)
|
|
### KI-Copilot (7 ACs)
|
|
1. POST /api/v1/ai/copilot/query mit NL input → 200 + proposed_actions array
|
|
2. POST /api/v1/ai/copilot/execute mit proposed action → 200 + API result (RBAC enforced)
|
|
3. POST /api/v1/ai/copilot/execute als viewer mit delete action → 403 (RBAC blocks)
|
|
4. GET /api/v1/ai/copilot/history → 200 + paginated conversation history
|
|
5. Copilot action logged in audit_log with entity_type=ai_copilot
|
|
6. Copilot respects tenant isolation: cross-tenant → 404
|
|
7. Copilot respects field-level permissions: hidden fields not in response
|
|
|
|
### Workflow Engine (15 ACs)
|
|
8. POST /api/v1/workflows mit valid steps JSONB → 201 + workflow definition
|
|
9. GET /api/v1/workflows → 200 + paginated list
|
|
10. GET /api/v1/workflows/{id} → 200 + workflow detail with steps
|
|
11. PATCH /api/v1/workflows/{id} → 200, updated
|
|
12. DELETE /api/v1/workflows/{id} → 204
|
|
13. POST /api/v1/workflows/{id}/instances → 201, instance created with status=pending
|
|
14. GET /api/v1/workflows/instances?status=in_progress → 200 + filtered list
|
|
15. GET /api/v1/workflows/instances/{id} → 200 + current_step_index + history
|
|
16. POST /api/v1/workflows/instances/{id}/advance (approve) → 200, step advanced
|
|
17. POST /api/v1/workflows/instances/{id}/advance (reject) → 200, status=rejected, initiator notified
|
|
18. POST /api/v1/workflows/instances/{id}/cancel → 200, status=cancelled
|
|
19. Event-triggered workflow: publish event → workflow instance auto-starts
|
|
20. workflow_step_history entry created on every step transition
|
|
21. Code-engine workflow: onboarding workflow runs on user creation
|
|
22. Approval step timeout → auto-reject after configured hours (tested with mock timer)
|
|
|
|
## Files to Create
|
|
### KI-Copilot
|
|
- app/models/ai_conversation.py — AIConversation, AIMessage models (tenant-scoped)
|
|
- app/schemas/ai_copilot.py — CopilotQueryRequest, CopilotAction, CopilotExecuteRequest, CopilotHistoryResponse
|
|
- app/services/ai_copilot_service.py — NL→API translation, LLM client, RBAC enforcement, audit logging
|
|
- app/routes/ai_copilot.py — POST /query, POST /execute, GET /history
|
|
- app/ai/__init__.py
|
|
- app/ai/llm_client.py — Configurable LLM client (AI_MODEL, AI_API_KEY env vars)
|
|
- app/ai/action_mapper.py — Maps NL intents to API calls
|
|
|
|
### Workflow Engine
|
|
- app/models/workflow.py — Workflow, WorkflowInstance, WorkflowStepHistory models (tenant-scoped)
|
|
- app/schemas/workflow.py — WorkflowCreate, WorkflowResponse, InstanceCreate, InstanceResponse, AdvanceRequest
|
|
- app/services/workflow_service.py — CRUD workflows, instance lifecycle (start/advance/approve/reject/cancel)
|
|
- app/routes/workflows.py — Workflow CRUD + instance endpoints
|
|
- app/workflows/__init__.py
|
|
- app/workflows/code/__init__.py — Code-engine workflows
|
|
- app/workflows/code/onboarding.py — Onboarding workflow (runs on user creation)
|
|
- app/workflows/engine.py — Workflow execution engine (step processing, conditions, approvals)
|
|
|
|
### Tests
|
|
- tests/test_ai_copilot.py — 7 AC tests + edge cases
|
|
- tests/test_workflows.py — 15 AC tests + edge cases
|
|
|
|
### Migration
|
|
- alembic/versions/0004_ai_workflows.py — ai_conversations, ai_messages, workflows, workflow_instances, workflow_step_history tables (all tenant-scoped with RLS)
|
|
|
|
## Files to Modify
|
|
- app/main.py — Register ai_copilot + workflows routers
|
|
- app/models/__init__.py — Add new model imports
|
|
- app/routes/__init__.py — Add new router imports
|
|
- app/schemas/__init__.py — Add new schema imports
|
|
- app/services/__init__.py — Add new service imports
|
|
- tests/conftest.py — Add new tables to TRUNCATE list
|
|
- app/core/event_bus.py — Add workflow event trigger integration (if not already present)
|
|
|
|
## LLM Client Design
|
|
- Read AI_MODEL and AI_API_KEY from environment
|
|
- If not set, use mock/stub mode (returns predefined actions for tests)
|
|
- Support OpenAI-compatible API (default)
|
|
- NL → proposed API calls: method, path, body, description
|
|
- Never execute directly — always return proposed actions for user confirmation
|
|
|
|
## Workflow Engine Design
|
|
- Step types: action, approval, notification, condition
|
|
- Workflow definition: JSONB steps array
|
|
- Instance lifecycle: pending → in_progress → completed/rejected/cancelled
|
|
- Event bus integration: subscribe to events, auto-start workflows with matching trigger
|
|
- Code-engine: hardcoded workflows in app/workflows/code/ (onboarding on user.created event)
|
|
- Approval timeout: configurable hours, auto-reject via ARQ scheduled job or mock timer in tests
|
|
|
|
## Critical Rules
|
|
- All POST routes MUST have status_code=201 (except execute/advance/cancel which are actions → 200)
|
|
- Use set_config() for tenant context, NOT SET LOCAL
|
|
- Use .com emails in tests, NOT .test
|
|
- All new tables MUST have tenant_id column + RLS policies
|
|
- Update tests/conftest.py TRUNCATE list with new tables
|
|
- Create Alembic migration 0004 for all new tables
|
|
- Copilot MUST enforce RBAC (same middleware, same permissions)
|
|
- Copilot MUST respect tenant isolation and field-level permissions
|
|
- Audit log entity_type=ai_copilot for all copilot actions
|
|
- Workflow mutations MUST be logged in workflow_step_history
|
|
- Idempotent where applicable
|
|
|
|
## Test Commands
|
|
cd /a0/usr/workdir/dev-projects/leocrm && python -m pytest tests/test_ai_copilot.py tests/test_workflows.py -v --tb=short
|
|
cd /a0/usr/workdir/dev-projects/leocrm && python -m pytest tests/ -v --tb=short (full suite regression)
|
|
|
|
## Coverage Target
|
|
80% for new modules
|
|
|
|
## Deliverables
|
|
1. All files listed above
|
|
2. Alembic migration 0004
|
|
3. tests/test_ai_copilot.py + tests/test_workflows.py covering all 22 ACs
|
|
4. Report: test results, AC coverage, files, bugs
|