Function bodies 269 total
lifespan function · python · L63-L68 (6 LOC)browser_service/main.py
async def lifespan(app: FastAPI):
global _semaphore
_semaphore = asyncio.Semaphore(MAX_CONCURRENT)
log.info("Browser service starting — max concurrent sessions: %d", MAX_CONCURRENT)
yield
log.info("Browser service shutting down")BrowseRequest class · python · L83-L93 (11 LOC)browser_service/main.py
class BrowseRequest(BaseModel):
"""A single browsing task dispatched by a Java agent."""
task: str = Field(..., description="Natural language task for the browser agent to perform")
sites: list[str] = Field(default=[], description="Seed URLs to start from (optional)")
extraction_schema: Optional[str] = Field(
None,
description="JSON schema hint for the extracted data (e.g. 'return a JSON array of {name, pricePerNight, ...}')"
)
model: Optional[str] = Field(None, description="LLM model override, e.g. 'anthropic/claude-3-5-sonnet-20241022'")
max_steps: int = Field(default=15, description="Max browser steps before giving up")
timeout_seconds: int = Field(default=120, description="Timeout for the whole browsing session")BrowseResponse class · python · L96-L102 (7 LOC)browser_service/main.py
class BrowseResponse(BaseModel):
success: bool
result: Any # parsed JSON or raw text
raw_text: Optional[str] = None
steps_taken: int = 0
duration_seconds: float = 0.0
error: Optional[str] = NoneHealthResponse class · python · L105-L109 (5 LOC)browser_service/main.py
class HealthResponse(BaseModel):
status: str
max_concurrent: int
active_sessions: int
default_model: strbuild_llm function · python · L114-L188 (75 LOC)browser_service/main.py
def build_llm(model_string: Optional[str]):
"""Resolve a provider/model string to a LangChain chat model."""
model_string = model_string or DEFAULT_MODEL
if model_string.startswith("anthropic/"):
model_name = model_string.split("/", 1)[1]
# Map shorthand → versioned model
model_map = {
"claude-3-5-sonnet": "claude-3-5-sonnet-20241022",
"claude-3-haiku": "claude-3-haiku-20240307",
"claude-3-opus": "claude-3-opus-20240229",
"claude-sonnet-4": "claude-sonnet-4-5",
"claude-opus-4": "claude-opus-4-5",
}
resolved = model_map.get(model_name, model_name)
return ChatAnthropic(
model=resolved,
api_key=ANTHROPIC_API_KEY,
timeout=90,
max_tokens=4096,
)
if model_string.startswith("openai/"):
model_name = model_string.split("/", 1)[1]
return ChatOpenAI(model=model_name, api_key=OPENAI_API_KEY, timeout=90)parse_result function · python · L191-L214 (24 LOC)browser_service/main.py
def parse_result(raw: str) -> Any:
"""Try to parse the agent output as JSON; fall back to raw string."""
import json
import re
# Strip markdown fences
cleaned = re.sub(r"```(?:json)?\s*", "", raw).strip().rstrip("```").strip()
# Try full JSON parse
try:
return json.loads(cleaned)
except json.JSONDecodeError:
pass
# Try extracting the first JSON array or object
for pattern in (r"(\[.*?\])", r"(\{.*?\})"):
match = re.search(pattern, cleaned, re.DOTALL)
if match:
try:
return json.loads(match.group(1))
except json.JSONDecodeError:
pass
return raw # return as plain text if JSON parsing failshealth function · python · L224-L230 (7 LOC)browser_service/main.py
async def health():
return HealthResponse(
status="ok",
max_concurrent=MAX_CONCURRENT,
active_sessions=_active_sessions,
default_model=DEFAULT_MODEL,
)Repobility · severity-and-effort ranking · https://repobility.com
browse function · python · L234-L302 (69 LOC)browser_service/main.py
async def browse(req: BrowseRequest):
"""
Dispatch a browser-use agent to perform a real web search/extraction task.
Blocks until the task completes (or times out).
"""
global _active_sessions
async with _semaphore:
_active_sessions += 1
start = time.time()
try:
llm = build_llm(req.model)
# Build the full task description
full_task = req.task
if req.extraction_schema:
full_task += f"\n\nReturn the result as: {req.extraction_schema}"
if req.sites:
full_task += f"\n\nStart by visiting these sites: {', '.join(req.sites)}"
full_task += "\nReturn ONLY valid JSON, no markdown, no explanation."
browser_cfg = BrowserConfig(headless=BROWSER_HEADLESS)
browser = Browser(config=browser_cfg)
try:
agent = BrowserAgent(
task=full_task,
llm=llm,
browse_batch function · python · L306-L312 (7 LOC)browser_service/main.py
async def browse_batch(requests: list[BrowseRequest]):
"""
Submit multiple browsing tasks at once. They run concurrently (up to MAX_CONCURRENT).
Useful when a single agent wants to search multiple sites in parallel.
"""
tasks = [browse(req) for req in requests]
return await asyncio.gather(*tasks)App function · javascript · L25-L150 (126 LOC)frontend/src/App.js
function App() {
const [itinerary, setItinerary] = useState(null);
const [agents, setAgents] = useState(INITIAL_AGENTS);
const [isLoading, setIsLoading] = useState(false);
const [error, setError] = useState(null);
const [activeView, setActiveView] = useState('planner'); // 'planner' | 'admin'
const eventSourceRef = useRef(null);
const updateAgent = useCallback((name, status, progress) => {
setAgents(prev => prev.map(a =>
a.name === name ? { ...a, status, progress } : a
));
}, []);
const closeEventSource = () => {
if (eventSourceRef.current) {
eventSourceRef.current.close();
eventSourceRef.current = null;
}
};
const handlePlanTrip = async (travelRequest) => {
setIsLoading(true);
setItinerary(null);
setError(null);
setAgents(INITIAL_AGENTS);
closeEventSource();
const sessionId = `sess-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
// Open SSE stream firsAdminDashboard function · javascript · L4-L223 (220 LOC)frontend/src/components/AdminDashboard.js
function AdminDashboard() {
const [activeTab, setActiveTab] = useState('prompts');
const [prompts, setPrompts] = useState([]);
const [costs, setCosts] = useState(null);
const [targets, setTargets] = useState([]);
const [editingPrompt, setEditingPrompt] = useState(null);
const [editText, setEditText] = useState('');
const [loading, setLoading] = useState(false);
const [adminToken, setAdminToken] = useState(localStorage.getItem('matoe-admin-token') || '');
const authHeaders = (extra = {}) => ({
'Content-Type': 'application/json',
...(adminToken ? { 'X-Admin-Token': adminToken } : {}),
...extra,
});
const handleTokenChange = (e) => {
const val = e.target.value;
setAdminToken(val);
localStorage.setItem('matoe-admin-token', val);
};
const fetchPrompts = useCallback(async () => {
try {
const res = await fetch('/api/admin/prompts');
const data = await res.json();
setPrompts(data.prompts || []);
} catch (err) { consItineraryCanvas function · javascript · L4-L287 (284 LOC)frontend/src/components/ItineraryCanvas.js
function ItineraryCanvas({ itinerary }) {
const [expandedSection, setExpandedSection] = useState('variants');
const [compareMode, setCompareMode] = useState(false);
const [selectedVariant, setSelectedVariant] = useState(null);
const handleDownload = () => {
const blob = new Blob([JSON.stringify(itinerary, null, 2)], { type: 'application/json' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = `matoe-itinerary-${itinerary.destination.replace(/\s+/g, '-').toLowerCase()}-${itinerary.id}.json`;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
URL.revokeObjectURL(url);
};
// PDF export — calls the backend endpoint so that rendering (layout, fonts,
// synthetic warnings) stays consistent across clients. The backend serves
// application/pdf with Content-Disposition: attachment, so we just navigate
// the browser to the URL and let it download.
const handleAccommodationCard function · javascript · L289-L309 (21 LOC)frontend/src/components/ItineraryCanvas.js
function AccommodationCard({ acc }) {
return (
<div className={`option-card ${acc.tier}`}>
<div className="card-header">
<h4>{acc.name}</h4>
<span className="tier-badge">{acc.tier}</span>
</div>
<p className="location">{acc.location}</p>
<div className="details">
<span className="rating">★ {acc.rating}</span>
<span className="price">€{acc.pricePerNight}/night</span>
</div>
<p className="amenities">{acc.amenities && acc.amenities.join(', ')}</p>
{acc.source && <span className="source-badge">{acc.source}</span>}
{acc.source === 'llm' && <span className="synthetic-warning">AI-generated estimate</span>}
{acc.bookingUrl && acc.source !== 'llm' && (
<a href={acc.bookingUrl} target="_blank" rel="noopener noreferrer" className="book-btn">Book →</a>
)}
</div>
);
}TransportCard function · javascript · L311-L333 (23 LOC)frontend/src/components/ItineraryCanvas.js
function TransportCard({ t }) {
const icons = { flight: '✈', car: '🚗', bus: '🚌', train: '🚆', ferry: '⛴' };
return (
<div className={`option-card ${t.tier}`}>
<div className="card-header">
<h4>{t.provider}</h4>
<span className="tier-badge">{t.tier}</span>
</div>
<p className="type">{icons[t.type] || '🚗'} {t.type}</p>
<div className="details">
<span>{t.departureTime} → {t.arrivalTime}</span>
<span>Duration: {t.duration}</span>
</div>
{t.stops > 0 && <p className="stops">{t.stops} stop(s)</p>}
<div className="price">€{t.price}</div>
{t.source && <span className="source-badge">{t.source}</span>}
{t.source === 'llm' && <span className="synthetic-warning">AI-generated estimate</span>}
{t.bookingUrl && t.source !== 'llm' && (
<a href={t.bookingUrl} target="_blank" rel="noopener noreferrer" className="book-btn">Book →</a>
)}
</div>
);
}LiveAgentTracker function · javascript · L4-L78 (75 LOC)frontend/src/components/LiveAgentTracker.js
function LiveAgentTracker({ agents, isLoading }) {
const getStatusEmoji = (status) => {
switch (status) {
case 'idle':
return '💤';
case 'deployed':
return '🚀';
case 'searching':
return '🔍';
case 'analyzing':
return '🧠';
case 'completed':
return '✅';
case 'error':
return '❌';
default:
return '⏳';
}
};
const getStatusColor = (status) => {
switch (status) {
case 'idle':
return '#555';
case 'deployed':
return '#ffc107';
case 'searching':
return '#2196f3';
case 'analyzing':
return '#9c27b0';
case 'completed':
return '#4caf50';
case 'error':
return '#f44336';
default:
return '#999';
}
};
return (
<div className="live-tracker">
<h2>📊 Live Agent Tracker</h2>
{!isLoading && agents.length === 0 ? (
<div className="tracker-empty">
<p>Agents wWant this analysis on your repo? https://repobility.com/scan/
MissionControl function · javascript · L4-L338 (335 LOC)frontend/src/components/MissionControl.js
function MissionControl({ onPlanTrip, isLoading }) {
const [formData, setFormData] = useState({
destination: '',
originCity: '',
startDate: '',
endDate: '',
guestCount: 1,
budgetMin: 1000,
budgetMax: 5000,
travelStyle: 'standard',
accommodationTypes: ['hotel', 'bb', 'apartment'],
transportTypes: ['flight', 'car'],
interestTags: [],
orchestratorModel: 'anthropic/claude-3-5-sonnet',
extractorModel: 'lmstudio/llama-3-8b',
});
const handleInputChange = (e) => {
const { name, value, type, checked } = e.target;
if (type === 'checkbox') {
const fieldName = name.replace('_', '');
setFormData((prev) => ({
...prev,
[fieldName]: checked
? [...prev[fieldName], value]
: prev[fieldName].filter((item) => item !== value),
}));
} else {
setFormData((prev) => ({
...prev,
[name]: value,
}));
}
};
const handleSubmit = (e) => {
e.preventDefauApartmentAgent class · java · L27-L156 (130 LOC)src/main/java/com/matoe/agents/ApartmentAgent.java
public class ApartmentAgent {
private static final Logger log = LoggerFactory.getLogger(ApartmentAgent.class);
private final BrowserAgentService browserService;
private final LlmService llmService;
private final ObjectMapper objectMapper;
private final PromptTemplateService promptTemplateService;
private final DynamicPromptService dynamicPromptService;
private final LlmCostTrackingService costTracker;
private final SearchTargetService searchTargetService;
@Value("${travel-agency.prompts.apartment-agent}")
private String defaultPrompt;
@Value("${travel-agency.browser.apartment-sites:airbnb.com,vrbo.com,booking.com}")
private String apartmentSites;
public ApartmentAgent(BrowserAgentService browserService, LlmService llmService,
ObjectMapper objectMapper, PromptTemplateService promptTemplateService,
DynamicPromptService dynamicPromptService, LlmCostTrackingService costTracker,
ApartmentAgent method · java · L45-L58 (14 LOC)src/main/java/com/matoe/agents/ApartmentAgent.java
public ApartmentAgent(BrowserAgentService browserService, LlmService llmService,
ObjectMapper objectMapper, PromptTemplateService promptTemplateService,
DynamicPromptService dynamicPromptService, LlmCostTrackingService costTracker,
SearchTargetService searchTargetService) {
this.browserService = browserService;
this.llmService = llmService;
this.objectMapper = objectMapper;
this.promptTemplateService = promptTemplateService;
this.dynamicPromptService = dynamicPromptService;
this.costTracker = costTracker;
this.searchTargetService = searchTargetService;
// Register YAML default (DB version will override if set by admin)
dynamicPromptService.registerDefault("apartment-agent", "");
}init method · java · L61-L63 (3 LOC)src/main/java/com/matoe/agents/ApartmentAgent.java
void init() {
dynamicPromptService.registerDefault("apartment-agent", defaultPrompt);
}searchApartments method · java · L65-L112 (48 LOC)src/main/java/com/matoe/agents/ApartmentAgent.java
public List<AccommodationOption> searchApartments(TravelRequest request) {
long nights = request.nights();
String model = request.extractorModel();
int bedroomsNeeded = Math.max(1, request.guestCount() / 2);
// ── primary: real browser search ─────────────────────────────────────
if (browserService.isAvailable()) {
try {
List<Map<String, Object>> raw = browserService.browseForList(
buildBrowserTask(request, nights, bedroomsNeeded),
searchTargetService.getSites("apartment-agent", apartmentSites),
"a JSON array of apartment objects each with: name, pricePerNight (number), " +
"totalPrice (number), rating (number 1-5), location (string), " +
"amenities (array of strings), bookingUrl (string)",
model
);
if (raw != null && !raw.isEmpty()) {
log.info(buildBrowserTask method · java · L114-L124 (11 LOC)src/main/java/com/matoe/agents/ApartmentAgent.java
private String buildBrowserTask(TravelRequest request, long nights, int bedroomsNeeded) {
return String.format(
"Find 3-5 holiday apartments or short-term rentals in %s for %d guests (%d+ bedrooms needed), " +
"check-in %s, check-out %s (%d nights). " +
"Budget: \u20ac%.0f\u2013\u20ac%.0f total. Travel style: %s. " +
"For each get: name, price per night, total price, rating, neighborhood, amenities, booking URL.",
request.destination(), request.guestCount(), bedroomsNeeded,
request.startDate(), request.endDate(), nights,
request.budgetMin(), request.budgetMax(), request.travelStyle()
);
}map method · java · L126-L136 (11 LOC)src/main/java/com/matoe/agents/ApartmentAgent.java
private AccommodationOption map(Map<String, Object> m, long nights, String source) {
double ppn = num(m, "pricePerNight");
double tot = num(m, "totalPrice", ppn * nights);
double avgPpn = nights > 0 ? tot / nights : ppn;
String tier = avgPpn < 100 ? "budget" : avgPpn > 250 ? "luxury" : "standard";
return new AccommodationOption(
UUID.randomUUID().toString(), "apartment", str(m, "name"), ppn, tot,
num(m, "rating"), str(m, "location"), toStringList(m.get("amenities")),
str(m, "bookingUrl"), tier, source, str(m, "imageUrl")
);
}toStringList method · java · L144-L146 (3 LOC)src/main/java/com/matoe/agents/ApartmentAgent.java
private List<String> toStringList(Object v) {
if (v instanceof List<?> l) return l.stream().map(Object::toString).collect(Collectors.toList());
return List.of(); }Open data scored by Repobility · https://repobility.com
resolveProvider method · java · L147-L154 (8 LOC)src/main/java/com/matoe/agents/ApartmentAgent.java
private String resolveProvider(String model) {
if (model == null) return "anthropic";
if (model.startsWith("anthropic/")) return "anthropic";
if (model.startsWith("lmstudio/")) return "lmstudio";
if (model.startsWith("ollama/")) return "ollama";
if (model.startsWith("openrouter/")) return "openrouter";
return "unknown";
}AttractionsAgent class · java · L28-L178 (151 LOC)src/main/java/com/matoe/agents/AttractionsAgent.java
public class AttractionsAgent {
private static final Logger log = LoggerFactory.getLogger(AttractionsAgent.class);
private final BrowserAgentService browserService;
private final LlmService llmService;
private final ObjectMapper objectMapper;
private final PromptTemplateService promptTemplateService;
private final DynamicPromptService dynamicPromptService;
private final LlmCostTrackingService costTracker;
private final SearchTargetService searchTargetService;
@Value("${travel-agency.prompts.attractions-agent}")
private String defaultPrompt;
@Value("${travel-agency.browser.attraction-sites:viator.com,getyourguide.com,tripadvisor.com}")
private String attractionSites;
public AttractionsAgent(BrowserAgentService browserService, LlmService llmService,
ObjectMapper objectMapper, PromptTemplateService promptTemplateService,
DynamicPromptService dynamicPromptService, LlmCostTrackinAttractionsAgent method · java · L46-L57 (12 LOC)src/main/java/com/matoe/agents/AttractionsAgent.java
public AttractionsAgent(BrowserAgentService browserService, LlmService llmService,
ObjectMapper objectMapper, PromptTemplateService promptTemplateService,
DynamicPromptService dynamicPromptService, LlmCostTrackingService costTracker,
SearchTargetService searchTargetService) {
this.browserService = browserService;
this.llmService = llmService;
this.objectMapper = objectMapper;
this.promptTemplateService = promptTemplateService;
this.dynamicPromptService = dynamicPromptService;
this.costTracker = costTracker;
this.searchTargetService = searchTargetService;
}init method · java · L60-L62 (3 LOC)src/main/java/com/matoe/agents/AttractionsAgent.java
void init() {
dynamicPromptService.registerDefault("attractions-agent", defaultPrompt);
}searchAttractions method · java · L64-L125 (62 LOC)src/main/java/com/matoe/agents/AttractionsAgent.java
public List<AttractionOption> searchAttractions(TravelRequest request) {
String model = request.extractorModel();
String interestTags = request.interestTags() != null && !request.interestTags().isEmpty()
? String.join(", ", request.interestTags())
: "general sightseeing";
// ── primary: real browser search ─────────────────────────────────────
if (browserService.isAvailable()) {
try {
List<Map<String, Object>> raw = browserService.browseForList(
buildBrowserTask(request, interestTags),
searchTargetService.getSites("attractions-agent", attractionSites),
"a JSON array of attraction objects each with: name, description, category, " +
"price (number in USD), duration (string like '2h' or 'half-day'), " +
"rating (number 1-5), location (string), bookingUrl (string), tags (array of strings)",
buildBrowserTask method · java · L127-L139 (13 LOC)src/main/java/com/matoe/agents/AttractionsAgent.java
private String buildBrowserTask(TravelRequest request, String interestTags) {
return String.format(
"Search for 6-8 attractions, tours, and activities in %s for %d guests, " +
"visiting from %s to %s. Budget: $%.0f-$%.0f total. Travel style: %s. " +
"Interests: %s. " +
"For each attraction get: name, description, category, price per person, duration, " +
"rating, location/neighborhood, booking URL, and relevant tags.",
request.destination(), request.guestCount(),
request.startDate(), request.endDate(),
request.budgetMin(), request.budgetMax(), request.travelStyle(),
interestTags
);
}mapAttraction method · java · L141-L158 (18 LOC)src/main/java/com/matoe/agents/AttractionsAgent.java
private AttractionOption mapAttraction(Map<String, Object> m, String source) {
double price = num(m, "price");
String tier = price < 30 ? "budget" : price > 100 ? "luxury" : "standard";
return new AttractionOption(
UUID.randomUUID().toString(),
str(m, "name"),
str(m, "description"),
str(m, "category"),
price,
str(m, "duration"),
num(m, "rating"),
str(m, "location"),
str(m, "bookingUrl"),
tier,
source,
toStringList(m.get("tags"))
);
}toStringList method · java · L166-L168 (3 LOC)src/main/java/com/matoe/agents/AttractionsAgent.java
private List<String> toStringList(Object v) {
if (v instanceof List<?> l) return l.stream().map(Object::toString).collect(Collectors.toList());
return List.of(); }Repobility analyzer · published findings · https://repobility.com
resolveProvider method · java · L169-L176 (8 LOC)src/main/java/com/matoe/agents/AttractionsAgent.java
private String resolveProvider(String model) {
if (model == null) return "anthropic";
if (model.startsWith("anthropic/")) return "anthropic";
if (model.startsWith("lmstudio/")) return "lmstudio";
if (model.startsWith("ollama/")) return "ollama";
if (model.startsWith("openrouter/")) return "openrouter";
return "unknown";
}BBAgent class · java · L27-L155 (129 LOC)src/main/java/com/matoe/agents/BBAgent.java
public class BBAgent {
private static final Logger log = LoggerFactory.getLogger(BBAgent.class);
private final BrowserAgentService browserService;
private final LlmService llmService;
private final ObjectMapper objectMapper;
private final PromptTemplateService promptTemplateService;
private final DynamicPromptService dynamicPromptService;
private final LlmCostTrackingService costTracker;
private final SearchTargetService searchTargetService;
@Value("${travel-agency.prompts.bb-agent}")
private String defaultPrompt;
@Value("${travel-agency.browser.bb-sites:booking.com,airbnb.com,bedandbreakfast.com}")
private String bbSites;
public BBAgent(BrowserAgentService browserService, LlmService llmService,
ObjectMapper objectMapper, PromptTemplateService promptTemplateService,
DynamicPromptService dynamicPromptService, LlmCostTrackingService costTracker,
SearchTargetService searchTargBBAgent method · java · L45-L58 (14 LOC)src/main/java/com/matoe/agents/BBAgent.java
public BBAgent(BrowserAgentService browserService, LlmService llmService,
ObjectMapper objectMapper, PromptTemplateService promptTemplateService,
DynamicPromptService dynamicPromptService, LlmCostTrackingService costTracker,
SearchTargetService searchTargetService) {
this.browserService = browserService;
this.llmService = llmService;
this.objectMapper = objectMapper;
this.promptTemplateService = promptTemplateService;
this.dynamicPromptService = dynamicPromptService;
this.costTracker = costTracker;
this.searchTargetService = searchTargetService;
// Register YAML default (DB version will override if set by admin)
dynamicPromptService.registerDefault("bb-agent", "");
}init method · java · L61-L63 (3 LOC)src/main/java/com/matoe/agents/BBAgent.java
void init() {
dynamicPromptService.registerDefault("bb-agent", defaultPrompt);
}searchBBs method · java · L65-L111 (47 LOC)src/main/java/com/matoe/agents/BBAgent.java
public List<AccommodationOption> searchBBs(TravelRequest request) {
long nights = request.nights();
String model = request.extractorModel();
// ── primary: real browser search ─────────────────────────────────────
if (browserService.isAvailable()) {
try {
List<Map<String, Object>> raw = browserService.browseForList(
buildBrowserTask(request, nights),
searchTargetService.getSites("bb-agent", bbSites),
"a JSON array of B&B objects each with: name, pricePerNight (number), " +
"totalPrice (number), rating (number 1-5), location (string), " +
"amenities (array of strings), bookingUrl (string)",
model
);
if (raw != null && !raw.isEmpty()) {
log.info("BBAgent: {} results via browser for {}", raw.size(), request.destination());
return raw.stbuildBrowserTask method · java · L113-L123 (11 LOC)src/main/java/com/matoe/agents/BBAgent.java
private String buildBrowserTask(TravelRequest request, long nights) {
return String.format(
"Find 3-5 bed-and-breakfasts or charming guesthouses in %s for %d guests, " +
"check-in %s, check-out %s (%d nights). " +
"Budget: \u20ac%.0f\u2013\u20ac%.0f total. Travel style: %s. " +
"For each get: name, price per night, total price, rating, neighborhood, amenities, booking URL.",
request.destination(), request.guestCount(),
request.startDate(), request.endDate(), nights,
request.budgetMin(), request.budgetMax(), request.travelStyle()
);
}map method · java · L125-L135 (11 LOC)src/main/java/com/matoe/agents/BBAgent.java
private AccommodationOption map(Map<String, Object> m, long nights, String source) {
double ppn = num(m, "pricePerNight");
double tot = num(m, "totalPrice", ppn * nights);
double avgPpn = nights > 0 ? tot / nights : ppn;
String tier = avgPpn < 80 ? "budget" : avgPpn > 200 ? "luxury" : "standard";
return new AccommodationOption(
UUID.randomUUID().toString(), "bb", str(m, "name"), ppn, tot,
num(m, "rating"), str(m, "location"), toStringList(m.get("amenities")),
str(m, "bookingUrl"), tier, source, str(m, "imageUrl")
);
}toStringList method · java · L143-L145 (3 LOC)src/main/java/com/matoe/agents/BBAgent.java
private List<String> toStringList(Object v) {
if (v instanceof List<?> l) return l.stream().map(Object::toString).collect(Collectors.toList());
return List.of(); }Repobility · severity-and-effort ranking · https://repobility.com
resolveProvider method · java · L146-L153 (8 LOC)src/main/java/com/matoe/agents/BBAgent.java
private String resolveProvider(String model) {
if (model == null) return "anthropic";
if (model.startsWith("anthropic/")) return "anthropic";
if (model.startsWith("lmstudio/")) return "lmstudio";
if (model.startsWith("ollama/")) return "ollama";
if (model.startsWith("openrouter/")) return "openrouter";
return "unknown";
}CarBusAgent class · java · L28-L163 (136 LOC)src/main/java/com/matoe/agents/CarBusAgent.java
public class CarBusAgent {
private static final Logger log = LoggerFactory.getLogger(CarBusAgent.class);
private final BrowserAgentService browserService;
private final LlmService llmService;
private final ObjectMapper objectMapper;
private final PromptTemplateService promptTemplateService;
private final DynamicPromptService dynamicPromptService;
private final LlmCostTrackingService costTracker;
private final SearchTargetService searchTargetService;
@Value("${travel-agency.prompts.car-agent}")
private String defaultPrompt;
@Value("${travel-agency.browser.car-sites:rentalcars.com,kayak.com/cars}")
private String carSites;
@Value("${travel-agency.browser.bus-sites:flixbus.com,busbud.com,rome2rio.com}")
private String busSites;
public CarBusAgent(BrowserAgentService browserService, LlmService llmService,
ObjectMapper objectMapper, PromptTemplateService promptTemplateService,
DynCarBusAgent method · java · L49-L62 (14 LOC)src/main/java/com/matoe/agents/CarBusAgent.java
public CarBusAgent(BrowserAgentService browserService, LlmService llmService,
ObjectMapper objectMapper, PromptTemplateService promptTemplateService,
DynamicPromptService dynamicPromptService, LlmCostTrackingService costTracker,
SearchTargetService searchTargetService) {
this.browserService = browserService;
this.llmService = llmService;
this.objectMapper = objectMapper;
this.promptTemplateService = promptTemplateService;
this.dynamicPromptService = dynamicPromptService;
this.costTracker = costTracker;
this.searchTargetService = searchTargetService;
// Register YAML default (DB version will override if set by admin)
dynamicPromptService.registerDefault("car-agent", "");
}init method · java · L65-L67 (3 LOC)src/main/java/com/matoe/agents/CarBusAgent.java
void init() {
dynamicPromptService.registerDefault("car-agent", defaultPrompt);
}searchGroundTransport method · java · L69-L120 (52 LOC)src/main/java/com/matoe/agents/CarBusAgent.java
public List<TransportOption> searchGroundTransport(TravelRequest request) {
long days = ChronoUnit.DAYS.between(request.startDate(), request.endDate());
if (days <= 0) days = 1;
String model = request.extractorModel();
// Combine car and bus sites for browser search
String combinedSites = carSites + "," + busSites;
// -- primary: real browser search --
if (browserService.isAvailable()) {
try {
List<Map<String, Object>> raw = browserService.browseForList(
buildBrowserTask(request, days),
searchTargetService.getSites("car-agent", combinedSites),
"a JSON array of ground transport objects each with: type ('car' or 'bus'), " +
"provider (string), departureTime (HH:mm), arrivalTime (HH:mm), " +
"duration (string), price (total trip, number), bookingUrl (string), " +
"origin (string), dbuildBrowserTask method · java · L122-L131 (10 LOC)src/main/java/com/matoe/agents/CarBusAgent.java
private String buildBrowserTask(TravelRequest request, long days) {
return String.format(
"Search for 3-4 ground transport options (car rental and/or bus) " +
"to/from %s for %d people, %s to %s (%d days). Budget: approx. %.0f EUR max total. " +
"For each option get: type (car or bus), provider, departure time, arrival time, " +
"duration, total price, booking URL.",
request.destination(), request.guestCount(),
request.startDate(), request.endDate(), days, request.budgetMax()
);
}map method · java · L133-L146 (14 LOC)src/main/java/com/matoe/agents/CarBusAgent.java
private TransportOption map(Map<String, Object> m, String source, TravelRequest request) {
double price = num(m, "price");
String tier = price < 100 ? "budget" : price > 400 ? "luxury" : "standard";
String type = str(m, "type");
if (!type.equals("car") && !type.equals("bus")) type = "car";
return new TransportOption(
UUID.randomUUID().toString(), type,
str(m, "provider"), str(m, "departureTime"), str(m, "arrivalTime"),
str(m, "duration"), price, 0,
str(m, "bookingUrl"), tier, source,
str(m, "origin").isEmpty() ? request.originCity() : str(m, "origin"),
str(m, "destination").isEmpty() ? request.destination() : str(m, "destination")
);
}num method · java · L148-L150 (3 LOC)src/main/java/com/matoe/agents/CarBusAgent.java
private double num(Map<String, Object> m, String key) {
Object v = m.get(key); return v instanceof Number n ? n.doubleValue() : 0.0;
}Want this analysis on your repo? https://repobility.com/scan/
str method · java · L151-L153 (3 LOC)src/main/java/com/matoe/agents/CarBusAgent.java
private String str(Map<String, Object> m, String key) {
Object v = m.get(key); return v != null ? v.toString() : "";
}resolveProvider method · java · L154-L161 (8 LOC)src/main/java/com/matoe/agents/CarBusAgent.java
private String resolveProvider(String model) {
if (model == null) return "anthropic";
if (model.startsWith("anthropic/")) return "anthropic";
if (model.startsWith("lmstudio/")) return "lmstudio";
if (model.startsWith("ollama/")) return "ollama";
if (model.startsWith("openrouter/")) return "openrouter";
return "unknown";
}CountrySpecialistAgent class · java · L25-L143 (119 LOC)src/main/java/com/matoe/agents/CountrySpecialistAgent.java
public class CountrySpecialistAgent {
private static final Logger log = LoggerFactory.getLogger(CountrySpecialistAgent.class);
private final BrowserAgentService browserService;
private final LlmService llmService;
private final ObjectMapper objectMapper;
private final PromptTemplateService promptTemplateService;
private final DynamicPromptService dynamicPromptService;
private final LlmCostTrackingService costTracker;
private final SearchTargetService searchTargetService;
@Value("${travel-agency.prompts.country-specialist}")
private String defaultPrompt;
@Value("${travel-agency.models.country-specialist:lmstudio/llama-3-8b}")
private String defaultModel;
@Value("${travel-agency.browser.country-sites:lonelyplanet.com,wikivoyage.org,tripadvisor.com}")
private String countrySites;
public CountrySpecialistAgent(BrowserAgentService browserService, LlmService llmService,
ObjectMapper objectMapppage 1 / 6next ›