from langchain_openai import ChatOpenAI from pydantic import BaseModel, Field, SecretStr from langchain_core.output_parsers import PydanticOutputParser from langchain_core.prompts import PromptTemplate # LLM placeholder llm = ChatOpenAI( model="openai/gpt-oss-20b", base_url='https://platform.brojs.ru/jrnl-bh/api/inference/v1', api_key=SecretStr("jrnl_30283ab953615cbb6846ff9940a1eedce0b76d7b2f59a2394f29e74643e6a90d"), temperature=0.7, ) class PersonInfo(BaseModel): name: str = Field(description="Имя человека") age: int | None = Field(default=None, description="Возраст (необязательно)") profession: str = Field(description="Профессия") skills: list[str] = Field(description="Список навыков") class MeetingNotes(BaseModel): date: str = Field(description="Дата встречи в формате YYYY-MM-DD") participants: list[str] = Field(description="Участники встречи") topics: list[str] = Field(description="Обсуждаемые темы") decisions: list[str] = Field(description="Принятые решения") next_steps: list[str] = Field(description="Следующие шаги") person_parser = PydanticOutputParser(pydantic_object=PersonInfo) meeting_parser = PydanticOutputParser(pydantic_object=MeetingNotes) prompt_template = PromptTemplate( input_variables=["text", "format_instructions"], template="""Найди в тексте следующую информацию и верни её как JSON: {format_instructions} Текст: {text}""" ) def choose_parser(text: str): if any(word in text.lower() for word in ["meeting", "встреча", "собрание"]): return meeting_parser return person_parser def extract(text: str): parser = choose_parser(text) chain = prompt_template | llm | parser result = chain.invoke({"text": text, "format_instructions": parser.get_format_instructions()}) return result if __name__ == "__main__": examples = [ "Анна, 28 лет, Python-разработчик. Навыки: FastAPI, Docker.", """Meeting on 2024-05-27 Participants: Alice, Bob, Charlie Topics: Project roadmap, Budget allocation Decisions: Approve Q3 budget, Hire new devs Next steps: Send email to stakeholders, Update project plan""", ] for i, txt in enumerate(examples, 1): print(f"Example {i} input:") print(txt) obj = extract(txt) print("\nParsed object:") print(obj.model_dump()) print("-" * 40) # Interactive mode while True: user_input = input("Введите текст (или 'exit' для выхода): ").strip() if not user_input or user_input.lower() == "exit": break obj = extract(user_input) print("\nParsed object:") print(obj.model_dump())