194 lines
6.0 KiB
Python
194 lines
6.0 KiB
Python
"""
|
|
Feedback-related API endpoints.
|
|
"""
|
|
|
|
from typing import List, Dict, Any
|
|
from fastapi import APIRouter, HTTPException, Depends, status
|
|
from pydantic import BaseModel
|
|
|
|
from app.services.prompt_service import PromptService
|
|
from app.models.prompt import FeedbackWord, RateFeedbackWordsRequest, RateFeedbackWordsResponse
|
|
|
|
# Create router
|
|
router = APIRouter()
|
|
|
|
# Response models
|
|
class GenerateFeedbackWordsResponse(BaseModel):
|
|
"""Response model for generating feedback words."""
|
|
theme_words: List[str]
|
|
count: int = 6
|
|
|
|
class FeedbackQueuedWordsResponse(BaseModel):
|
|
"""Response model for queued feedback words."""
|
|
queued_words: List[FeedbackWord]
|
|
count: int
|
|
|
|
class FeedbackActiveWordsResponse(BaseModel):
|
|
"""Response model for active feedback words."""
|
|
active_words: List[FeedbackWord]
|
|
count: int
|
|
|
|
class FeedbackHistoricResponse(BaseModel):
|
|
"""Response model for full feedback history."""
|
|
feedback_history: List[Dict[str, Any]]
|
|
count: int
|
|
|
|
# Service dependency
|
|
async def get_prompt_service() -> PromptService:
|
|
"""Dependency to get PromptService instance."""
|
|
return PromptService()
|
|
|
|
@router.get("/queued", response_model=FeedbackQueuedWordsResponse)
|
|
async def get_queued_feedback_words(
|
|
prompt_service: PromptService = Depends(get_prompt_service)
|
|
):
|
|
"""
|
|
Get queued feedback words (positions 0-5) for user weighting.
|
|
|
|
Returns:
|
|
List of queued feedback words with weights
|
|
"""
|
|
try:
|
|
# Get queued feedback words from PromptService
|
|
queued_feedback_items = await prompt_service.get_feedback_queued_words()
|
|
|
|
# Convert to FeedbackWord models
|
|
queued_words = []
|
|
for i, item in enumerate(queued_feedback_items):
|
|
key = list(item.keys())[0]
|
|
word = item[key]
|
|
weight = item.get("weight", 3) # Default weight is 3
|
|
queued_words.append(FeedbackWord(key=key, word=word, weight=weight))
|
|
|
|
return FeedbackQueuedWordsResponse(
|
|
queued_words=queued_words,
|
|
count=len(queued_words)
|
|
)
|
|
except Exception as e:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
detail=f"Error getting queued feedback words: {str(e)}"
|
|
)
|
|
|
|
@router.get("/active", response_model=FeedbackActiveWordsResponse)
|
|
async def get_active_feedback_words(
|
|
prompt_service: PromptService = Depends(get_prompt_service)
|
|
):
|
|
"""
|
|
Get active feedback words (positions 6-11) for prompt generation.
|
|
|
|
Returns:
|
|
List of active feedback words with weights
|
|
"""
|
|
try:
|
|
# Get active feedback words from PromptService
|
|
active_feedback_items = await prompt_service.get_feedback_active_words()
|
|
|
|
# Convert to FeedbackWord models
|
|
active_words = []
|
|
for i, item in enumerate(active_feedback_items):
|
|
key = list(item.keys())[0]
|
|
word = item[key]
|
|
weight = item.get("weight", 3) # Default weight is 3
|
|
active_words.append(FeedbackWord(key=key, word=word, weight=weight))
|
|
|
|
return FeedbackActiveWordsResponse(
|
|
active_words=active_words,
|
|
count=len(active_words)
|
|
)
|
|
except Exception as e:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
detail=f"Error getting active feedback words: {str(e)}"
|
|
)
|
|
|
|
@router.get("/generate", response_model=GenerateFeedbackWordsResponse)
|
|
async def generate_feedback_words(
|
|
prompt_service: PromptService = Depends(get_prompt_service)
|
|
):
|
|
"""
|
|
Generate 6 theme feedback words using AI.
|
|
|
|
Returns:
|
|
List of 6 theme words for feedback
|
|
"""
|
|
try:
|
|
theme_words = await prompt_service.generate_theme_feedback_words()
|
|
|
|
if len(theme_words) != 6:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
detail=f"Expected 6 theme words, got {len(theme_words)}"
|
|
)
|
|
|
|
return GenerateFeedbackWordsResponse(
|
|
theme_words=theme_words,
|
|
count=len(theme_words)
|
|
)
|
|
except ValueError as e:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_400_BAD_REQUEST,
|
|
detail=str(e)
|
|
)
|
|
except Exception as e:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
detail=f"Error generating feedback words: {str(e)}"
|
|
)
|
|
|
|
@router.post("/rate", response_model=RateFeedbackWordsResponse)
|
|
async def rate_feedback_words(
|
|
request: RateFeedbackWordsRequest,
|
|
prompt_service: PromptService = Depends(get_prompt_service)
|
|
):
|
|
"""
|
|
Rate feedback words and update feedback system.
|
|
|
|
Args:
|
|
request: Dictionary of word to rating (0-6)
|
|
|
|
Returns:
|
|
Updated feedback words
|
|
"""
|
|
try:
|
|
feedback_words = await prompt_service.update_feedback_words(request.ratings)
|
|
|
|
return RateFeedbackWordsResponse(
|
|
feedback_words=feedback_words,
|
|
added_to_history=True
|
|
)
|
|
except ValueError as e:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_400_BAD_REQUEST,
|
|
detail=str(e)
|
|
)
|
|
except Exception as e:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
detail=f"Error rating feedback words: {str(e)}"
|
|
)
|
|
|
|
@router.get("/history", response_model=FeedbackHistoricResponse)
|
|
async def get_feedback_history(
|
|
prompt_service: PromptService = Depends(get_prompt_service)
|
|
):
|
|
"""
|
|
Get full feedback word history.
|
|
|
|
Returns:
|
|
Full feedback history with weights
|
|
"""
|
|
try:
|
|
feedback_historic = await prompt_service.get_feedback_historic()
|
|
|
|
return FeedbackHistoricResponse(
|
|
feedback_history=feedback_historic,
|
|
count=len(feedback_historic)
|
|
)
|
|
except Exception as e:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
detail=f"Error getting feedback history: {str(e)}"
|
|
)
|
|
|