Spaces:
Running
Running
Merge remote-tracking branch 'origin/main' into qwen
Browse files- .streamlit/secrets.toml +0 -0
- app.py +194 -44
- config.py +4 -0
- datasets/{asia β example}/golden_labels.json +0 -0
- datasets/example2/golden_labels.json +309 -0
- datasets/example3/golden_labels.json +309 -0
- geo_bot.py +8 -14
- main.py +0 -6
- mapcrunch_controller.py +26 -0
- requirements.txt +1 -0
.streamlit/secrets.toml
ADDED
|
File without changes
|
app.py
CHANGED
|
@@ -2,13 +2,19 @@ import streamlit as st
|
|
| 2 |
import json
|
| 3 |
import os
|
| 4 |
import time
|
| 5 |
-
|
| 6 |
-
from PIL import Image
|
| 7 |
from pathlib import Path
|
| 8 |
|
| 9 |
-
from geo_bot import GeoBot
|
| 10 |
from benchmark import MapGuesserBenchmark
|
| 11 |
-
from config import
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 12 |
|
| 13 |
|
| 14 |
# Simple API key setup
|
|
@@ -22,6 +28,24 @@ if "HF_TOKEN" in st.secrets:
|
|
| 22 |
os.environ["HF_TOKEN"] = st.secrets["HF_TOKEN"]
|
| 23 |
|
| 24 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 25 |
def get_available_datasets():
|
| 26 |
datasets_dir = Path("datasets")
|
| 27 |
if not datasets_dir.exists():
|
|
@@ -36,54 +60,164 @@ def get_available_datasets():
|
|
| 36 |
|
| 37 |
|
| 38 |
# UI Setup
|
| 39 |
-
st.set_page_config(
|
|
|
|
|
|
|
| 40 |
st.title("π§ Omniscient")
|
| 41 |
-
st.markdown("
|
|
|
|
| 42 |
|
|
|
|
|
|
|
|
|
|
| 43 |
# Sidebar
|
| 44 |
with st.sidebar:
|
| 45 |
st.header("Configuration")
|
| 46 |
|
| 47 |
-
#
|
| 48 |
-
|
| 49 |
-
default_dataset = available_datasets[0] if available_datasets else "default"
|
| 50 |
-
|
| 51 |
-
dataset_choice = st.selectbox("Dataset", available_datasets, index=0)
|
| 52 |
-
model_choice = st.selectbox("Model", list(MODELS_CONFIG.keys()))
|
| 53 |
-
steps_per_sample = st.slider("Max Steps", 3, 20, 10)
|
| 54 |
-
temperature = st.slider(
|
| 55 |
-
"Temperature",
|
| 56 |
-
0.0,
|
| 57 |
-
2.0,
|
| 58 |
-
0.0,
|
| 59 |
-
0.1,
|
| 60 |
-
help="Controls randomness in AI responses. 0.0 = deterministic, higher = more creative",
|
| 61 |
-
)
|
| 62 |
|
| 63 |
-
|
| 64 |
-
|
| 65 |
-
|
| 66 |
-
|
| 67 |
-
golden_labels = json.load(f).get("samples", [])
|
| 68 |
|
| 69 |
-
st.
|
| 70 |
-
|
| 71 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 72 |
st.stop()
|
| 73 |
|
| 74 |
-
|
| 75 |
-
|
| 76 |
-
f"β Dataset '{dataset_choice}' not found at {data_paths['golden_labels']}"
|
| 77 |
)
|
| 78 |
-
|
| 79 |
-
st.
|
| 80 |
-
except Exception as e:
|
| 81 |
-
st.error(f"β Error loading dataset '{dataset_choice}': {str(e)}")
|
| 82 |
-
st.stop()
|
| 83 |
|
| 84 |
-
|
| 85 |
-
|
| 86 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 87 |
|
| 88 |
start_button = st.button("π Start", type="primary")
|
| 89 |
|
|
@@ -93,7 +227,9 @@ if start_button:
|
|
| 93 |
config = MODELS_CONFIG[model_choice]
|
| 94 |
model_class = get_model_class(config["class"])
|
| 95 |
|
| 96 |
-
benchmark_helper = MapGuesserBenchmark(
|
|
|
|
|
|
|
| 97 |
all_results = []
|
| 98 |
|
| 99 |
progress_bar = st.progress(0)
|
|
@@ -106,10 +242,16 @@ if start_button:
|
|
| 106 |
) as bot:
|
| 107 |
for i, sample in enumerate(test_samples):
|
| 108 |
st.divider()
|
| 109 |
-
st.header(f"Sample {i + 1}/{num_samples}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 110 |
|
| 111 |
-
|
| 112 |
-
bot.controller.load_location_from_data(sample)
|
| 113 |
|
| 114 |
# Create containers for UI updates
|
| 115 |
sample_container = st.container()
|
|
@@ -290,3 +432,11 @@ if start_button:
|
|
| 290 |
file_name=f"geo_results_{dataset_choice}_{model_choice}_{num_samples}samples.json",
|
| 291 |
mime="application/json",
|
| 292 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2 |
import json
|
| 3 |
import os
|
| 4 |
import time
|
| 5 |
+
import re
|
|
|
|
| 6 |
from pathlib import Path
|
| 7 |
|
| 8 |
+
from geo_bot import GeoBot
|
| 9 |
from benchmark import MapGuesserBenchmark
|
| 10 |
+
from config import (
|
| 11 |
+
MODELS_CONFIG,
|
| 12 |
+
get_data_paths,
|
| 13 |
+
SUCCESS_THRESHOLD_KM,
|
| 14 |
+
get_model_class,
|
| 15 |
+
DEFAULT_MODEL,
|
| 16 |
+
DEFAULT_TEMPERATURE,
|
| 17 |
+
)
|
| 18 |
|
| 19 |
|
| 20 |
# Simple API key setup
|
|
|
|
| 28 |
os.environ["HF_TOKEN"] = st.secrets["HF_TOKEN"]
|
| 29 |
|
| 30 |
|
| 31 |
+
def convert_google_to_mapcrunch_url(google_url):
|
| 32 |
+
"""Convert Google Maps URL to MapCrunch URL format."""
|
| 33 |
+
try:
|
| 34 |
+
# Extract coordinates using regex
|
| 35 |
+
match = re.search(r"@(-?\d+\.\d+),(-?\d+\.\d+)", google_url)
|
| 36 |
+
if not match:
|
| 37 |
+
return None
|
| 38 |
+
|
| 39 |
+
lat, lon = match.groups()
|
| 40 |
+
# MapCrunch format: lat_lon_heading_pitch_zoom
|
| 41 |
+
# Using default values for heading (317.72), pitch (0.86), and zoom (0)
|
| 42 |
+
mapcrunch_url = f"http://www.mapcrunch.com/p/{lat}_{lon}_317.72_0.86_0"
|
| 43 |
+
return mapcrunch_url
|
| 44 |
+
except Exception as e:
|
| 45 |
+
st.error(f"Error converting URL: {str(e)}")
|
| 46 |
+
return None
|
| 47 |
+
|
| 48 |
+
|
| 49 |
def get_available_datasets():
|
| 50 |
datasets_dir = Path("datasets")
|
| 51 |
if not datasets_dir.exists():
|
|
|
|
| 60 |
|
| 61 |
|
| 62 |
# UI Setup
|
| 63 |
+
st.set_page_config(
|
| 64 |
+
page_title="π§ Omniscient - Multiturn Geographic Intelligence", layout="wide"
|
| 65 |
+
)
|
| 66 |
st.title("π§ Omniscient")
|
| 67 |
+
st.markdown("""
|
| 68 |
+
### *An all-seeing AI agent for geographic analysis and deduction*
|
| 69 |
|
| 70 |
+
Omniscient engages in a multi-turn reasoning process β collecting visual clues, asking intelligent questions, and narrowing down locations step by step.
|
| 71 |
+
Whether it's identifying terrain, interpreting signs, or tracing road patterns, this AI agent learns, adapts, and solves like a true geo-detective.
|
| 72 |
+
""")
|
| 73 |
# Sidebar
|
| 74 |
with st.sidebar:
|
| 75 |
st.header("Configuration")
|
| 76 |
|
| 77 |
+
# Mode selection
|
| 78 |
+
mode = st.radio("Mode", ["Dataset Mode", "Online Mode"], index=0)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 79 |
|
| 80 |
+
if mode == "Dataset Mode":
|
| 81 |
+
# Get available datasets and ensure we have a valid default
|
| 82 |
+
available_datasets = get_available_datasets()
|
| 83 |
+
default_dataset = available_datasets[0] if available_datasets else "default"
|
|
|
|
| 84 |
|
| 85 |
+
dataset_choice = st.selectbox("Dataset", available_datasets, index=0)
|
| 86 |
+
model_choice = st.selectbox(
|
| 87 |
+
"Model",
|
| 88 |
+
list(MODELS_CONFIG.keys()),
|
| 89 |
+
index=list(MODELS_CONFIG.keys()).index(DEFAULT_MODEL),
|
| 90 |
+
)
|
| 91 |
+
steps_per_sample = st.slider("Max Steps", 1, 20, 10)
|
| 92 |
+
temperature = st.slider(
|
| 93 |
+
"Temperature",
|
| 94 |
+
0.0,
|
| 95 |
+
2.0,
|
| 96 |
+
DEFAULT_TEMPERATURE,
|
| 97 |
+
0.1,
|
| 98 |
+
help="Controls randomness in AI responses. 0.0 = deterministic, higher = more creative",
|
| 99 |
+
)
|
| 100 |
+
|
| 101 |
+
# Load dataset with error handling
|
| 102 |
+
data_paths = get_data_paths(dataset_choice)
|
| 103 |
+
try:
|
| 104 |
+
with open(data_paths["golden_labels"], "r") as f:
|
| 105 |
+
golden_labels = json.load(f).get("samples", [])
|
| 106 |
+
|
| 107 |
+
st.info(f"Dataset '{dataset_choice}' has {len(golden_labels)} samples")
|
| 108 |
+
if len(golden_labels) == 0:
|
| 109 |
+
st.error(f"Dataset '{dataset_choice}' contains no samples!")
|
| 110 |
+
st.stop()
|
| 111 |
+
|
| 112 |
+
except FileNotFoundError:
|
| 113 |
+
st.error(
|
| 114 |
+
f"β Dataset '{dataset_choice}' not found at {data_paths['golden_labels']}"
|
| 115 |
+
)
|
| 116 |
+
st.info("π‘ Available datasets: " + ", ".join(available_datasets))
|
| 117 |
+
st.stop()
|
| 118 |
+
except Exception as e:
|
| 119 |
+
st.error(f"β Error loading dataset '{dataset_choice}': {str(e)}")
|
| 120 |
st.stop()
|
| 121 |
|
| 122 |
+
num_samples = st.slider(
|
| 123 |
+
"Samples to Test", 1, len(golden_labels), min(3, len(golden_labels))
|
|
|
|
| 124 |
)
|
| 125 |
+
else: # Online Mode
|
| 126 |
+
st.info("Enter a URL to analyze a specific location")
|
|
|
|
|
|
|
|
|
|
| 127 |
|
| 128 |
+
# Add example URLs
|
| 129 |
+
example_google_url = "https://www.google.com/maps/@37.8728123,-122.2445339,3a,75y,3.36h,90t/data=!3m7!1e1!3m5!1s4DTABKOpCL6hdNRgnAHTgw!2e0!6shttps:%2F%2Fstreetviewpixels-pa.googleapis.com%2Fv1%2Fthumbnail%3Fcb_client%3Dmaps_sv.tactile%26w%3D900%26h%3D600%26pitch%3D0%26panoid%3D4DTABKOpCL6hdNRgnAHTgw%26yaw%3D3.3576431!7i13312!8i6656?entry=ttu"
|
| 130 |
+
example_mapcrunch_url = (
|
| 131 |
+
"http://www.mapcrunch.com/p/37.882284_-122.269626_293.91_-6.63_0"
|
| 132 |
+
)
|
| 133 |
+
|
| 134 |
+
# Create tabs for different URL types
|
| 135 |
+
input_tab1, input_tab2 = st.tabs(["Google Maps URL", "MapCrunch URL"])
|
| 136 |
+
|
| 137 |
+
google_url = ""
|
| 138 |
+
mapcrunch_url = ""
|
| 139 |
+
golden_labels = None
|
| 140 |
+
num_samples = None
|
| 141 |
+
|
| 142 |
+
with input_tab1:
|
| 143 |
+
url_col1, url_col2 = st.columns([3, 1])
|
| 144 |
+
with url_col1:
|
| 145 |
+
google_url = st.text_input(
|
| 146 |
+
"Google Maps URL",
|
| 147 |
+
placeholder="https://www.google.com/maps/@37.5851338,-122.1519467,9z?entry=ttu",
|
| 148 |
+
key="google_maps_url",
|
| 149 |
+
)
|
| 150 |
+
st.markdown(
|
| 151 |
+
f"π‘ **Example Location:** [View in Google Maps]({example_google_url})"
|
| 152 |
+
)
|
| 153 |
+
if google_url:
|
| 154 |
+
mapcrunch_url_converted = convert_google_to_mapcrunch_url(google_url)
|
| 155 |
+
if mapcrunch_url_converted:
|
| 156 |
+
st.success(f"Converted to MapCrunch URL: {mapcrunch_url_converted}")
|
| 157 |
+
try:
|
| 158 |
+
match = re.search(r"@(-?\d+\.\d+),(-?\d+\.\d+)", google_url)
|
| 159 |
+
if not match:
|
| 160 |
+
st.error("Invalid Google Maps URL format")
|
| 161 |
+
st.stop()
|
| 162 |
+
|
| 163 |
+
lat, lon = match.groups()
|
| 164 |
+
|
| 165 |
+
golden_labels = [
|
| 166 |
+
{
|
| 167 |
+
"id": "online",
|
| 168 |
+
"lat": float(lat),
|
| 169 |
+
"lng": float(lon),
|
| 170 |
+
"url": mapcrunch_url_converted,
|
| 171 |
+
}
|
| 172 |
+
]
|
| 173 |
+
num_samples = 1
|
| 174 |
+
except Exception as e:
|
| 175 |
+
st.error(f"Invalid Google Maps URL format: {str(e)}")
|
| 176 |
+
else:
|
| 177 |
+
st.error("Invalid Google Maps URL format")
|
| 178 |
+
|
| 179 |
+
with input_tab2:
|
| 180 |
+
st.markdown("π‘ **Example Location:**")
|
| 181 |
+
st.markdown(f"[View in MapCrunch]({example_mapcrunch_url})")
|
| 182 |
+
st.code(example_mapcrunch_url, language="text")
|
| 183 |
+
mapcrunch_url = st.text_input(
|
| 184 |
+
"MapCrunch URL", placeholder=example_mapcrunch_url, key="mapcrunch_url"
|
| 185 |
+
)
|
| 186 |
+
if mapcrunch_url:
|
| 187 |
+
try:
|
| 188 |
+
coords = mapcrunch_url.split("/")[-1].split("_")
|
| 189 |
+
lat, lon = float(coords[0]), float(coords[1])
|
| 190 |
+
golden_labels = [
|
| 191 |
+
{"id": "online", "lat": lat, "lng": lon, "url": mapcrunch_url}
|
| 192 |
+
]
|
| 193 |
+
num_samples = 1
|
| 194 |
+
except Exception as e:
|
| 195 |
+
st.error(f"Invalid MapCrunch URL format: {str(e)}")
|
| 196 |
+
|
| 197 |
+
# Only stop if neither input is provided
|
| 198 |
+
if not google_url and not mapcrunch_url:
|
| 199 |
+
st.warning(
|
| 200 |
+
"Please enter a Google Maps URL or MapCrunch URL, or use the example above."
|
| 201 |
+
)
|
| 202 |
+
st.stop()
|
| 203 |
+
if golden_labels is None or num_samples is None:
|
| 204 |
+
st.warning("Please enter a valid URL.")
|
| 205 |
+
st.stop()
|
| 206 |
+
|
| 207 |
+
model_choice = st.selectbox(
|
| 208 |
+
"Model",
|
| 209 |
+
list(MODELS_CONFIG.keys()),
|
| 210 |
+
index=list(MODELS_CONFIG.keys()).index(DEFAULT_MODEL),
|
| 211 |
+
)
|
| 212 |
+
steps_per_sample = st.slider("Max Steps", 1, 20, 10)
|
| 213 |
+
temperature = st.slider(
|
| 214 |
+
"Temperature",
|
| 215 |
+
0.0,
|
| 216 |
+
2.0,
|
| 217 |
+
DEFAULT_TEMPERATURE,
|
| 218 |
+
0.1,
|
| 219 |
+
help="Controls randomness in AI responses. 0.0 = deterministic, higher = more creative",
|
| 220 |
+
)
|
| 221 |
|
| 222 |
start_button = st.button("π Start", type="primary")
|
| 223 |
|
|
|
|
| 227 |
config = MODELS_CONFIG[model_choice]
|
| 228 |
model_class = get_model_class(config["class"])
|
| 229 |
|
| 230 |
+
benchmark_helper = MapGuesserBenchmark(
|
| 231 |
+
dataset_name=dataset_choice if mode == "Dataset Mode" else "online"
|
| 232 |
+
)
|
| 233 |
all_results = []
|
| 234 |
|
| 235 |
progress_bar = st.progress(0)
|
|
|
|
| 242 |
) as bot:
|
| 243 |
for i, sample in enumerate(test_samples):
|
| 244 |
st.divider()
|
| 245 |
+
st.header(f"Sample {i + 1}/{num_samples}")
|
| 246 |
+
|
| 247 |
+
if mode == "Online Mode":
|
| 248 |
+
# Load the MapCrunch URL directly
|
| 249 |
+
bot.controller.load_url(sample["url"])
|
| 250 |
+
else:
|
| 251 |
+
# Load from dataset as before
|
| 252 |
+
bot.controller.load_location_from_data(sample)
|
| 253 |
|
| 254 |
+
bot.controller.setup_clean_environment()
|
|
|
|
| 255 |
|
| 256 |
# Create containers for UI updates
|
| 257 |
sample_container = st.container()
|
|
|
|
| 432 |
file_name=f"geo_results_{dataset_choice}_{model_choice}_{num_samples}samples.json",
|
| 433 |
mime="application/json",
|
| 434 |
)
|
| 435 |
+
|
| 436 |
+
|
| 437 |
+
def handle_tab_completion():
|
| 438 |
+
"""Handle tab completion for the Google Maps URL input."""
|
| 439 |
+
if st.session_state.google_maps_url == "":
|
| 440 |
+
st.session_state.google_maps_url = (
|
| 441 |
+
"https://www.google.com/maps/@37.5851338,-122.1519467,9z?entry=ttu"
|
| 442 |
+
)
|
config.py
CHANGED
|
@@ -31,6 +31,10 @@ BENCHMARK_CONFIG = {
|
|
| 31 |
# MapCrunch options
|
| 32 |
MAPCRUNCH_OPTIONS = {}
|
| 33 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 34 |
# Model configurations
|
| 35 |
MODELS_CONFIG = {
|
| 36 |
"gpt-4o": {
|
|
|
|
| 31 |
# MapCrunch options
|
| 32 |
MAPCRUNCH_OPTIONS = {}
|
| 33 |
|
| 34 |
+
# Default settings
|
| 35 |
+
DEFAULT_MODEL = "gemini-2.5-pro"
|
| 36 |
+
DEFAULT_TEMPERATURE = 1.0
|
| 37 |
+
|
| 38 |
# Model configurations
|
| 39 |
MODELS_CONFIG = {
|
| 40 |
"gpt-4o": {
|
datasets/{asia β example}/golden_labels.json
RENAMED
|
File without changes
|
datasets/example2/golden_labels.json
ADDED
|
@@ -0,0 +1,309 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"metadata": {
|
| 3 |
+
"dataset_name": "example2",
|
| 4 |
+
"collection_date": "2025-06-12T15:26:27.073898",
|
| 5 |
+
"collection_options": {}
|
| 6 |
+
},
|
| 7 |
+
"samples": [
|
| 8 |
+
{
|
| 9 |
+
"id": "e958ec37-0b30-4b30-b508-df614acb489f",
|
| 10 |
+
"timestamp": "2025-06-12T15:25:22.208434",
|
| 11 |
+
"lat": 41.52785178236295,
|
| 12 |
+
"lng": 22.061235302695696,
|
| 13 |
+
"address": "Unknown",
|
| 14 |
+
"pano_id": "hB2IrvH7f4iapBJZ_jNMJg",
|
| 15 |
+
"pov": {
|
| 16 |
+
"heading": -201.27999999999997,
|
| 17 |
+
"pitch": 5,
|
| 18 |
+
"zoom": 1.0000039848465483
|
| 19 |
+
},
|
| 20 |
+
"url_slug": "41.527852_22.061235_-201.28_-5.00_0",
|
| 21 |
+
"thumbnail_path": "e958ec37-0b30-4b30-b508-df614acb489f.jpg"
|
| 22 |
+
},
|
| 23 |
+
{
|
| 24 |
+
"id": "8c047700-2775-4161-bfa5-9c5f966ee929",
|
| 25 |
+
"timestamp": "2025-06-12T15:25:25.564230",
|
| 26 |
+
"lat": 35.51112041872643,
|
| 27 |
+
"lng": 138.76733244706546,
|
| 28 |
+
"address": "Unknown",
|
| 29 |
+
"pano_id": "KSCuXhlMyISBw9Poh1hG8w",
|
| 30 |
+
"pov": {
|
| 31 |
+
"heading": 61.72000000000003,
|
| 32 |
+
"pitch": 5,
|
| 33 |
+
"zoom": 1.0000046104496552
|
| 34 |
+
},
|
| 35 |
+
"url_slug": "35.511120_138.767332_61.72_-5.00_0",
|
| 36 |
+
"thumbnail_path": "8c047700-2775-4161-bfa5-9c5f966ee929.jpg"
|
| 37 |
+
},
|
| 38 |
+
{
|
| 39 |
+
"id": "c0beb43d-e95d-4352-9d36-56aa6c903e7d",
|
| 40 |
+
"timestamp": "2025-06-12T15:25:28.972905",
|
| 41 |
+
"lat": 43.42554082467874,
|
| 42 |
+
"lng": -89.09498316077553,
|
| 43 |
+
"address": "Unknown",
|
| 44 |
+
"pano_id": "H3QYXtsn7NBQxjZep7whsQ",
|
| 45 |
+
"pov": {
|
| 46 |
+
"heading": 164.72000000000003,
|
| 47 |
+
"pitch": 5,
|
| 48 |
+
"zoom": 1.0000093225833766
|
| 49 |
+
},
|
| 50 |
+
"url_slug": "43.425541_-89.094983_164.72_-5.00_0",
|
| 51 |
+
"thumbnail_path": "c0beb43d-e95d-4352-9d36-56aa6c903e7d.jpg"
|
| 52 |
+
},
|
| 53 |
+
{
|
| 54 |
+
"id": "f0af2553-81cf-48a7-8557-ed4b437a0c9d",
|
| 55 |
+
"timestamp": "2025-06-12T15:25:32.389314",
|
| 56 |
+
"lat": 47.48390126215672,
|
| 57 |
+
"lng": 34.659670566007904,
|
| 58 |
+
"address": "Unknown",
|
| 59 |
+
"pano_id": "bfFQMztfnvuffg-_9NkXjQ",
|
| 60 |
+
"pov": {
|
| 61 |
+
"heading": -337.28,
|
| 62 |
+
"pitch": 5,
|
| 63 |
+
"zoom": 1.0000017337781582
|
| 64 |
+
},
|
| 65 |
+
"url_slug": "47.483901_34.659671_-337.28_-5.00_0",
|
| 66 |
+
"thumbnail_path": "f0af2553-81cf-48a7-8557-ed4b437a0c9d.jpg"
|
| 67 |
+
},
|
| 68 |
+
{
|
| 69 |
+
"id": "06c2d9c2-f765-4f2b-b9b1-5b93229dc0fc",
|
| 70 |
+
"timestamp": "2025-06-12T15:25:35.813919",
|
| 71 |
+
"lat": -34.63754161327788,
|
| 72 |
+
"lng": 118.09156096189146,
|
| 73 |
+
"address": "Unknown",
|
| 74 |
+
"pano_id": "PzTOFAXRN2xbwgjUqN4bpg",
|
| 75 |
+
"pov": {
|
| 76 |
+
"heading": -148.27999999999997,
|
| 77 |
+
"pitch": 5,
|
| 78 |
+
"zoom": 1.0000041033706084
|
| 79 |
+
},
|
| 80 |
+
"url_slug": "-34.637542_118.091561_-148.28_-5.00_0",
|
| 81 |
+
"thumbnail_path": "06c2d9c2-f765-4f2b-b9b1-5b93229dc0fc.jpg"
|
| 82 |
+
},
|
| 83 |
+
{
|
| 84 |
+
"id": "92beabfc-c50d-421e-a847-fd2cb145aac8",
|
| 85 |
+
"timestamp": "2025-06-12T15:25:39.191588",
|
| 86 |
+
"lat": 64.57213289684468,
|
| 87 |
+
"lng": -21.97630482318329,
|
| 88 |
+
"address": "Unknown",
|
| 89 |
+
"pano_id": "UojsE8YlVZ0N_TsBzTXkHw",
|
| 90 |
+
"pov": {
|
| 91 |
+
"heading": 90.72000000000003,
|
| 92 |
+
"pitch": 5,
|
| 93 |
+
"zoom": 1.0000091919376193
|
| 94 |
+
},
|
| 95 |
+
"url_slug": "64.572133_-21.976305_90.72_-5.00_0",
|
| 96 |
+
"thumbnail_path": "92beabfc-c50d-421e-a847-fd2cb145aac8.jpg"
|
| 97 |
+
},
|
| 98 |
+
{
|
| 99 |
+
"id": "fae54d62-755c-447f-ace2-7d7d9dcbab0a",
|
| 100 |
+
"timestamp": "2025-06-12T15:25:42.516009",
|
| 101 |
+
"lat": 32.34919407912315,
|
| 102 |
+
"lng": -64.71096298763197,
|
| 103 |
+
"address": "Unknown",
|
| 104 |
+
"pano_id": "CAoSF0NJSE0wb2dLRUlDQWdJREV1Tl9YMmdF",
|
| 105 |
+
"pov": {
|
| 106 |
+
"heading": 260.72,
|
| 107 |
+
"pitch": 5,
|
| 108 |
+
"zoom": 1.0000030548533054
|
| 109 |
+
},
|
| 110 |
+
"url_slug": "32.349194_-64.710963_260.72_-5.00_0",
|
| 111 |
+
"thumbnail_path": "fae54d62-755c-447f-ace2-7d7d9dcbab0a.jpg"
|
| 112 |
+
},
|
| 113 |
+
{
|
| 114 |
+
"id": "a086d72f-5c18-4895-a728-4262d565005f",
|
| 115 |
+
"timestamp": "2025-06-12T15:25:45.919449",
|
| 116 |
+
"lat": 34.880191512475136,
|
| 117 |
+
"lng": 138.1990659116743,
|
| 118 |
+
"address": "Unknown",
|
| 119 |
+
"pano_id": "CAoSFkNJSE0wb2dLRUlDQWdJRHE4NDJsWnc.",
|
| 120 |
+
"pov": {
|
| 121 |
+
"heading": 358.72,
|
| 122 |
+
"pitch": 5,
|
| 123 |
+
"zoom": 1.0000054942816385
|
| 124 |
+
},
|
| 125 |
+
"url_slug": "34.880192_138.199066_358.72_-5.00_0",
|
| 126 |
+
"thumbnail_path": "a086d72f-5c18-4895-a728-4262d565005f.jpg"
|
| 127 |
+
},
|
| 128 |
+
{
|
| 129 |
+
"id": "ea8fae71-8acd-4ba5-a016-3fb9d051c8ff",
|
| 130 |
+
"timestamp": "2025-06-12T15:25:49.337047",
|
| 131 |
+
"lat": 22.130721057935787,
|
| 132 |
+
"lng": 113.57874365739633,
|
| 133 |
+
"address": "Unknown",
|
| 134 |
+
"pano_id": "IZjDP8WGT4O3zju2hFiFCg",
|
| 135 |
+
"pov": {
|
| 136 |
+
"heading": -249.27999999999997,
|
| 137 |
+
"pitch": 5,
|
| 138 |
+
"zoom": 1.0000003495222285
|
| 139 |
+
},
|
| 140 |
+
"url_slug": "22.130721_113.578744_-249.28_-5.00_0",
|
| 141 |
+
"thumbnail_path": "ea8fae71-8acd-4ba5-a016-3fb9d051c8ff.jpg"
|
| 142 |
+
},
|
| 143 |
+
{
|
| 144 |
+
"id": "0730a5f2-a68b-4e7a-9f8d-877bd65b04ba",
|
| 145 |
+
"timestamp": "2025-06-12T15:25:52.704884",
|
| 146 |
+
"lat": 18.6634455460649,
|
| 147 |
+
"lng": -96.76220059003958,
|
| 148 |
+
"address": "Unknown",
|
| 149 |
+
"pano_id": "J9ZTNGHVQf4EBW2rCgaHaQ",
|
| 150 |
+
"pov": {
|
| 151 |
+
"heading": -5.279999999999973,
|
| 152 |
+
"pitch": 5,
|
| 153 |
+
"zoom": 1.0000057047491013
|
| 154 |
+
},
|
| 155 |
+
"url_slug": "18.663446_-96.762201_-5.28_-5.00_0",
|
| 156 |
+
"thumbnail_path": "0730a5f2-a68b-4e7a-9f8d-877bd65b04ba.jpg"
|
| 157 |
+
},
|
| 158 |
+
{
|
| 159 |
+
"id": "992ba13b-0ced-4a8f-b8ee-3e2f9ac14464",
|
| 160 |
+
"timestamp": "2025-06-12T15:25:56.187109",
|
| 161 |
+
"lat": 64.51234002155906,
|
| 162 |
+
"lng": -22.13983357174534,
|
| 163 |
+
"address": "Unknown",
|
| 164 |
+
"pano_id": "nayAVqmoufS1IQHDOtXK5g",
|
| 165 |
+
"pov": {
|
| 166 |
+
"heading": 204.72000000000003,
|
| 167 |
+
"pitch": 5,
|
| 168 |
+
"zoom": 1.0000082656900817
|
| 169 |
+
},
|
| 170 |
+
"url_slug": "64.512340_-22.139834_204.72_-5.00_0",
|
| 171 |
+
"thumbnail_path": "992ba13b-0ced-4a8f-b8ee-3e2f9ac14464.jpg"
|
| 172 |
+
},
|
| 173 |
+
{
|
| 174 |
+
"id": "83f086e9-2b3c-47c8-9611-557853313d73",
|
| 175 |
+
"timestamp": "2025-06-12T15:25:59.649986",
|
| 176 |
+
"lat": 49.18855106875811,
|
| 177 |
+
"lng": 18.715493968155048,
|
| 178 |
+
"address": "Unknown",
|
| 179 |
+
"pano_id": "X4_z3fyEkFf1TURoTEtTRw",
|
| 180 |
+
"pov": {
|
| 181 |
+
"heading": -285.28,
|
| 182 |
+
"pitch": 5,
|
| 183 |
+
"zoom": 1.0000014961409551
|
| 184 |
+
},
|
| 185 |
+
"url_slug": "49.188551_18.715494_-285.28_-5.00_0",
|
| 186 |
+
"thumbnail_path": "83f086e9-2b3c-47c8-9611-557853313d73.jpg"
|
| 187 |
+
},
|
| 188 |
+
{
|
| 189 |
+
"id": "11e0d5df-607f-4673-9075-6cb784949469",
|
| 190 |
+
"timestamp": "2025-06-12T15:26:03.006109",
|
| 191 |
+
"lat": 47.566063195512115,
|
| 192 |
+
"lng": 117.66840235174527,
|
| 193 |
+
"address": "Unknown",
|
| 194 |
+
"pano_id": "pmbqMP3wUN-y4UNF29-ijg",
|
| 195 |
+
"pov": {
|
| 196 |
+
"heading": -53.27999999999997,
|
| 197 |
+
"pitch": 5,
|
| 198 |
+
"zoom": 1.0000074643993226
|
| 199 |
+
},
|
| 200 |
+
"url_slug": "47.566063_117.668402_-53.28_-5.00_0",
|
| 201 |
+
"thumbnail_path": "11e0d5df-607f-4673-9075-6cb784949469.jpg"
|
| 202 |
+
},
|
| 203 |
+
{
|
| 204 |
+
"id": "35aad182-1f46-4ded-a7c0-f41663c1dbc6",
|
| 205 |
+
"timestamp": "2025-06-12T15:26:06.382239",
|
| 206 |
+
"lat": 39.85636978265199,
|
| 207 |
+
"lng": 38.22670052745333,
|
| 208 |
+
"address": "Unknown",
|
| 209 |
+
"pano_id": "YX0qC_q239NxWkz2rjYO2A",
|
| 210 |
+
"pov": {
|
| 211 |
+
"heading": 194.72000000000003,
|
| 212 |
+
"pitch": 5,
|
| 213 |
+
"zoom": 1.0000085095965745
|
| 214 |
+
},
|
| 215 |
+
"url_slug": "39.856370_38.226701_194.72_-5.00_0",
|
| 216 |
+
"thumbnail_path": "35aad182-1f46-4ded-a7c0-f41663c1dbc6.jpg"
|
| 217 |
+
},
|
| 218 |
+
{
|
| 219 |
+
"id": "6668b3fd-eefd-4d25-aa4a-7021a19d19c3",
|
| 220 |
+
"timestamp": "2025-06-12T15:26:09.783272",
|
| 221 |
+
"lat": 22.456568266194985,
|
| 222 |
+
"lng": 114.09923601594565,
|
| 223 |
+
"address": "Unknown",
|
| 224 |
+
"pano_id": "DM221xFUpWG9lY53LbL--Q",
|
| 225 |
+
"pov": {
|
| 226 |
+
"heading": -355.28,
|
| 227 |
+
"pitch": 5,
|
| 228 |
+
"zoom": 1.0000096482864165
|
| 229 |
+
},
|
| 230 |
+
"url_slug": "22.456568_114.099236_-355.28_-5.00_0",
|
| 231 |
+
"thumbnail_path": "6668b3fd-eefd-4d25-aa4a-7021a19d19c3.jpg"
|
| 232 |
+
},
|
| 233 |
+
{
|
| 234 |
+
"id": "2df0138c-dacf-4d89-9f23-9b095226f70f",
|
| 235 |
+
"timestamp": "2025-06-12T15:26:13.164542",
|
| 236 |
+
"lat": 38.46383428233303,
|
| 237 |
+
"lng": 35.16450386289184,
|
| 238 |
+
"address": "Unknown",
|
| 239 |
+
"pano_id": "yYdcfT5d7wr1sFM0be7AbQ",
|
| 240 |
+
"pov": {
|
| 241 |
+
"heading": -101.27999999999997,
|
| 242 |
+
"pitch": 5,
|
| 243 |
+
"zoom": 1.0000053534557005
|
| 244 |
+
},
|
| 245 |
+
"url_slug": "38.463834_35.164504_-101.28_-5.00_0",
|
| 246 |
+
"thumbnail_path": "2df0138c-dacf-4d89-9f23-9b095226f70f.jpg"
|
| 247 |
+
},
|
| 248 |
+
{
|
| 249 |
+
"id": "7a1c2e5a-8cde-4a44-9fdb-5142a26a001d",
|
| 250 |
+
"timestamp": "2025-06-12T15:26:16.508455",
|
| 251 |
+
"lat": -6.370108870806767,
|
| 252 |
+
"lng": -76.28528690259334,
|
| 253 |
+
"address": "Unknown",
|
| 254 |
+
"pano_id": "bDGZjPoLOS0J4FaKbCQi3Q",
|
| 255 |
+
"pov": {
|
| 256 |
+
"heading": 13.720000000000027,
|
| 257 |
+
"pitch": 5,
|
| 258 |
+
"zoom": 1.0000056924769267
|
| 259 |
+
},
|
| 260 |
+
"url_slug": "-6.370109_-76.285287_13.72_-5.00_0",
|
| 261 |
+
"thumbnail_path": "7a1c2e5a-8cde-4a44-9fdb-5142a26a001d.jpg"
|
| 262 |
+
},
|
| 263 |
+
{
|
| 264 |
+
"id": "add1ffdf-22ca-4e15-9061-12d4e4b70638",
|
| 265 |
+
"timestamp": "2025-06-12T15:26:19.889548",
|
| 266 |
+
"lat": -31.647905825412163,
|
| 267 |
+
"lng": -60.705529014729464,
|
| 268 |
+
"address": "Unknown",
|
| 269 |
+
"pano_id": "LfewarY8AHpdsRryIvxjVQ",
|
| 270 |
+
"pov": {
|
| 271 |
+
"heading": 169.72000000000003,
|
| 272 |
+
"pitch": 5,
|
| 273 |
+
"zoom": 1.0000043082285572
|
| 274 |
+
},
|
| 275 |
+
"url_slug": "-31.647906_-60.705529_169.72_-5.00_0",
|
| 276 |
+
"thumbnail_path": "add1ffdf-22ca-4e15-9061-12d4e4b70638.jpg"
|
| 277 |
+
},
|
| 278 |
+
{
|
| 279 |
+
"id": "0c93acf3-75cc-43c1-be9e-28e034c139ff",
|
| 280 |
+
"timestamp": "2025-06-12T15:26:23.261201",
|
| 281 |
+
"lat": 43.95405778584408,
|
| 282 |
+
"lng": 22.298469861096923,
|
| 283 |
+
"address": "Unknown",
|
| 284 |
+
"pano_id": "q_NGYfvHdH9mL4cyp3UjEQ",
|
| 285 |
+
"pov": {
|
| 286 |
+
"heading": 305.72,
|
| 287 |
+
"pitch": 5,
|
| 288 |
+
"zoom": 1.0000030120206056
|
| 289 |
+
},
|
| 290 |
+
"url_slug": "43.954058_22.298470_305.72_-5.00_0",
|
| 291 |
+
"thumbnail_path": "0c93acf3-75cc-43c1-be9e-28e034c139ff.jpg"
|
| 292 |
+
},
|
| 293 |
+
{
|
| 294 |
+
"id": "016d1183-d7a6-46a4-98f2-a97f62445b89",
|
| 295 |
+
"timestamp": "2025-06-12T15:26:26.696698",
|
| 296 |
+
"lat": 34.59326187516724,
|
| 297 |
+
"lng": 135.74317546771286,
|
| 298 |
+
"address": "Unknown",
|
| 299 |
+
"pano_id": "iiCKjrr3Zib0M5OYS5BV8g",
|
| 300 |
+
"pov": {
|
| 301 |
+
"heading": -279.28,
|
| 302 |
+
"pitch": 5,
|
| 303 |
+
"zoom": 1.0000047776936738
|
| 304 |
+
},
|
| 305 |
+
"url_slug": "34.593262_135.743175_-279.28_-5.00_0",
|
| 306 |
+
"thumbnail_path": "016d1183-d7a6-46a4-98f2-a97f62445b89.jpg"
|
| 307 |
+
}
|
| 308 |
+
]
|
| 309 |
+
}
|
datasets/example3/golden_labels.json
ADDED
|
@@ -0,0 +1,309 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"metadata": {
|
| 3 |
+
"dataset_name": "example3",
|
| 4 |
+
"collection_date": "2025-06-12T15:57:06.206331",
|
| 5 |
+
"collection_options": {}
|
| 6 |
+
},
|
| 7 |
+
"samples": [
|
| 8 |
+
{
|
| 9 |
+
"id": "197a5345-a9da-41e1-93c5-b46ad24e5363",
|
| 10 |
+
"timestamp": "2025-06-12T15:56:00.069960",
|
| 11 |
+
"lat": 32.450617168194135,
|
| 12 |
+
"lng": -114.69399063957216,
|
| 13 |
+
"address": "Libramiento Golfo de Sta Clara-Ejido La Islita, San Luis R\u00edo Colorado, Sonora",
|
| 14 |
+
"pano_id": "RwuCf43rrr5vnlEgH7uMHw",
|
| 15 |
+
"pov": {
|
| 16 |
+
"heading": -265.28,
|
| 17 |
+
"pitch": 5,
|
| 18 |
+
"zoom": 1.000000033789912
|
| 19 |
+
},
|
| 20 |
+
"url_slug": "32.450617_-114.693991_-265.28_-5.00_0",
|
| 21 |
+
"thumbnail_path": "197a5345-a9da-41e1-93c5-b46ad24e5363.jpg"
|
| 22 |
+
},
|
| 23 |
+
{
|
| 24 |
+
"id": "66f91dcf-3fe6-4962-bfe6-2de8a349d6f6",
|
| 25 |
+
"timestamp": "2025-06-12T15:56:03.857510",
|
| 26 |
+
"lat": -37.78214235746083,
|
| 27 |
+
"lng": 144.12300194368797,
|
| 28 |
+
"address": "1476 Ballan-Meredith Rd, Morrisons, Victoria",
|
| 29 |
+
"pano_id": "hXyohzqEx6F3Q7eSQ089Mw",
|
| 30 |
+
"pov": {
|
| 31 |
+
"heading": -22.279999999999973,
|
| 32 |
+
"pitch": 5,
|
| 33 |
+
"zoom": 1.0000055105094043
|
| 34 |
+
},
|
| 35 |
+
"url_slug": "-37.782142_144.123002_-22.28_-5.00_0",
|
| 36 |
+
"thumbnail_path": "66f91dcf-3fe6-4962-bfe6-2de8a349d6f6.jpg"
|
| 37 |
+
},
|
| 38 |
+
{
|
| 39 |
+
"id": "7c22a7fc-fa66-40cc-88fd-626b826e14af",
|
| 40 |
+
"timestamp": "2025-06-12T15:56:07.240175",
|
| 41 |
+
"lat": 61.90332655530213,
|
| 42 |
+
"lng": 25.33606097079652,
|
| 43 |
+
"address": "98 Tervaj\u00e4rventie, Central Finland",
|
| 44 |
+
"pano_id": "yYWVkowafmuAlOFKWCV1TA",
|
| 45 |
+
"pov": {
|
| 46 |
+
"heading": 156.72000000000003,
|
| 47 |
+
"pitch": 5,
|
| 48 |
+
"zoom": 1.0000044280956983
|
| 49 |
+
},
|
| 50 |
+
"url_slug": "61.903327_25.336061_156.72_-5.00_0",
|
| 51 |
+
"thumbnail_path": "7c22a7fc-fa66-40cc-88fd-626b826e14af.jpg"
|
| 52 |
+
},
|
| 53 |
+
{
|
| 54 |
+
"id": "0facf8d6-5bcf-41e0-931e-2585e177fb68",
|
| 55 |
+
"timestamp": "2025-06-12T15:56:10.614004",
|
| 56 |
+
"lat": -18.13971017041426,
|
| 57 |
+
"lng": -63.937036497382664,
|
| 58 |
+
"address": "7, Santa Cruz Department",
|
| 59 |
+
"pano_id": "ILV43CvgWyxYt5HTTieZ4Q",
|
| 60 |
+
"pov": {
|
| 61 |
+
"heading": 290.72,
|
| 62 |
+
"pitch": 5,
|
| 63 |
+
"zoom": 1.0000061861010834
|
| 64 |
+
},
|
| 65 |
+
"url_slug": "-18.139710_-63.937036_290.72_-5.00_0",
|
| 66 |
+
"thumbnail_path": "0facf8d6-5bcf-41e0-931e-2585e177fb68.jpg"
|
| 67 |
+
},
|
| 68 |
+
{
|
| 69 |
+
"id": "9b372f4e-ca87-481c-a4d0-c3a6c90dff12",
|
| 70 |
+
"timestamp": "2025-06-12T15:56:14.031494",
|
| 71 |
+
"lat": 39.28408711718923,
|
| 72 |
+
"lng": 22.84441276717771,
|
| 73 |
+
"address": "EO30, Decentralized Administration of Thessaly and Central Greece",
|
| 74 |
+
"pano_id": "TnZ8AiIDWLWyoLMtWvThPg",
|
| 75 |
+
"pov": {
|
| 76 |
+
"heading": -320.28,
|
| 77 |
+
"pitch": 5,
|
| 78 |
+
"zoom": 1.0000078610298728
|
| 79 |
+
},
|
| 80 |
+
"url_slug": "39.284087_22.844413_-320.28_-5.00_0",
|
| 81 |
+
"thumbnail_path": "9b372f4e-ca87-481c-a4d0-c3a6c90dff12.jpg"
|
| 82 |
+
},
|
| 83 |
+
{
|
| 84 |
+
"id": "6558ba29-9edc-4c66-9213-edb82e77cf77",
|
| 85 |
+
"timestamp": "2025-06-12T15:56:17.391786",
|
| 86 |
+
"lat": 57.728373123146845,
|
| 87 |
+
"lng": 11.654417090381687,
|
| 88 |
+
"address": "1 Tjolmenv\u00e4gen, \u00d6cker\u00f6, V\u00e4stra G\u00f6taland County",
|
| 89 |
+
"pano_id": "FUCNS8h6b1KdjbkqekrpKw",
|
| 90 |
+
"pov": {
|
| 91 |
+
"heading": -114.27999999999997,
|
| 92 |
+
"pitch": 5,
|
| 93 |
+
"zoom": 1.0000089987016267
|
| 94 |
+
},
|
| 95 |
+
"url_slug": "57.728373_11.654417_-114.28_-5.00_0",
|
| 96 |
+
"thumbnail_path": "6558ba29-9edc-4c66-9213-edb82e77cf77.jpg"
|
| 97 |
+
},
|
| 98 |
+
{
|
| 99 |
+
"id": "ed167213-4364-40ae-80ee-78bf63480b9c",
|
| 100 |
+
"timestamp": "2025-06-12T15:56:20.754401",
|
| 101 |
+
"lat": -14.333745187624173,
|
| 102 |
+
"lng": -170.720756044093,
|
| 103 |
+
"address": "Rte 014, Tafuna, Western District",
|
| 104 |
+
"pano_id": "bUeapV3I_9VGBhumXlk2Tw",
|
| 105 |
+
"pov": {
|
| 106 |
+
"heading": 151.72000000000003,
|
| 107 |
+
"pitch": 5,
|
| 108 |
+
"zoom": 1.000005537590412
|
| 109 |
+
},
|
| 110 |
+
"url_slug": "-14.333745_-170.720756_151.72_-5.00_0",
|
| 111 |
+
"thumbnail_path": "ed167213-4364-40ae-80ee-78bf63480b9c.jpg"
|
| 112 |
+
},
|
| 113 |
+
{
|
| 114 |
+
"id": "41734c39-d109-4c5c-a939-82fcadfadbdf",
|
| 115 |
+
"timestamp": "2025-06-12T15:56:24.184911",
|
| 116 |
+
"lat": 45.86505410116751,
|
| 117 |
+
"lng": 15.519019308411098,
|
| 118 |
+
"address": "Pokopali\u0161\u010de Bu\u0161e\u010da vas",
|
| 119 |
+
"pano_id": "CAoSFkNJSE0wb2dLRUlDQWdJQ0VpYWVtWlE.",
|
| 120 |
+
"pov": {
|
| 121 |
+
"heading": 326.72,
|
| 122 |
+
"pitch": 5,
|
| 123 |
+
"zoom": 1.0000074031092103
|
| 124 |
+
},
|
| 125 |
+
"url_slug": "45.865054_15.519019_326.72_-5.00_0",
|
| 126 |
+
"thumbnail_path": "41734c39-d109-4c5c-a939-82fcadfadbdf.jpg"
|
| 127 |
+
},
|
| 128 |
+
{
|
| 129 |
+
"id": "04f77afb-4b62-4d27-ae04-69f72b47cd30",
|
| 130 |
+
"timestamp": "2025-06-12T15:56:28.265166",
|
| 131 |
+
"lat": 53.210286076785295,
|
| 132 |
+
"lng": -114.86431799288032,
|
| 133 |
+
"address": "AB-22, Buck Creek, Alberta",
|
| 134 |
+
"pano_id": "RfHJ9zAVgKGNzIAqHfk8rA",
|
| 135 |
+
"pov": {
|
| 136 |
+
"heading": -134.27999999999997,
|
| 137 |
+
"pitch": 5,
|
| 138 |
+
"zoom": 1.0000034294812554
|
| 139 |
+
},
|
| 140 |
+
"url_slug": "53.210286_-114.864318_-134.28_-5.00_0",
|
| 141 |
+
"thumbnail_path": "04f77afb-4b62-4d27-ae04-69f72b47cd30.jpg"
|
| 142 |
+
},
|
| 143 |
+
{
|
| 144 |
+
"id": "e3141a38-fb2d-45a8-8f3a-4c26018720e4",
|
| 145 |
+
"timestamp": "2025-06-12T15:56:31.850499",
|
| 146 |
+
"lat": 57.66292577014665,
|
| 147 |
+
"lng": 27.24427273260464,
|
| 148 |
+
"address": "M\u00f6ldre, V\u00f5ru County",
|
| 149 |
+
"pano_id": "vvKr0wNXF5WfS1lOq1IIxw",
|
| 150 |
+
"pov": {
|
| 151 |
+
"heading": 44.72000000000003,
|
| 152 |
+
"pitch": 5,
|
| 153 |
+
"zoom": 1.000000124614534
|
| 154 |
+
},
|
| 155 |
+
"url_slug": "57.662926_27.244273_44.72_-5.00_0",
|
| 156 |
+
"thumbnail_path": "e3141a38-fb2d-45a8-8f3a-4c26018720e4.jpg"
|
| 157 |
+
},
|
| 158 |
+
{
|
| 159 |
+
"id": "1eea0ce4-3332-4096-982b-37e97772e105",
|
| 160 |
+
"timestamp": "2025-06-12T15:56:35.316086",
|
| 161 |
+
"lat": -3.681535588587605,
|
| 162 |
+
"lng": -80.19932740757173,
|
| 163 |
+
"address": "24250 TU-101, Matapalo, Tumbes",
|
| 164 |
+
"pano_id": "48w450euvqIfAVQ7R3HLng",
|
| 165 |
+
"pov": {
|
| 166 |
+
"heading": 295.72,
|
| 167 |
+
"pitch": 5,
|
| 168 |
+
"zoom": 1.0000097574696656
|
| 169 |
+
},
|
| 170 |
+
"url_slug": "-3.681536_-80.199327_295.72_-5.00_0",
|
| 171 |
+
"thumbnail_path": "1eea0ce4-3332-4096-982b-37e97772e105.jpg"
|
| 172 |
+
},
|
| 173 |
+
{
|
| 174 |
+
"id": "e49be483-24e8-47ef-bf01-77dcfcb5d2d4",
|
| 175 |
+
"timestamp": "2025-06-12T15:56:38.725810",
|
| 176 |
+
"lat": -14.279133596130174,
|
| 177 |
+
"lng": -170.55687001529134,
|
| 178 |
+
"address": "Route 119, Aunu\u02bbu, AS 96799",
|
| 179 |
+
"pano_id": "TpeB7isFtiuumh6Eh15ZcA",
|
| 180 |
+
"pov": {
|
| 181 |
+
"heading": -265.28,
|
| 182 |
+
"pitch": 5,
|
| 183 |
+
"zoom": 1.0000006336487888
|
| 184 |
+
},
|
| 185 |
+
"url_slug": "-14.279134_-170.556870_-265.28_-5.00_0",
|
| 186 |
+
"thumbnail_path": "e49be483-24e8-47ef-bf01-77dcfcb5d2d4.jpg"
|
| 187 |
+
},
|
| 188 |
+
{
|
| 189 |
+
"id": "c5a611d5-29d2-4a83-b00d-1ed7df76869f",
|
| 190 |
+
"timestamp": "2025-06-12T15:56:42.149170",
|
| 191 |
+
"lat": 31.800383498252334,
|
| 192 |
+
"lng": 35.24268946547305,
|
| 193 |
+
"address": "Moqatel, Jerusalem, Jerusalem District",
|
| 194 |
+
"pano_id": "1VidmzHWGOrCkkidLLWF3Q",
|
| 195 |
+
"pov": {
|
| 196 |
+
"heading": -159.27999999999997,
|
| 197 |
+
"pitch": 5,
|
| 198 |
+
"zoom": 1.0000062558576592
|
| 199 |
+
},
|
| 200 |
+
"url_slug": "31.800383_35.242689_-159.28_-5.00_0",
|
| 201 |
+
"thumbnail_path": "c5a611d5-29d2-4a83-b00d-1ed7df76869f.jpg"
|
| 202 |
+
},
|
| 203 |
+
{
|
| 204 |
+
"id": "6dd669f4-2f13-4909-a480-9708a23cd80f",
|
| 205 |
+
"timestamp": "2025-06-12T15:56:45.579437",
|
| 206 |
+
"lat": 51.29578341353695,
|
| 207 |
+
"lng": 12.500988457395495,
|
| 208 |
+
"address": "Thensa",
|
| 209 |
+
"pano_id": "CAoSF0NJSE0wb2dLRUlDQWdJREQyZUtxbVFF",
|
| 210 |
+
"pov": {
|
| 211 |
+
"heading": -42.27999999999997,
|
| 212 |
+
"pitch": 5,
|
| 213 |
+
"zoom": 1.0000073719182492
|
| 214 |
+
},
|
| 215 |
+
"url_slug": "51.295783_12.500988_-42.28_-5.00_0",
|
| 216 |
+
"thumbnail_path": "6dd669f4-2f13-4909-a480-9708a23cd80f.jpg"
|
| 217 |
+
},
|
| 218 |
+
{
|
| 219 |
+
"id": "4f76d721-c2ec-4dc4-9485-e542d70ccf5c",
|
| 220 |
+
"timestamp": "2025-06-12T15:56:48.982692",
|
| 221 |
+
"lat": 58.32519714026791,
|
| 222 |
+
"lng": 26.777231622290483,
|
| 223 |
+
"address": "5 Palupealse, Aardlapalu, Tartu County",
|
| 224 |
+
"pano_id": "WUUzxDv8tWsNfGv28OGIeA",
|
| 225 |
+
"pov": {
|
| 226 |
+
"heading": 206.72000000000003,
|
| 227 |
+
"pitch": 5,
|
| 228 |
+
"zoom": 1.0000007116201164
|
| 229 |
+
},
|
| 230 |
+
"url_slug": "58.325197_26.777232_206.72_-5.00_0",
|
| 231 |
+
"thumbnail_path": "4f76d721-c2ec-4dc4-9485-e542d70ccf5c.jpg"
|
| 232 |
+
},
|
| 233 |
+
{
|
| 234 |
+
"id": "23a2f011-371a-48ed-bed7-254e8beefff3",
|
| 235 |
+
"timestamp": "2025-06-12T15:56:52.355563",
|
| 236 |
+
"lat": 27.53069417681522,
|
| 237 |
+
"lng": 90.1727287722609,
|
| 238 |
+
"address": "Trashigang-Semtokha Hwy, Wangdue Phodrang",
|
| 239 |
+
"pano_id": "1xZ7zVnYVh1f-hN4Xo_xFA",
|
| 240 |
+
"pov": {
|
| 241 |
+
"heading": 304.72,
|
| 242 |
+
"pitch": 5,
|
| 243 |
+
"zoom": 1.0000081048518055
|
| 244 |
+
},
|
| 245 |
+
"url_slug": "27.530694_90.172729_304.72_-5.00_0",
|
| 246 |
+
"thumbnail_path": "23a2f011-371a-48ed-bed7-254e8beefff3.jpg"
|
| 247 |
+
},
|
| 248 |
+
{
|
| 249 |
+
"id": "af61d989-8751-4c07-820c-8b35ffd0f2ae",
|
| 250 |
+
"timestamp": "2025-06-12T15:56:55.722548",
|
| 251 |
+
"lat": 5.287167713224647,
|
| 252 |
+
"lng": 103.06979234400693,
|
| 253 |
+
"address": "Lorong Bunga Raya, Kuala Terengganu, Terengganu",
|
| 254 |
+
"pano_id": "Pktsz31ZAWkJ-R1Ixesabw",
|
| 255 |
+
"pov": {
|
| 256 |
+
"heading": -178.27999999999997,
|
| 257 |
+
"pitch": 5,
|
| 258 |
+
"zoom": 1.0000068048105129
|
| 259 |
+
},
|
| 260 |
+
"url_slug": "5.287168_103.069792_-178.28_-5.00_0",
|
| 261 |
+
"thumbnail_path": "af61d989-8751-4c07-820c-8b35ffd0f2ae.jpg"
|
| 262 |
+
},
|
| 263 |
+
{
|
| 264 |
+
"id": "484ba34d-e072-4cb1-81b8-b1a4af8f36e9",
|
| 265 |
+
"timestamp": "2025-06-12T15:56:59.179328",
|
| 266 |
+
"lat": 45.95418096151833,
|
| 267 |
+
"lng": 5.379404630232549,
|
| 268 |
+
"address": "Amb\u00e9rieu-en-Bugey, Auvergne-Rh\u00f4ne-Alpes",
|
| 269 |
+
"pano_id": "AhkPs6oryerDdiRpLzRrDg",
|
| 270 |
+
"pov": {
|
| 271 |
+
"heading": 90.72000000000003,
|
| 272 |
+
"pitch": 5,
|
| 273 |
+
"zoom": 1.000005463895491
|
| 274 |
+
},
|
| 275 |
+
"url_slug": "45.954181_5.379405_90.72_-5.00_0",
|
| 276 |
+
"thumbnail_path": "484ba34d-e072-4cb1-81b8-b1a4af8f36e9.jpg"
|
| 277 |
+
},
|
| 278 |
+
{
|
| 279 |
+
"id": "720334f9-6332-4438-bcd2-68e0b464bb65",
|
| 280 |
+
"timestamp": "2025-06-12T15:57:02.582946",
|
| 281 |
+
"lat": 25.590547334531223,
|
| 282 |
+
"lng": 55.77315301790442,
|
| 283 |
+
"address": "E311, Al Raafah, Ras Al Khaimah",
|
| 284 |
+
"pano_id": "XNQCCNZ7aSxDPKeOoBaBYA",
|
| 285 |
+
"pov": {
|
| 286 |
+
"heading": 338.72,
|
| 287 |
+
"pitch": 5,
|
| 288 |
+
"zoom": 1.000001329133932
|
| 289 |
+
},
|
| 290 |
+
"url_slug": "25.590547_55.773153_338.72_-5.00_0",
|
| 291 |
+
"thumbnail_path": "720334f9-6332-4438-bcd2-68e0b464bb65.jpg"
|
| 292 |
+
},
|
| 293 |
+
{
|
| 294 |
+
"id": "d19dbe06-9b1a-4639-8d02-b21d2f87e8f4",
|
| 295 |
+
"timestamp": "2025-06-12T15:57:05.925602",
|
| 296 |
+
"lat": 69.97748674684166,
|
| 297 |
+
"lng": 19.105915802473216,
|
| 298 |
+
"address": "32 Fv302, Troms",
|
| 299 |
+
"pano_id": "CLIgvpLaAivFTsJqHVhsZg",
|
| 300 |
+
"pov": {
|
| 301 |
+
"heading": -129.27999999999997,
|
| 302 |
+
"pitch": 5,
|
| 303 |
+
"zoom": 1.0000075163842848
|
| 304 |
+
},
|
| 305 |
+
"url_slug": "69.977487_19.105916_-129.28_-5.00_0",
|
| 306 |
+
"thumbnail_path": "d19dbe06-9b1a-4639-8d02-b21d2f87e8f4.jpg"
|
| 307 |
+
}
|
| 308 |
+
]
|
| 309 |
+
}
|
geo_bot.py
CHANGED
|
@@ -6,13 +6,7 @@ from typing import Tuple, List, Optional, Dict, Any, Type
|
|
| 6 |
|
| 7 |
from PIL import Image
|
| 8 |
from langchain_core.messages import HumanMessage, BaseMessage
|
| 9 |
-
from langchain_core.language_models.chat_models import BaseChatModel
|
| 10 |
-
from langchain_openai import ChatOpenAI
|
| 11 |
-
from langchain_anthropic import ChatAnthropic
|
| 12 |
-
from langchain_google_genai import ChatGoogleGenerativeAI
|
| 13 |
-
|
| 14 |
from hf_chat import HuggingFaceChat
|
| 15 |
-
|
| 16 |
from mapcrunch_controller import MapCrunchController
|
| 17 |
|
| 18 |
# The "Golden" Prompt (v7): add more descprtions in context and task
|
|
@@ -43,20 +37,20 @@ AGENT_PROMPT_TEMPLATE = """
|
|
| 43 |
|
| 44 |
4. **Be Decisive:** A unique, definitive clue (full address, rare town name, etc.) β `GUESS` immediately.
|
| 45 |
|
| 46 |
-
5. **Final-Step Rule:** If **Remaining Steps = 1**, you **MUST** `GUESS
|
| 47 |
|
| 48 |
ββββββββββββββββββββββββββββββββ
|
|
|
|
|
|
|
|
|
|
| 49 |
**Action History**
|
| 50 |
{history_text}
|
| 51 |
|
| 52 |
ββββββββββββββββββββββββββββββββ
|
| 53 |
-
**
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
|
| 57 |
-
**JSON Output Format:**
|
| 58 |
-
Your response MUST be a valid JSON object wrapped in json ... .
|
| 59 |
-
{{"reasoning": "...", "action_details": {{"action": "GUESS", "lat": <float>, "lon": <float>}} }}
|
| 60 |
"""
|
| 61 |
|
| 62 |
BENCHMARK_PROMPT = """
|
|
|
|
| 6 |
|
| 7 |
from PIL import Image
|
| 8 |
from langchain_core.messages import HumanMessage, BaseMessage
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 9 |
from hf_chat import HuggingFaceChat
|
|
|
|
| 10 |
from mapcrunch_controller import MapCrunchController
|
| 11 |
|
| 12 |
# The "Golden" Prompt (v7): add more descprtions in context and task
|
|
|
|
| 37 |
|
| 38 |
4. **Be Decisive:** A unique, definitive clue (full address, rare town name, etc.) β `GUESS` immediately.
|
| 39 |
|
| 40 |
+
5. **Final-Step Rule:** If **Remaining Steps = 1**, you **MUST** `GUESS` and you should carefully check the image and the surroundings.
|
| 41 |
|
| 42 |
ββββββββββββββββββββββββββββββββ
|
| 43 |
+
**Context & Task:**
|
| 44 |
+
Analyze your full journey history and current view, apply the Core Principles, and decide your next action in the required JSON format.
|
| 45 |
+
|
| 46 |
**Action History**
|
| 47 |
{history_text}
|
| 48 |
|
| 49 |
ββββββββββββββββββββββββββββββββ
|
| 50 |
+
**JSON Output Format:**More actions
|
| 51 |
+
Your response MUST be a valid JSON object wrapped in ```json ... ```.
|
| 52 |
+
- For exploration: `{{"reasoning": "...", "action_details": {{"action": "ACTION_NAME"}} }}`
|
| 53 |
+
- For the final guess: `{{"reasoning": "...", "action_details": {{"action": "GUESS", "lat": <float>, "lon": <float>}} }}`
|
|
|
|
|
|
|
|
|
|
| 54 |
"""
|
| 55 |
|
| 56 |
BENCHMARK_PROMPT = """
|
main.py
CHANGED
|
@@ -1,11 +1,5 @@
|
|
| 1 |
import argparse
|
| 2 |
import json
|
| 3 |
-
import random
|
| 4 |
-
from typing import Dict, Optional, List
|
| 5 |
-
|
| 6 |
-
from langchain_openai import ChatOpenAI
|
| 7 |
-
from langchain_anthropic import ChatAnthropic
|
| 8 |
-
from langchain_google_genai import ChatGoogleGenerativeAI
|
| 9 |
|
| 10 |
from geo_bot import GeoBot
|
| 11 |
from benchmark import MapGuesserBenchmark
|
|
|
|
| 1 |
import argparse
|
| 2 |
import json
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3 |
|
| 4 |
from geo_bot import GeoBot
|
| 5 |
from benchmark import MapGuesserBenchmark
|
mapcrunch_controller.py
CHANGED
|
@@ -179,6 +179,22 @@ class MapCrunchController:
|
|
| 179 |
base_actions.extend(["MOVE_FORWARD", "MOVE_BACKWARD"])
|
| 180 |
return base_actions
|
| 181 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 182 |
def pan_view(self, direction: str, degrees: int = 45):
|
| 183 |
"""Pans the view using a direct JS call."""
|
| 184 |
pov = self.driver.execute_script("return window.panorama.getPov();")
|
|
@@ -275,3 +291,13 @@ class MapCrunchController:
|
|
| 275 |
|
| 276 |
def __exit__(self, exc_type, exc_val, exc_tb):
|
| 277 |
self.close()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 179 |
base_actions.extend(["MOVE_FORWARD", "MOVE_BACKWARD"])
|
| 180 |
return base_actions
|
| 181 |
|
| 182 |
+
def get_current_address(self) -> Optional[str]:
|
| 183 |
+
try:
|
| 184 |
+
address_element = self.wait.until(
|
| 185 |
+
EC.visibility_of_element_located(
|
| 186 |
+
(By.CSS_SELECTOR, SELECTORS["address_element"])
|
| 187 |
+
)
|
| 188 |
+
)
|
| 189 |
+
address_text = address_element.text.strip()
|
| 190 |
+
address_title = address_element.get_attribute("title") or ""
|
| 191 |
+
return (
|
| 192 |
+
address_title
|
| 193 |
+
if len(address_title) > len(address_text)
|
| 194 |
+
else address_text
|
| 195 |
+
)
|
| 196 |
+
except Exception:
|
| 197 |
+
return "Stealth Mode"
|
| 198 |
def pan_view(self, direction: str, degrees: int = 45):
|
| 199 |
"""Pans the view using a direct JS call."""
|
| 200 |
pov = self.driver.execute_script("return window.panorama.getPov();")
|
|
|
|
| 291 |
|
| 292 |
def __exit__(self, exc_type, exc_val, exc_tb):
|
| 293 |
self.close()
|
| 294 |
+
|
| 295 |
+
def load_url(self, url):
|
| 296 |
+
"""Load a specific MapCrunch URL."""
|
| 297 |
+
try:
|
| 298 |
+
self.driver.get(url)
|
| 299 |
+
time.sleep(2) # Wait for the page to load
|
| 300 |
+
return True
|
| 301 |
+
except Exception as e:
|
| 302 |
+
print(f"Error loading URL: {e}")
|
| 303 |
+
return False
|
requirements.txt
CHANGED
|
@@ -116,6 +116,7 @@ pytweening==1.2.0
|
|
| 116 |
pytz==2025.2
|
| 117 |
pyyaml==6.0.2
|
| 118 |
pyzmq==26.2.0
|
|
|
|
| 119 |
referencing==0.36.2
|
| 120 |
regex==2024.9.11
|
| 121 |
requests==2.32.3
|
|
|
|
| 116 |
pytz==2025.2
|
| 117 |
pyyaml==6.0.2
|
| 118 |
pyzmq==26.2.0
|
| 119 |
+
pyperclip==1.8.2
|
| 120 |
referencing==0.36.2
|
| 121 |
regex==2024.9.11
|
| 122 |
requests==2.32.3
|