python+html+Agnesai的api实现免费文本图片视频生成编辑无线画布画板代码
代码语言:python
所属分类:其他
代码描述:python+html+Agnesai的api实现免费文本图片视频生成编辑无线画布画板代码,注册一个免费的Agnesai的apikey就能免费文本聊天、文生图、多图参考编辑、多图参考生视频、文生视频等功能,无线画板连线。
代码标签: python html Agnesai api 免费 文本 图片 视频 生成 编辑 无线 画布 画板
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
#apikey申请地址;https://platform.agnes-ai.com/settings/apiKeys
import os
import time
import requests
from typing import List, Optional, Dict, Any
from fastapi import FastAPI, HTTPException, Body
from fastapi.responses import HTMLResponse
from pydantic import BaseModel
# 初始化 FastAPI 应用实例
app = FastAPI(title="Agnes-AI Infinite Canvas")
# 从环境变量中读取 API Key
DEFAULT_API_KEY = os.environ.get("AGNES_API_KEY", "")
BASE_URL = "https://apihub.agnes-ai.com"
# --- API 请求数据结构 ---
class ChatRequest(BaseModel):
messages: List[Dict[str, str]]
model: str = "agnes-2.0-flash"
api_key: Optional[str] = None
class ImageGenRequest(BaseModel):
prompt: str
model: str = "agnes-image-2.1-flash"
size: str = "1024x768"
images: Optional[List[str]] = None
api_key: Optional[str] = None
class VideoGenRequest(BaseModel):
prompt: str
model: str = "agnes-video-v2.0"
image: Optional[str] = None
images: Optional[List[str]] = None
mode: Optional[str] = None
num_frames: int = 121
frame_rate: int = 24
height: Optional[int] = None
width: Optional[int] = None
api_key: Optional[str] = None
# --- 认证头部配置 ---
def get_auth_headers(api_key: Optional[str]) -> dict:
key = api_key if (api_key and api_key.strip()) else DEFAULT_API_KEY
if not key:
raise HTTPException(
status_code=400,
detail="API Key 未配置。请在页面顶部配置 AGNES_API_KEY。",
)
return {"Authorization": f"Bearer {key}", "Content-Type": "application/json"}
# --- API 路由接口 ---
@app.post("/api/chat")
def api_chat(payload: ChatRequest):
headers = get_auth_headers(payload.api_key)
url = f"{BASE_URL}/v1/chat/completions"
body = {
"model": payload.model,
"messages": payload.messages,
"stream": False,
}
try:
response = requests.post(url, headers=headers, json=body, timeout=60)
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
detail = (
e.response.json().get("error", {}).get("message", str(e))
if e.response
else str(e)
)
raise HTTPException(status_code=500, detail=detail)
@app.post("/api/image")
def api_image(payload: ImageGenRequest):
headers = get_auth_headers(payload.api_key)
url = f"{BASE_URL}/v1/images/generations"
body = {"model": payload.model, "prompt": payload.prompt, "size": payload.size}
if payload.images:
body["extra_body"] = {"image": payload.images, "response_format": "url"}
try:
response = requests.post(url, headers=headers, json=body, timeout=60)
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
detail = (
e.response.json().get("error", {}).get("message", str(e))
if e.response
else str(e)
)
raise HTTPException(status_code=500, detail=detail)
@app.post("/api/video/create")
def api_video_create(payload: VideoGenRequest):
headers = get_auth_headers(payload.api_key)
url = f"{BASE_URL}/v1/videos"
body = {
"model": payload.model,
"prompt": payload.prompt,
"num_frames": payload.num_frames,
"frame_rate": payload.frame_rate,
}
if payload.image:
body["image"] = payload.image
if payload.images:
extra_body = {"image": payload.images}
if payload.mode:
extra_body["mode"] = payload.mode
body["extra_body"] = extra_body
if payload.height and payload.width:
body["height"] = payload.height
body["width"] = payload.width
try:
response = requests.post(url, headers=headers, json=body, timeout=60)
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
detail = (
e.response.json().get("error", {}).get("message", str(e))
if e.response
else str(e)
)
raise HTTPException(status_code=500, detail=detail)
@app.get("/api/video/status/{task_id}")
def api_video_status(task_id: str, api_key: Optional[str] = None):
headers = get_auth_headers(api_key)
url = f"{BASE_URL}/v1/videos/{task_id}"
try:
response = requests.get(url, headers=headers, timeout=20)
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
detail = (
e.response.json().get("error", {}).get("message", str(e))
if e.response
else str(e)
)
raise HTTPException(status_code=500, detail=detail)
# --- UI 主页面路由 ---
@app.get("/", response_class=HTMLResponse)
def index():
html_content = """
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Agnes-AI 无限画布系统</title>
<!-- Tailwind CSS -->
<script src="https://cdn.tailwindcss.com"></script>
<!-- 图标 CDN -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<!-- Vue 3 核心库 -->
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<style>
/* 网格背景样式 */
.canvas-bg {
background-color: #0f172a;
background-image:
radial-gradient(circle, rgba(255,255,255,0.07) 1px, transparent 1px);
background-size: 24px 24px;
}
.no-select {
user-select: none;
-webkit-user-select: none;
}
::-webkit-scrollbar {
width: 6px;
height: 6px;
}
::-webkit-scrollbar-track {
background: #1e293b;
}
::-webkit-scrollbar-thumb {
background: #475569;
border-radius: 3px;
}
</style>
</head>
<body class="bg-slate-900 text-slate-100 min-h-screen o.........完整代码请登录后点击上方下载按钮下载查看














网友评论0