82 lines
3.2 KiB
Python
82 lines
3.2 KiB
Python
from langchain_openai import ChatOpenAI
|
||
from pydantic import BaseModel, Field, SecretStr
|
||
from langchain.agents import create_agent
|
||
import sys
|
||
|
||
# LLM placeholder configuration
|
||
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,
|
||
)
|
||
|
||
# ---------- Pydantic models ----------
|
||
class PersonInfo(BaseModel):
|
||
"""Information about a person."""
|
||
name: str = Field(description="Full name of the person")
|
||
age: int | None = Field(default=None, description="Age in years, optional")
|
||
profession: str = Field(description="Current occupation or job title")
|
||
skills: list[str] = Field(description="List of professional skills")
|
||
|
||
class MeetingNotes(BaseModel):
|
||
"""Summary of a meeting."""
|
||
date: str = Field(description="Date of the meeting (ISO format)")
|
||
participants: list[str] = Field(description="Names of attendees")
|
||
topics: list[str] = Field(description="Main discussion topics")
|
||
decisions: list[str] = Field(description="Decisions made during the meeting")
|
||
next_steps: list[str] = Field(description="Action items for follow‑up")
|
||
|
||
# ---------- Agent creation ----------
|
||
agent_person = create_agent(
|
||
model=llm,
|
||
response_format=PersonInfo,
|
||
system_prompt="You are an assistant that extracts structured person information from a single sentence.",
|
||
)
|
||
|
||
agent_meeting = create_agent(
|
||
model=llm,
|
||
response_format=MeetingNotes,
|
||
system_prompt="You are an assistant that extracts structured meeting notes from a paragraph of text.",
|
||
)
|
||
|
||
# ---------- Simple heuristic to choose schema ----------
|
||
def detect_schema(text: str) -> str:
|
||
"""Return 'person' or 'meeting' based on simple keyword heuristics."""
|
||
lower = text.lower()
|
||
if any(word in lower for word in ("profession", "skills", "age")):
|
||
return "person"
|
||
if any(word in lower for word in ("meeting", "participants", "decisions", "next steps")):
|
||
return "meeting"
|
||
# Default to person if ambiguous
|
||
return "person"
|
||
|
||
# ---------- CLI ----------
|
||
def main():
|
||
examples = [
|
||
"Анна, 28 лет, Python-разработчик. Навыки: FastAPI, Docker.",
|
||
("Встреча с командой по проекту X прошла 2024-05-20.\n"
|
||
"Участники: Иван, Мария, Алексей.\n"
|
||
"Темы: планирование спринта, распределение задач.\n"
|
||
"Решения: назначить ответственных за каждый модуль.\n"
|
||
"Next steps: подготовить спецификации к 2024-05-27."),
|
||
]
|
||
|
||
if len(sys.argv) > 1:
|
||
texts = [" ".join(sys.argv[1:])]
|
||
else:
|
||
texts = examples
|
||
|
||
for txt in texts:
|
||
print("\n=== Input ===")
|
||
print(txt)
|
||
schema_type = detect_schema(txt)
|
||
agent = agent_person if schema_type == "person" else agent_meeting
|
||
result = agent.invoke({"messages": [{"role": "user", "content": txt}]})
|
||
structured = result["structured_response"]
|
||
print("\n=== Output ===")
|
||
print(structured.model_dump(indent=2))
|
||
print("\n---")
|
||
|
||
if __name__ == "__main__":
|
||
main() |