Парсер задания: сырой текст → TaskCard

Модуль принимает неформальное описание учебного задания и возвращает структурированный объект TaskCard — без диалога, за один запрос к модели.

Стек

Компонент Библиотека
Языковая модель BroJS (openai/gpt-oss-20b:free)
LLM-клиент langchain-openaiChatOpenAI
Промпт langchain-corePromptTemplate
Парсер langchain-corePydanticOutputParser
Модель данных pydanticBaseModel

Структура TaskCard

class TaskCard(BaseModel):
    title: str            # Краткое название (2–6 слов)
    subject: str          # Область знаний / технология
    deadline_hint: str    # Срок в свободной форме
    deliverable_type: str # Что сдать: отчёт, код, презентация…
    grading_hints: list[str]  # Критерии оценки
    notes: Optional[str]  # Дополнительные заметки

Цепочка обработки

task_text
    │
    ▼
PromptTemplate  ← format_instructions от PydanticOutputParser
    │
    ▼
ChatOpenAI (BroJS, один запрос)
    │
    ▼
PydanticOutputParser
    │
    ▼
TaskCard (валидированный объект)

Установка

pip install -r requirements.txt

Переменные окружения

Переменная Описание
JOURNAL_MCP_PAT Токен доступа к BroJS LLM

Создай .env:

JOURNAL_MCP_PAT=jrnl_...

Запуск

# Встроенный пример
python main.py

# Своё описание задания
python main.py "Сдайте до понедельника презентацию по RAG: 10 слайдов. Оценка: за полноту и визуализацию."

Пример вывода

Вход:
  Сдайте к пятнице мини-отчёт по LangChain: 2 страницы, упор на агентов.
  Оценка: за полноту и за пример кода.

─── Валидированный объект (model_dump) ─────────────────────
{
  "title": "Мини-отчёт по LangChain",
  "subject": "LangChain",
  "deadline_hint": "к пятнице",
  "deliverable_type": "отчёт",
  "grading_hints": ["полнота", "пример кода"],
  "notes": null
}

─── Человекочитаемая сводка ─────────────────────────────────
  Задача:       Мини-отчёт по LangChain
  Тема:         LangChain
  Срок:         к пятнице
  Тип сдачи:    отчёт
  Критерии:     полнота, пример кода
S
Description
BroJS homework task 69dd4221f309a98be0006b2e
Readme 68 KiB
Languages
Python 100%