From 611456fd4949d0a7cc101da7df376cc7b8213ad2 Mon Sep 17 00:00:00 2001 From: saidsurucu Date: Thu, 17 Jul 2025 22:43:55 +0300 Subject: [PATCH] compress bedesten enum --- bedesten_mcp_module/client.py | 8 +++ bedesten_mcp_module/enums.py | 113 ++++++++++++++++++++++++++++++++++ bedesten_mcp_module/models.py | 34 +++------- check_response_format.py | 21 +++++++ mcp_server_main.py | 9 ++- 5 files changed, 156 insertions(+), 29 deletions(-) create mode 100644 bedesten_mcp_module/enums.py create mode 100644 check_response_format.py diff --git a/bedesten_mcp_module/client.py b/bedesten_mcp_module/client.py index f9a0956..136b82f 100644 --- a/bedesten_mcp_module/client.py +++ b/bedesten_mcp_module/client.py @@ -12,6 +12,7 @@ from .models import ( BedestenDocumentRequest, BedestenDocumentResponse, BedestenDocumentMarkdown, BedestenDocumentRequestData ) +from .enums import get_full_birim_adi logger = logging.getLogger(__name__) @@ -49,6 +50,13 @@ class BedestenApiClient: """ logger.info(f"BedestenApiClient: Searching documents with phrase: {search_request.data.phrase}") + # Map abbreviated birimAdi to full Turkish name before sending to API + if search_request.data.birimAdi: + original_birim_adi = search_request.data.birimAdi + mapped_birim_adi = get_full_birim_adi(original_birim_adi) + search_request.data.birimAdi = mapped_birim_adi + logger.info(f"BedestenApiClient: Mapped birimAdi '{original_birim_adi}' to '{mapped_birim_adi}'") + try: response = await self.http_client.post( self.SEARCH_ENDPOINT, diff --git a/bedesten_mcp_module/enums.py b/bedesten_mcp_module/enums.py new file mode 100644 index 0000000..7cef054 --- /dev/null +++ b/bedesten_mcp_module/enums.py @@ -0,0 +1,113 @@ +# bedesten_mcp_module/enums.py + +from typing import Literal + +# Unified compressed enum for both Yargıtay and Danıştay chambers +BirimAdiEnum = Literal[ + "ALL", # All chambers + + # Yargıtay (Court of Cassation) - Civil Chambers + "H1", "H2", "H3", "H4", "H5", "H6", "H7", "H8", "H9", "H10", + "H11", "H12", "H13", "H14", "H15", "H16", "H17", "H18", "H19", "H20", + "H21", "H22", "H23", + + # Yargıtay - Criminal Chambers + "C1", "C2", "C3", "C4", "C5", "C6", "C7", "C8", "C9", "C10", + "C11", "C12", "C13", "C14", "C15", "C16", "C17", "C18", "C19", "C20", + "C21", "C22", "C23", + + # Yargıtay - Councils and Assemblies + "HGK", # Hukuk Genel Kurulu + "CGK", # Ceza Genel Kurulu + "BGK", # Büyük Genel Kurulu + "HBK", # Hukuk Daireleri Başkanlar Kurulu + "CBK", # Ceza Daireleri Başkanlar Kurulu + + # Danıştay (Council of State) - Chambers + "D1", "D2", "D3", "D4", "D5", "D6", "D7", "D8", "D9", "D10", + "D11", "D12", "D13", "D14", "D15", "D16", "D17", + + # Danıştay - Councils and Boards + "DBGK", # Büyük Gen.Kur. (Grand General Assembly) + "IDDK", # İdare Dava Daireleri Kurulu + "VDDK", # Vergi Dava Daireleri Kurulu + "IBK", # İçtihatları Birleştirme Kurulu + "IIK", # İdari İşler Kurulu + "DBK", # Başkanlar Kurulu + + # Military High Administrative Court + "AYIM", # Askeri Yüksek İdare Mahkemesi + "AYIMDK", # Askeri Yüksek İdare Mahkemesi Daireler Kurulu + "AYIMB", # Askeri Yüksek İdare Mahkemesi Başsavcılığı + "AYIM1", # Askeri Yüksek İdare Mahkemesi 1. Daire + "AYIM2", # Askeri Yüksek İdare Mahkemesi 2. Daire + "AYIM3" # Askeri Yüksek İdare Mahkemesi 3. Daire +] + +# Mapping from abbreviated values to full Turkish API values +BIRIM_ADI_MAPPING = { + "ALL": None, # Will be handled specially in client + + # Yargıtay Civil Chambers (1-23) + "H1": "1. Hukuk Dairesi", "H2": "2. Hukuk Dairesi", "H3": "3. Hukuk Dairesi", + "H4": "4. Hukuk Dairesi", "H5": "5. Hukuk Dairesi", "H6": "6. Hukuk Dairesi", + "H7": "7. Hukuk Dairesi", "H8": "8. Hukuk Dairesi", "H9": "9. Hukuk Dairesi", + "H10": "10. Hukuk Dairesi", "H11": "11. Hukuk Dairesi", "H12": "12. Hukuk Dairesi", + "H13": "13. Hukuk Dairesi", "H14": "14. Hukuk Dairesi", "H15": "15. Hukuk Dairesi", + "H16": "16. Hukuk Dairesi", "H17": "17. Hukuk Dairesi", "H18": "18. Hukuk Dairesi", + "H19": "19. Hukuk Dairesi", "H20": "20. Hukuk Dairesi", "H21": "21. Hukuk Dairesi", + "H22": "22. Hukuk Dairesi", "H23": "23. Hukuk Dairesi", + + # Yargıtay Criminal Chambers (1-23) + "C1": "1. Ceza Dairesi", "C2": "2. Ceza Dairesi", "C3": "3. Ceza Dairesi", + "C4": "4. Ceza Dairesi", "C5": "5. Ceza Dairesi", "C6": "6. Ceza Dairesi", + "C7": "7. Ceza Dairesi", "C8": "8. Ceza Dairesi", "C9": "9. Ceza Dairesi", + "C10": "10. Ceza Dairesi", "C11": "11. Ceza Dairesi", "C12": "12. Ceza Dairesi", + "C13": "13. Ceza Dairesi", "C14": "14. Ceza Dairesi", "C15": "15. Ceza Dairesi", + "C16": "16. Ceza Dairesi", "C17": "17. Ceza Dairesi", "C18": "18. Ceza Dairesi", + "C19": "19. Ceza Dairesi", "C20": "20. Ceza Dairesi", "C21": "21. Ceza Dairesi", + "C22": "22. Ceza Dairesi", "C23": "23. Ceza Dairesi", + + # Yargıtay Councils and Assemblies + "HGK": "Hukuk Genel Kurulu", + "CGK": "Ceza Genel Kurulu", + "BGK": "Büyük Genel Kurulu", + "HBK": "Hukuk Daireleri Başkanlar Kurulu", + "CBK": "Ceza Daireleri Başkanlar Kurulu", + + # Danıştay Chambers (1-17) + "D1": "1. Daire", "D2": "2. Daire", "D3": "3. Daire", "D4": "4. Daire", + "D5": "5. Daire", "D6": "6. Daire", "D7": "7. Daire", "D8": "8. Daire", + "D9": "9. Daire", "D10": "10. Daire", "D11": "11. Daire", "D12": "12. Daire", + "D13": "13. Daire", "D14": "14. Daire", "D15": "15. Daire", "D16": "16. Daire", + "D17": "17. Daire", + + # Danıştay Councils and Boards + "DBGK": "Büyük Gen.Kur.", + "IDDK": "İdare Dava Daireleri Kurulu", + "VDDK": "Vergi Dava Daireleri Kurulu", + "IBK": "İçtihatları Birleştirme Kurulu", + "IIK": "İdari İşler Kurulu", + "DBK": "Başkanlar Kurulu", + + # Military High Administrative Court + "AYIM": "Askeri Yüksek İdare Mahkemesi", + "AYIMDK": "Askeri Yüksek İdare Mahkemesi Daireler Kurulu", + "AYIMB": "Askeri Yüksek İdare Mahkemesi Başsavcılığı", + "AYIM1": "Askeri Yüksek İdare Mahkemesi 1. Daire", + "AYIM2": "Askeri Yüksek İdare Mahkemesi 2. Daire", + "AYIM3": "Askeri Yüksek İdare Mahkemesi 3. Daire" +} + +# Helper function to get full Turkish name from abbreviated value +def get_full_birim_adi(abbreviated_value: str) -> str: + """Convert abbreviated birimAdi value to full Turkish name for API calls.""" + if abbreviated_value == "ALL" or not abbreviated_value: + return "" # Empty string for ALL or None + + return BIRIM_ADI_MAPPING.get(abbreviated_value, abbreviated_value) + +# Helper function to validate abbreviated value +def is_valid_birim_adi(abbreviated_value: str) -> bool: + """Check if abbreviated birimAdi value is valid.""" + return abbreviated_value in BIRIM_ADI_MAPPING \ No newline at end of file diff --git a/bedesten_mcp_module/models.py b/bedesten_mcp_module/models.py index 3a04d4d..86bf5e0 100644 --- a/bedesten_mcp_module/models.py +++ b/bedesten_mcp_module/models.py @@ -4,8 +4,8 @@ from pydantic import BaseModel, Field from typing import List, Optional, Dict, Any, Literal, Union from datetime import datetime -# Import YargitayBirimEnum for chamber filtering -from yargitay_mcp_module.models import YargitayBirimEnum +# Import compressed BirimAdiEnum for chamber filtering +from .enums import BirimAdiEnum # Court Type Options for Unified Search BedestenCourtTypeEnum = Literal[ @@ -16,37 +16,17 @@ BedestenCourtTypeEnum = Literal[ "KYB" # Extraordinary Appeals (Kanun Yararına Bozma) ] -# Danıştay Chamber/Board Options -DanistayBirimEnum = Literal[ - "ALL", # "ALL" for all chambers - # Main Councils - "Büyük Gen.Kur.", # Grand General Assembly - "İdare Dava Daireleri Kurulu", # Administrative Cases Chambers Council - "Vergi Dava Daireleri Kurulu", # Tax Cases Chambers Council - "İçtihatları Birleştirme Kurulu", # Precedents Unification Council - "İdari İşler Kurulu", # Administrative Affairs Council - "Başkanlar Kurulu", # Presidents Council - # Chambers - "1. Daire", "2. Daire", "3. Daire", "4. Daire", "5. Daire", - "6. Daire", "7. Daire", "8. Daire", "9. Daire", "10. Daire", - "11. Daire", "12. Daire", "13. Daire", "14. Daire", "15. Daire", - "16. Daire", "17. Daire", - # Military High Administrative Court - "Askeri Yüksek İdare Mahkemesi", - "Askeri Yüksek İdare Mahkemesi Daireler Kurulu", - "Askeri Yüksek İdare Mahkemesi Başsavcılığı", - "Askeri Yüksek İdare Mahkemesi 1. Daire", - "Askeri Yüksek İdare Mahkemesi 2. Daire", - "Askeri Yüksek İdare Mahkemesi 3. Daire" -] - # Search Request Models class BedestenSearchData(BaseModel): pageSize: int = Field(..., description="Results per page (1-10)") pageNumber: int = Field(..., description="Page number (1-indexed)") itemTypeList: List[str] = Field(..., description="Court type filter (YARGITAYKARARI/DANISTAYKARAR/YERELHUKUK/ISTINAFHUKUK/KYB)") phrase: str = Field(..., description="Search phrase (use \"exact phrase\" for precise matching)") - birimAdi: Optional[Union[YargitayBirimEnum, DanistayBirimEnum]] = Field(None, description="Chamber filter (optional)") + birimAdi: Optional[BirimAdiEnum] = Field(None, description=""" + Chamber filter (optional). Abbreviated values with Turkish names: + • Yargıtay: H1-H23 (1-23. Hukuk Dairesi), C1-C23 (1-23. Ceza Dairesi), HGK (Hukuk Genel Kurulu), CGK (Ceza Genel Kurulu), BGK (Büyük Genel Kurulu), HBK (Hukuk Daireleri Başkanlar Kurulu), CBK (Ceza Daireleri Başkanlar Kurulu) + • Danıştay: D1-D17 (1-17. Daire), DBGK (Büyük Gen.Kur.), IDDK (İdare Dava Daireleri Kurulu), VDDK (Vergi Dava Daireleri Kurulu), IBK (İçtihatları Birleştirme Kurulu), IIK (İdari İşler Kurulu), DBK (Başkanlar Kurulu), AYIM (Askeri Yüksek İdare Mahkemesi), AYIM1-3 (Askeri Yüksek İdare Mahkemesi 1-3. Daire) + """) kararTarihiStart: Optional[str] = Field(None, description="Start date (ISO 8601 format)") kararTarihiEnd: Optional[str] = Field(None, description="End date (ISO 8601 format)") sortFields: List[str] = Field(default=["KARAR_TARIHI"], description="Sort fields") diff --git a/check_response_format.py b/check_response_format.py new file mode 100644 index 0000000..1e814c4 --- /dev/null +++ b/check_response_format.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python3 +from fastmcp import Client +from mcp_server_main import app +import json +import asyncio + +async def check_response_format(): + client = Client(app) + async with client: + result = await client.call_tool('search_bedesten_unified', { + 'phrase': 'mülkiyet', + 'court_types': ['YARGITAYKARARI'], + 'birimAdi': 'H1', + 'pageSize': 3 + }) + if result and result.content: + data = json.loads(result.content[0].text) + print('Response keys:', list(data.keys())) + print('Sample response:', json.dumps(data, indent=2, ensure_ascii=False)[:500]) + +asyncio.run(check_response_format()) \ No newline at end of file diff --git a/mcp_server_main.py b/mcp_server_main.py index a8e5550..b353bd5 100644 --- a/mcp_server_main.py +++ b/mcp_server_main.py @@ -244,8 +244,9 @@ from yargitay_mcp_module.models import ( from bedesten_mcp_module.client import BedestenApiClient from bedesten_mcp_module.models import ( BedestenSearchRequest, BedestenSearchData, - BedestenDocumentMarkdown, DanistayBirimEnum, BedestenCourtTypeEnum + BedestenDocumentMarkdown, BedestenCourtTypeEnum ) +from bedesten_mcp_module.enums import BirimAdiEnum from danistay_mcp_module.client import DanistayApiClient from danistay_mcp_module.models import ( DanistayKeywordSearchRequest, DanistayDetailedSearchRequest, @@ -1778,7 +1779,11 @@ For best results, use exact phrases with quotes for legal terms."""), ), pageSize: int = Field(10, ge=1, le=10, description="Results per page (1-10)"), pageNumber: int = Field(1, ge=1, description="Page number"), - birimAdi: Optional[Union[YargitayBirimEnum, DanistayBirimEnum]] = Field(None, description="Chamber filter (optional)"), + birimAdi: Optional[BirimAdiEnum] = Field(None, description=""" + Chamber filter (optional). Abbreviated values with Turkish names: + • Yargıtay: H1-H23 (1-23. Hukuk Dairesi), C1-C23 (1-23. Ceza Dairesi), HGK (Hukuk Genel Kurulu), CGK (Ceza Genel Kurulu), BGK (Büyük Genel Kurulu), HBK (Hukuk Daireleri Başkanlar Kurulu), CBK (Ceza Daireleri Başkanlar Kurulu) + • Danıştay: D1-D17 (1-17. Daire), DBGK (Büyük Gen.Kur.), IDDK (İdare Dava Daireleri Kurulu), VDDK (Vergi Dava Daireleri Kurulu), IBK (İçtihatları Birleştirme Kurulu), IIK (İdari İşler Kurulu), DBK (Başkanlar Kurulu), AYIM (Askeri Yüksek İdare Mahkemesi), AYIM1-3 (Askeri Yüksek İdare Mahkemesi 1-3. Daire) + """), kararTarihiStart: str = Field("", description="Start date (ISO 8601 format)"), kararTarihiEnd: str = Field("", description="End date (ISO 8601 format)") ) -> dict: