<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Henshaw Joseph Essien on Medium]]></title>
        <description><![CDATA[Stories by Henshaw Joseph Essien on Medium]]></description>
        <link>https://medium.com/@henshaw-knight?source=rss-47682efa2eb5------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/0*t_Dn1S7FJVxMIDCk</url>
            <title>Stories by Henshaw Joseph Essien on Medium</title>
            <link>https://medium.com/@henshaw-knight?source=rss-47682efa2eb5------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Wed, 27 May 2026 08:26:37 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@henshaw-knight/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Building WanderWise: An AI Tour Guide Agent with Mastra and Telex]]></title>
            <link>https://medium.com/@henshaw-knight/building-wanderwise-an-ai-tour-guide-agent-with-mastra-and-telex-e5af3c099377?source=rss-47682efa2eb5------2</link>
            <guid isPermaLink="false">https://medium.com/p/e5af3c099377</guid>
            <category><![CDATA[hnginternship]]></category>
            <category><![CDATA[telex]]></category>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[mastra-ai]]></category>
            <dc:creator><![CDATA[Henshaw Joseph Essien]]></dc:creator>
            <pubDate>Tue, 04 Nov 2025 08:23:00 GMT</pubDate>
            <atom:updated>2025-11-04T14:50:26.073Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/736/1*VJuDZWoBrv3zXu2rbxwVLg.jpeg" /><figcaption>Adventure awaits — the world is calling.</figcaption></figure><h3>Introduction</h3><p>Travel planning can be overwhelming. Where should you go? What attractions are worth visiting? What do you need to know before arriving in a new country? I built <strong>WanderWise</strong>, an AI-powered tour guide agent that answers these questions and more, integrated seamlessly with Telex.im using Mastra’s A2A protocol.</p><h3>The Problem</h3><p>Travelers often struggle with:</p><ul><li>Finding authentic tourist attractions in unfamiliar cities</li><li>Getting reliable country information (currency, languages, customs)</li><li>Accessing travel tips and cultural insights in one place</li><li>Navigating through scattered information across multiple websites</li></ul><p>I wanted to create a single AI agent that could be a traveler’s comprehensive companion.</p><h3>Why WanderWise?</h3><p>The name combines “Wander” (exploring new places) with “Wise” (knowledgeable guidance). It’s clear, memorable, and perfectly captures what the agent does — helps you wander wisely through the world.</p><p>While the technical project is called tourguide-ai-agent on GitHub (for clarity and searchability), the user-facing brand is <strong>WanderWise</strong> - because travelers deserve a companion, not just a tool.</p><h3>Technical Architecture</h3><h4>Tech Stack</h4><ul><li><strong>Framework</strong>: Mastra (for AI agent orchestration)</li><li><strong>Language</strong>: TypeScript</li><li><strong>Model</strong>: Google Gemini 2.5 Flash</li><li><strong>Integration</strong>: A2A Protocol (Agent-to-Agent communication)</li><li><strong>Platform</strong>: Telex.im</li><li><strong>APIs</strong>:</li><li>OpenStreetMap Overpass API (tourist attractions)</li><li>REST Countries API (country information)</li><li>Wikipedia API (travel insights and city overviews)</li></ul><h3>Why These APIs?</h3><p>I chose 100% free, no-API-key-required services to ensure:</p><ul><li><strong>Zero cost</strong>: No billing surprises</li><li><strong>Reliability</strong>: Mature, community-maintained APIs</li><li><strong>Global coverage</strong>: Works for any country or city worldwide</li><li><strong>Rich data</strong>: Comprehensive information about destinations</li></ul><h3>Building WanderWise</h3><h4>Step 1: Creating Mastra Tools</h4><p>I built three core tools using Mastra’s createTool function with Zod schemas for type safety:</p><p><strong>1. Tourist Attractions Tool</strong></p><pre>export const touristAttractionsTool = createTool({<br>  id: &#39;get-tourist-attractions&#39;,<br>  description: &#39;Get tourist attractions, museums, monuments, and points of interest&#39;,<br>  inputSchema: z.object({<br>    city: z.string(),<br>    country: z.string(),<br>    limit: z.number().optional().default(10),<br>  }),<br>  execute: async ({ context }) =&gt; {<br>    // Geocode the city using Nominatim<br>    // Query Overpass API for attractions<br>    // Return formatted results<br>  },<br>});</pre><p>This tool:</p><ul><li>Geocodes city names to coordinates using Nominatim (OpenStreetMap’s geocoding service)</li><li>Searches OpenStreetMap for attractions within city boundaries</li><li>Returns up to 10 tourist spots with descriptions, addresses, and coordinates</li></ul><p><strong>2. Country Information Tool</strong></p><pre>export const countryInfoTool = createTool({<br>  id: &#39;get-country-info&#39;,<br>  description: &#39;Get general information about a country&#39;,<br>  inputSchema: z.object({<br>    country: z.string(),<br>  }),<br>  execute: async ({ context }) =&gt; {<br>    // Fetch from REST Countries API<br>    // Return capital, languages, currency, timezone, etc.<br>  },<br>});</pre><p>This provides essential travel information: capital city, languages spoken, currency, population, timezone, and driving side.</p><p><strong>3. Travel Tips Tool</strong></p><pre>export const travelTipsTool = createTool({<br>  id: &#39;get-travel-tips&#39;,<br>  description: &#39;Get travel tips and city overview&#39;,<br>  inputSchema: z.object({<br>    city: z.string(),<br>    country: z.string(),<br>  }),<br>  execute: async ({ context }) =&gt; {<br>    // Search Wikipedia for city information<br>    // Extract summary and overview<br>    // Combine with general travel tips<br>  },<br>});</pre><p>This tool fetches Wikipedia summaries about cities and combines them with practical travel advice.</p><h4>Step 2: Creating the WanderWise Agent</h4><pre>export const tourGuideAgent = new Agent({<br>  name: &#39;Tour Guide Agent&#39;,<br>  instructions: `<br>    You are WanderWise, an expert tour guide AI assistant specializing in helping travelers discover amazing destinations around the world.<br>    <br>    Your capabilities:<br>    - Find tourist attractions, museums, monuments, and points of interest<br>    - Provide comprehensive country information<br>    - Share travel tips, cultural insights, and safety recommendations<br>    - Help travelers plan trips with specific, actionable advice<br>    <br>    Always be enthusiastic, helpful, and encouraging about travel.<br>    Make travelers excited about their destinations!<br>  `,<br>  model: &#39;google/gemini-2.5-flash&#39;,<br>  tools: {<br>    touristAttractionsTool,<br>    countryInfoTool,<br>    travelTipsTool,<br>  },<br>  memory: new Memory({<br>    storage: new LibSQLStore({<br>      url: &#39;file:../mastra.db&#39;,<br>    }),<br>  }),<br>});</pre><p>Key features:</p><ul><li><strong>Conversational AI</strong>: Uses Google Gemini 2.5 Flash for intelligent, natural responses</li><li><strong>Tool integration</strong>: Automatically decides which tool to use based on user queries</li><li><strong>Memory</strong>: Maintains conversation history for context-aware interactions</li><li><strong>Personality</strong>: Friendly and enthusiastic, like a real tour guide</li></ul><h4>Step 3: Building the A2A Route Handler</h4><p>The crucial bridge between Mastra and Telex is the A2A protocol handler. This was one of the most challenging parts of the project:</p><pre>export const a2aAgentRoute = registerApiRoute(&#39;/a2a/agent/:agentId&#39;, {<br>  method: &#39;POST&#39;,<br>  handler: async (c) =&gt; {<br>    // Parse JSON-RPC 2.0 request<br>    const body = await c.req.json();<br>    const { jsonrpc, id: requestId, method, params } = body;<br>    <br>    // Validate format<br>    if (jsonrpc !== &#39;2.0&#39; || !requestId) {<br>      return c.json({ /* error response */ });<br>    }<br>    <br>    // Get agent<br>    const agent = mastra.getAgent(agentId);<br>    <br>    // Extract and convert messages<br>    const mastraMessages = messagesList.map((msg) =&gt; ({<br>      role: msg.role,<br>      content: msg.parts?.map((part: { kind: &#39;text&#39; | &#39;data&#39;, text?: string, data?: object}) =&gt; {<br>        if (part.kind === &#39;text&#39;) return part.text || &#39;&#39;;<br>        if (part.kind === &#39;data&#39;) return JSON.stringify(part.data);<br>        return &#39;&#39;;<br>      }).join(&#39;\n&#39;) || &#39;&#39;<br>    }));<br>    <br>    // Execute agent<br>    const response = await agent.generate(mastraMessages);<br>    <br>    // Return A2A-compliant response with artifacts and history<br>    return c.json({<br>      jsonrpc: &#39;2.0&#39;,<br>      id: requestId,<br>      result: { /* properly formatted A2A response */ }<br>    });<br>  }<br>});</pre><p>This handler:</p><ul><li>Validates JSON-RPC 2.0 format (critical for A2A compliance)</li><li>Converts A2A messages to Mastra’s expected format</li><li>Executes the WandaWise agent with proper context</li><li>Wraps responses in A2A format with artifacts and conversation history</li><li>Handles errors gracefully with proper JSON-RPC error codes</li></ul><h4>Step 4: Registering with Mastra</h4><pre>export const mastra = new Mastra({<br>  agents: { tourGuideAgent },<br>  storage: new LibSQLStore({ url: &#39;:memory:&#39; }),<br>  logger: new PinoLogger({ <br>    name: &#39;Mastra&#39;, <br>    level: &#39;debug&#39; <br>  }),<br>  server: {<br>    build: {<br>      openAPIDocs: true,<br>      swaggerUI: true,<br>    },<br>    apiRoutes: [a2aAgentRoute]<br>  }<br>});</pre><h3>Challenges and Solutions</h3><h4>Challenge 1: Finding Reliable Free APIs</h4><p><strong>Problem</strong>: Many tourist APIs require paid subscriptions or have strict usage limits.</p><p><strong>Solution</strong>: After researching multiple options, I discovered OpenStreetMap’s Overpass API, which provides comprehensive point-of-interest data globally without any authentication. Combined with REST Countries and Wikipedia APIs, I had a complete free solution that rivals paid services.</p><h4>Challenge 2: TypeScript Type Safety with A2A Protocol</h4><p><strong>Problem</strong>: The A2A protocol has complex nested structures. TypeScript was throwing errors about implicit any types and type mismatches in the message parts.</p><p><strong>Solution</strong>: I took a pragmatic approach using inline type annotations where needed:</p><pre>// Inline type for message parts with union types<br>const mastraMessages = messagesList.map((msg) =&gt; ({<br>  role: msg.role,<br>  content: msg.parts?.map((part: { kind: &#39;text&#39; | &#39;data&#39;, text?: string, data?: object}) =&gt; {<br>    if (part.kind === &#39;text&#39;) return part.text;<br>    if (part.kind === &#39;data&#39;) return JSON.stringify(part.data);<br>    return &#39;&#39;;<br>  }).join(&#39;\n&#39;) || &#39;&#39;<br>}));</pre><p>For the artifacts type mismatch with tool results, I used type assertion:</p><pre>artifacts.push({<br>  artifactId: randomUUID(),<br>  name: &#39;ToolResults&#39;,<br>  parts: response.toolResults.map((result) =&gt; ({<br>    kind: &#39;data&#39;,<br>    data: result<br>  }))<br>} as any);  // Type assertion for flexibility</pre><p>This pragmatic approach balanced type safety with development speed. For a focused project like this, inline types were more maintainable than creating extensive interface definitions.</p><h4>Challenge 3: JSON Formatting in Workflow Definition</h4><p><strong>Problem</strong>: Telex.im workflow JSON doesn’t accept multi-line strings with actual line breaks — it would throw parsing errors.</p><p><strong>Solution</strong>: Used \n escape sequences instead of actual newlines in the long_description field:</p><pre>&quot;long_description&quot;: &quot;I&#39;m WanderWise, your expert AI tour guide...\n\nMy capabilities:\n- Find attractions\n- Get country info&quot;</pre><p>This is standard JSON practice, but easy to forget when copying from formatted text.</p><h3>Integration with Telex.im</h3><h4>Deployment</h4><p>Deploying WandaWise to Mastra Cloud was straightforward:</p><pre># Build the project<br>npm run build</pre><pre># Deploy to Mastra Cloud<br>mastra deploy</pre><p>After deployment, Mastra Cloud provides a unique A2A endpoint URL:</p><pre>https://your-deployment.mastra.cloud/a2a/agent/tourGuideAgent</pre><h3>Workflow Definition</h3><p>I created a Telex workflow JSON that defines how WanderWise appears on the platform:</p><pre>{<br>  &quot;active&quot;: true,<br>  &quot;category&quot;: &quot;travel&quot;,<br>  &quot;description&quot;: &quot;WanderWise - Your AI travel companion for discovering amazing destinations&quot;,<br>  &quot;id&quot;: &quot;tour_guide_agent&quot;,<br>  &quot;name&quot;: &quot;wanderwise_tour_guide&quot;,<br>  &quot;long_description&quot;: &quot;I&#39;m WanderWise, your expert AI tour guide...&quot;,<br>  &quot;short_description&quot;: &quot;Your AI travel companion - discover attractions, get travel tips, and explore the world&quot;,<br>  &quot;nodes&quot;: [<br>    {<br>      &quot;id&quot;: &quot;tour_guide_agent_node&quot;,<br>      &quot;name&quot;: &quot;Tour Guide Agent&quot;,<br>      &quot;type&quot;: &quot;a2a/mastra-a2a-node&quot;,<br>      &quot;typeVersion&quot;: 1,<br>      &quot;url&quot;: &quot;https://your-deployment.mastra.cloud/a2a/agent/tourGuideAgent&quot;<br>    }<br>  ]<br>}</pre><p>The critical field is type: &quot;a2a/mastra-a2a-node&quot; which tells Telex to use the A2A protocol for communication with WanderWise.</p><h3>How It Works: A Complete Flow</h3><p>Let me walk you through what happens when a user interacts with WanderWise:</p><ol><li><strong>User asks a question</strong> on Telex: “What are tourist attractions in Lagos, Nigeria?”</li><li><strong>Telex constructs an A2A request</strong>:</li></ol><pre>{<br>  &quot;jsonrpc&quot;: &quot;2.0&quot;,<br>  &quot;id&quot;: &quot;request-001&quot;,<br>  &quot;method&quot;: &quot;message/send&quot;,<br>  &quot;params&quot;: {<br>    &quot;message&quot;: {<br>      &quot;kind&quot;: &quot;message&quot;,<br>      &quot;role&quot;: &quot;user&quot;,<br>      &quot;parts&quot;: [<br>        {<br>          &quot;kind&quot;: &quot;text&quot;,<br>          &quot;text&quot;: &quot;What are tourist attractions in Lagos, Nigeria?&quot;<br>        }<br>      ],<br>      &quot;messageId&quot;: &quot;msg-001&quot;,<br>      &quot;taskId&quot;: &quot;task-001&quot;<br>    }<br>  }<br>}</pre><p>3.<strong> WanderWise processes the request</strong>:</p><ul><li>A2A route handler receives the JSON-RPC request</li><li>Extracts the user’s message from the A2A format</li><li>Converts it to Mastra’s message format</li><li>WanderWise agent analyzes the query</li><li>Decides to use touristAttractionsTool</li><li>Tool geocodes “Lagos, Nigeria” to coordinates</li><li>Queries OpenStreetMap Overpass API for attractions in that area</li><li>Returns structured data about 10 tourist spots</li></ul><p>4.<strong> Agent generates response</strong>:</p><ul><li>Gemini processes the tool results</li><li>Crafts a friendly, conversational response</li><li>Includes relevant details about each attraction</li></ul><p>5.<strong> Returns A2A-compliant response</strong>:</p><pre>{<br>  &quot;jsonrpc&quot;: &quot;2.0&quot;,<br>  &quot;id&quot;: &quot;request-001&quot;,<br>  &quot;result&quot;: {<br>    &quot;id&quot;: &quot;task-001&quot;,<br>    &quot;status&quot;: {<br>      &quot;state&quot;: &quot;completed&quot;,<br>      &quot;message&quot;: {<br>        &quot;role&quot;: &quot;agent&quot;,<br>        &quot;parts&quot;: [<br>          {<br>            &quot;kind&quot;: &quot;text&quot;,<br>            &quot;text&quot;: &quot;Here are 10 amazing places to visit in Lagos...&quot;<br>          }<br>        ]<br>      }<br>    },<br>    &quot;artifacts&quot;: [<br>      {<br>        &quot;name&quot;: &quot;tourGuideAgentResponse&quot;,<br>        &quot;parts&quot;: [{&quot;kind&quot;: &quot;text&quot;, &quot;text&quot;: &quot;Here are...&quot;}]<br>      },<br>      {<br>        &quot;name&quot;: &quot;ToolResults&quot;,<br>        &quot;parts&quot;: [{&quot;kind&quot;: &quot;data&quot;, &quot;data&quot;: {...}}]<br>      }<br>    ],<br>    &quot;history&quot;: [...]<br>  }<br>}</pre><p>6.<strong> Telex displays the response</strong> to the user in a beautiful, formatted way</p><h3>Example Conversations with WanderWise</h3><h4>Finding Tourist Attractions</h4><p><strong>User</strong>: “What are the top attractions in Cape Town, South Africa?”</p><p><strong>WanderWise</strong>: “Here are 10 amazing places to visit in Cape Town:</p><ol><li><strong>Table Mountain</strong> (Attraction) — The iconic flat-topped mountain offering stunning panoramic views of the city and coastline</li><li><strong>Robben Island</strong> (Museum) — Historic prison island where Nelson Mandela was held for 18 years</li><li><strong>V&amp;A Waterfront</strong> (Attraction) — Vibrant harbor area with shopping, dining, and entertainment</li><li><strong>Kirstenbosch Botanical Gardens</strong> (Attraction) — World-renowned botanical garden at the foot of Table Mountain</li><li><strong>Cape Point</strong> (Viewpoint) — Dramatic cliffs and lighthouse at the southern tip of the peninsula …”</li></ol><h4>Getting Country Information</h4><p><strong>User</strong>: “Tell me about Kenya”</p><p><strong>WanderWise</strong>: “🇰🇪 Here’s what you should know about Kenya:</p><p><strong>Capital</strong>: Nairobi <strong>Languages</strong>: Swahili, English <strong>Currency</strong>: Kenyan Shilling (KES) <strong>Population</strong>: 54.9 million <strong>Timezone</strong>: EAT (UTC+3) <strong>Region</strong>: Eastern Africa <strong>Driving</strong>: Left side of the road</p><p>Kenya is known for its stunning wildlife, beautiful beaches, and the Great Rift Valley. It’s home to world-famous national parks and reserves!”</p><h4>Travel Tips</h4><p><strong>User</strong>: “Give me travel tips for Abuja”</p><p><strong>WanderWise</strong>: “Here are essential tips for visiting Abuja, Nigeria:</p><p><strong>About Abuja</strong>: Abuja is the capital city of Nigeria, located in the center of the country. It was built in the 1980s and officially became the capital in 1991, replacing Lagos. The city is known for its modern architecture, including the Aso Rock and the Nigerian National Mosque.</p><p><strong>Travel Tips</strong>: ✅ Carry Nigerian Naira for local markets and small vendors ✅ Learn basic Hausa or Pidgin English phrases — locals appreciate the effort ✅ Respect local dress codes, especially when visiting government areas or religious sites ✅ Stay hydrated — Abuja has a tropical climate ✅ Be cautious with street food initially until your stomach adjusts ✅ Keep copies of important documents (passport, visa) ✅ Use reputable transportation services like registered taxis or ride-sharing apps ✅ The best time to visit is during the dry season (November to March)</p><p>Safe travels! 🌍✈️”</p><h3>What I Learned Building WanderWise</h3><h4>1. The Power of Mastra’s Tool System</h4><p>Mastra’s createTool with Zod schemas made it incredibly easy to build type-safe, composable tools. The agent automatically handles tool selection and execution based on the user&#39;s query - I didn&#39;t have to write any routing logic.</p><h4>2. A2A Protocol is the Future</h4><p>The Agent-to-Agent protocol provides a standardized way for AI agents to communicate across platforms. Once you implement it correctly, your agent can work with any A2A-compliant system without modification. This interoperability is game-changing.</p><h4>3. Free APIs Can Be Enterprise-Grade</h4><p>You don’t always need expensive APIs. OpenStreetMap has better coverage than some paid services, Wikipedia provides rich contextual information, and REST Countries is more reliable than many paid alternatives. The key is knowing where to look.</p><h4>4. Type Safety Saves Time</h4><p>Taking the time to properly type A2A messages saved me from countless runtime errors. TypeScript caught bugs before they reached production, and the autocomplete made development much faster.</p><h4>5. User Experience is Everything</h4><p>The way you write agent instructions directly impacts how users perceive the AI. WanderWise’s friendly, enthusiastic tone makes travel planning feel exciting rather than overwhelming. Users don’t just get information — they get inspired.</p><h4>6. Error Handling Matters</h4><p>Implementing proper JSON-RPC error codes and graceful degradation meant WanderWise could handle edge cases smoothly. When a city isn’t found, it suggests alternatives rather than crashing.</p><h3>Project Structure</h3><p>For anyone wanting to replicate this, here’s the complete structure:</p><pre>tourguide-ai-agent/<br>├── src/<br>│   └── mastra/<br>│       ├── agents/<br>│       │   └── tour-guide-agent.ts<br>│       ├── tools/<br>│       │   └── tour-guide-tools.ts<br>│       ├── routes/<br>│       │   └── a2a-agent-route.ts<br>│       └── index.ts<br>├── package.json<br>├── tsconfig.json<br>└── README.md</pre><h3>Future Enhancements for WanderWise</h3><p>I’m planning to add:</p><ul><li><strong>Weather integration</strong>: Real-time weather forecasts for destinations</li><li><strong>Flight search</strong>: Find and compare flight prices</li><li><strong>Hotel recommendations</strong>: AI-curated accommodation suggestions based on budget and preferences</li><li><strong>Itinerary builder</strong>: Multi-day trip planning with optimized routes</li><li><strong>Budget calculator</strong>: Estimate total trip costs including accommodation, food, and activities</li><li><strong>Local events</strong>: Discover festivals, concerts, and events happening during your visit</li><li><strong>Photo suggestions</strong>: Best spots and times for photography at each attraction</li><li><strong>Safety alerts</strong>: Real-time travel advisories and safety information</li><li><strong>Language phrases</strong>: Essential phrases in the local language</li><li><strong>Currency converter</strong>: Real-time exchange rates and cost comparisons</li></ul><h3>Performance and Scalability</h3><p>WanderWise handles requests efficiently:</p><ul><li><strong>Average response time</strong>: 2–3 seconds for attraction queries</li><li><strong>API reliability</strong>: 99.9% uptime (thanks to robust free APIs)</li><li><strong>Cost</strong>: $0 for API calls, completely free with Gemini 2.5 Flash free tier</li><li><strong>Scalability</strong>: Mastra Cloud handles auto-scaling seamlessly</li></ul><h3>Conclusion</h3><p>Building WanderWise taught me how to:</p><ul><li>Design and implement AI agents using Mastra’s framework</li><li>Integrate with platforms using the standardized A2A protocol</li><li>Work with free, high-quality APIs to build production-ready solutions</li><li>Create type-safe TypeScript applications with complex data structures</li><li>Build user-friendly conversational AI that feels natural and helpful</li><li>Handle real-world challenges like API limitations and type mismatches</li></ul><p>The combination of Mastra’s powerful framework, the A2A protocol’s standardization, and Telex.im’s platform made it possible to build a production-ready AI tour guide in just a few days. What would have taken weeks with custom infrastructure was accomplished quickly thanks to these modern tools.</p><p>Whether you’re planning a trip to Lagos, exploring Cape Town, curious about Kenya, or dreaming about any destination worldwide, <strong>WanderWise is ready to be your travel companion</strong>. 🌍✈️</p><h3>Try It Yourself</h3><p>Want to build your own Mastra agent? Here’s the quick-start path:</p><ol><li><strong>Install Mastra</strong>: npm create mastra@latest</li><li><strong>Create your tools</strong> using createTool with Zod schemas</li><li><strong>Build your agent</strong> with clear instructions and tool integration</li><li><strong>Implement A2A route</strong> for Telex integration</li><li><strong>Deploy</strong>: mastra deploy</li><li><strong>Integrate with Telex</strong>: Create workflow JSON and test</li></ol><p>The possibilities are endless. Customer support bots, data analysis agents, code reviewers, content generators — what will you build?</p><h3>Links and Resources</h3><ul><li><strong>GitHub Repository</strong>: <a href="https://github.com/Henshaw-knight/tourguide-ai-agent">https://github.com/Henshaw-knight/tourguide-ai-agent</a></li><li><strong>Live Demo on Telex</strong>: telex.im/</li><li><strong>Mastra Documentation</strong>: <a href="https://docs.mastra.ai">https://docs.mastra.ai</a></li><li><strong>A2A Protocol Spec</strong>: <a href="https://a2a.ai">https://a2a.ai</a></li><li><strong>OpenStreetMap Overpass API</strong>: <a href="https://overpass-api.de">https://overpass-api.de</a></li><li><strong>REST Countries API</strong>: <a href="https://restcountries.com">https://restcountries.com</a></li><li><strong>Wikipedia API</strong>: <a href="https://www.mediawiki.org/wiki/API">https://www.mediawiki.org/wiki/API</a></li></ul><p><strong>Built with ❤️ by Henshaw.<br>Tech Stack</strong>: Mastra, TypeScript, Google Gemini 2.5 Flash, free APIs <br><strong>Special Thanks</strong>: Mastra team for the amazing framework, HNG Internship for the challenge</p><p><em>Have questions about WanderWise or want to collaborate? Reach out on Twitter [@Henshaw_knight] or GitHub!</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e5af3c099377" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[TECHUP: Unlocking Opportunities to Unleash Your Potential in Tech]]></title>
            <link>https://medium.com/@henshaw-knight/techup-unlocking-opportunities-to-unleash-your-potential-in-tech-941d779a4bcb?source=rss-47682efa2eb5------2</link>
            <guid isPermaLink="false">https://medium.com/p/941d779a4bcb</guid>
            <dc:creator><![CDATA[Henshaw Joseph Essien]]></dc:creator>
            <pubDate>Fri, 12 Apr 2024 16:36:36 GMT</pubDate>
            <atom:updated>2024-04-12T16:36:36.027Z</atom:updated>
            <content:encoded><![CDATA[<h3>Introduction</h3><p>In today’s digital age, technology is advancing at an unprecedented pace, transforming industries and creating exciting career opportunities. In this rapidly evolving tech landscape, the journey to success often begins with finding the right opportunities. Whether you are a seasoned professional looking for your next career move or a budding enthusiast eager to break into the industry, the quest for the perfect opportunity can be both thrilling and overwhelming. And that is where TechUp comes in.</p><figure><img alt="TechUp Logo" src="https://cdn-images-1.medium.com/max/1024/1*M9psc7zJWz4AvUquM7c8dg.jpeg" /><figcaption>TechUp Logo Designed by Danny Paul</figcaption></figure><h4>What is TechUp?</h4><p>TechUp is a website designed to help users find and manage tech opportunities. TechUp is an innovative online platform tailored to the needs of individuals seeking to navigate the vast landscape of opportunities within the dynamic tech industry. This array of opportunities includes internships, jobs, freelance projects, mentorship programs and much more. This empowers users to maximize their potential and succeed in the tech industry.</p><h4>Its Conception</h4><p>It was a crisp night when Usman and I found ourselves immersed in a spirited discussion about the project we were going to build. Little did we know that this seemingly routine conversation would lead to a big realization.</p><p>As Usman and I had the meeting, we found ourselves in remarkable alignment. Our ideas of the project to build, for the end of our Foundation period at ALX Software Engineering Program, were remarkably in sync. It was as if we were reading each other’s minds.</p><p>For me, the idea came when I remembered the challenges and struggles I had in securing an organization for my SIWES placement in my penultimate year of college. It was at that point that the seeds of inspiration were planted in my mind to develop something that would make it easier to find opportunities.</p><p>Usman and I shared the same vision, a platform that leverages technology to empower individuals and revolutionize the way opportunities are discovered and accessed in the tech industry. In that moment of synchronicity, I knew that we were meant to embark on this journey of building the project together, and we were committed to doing our best.</p><p>After talking more, we decided to pick the technologies we thought best to make TechUp. We both wanted to use technology that was really good and would help people use TechUp easily.</p><h4>Technologies Chosen</h4><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=941d779a4bcb" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>