Initial commit
This commit is contained in:
commit
2e79b97662
3
.idea/.gitignore
vendored
Normal file
3
.idea/.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
10
.idea/ai-lawyer-agent.iml
Normal file
10
.idea/ai-lawyer-agent.iml
Normal file
@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="PYTHON_MODULE" version="4">
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<excludeFolder url="file://$MODULE_DIR$/.venv" />
|
||||
</content>
|
||||
<orderEntry type="jdk" jdkName="Python 3.13 (ai-lawyer-agent)" jdkType="Python SDK" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
||||
12
.idea/inspectionProfiles/Project_Default.xml
Normal file
12
.idea/inspectionProfiles/Project_Default.xml
Normal file
@ -0,0 +1,12 @@
|
||||
<component name="InspectionProjectProfileManager">
|
||||
<profile version="1.0">
|
||||
<option name="myName" value="Project Default" />
|
||||
<inspection_tool class="PyPep8NamingInspection" enabled="true" level="WEAK WARNING" enabled_by_default="true">
|
||||
<option name="ignoredErrors">
|
||||
<list>
|
||||
<option value="N802" />
|
||||
</list>
|
||||
</option>
|
||||
</inspection_tool>
|
||||
</profile>
|
||||
</component>
|
||||
6
.idea/inspectionProfiles/profiles_settings.xml
Normal file
6
.idea/inspectionProfiles/profiles_settings.xml
Normal file
@ -0,0 +1,6 @@
|
||||
<component name="InspectionProjectProfileManager">
|
||||
<settings>
|
||||
<option name="USE_PROJECT_PROFILE" value="false" />
|
||||
<version value="1.0" />
|
||||
</settings>
|
||||
</component>
|
||||
6
.idea/misc.xml
Normal file
6
.idea/misc.xml
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Black">
|
||||
<option name="sdkName" value="Python 3.13 (ai-lawyer-agent)" />
|
||||
</component>
|
||||
</project>
|
||||
8
.idea/modules.xml
Normal file
8
.idea/modules.xml
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/ai-lawyer-agent.iml" filepath="$PROJECT_DIR$/.idea/ai-lawyer-agent.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
||||
6
.idea/vcs.xml
Normal file
6
.idea/vcs.xml
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
18
.streamlit/config.toml
Normal file
18
.streamlit/config.toml
Normal file
@ -0,0 +1,18 @@
|
||||
|
||||
[browser]
|
||||
serverAddress = "localhost"
|
||||
gatherUsageStats = false
|
||||
serverPort = 8501
|
||||
|
||||
[theme]
|
||||
base = "light"
|
||||
backgroundColor = "#E6F4FF"
|
||||
secondaryBackgroundColor = "#D6EDFF"
|
||||
|
||||
font = "Ubuntu, sans-serif"
|
||||
baseFontSize = 16
|
||||
baseFontWeight = 300
|
||||
headingFont = "Ubuntu, sans-serif"
|
||||
|
||||
baseRadius = "small"
|
||||
#borderColor = "#D6EDFF"
|
||||
0
app/__init__.py
Normal file
0
app/__init__.py
Normal file
BIN
app/__pycache__/__init__.cpython-313.pyc
Normal file
BIN
app/__pycache__/__init__.cpython-313.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/app.cpython-313.pyc
Normal file
BIN
app/__pycache__/app.cpython-313.pyc
Normal file
Binary file not shown.
93
app/app.py
Normal file
93
app/app.py
Normal file
@ -0,0 +1,93 @@
|
||||
import asyncio
|
||||
from datetime import datetime
|
||||
import streamlit as st
|
||||
from core.model import assistant_agent, SQLiteSession
|
||||
from app.components.sidebar import add_sidebar
|
||||
|
||||
style_chat_message = """
|
||||
<style>
|
||||
.st-emotion-cache-1rs7fk9 {
|
||||
background-color: #D6EDFF;
|
||||
border-radius: 1rem;
|
||||
}
|
||||
|
||||
.st-emotion-cache-1q1vt2q {
|
||||
border-radius: 1rem;
|
||||
}
|
||||
|
||||
</style>
|
||||
"""
|
||||
|
||||
def get_time() -> str:
|
||||
return datetime.now().strftime("%d.%m.%Y %H:%M:%S")
|
||||
|
||||
def init_session_state() -> None:
|
||||
if "messages" not in st.session_state:
|
||||
st.session_state.messages = []
|
||||
if "chat_session" not in st.session_state:
|
||||
st.session_state.chat_session = SQLiteSession(":memory:")
|
||||
if "show_about" not in st.session_state:
|
||||
st.session_state.show_about = True
|
||||
|
||||
st.markdown(style_chat_message, unsafe_allow_html=True)
|
||||
|
||||
def create_app() -> None:
|
||||
|
||||
st.set_page_config(
|
||||
page_title="LawGPT",
|
||||
page_icon="app/assets/images/title.png",
|
||||
initial_sidebar_state="collapsed",
|
||||
layout="centered",
|
||||
menu_items={
|
||||
'Get help': None,
|
||||
'Report a bug': None,
|
||||
'About': """
|
||||
This is a cool educational project exploring the creation of an AI agent powered by API keys.
|
||||
You can learn how to build, interact with, and experiment with AI using real API integration.
|
||||
"""
|
||||
}
|
||||
)
|
||||
|
||||
add_sidebar()
|
||||
init_session_state()
|
||||
|
||||
for message in st.session_state.messages:
|
||||
with st.chat_message(message["role"], avatar=message["avatar"]):
|
||||
st.markdown(message["content"])
|
||||
if "time" in message:
|
||||
st.caption(message["time"])
|
||||
|
||||
user_avatar = "app/assets/images/user.png"
|
||||
assistant_avatar = "app/assets/images/assistant.png"
|
||||
|
||||
if request := st.chat_input("Ask anything"):
|
||||
user_time = get_time()
|
||||
|
||||
with st.chat_message(name="user", avatar=user_avatar):
|
||||
st.markdown(f"{request}")
|
||||
st.caption(user_time)
|
||||
|
||||
user_message = {"role": "user",
|
||||
"avatar": user_avatar,
|
||||
"content": request,
|
||||
"time": user_time}
|
||||
st.session_state.messages.append(user_message)
|
||||
|
||||
with st.chat_message(name="assistant", avatar=assistant_avatar):
|
||||
with st.spinner("Thinking..."):
|
||||
try:
|
||||
response = st.write_stream(assistant_agent(request, st.session_state.chat_session))
|
||||
except Exception as e:
|
||||
response = f"⚠️ Error: {e}"
|
||||
finally:
|
||||
assistant_time = get_time()
|
||||
|
||||
st.caption(assistant_time)
|
||||
|
||||
assistant_message = {"role": "assistant",
|
||||
"avatar": assistant_avatar,
|
||||
"content": response,
|
||||
"time": assistant_time}
|
||||
st.session_state.messages.append(assistant_message)
|
||||
|
||||
st.rerun()
|
||||
BIN
app/assets/images/assistant.png
Normal file
BIN
app/assets/images/assistant.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 15 KiB |
BIN
app/assets/images/title.png
Normal file
BIN
app/assets/images/title.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 14 KiB |
BIN
app/assets/images/user.png
Normal file
BIN
app/assets/images/user.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 16 KiB |
0
app/components/__init__.py
Normal file
0
app/components/__init__.py
Normal file
BIN
app/components/__pycache__/__init__.cpython-313.pyc
Normal file
BIN
app/components/__pycache__/__init__.cpython-313.pyc
Normal file
Binary file not shown.
BIN
app/components/__pycache__/sidebar.cpython-313.pyc
Normal file
BIN
app/components/__pycache__/sidebar.cpython-313.pyc
Normal file
Binary file not shown.
32
app/components/sidebar.py
Normal file
32
app/components/sidebar.py
Normal file
@ -0,0 +1,32 @@
|
||||
import streamlit as st
|
||||
from agents import SQLiteSession
|
||||
|
||||
sidebar_style = """
|
||||
<style>
|
||||
[data-testid="stSidebar"][aria-expanded="true"]{
|
||||
min-width: 300px;
|
||||
max-width: 300px;
|
||||
}
|
||||
|
||||
div.stButton > button {
|
||||
background-color: #D6EDFF;
|
||||
border: none;
|
||||
}
|
||||
|
||||
div.stButton > button:hover {
|
||||
background-color: #D6EDFF;
|
||||
}
|
||||
|
||||
</style>
|
||||
"""
|
||||
|
||||
def add_sidebar():
|
||||
st.markdown(sidebar_style, unsafe_allow_html=True)
|
||||
|
||||
with st.sidebar:
|
||||
|
||||
st.title("⚖️ LawGPT")
|
||||
st.markdown(":blue-badge[⚙️Tool] :orange-badge[⚠️Current chat will be deleted]")
|
||||
if st.button(":material/note_stack_add: Create new chat"):
|
||||
st.session_state.messages = []
|
||||
st.session_state.chat_session = SQLiteSession(":memory:")
|
||||
0
core/__init__.py
Normal file
0
core/__init__.py
Normal file
BIN
core/__pycache__/__init__.cpython-313.pyc
Normal file
BIN
core/__pycache__/__init__.cpython-313.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/model.cpython-313.pyc
Normal file
BIN
core/__pycache__/model.cpython-313.pyc
Normal file
Binary file not shown.
116
core/model.py
Normal file
116
core/model.py
Normal file
@ -0,0 +1,116 @@
|
||||
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)
|
||||
0
core/tools/__init__.py
Normal file
0
core/tools/__init__.py
Normal file
BIN
core/tools/__pycache__/__init__.cpython-313.pyc
Normal file
BIN
core/tools/__pycache__/__init__.cpython-313.pyc
Normal file
Binary file not shown.
BIN
core/tools/__pycache__/obcianPojednavania.cpython-313.pyc
Normal file
BIN
core/tools/__pycache__/obcianPojednavania.cpython-313.pyc
Normal file
Binary file not shown.
BIN
core/tools/__pycache__/rozhodnutie.cpython-313.pyc
Normal file
BIN
core/tools/__pycache__/rozhodnutie.cpython-313.pyc
Normal file
Binary file not shown.
BIN
core/tools/__pycache__/spravneKonanie.cpython-313.pyc
Normal file
BIN
core/tools/__pycache__/spravneKonanie.cpython-313.pyc
Normal file
Binary file not shown.
BIN
core/tools/__pycache__/sud.cpython-313.pyc
Normal file
BIN
core/tools/__pycache__/sud.cpython-313.pyc
Normal file
Binary file not shown.
BIN
core/tools/__pycache__/sudca.cpython-313.pyc
Normal file
BIN
core/tools/__pycache__/sudca.cpython-313.pyc
Normal file
Binary file not shown.
BIN
core/tools/__pycache__/zmluvy.cpython-313.pyc
Normal file
BIN
core/tools/__pycache__/zmluvy.cpython-313.pyc
Normal file
Binary file not shown.
137
core/tools/obcianPojednavania.py
Normal file
137
core/tools/obcianPojednavania.py
Normal file
@ -0,0 +1,137 @@
|
||||
import requests
|
||||
from pydantic import BaseModel, conint
|
||||
from typing import Optional, List
|
||||
from enum import Enum
|
||||
|
||||
from agents import function_tool
|
||||
|
||||
API_BASE_URL = "https://obcan.justice.sk/pilot/api/ress-isu-service"
|
||||
|
||||
class SortDirection(str, Enum):
|
||||
ASC = "ASC"
|
||||
DESC = "DESC"
|
||||
|
||||
class CivilProceedingAPI:
|
||||
|
||||
class CivilProceedParams(BaseModel):
|
||||
query: Optional[str] = None
|
||||
typSuduFacetFilter: Optional[List[str]] = None
|
||||
krajFacetFilter: Optional[List[str]] = None
|
||||
okresFacetFilter: Optional[List[str]] = None
|
||||
usekFacetFilter: Optional[List[str]] = None
|
||||
formaUkonuFacetFilter: Optional[List[str]] = None
|
||||
pojednavaniaOd: Optional[str] = None
|
||||
pojednavaniaDo: Optional[str] = None
|
||||
guidSudca: Optional[str] = None
|
||||
guidSud: Optional[str] = None
|
||||
spisovaZnacka: Optional[str] = None
|
||||
verejneVyhlasenie: Optional[bool] = None
|
||||
indexDatumOd: Optional[str] = None
|
||||
indexDatumDo: Optional[str] = None
|
||||
sortProperty: Optional[str] = None
|
||||
sortDirection: SortDirection = SortDirection.ASC
|
||||
page: int = 0
|
||||
size: int = 20
|
||||
|
||||
@function_tool
|
||||
def about_civil_proceeding(args: CivilProceedParams) -> dict:
|
||||
"""
|
||||
Načítanie zoznamu občianskoprávnych pojednávaní a verejne vyhlásených rozsudkov na základe filtrovacích kritérií
|
||||
|
||||
:param query: Hľadané slovo alebo slovné spojenie, podľa ktorého sa vyhľadávajú občianskoprávne pojednávania.
|
||||
:param typSuduFacetFilter: Zoznam typov súdov (fazetový filter), napr. ["Okresný súd", "Krajský súd", "Mestský súd"].
|
||||
:param krajFacetFilter: Zoznam krajov (fazetový filter), napr. ["Bratislavský kraj", "Košický kraj", "Prešovský kraj"].
|
||||
:param okresFacetFilter: Zoznam okresov (fazetový filter), napr. ["Okres Košice I", "Okres Bratislava IV", "Okres Žilina"].
|
||||
:param usekFacetFilter: Zoznam úsekov (fazetový filter), napr. ["C", "O", "S"].
|
||||
:param formaUkonuFacetFilter: Zoznam foriem úkonu (fazetový filter), napr. ["Pojednávanie bez rozhodnutia", "Pojednávanie a rozhodnutie",
|
||||
"Verejné vyhlásenie rozsudku"].
|
||||
:param pojednavaniaOd: Dátum pojednávania OD (formát: DD.MM.RRRR), napr. "01.01.2025".
|
||||
:param pojednavaniaDo: Dátum pojednávania DO (formát: DD.MM.RRRR), napr. "31.12.2025".
|
||||
:param guidSudca: Identifikátor sudcu pre filtrovanie pojednávaní konkrétneho sudcu, napr. "sudca_2442".
|
||||
:param guidSud: Identifikátor súdu pre filtrovanie pojednávaní konkrétneho súdu, napr. "sud_135".
|
||||
:param spisovaZnacka: Spisová značka pojednávania, napr. "30P/1/2025".
|
||||
:param verejneVyhlasenie: Príznak, či zahrnúť len verejne vyhlásené rozsudky. Hodnota typu boolean.
|
||||
:param indexDatumOd: Dátum indexácie OD (formát: DD.MM.RRRR), napr. "01.01.2025".
|
||||
:param indexDatumDo: Dátum indexácie DO (formát: DD.MM.RRRR), napr. "31.12.2025".
|
||||
:param sortProperty: Názov atribútu, podľa ktorého sa majú záznamy zoradiť, napr. "datumPojednavania", "spisovaZnacka".
|
||||
:param sortDirection: Smer zoradenia záznamov. Možnosti: "ASC" (predvolené) alebo "DESC".
|
||||
:param page: Číslo stránky (0 = prvá stránka) pre stránkovanie výsledkov.
|
||||
:param size: Počet záznamov na stránku (predvolené 20) pre stránkovanie výsledkov.
|
||||
|
||||
:return: Slovník (JSON) obsahujúci zoznam občianskoprávnych pojednávaní a verejne vyhlásených rozsudkov s detailnými informáciami, metadátami a filtrami.
|
||||
"""
|
||||
|
||||
try:
|
||||
url = f"{API_BASE_URL}/v1/obcianPojednavania"
|
||||
response = requests.get(url, params=args.model_dump())
|
||||
response.raise_for_status()
|
||||
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
print(f"❗🔨\n {data}")
|
||||
return {"success": True, "data": data}
|
||||
else:
|
||||
return {"success": False, "error": f"Unexpected status code: {response.status_code} ⚠️"}
|
||||
|
||||
except Exception as e:
|
||||
return {"success": False, "error": f"Error get contract details: {str(e)} 🛑"}
|
||||
|
||||
@function_tool
|
||||
def civil_proceeding_id(self, id: str) -> dict:
|
||||
"""
|
||||
Načítanie detailu občianskoprávneho pojednávania na základe identifikátora.
|
||||
|
||||
:param id: Identifikátor sudcu (povinný parameter), napr. "sudca_123", "sudca_456".
|
||||
|
||||
:return: Slovník (JSON) obsahujúci detailné informácie o občianskoprávnom pojednávaní na základe identifikátora.
|
||||
"""
|
||||
try:
|
||||
url = f"{API_BASE_URL}/v1/obcianPojednavania/{id}"
|
||||
response = requests.get(url)
|
||||
response.raise_for_status()
|
||||
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
print(f"⭕🔨\n {data}")
|
||||
return {"success": True, "data": data}
|
||||
else:
|
||||
return {"success": False, "error": f"Unexpected status code: {response.status_code} ⚠️"}
|
||||
|
||||
except Exception as e:
|
||||
return {"success": False, "error": f"Error : {str(e)} 🛑"}
|
||||
|
||||
class CivilProceedAutocomplete(BaseModel):
|
||||
query: Optional[str] = None
|
||||
guidSud: Optional[str] = None
|
||||
giudSud: Optional[str] = None
|
||||
verejneVyhlasenie: Optional[bool] = None
|
||||
limit: Optional[conint(ge=0)] = None
|
||||
|
||||
@function_tool
|
||||
def civil_proceeding_autocomplete(self, args: CivilProceedAutocomplete) -> dict:
|
||||
"""
|
||||
Autocomplete služba pre vyhľadávanie občianskoprávnych pojednávaní a verejne vyhlásených rozsudkov.
|
||||
|
||||
:param query: Hľadané slovo alebo slovné spojenie pre vyhľadávanie pojednávaní.
|
||||
:param guidSud: Identifikátor súdu pre filtrovanie pojednávaní konkrétneho súdu.
|
||||
:param giudSud: Duplicitný parameter - pravdepodobne chyba, použite guidSud.
|
||||
:param verejneVyhlasenie: Príznak, či zahrnúť len verejne vyhlásené rozsudky.
|
||||
:param limit: Maximálny počet návrhov (0 = všetky možné návrhy).
|
||||
|
||||
:return: Slovník (JSON) obsahujúci zoznam návrhov pre autocomplete.
|
||||
"""
|
||||
|
||||
try:
|
||||
url = f"{API_BASE_URL}/v1/obcianPojednavania/autocomplete"
|
||||
response = requests.get(url, args.model_dump())
|
||||
response.raise_for_status()
|
||||
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
print(f"📛🔨\n {data}")
|
||||
return {"success": True, "data": data}
|
||||
else:
|
||||
return {"success": False, "error": f"Unexpected status code: {response.status_code} ⚠️"}
|
||||
|
||||
except Exception as e:
|
||||
return {"success": False, "error": f"Error : {str(e)} 🛑"}
|
||||
141
core/tools/rozhodnutie.py
Normal file
141
core/tools/rozhodnutie.py
Normal file
@ -0,0 +1,141 @@
|
||||
import requests
|
||||
from pydantic import BaseModel, conint
|
||||
from typing import Optional, List
|
||||
from enum import Enum
|
||||
|
||||
from agents import function_tool
|
||||
|
||||
API_BASE_URL = "https://obcan.justice.sk/pilot/api/ress-isu-service"
|
||||
|
||||
class SortDirection(str, Enum):
|
||||
ASC = "ASC"
|
||||
DESC = "DESC"
|
||||
|
||||
class DecisionAPI:
|
||||
|
||||
class AboutDecision(BaseModel):
|
||||
query: Optional[str] = None
|
||||
typSuduFacetFilter: Optional[List[str]] = None
|
||||
krajFacetFilter: Optional[List[str]] = None
|
||||
okresFacetFilter: Optional[List[str]] = None
|
||||
odkazovanePredpisy: Optional[str] = None
|
||||
oblastPravnejUpravyFacetFilter: Optional[List[str]] = None
|
||||
podOblastPravnejUpravyFacetFilter: Optional[List[str]] = None
|
||||
formaRozhodnutiaFacetFilter: Optional[List[str]] = None
|
||||
povahaRozhodnutiaFacetFilter: Optional[str] = None
|
||||
vydaniaOd: Optional[str] = None
|
||||
vydaniaDo: Optional[str] = None
|
||||
ecli: Optional[str] = None
|
||||
spisovaZnacka: Optional[str] = None
|
||||
cisloSpisu: Optional[str] = None
|
||||
guidSudca: Optional[str] = None
|
||||
guidSud: Optional[str] = None
|
||||
indexDatumOd: Optional[str] = None
|
||||
indexDatumDo: Optional[str] = None
|
||||
sortProperty: Optional[str] = None
|
||||
sortDirection: SortDirection = SortDirection.ASC
|
||||
page: Optional[int] = None
|
||||
size : conint(ge=0) = 20
|
||||
|
||||
@function_tool
|
||||
def about_decision(self, args: AboutDecision) -> dict:
|
||||
"""
|
||||
Načítanie zoznamu rozhodnutí na základe filtrovacích kritérií
|
||||
|
||||
:param query: Hľadané slovo alebo slovné spojenie, podľa ktorého sa vyhľadávajú rozhodnutia.
|
||||
:param typSuduFacetFilter: Zoznam typov súdov (fazetový filter), napr. ["Okresný súd", "Krajský súd", "Mestský súd"].
|
||||
:param krajFacetFilter: Zoznam krajov (fazetový filter), napr. ["Košický kraj", "Bratislavský kraj", "Banskobystrický kraj"].
|
||||
:param okresFacetFilter: Zoznam okresov (fazetový filter), napr. ["Okres Banská Bystrica", "Okres Košice I", "Okres Bratislava I"].
|
||||
:param odkazovanePredpisy: Odkazované predpisy, na ktoré sa rozhodnutie odvoláva.
|
||||
:param oblastPravnejUpravyFacetFilter: Zoznam oblastí právnej úpravy (fazetový filter), napr. ["Občianske právo",
|
||||
"Rodinné právo", "Obchodné právo"].
|
||||
:param podOblastPravnejUpravyFacetFilter: Zoznam podoblastí právnej úpravy
|
||||
(fazetový filter), napr. ["Exekúcia a výkon rozhodnutí",
|
||||
"Spotrebiteľské zmluvy", "Vyživovacie povinnosti"].
|
||||
:param formaRozhodnutiaFacetFilter: Zoznam foriem rozhodnutia (fazetový filter), napr. ["Uznesenie", "Rozsudok", "Platobný rozkaz"].
|
||||
:param povahaRozhodnutiaFacetFilter: Povaha rozhodnutia, napr. "Prvostupňové nenapadnuté opravnými prostriedkami".
|
||||
:param vydaniaOd: Dátum vydania OD (formát: DD.MM.RRRR), napr. "01.01.2020".
|
||||
:param vydaniaDo: Dátum vydania DO (formát: DD.MM.RRRR), napr. "31.12.2025".
|
||||
:param ecli: ECLI identifikátor rozhodnutia.
|
||||
:param spisovaZnacka: Spisová značka rozhodnutia, napr. "4T/20/2014".
|
||||
:param cisloSpisu: Identifikačné číslo spisu.
|
||||
:param guidSudca: Identifikátor sudcu pre filtrovanie rozhodnutí konkrétneho sudcu, napr. "sudca_1600".
|
||||
:param guidSud: Identifikátor súdu pre filtrovanie rozhodnutí konkrétneho súdu, napr. "sud_156".
|
||||
:param indexDatumOd: Dátum indexácie OD (formát: DD.MM.RRRR), napr. "01.01.2025".
|
||||
:param indexDatumDo: Dátum indexácie DO (formát: DD.MM.RRRR), napr. "31.12.2025".
|
||||
:param sortProperty: Názov atribútu, podľa ktorého sa majú záznamy zoradiť, napr. "datumVydania", "spisovaZnacka".
|
||||
:param sortDirection: Smer zoradenia záznamov. Možnosti: "ASC" (predvolené) alebo "DESC".
|
||||
:param page: Číslo stránky (0 = prvá stránka) pre stránkovanie výsledkov.
|
||||
:param size: Počet záznamov na stránku (predvolené 20) pre stránkovanie výsledkov.
|
||||
|
||||
:return: Slovník (JSON) obsahujúci zoznam rozhodnutí s detailnými informáciami, metadátami a filtrami.
|
||||
"""
|
||||
try:
|
||||
url = f"{API_BASE_URL}/v1/rozhodnutie"
|
||||
response = requests.get(url, params=args.model_dump())
|
||||
response.raise_for_status()
|
||||
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
print(f"⭕📃\n {data}")
|
||||
return {"success": True, "data": data}
|
||||
else:
|
||||
return {"success": False, "error": f"Unexpected status code: {response.status_code} ⚠️"}
|
||||
|
||||
except Exception as e:
|
||||
return {"success": False, "error": f"Error : {str(e)} 🛑"}
|
||||
|
||||
@function_tool
|
||||
def decision_id(self, id: str) -> dict:
|
||||
"""
|
||||
Načítanie rozhodnutia na základe id
|
||||
|
||||
:param id: Identifikátor sudu (povinný parameter), napr. "sud_123", "sud_456".
|
||||
|
||||
:return: Slovník (JSON) obsahujúci detailné informácie o rozhodnutií na základe id
|
||||
"""
|
||||
try:
|
||||
url = f"{API_BASE_URL}/v1/rozhodnutie/{id}"
|
||||
response = requests.get(url)
|
||||
response.raise_for_status()
|
||||
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
print(f"⛔📃\n {data}")
|
||||
return {"success": True, "data": data}
|
||||
else:
|
||||
return {"success": False, "error": f"Unexpected status code: {response.status_code} ⚠️"}
|
||||
|
||||
except Exception as e:
|
||||
return {"success": False, "error": f"Error : {str(e)} 🛑"}
|
||||
|
||||
class DecisionAutocomplete(BaseModel):
|
||||
query: Optional[str] = None
|
||||
guidSud: Optional[str] = None
|
||||
limit: Optional[conint(ge=0)] = None
|
||||
|
||||
@function_tool
|
||||
def decision_autocomplete(self, args: DecisionAutocomplete) -> dict:
|
||||
"""
|
||||
Autocomplete služba pre načítanie rozhodnutia.
|
||||
|
||||
:param query: Hľadané slovo alebo slovné spojenie
|
||||
:param guidSud: Identifikátor súdu, napr. "sud_123", "sud_456".
|
||||
:param limit: Maximálny počet rozhodnutie, ktoré sa majú vrátiť.
|
||||
|
||||
:return: Slovník (JSON) obsahujúci zoznam rozhodnutie pre autocomplete.
|
||||
"""
|
||||
try:
|
||||
url = f"{API_BASE_URL}/v1/rozhodnutie/autocomplete"
|
||||
response = requests.get(url, params=args.model_dump())
|
||||
response.raise_for_status()
|
||||
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
print(f"📛📃\n {data}")
|
||||
return {"success": True, "data": data }
|
||||
else:
|
||||
return { "success": False, "error": f"Unexpected status code: {response.status_code} ⚠️"}
|
||||
|
||||
except Exception as e:
|
||||
return { "success": False, "error": f"Error get contract details: {str(e)} 🛑" }
|
||||
142
core/tools/spravneKonanie.py
Normal file
142
core/tools/spravneKonanie.py
Normal file
@ -0,0 +1,142 @@
|
||||
import requests
|
||||
from pydantic import BaseModel, conint
|
||||
from typing import List, Optional
|
||||
from enum import Enum
|
||||
|
||||
from agents import function_tool
|
||||
|
||||
API_BASE_URL = "https://obcan.justice.sk/pilot/api/ress-isu-service"
|
||||
|
||||
class SortDirection(str, Enum):
|
||||
ASC = "ASC"
|
||||
DESC = "DESC"
|
||||
|
||||
class AdminProceedAPI:
|
||||
|
||||
class AdminProceed(BaseModel):
|
||||
query: Optional[str] = None
|
||||
druhFacetFilter: Optional[List[str]] = None
|
||||
datumPravoplatnostiOd : Optional[str] = None
|
||||
datumPravoplatnostiDo : Optional[str] = None
|
||||
page: Optional[int] = None
|
||||
size : conint(ge=0) = 20
|
||||
sortProperty: Optional[str] = None
|
||||
sortDirection: SortDirection = SortDirection.ASC
|
||||
|
||||
@function_tool
|
||||
def about_admin_proceed(self, args: AdminProceed) -> dict:
|
||||
"""
|
||||
|
||||
:param query: Hľadané slovo alebo slovné spojenie.
|
||||
:param druhFacetFilter: Zoznam druhov správnych konaní (fazetový filter).
|
||||
:param datumPravoplatnostiOd: Dátum právoplatnosti OD (formát: DD.MM.RRRR).
|
||||
Príklad: "15.03.2023", "01.01.2020"
|
||||
:param datumPravoplatnosiDo: Dátum právoplatnosti DO (formát: DD.MM.RRRR).
|
||||
Príklad: "15.03.2023", "01.01.2020"
|
||||
:param page: Číslo stránky (0 = prvá stránka).
|
||||
Poznámka: Zmena 'page' zobrazí ĎALŠIE konania, nie tie isté.
|
||||
Príklad: 'page=0' → konania 1-20, 'page=1' → konania 21-40.
|
||||
:param size: Počet záznamov na stránku (predvolené 20).
|
||||
Príklad: 'size=10' → 10 konaní na stránke.
|
||||
:param sortProperty: Atribút pre zoradenie výsledkov.
|
||||
:param sortDirection: Smer zoradenia (ASC alebo DESC).
|
||||
|
||||
:return: Slovník s výsledkami vyhľadávania správnych konaní.
|
||||
"""
|
||||
|
||||
try:
|
||||
url = f"{API_BASE_URL}/v1/spravneKonanie"
|
||||
response = requests.get(url, params=args.model_dump())
|
||||
response.raise_for_status()
|
||||
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
print(f"⭕👨\n {data}")
|
||||
return {"success": True, "data": data}
|
||||
else:
|
||||
return {"success": False, "error": f"Unexpected status code: {response.status_code} ⚠️"}
|
||||
|
||||
except Exception as e:
|
||||
return {"success": False, "error": f"Error : {str(e)} 🛑"}
|
||||
|
||||
@function_tool
|
||||
def admin_proceed_id(self, id: str) -> dict:
|
||||
"""
|
||||
Načítanie binárneho obsahu prílohy správneho konania na základe ID.
|
||||
|
||||
:param id: Unikátny identifikátor administratívneho konania (povinný parameter).
|
||||
Príklad: sud_175
|
||||
|
||||
:return: Slovník (JSON) obsahujúci binárne dáta prílohy a metainformácie.
|
||||
"""
|
||||
try:
|
||||
url = f"{API_BASE_URL}/v1/spravneKonanie/{id}"
|
||||
response = requests.get(url)
|
||||
response.raise_for_status()
|
||||
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
print(f"📛👨\n {data}")
|
||||
return {"success": True, "data": data}
|
||||
else:
|
||||
return {"success": False, "error": f"Unexpected status code: {response.status_code} ⚠️"}
|
||||
|
||||
except Exception as e:
|
||||
return {"success": False, "error": f"Error : {str(e)} 🛑"}
|
||||
|
||||
@function_tool
|
||||
def admin_proceed_attachments(self, id: str) -> dict:
|
||||
"""
|
||||
Načítanie správneho konania na základe id
|
||||
|
||||
:param id: Unikátny identifikátor administratívneho konania (povinný parameter).
|
||||
Príklad: sud_175
|
||||
|
||||
:return: Slovník (JSON) obsahujúci detailné informácie o správnom konaní na základe id.
|
||||
"""
|
||||
try:
|
||||
url = f"{API_BASE_URL}/v1/spravneKonanie/priloha/{id}"
|
||||
response = requests.get(url)
|
||||
response.raise_for_status()
|
||||
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
print(f"❗👨\n {data}")
|
||||
return {"success": True, "data": data}
|
||||
else:
|
||||
return {"success": False, "error": f"Unexpected status code: {response.status_code} ⚠️"}
|
||||
|
||||
except Exception as e:
|
||||
return {"success": False, "error": f"Error : {str(e)} 🛑"}
|
||||
|
||||
class AdminProceedAutocomplete(BaseModel):
|
||||
query: Optional[str] = None
|
||||
limit: Optional[conint(ge=1)] = None
|
||||
|
||||
@function_tool
|
||||
def admin_proceed_autocomplete(self, args: AdminProceedAutocomplete) -> dict:
|
||||
"""
|
||||
Autocomplete služba pre vyhľadávanie správnych konaní.
|
||||
|
||||
:param query: Hľadané slovo alebo slovné spojenie pre vyhľadávanie správnych konaní.
|
||||
|
||||
:param limit: Maximálny počet návrhov, ktoré sa majú vrátiť.
|
||||
None → API vráti 5 dokumentov (predvolená hodnota).
|
||||
Hodnota 0 spôsobí chybu API, preto použite None namiesto 0
|
||||
|
||||
:return: Slovník (JSON) obsahujúci zoznam návrhov pre autocomplete.
|
||||
"""
|
||||
try:
|
||||
url = f"{API_BASE_URL}/v1/spravneKonanie/autocomplete"
|
||||
response = requests.get(url, args.model_dump())
|
||||
response.raise_for_status()
|
||||
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
print(f"⭕\n {data}")
|
||||
return {"success": True, "data": data}
|
||||
else:
|
||||
return {"success": False, "error": f"Unexpected status code: {response.status_code} ⚠️"}
|
||||
|
||||
except Exception as e:
|
||||
return {"success": False, "error": f"Error : {str(e)} 🛑"}
|
||||
114
core/tools/sud.py
Normal file
114
core/tools/sud.py
Normal file
@ -0,0 +1,114 @@
|
||||
import requests
|
||||
from pydantic import BaseModel, conint
|
||||
from typing import List, Optional
|
||||
from enum import Enum
|
||||
|
||||
from agents import function_tool
|
||||
|
||||
API_BASE_URL = "https://obcan.justice.sk/pilot/api/ress-isu-service"
|
||||
|
||||
class SortDirection(str, Enum):
|
||||
ASC = "ASC"
|
||||
DESC = "DESC"
|
||||
|
||||
class CourtAPI:
|
||||
|
||||
class ListCourts(BaseModel):
|
||||
query: Optional[str] = None
|
||||
typSuduFacetFilter: List[str] = []
|
||||
krajFacetFilter: List[str] = []
|
||||
zahrnutZaniknuteSudy: Optional[bool] = None
|
||||
sortProperty: Optional[str] = None
|
||||
sortDirection: SortDirection = SortDirection.ASC
|
||||
|
||||
|
||||
@function_tool
|
||||
def about_courts(args: ListCourts) -> dict:
|
||||
"""
|
||||
Načítanie zoznamu súdov na základe filtrovacích kritérii
|
||||
|
||||
:param query: Hľadané slovo alebo slovné spojenie, podľa ktorého sa vyhľadávajú súdy.
|
||||
:param typSuduFacetFilter: Zoznam typov súdov (fazetový filter), napr. ["Okresný súd", "Krajský súd"].
|
||||
:param krajFacetFilter: Zoznam krajov (fazetový filter), napr. ["Bratislavský kraj", "Košický kraj"].
|
||||
:param zahrnutZaniknuteSudy: Príznak, či zahrnúť aj zaniknuté súdy. Hodnota typu boolean.
|
||||
:param sortProperty: Názov atribútu, podľa ktorého sa majú záznamy zoradiť.
|
||||
:param sortDirection: Smer zoradenia záznamov. Možnosti: "ASC" (predvolené) alebo "DESC".
|
||||
|
||||
|
||||
:return: Slovník (JSON) obsahujúci detailné informácie s detailnými informáciami, metadátami a filtrami.
|
||||
"""
|
||||
try:
|
||||
url = f"{API_BASE_URL}/v1/sud"
|
||||
response = requests.get(url, params=args.model_dump())
|
||||
response.raise_for_status()
|
||||
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
print(f"⭕🏛️\n {data}")
|
||||
return {"success": True, "data": data}
|
||||
else:
|
||||
return {"success": False, "error": f"Unexpected status code: {response.status_code} ⚠️"}
|
||||
|
||||
except Exception as e:
|
||||
return {"success": False, "error": f"Error get contract details: {str(e)} 🛑"}
|
||||
|
||||
|
||||
class CourtDetail(BaseModel):
|
||||
idSudu: Optional[str] = None
|
||||
|
||||
|
||||
@function_tool
|
||||
def get_court(args: CourtDetail) -> dict:
|
||||
"""
|
||||
Načítanie detailnej informácie o súde na základe jeho ID.
|
||||
|
||||
:param idSudu: Identifikátor súdu.
|
||||
|
||||
:return: Slovník (JSON) obsahujúci detailné informácie sudov.
|
||||
"""
|
||||
try:
|
||||
url = f"{API_BASE_URL}/v1/sud/{args.idSudu}"
|
||||
response = requests.get(url)
|
||||
response.raise_for_status()
|
||||
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
data.pop("foto", None)
|
||||
print(f"❗🏛️\n {data}")
|
||||
return {"success": True, "data": data}
|
||||
else:
|
||||
return {"success": False, "error": f"Unexpected status code: {response.status_code} ⚠️"}
|
||||
|
||||
except Exception as e:
|
||||
return {"success": False, "error": f"Error get contract details: {str(e)} 🛑"}
|
||||
|
||||
class CourtAutocomplete(BaseModel):
|
||||
query: Optional[str] = None
|
||||
limit: Optional[conint(ge=0)] = None
|
||||
|
||||
|
||||
@function_tool
|
||||
def court_autocomplete(args: CourtAutocomplete) -> dict:
|
||||
"""
|
||||
Autocomplete pre vyhľadávanie súdu.
|
||||
|
||||
:param query: Hľadané slovo alebo slovné spojenie, podľa ktorého sa majú hľadať súdy.
|
||||
:param limit: Maximálny počet návrhov súdov, ktoré sa majú vrátiť. Ak je 0, vráti všetky možné návrhy.
|
||||
|
||||
:return: Slovník (JSON) obsahujúci zoznam návrhov súdov pre autocomplete.
|
||||
"""
|
||||
|
||||
try:
|
||||
url = f"{API_BASE_URL}/v1/sud/autocomplete"
|
||||
response = requests.get(url, params=args.model_dump())
|
||||
response.raise_for_status()
|
||||
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
print(f"📛🏛️\n {data}")
|
||||
return {"success": True, "data": data }
|
||||
else:
|
||||
return { "success": False, "error": f"Unexpected status code: {response.status_code} ⚠️"}
|
||||
|
||||
except Exception as e:
|
||||
return { "success": False, "error": f"Error get contract details: {str(e)} 🛑" }
|
||||
126
core/tools/sudca.py
Normal file
126
core/tools/sudca.py
Normal file
@ -0,0 +1,126 @@
|
||||
import requests
|
||||
from pydantic import BaseModel, conint
|
||||
from typing import List, Optional
|
||||
from enum import Enum
|
||||
|
||||
from agents import function_tool
|
||||
|
||||
API_BASE_URL = "https://obcan.justice.sk/pilot/api/ress-isu-service"
|
||||
|
||||
class SortDirection(str, Enum):
|
||||
ASC = "ASC"
|
||||
DESC = "DESC"
|
||||
|
||||
class JudgeAPI:
|
||||
|
||||
class JudgeParams(BaseModel):
|
||||
query: Optional[str] = None
|
||||
funkciaFacetFilter: Optional[List[str]] = None
|
||||
typSuduFacetFilter: Optional[List[str]] = None
|
||||
krajFacetFilter: Optional[List[str]] = None
|
||||
okresFacetFilter: Optional[List[str]] = None
|
||||
stavZapisuFacetFilter: Optional[List[str]] = None
|
||||
guidSud: Optional[str] = None
|
||||
page: Optional[int] = None
|
||||
size: Optional[conint(ge=0)] = None
|
||||
sortProperty: Optional[str] = None
|
||||
sortDirection: SortDirection = SortDirection.ASC
|
||||
|
||||
@function_tool
|
||||
def about_judge(self, args: JudgeParams):
|
||||
"""
|
||||
Načítanie zoznamu sudcov na základe filtrovacích kritérii
|
||||
|
||||
:param query: Hľadané slovo alebo slovné spojenie pre vyhľadávanie sudcov.
|
||||
:param funkciaFacetFilter: Zoznam funkcií sudcov: ["Sudca", "Predseda", "Podpredseda", "Hosťujúci sudca", "a ine"].
|
||||
:param typSuduFacetFilter: Zoznam typov súdov: ["Okresný súd", "Krajský súd", "Mestský súd",
|
||||
"Najvyšší súd SR", "Správny súd",
|
||||
"Špecializovaný trestný súd"].
|
||||
:param krajFacetFilter: Zoznam krajov: ["Bratislavský kraj", "Košický kraj", "Banskobystrický kraj",
|
||||
"Prešovský kraj", "Žilinský kraj", "Trnavský kraj", "Nitriansky kraj",
|
||||
"Trenčiansky kraj"].
|
||||
:param okresFacetFilter: Zoznam okresov: ["Okres [mesto Slovenska]"] napr. "Okres Bratislava I", "Okres Košice I".
|
||||
:param stavZapisuFacetFilter: Zoznam stavov zápisu: ["prerusenie vykonu - poberatel", "aktivity",
|
||||
"odvolany", "vymazany", "prerusenie vykonu - ina funkce"].
|
||||
:param guidSud: Identifikátor súdu pre filtrovanie sudcov konkrétneho súdu, napr. "sud_101".
|
||||
:param page: Číslo stránky (0 = prvá stránka) pre stránkovanie výsledkov.
|
||||
:param size: Počet záznamov na stránku (predvolené 20) pre stránkovanie výsledkov.
|
||||
:param sortProperty: Atribút pre zoradenie výsledkov, napr. "priezvisko", "meno".
|
||||
:param sortDirection: Smer zoradenia záznamov: "ASC" (predvolené) alebo "DESC".
|
||||
|
||||
:return: Slovník (JSON) obsahujúci zoznam sudcov s detailnými informáciami, metadátami a filtrami.
|
||||
|
||||
:return: Slovník (JSON) obsahujúci zoznam súdov na základe filtrovacích kritérii
|
||||
"""
|
||||
try:
|
||||
url = f"{API_BASE_URL}/v1/sudca"
|
||||
response = requests.get(url, params=args.model_dump())
|
||||
response.raise_for_status()
|
||||
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
print(f"📛🧑⚖️\n {data}")
|
||||
return {"success": True, "data": data}
|
||||
else:
|
||||
return {"success": False, "error": f"Unexpected status code: {response.status_code} ⚠️"}
|
||||
|
||||
except Exception as e:
|
||||
return {"success": False, "error": f"Error : {str(e)} 🛑"}
|
||||
|
||||
@function_tool
|
||||
def judge_id(self, id: str) -> dict:
|
||||
"""
|
||||
Načítanie detailu sudcu na základe identifikátora.
|
||||
|
||||
:param id: Identifikátor sudcu (povinný parameter), napr. "sudca_123", "sudca_456".
|
||||
|
||||
:return: Slovník (JSON) obsahujúci detailné informácie o sudcovi na základe identifikátora.
|
||||
"""
|
||||
try:
|
||||
url = f"{API_BASE_URL}/v1/sudca/{id}"
|
||||
response = requests.get(url)
|
||||
response.raise_for_status()
|
||||
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
print(f"⛔🧑⚖️\n {data}")
|
||||
return {"success": True, "data": data}
|
||||
else:
|
||||
return {"success": False, "error": f"Unexpected status code: {response.status_code} ⚠️"}
|
||||
|
||||
except Exception as e:
|
||||
return {"success": False, "error": f"Error : {str(e)} 🛑"}
|
||||
|
||||
class JudgeAutocomplete(BaseModel):
|
||||
query: Optional[str] = None
|
||||
guidSud: Optional[str] = None
|
||||
limit: Optional[conint(ge=1)] = None
|
||||
|
||||
@function_tool
|
||||
def judge_autocomplete(self, args: JudgeAutocomplete) -> dict:
|
||||
"""
|
||||
Autocomplete služba pre vyhľadávanie sudcov.
|
||||
|
||||
:param query: Hľadané slovo alebo slovné spojenie.
|
||||
:param guidSud: Identifikátor súdu pre filtrovanie sudcov konkrétneho súdu.
|
||||
Príklad: "sud_175"
|
||||
:param limit: Maximálny počet návrhov, ktoré sa majú vrátiť.
|
||||
None → API vráti 5 dokumentov (predvolená hodnota).
|
||||
Hodnota 0 spôsobí chybu API, preto použite None namiesto 0
|
||||
|
||||
:return: Slovník (JSON) obsahujúci zoznam návrhov sudcov pre autocomplete.
|
||||
"""
|
||||
try:
|
||||
url = f"{API_BASE_URL}/v1/sudca/autocomplete"
|
||||
response = requests.get(url, args.model_dump())
|
||||
response.raise_for_status()
|
||||
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
print(f"⭕🧑⚖️\n {data}")
|
||||
return {"success": True, "data": data}
|
||||
else:
|
||||
return {"success": False, "error": f"Unexpected status code: {response.status_code} ⚠️"}
|
||||
|
||||
except Exception as e:
|
||||
return {"success": False, "error": f"Error : {str(e)} 🛑"}
|
||||
121
core/tools/zmluvy.py
Normal file
121
core/tools/zmluvy.py
Normal file
@ -0,0 +1,121 @@
|
||||
import requests
|
||||
from pydantic import BaseModel, conint
|
||||
from typing import List, Optional
|
||||
from enum import Enum
|
||||
|
||||
from agents import function_tool
|
||||
|
||||
API_BASE_URL = "https://obcan.justice.sk/pilot/api/ress-isu-service"
|
||||
|
||||
|
||||
class SortDirection(str, Enum):
|
||||
ASC = "ASC"
|
||||
DESC = "DESC"
|
||||
|
||||
class ContractsAPI:
|
||||
|
||||
class ContractsList(BaseModel):
|
||||
query : Optional[str] = None
|
||||
typDokumentuFacetFilter: Optional[List[str]] = None
|
||||
odberatelFacetFilter: Optional[List[str]] = None
|
||||
dodavatelFacetFilter: Optional[List[str]] = None
|
||||
hodnotaZmluvyFacetFilter: Optional[List[str]] = None
|
||||
guidSud: Optional[str] = None
|
||||
sortProperty: Optional[str] = None
|
||||
sortDirection: SortDirection = SortDirection.ASC
|
||||
page: Optional[int] = None
|
||||
size : conint(ge=0) = 20
|
||||
|
||||
@function_tool
|
||||
def about_contracts(args: ContractsList) -> dict:
|
||||
"""
|
||||
Načítanie zoznamu zmlúv podľa zadaných filtrov.
|
||||
|
||||
:param query: Hľadaný výraz, podľa ktorého sa vyhľadávajú zmluvy.
|
||||
:param typDokumentuFacetFilter: Typy dokumentov ako fazetový filter (napr. ["ZMLUVA","FAKTURA"]).
|
||||
:param odberatelFacetFilter: Odberatelia pre fazetový filter.
|
||||
:param dodavatelFacetFilter: Dodávatelia pre fazetový filter.
|
||||
:param hodnotaZmluvyFacetFilter: Hodnoty zmlúv (filtrovacie intervaly).
|
||||
:param guidSud: Identifikátor súdu (napr. "sud_101").
|
||||
:param sortProperty: Atribút na triedenie výsledkov.
|
||||
:param sortDirection: ASC alebo DESC.
|
||||
:param page: Číslo strany (0 = prvá strana).
|
||||
:param size: Počet výsledkov na strane.
|
||||
|
||||
:return: JSON so zoznamom zmlúv a metadátami.
|
||||
"""
|
||||
try:
|
||||
url = f"{API_BASE_URL}/v1/zmluvy"
|
||||
response = requests.get(url, params=args.model_dump())
|
||||
response.raise_for_status()
|
||||
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
print(f"⭕🖇️\n {data}")
|
||||
return {"success": True, "data": data}
|
||||
else:
|
||||
return {"success": False, "error": f"Unexpected status code: {response.status_code} ⚠️"}
|
||||
|
||||
except Exception as e:
|
||||
return {"success": False, "error": f"Error get contract details: {str(e)} 🛑"}
|
||||
|
||||
class ContractDetail(BaseModel):
|
||||
idZmluvy: str
|
||||
|
||||
@function_tool
|
||||
def get_contract(args: ContractDetail) -> dict:
|
||||
"""
|
||||
Načítanie detailu zmluvy podľa jej identifikátora.
|
||||
|
||||
:param idZmluvy: Jedinečný identifikátor zmluvy.
|
||||
|
||||
:return: JSON slovník obsahujúci detailné informácie o zmluve.
|
||||
"""
|
||||
try:
|
||||
url = f"{API_BASE_URL}/v1/zmluvy/{args.idZmluvy}"
|
||||
response = requests.get(url)
|
||||
response.raise_for_status()
|
||||
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
print(f"⛔🖇️\n {data}")
|
||||
return {"success": True, "data": data }
|
||||
else:
|
||||
return { "success": False, "error": f"Unexpected status code: {response.status_code} ⚠️"}
|
||||
|
||||
except Exception as e:
|
||||
return { "success": False, "error": f"Error get contract details: {str(e)} 🛑" }
|
||||
|
||||
class ContractsAutocomplete(BaseModel):
|
||||
query : Optional[str] = None
|
||||
guidSud: Optional[str] = None
|
||||
limit: Optional[conint(ge=1)] = None
|
||||
|
||||
@function_tool
|
||||
def contracts_autocomplete(args: ContractsAutocomplete) -> dict:
|
||||
"""
|
||||
Autocomplete pre vyhľadávanie zmlúv.
|
||||
|
||||
:param query: Hľadaný text alebo výraz na vyhľadanie zmlúv.
|
||||
:param guidSud: Identifikátor súdu (napr. "sud_101") na filtrovanie zmlúv konkrétneho súdu.
|
||||
:param limit: Maximálny počet výsledkov.
|
||||
None = predvolených 5 výsledkov.
|
||||
Hodnota 0 spôsobí chybu API — použite radšej None.
|
||||
|
||||
:return: JSON slovník obsahujúci zoznam návrhov zmlúv pre autocomplete.
|
||||
"""
|
||||
|
||||
try:
|
||||
url = f"{API_BASE_URL}/v1/zmluvy/autocomplete"
|
||||
response = requests.get(url, params=args.model_dump())
|
||||
response.raise_for_status()
|
||||
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
print(f"📛🖇️\n {data}")
|
||||
return {"success": True, "data": data}
|
||||
else:
|
||||
return {"success": False, "error": f"Unexpected status code: {response.status_code} ⚠️"}
|
||||
|
||||
except Exception as e:
|
||||
return {"success": False, "error": f"Error get contract details: {str(e)} 🛑"}
|
||||
7
main.py
Normal file
7
main.py
Normal file
@ -0,0 +1,7 @@
|
||||
from app.app import create_app
|
||||
|
||||
def main():
|
||||
create_app()
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
4
requirements.txt
Normal file
4
requirements.txt
Normal file
@ -0,0 +1,4 @@
|
||||
openai-agents
|
||||
python-dotenv
|
||||
streamlit
|
||||
requests
|
||||
BIN
test/Examples of questions.pdf
Normal file
BIN
test/Examples of questions.pdf
Normal file
Binary file not shown.
BIN
test/latex_problem.png
Normal file
BIN
test/latex_problem.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 255 KiB |
Loading…
Reference in New Issue
Block a user