mirror of
https://github.com/HumanAIGC-Engineering/gradio-webrtc.git
synced 2026-02-05 01:49:23 +08:00
sync code of fastrtc, add text support through datachannel, fix safari connect problem support chat without camera or mic
74 lines
2.3 KiB
Python
74 lines
2.3 KiB
Python
import base64
|
|
import os
|
|
import re
|
|
from pathlib import Path
|
|
|
|
import numpy as np
|
|
import openai
|
|
from dotenv import load_dotenv
|
|
from fastrtc import (
|
|
AdditionalOutputs,
|
|
ReplyOnPause,
|
|
audio_to_bytes,
|
|
)
|
|
from groq import Groq
|
|
|
|
load_dotenv()
|
|
|
|
groq_client = Groq(api_key=os.environ.get("GROQ_API_KEY"))
|
|
|
|
client = openai.OpenAI(
|
|
api_key=os.environ.get("SAMBANOVA_API_KEY"),
|
|
base_url="https://api.sambanova.ai/v1",
|
|
)
|
|
|
|
path = Path(__file__).parent / "assets"
|
|
|
|
spinner_html = open(path / "spinner.html").read()
|
|
|
|
|
|
system_prompt = "You are an AI coding assistant. Your task is to write single-file HTML applications based on a user's request. Only return the necessary code. Include all necessary imports and styles. You may also be asked to edit your original response."
|
|
user_prompt = "Please write a single-file HTML application to fulfill the following request.\nThe message:{user_message}\nCurrent code you have written:{code}"
|
|
|
|
|
|
def extract_html_content(text):
|
|
"""
|
|
Extract content including HTML tags.
|
|
"""
|
|
match = re.search(r"<!DOCTYPE html>.*?</html>", text, re.DOTALL)
|
|
return match.group(0) if match else None
|
|
|
|
|
|
def display_in_sandbox(code):
|
|
encoded_html = base64.b64encode(code.encode("utf-8")).decode("utf-8")
|
|
data_uri = f"data:text/html;charset=utf-8;base64,{encoded_html}"
|
|
return f'<iframe src="{data_uri}" width="100%" height="600px"></iframe>'
|
|
|
|
|
|
def generate(user_message: tuple[int, np.ndarray], history: list[dict], code: str):
|
|
yield AdditionalOutputs(history, spinner_html)
|
|
|
|
text = groq_client.audio.transcriptions.create(
|
|
file=("audio-file.mp3", audio_to_bytes(user_message)),
|
|
model="whisper-large-v3-turbo",
|
|
response_format="verbose_json",
|
|
).text
|
|
|
|
user_msg_formatted = user_prompt.format(user_message=text, code=code)
|
|
history.append({"role": "user", "content": user_msg_formatted})
|
|
|
|
response = client.chat.completions.create(
|
|
model="Meta-Llama-3.1-70B-Instruct",
|
|
messages=history, # type: ignore
|
|
temperature=0.1,
|
|
top_p=0.1,
|
|
)
|
|
|
|
output = response.choices[0].message.content
|
|
html_code = extract_html_content(output)
|
|
history.append({"role": "assistant", "content": output})
|
|
yield AdditionalOutputs(history, html_code)
|
|
|
|
|
|
CodeHandler = ReplyOnPause(generate) # type: ignore
|