BBB
BBB
/usr/bin/env python3
def ensure_module(module_name):
package_name = module_to_package.get(module_name, module_name)
version = package_versions.get(package_name, None)
if version:
package_name = f"{package_name}=={version}"
try:
__import__(module_name)
except ImportError:
print(f"🚀 Installing missing package: {package_name}")
result = subprocess.run([python_exe, "-m", "pip", "install", "--no-cache-
dir", package_name], capture_output=True, text=True)
if result.returncode != 0:
print(f"❌ Failed to install {package_name}: {result.stderr}")
return False
print(f"✅ Installed {package_name}")
try:
__import__(module_name)
except ImportError:
print(f"❌ Still cannot import {module_name} after installation")
return False
return True
def can_write(path="."):
"""Test write access by creating and deleting a temp file."""
try:
test = os.path.join(path, ".perm_test")
with open(test, "w") as f:
f.write("test")
os.remove(test)
return True
except Exception:
return False
if not can_write(os.getcwd()):
sys.exit("❌ No write permission in current directory.")
def load_history():
try:
return json.load(open(HISTORY_FILE)) if os.path.exists(HISTORY_FILE) else
[]
except json.JSONDecodeError:
return [] # Return empty list if file is corrupted
def generate_video(prompt):
# Note: This may not work as expected with Hugging Face's API. Consider
replacing with a dedicated video API.
url = "https://api-inference.huggingface.co/models/damo-vilab/text-to-video-ms-
1.7b"
hdr = {"Authorization": f"Bearer {config['huggingface_api_key']}"}
try:
resp = requests.post(url, headers=hdr, json={"inputs": prompt}, timeout=60)
if resp.status_code == 200:
fn = f"vid_{datetime.datetime.now():%Y%m%d%H%M%S}.mp4"
with open(fn, "wb") as f:
f.write(resp.content)
save_history({
"type": "video",
"prompt": prompt,
"file": fn,
"timestamp": datetime.datetime.now().isoformat()
})
return fn
return f"❌ Video generation failed: {resp.status_code} - {resp.text}"
except requests.RequestException as e:
return f"❌ Video generation request failed: {e}"
def generate_music(prompt):
beatoven_api_key = config["beatoven_api_key"]
url = "https://api.beatoven.ai/v1/compose"
headers = {
"Authorization": f"Bearer {beatoven_api_key}",
"content-type": "application/json"
}
data = {
"prompt": {"text": prompt},
"format": "mp3",
"looping": False
}
try:
response = requests.post(url, headers=headers, json=data, timeout=60)
if response.status_code == 200:
task_id = response.json()["task_id"]
while True:
status_url = f"https://api.beatoven.ai/v1/tasks/{task_id}"
status_response = requests.get(status_url, headers=headers,
timeout=10)
if status_response.status_code == 200:
status = status_response.json()["status"]
if status == "composed":
track_url = status_response.json()["metadata"]["track_url"]
save_history({
"type": "music",
"prompt": prompt,
"url": track_url,
"timestamp": datetime.datetime.now().isoformat()
})
return track_url
elif status in ["composing", "running"]:
time.sleep(5)
else:
return "❌ Error: Composition failed"
else:
return f"❌ Error: Failed to get task status -
{status_response.status_code} - {status_response.text}"
return f"❌ Error: Failed to compose track - {response.status_code} -
{response.text}"
except requests.RequestException as e:
return f"❌ Music generation request failed: {e}"
def render_history():
hist = load_history()[::-1]
md = ""
for i, e in enumerate(hist, 1):
md += f"**{i}. {e['type'].capitalize()} @ {e['timestamp']}** \n"
if e["type"] == "chat":
md += f"- Model: {e['model']} \n- Prompt: {e['prompt']} \n- Response:
{e['response']}\n\n"
elif e["type"] in ("image", "video", "3d"):
md += f"- Prompt: {e['prompt']} \n- [Download]({e['file']})\n"
if e["type"] == "image":
md += f"- Inpainting: {e['inpainting']}\n\n"
elif e["type"] == "3d":
md += f"- Image Used: {e['image_used']}\n\n"
else:
md += "\n"
else:
key = "url" if "url" in e else "payload"
md += f"- {key.capitalize()}: {e[key]}\n\n"
return md