fix: Pass user_id to Gemini for AI cost tracking

ZOPK news evaluation now properly attributes AI token usage
to the user who triggered the evaluation. This enables:
- Per-user cost tracking in AI monitoring dashboard
- User rankings by AI token consumption
- Company-level cost aggregation

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Maciej Pienczyn 2026-01-11 09:41:34 +01:00
parent b21b3739d7
commit 421d7c8e89

View File

@ -586,13 +586,14 @@ Przykłady odpowiedzi:
{{"relevant": false, "score": 1, "reason": "News sportowy bez związku z przemysłem"}}""" {{"relevant": false, "score": 1, "reason": "News sportowy bez związku z przemysłem"}}"""
def evaluate_news_relevance(news_item, gemini_service=None) -> Dict: def evaluate_news_relevance(news_item, gemini_service=None, user_id: int = None) -> Dict:
""" """
Evaluate a single news item for ZOPK relevance using Gemini AI. Evaluate a single news item for ZOPK relevance using Gemini AI.
Args: Args:
news_item: ZOPKNews object or dict with title, description, source_name, published_at news_item: ZOPKNews object or dict with title, description, source_name, published_at
gemini_service: Optional GeminiService instance (uses global if not provided) gemini_service: Optional GeminiService instance (uses global if not provided)
user_id: ID of the user triggering the evaluation (for cost tracking)
Returns: Returns:
Dict with keys: relevant (bool), reason (str), evaluated (bool) Dict with keys: relevant (bool), reason (str), evaluated (bool)
@ -636,7 +637,8 @@ def evaluate_news_relevance(news_item, gemini_service=None) -> Dict:
response = gemini_service.generate_text( response = gemini_service.generate_text(
prompt, prompt,
temperature=0.1, temperature=0.1,
feature='zopk_news_evaluation' feature='zopk_news_evaluation',
user_id=user_id
) )
# Parse JSON response # Parse JSON response
@ -717,7 +719,7 @@ def reevaluate_news_without_score(db_session, limit: int = 50, user_id: int = No
} }
for news in news_to_rescore: for news in news_to_rescore:
result = evaluate_news_relevance(news, gemini) result = evaluate_news_relevance(news, gemini, user_id=user_id)
if result['evaluated']: if result['evaluated']:
news.ai_relevant = result['relevant'] news.ai_relevant = result['relevant']
@ -798,7 +800,7 @@ def evaluate_pending_news(db_session, limit: int = 50, user_id: int = None) -> D
} }
for news in pending_news: for news in pending_news:
result = evaluate_news_relevance(news, gemini) result = evaluate_news_relevance(news, gemini, user_id=user_id)
if result['evaluated']: if result['evaluated']:
news.ai_relevant = result['relevant'] news.ai_relevant = result['relevant']