PMFlow/backend/app/api/signals_api/feedback.py

89 lines
2.8 KiB
Python

"""Signal feedback endpoints."""
from __future__ import annotations
import json
from typing import List
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select
from ...database import get_db
from ...models import Signal, SignalFeedback
from ...schemas import SignalFeedbackCreate, SignalFeedbackResponse
router = APIRouter()
@router.post("/{signal_id}/feedback", response_model=SignalFeedbackResponse)
async def submit_signal_feedback(
signal_id: int,
feedback: SignalFeedbackCreate,
db: AsyncSession = Depends(get_db),
):
"""提交信号反馈"""
result = await db.execute(select(Signal).where(Signal.id == signal_id))
signal = result.scalar_one_or_none()
if not signal:
raise HTTPException(status_code=404, detail="Signal not found")
ai_predicted_strategic = False
ai_confidence = 0.0
if signal.strategic_analysis:
try:
analysis = json.loads(signal.strategic_analysis)
ai_predicted_strategic = analysis.get("is_strategic", signal.impact_score >= 0.9)
ai_confidence = analysis.get("confidence", 0.0)
except Exception:
ai_predicted_strategic = signal.impact_score >= 0.9
new_feedback = SignalFeedback(
signal_id=signal_id,
was_strategic=feedback.was_strategic,
reason=feedback.reason,
user_id=feedback.user_id,
ai_predicted_strategic=ai_predicted_strategic,
ai_confidence=ai_confidence,
)
db.add(new_feedback)
await db.commit()
await db.refresh(new_feedback)
is_correct = ai_predicted_strategic == feedback.was_strategic
return SignalFeedbackResponse(
id=new_feedback.id,
signal_id=new_feedback.signal_id,
was_strategic=new_feedback.was_strategic,
ai_predicted_strategic=new_feedback.ai_predicted_strategic,
ai_confidence=new_feedback.ai_confidence,
is_correct=is_correct,
)
@router.get("/{signal_id}/feedbacks", response_model=List[SignalFeedbackResponse])
async def get_signal_feedbacks(
signal_id: int,
db: AsyncSession = Depends(get_db),
):
"""获取某信号的全部反馈"""
result = await db.execute(
select(SignalFeedback)
.where(SignalFeedback.signal_id == signal_id)
.order_by(SignalFeedback.created_at.desc())
)
feedbacks = result.scalars().all()
return [
SignalFeedbackResponse(
id=feedback.id,
signal_id=feedback.signal_id,
was_strategic=feedback.was_strategic,
ai_predicted_strategic=feedback.ai_predicted_strategic,
ai_confidence=feedback.ai_confidence or 0.0,
is_correct=feedback.ai_predicted_strategic == feedback.was_strategic,
)
for feedback in feedbacks
]