Project Info
Inspiration
Last year, the US had a shortage of 70,000 electricians and 642,000 mechanics. With one in five of these tradespeople over the age of 55 and growing demand in data centers and electric vehicles, this gap is only getting bigger. But what if everyone could become a skilled technician in under 5 minutes? This is why we built Bob. By using this AI+AR assistant, homeowners could handle simple repairs, vocational schools could train workers more efficiently, and professionals could work faster, safer, and more collaboratively.
What it does
Bob is a pair of agentic AR glasses that automatically watches over your actions, listens to your questions, and responds to your needs in real time. This could be instructions for your next steps, object-specific details (like a resistor's resistance), or warnings before you do something dangerous. For complex, collaborative tasks, it can also contact your teammates or highlight selected objects (in case you don't know what a “Kellum grip” is). While existing smart glasses focus on specific workflows like trivia or design, we built Bob to be a generalist from the outset. It can help you build electrical circuits, repair cars, and assemble furniture. With more tools, the variety of tasks Bob can do would be even greater.
How we built it
We’re using Snapchat Spectacles as our hardware and Gemini Live as our base model: the Spectacles stream video and audio data to a Python-built WebSocket server. On initial connection, we establish a new WebSocket connection to Gemini Live and store all subsequent audio and video frames in the session. Asynchronous workers handle buffering uploads, processing responses, executing tool calls, and resuming Gemini Live sessions efficiently. For tools, we used SMTP to integrate Gmail, YOLOE-11 for object detection via text prompts, the Python Slack SDK to integrate Slack, and Google Generative AI SDK for Google Search and Google Map. When voice activation detects that the user has stopped speaking, Gemini Live returns text and tool calls. These get executed and sent back to the Spectacles to update the overlay and bounding box highlights, guiding users through their project. Finally, we would like to note that all WebSockets connections are reused, minimizing the latency between Spectacles and the server.
Challenges we ran into
Messaging with Gemini Live over WebSocket turned out to be particularly challenging, with bugs in the asynchronous context manager and a demanding manual implementation of retry and bidirectional socket management. In addition, projecting pixel coordinates from the camera frame to the Snap Spectacle for object detection required debugging complex coordinate transformations. We solved these issues through test-driven development, A/B testing, and binary search.
Accomplishments we're proud of
As far as we know, we made the first pair of AR glasses with a multimodal AI agent that can talk back and forth with the user and instruct them in completing physical tasks. Although smart glasses exist, they are incapable of maintaining coherence over a physical task while accepting real-time input, often relying on obtrusive UI like buttons. By integrating live, multimodal agent and object detection into Snap Spectacles, we turned AR glasses into an agent with memory that helps anyone build whatever they want. We’re especially proud of getting the Spectacles to work since none of us had touched AR glasses before this project.
What we learned
Developing AR applications with Lens Studio Working with live instead of turn-based agents State management for WebSocket
What's next
When we interviewed our users about what else they would like to do with Bob, they gave really creative answers: cooking, first aid, martial arts…While these tasks are far from our original goal, Bob can quickly adapt to them because of its agentic framework. Every new tool can unlock a new field for Bob. For example, if we had added Composio’s toolset, Bob would be able to manage your calendar, send Slack messages, and read Notion pages. We could even link Bob to a humanoid robot that collaborates with the user on physical tasks. The future path for Bob is to become the orchestrator directing tens, hundreds or even thousands of humans at a time concurrently on large projects. Managing and monitoring all of them towards common goals while maintaining a common state across workers which would allow for effective collaboration. In addition, Bob is limited by its base models. If we had the hardware, we would run Qwen 2.5-Omni locally to reduce latency and use GroundingDINO to detect objects with greater accuracy.
Tethyr Labs - AI-Powered AR Glasses
An AI-powered AR glasses development platform with real-time computer vision, object detection, and AI agent capabilities.
Architecture
AR Glasses (Snap Lens Studio)
Location: snap/snap/Assets/CoordinateFetcher.ts
- File: TypeScript component for Lens Studio
- Function: Captures camera frames from AR glasses and sends to server
- To add new UI: Edit
CoordinateFetcher.tsin thedisplayLabel()method (lines 124-151) to modify visual markers and positioning
AI Agent
Location: Multiple files in root directory
ai_client.py: Gemini Live API and OpenRouter integrationstream_to_gemini_live(): Real-time streaming with Geminisend_to_openrouter(): Multi-model support via OpenRouter
ollama_client.py: Local Ollama integrationget_ollama_response(): Vision-capable models (llava, llama3.2-vision)
grounding.py: YOLO-based object detectionGrounding.detect(): Run detection on framesGrounding.update_prompt(): Modify detection classes dynamically
To add new AI tools: Create functions in ai_client.py or
ollama_client.py following existing patterns
Backend Servers
serve.py: WebSocket server for AR glasses (port 5001)app.py: Webcam webapp (port 5001)- Camera feed display
- Frame analysis with AI models
Installation
# Install dependencies
uv sync
# Or with pip
pip install -r requirements.txt
Usage
Start AR Glasses Server
python main.py
Start Webcam Webapp
python app.py
# Visit http://localhost:5001
Requirements
- Python 3.13+
- Snap Lens Studio (for AR glasses development)
- Ollama (optional, for local AI models)
- OpenRouter API key (optional, for cloud AI models)
- Google API key (optional, for Gemini Live)
Environment Variables
GOOGLE_API_KEY: For Gemini Live APIOPENROUTER_API_KEY: For OpenRouter multi-model access
Analysis
View
Metric
- 41
- 39
- 13
Figures cover GitHub contributors during the hackathon window. A co-authored commit counts in full for each author, so per-member totals add up to more than the whole-team figures.
Technology
- HTMLIn code
- PythonIn code
- TypeScriptIn code
- Google GeminiClaimed
3 of 4 appear in the indexed code. 1 claimed on Devpost could not be matched to code, which may simply mean the tool leaves no trace in the repository.
AI coding agents
- Claude CodeConfig
Detected from committed agent config files and commit authorship. Absence of a signal is not proof an agent was unused.
Codebase size
Source size
195 KB
Source files
30
Counts recognized source files only; vendored directories, binaries and lockfiles are excluded, so this is smaller than the repository on disk.
Repository
raghavrajsah/tethyr
67 files · 771 KB · @ 05c09e8
Structure
Interface
1 file · 1%Screens, components and styles rendered to the user.
Application logic
29 files · 43%Domain rules, services and shared utilities.
Supporting
Layers are inferred from where files sit in the tree, not from reading the code. A project that names its directories unconventionally will read oddly here — open the file browser to check anything the diagram implies.
Languages
- Python84%
- TypeScript10%
- HTML4%
- Markdown2%
- YAML0%
Share of indexed source by file size. Binary and vendored files are excluded.
Dependencies
pyproject.toml
pypi · 12- clip
- google-genai[aiohttp]
- livekit-agents[google]
- loguru
- numpy
- opencv-contrib-python
- opencv-python
- pillow
- scipy
- slack-sdk
- ultralytics
- websockets
Declared in the repository’s manifests at the indexed commit. A declared package is not proof it is used, and runtime dependencies are listed first.
Feature verification
Bounding box overlay / object highlighting sent to AR glassesVerified
Bob can highlight selected objects on the AR display
Claimed on Devposthigh confidencetethyr/handlers.py:153— constructs BBoxMessage from detection bbox and sends it over the websocket to the clientsnap/snap/Assets/CoordinateFetcher.ts:413— Lens Studio component handles incoming 'bbox' messages and renders bounding boxes on the AR overlay
Coordinate transformation from camera frame to Spectacle displayVerified
Projecting pixel coordinates from the camera frame to the Snap Spectacle for object detection required debugging complex coordinate transformations
Claimed on Devpostmedium confidencesnap/snap/Assets/CoordinateFetcher.ts:103— CoordinateFetcher.ts contains screen-region/bounding-box placement logic (displayLabel/bbox handling per README) for mapping detections onto the AR view
Gmail/SMTP based human-help escalationVerified
SMTP is used to integrate Gmail; Bob can contact teammates/humans for help
Claimed on Devposthigh confidencetethyr/email_supervisor.py:99— EmailSupervisor.send_help_request uses smtplib.SMTP to send an emailtethyr/gemini_client.py:449— _handle_request_human_help tool handler is wired into Gemini's function-call dispatch and registered in the live tools list
Google Search tool integration via Google Generative AI SDKVerified
Google Generative AI SDK used for Google Search
Claimed on Devposthigh confidencetethyr/gemini_client.py:554— types.Tool(google_search=types.GoogleSearch()) is registered in the Gemini Live tools list
Object detection via YOLOE-11 with dynamic text-prompt targetingVerified
YOLOE-11 is used for object detection via text prompts, highlighting objects for the user
Claimed on Devposthigh confidencetethyr/grounding.py:29— loads a YOLO model (yoloe-11m-seg.pt) and exposes update_prompt for text-prompt-driven detectiontethyr/gemini_client.py:416— _handle_change_detection_target tool call updates grounding_detector.update_prompt from Gemini function calls
Real-time multimodal AI agent via Gemini Live over WebSocketVerified
Spectacles stream video and audio to a Python WebSocket server that connects to Gemini Live and processes responses/tool calls in real time
Claimed on readmehigh confidencetethyr/gemini_client.py:305— _handle_response processes Gemini Live text and tool_call responses within an active AsyncSessiontethyr/server.py:15— server imports handle_audio_chunk/handle_video_frame and runs a websocket server on port 5001 that feeds Geminiserve.py:2— entrypoint that starts tethyr.server.run_server, the real Gemini Live pipeline
Real-time text overlay / next-step instructions on AR displayVerified
Bob gives instructions for next steps as an AR overlay
Claimed on Devposthigh confidencetethyr/handlers.py:73— builds an OverlayMessage sent to the clientsnap/snap/Assets/CoordinateFetcher.ts:409— handles 'overlay' message type to update displayed text
Scratchpad / agent memory across the taskVerified
turned AR glasses into an agent with memory that helps anyone build whatever they want
Claimed on Devpostmedium confidencetethyr/scratchpad_tools.py:1— defines read/write/append/clear scratchpad tool declarationstethyr/gemini_client.py:375— scratchpad tool calls are dispatched and registered in the live connect tools list
Session resumption and automatic retry/reconnect for Gemini Live WebSocketVerified
Asynchronous workers handle... resuming Gemini Live sessions efficiently; manual implementation of retry and bidirectional socket management
Claimed on Devposthigh confidencetethyr/gemini_client.py:624— _handle_connection_error implements exponential backoff reconnection using a stored resume_token, capped at max_reconnect_attemptstethyr/gemini_client.py:561— session_resumption config passed with the stored resume token on reconnect
Webcam webapp alternative to AR glasses (Flask app on port 5001)Verified
app.py: Webcam webapp with camera feed display and frame analysis
Claimed on readmehigh confidenceapp.py:7— Flask app defined with render_template('index.html') and camera/frame-analysis routes
Contact teammates (Slack integration)Code-supported
For complex, collaborative tasks, it can also contact your teammates
Claimed on Devpostmedium confidencetethyr/slack_tool.py:8— defines SLACK_TOOL_DECLARATION and a SlackBot class that sends Slack messages via slack_sdk
Generalist tasks (electrical circuits, car repair, furniture assembly, resistor lookups)Code-supported
It can help you build electrical circuits, repair cars, and assemble furniture; object-specific details like a resistor's resistance
Claimed on Devpostlow confidencetethyr/prompts.py:1— system prompt is domain-agnostic/generalist rather than hardcoded per-task, consistent with the claim, but actual task performance depends on the live Gemini model and cannot be verified from code alone
Local Ollama vision model integrationCode-supported
ollama_client.py: Local Ollama integration with get_ollama_response for vision-capable models
Claimed on readmemedium confidenceollama_client.py:1— file exists and per README implements get_ollama_response, but not wired into the main tethyr/serve.py Gemini Live pipeline used for the actual demo path
OpenRouter multi-model supportCode-supported
ai_client.py: send_to_openrouter() for multi-model support via OpenRouter
Claimed on readmemedium confidenceai_client.py:1— ai_client.py referenced by README as containing OpenRouter integration; this module is used by the legacy main.py path, not the primary tethyr/serve.py server
Safety warnings before dangerous actionsCode-supported
Bob gives warnings before you do something dangerous
Claimed on Devpostlow confidencetethyr/prompts.py:14— system prompt instructs the model to 'Provide safety warnings when relevant (electrical, construction, etc.)' and be 'proactive about safety', but this is a prompt-level instruction, not independently verifiable enforcement code
Google Maps tool integrationClaimed only
Google Generative AI SDK used for Google Map
Claimed on Devposthigh confidence
An AI agent derived these features from the project’s Devpost page and readme, then searched the code for each one. Verified features are backed by cited code; claimed-only features had no supporting code, which is not by itself proof a feature is missing.
Export this project's context (description, README, evidence, key source files) to chat with an AI agent elsewhere.