# Парсер задания: сырой текст → TaskCard Модуль принимает неформальное описание учебного задания и возвращает структурированный объект `TaskCard` — без диалога, за один запрос к модели. ## Стек | Компонент | Библиотека | |-----------|------------| | Языковая модель | BroJS (`openai/gpt-oss-20b:free`) | | LLM-клиент | `langchain-openai` → `ChatOpenAI` | | Промпт | `langchain-core` → `PromptTemplate` | | Парсер | `langchain-core` → `PydanticOutputParser` | | Модель данных | `pydantic` → `BaseModel` | ## Структура TaskCard ```python 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 (валидированный объект) ``` ## Установка ```bash pip install -r requirements.txt ``` ## Переменные окружения | Переменная | Описание | |------------|----------| | `JOURNAL_MCP_PAT` | Токен доступа к BroJS LLM | Создай `.env`: ``` JOURNAL_MCP_PAT=jrnl_... ``` ## Запуск ```bash # Встроенный пример 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 Срок: к пятнице Тип сдачи: отчёт Критерии: полнота, пример кода ```