固定登记模型并规范老师姓名
This commit is contained in:
@@ -13,6 +13,7 @@ from urllib import error, request
|
|||||||
from .config import ACCOUNTS_PATH, AI_REGISTER_MODEL, AI_REGISTER_TIMEOUT_SECONDS, CODEX_AUTH_PATH, CODEX_CONFIG_PATH
|
from .config import ACCOUNTS_PATH, AI_REGISTER_MODEL, AI_REGISTER_TIMEOUT_SECONDS, CODEX_AUTH_PATH, CODEX_CONFIG_PATH
|
||||||
from .data import (
|
from .data import (
|
||||||
SUBJECTS,
|
SUBJECTS,
|
||||||
|
canonical_teacher_name,
|
||||||
class_record_to_line,
|
class_record_to_line,
|
||||||
course_summary_to_class_record_line,
|
course_summary_to_class_record_line,
|
||||||
extract_course_summary_from_text,
|
extract_course_summary_from_text,
|
||||||
@@ -275,7 +276,7 @@ def _extract_student(text: str) -> str:
|
|||||||
|
|
||||||
def _extract_teacher(text: str) -> str:
|
def _extract_teacher(text: str) -> str:
|
||||||
match = TEACHER_RE.search(text)
|
match = TEACHER_RE.search(text)
|
||||||
return match.group("teacher") if match else ""
|
return canonical_teacher_name(match.group("teacher")) if match else ""
|
||||||
|
|
||||||
|
|
||||||
def _extract_subject(text: str) -> str:
|
def _extract_subject(text: str) -> str:
|
||||||
|
|||||||
+1
-1
@@ -18,7 +18,7 @@ OPERATION_LOGS_PATH = Path(os.getenv("OPERATION_LOGS_PATH", "/data/operation_log
|
|||||||
CODEX_CONFIG_PATH = Path(os.getenv("CODEX_CONFIG_PATH", "/run/codex/config.toml"))
|
CODEX_CONFIG_PATH = Path(os.getenv("CODEX_CONFIG_PATH", "/run/codex/config.toml"))
|
||||||
CODEX_AUTH_PATH = Path(os.getenv("CODEX_AUTH_PATH", "/run/codex/auth.json"))
|
CODEX_AUTH_PATH = Path(os.getenv("CODEX_AUTH_PATH", "/run/codex/auth.json"))
|
||||||
AI_REGISTER_TIMEOUT_SECONDS = float(os.getenv("AI_REGISTER_TIMEOUT_SECONDS", "8"))
|
AI_REGISTER_TIMEOUT_SECONDS = float(os.getenv("AI_REGISTER_TIMEOUT_SECONDS", "8"))
|
||||||
AI_REGISTER_MODEL = os.getenv("AI_REGISTER_MODEL", "").strip()
|
AI_REGISTER_MODEL = "gpt-5.4-mini"
|
||||||
|
|
||||||
BASIC_AUTH_PASSWORD = os.getenv("BASIC_AUTH_PASSWORD", "")
|
BASIC_AUTH_PASSWORD = os.getenv("BASIC_AUTH_PASSWORD", "")
|
||||||
ACCOUNTS_AUTH_PASSWORD = os.getenv("ACCOUNTS_AUTH_PASSWORD") or os.getenv("ACCOUNT_AUTH_PASSWORD", "")
|
ACCOUNTS_AUTH_PASSWORD = os.getenv("ACCOUNTS_AUTH_PASSWORD") or os.getenv("ACCOUNT_AUTH_PASSWORD", "")
|
||||||
|
|||||||
+13
-8
@@ -71,6 +71,11 @@ def canonical_name(name: str) -> str:
|
|||||||
return FALLBACK_ALIASES.get(text, text)
|
return FALLBACK_ALIASES.get(text, text)
|
||||||
|
|
||||||
|
|
||||||
|
def canonical_teacher_name(name: str) -> str:
|
||||||
|
text = canonical_name(name).strip()
|
||||||
|
return re.sub(r"(?:老师|教师)$", "", text).strip()
|
||||||
|
|
||||||
|
|
||||||
def parse_hours_text(text: str) -> float:
|
def parse_hours_text(text: str) -> float:
|
||||||
match = re.fullmatch(r"(\d+)小时(\d+)分", text.strip())
|
match = re.fullmatch(r"(\d+)小时(\d+)分", text.strip())
|
||||||
if not match:
|
if not match:
|
||||||
@@ -189,7 +194,7 @@ def read_classnotes(path: Path) -> list[ClassRecord]:
|
|||||||
student=canonical_name(match.group("student")),
|
student=canonical_name(match.group("student")),
|
||||||
duration=duration_text_from_minutes(true_minutes),
|
duration=duration_text_from_minutes(true_minutes),
|
||||||
duration_hours=round(true_minutes / 60.0, 2),
|
duration_hours=round(true_minutes / 60.0, 2),
|
||||||
teacher=match.group("teacher").strip(),
|
teacher=canonical_teacher_name(match.group("teacher")),
|
||||||
subject=match.group("subject").strip(),
|
subject=match.group("subject").strip(),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@@ -256,7 +261,7 @@ def read_teachers(path: Path) -> list[Teacher]:
|
|||||||
validate_teacher(
|
validate_teacher(
|
||||||
Teacher(
|
Teacher(
|
||||||
teacher_id=teacher_id,
|
teacher_id=teacher_id,
|
||||||
name=canonical_name(name),
|
name=canonical_teacher_name(name),
|
||||||
alias=alias.strip(),
|
alias=alias.strip(),
|
||||||
subjects=parse_teacher_subjects(subjects),
|
subjects=parse_teacher_subjects(subjects),
|
||||||
status=status,
|
status=status,
|
||||||
@@ -287,7 +292,7 @@ def parse_class_record_line(line: str) -> ClassRecord:
|
|||||||
raise ValueError(f"上课记录时长与时间段不一致: {line}")
|
raise ValueError(f"上课记录时长与时间段不一致: {line}")
|
||||||
|
|
||||||
student = canonical_name(match.group("student"))
|
student = canonical_name(match.group("student"))
|
||||||
teacher = match.group("teacher").strip()
|
teacher = canonical_teacher_name(match.group("teacher"))
|
||||||
subject = match.group("subject").strip()
|
subject = match.group("subject").strip()
|
||||||
if not student or not teacher or not subject:
|
if not student or not teacher or not subject:
|
||||||
raise ValueError(f"上课记录学生、老师、科目不能为空: {line}")
|
raise ValueError(f"上课记录学生、老师、科目不能为空: {line}")
|
||||||
@@ -1466,7 +1471,7 @@ def extract_course_summary_from_text(text: str, index: int = 0, known_students:
|
|||||||
|
|
||||||
def normalize_course_summary(raw: dict) -> dict:
|
def normalize_course_summary(raw: dict) -> dict:
|
||||||
student = canonical_name(str(raw.get("student") or "").strip())
|
student = canonical_name(str(raw.get("student") or "").strip())
|
||||||
teacher = canonical_name(str(raw.get("teacher") or "").strip())
|
teacher = canonical_teacher_name(str(raw.get("teacher") or "").strip())
|
||||||
subject = parse_subject_code(str(raw.get("subject") or "").strip())
|
subject = parse_subject_code(str(raw.get("subject") or "").strip())
|
||||||
body = str(raw.get("body") or raw.get("content") or "").strip()
|
body = str(raw.get("body") or raw.get("content") or "").strip()
|
||||||
if not student:
|
if not student:
|
||||||
@@ -1901,7 +1906,7 @@ def parse_course_summary_file_identity(root: Path, path: Path) -> dict:
|
|||||||
subject = ""
|
subject = ""
|
||||||
if len(parts) >= 3:
|
if len(parts) >= 3:
|
||||||
student = canonical_name(parts[0])
|
student = canonical_name(parts[0])
|
||||||
teacher = canonical_name("_".join(parts[1:-1]))
|
teacher = canonical_teacher_name("_".join(parts[1:-1]))
|
||||||
subject = parts[-1]
|
subject = parts[-1]
|
||||||
return {
|
return {
|
||||||
"student": student,
|
"student": student,
|
||||||
@@ -2037,7 +2042,7 @@ def course_summary_matched_fields(item: dict, q: str) -> list[str]:
|
|||||||
def course_summary_record_key(student: str, teacher: str, subject: str, date_iso: str, time_range: str) -> tuple[str, str, str, str, str]:
|
def course_summary_record_key(student: str, teacher: str, subject: str, date_iso: str, time_range: str) -> tuple[str, str, str, str, str]:
|
||||||
return (
|
return (
|
||||||
canonical_name(student.strip()),
|
canonical_name(student.strip()),
|
||||||
canonical_name(teacher.strip()),
|
canonical_teacher_name(teacher.strip()),
|
||||||
normalize_subject(subject.strip()),
|
normalize_subject(subject.strip()),
|
||||||
date_iso.strip(),
|
date_iso.strip(),
|
||||||
normalize_time_range_text(time_range) if time_range else "",
|
normalize_time_range_text(time_range) if time_range else "",
|
||||||
@@ -2210,7 +2215,7 @@ def query_course_summaries(
|
|||||||
item,
|
item,
|
||||||
keyword,
|
keyword,
|
||||||
canonical_name(student.strip()),
|
canonical_name(student.strip()),
|
||||||
canonical_name(teacher.strip()),
|
canonical_teacher_name(teacher.strip()),
|
||||||
subject.strip(),
|
subject.strip(),
|
||||||
normalized_from,
|
normalized_from,
|
||||||
normalized_to,
|
normalized_to,
|
||||||
@@ -2536,7 +2541,7 @@ def create_incomplete_course_summary_review_task(
|
|||||||
"time_range": str(raw.get("time_range") or raw.get("raw_time") or raw.get("time") or "").strip(),
|
"time_range": str(raw.get("time_range") or raw.get("raw_time") or raw.get("time") or "").strip(),
|
||||||
"duration_minutes": raw.get("duration_minutes"),
|
"duration_minutes": raw.get("duration_minutes"),
|
||||||
"duration": str(raw.get("duration") or "").strip(),
|
"duration": str(raw.get("duration") or "").strip(),
|
||||||
"teacher": canonical_name(str(raw.get("teacher") or "").strip()),
|
"teacher": canonical_teacher_name(str(raw.get("teacher") or "").strip()),
|
||||||
"subject": str(raw.get("subject") or "").strip(),
|
"subject": str(raw.get("subject") or "").strip(),
|
||||||
"group": str(raw.get("group") or "").strip(),
|
"group": str(raw.get("group") or "").strip(),
|
||||||
"sender": str(raw.get("sender") or raw.get("sender_name") or "").strip(),
|
"sender": str(raw.get("sender") or raw.get("sender_name") or "").strip(),
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ services:
|
|||||||
CODEX_CONFIG_PATH: ${CODEX_CONFIG_PATH:-/run/codex/config.toml}
|
CODEX_CONFIG_PATH: ${CODEX_CONFIG_PATH:-/run/codex/config.toml}
|
||||||
CODEX_AUTH_PATH: ${CODEX_AUTH_PATH:-/run/codex/auth.json}
|
CODEX_AUTH_PATH: ${CODEX_AUTH_PATH:-/run/codex/auth.json}
|
||||||
AI_REGISTER_TIMEOUT_SECONDS: ${AI_REGISTER_TIMEOUT_SECONDS:-8}
|
AI_REGISTER_TIMEOUT_SECONDS: ${AI_REGISTER_TIMEOUT_SECONDS:-8}
|
||||||
AI_REGISTER_MODEL: ${AI_REGISTER_MODEL:-}
|
AI_REGISTER_MODEL: gpt-5.4-mini
|
||||||
INGEST_AUTH_TOKEN: ${INGEST_AUTH_TOKEN:-}
|
INGEST_AUTH_TOKEN: ${INGEST_AUTH_TOKEN:-}
|
||||||
ports:
|
ports:
|
||||||
- "${APP_PORT:-18080}:8000"
|
- "${APP_PORT:-18080}:8000"
|
||||||
|
|||||||
Reference in New Issue
Block a user