116 lines
4.9 KiB
Python
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) |