add models.py

This commit is contained in:
2026-05-27 13:54:50 +00:00
parent 58a12482a2
commit 31fb3c8921
+39 -56
View File
@@ -1,61 +1,44 @@
import os """
Pydantic model representing a structured assignment card.
Fields:
- title: short title of the task (string)
- subject: main topic or subject area (string, optional)
- deadline_hint: freeform hint about due date (string, optional)
- deliverable_type: what is expected to be submitted (string, optional)
- grading_hints: list of strings describing evaluation criteria (list[str], optional)
"""
from __future__ import annotations
from typing import List, Optional from typing import List, Optional
from pydantic import BaseModel, Field, validator
class TaskCard(BaseModel): from pydantic import BaseModel, Field
"""Pydantic model representing a structured task card.
Attributes class AssignmentCard(BaseModel):
---------- """Structured representation of an informal assignment description."""
title: str
Short title of the task (max 10 words).
subject: str
Subject or topic of the task.
deadline: Optional[str]
Deadline string if mentioned, otherwise None.
deliverable: str
What needs to be submitted.
requirements: List[str]
List of concrete requirements extracted from the raw text.
difficulty: str
Difficulty level: "легко", "средне" or "сложно".
grading_criteria: Optional[str]
Grading criteria if present.
tags: List[str]
Tags describing the task.
"""
title: str = Field(..., description="Short title of the task (max 10 words)") title: str = Field(..., description="Short title or main action of the task")
subject: str = Field(..., description="Subject or topic of the task") subject: Optional[str] = Field(None, description="Primary subject or topic of the task")
deadline: Optional[str] = Field(None, description="Deadline if mentioned") deadline_hint: Optional[str] = Field(
deliverable: str = Field(..., description="What needs to be submitted") None,
requirements: List[str] = Field(default_factory=list, description="Concrete requirements") description="Freeform hint about when the task is due (e.g., 'к пятнице')",
difficulty: str = Field(..., description="Difficulty level: легко, средне, сложно") )
grading_criteria: Optional[str] = Field(None, description="Grading criteria if present") deliverable_type: Optional[str] = Field(
tags: List[str] = Field(default_factory=list, description="Tags describing the task") None, description="What should be submitted: report, code, presentation, etc."
)
grading_hints: List[str] = Field(
default_factory=list,
description="List of evaluation criteria mentioned in the text",
)
@validator("title") class Config:
def title_word_limit(cls, v: str) -> str: arbitrary_types_allowed = True
if len(v.split()) > 10: json_schema_extra = {
raise ValueError("Title must be at most 10 words") "example": {
return v "title": "Мини‑отчёт по LangChain",
"subject": "LangChain",
def to_markdown(self) -> str: "deadline_hint": "к пятнице",
"""Return a nicely formatted Markdown representation of the card.""" "deliverable_type": "отчёт",
md = [f"## {self.title}"] "grading_hints": ["полнота", "пример кода"],
md.append(f"**Предмет:** {self.subject}") }
if self.deadline: }
md.append(f"**Дедлайн:** {self.deadline}")
md.append(f"**Сдать:** {self.deliverable}")
if self.requirements:
md.append("**Требования:**")
for req in self.requirements:
md.append(f"- {req}")
md.append(f"**Сложность:** {self.difficulty}")
if self.grading_criteria:
md.append(f"**Критерии оценки:** {self.grading_criteria}")
if self.tags:
md.append("**Теги:** " + ", ".join(self.tags))
return "\n".join(md)
# End of models.py