in src/maps_planner/index.ts [448:534]
async function sendText(prompt: string) {
spinner.classList.remove('hidden');
errorMessage.innerHTML = '';
restart();
const buttonEl = document.getElementById('generate') as HTMLButtonElement;
try {
let finalPrompt = prompt;
if (isPlannerMode) {
finalPrompt = prompt + ' day trip';
}
const updatedInstructions = isPlannerMode
? systemInstructions.replace('DAY_PLANNER_MODE', 'true')
: systemInstructions.replace('DAY_PLANNER_MODE', 'false');
const response = await ai.models.generateContentStream({
model: 'gemini-2.0-flash-exp',
contents: finalPrompt,
config: {
systemInstruction: updatedInstructions,
temperature: 1,
tools: [
{
functionDeclarations: [
locationFunctionDeclaration,
lineFunctionDeclaration,
],
},
],
},
});
let text = '';
let results = false;
for await (const chunk of response) {
const fns = chunk.functionCalls ?? [];
for (const fn of fns) {
if (fn.name === 'location') {
setPin(fn.args);
results = true;
}
if (fn.name === 'line') {
setLeg(fn.args);
results = true;
}
}
if (
chunk.candidates &&
chunk.candidates.length > 0 &&
chunk.candidates[0].content &&
chunk.candidates[0].content.parts
) {
chunk.candidates[0].content.parts.forEach((part) => {
if (part.text) text += part.text;
});
} else if (chunk.text) {
text += chunk.text;
}
}
if (!results) {
throw new Error(
'Could not generate any results. Try again, or try a different prompt.',
);
}
if (isPlannerMode && dayPlanItinerary.length > 0) {
dayPlanItinerary.sort(
(a, b) =>
(a.sequence || Infinity) - (b.sequence || Infinity) ||
(a.time || '').localeCompare(b.time || ''),
);
createTimeline();
showTimeline();
}
createLocationCards();
} catch (e) {
errorMessage.innerHTML = e.message;
console.error('Error generating content:', e);
} finally {
buttonEl.classList.remove('loading');
}
spinner.classList.add('hidden');
}