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="Title of the assignment") subject: str = Field(..., description="Subject or topic of the assignment") deadline_hint: str = Field(..., description="Free‑form hint about deadline") deliverable_type: str = Field(..., description="What is to be submitted (report, code, presentation, etc.)") grading_hints: list[str] = Field(..., description="List of hints mentioned about grading") parser = PydanticOutputParser(pydantic_object=TaskCard) prompt = PromptTemplate( template=""" You are an assistant that extracts structured information from a short assignment description. Return the data in the following JSON format exactly: {format_instructions} Input: {input_text} """, input_variables=["input_text"], partial_variables={"format_instructions": parser.get_format_instructions()}, ) llm = ChatOpenAI(temperature=0) chain = prompt | llm | parser if __name__ == "__main__": sample = "Сдайте к пятнице мини-отчёт по LangChain: 2 страницы, упор на агентов. Оценка: за полноту и за пример кода." result = chain.invoke({"input_text": sample}) print("Parsed object:") print(result.model_dump()) print("\nHuman readable summary:") print(f"Title: {result.title}\nSubject: {result.subject}\nDeadline: {result.deadline_hint}\nDeliverable: {result.deliverable_type}\nGrading hints: {', '.join(result.grading_hints)}")