import os from langchain_openai import ChatOpenAI from langchain_core.messages import HumanMessage from langchain_output_parsers import PydanticOutputParser from pydantic import BaseModel, Field class TaskCard(BaseModel): title: str = Field(..., description="Title of the task") subject: str = Field(..., description="Subject area") deadline_hint: str | None = Field(None, description="Hint about deadline") deliverable_type: str = Field(..., description="What to submit (report, code, etc.)") grading_hints: list[str] = Field(default_factory=list, description="Hints for grading") 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_template = """ You are a task summarizer. Given the following informal description of an assignment, produce a JSON object matching TaskCard model. Description: {description} {format_instructions} """ prompt = prompt_template | llm | parser async def main(): description = "Сдайте к пятнице мини-отчёт по LangChain: 2 страницы, упор на агентов. Оценка: за полноту и за пример кода." result = await prompt.ainvoke({"description": description}) print(result["messages"][-1].content) if __name__ == "__main__": import asyncio asyncio.run(main())