コミットを比較
15 コミット
0dcc8656a1
...
main
| 作成者 | SHA1 | 日付 | |
|---|---|---|---|
| 1f75763038 | |||
| 5dae2ae038 | |||
| 559e96607f | |||
| 3d8032ffd4 | |||
| e4ac495194 | |||
| 83f06aa79b | |||
| 28ea19f135 | |||
| 1baa0fd832 | |||
| ff695263ec | |||
| 882409e1d4 | |||
| 3be6d9063c | |||
| 4e5bd13ab4 | |||
| 3fd16bd1c2 | |||
| 9e136a7cb3 | |||
| 58fb37296a |
@@ -3,7 +3,7 @@ from __future__ import annotations
|
|||||||
import os
|
import os
|
||||||
from typing import TypedDict
|
from typing import TypedDict
|
||||||
|
|
||||||
from eloquent import DatabaseManager, Model
|
from eloquent import DatabaseManager, Model # type: ignore
|
||||||
|
|
||||||
CONFIG: dict[str, DbConfig] = { 'mysql': { 'driver': 'mysql',
|
CONFIG: dict[str, DbConfig] = { 'mysql': { 'driver': 'mysql',
|
||||||
'host': 'localhost',
|
'host': 'localhost',
|
||||||
|
|||||||
@@ -5,4 +5,3 @@ OPENAI_ORGANISATION: str = 'org-XXXXXXXXXXXXXXXXXXXXXXXX'
|
|||||||
|
|
||||||
# API Key
|
# API Key
|
||||||
OPENAI_API_KEY: str = 'sk-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
|
OPENAI_API_KEY: str = 'sk-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,6 @@
|
|||||||
from enum import Enum
|
from enum import Enum
|
||||||
|
|
||||||
|
|
||||||
class AnswerType (Enum):
|
|
||||||
YOUTUBE_REPLY = 1
|
|
||||||
BLUESKY_REPLY = 2
|
|
||||||
YOUTUBE_SYSTEM = 3
|
|
||||||
BLUESKY_SYSTEM = 4
|
|
||||||
|
|
||||||
|
|
||||||
class Character (Enum):
|
class Character (Enum):
|
||||||
DEERJIKA = 1
|
DEERJIKA = 1
|
||||||
GOATOH = 2
|
GOATOH = 2
|
||||||
@@ -27,4 +20,8 @@ class QueryType (Enum):
|
|||||||
YOUTUBE_COMMENT = 1
|
YOUTUBE_COMMENT = 1
|
||||||
BLUESKY_COMMENT = 2
|
BLUESKY_COMMENT = 2
|
||||||
YOUTUBE_SYSTEM = 3
|
YOUTUBE_SYSTEM = 3
|
||||||
BLUESKY_SYSTEM = 3
|
BLUESKY_SYSTEM = 4
|
||||||
|
KIRIBAN = 5
|
||||||
|
NICO_REPORT = 6
|
||||||
|
SNACK_TIME = 7
|
||||||
|
HOT_SPRING = 8
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from config import CONFIG
|
||||||
|
from eloquent import DatabaseManager, Schema
|
||||||
|
|
||||||
|
DB = DatabaseManager (CONFIG)
|
||||||
|
SCHEMA = Schema (DB)
|
||||||
|
|
||||||
|
|
||||||
|
with SCHEMA.table ('queries') as t:
|
||||||
|
t.json ('transfer_data').nullable ().default (None).comment ('受渡しデータ')
|
||||||
@@ -2,7 +2,8 @@ from __future__ import annotations
|
|||||||
|
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
from eloquent import Model
|
from eloquent import Model # type: ignore
|
||||||
|
from eloquent.query import QueryBuilder # type: ignore
|
||||||
|
|
||||||
from .config import DB
|
from .config import DB
|
||||||
|
|
||||||
@@ -27,16 +28,21 @@ class Answer (Model):
|
|||||||
query_id: int
|
query_id: int
|
||||||
character: int
|
character: int
|
||||||
content: str
|
content: str
|
||||||
answer_type: int
|
|
||||||
sent_at: datetime
|
sent_at: datetime
|
||||||
|
|
||||||
__timestamps__ = False
|
__timestamps__ = False
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def query (
|
def query_rel (
|
||||||
self,
|
self,
|
||||||
) -> Query:
|
) -> Query:
|
||||||
return self.belongs_to (Query)
|
return self.belongs_to (Query, 'query_id')
|
||||||
|
|
||||||
|
@property
|
||||||
|
def answered_flags (
|
||||||
|
self,
|
||||||
|
) -> list[AnsweredFlag]:
|
||||||
|
return self.has_many (AnsweredFlag)
|
||||||
|
|
||||||
def answered (
|
def answered (
|
||||||
self,
|
self,
|
||||||
@@ -60,7 +66,9 @@ class Query (Model):
|
|||||||
model: int
|
model: int
|
||||||
sent_at: datetime
|
sent_at: datetime
|
||||||
answered: bool
|
answered: bool
|
||||||
|
transfer_data: dict[str, str] | None
|
||||||
|
|
||||||
|
__casts__ = { 'transfer_data': 'json' }
|
||||||
__timestamps__ = False
|
__timestamps__ = False
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@@ -84,10 +92,10 @@ class QueryAnswerHistory (Model):
|
|||||||
__timestamps__ = False
|
__timestamps__ = False
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def query (
|
def query_rel (
|
||||||
self,
|
self,
|
||||||
) -> Query:
|
) -> Query:
|
||||||
return self.belongs_to (Query)
|
return self.belongs_to (Query, 'query_id')
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def answer (
|
def answer (
|
||||||
|
|||||||
@@ -1,87 +0,0 @@
|
|||||||
from __future__ import annotations
|
|
||||||
|
|
||||||
import random
|
|
||||||
from datetime import datetime
|
|
||||||
from typing import TypedDict
|
|
||||||
|
|
||||||
from .config import DB
|
|
||||||
from .consts import AnswerType, Character, Platform
|
|
||||||
from .models import Answer, AnsweredFlag, Query, User
|
|
||||||
from .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:
|
|
||||||
print (answer.answer_type)
|
|
||||||
if answer.answer_type in [AnswerType.YOUTUBE_REPLY]:
|
|
||||||
add_answered_flag (answer, Platform.YOUTUBE)
|
|
||||||
if answer.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 ()
|
|
||||||
新しい課題から参照
ユーザをブロックする