python+openai兼容api+html实现类似Clawdbot(MoltBot)的ai自主分析任务编写代码运行完成任务代码

代码语言:python

所属分类:其他

代码描述:python+openai兼容api+html实现类似Clawdbot(MoltBot)的ai自主分析任务编写代码运行完成任务代码,ai的编程能力大幅提升后,任何的任务都可以通过编程来完成,那么ai可以操作本地来完成用户的任务,包括电脑设置,文档处理,视频剪辑等等。可以接入ollama本地模型,也可以接入第三方兼容openai的其他大模型api。

代码标签: python openai 兼容 html api 类似 Clawdbot MoltBot 对话

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

#!/usr/local/python3/bin/python3
# -*- coding: utf-8 -*
import os
import sys
import json
import asyncio
import platform
import re
import datetime
import shutil
import time
import uuid
from typing import List, Dict, Any, Optional

# Web 框架依赖
from fastapi import FastAPI, WebSocket, WebSocketDisconnect, UploadFile, File, Request, Depends, HTTPException
from fastapi.responses import HTMLResponse, RedirectResponse, JSONResponse
from fastapi.staticfiles import StaticFiles

# AI 依赖
from openai import OpenAI
# Playwright 依赖
from playwright.async_api import async_playwright
# ================= 配置区域 =================
PLANNER_CONFIG = {
    "api_key": "sk-",  # 请替换你的 Key
    "base_url": "https://dashscope.aliyuncs.com/compatible-mode/v1",
    "model": "qwen-max"
}

CODER_CONFIG = {
    "api_key": "sk-",  # 请替换你的 Key
    "base_url": "https://dashscope.aliyuncs.com/compatible-mode/v1",
    "model": "qwen3-coder-flash" # 建议用 coder 模型
}
# 登录认证配置
AUTH_CONFIG = {
    "username": "admin",
    "password": "bfwbot2025", 
    "cookie_name": "bfwbot_session",
    "cookie_value": "authorized_token_xyz"
}

# 目录配置
WORKSPACE_DIR = os.path.join(os.getcwd(), "workspace")
UPLOAD_DIR = os.path.join(os.getcwd(), "uploads")

os.makedirs(WORKSPACE_DIR, exist_ok=True)
os.makedirs(UPLOAD_DIR, exist_ok=True)

# ================= 数据存储 (内存数据库) =================
CHAT_SESSIONS: Dict[str, Dict[str, Any]] = {}

def save_log_to_session(session_id: str, log_entry: dict):
    if session_id not in CHAT_SESSIONS:
        CHAT_SESSIONS[session_id] = {
            "title": "新会话", 
            "timestamp": time.time(), 
            "logs": []
        }
    
    # 如果是消息类型,且当前标题是默认值,尝试更新标题
    if log_entry.get("type") == "message" and log_entry.get("content"):
        current_title = CHAT_SESSIONS[session_id]["title"]
        if current_title == "新会话" or current_title == "无标题会话":
            # 截取前20个字符作为标题
            title = log_entry.get("content", "")[:20]
            if not title and log_entry.get("attachments"):
                title = "文件上传会话"
            elif not title:
                title = "无标题会话"
            CHAT_SESSIONS[session_id]["title"] = title

    CHAT_SESSIONS[session_id]["logs"].append(log_entry)
    CHAT_SESSIONS[session_id]["timestamp"] = time.time()

# ================= 1. 环境感知模块 =================
class SystemEnvironment:
    @staticmethod
    def get_info() -> str:
        base_url = "http://localhost:8000"
        return (
            f"操作系统: {platform.system()} {platform.release()} ({platform.machine()})\n"
            f"Python版本: {sys.version.split()[0]}\n"
            f"文件系统与URL映射规则 (非常重要):\n"
            f"1. 本地目录 '{WORKSPACE_DIR}' -> Web路径 '{base_url}/download/'\n"
            f"2. 本地目录 '{UPLOAD_DIR}'    -> Web路径 '{base_url}/uploads/'\n"
        )

# ================= 2. 搜索智能体 (截图版) =================
class SearchAgent:
    def __init__(self, send_log_func):
        self.send_log = send_log_func

    async def run(self, query: str) -> str:
        await self.send_log("browser", f"正在启动 Playwright 浏览器以搜索: {query}...")
        results = []
        try:
            async with async_playwright() as p:
                browser = await p.chromium.launch(headless=True)
                context = await browser.new_context(
                    viewport={'width': 1280, 'height': 800},
                    user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
                )
                page = await context.new_page()
                
                search_url = f"https://www.bing.com/search?q={query}"
                await page.goto(search_url, timeout=20000)
                await page.wait_for_load_state("networkidle")
                
                timestamp = int(time.time())
                screenshot_filename = f"screenshot_{timestamp}.png"
                screenshot_path = os.path.join(UPLOAD_DIR, screenshot_filename)
                await page.screenshot(path=screenshot_path)
                
                screenshot_url = f"/uploads/{screenshot_filename}"
                await self.send_log("browser_snapshot", screenshot_url)

                elements = await page.locator("li.b_algo").all()
                await self.send_log("browser", f"页面加载完成,提取到 {len(elements)} 条结果,正在解析...")

                for i, el in enumerate(elements[:4]):
                    try:
                        title = await el.locator("h2").inner_text()
                        link_el = el.locator("a").first
                        url = await link_el.get_attribute("href")
                        snippet_el = el.locator("p")
                        if await snippet_el.count() == 0:
                            snippet_el = el.locator(".b_caption")
                        snippet = await snippet_el.inner_text() if await snippet_el.count() > 0 else "无摘要"
                        results.append({"title": title, "url": url, "snippet": snippet})
                    except: continue

                await browser.close()
        except Exception as e:
            await self.send_log("error", f"Playwright 浏览器出错: {e}")
            return f"浏览器搜索失败: {e}"

        if not results: return "未找到搜索结果。"
        formatted_res = f"【搜索结果 - {query}】\n"
        for i, item in enumerate(results):
 .........完整代码请登录后点击上方下载按钮下载查看

网友评论0