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 llm = ChatOpenAI( model="openai/gpt-oss-20b:free", base_url="https://openrouter.ai/api/v1", api_key=os.getenv("OPENAI_API_KEY"), temperature=0.0, ) parser = PydanticOutputParser(pydantic_object=TaskCard) prompt = PromptTemplate( template=""" Дан текст задания от преподавателя. Нужно извлечь из него следующую информацию: - title: название задачи - subject: предмет - deadline_hint: подсказка о сроке - deliverable_type: тип сдачи - grading_hints: список критериев оценки Текст задания: {input_text} Выведите только JSON, соответствующий модели TaskCard. Используйте формат: {format_instructions} """, input_variables=["input_text"], partial_variables={"format_instructions": parser.get_format_instructions()}, ) chain = prompt | llm | parser if __name__ == "__main__": # Пример входа example_text = "Сдайте к пятнице мини-отчёт по LangChain: 2 страницы, упор на агентов. Оценка: за полноту и за пример кода." result = chain.invoke({"input_text": example_text}) print("Parsed object:") print(result.model_dump()) print("\nКраткая сводка:") print(f"Title: {result.title}") print(f"Subject: {result.subject}") print(f"Deadline: {result.deadline_hint}") print(f"Deliverable: {result.deliverable_type}") print(f"Grading hints: {', '.join(result.grading_hints)}")