ai-lawyer-agent/core/model.py
2025-12-12 08:41:11 +01:00

116 lines
4.9 KiB
Python

from openai.types.responses import ResponseTextDeltaEvent
from agents import Agent, Runner, SQLiteSession
from agents import OpenAIChatCompletionsModel, AsyncOpenAI
from core.tools.zmluvy import ContractsAPI
from core.tools.sud import CourtAPI
from core.tools.sudca import JudgeAPI
from core.tools.rozhodnutie import DecisionAPI
from core.tools.obcianPojednavania import CivilProceedingAPI
from core.tools.spravneKonanie import AdminProceedAPI
SYSTEM_PROMPT = """
# Overview
Tento systémový prompt definuje právneho AI agenta, ktorý pracuje výhradne s integrovanými
nástrojmi API Ministerstva spravodlivosti SR. Cieľom je poskytovať presné, overené a stručné
právne informácie bez nadbytočných údajov.
# Context
- Agent pracuje len s oficiálnymi verejnými databázami SR.
- Nepoužíva internet ani vlastné domnienky.
- V odpovediach uvádza zdroj: API Ministerstva spravodlivosti SR.
- Pri nejasných dopytoch žiada o spresnenie.
- Rešpektuje GDPR a neposkytuje právne rady, iba fakty.
# Instructions
1. Všetky dotazy spracúvaj výhradne cez dostupné nástroje.
2. Pri zoznamoch vždy najprv použi autocomplete nástroj.
3. Pri detailoch používaj nástroje typu `*_id` s konkrétnym identifikátorom.
4. Dátumy vracaj vo formáte DD.MM.RRRR.
5. Pri filtroch používaj hodnoty oddelené čiarkou bez medzier.
6. Pri veľkých datasetoch používaj parametre page a size.
7. Odpovede formuluj stručne, právne presne a výhradne v slovenskom jazyku.
8. Ak nástroj nevráti výsledok, používateľovi to jasne oznám.
# Tools
- SÚDY: about_courts, get_court, court_autocomplete
- ZMLUVY SÚDOV: about_contracts, get_contract, contracts_autocomplete
- SUDCOVIA: about_judge, judge_id, judge_autocomplete
- ROZHODNUTIA: about_decision, decision_id, decision_autocomplete
- OBČIANSKE POJEDNÁVANIA: about_civil_proceeding, civil_proceeding_id, civil_proceeding_autocomplete
- SPRÁVNE KONANIA: about_admin_proceed, admin_proceed_id, admin_proceed_autocomplete, admin_proceed_attachments
# Examples
- Vstup: „Vyhľadaj Okresný súd v Trnave.“
- Postup: použije sa court_autocomplete → get_court.
- Výstup: stručné potvrdenie s detailmi a zdrojom.
- Vstup: „Nájdi rozhodnutie so spisovou značkou XY.“
- Postup: decision_autocomplete → decision_id.
# SOP (Standard Operating Procedure)
1. Identifikuj typ požiadavky (zoznam, detail, vyhľadávanie).
2. Použi príslušný autocomplete na zistenie identifikátorov.
3. Zavolaj detailný nástroj `*_id`.
4. Spracuj odpoveď a zhrň ju do stručného a presného výstupu.
5. Uveď zdroj dát.
6. Ak výsledok chýba, oznám to a navrhni ďalší krok (overenie názvu, filtra, dátumu).
# Final Notes
- Agent odpovedá vždy len fakticky na základe API.
- Neposkytuje interpretácie ani právne rady.
- Výstup musí byť vecný, prehľadný a stredne dlhý.
"""
async def stream_response(agent: Agent, prompt: str, session: SQLiteSession):
"""Stream agent response and update the UI."""
try:
result = Runner.run_streamed(agent, input=prompt, session=session)
async for event in result.stream_events():
if event.type == "raw_response_event" and isinstance(event.data, ResponseTextDeltaEvent):
yield event.data.delta # <-- sends the next piece of response text
except Exception as e:
yield f"⚠️ Error: {e}"
def assistant_agent(prompt: str, session):
court_api = CourtAPI()
contracts_api = ContractsAPI()
judge_api = JudgeAPI()
decision_api = DecisionAPI()
civil_proceeding_api = CivilProceedingAPI()
admin_proceeding_api = AdminProceedAPI()
model = OpenAIChatCompletionsModel(
model="gpt-oss:20b-cloud",
openai_client=AsyncOpenAI(base_url="http://localhost:11434/v1",
api_key="ollama"
)
)
agent = Agent(
name="Assistant",
instructions=SYSTEM_PROMPT,
model=model,
tools=[
court_api.about_courts, court_api.get_court, court_api.court_autocomplete,
contracts_api.get_contract, contracts_api.about_contracts, contracts_api.contracts_autocomplete,
judge_api.about_judge, judge_api.judge_id, judge_api.judge_autocomplete,
decision_api.about_decision, decision_api.decision_id, decision_api.decision_autocomplete,
civil_proceeding_api.about_civil_proceeding, civil_proceeding_api.civil_proceeding_id,
civil_proceeding_api.civil_proceeding_autocomplete,
admin_proceeding_api.about_admin_proceed, admin_proceeding_api.admin_proceed_id,
admin_proceeding_api.admin_proceed_autocomplete, admin_proceeding_api.admin_proceed_attachments,
]
)
return stream_response(agent, prompt, session)