Spaces:
Runtime error
Runtime error
Update app.py
Browse files
app.py
CHANGED
|
@@ -11,106 +11,106 @@ import requests
|
|
| 11 |
from pydantic import BaseModel, Field, field_validator
|
| 12 |
|
| 13 |
class PDOKLocationSearchInput(BaseModel):
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
|
| 24 |
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
|
| 32 |
-
|
| 33 |
|
| 34 |
class PDOKLocationInfo(BaseModel):
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
|
| 47 |
|
| 48 |
@tool
|
| 49 |
def pdok_location_info(postal_code: Optional[str] = None, house_number: Optional[str] = None, street_name: Optional[str] = None, city: Optional[str] = None) -> Optional[PDOKLocationInfo]:
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
|
| 61 |
-
|
| 62 |
-
|
| 63 |
-
|
| 64 |
-
|
| 65 |
-
|
| 66 |
-
|
| 67 |
-
|
| 68 |
-
|
| 69 |
-
|
| 70 |
-
|
| 71 |
-
|
| 72 |
-
|
| 73 |
-
|
| 74 |
-
|
| 75 |
-
|
| 76 |
-
|
| 77 |
-
|
| 78 |
-
|
| 79 |
-
|
| 80 |
-
|
| 81 |
-
|
| 82 |
-
|
| 83 |
-
|
| 84 |
-
|
| 85 |
-
|
| 86 |
-
|
| 87 |
-
|
| 88 |
-
|
| 89 |
-
|
| 90 |
-
|
| 91 |
-
|
| 92 |
-
|
| 93 |
-
|
| 94 |
-
|
| 95 |
-
|
| 96 |
-
|
| 97 |
-
|
| 98 |
-
|
| 99 |
-
|
| 100 |
-
|
| 101 |
-
|
| 102 |
-
|
| 103 |
-
|
| 104 |
-
|
| 105 |
-
|
| 106 |
-
|
| 107 |
-
|
| 108 |
-
|
| 109 |
-
|
| 110 |
-
|
| 111 |
-
|
| 112 |
-
|
| 113 |
-
|
| 114 |
|
| 115 |
@tool
|
| 116 |
def my_custom_tool(arg1:str, arg2:int)-> str: #it's import to specify the return type
|
|
|
|
| 11 |
from pydantic import BaseModel, Field, field_validator
|
| 12 |
|
| 13 |
class PDOKLocationSearchInput(BaseModel):
|
| 14 |
+
postal_code: Optional[str] = Field(None, description="Postal code in the format '1234 AA'.")
|
| 15 |
+
house_number: Optional[str] = Field(None, description="House number.")
|
| 16 |
+
street_name: Optional[str] = Field(None, description="Street name.")
|
| 17 |
+
city: Optional[str] = Field(None, description="City name.")
|
| 18 |
+
|
| 19 |
+
@field_validator('postal_code')
|
| 20 |
+
def validate_postal_code(cls, v):
|
| 21 |
+
if v is not None and (len(v) != 7 or not v[0:4].isdigit() or v[4] != " " or not v[5:7].isalpha()):
|
| 22 |
+
raise ValueError("Invalid postal code format. It must be '1234 AA'.")
|
| 23 |
+
return v
|
| 24 |
|
| 25 |
+
def construct_query(self) -> str:
|
| 26 |
+
"""Constructs the query string based on provided inputs."""
|
| 27 |
+
if self.postal_code and self.house_number:
|
| 28 |
+
return f"{self.postal_code} {self.house_number}"
|
| 29 |
+
elif self.street_name and self.city and self.house_number:
|
| 30 |
+
return f"{self.street_name} {self.house_number}, {self.city}"
|
| 31 |
+
else:
|
| 32 |
+
return ""
|
| 33 |
|
| 34 |
class PDOKLocationInfo(BaseModel):
|
| 35 |
+
type: str
|
| 36 |
+
weergavenaam: str
|
| 37 |
+
straatnaam: str
|
| 38 |
+
huisnummer: int
|
| 39 |
+
huisletter: Optional[str]
|
| 40 |
+
huisnummertoevoeging: Optional[str]
|
| 41 |
+
postcode: str
|
| 42 |
+
woonplaatsnaam: str
|
| 43 |
+
gemeentenaam: str
|
| 44 |
+
provincienaam: str
|
| 45 |
+
centroide_ll: str
|
| 46 |
+
centroide_rd: str
|
| 47 |
|
| 48 |
@tool
|
| 49 |
def pdok_location_info(postal_code: Optional[str] = None, house_number: Optional[str] = None, street_name: Optional[str] = None, city: Optional[str] = None) -> Optional[PDOKLocationInfo]:
|
| 50 |
+
"""Provides information about a Dutch address or postal code.
|
| 51 |
+
|
| 52 |
+
Args:
|
| 53 |
+
postal_code: Postal code in the format '1234 AA'.
|
| 54 |
+
house_number: House number.
|
| 55 |
+
street_name: Street name.
|
| 56 |
+
city: City name.
|
| 57 |
+
|
| 58 |
+
Returns:
|
| 59 |
+
A PDOKLocationInfo object containing the location information, or None if no results are found.
|
| 60 |
+
"""
|
| 61 |
+
|
| 62 |
+
base_url = "https://api.pdok.nl/bzk/locatieserver/search/v3_1/free"
|
| 63 |
+
headers = {"accept": "application/json"}
|
| 64 |
+
|
| 65 |
+
input_data = PDOKLocationSearchInput(postal_code=postal_code, house_number=house_number, street_name=street_name, city=city)
|
| 66 |
+
query_string = input_data.construct_query()
|
| 67 |
+
|
| 68 |
+
if not query_string:
|
| 69 |
+
return None
|
| 70 |
+
|
| 71 |
+
params = {
|
| 72 |
+
"q": query_string,
|
| 73 |
+
"fl": "*", # Request all fields
|
| 74 |
+
"fq": "type:(gemeente OR woonplaats OR weg OR postcode OR adres)",
|
| 75 |
+
"df": "tekst",
|
| 76 |
+
"bq": "type:provincie^1.5",
|
| 77 |
+
"bq": "type:gemeente^1.5",
|
| 78 |
+
"bq": "type:woonplaats^1.5",
|
| 79 |
+
"bq": "type:weg^1.5",
|
| 80 |
+
"bq": "type:postcode^0.5",
|
| 81 |
+
"bq": "type:adres^1",
|
| 82 |
+
"start": 0,
|
| 83 |
+
"rows": 10,
|
| 84 |
+
"sort": "score desc,sortering asc,weergavenaam asc",
|
| 85 |
+
"wt": "json",
|
| 86 |
+
}
|
| 87 |
+
|
| 88 |
+
try:
|
| 89 |
+
response = requests.get(base_url, params=params, headers=headers)
|
| 90 |
+
response.raise_for_status()
|
| 91 |
+
data = response.json()
|
| 92 |
+
|
| 93 |
+
docs = data.get("response", {}).get("docs", [])
|
| 94 |
+
if not docs:
|
| 95 |
+
return None
|
| 96 |
+
|
| 97 |
+
first_result = docs[0]
|
| 98 |
+
location_info = PDOKLocationInfo(**first_result)
|
| 99 |
+
|
| 100 |
+
# Format the output in a more user-friendly way
|
| 101 |
+
print(f"Information about: {location_info.weergavenaam}")
|
| 102 |
+
print("-" * 30)
|
| 103 |
+
for field, value in location_info.dict().items():
|
| 104 |
+
print(f" {field.capitalize()}: {value}")
|
| 105 |
+
|
| 106 |
+
return location_info
|
| 107 |
+
|
| 108 |
+
except requests.exceptions.RequestException as e:
|
| 109 |
+
print(f"Error during API request: {e}")
|
| 110 |
+
return None
|
| 111 |
+
except (ValueError, KeyError) as e:
|
| 112 |
+
print(f"Error processing API response: {e}")
|
| 113 |
+
return None
|
| 114 |
|
| 115 |
@tool
|
| 116 |
def my_custom_tool(arg1:str, arg2:int)-> str: #it's import to specify the return type
|