groqAudioChatREADME.md8 matches
1# Groq Audio Chat
23A web-based chat application powered by Groq's LLM API with audio transcription and text-to-speech capabilities.
45## Features
67- Chat with the Llama-3.3-70b-versatile model through Groq API
8- Multiple ways to record audio input:
9- Hold spacebar to record audio (keyboard shortcut)
22/
23โโโ index.ts # Main entry point
24โโโ handlers/ # API endpoint handlers
25โ โโโ index.ts # Exports all handlers
26โ โโโ audio.ts # Audio transcription handler
35```
3637## API Endpoints
3839- `GET /` - Main web interface
44## Voice Options
4546The application features 19 different PlayHT voices through Groq's API:
47- Arista-PlayAI
48- Atlas-PlayAI
67## Environment Variables
6869- `GROQ_API_KEY` - Your Groq API key
7071## Technologies Used
74- Alpine.js - Front-end JavaScript framework
75- Tailwind CSS - Utility-first CSS framework
76- Groq API - LLM provider with Llama-3.3-70b-versatile model
77- Groq Whisper API - Audio transcription
78- PlayHT (via Groq) - Text-to-speech synthesis
79
groqAudioChattts.ts12 matches
16}
1718// Get API key from environment variable
19const apiKey = Deno.env.get("GROQ_API_KEY");
20if (!apiKey) {
21console.error("โ TTS error: Missing API key");
22return c.json({ error: "API key not configured" }, 500);
23}
2425// Call Groq Speech API
26console.log("๐ Sending request to Groq Speech API");
27const start = Date.now();
28const response = await fetch("https://api.groq.com/openai/v1/audio/speech", {
29method: "POST",
30headers: {
31"Content-Type": "application/json",
32"Authorization": `Bearer ${apiKey}`
33},
34body: JSON.stringify({
40});
41const elapsed = Date.now() - start;
42console.log(`๐ Groq Speech API response received in ${elapsed}ms, status: ${response.status}`);
4344if (!response.ok) {
47const errorData = await response.json();
48errorMessage = errorData.error?.message || JSON.stringify(errorData);
49console.error("โ TTS API error:", errorData);
50} catch (e) {
51// If response is not JSON
52errorMessage = `Server error: ${response.status} ${response.statusText}`;
53console.error("โ TTS API non-JSON error:", errorMessage);
54}
55
groqAudioChatchat.ts9 matches
12console.log(`๐ต Last user message: "${messages.find(m => m.role === 'user')?.content?.substring(0, 50)}..."`);
13
14const GROQ_API_KEY = Deno.env.get("GROQ_API_KEY");
15if (!GROQ_API_KEY) {
16console.error("โ Missing GROQ_API_KEY environment variable");
17return c.json({ error: "GROQ_API_KEY environment variable is not set" }, 500);
18}
1920console.log("๐ต Sending request to Groq API");
21const start = Date.now();
22const response = await fetch("https://api.groq.com/openai/v1/chat/completions", {
23method: "POST",
24headers: {
25"Content-Type": "application/json",
26"Authorization": `Bearer ${GROQ_API_KEY}`
27},
28body: JSON.stringify({
33});
34const elapsed = Date.now() - start;
35console.log(`๐ต Groq API response received in ${elapsed}ms, status: ${response.status}`);
3637if (!response.ok) {
38const errorData = await response.json();
39console.error("โ Chat API error:", errorData);
40return c.json({ error: "Failed to get chat completion", details: errorData }, response.status);
41}
groqAudioChataudio.ts16 matches
1import { Context } from "https://deno.land/x/hono@v3.11.7/mod.ts";
23// Function to handle audio transcription using Groq's Whisper API
4export const audioTranscriptionHandler = async (c: Context) => {
5console.log("๐ค Audio transcription request received");
15}
1617// Get API key from environment variable
18const apiKey = Deno.env.get("GROQ_API_KEY");
19if (!apiKey) {
20console.error("โ Transcription error: Missing API key");
21return c.json({ error: "API key not configured" }, 500);
22}
2333
34// If the file doesn't have a proper name or type, add one
35// This ensures the file has the right extension for the API
36if (!audioFile.name || !audioFile.type.startsWith('audio/')) {
37const newFile = new File(
45}
4647// Prepare the form data for Groq API
48const groqFormData = new FormData();
49
60groqFormData.append("timestamp_granularities[]", "word");
6162// Call Groq API
63console.log("๐ค Sending request to Groq Whisper API");
64const start = Date.now();
65const response = await fetch("https://api.groq.com/openai/v1/audio/transcriptions", {
66method: "POST",
67headers: {
68"Authorization": `Bearer ${apiKey}`
69},
70body: groqFormData
71});
72const elapsed = Date.now() - start;
73console.log(`๐ค Groq Whisper API response received in ${elapsed}ms, status: ${response.status}`);
7475// Get response content type
94errorMessage = `Server error: ${response.status} ${response.statusText}`;
95// Log the full response for debugging
96console.error("โ Transcription API error response:", {
97status: response.status,
98statusText: response.statusText,
103}
104} catch (parseError) {
105console.error("โ Error parsing Groq API response:", parseError);
106errorMessage = "Failed to parse error response from server";
107}
108109return c.json({
110error: `Groq API error: ${errorMessage}`,
111status: response.status
112}, response.status);
11},
12{
13"prompt": "weather dashboard for nyc using open-meteo API for NYC with icons",
14"title": "Weather App",
15"code": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>NYC Weather</title>\n <link href=\"https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css\" rel=\"stylesheet\">\n <style>\n .weather-icon {\n font-size: 48px;\n margin-bottom: 16px;\n }\n </style>\n</head>\n<body class=\"h-screen bg-blue-100 flex justify-center items-center p-4\">\n <div class=\"bg-white p-8 rounded-md shadow-md w-full max-w-sm md:p-12 lg:p-16 xl:p-20\">\n <h1 class=\"text-2xl font-bold mb-4 text-center text-blue-500\">NYC Weather</h1>\n <div id=\"weather\" class=\"mb-4 p-4 text-center\">\n <div id=\"temperature\" class=\"text-4xl font-bold mb-4\"></div>\n <div id=\"condition\" class=\"text-xl font-medium mb-4\"></div>\n <div id=\"humidity\" class=\"text-lg font-light mb-2\">Humidity: <span id=\"humidity-value\"></span>%</div>\n <div id=\"wind\" class=\"text-lg font-light mb-2\">Wind: <span id=\"wind-value\"></span> mph</div>\n <i id=\"weather-icon\" class=\"weather-icon text-blue-500\"></i>\n </div>\n </div>\n <p class=\"fixed bottom-0 left-0 right-0 text-center p-4 text-gray-600 md:p-6 lg:p-8 xl:p-10\">\n Built on <a class=\"text-blue-600\" href=\"https://cerebrascoder.com\">Cerebras Coder</a>\n </p>\n\n <script>\n // Sample weather data\n const weatherData = {\n temperature: 75,\n condition: 'Sunny',\n humidity: 60,\n wind: 10,\n icon: 'sun'\n };\n\n document.getElementById('temperature').innerText = `${weatherData.temperature}ยฐF`;\n document.getElementById('condition').innerText = weatherData.condition;\n document.getElementById('humidity-value').innerText = weatherData.humidity;\n document.getElementById('wind-value').innerText = weatherData.wind;\n\n // Map weather icon\n const weatherIcons = {\n 'sun': '☀',\n 'cloud': '☀',\n 'rain': '☃',\n 'snow': '☄'\n };\n\n document.getElementById('weather-icon').innerHTML = weatherIcons[weatherData.icon] || '';\n </script>\n</body>\n</html>",
cerebras_coderREADME.md2 matches
891. Sign up for [Cerebras](https://cloud.cerebras.ai/)
102. Get a Cerebras API Key
113. Save it in your project env variable called `CEREBRAS_API_KEY`
cerebras_coderindex.html3 matches
5<meta name="viewport" content="width=device-width, initial-scale=1.0">
6<title>CerebrasCoder</title>
7<link rel="preconnect" href="https://fonts.googleapis.com" />
8<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
9<link
10href="https://fonts.googleapis.com/css2?family=DM+Mono:ital,wght@0,300;0,400;0,500;1,300;1,400;1,500&family=DM+Sans:ital,opsz,wght@0,9..40,100..1000;1,9..40,100..1000&display=swap"
11rel="stylesheet"
12/>
21<meta property="og:description" content="Turn your ideas into fully functional apps in less than a second โ powered by Llama3.3-70b on Cerebras's super-fast wafer chips. Code is 100% open-source, hosted on Val Town."">
22<meta property="og:type" content="website">
23<meta property="og:image" content="https://stevekrouse-blob_admin.web.val.run/api/public/CerebrasCoderOG.jpg">
24
25
cerebras_coderindex1 match
211} catch (error) {
212Toastify({
213text: "We may have hit our Cerebras Usage limits. Try again later or fork this and use your own API key.",
214position: "center",
215duration: 3000,
cerebras_codergenerate-code1 match
16};
17} else {
18const client = new Cerebras({ apiKey: Deno.env.get("CEREBRAS_API_KEY") });
19const completion = await client.chat.completions.create({
20messages: [
groqAudioChatgroqAudioChat48 matches
6import "jsr:@std/dotenv/load"; // needed for deno run; not req for smallweb or valtown
78// Function to handle audio transcription using Groq's Whisper API
9export const audioTranscriptionHandler = async (c) => {
10console.log("๐ค Audio transcription request received");
20}
2122// Get API key from environment variable
23const apiKey = Deno.env.get("GROQ_API_KEY");
24if (!apiKey) {
25console.error("โ Transcription error: Missing API key");
26return c.json({ error: "API key not configured" }, 500);
27}
2838
39// If the file doesn't have a proper name or type, add one
40// This ensures the file has the right extension for the API
41if (!audioFile.name || !audioFile.type.startsWith('audio/')) {
42const newFile = new File(
50}
5152// Prepare the form data for Groq API
53const groqFormData = new FormData();
54
65groqFormData.append("timestamp_granularities[]", "word");
6667// Call Groq API
68console.log("๐ค Sending request to Groq Whisper API");
69const start = Date.now();
70const response = await fetch("https://api.groq.com/openai/v1/audio/transcriptions", {
71method: "POST",
72headers: {
73"Authorization": `Bearer ${apiKey}`
74},
75body: groqFormData
76});
77const elapsed = Date.now() - start;
78console.log(`๐ค Groq Whisper API response received in ${elapsed}ms, status: ${response.status}`);
7980// Get response content type
99errorMessage = `Server error: ${response.status} ${response.statusText}`;
100// Log the full response for debugging
101console.error("โ Transcription API error response:", {
102status: response.status,
103statusText: response.statusText,
108}
109} catch (parseError) {
110console.error("โ Error parsing Groq API response:", parseError);
111errorMessage = "Failed to parse error response from server";
112}
113114return c.json({
115error: `Groq API error: ${errorMessage}`,
116status: response.status
117}, response.status);
150console.log(`๐ต Last user message: "${messages.find(m => m.role === 'user')?.content?.substring(0, 50)}..."`);
151
152const GROQ_API_KEY = Deno.env.get("GROQ_API_KEY");
153if (!GROQ_API_KEY) {
154console.error("โ Missing GROQ_API_KEY environment variable");
155return c.json({ error: "GROQ_API_KEY environment variable is not set" }, 500);
156}
157158console.log("๐ต Sending request to Groq API");
159const start = Date.now();
160const response = await fetch("https://api.groq.com/openai/v1/chat/completions", {
161method: "POST",
162headers: {
163"Content-Type": "application/json",
164"Authorization": `Bearer ${GROQ_API_KEY}`
165},
166body: JSON.stringify({
171});
172const elapsed = Date.now() - start;
173console.log(`๐ต Groq API response received in ${elapsed}ms, status: ${response.status}`);
174175if (!response.ok) {
176const errorData = await response.json();
177console.error("โ Chat API error:", errorData);
178return c.json({ error: "Failed to get chat completion", details: errorData }, response.status);
179}
204}
205206// Get API key from environment variable
207const apiKey = Deno.env.get("GROQ_API_KEY");
208if (!apiKey) {
209console.error("โ TTS error: Missing API key");
210return c.json({ error: "API key not configured" }, 500);
211}
212213// Call Groq Speech API
214console.log("๐ Sending request to Groq Speech API");
215const start = Date.now();
216const response = await fetch("https://api.groq.com/openai/v1/audio/speech", {
217method: "POST",
218headers: {
219"Content-Type": "application/json",
220"Authorization": `Bearer ${apiKey}`
221},
222body: JSON.stringify({
228});
229const elapsed = Date.now() - start;
230console.log(`๐ Groq Speech API response received in ${elapsed}ms, status: ${response.status}`);
231232if (!response.ok) {
235const errorData = await response.json();
236errorMessage = errorData.error?.message || JSON.stringify(errorData);
237console.error("โ TTS API error:", errorData);
238} catch (e) {
239// If response is not JSON
240errorMessage = `Server error: ${response.status} ${response.statusText}`;
241console.error("โ TTS API non-JSON error:", errorMessage);
242}
243
601// Now immediately send this message to get AI response
602try {
603// Prepare messages for the API
604const apiMessages = this.messages.map(({ role, content }) => ({ role, content }));
605
606// Ensure first message is always the correct system message for current mode
607if (apiMessages.length > 0 && apiMessages[0].role === 'system') {
608const systemMessage = this.chatMode === 'concise'
609? 'You are a helpful assistant powered by the Llama-3.3-70b-versatile model. Keep your responses short, concise and conversational. Aim for 1-3 sentences when possible.'
610: 'You are a helpful assistant powered by the Llama-3.3-70b-versatile model. Respond conversationally and accurately to the user.';
611
612apiMessages[0].content = systemMessage;
613}
614
616method: 'POST',
617headers: { 'Content-Type': 'application/json' },
618body: JSON.stringify({ messages: apiMessages })
619});
620
679this.statusMessage = 'Thinking...';
680
681// Prepare messages for the API (excluding UI-only properties)
682const apiMessages = this.messages.map(({ role, content }) => ({ role, content }));
683
684// Ensure first message is always the correct system message for current mode
685if (apiMessages.length > 0 && apiMessages[0].role === 'system') {
686const systemMessage = this.chatMode === 'concise'
687? 'You are a helpful assistant powered by the Llama-3.3-70b-versatile model. Keep your responses short, concise and conversational. Aim for 1-3 sentences when possible.'
688: 'You are a helpful assistant powered by the Llama-3.3-70b-versatile model. Respond conversationally and accurately to the user.';
689
690apiMessages[0].content = systemMessage;
691}
692
695method: 'POST',
696headers: { 'Content-Type': 'application/json' },
697body: JSON.stringify({ messages: apiMessages })
698});
699
967968<p class="text-center text-sm text-gray-600 mt-4">
969Powered by Llama-3.3-70b-versatile through Groq API. Audio transcription and speech synthesis provided by Groq. Text-to-speech provided through PlayHT. <a class="underline" href="https://console.groq.com/docs/speech-to-text" target="_blank" rel="noopener noreferrer">Documentation here</a>. <a class="underline" href="https://www.val.town/v/yawnxyz/groqAudioChat" target="_blank" rel="noopener noreferrer">Code here</a>
970</p>
971<div class="text-center text-sm text-gray-600 mt-4 w-full mx-auto">