From 3c66f6babbcbf9271ca5b1fd0954dc7aec0c9021 Mon Sep 17 00:00:00 2001 From: zach ocean Date: Tue, 19 Mar 2024 11:31:43 -0700 Subject: [PATCH 1/3] improvements --- openduck-py/openduck_py/routers/voice.py | 15 +- web/src/app/page.tsx | 214 +++++++++++++---------- 2 files changed, 129 insertions(+), 100 deletions(-) diff --git a/openduck-py/openduck_py/routers/voice.py b/openduck-py/openduck_py/routers/voice.py index 4545905..d43a99d 100644 --- a/openduck-py/openduck_py/routers/voice.py +++ b/openduck-py/openduck_py/routers/voice.py @@ -285,10 +285,17 @@ async def start_response( messages = chat.history_json["messages"] messages.append(new_message) - response = await acompletion( - CHAT_MODEL, messages, temperature=0.3, stream=True - ) - + # NOTE(zach): retries + response = None + for _ in range(3): + try: + response = await acompletion( + CHAT_MODEL, messages, temperature=0.3, stream=True + ) + except Exception: + raise + else: + break complete_sentence = "" full_response = "" async for chunk in response: diff --git a/web/src/app/page.tsx b/web/src/app/page.tsx index 7a93bfe..5f3521c 100644 --- a/web/src/app/page.tsx +++ b/web/src/app/page.tsx @@ -71,11 +71,15 @@ function Tile({ isScreenShare, isLocal = false, isAlone, + toggleMic, + micOn, }: { id: string; isScreenShare?: boolean; isLocal?: boolean; isAlone?: boolean; + toggleMic?: () => void; + micOn?: boolean; }) { const videoState = useVideoTrack(id); @@ -93,14 +97,77 @@ function Tile({ containerCssClasses += " bg-gray-300"; } + let micIconClasses = "absolute bottom-4 right-4 "; + micIconClasses += micOn ? "text-green-500" : "text-red-500"; + return ( -
-
+
+
{!isScreenShare && } + {isLocal && ( + + {micOn ? ( + + + + ) : ( + + + + )} + + )}
); } +function Spinner() { + return ( + + + + + ); +} interface ButtonProps extends React.ButtonHTMLAttributes { variant: "success" | "danger" | "primary" | "secondary"; @@ -144,8 +211,11 @@ function Button({ variant, children, ...rest }: ButtonProps) { ); } -function Call() { +function Call({ toggleMic, micOn }: { toggleMic: () => void; micOn: boolean }) { const [getUserMediaError, setGetUserMediaError] = useState(false); + const meetingState = useMeetingState(); + + console.log("Meeting State: ", meetingState); useDailyEvent( "camera-error", @@ -162,16 +232,25 @@ function Call() { const renderCallScreen = () => (
- {localSessionId && } + {localSessionId && ( + + )} {remoteParticipantIds.map((id) => ( ))} {screens.map((screen) => ( ))} - {isAlone && ( -
+ {isAlone && meetingState === "joined-meeting" && ( +

Waiting for others

+
)}
@@ -184,9 +263,6 @@ const AudioCall = ({ callObject }: { callObject: DailyCall | null }) => { const [roomUrl, setRoomUrl] = useState(""); const [joinedRoom, setJoinedRoom] = useState(false); const [micOn, setMicOn] = useState(true); - const meetingState = useMeetingState(); - - console.log("meeting state", meetingState); const toggleMic = () => { callObject?.setLocalAudio(!callObject?.localAudio()); @@ -198,104 +274,50 @@ const AudioCall = ({ callObject }: { callObject: DailyCall | null }) => { setJoinedRoom(false); }, [callObject]); - const joinCall = useCallback( - (userName: string) => { - console.log("[DAILY] Joining room", roomUrl); - callObject?.join({ url: roomUrl, userName }); - setJoinedRoom(true); - }, - [callObject, roomUrl] - ); - - const startHairCheck = useCallback( - async (url: string) => { - if (!url) return; - if (!callObject) { - console.log("No call object"); - return; - } - await callObject.preAuth({ url }); - await callObject.startCamera(); - }, - [callObject] - ); - - const createRoom = useCallback(async () => { - console.log("creatre rom"); - try { - const response = await fetch(`${apiHost}/audio/start`, { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - }); - const room = await response.json(); - if (room.url) { - console.log("Room created:", room.url); - setRoomUrl(room.url); - } else { - console.error("Failed to create room"); + const handleOrbClick = useCallback(async () => { + if (joinedRoom) { + leaveCall(); + } else { + try { + const response = await fetch(`${apiHost}/audio/start`, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + }); + const room = await response.json(); + if (room.url) { + console.log("Room created and joining:", room.url); + setRoomUrl(room.url); + callObject?.join({ url: room.url, userName: "User" }); + setJoinedRoom(true); + } else { + console.error("Failed to create room"); + } + } catch (error) { + console.error("Error creating room:", error); } - } catch (error) { - console.error("Error creating room:", error); } - }, []); - - useEffect(() => { - startHairCheck(roomUrl); - }, []); + }, [callObject, roomUrl]); return ( -
- setRoomUrl(e.target.value)} - placeholder="Enter room URL" - /> -
- - {joinedRoom ? ( - - ) : ( - - )} - +
+
e.currentTarget.classList.add("hover:shadow-xl")} + onMouseOut={(e) => e.currentTarget.classList.remove("hover:shadow-xl")} + > + {joinedRoom ? "Leave Room" : "Create & Join Room"}
+ {roomUrl && false &&
Room URL: {roomUrl}
}
- +
); }; - export default function Home() { const callObject = useCallObject({}); return ( From 64b8351b51c054fa0a0a5781b36f7c98c1628983 Mon Sep 17 00:00:00 2001 From: zach ocean Date: Tue, 19 Mar 2024 11:56:29 -0700 Subject: [PATCH 2/3] make it better --- web/src/app/page.tsx | 60 +++++++++++++++----------------------------- 1 file changed, 20 insertions(+), 40 deletions(-) diff --git a/web/src/app/page.tsx b/web/src/app/page.tsx index 5f3521c..18109cd 100644 --- a/web/src/app/page.tsx +++ b/web/src/app/page.tsx @@ -83,67 +83,47 @@ function Tile({ }) { const videoState = useVideoTrack(id); - let containerCssClasses = "rounded-lg overflow-hidden shadow-lg m-2 "; + let containerCssClasses = + "rounded-lg overflow-hidden shadow-lg m-2 border-2 "; containerCssClasses += isScreenShare ? "bg-blue-100" : "bg-gray-100"; if (isLocal) { - containerCssClasses += " border-2 border-green-500"; + containerCssClasses += " border-green-500 "; if (isAlone) { containerCssClasses += " opacity-50"; } + } else { + containerCssClasses += " border-gray-300 "; } if (videoState.isOff) { containerCssClasses += " bg-gray-300"; } - let micIconClasses = "absolute bottom-4 right-4 "; - micIconClasses += micOn ? "text-green-500" : "text-red-500"; + let micButtonClasses = "absolute bottom-4 right-4 px-2 py-1 "; + micButtonClasses += micOn + ? "bg-green-500 text-white" + : "bg-red-500 text-white"; return ( -
-
+
+
{!isScreenShare && } {isLocal && ( - - {micOn ? ( - - - - ) : ( - - - - )} - + )}
); } + function Spinner() { return ( Date: Tue, 19 Mar 2024 12:03:25 -0700 Subject: [PATCH 3/3] raise on last retry --- openduck-py/openduck_py/routers/voice.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/openduck-py/openduck_py/routers/voice.py b/openduck-py/openduck_py/routers/voice.py index d43a99d..9f0c302 100644 --- a/openduck-py/openduck_py/routers/voice.py +++ b/openduck-py/openduck_py/routers/voice.py @@ -287,13 +287,14 @@ async def start_response( # NOTE(zach): retries response = None - for _ in range(3): + for _retry in range(3): try: response = await acompletion( CHAT_MODEL, messages, temperature=0.3, stream=True ) except Exception: - raise + if _retry == 2: + raise else: break complete_sentence = ""