import os from pydantic import BaseModel, Field from langchain_core.prompts import PromptTemplate from langchain_openai import ChatOpenAI from langchain_core.output_parsers import PydanticOutputParser class TaskCard(BaseModel): title: str = Field(..., description="Краткое название задачи") subject: str = Field(..., description="Область знаний, к которой относится задача") deadline_hint: str = Field(..., description="Краткая подсказка о сроке выполнения") deliverable_type: str = Field(..., description="Тип сдачи: отчёт, код, презентация и т.п.") grading_hints: list[str] = Field(..., description="Список ключевых критериев оценки") # LLM configuration – BroJS llm = ChatOpenAI( model="openai/gpt-oss-20b:free", base_url="https://platform.brojs.ru/jrnl-bh/api/inference/v1", api_key=os.getenv("JOURNAL_MCP_PAT"), temperature=0.5, ) parser = PydanticOutputParser(pydantic_object=TaskCard) prompt = PromptTemplate( template=""" Ниже приведено описание задания от преподавателя. Нужно извлечь из него структуру задачи в виде JSON, соответствующую модели TaskCard. {format_instructions} Описание задания: {task_description} """, input_variables=["task_description"], partial_variables={"format_instructions": parser.get_format_instructions()}, ) chain = prompt | llm | parser if __name__ == "__main__": # Пример входа example = "Сдайте к пятнице мини-отчёт по LangChain: 2 страницы, упор на агентов. Оценка: за полноту и за пример кода." result: TaskCard = chain.invoke({"task_description": example}) print("\n--- Валидированный объект ---") print(result.model_dump()) print("\n--- Человекочитаемая сводка ---") print(f"Задача: {result.title}\nТема: {result.subject}\nСрок: {result.deadline_hint}\nТип сдачи: {result.deliverable_type}\nКритерии оценки: {', '.join(result.grading_hints)}")