89 lines
2.8 KiB
Python
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 ...core.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
|
|
]
|