| @@ -1,91 +0,0 @@ | |||
| from __future__ import annotations | |||
| import random | |||
| from datetime import datetime | |||
| from typing import TypedDict | |||
| from nizika_ai.config import DB | |||
| from nizika_ai.consts import AnswerType, Character, Platform | |||
| from nizika_ai.models import Answer, AnsweredFlag, Query, User | |||
| from nizika_ai.talk import Talk | |||
| def main ( | |||
| ) -> None: | |||
| DB.begin_transaction () | |||
| queries: list[Query] = Query.where ('answered', False).get () | |||
| if not queries: | |||
| return | |||
| query: Query = random.choice (queries) | |||
| user: User = query.user | |||
| user_name: str | None = None | |||
| if query.user_id is not None: | |||
| user_name = user.name | |||
| histories: list[History] = [] | |||
| for history in query.answer_histories: | |||
| if history.query is not None: | |||
| histories.append ({ 'role': 'user', 'content': history.query.content }) | |||
| histories.append ({ 'role': 'assistant', 'content': history.content }) | |||
| for character in [Character.DEERJIKA, Character.GOATOH]: | |||
| if query.target_character & character.value: | |||
| add_answer (query, character, user_name, histories) | |||
| query.answered = True | |||
| query.save () | |||
| DB.commit () | |||
| def add_answer ( | |||
| query: Query, | |||
| character: Character, | |||
| user_name: str | None, | |||
| histories: list[History], | |||
| ) -> None: | |||
| message: str | list[dict[str, str | dict[str, str]]] | |||
| if query.image_url is None: | |||
| message = query.content | |||
| else: | |||
| message = [{ 'type': 'text', 'text': query.content }, | |||
| { 'type': 'image_url', 'image_url': query.image_url }] | |||
| answer = Answer () | |||
| answer.query_id = query.id | |||
| answer.character = character.value | |||
| answer.content = Talk.main (message, user_name, histories, | |||
| goatoh_mode = character == Character.GOATOH) | |||
| answer.answer_type = query.query_type | |||
| answer.sent_at = datetime.now () | |||
| answer.save () | |||
| add_answered_flags (answer) | |||
| def add_answered_flags ( | |||
| answer: Answer, | |||
| ) -> None: | |||
| answer_type: AnswerType | |||
| try: | |||
| answer_type = AnswerType (answer.answer_type) | |||
| except Exception: | |||
| return | |||
| if answer_type in [AnswerType.YOUTUBE_REPLY]: | |||
| add_answered_flag (answer, Platform.YOUTUBE) | |||
| if answer_type in [AnswerType.BLUESKY_REPLY]: | |||
| add_answered_flag (answer, Platform.BLUESKY) | |||
| def add_answered_flag ( | |||
| answer: Answer, | |||
| platform: Platform, | |||
| ) -> None: | |||
| answered_flag = AnsweredFlag () | |||
| answered_flag.answer_id = answer.id | |||
| answered_flag.platform = platform.value | |||
| answered_flag.answered = False | |||
| answered_flag.save () | |||
| class History (TypedDict): | |||
| role: str | |||
| content: str | |||
| if __name__ == '__main__': | |||
| main () | |||