add src/main.py
This commit is contained in:
+104
@@ -0,0 +1,104 @@
|
||||
"""Main module for task 69dd4221f309a98be0006b2e.
|
||||
|
||||
This module defines a Pydantic model representing a task card and a function
|
||||
`parse_task_description` that takes a natural‑language description of a
|
||||
task and returns a validated instance of the model.
|
||||
|
||||
The implementation uses LangChain's structured output parser to guarantee
|
||||
that the LLM returns data in the expected format.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from dataclasses import dataclass
|
||||
from typing import List, Optional
|
||||
|
||||
from langchain_core.prompts import PromptTemplate
|
||||
from langchain_openai import ChatOpenAI
|
||||
from langchain_core.output_parsers import PydanticOutputParser
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Pydantic model
|
||||
# ---------------------------------------------------------------------------
|
||||
class TaskCard(BaseModel):
|
||||
"""Structured representation of a task description.
|
||||
|
||||
The field names are chosen to be concise yet expressive. All fields are
|
||||
optional because the LLM may not mention every piece of information.
|
||||
"""
|
||||
|
||||
title: Optional[str] = Field(None, description="Short title of the task")
|
||||
subject: Optional[str] = Field(None, description="Subject or domain of the task")
|
||||
deadline_hint: Optional[str] = Field(
|
||||
None, description="Human‑readable hint about the deadline"
|
||||
)
|
||||
deliverable_type: Optional[str] = Field(
|
||||
None, description="What is expected to be submitted (report, code, etc.)"
|
||||
)
|
||||
grading_hints: Optional[List[str]] = Field(
|
||||
None, description="List of hints about grading criteria"
|
||||
)
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# LangChain chain
|
||||
# ---------------------------------------------------------------------------
|
||||
# LLM – you can change the model name or temperature via environment
|
||||
# variables or by passing arguments to ChatOpenAI.
|
||||
llm = ChatOpenAI(temperature=0.0)
|
||||
|
||||
parser = PydanticOutputParser(pydantic_object=TaskCard)
|
||||
|
||||
prompt = PromptTemplate(
|
||||
template=(
|
||||
"You are an assistant that extracts structured information from a short "
|
||||
"task description. Return the data in the following JSON format: "
|
||||
"{format_instructions}\n\nInput: {input}\nOutput:"
|
||||
),
|
||||
input_variables=["input"],
|
||||
partial_variables={"format_instructions": parser.get_format_instructions()},
|
||||
)
|
||||
|
||||
chain = prompt | llm | parser
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Public API
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
def parse_task_description(description: str) -> TaskCard:
|
||||
"""Parse a natural‑language task description.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
description: str
|
||||
One‑sentence or short paragraph describing the task.
|
||||
|
||||
Returns
|
||||
-------
|
||||
TaskCard
|
||||
Validated Pydantic model with extracted fields.
|
||||
"""
|
||||
return chain.invoke({"input": description})
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Demo / CLI
|
||||
# ---------------------------------------------------------------------------
|
||||
if __name__ == "__main__":
|
||||
import argparse
|
||||
import json
|
||||
|
||||
parser_cli = argparse.ArgumentParser(description="Parse a task description.")
|
||||
parser_cli.add_argument("description", type=str, help="Task description to parse")
|
||||
args = parser_cli.parse_args()
|
||||
|
||||
card = parse_task_description(args.description)
|
||||
print("Parsed card:")
|
||||
print(json.dumps(card.model_dump(), indent=2, ensure_ascii=False))
|
||||
print("\nHuman‑readable summary:")
|
||||
print(
|
||||
f"Title: {card.title or 'N/A'}\n"
|
||||
f"Subject: {card.subject or 'N/A'}\n"
|
||||
f"Deadline hint: {card.deadline_hint or 'N/A'}\n"
|
||||
f"Deliverable: {card.deliverable_type or 'N/A'}\n"
|
||||
f"Grading hints: {', '.join(card.grading_hints) if card.grading_hints else 'N/A'}"
|
||||
)
|
||||
Reference in New Issue
Block a user