feat: 故障推送 / 公需课自动重学 / 插件解耦,发版 v0.0.8

体检修复:启动日志不再打印 AUTH_TOKEN、密钥可清空、推送失败不占整段冷却、目录名与文案统一成 plugins/。
This commit is contained in:
study-tool
2026-11-01 17:47:22 +08:00
parent 491fd08c1e
commit aa48145557
114 changed files with 7779 additions and 3302 deletions
+33 -42
View File
@@ -1,24 +1,22 @@
"""HTTP 请求模型(Pydantic)。"""
from pydantic import BaseModel
# ------------------------------------------------------------------------ models
# models
class LoginIn(BaseModel):
username: str = ""
password: str = ""
account_id: str = "" # 只给账号 id 时,用户名/密码从 SQLite 里取,密码不出库
platform: str = "guanyixue" # 没传 account_id 时按它选平台
class AccountsIn(BaseModel):
accounts: list = []
account_id: str = "" # 只给账号 id 时,用户名/密码从 SQLite 里取,密码不出库
platform: str = "" # 没传 account_id 时按它选平台
class AccountIn(BaseModel):
id: str = ""
username: str = ""
platform: str = "guanyixue" # 添加账号时选的平台
password: str | None = None # 不传 = 保留库里已有的密码
platform: str = "" # 添加账号时选的平台
password: str | None = None # 不传 = 保留库里已有的密码
note: str = ""
user: str = ""
cookies: list = []
@@ -35,7 +33,7 @@ class AccountIn(BaseModel):
class CookiesIn(BaseModel):
cookies: list
platform: str = "guanyixue"
platform: str = ""
class DiscoverIn(BaseModel):
@@ -43,22 +41,22 @@ class DiscoverIn(BaseModel):
plan_id: str
project_id: str
name: str = ""
platform: str = "guanyixue"
platform: str = ""
class StudyIn(BaseModel):
key: str
username: str = ""
password: str = "" # 仅用于会话失效时自动重登,不落盘
password: str = "" # 仅用于会话失效时自动重登,不落盘
cookies: list = []
courses: list = [] # [{name, plan_id, project_id}]
courses: list = [] # [{name, plan_id, project_id}]
plan_id: str = ""
project_id: str = ""
workers: int = 40
cap_minutes: int = 90
quiz_key: dict | None = None
enable_quiz: bool = False # 默认关闭:答题正确率无法保证
enable_feedback: bool = True # 反馈表无对错,默认开启
enable_quiz: bool = False # 默认关闭:答题正确率无法保证
enable_feedback: bool = True # 反馈表无对错,默认开启
class StopIn(BaseModel):
@@ -68,44 +66,37 @@ class StopIn(BaseModel):
class CaptureIn(BaseModel):
key: str
cookies: list = []
minutes: int = 10 # 抓包最长分钟数(1~30)
minutes: int = 10 # 抓包最长分钟数(1~30)
class QuizIn(BaseModel):
cookies: list = []
plan_id: str = ""
project_id: str = ""
name: str = ""
platform: str = "guanyixue"
# retake=True:交卷后点「再考一次」,让平台生成新答卷(消耗一次机会)
retake: bool = False
period_id: str = "" # 指定要重考/查看的课时(不传就按原逻辑挑第一个)
class NotifyCfgIn(BaseModel):
"""故障推送配置;空串 / 0 / None 都表示「不改」,避免只保存模型设置时被清空。"""
class QuizSubmitIn(BaseModel):
cookies: list = []
plan_id: str = ""
object_id: str = ""
generation: str = "legacy" # legacy / spa,决定走旧版还是新版交卷接口
result_id: str = ""
answers: dict = {} # {"1": "A", "2": "A#C"}
class QuizAnswerIn(BaseModel):
questions: list = [] # [{no,type,title,options:[{key,text}]}]
prompt: str = ""
account_id: str = "" # 有账号就把日志写进它的「课程日志」,没有就写 key=ai
base_url: str = ""
app_key: str = ""
app_secret: str = "" # 留空 = 保留原密钥,前端不回显明文
channel_name: str = ""
enabled: bool | None = None
on_error: bool | None = None
on_login: bool | None = None
on_progress: bool | None = None
on_retry: bool | None = None
retry_threshold: int = 0
cooldown_min: int = 0
clear_app_secret: bool = False # True = 清掉已保存的 app_secret
class LlmCfgIn(BaseModel):
base_url: str = ""
api_key: str = ""
model: str = ""
temperature: float = 0.2
temperature: float = 0.2 # 0 = 不改
timeout: int = 120
clear_api_key: bool = False # True = 清掉已保存的 api_key
prompt: str = ""
study_mode: str = "" # "" = 不改;fast / normal
study_parallel: int = 0 # 0 = 不改;1~5
study_mode: str = "" # "" = 不改;fast / normal
study_parallel: int = 0 # 0 = 不改;1~5
notify: NotifyCfgIn | None = None # 不传 = 不动推送配置
class LlmTestIn(BaseModel):