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