Skip to content

update #540

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 68 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
40642e8
Update package.json
mrgizmo212 Oct 12, 2024
b001d54
Update ConsolePage.tsx
mrgizmo212 Oct 12, 2024
6ade1ee
Create server.mjs
mrgizmo212 Oct 12, 2024
d7c2666
Update package.json
mrgizmo212 Oct 12, 2024
b693ba2
Update server.mjs
mrgizmo212 Oct 12, 2024
ecd4e1f
Update ConsolePage.tsx
mrgizmo212 Oct 12, 2024
4fd06d3
Update server.mjs
mrgizmo212 Oct 12, 2024
cb0b0fa
Update server.mjs
mrgizmo212 Oct 12, 2024
0a20d74
Create wattApi.ts
mrgizmo212 Oct 12, 2024
81ef2e5
Update server.mjs
mrgizmo212 Oct 12, 2024
5980802
Update server.mjs
mrgizmo212 Oct 12, 2024
6fa2791
Update ConsolePage.tsx
mrgizmo212 Oct 12, 2024
1db3cfd
Update ConsolePage.tsx
mrgizmo212 Oct 12, 2024
ee0fd23
Update server.mjs
mrgizmo212 Oct 12, 2024
5455b45
Update ConsolePage.tsx
mrgizmo212 Oct 12, 2024
09285e3
Update server.mjs
mrgizmo212 Oct 12, 2024
edf7106
Update ConsolePage.tsx
mrgizmo212 Oct 12, 2024
aa5b3f1
Update server.mjs
mrgizmo212 Oct 12, 2024
b72d76f
Update ConsolePage.tsx
mrgizmo212 Oct 12, 2024
2f44337
Update ConsolePage.tsx
mrgizmo212 Oct 12, 2024
e269b80
Update ConsolePage.tsx
mrgizmo212 Oct 12, 2024
280f82a
Update ConsolePage.tsx
mrgizmo212 Oct 12, 2024
b796e23
Update ConsolePage.tsx
mrgizmo212 Oct 12, 2024
dedba86
Update package.json
mrgizmo212 Oct 12, 2024
3090802
Update ConsolePage.tsx
mrgizmo212 Oct 12, 2024
78b8c35
Add files via upload
mrgizmo212 Oct 12, 2024
50fbcc3
Update index.html
mrgizmo212 Oct 13, 2024
6d54367
Add files via upload
mrgizmo212 Oct 13, 2024
b128418
Update ConsolePage.tsx
mrgizmo212 Oct 13, 2024
f59a2ed
Update ConsolePage.scss
mrgizmo212 Oct 13, 2024
bbce7c5
Update index.css
mrgizmo212 Oct 13, 2024
057fd23
Create ThemeContext.tsx
mrgizmo212 Oct 13, 2024
e67c2af
Update App.scss
mrgizmo212 Oct 13, 2024
fc10b32
Update ConsolePage.scss
mrgizmo212 Oct 13, 2024
71076fa
Update App.scss
mrgizmo212 Oct 13, 2024
c017965
Update App.tsx
mrgizmo212 Oct 13, 2024
b61a784
Update ConsolePage.scss
mrgizmo212 Oct 13, 2024
2b214a7
Update ConsolePage.tsx
mrgizmo212 Oct 13, 2024
2e42ac5
Update ConsolePage.tsx
mrgizmo212 Oct 13, 2024
50b954d
Update tsconfig.json
mrgizmo212 Oct 13, 2024
d82d063
Update package.json
mrgizmo212 Oct 13, 2024
9761c57
Update package.json
mrgizmo212 Oct 13, 2024
fed4df0
Update conversation_config.js
mrgizmo212 Oct 13, 2024
530b94f
Update conversation_config.js
mrgizmo212 Oct 13, 2024
c649682
Create ThreeJsVisualization.tsx
mrgizmo212 Oct 13, 2024
5b4f028
Update package.json
mrgizmo212 Oct 13, 2024
4ac2fc6
Update ConsolePage.tsx
mrgizmo212 Oct 13, 2024
7ffa373
Update ConsolePage.tsx
mrgizmo212 Oct 13, 2024
136e79c
Update ConsolePage.tsx
mrgizmo212 Oct 13, 2024
5065a8f
Update ConsolePage.tsx
mrgizmo212 Oct 13, 2024
df73961
Update ConsolePage.tsx
mrgizmo212 Oct 13, 2024
b310cd7
Update ConsolePage.tsx
mrgizmo212 Oct 13, 2024
94f30f7
Merge branch 'openai:main' into main
mrgizmo212 Oct 26, 2024
30de49b
Update conversation_config.js
mrgizmo212 Nov 10, 2024
46aaabf
Update conversation_config.js
mrgizmo212 Nov 30, 2024
2639011
Update conversation_config.js
mrgizmo212 Nov 30, 2024
8e542f8
Update conversation_config.js
mrgizmo212 Nov 30, 2024
5fd3f17
Update conversation_config.js
mrgizmo212 Nov 30, 2024
3647978
Update ConsolePage.tsx
mrgizmo212 Nov 30, 2024
51d205a
Update ConsolePage.tsx
mrgizmo212 Nov 30, 2024
77b8e97
Update conversation_config.js
mrgizmo212 Dec 10, 2024
44b64e0
Update ConsolePage.tsx
mrgizmo212 Dec 10, 2024
d9b07ff
Update conversation_config.js
mrgizmo212 Dec 10, 2024
95b22cc
Update conversation_config.js
mrgizmo212 Dec 10, 2024
df01dfe
Update ConsolePage.tsx
mrgizmo212 Dec 10, 2024
eb203f3
Update ConsolePage.tsx
mrgizmo212 Dec 10, 2024
89f12fb
Update conversation_config.js
mrgizmo212 Dec 10, 2024
9614a36
Update ConsolePage.tsx
mrgizmo212 Dec 10, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 12 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,10 @@
"@types/node": "^16.18.108",
"@types/react": "^18.3.5",
"@types/react-dom": "^18.3.0",
"axios": "^1.7.7",
"cors": "^2.8.5",
"dotenv": "^16.4.5",
"express": "^4.21.1",
"leaflet": "^1.9.4",
"react": "^18.3.1",
"react-dom": "^18.3.1",
Expand All @@ -24,15 +27,19 @@
"save": "^2.9.0",
"typescript": "^4.9.5",
"web-vitals": "^2.1.4",
"ws": "^8.18.0"
"node-fetch": "^3.2.0",
"ws": "^8.18.0",
"three": "^0.160.0",
"@types/three": "^0.160.0"
},
"scripts": {
"start": "react-scripts start",
"start": "node server.mjs",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject",
"zip": "zip -r realtime-api-console.zip . -x 'node_modules' 'node_modules/*' 'node_modules/**' '.git' '.git/*' '.git/**' '.DS_Store' '*/.DS_Store' 'package-lock.json' '*.zip' '*.tar.gz' '*.tar' '.env'",
"relay": "nodemon ./relay-server/index.js"
"server": "node server.mjs",
"dev": "concurrently \"react-scripts start\" \"nodemon server.mjs\"",
"deploy": "npm run build && npm start"
},
"eslintConfig": {
"extends": [
Expand All @@ -54,6 +61,7 @@
},
"devDependencies": {
"@babel/plugin-proposal-private-property-in-object": "^7.21.11",
"concurrently": "^9.0.1",
"nodemon": "^3.1.7"
}
}
4 changes: 3 additions & 1 deletion public/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
<meta charset="utf-8" />
<link rel="icon" href="%PUBLIC_URL%/openai-logomark.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>realtime console</title>
<meta name="robots" content="noindex, nofollow" />
<meta name="googlebot" content="noindex">
<title>TTG AI - Realtime Console (PRIVATE ALPHA)</title>
<!-- Fonts -->
<link
href="https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,100..700;1,100..700&display=swap"
Expand Down
92 changes: 92 additions & 0 deletions server.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
import express from 'express';
import cors from 'cors';
import dotenv from 'dotenv';
import path from 'path';
import { fileURLToPath } from 'url';
import fetch from 'node-fetch';

dotenv.config();

const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

const app = express();
const port = process.env.PORT || 3001;

app.use(cors());
app.use(express.json());

// Serve static files from the React app
app.use(express.static(path.join(__dirname, 'build')));

// Perplexity AI search API endpoint
app.post('/api/perplexity-search', async (req, res) => {
try {
const { query } = req.body;
console.log('Searching with Perplexity for:', query);
console.log('API Key available:', !!process.env.PERPLEXITY_API_KEY);

if (!process.env.PERPLEXITY_API_KEY) {
throw new Error('PERPLEXITY_API_KEY is not set');
}

const options = {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.PERPLEXITY_API_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
model: "llama-3.1-sonar-large-128k-online",
messages: [
{ role: "system", content: "Be precise and concise." },
{ role: "user", content: query }
],
temperature: 0.2,
top_p: 0.9,
return_citations: true,
search_domain_filter: ["perplexity.ai"],
return_images: false,
return_related_questions: false,
search_recency_filter: "month",
frequency_penalty: 1
})
};

const response = await fetch('https://api.perplexity.ai/chat/completions', options);
const data = await response.json();

console.log('Perplexity API Response Status:', response.status);
res.json(data);
} catch (error) {
console.error('Error performing Perplexity search:', error.message);
if (error.response) {
console.error('API Response:', error.response.status, error.response.data);
}

// Fallback to mock response
console.log('Returning mock response');
res.json({
mock: true,
query: req.body.query,
choices: [
{
message: {
content: "This is a mock result for: " + req.body.query
}
}
]
});
}
});

// The "catchall" handler: for any request that doesn't match one above, send back React's index.html file.
app.get('*', (req, res) => {
res.sendFile(path.join(__dirname, 'build', 'index.html'));
});

app.listen(port, '0.0.0.0', () => {
console.log(`Server running on http://0.0.0.0:${port}`);
console.log('Environment:', process.env.NODE_ENV);
console.log('Perplexity API Key set:', !!process.env.PERPLEXITY_API_KEY);
});
75 changes: 75 additions & 0 deletions src/App.scss
Original file line number Diff line number Diff line change
@@ -1,5 +1,80 @@
:root {
--bg-color: #ffffff;
--text-color: #333333;
--primary-color: #007bff;
--secondary-color: #6c757d;
--border-color: #dee2e6;
--assistant-color: #009900;
--error-color: #990000;
}

[data-theme='dark'] {
--bg-color: #1a1a1a;
--text-color: #f0f0f0;
--primary-color: #4da3ff;
--secondary-color: #a1a1a1;
--border-color: #444444;
--assistant-color: #00cc00;
--error-color: #ff3333;
}

body {
background-color: var(--bg-color);
color: var(--text-color);
transition: background-color 0.3s ease, color 0.3s ease;
}

[data-component='App'] {
height: 100%;
width: 100%;
position: relative;
}

.theme-toggle {
position: fixed;
top: 20px;
right: 20px;
background: var(--primary-color);
color: var(--bg-color);
border: none;
border-radius: 50%;
width: 40px;
height: 40px;
font-size: 20px;
cursor: pointer;
transition: background-color 0.3s ease;
z-index: 1000;

&:hover {
background: var(--secondary-color);
}
}

// Add these general styles to be used across components
button {
background-color: var(--primary-color);
color: var(--bg-color);
border: none;
padding: 10px 20px;
border-radius: 5px;
cursor: pointer;
transition: background-color 0.3s ease;

&:hover {
background-color: var(--secondary-color);
}
}

input, textarea {
background-color: var(--bg-color);
color: var(--text-color);
border: 1px solid var(--border-color);
padding: 10px;
border-radius: 5px;
transition: border-color 0.3s ease;

&:focus {
border-color: var(--primary-color);
outline: none;
}
}
22 changes: 21 additions & 1 deletion src/App.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,32 @@
import React from 'react';
import { ConsolePage } from './pages/ConsolePage';
import { ThemeProvider, useTheme } from './ThemeContext';
import './App.scss';

function App() {
const ThemeToggle: React.FC = () => {
const { theme, toggleTheme } = useTheme();
return (
<button onClick={toggleTheme} className="theme-toggle">
{theme === 'light' ? '🌙' : '☀️'}
</button>
);
};

const AppContent: React.FC = () => {
return (
<div data-component="App">
<ThemeToggle />
<ConsolePage />
</div>
);
};

function App() {
return (
<ThemeProvider>
<AppContent />
</ThemeProvider>
);
}

export default App;
36 changes: 36 additions & 0 deletions src/ThemeContext.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import React, { createContext, useState, useContext, useEffect } from 'react';

type Theme = 'light' | 'dark';

interface ThemeContextType {
theme: Theme;
toggleTheme: () => void;
}

const ThemeContext = createContext<ThemeContextType | undefined>(undefined);

export const ThemeProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {
const [theme, setTheme] = useState<Theme>('light');

const toggleTheme = () => {
setTheme((prevTheme) => (prevTheme === 'light' ? 'dark' : 'light'));
};

useEffect(() => {
document.body.setAttribute('data-theme', theme);
}, [theme]);

return (
<ThemeContext.Provider value={{ theme, toggleTheme }}>
{children}
</ThemeContext.Provider>
);
};

export const useTheme = () => {
const context = useContext(ThemeContext);
if (context === undefined) {
throw new Error('useTheme must be used within a ThemeProvider');
}
return context;
};
63 changes: 63 additions & 0 deletions src/components/ThreeJsVisualization.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import React, { useRef, useEffect } from 'react';
import * as THREE from 'three';

interface ThreeJsVisualizationProps {
aiSpeechData: string;
}

const ThreeJsVisualization: React.FC<ThreeJsVisualizationProps> = ({ aiSpeechData }) => {
const mountRef = useRef<HTMLDivElement>(null);

useEffect(() => {
if (!mountRef.current) return;

// Set up scene
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
mountRef.current.appendChild(renderer.domElement);

// Create a simple cube
const geometry = new THREE.BoxGeometry();
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);

camera.position.z = 5;

// Animation function
const animate = () => {
requestAnimationFrame(animate);

// Rotate the cube based on the length of aiSpeechData
cube.rotation.x += 0.01 * aiSpeechData.length;
cube.rotation.y += 0.01 * aiSpeechData.length;

renderer.render(scene, camera);
};

animate();

// Handle window resize
const handleResize = () => {
const width = window.innerWidth;
const height = window.innerHeight;
renderer.setSize(width, height);
camera.aspect = width / height;
camera.updateProjectionMatrix();
};

window.addEventListener('resize', handleResize);

// Cleanup function
return () => {
window.removeEventListener('resize', handleResize);
mountRef.current?.removeChild(renderer.domElement);
};
}, [aiSpeechData]); // Re-run effect when aiSpeechData changes

return <div ref={mountRef} style={{ width: '100%', height: '100%' }} />;
};

export default ThreeJsVisualization;
Loading