add parser.py

This commit is contained in:
2026-05-27 14:04:14 +00:00
parent 589c9135aa
commit 831348a539
+14 -29
View File
@@ -1,50 +1,35 @@
import os import os
import json
from typing import List
from langchain_openai import ChatOpenAI from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import JsonOutputParser
from langchain_core.prompts import PromptTemplate from langchain_core.prompts import PromptTemplate
from pydantic import BaseModel from langchain.output_parsers import PydanticOutputParser
from models import TaskCard from models import TaskCard
from typing import List
class TaskParser: class TaskParser:
"""Parser that converts raw task descriptions into TaskCard objects using a LLM.""" """Converts raw task text into a TaskCard using LangChain."""
def __init__(self) -> None: def __init__(self) -> None:
self.llm = ChatOpenAI( self.llm = ChatOpenAI(
model="openai/gpt-oss-20b:free", model="openai/gpt-oss-20b:free",
base_url="https://platform.brojs.ru/jrnl-bh/api/inference/v1", base_url="https://platform.brojs.ru/jrnl-bh/api/inference/v1",
api_key=os.getenv("JOURNAL_MCP_PAT"), api_key=os.getenv("JOURNAL_MCP_PAT"),
temperature=0.1, temperature=0.0,
) )
self.parser = JsonOutputParser(pydantic_object=TaskCard) self.output_parser = PydanticOutputParser(pydantic_object=TaskCard)
self.prompt = PromptTemplate( self.prompt = PromptTemplate(
template=(
"Parse the following raw task description into a structured card.\n"
"{format_instructions}\n\nRaw text:\n{raw_text}\n\nJSON:"
),
input_variables=["raw_text"], input_variables=["raw_text"],
template=""" partial_variables={"format_instructions": self.output_parser.get_format_instructions()},
Parse the following raw task description into a JSON object matching the TaskCard schema.
The output must be valid JSON and contain all required fields.
If a field cannot be determined, use null for optional fields or an empty list for lists.
Raw text:
{raw_text}
JSON output:
""",
) )
self.chain = self.prompt | self.llm | self.output_parser
def _run_llm(self, raw_text: str) -> TaskCard:
chain = self.prompt | self.llm | self.parser
return chain.invoke({"raw_text": raw_text})
def parse(self, raw_text: str) -> TaskCard: def parse(self, raw_text: str) -> TaskCard:
return self._run_llm(raw_text) """Parse a single raw task description."""
return self.chain.invoke({"raw_text": raw_text})
def batch_parse(self, texts: List[str]) -> List[TaskCard]: def batch_parse(self, texts: List[str]) -> List[TaskCard]:
"""Parse multiple raw task descriptions."""
return [self.parse(t) for t in texts] return [self.parse(t) for t in texts]
def save_to_file(self, card: TaskCard, filename: str) -> None:
with open(filename, "w", encoding="utf-8") as f:
json.dump(card.dict(), f, ensure_ascii=False, indent=2)
# End of parser.py