python+qwen3-coder+vue实现类似solo对话生成需求文档和完整前后端项目源码的ai助手代码

代码语言:python

所属分类:人工智能

代码描述:python+qwen3-coder+vue实现类似solo对话生成需求文档和完整前后端项目源码的ai助手代码,左侧通过聊天告诉ai需求,ai生成一个需求文档让你确认,不满意可修改,修改完整后,ai直接生成完整的前后端项目源代码目录,你可以查看或运行,不满意继续聊天对话让ai修改,可接入兼容openai的所有的ai大模型,我接入了的qwen3-coder,生成的项目源码还可以。

代码标签: python qwen3 coder vue 类似 solo 对话 生成 需求 文档 完整

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

#!/usr/local/python3/bin/python3
# -*- coding: utf-8 -*
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os
import json
import re
import sys
from pathlib import Path
from typing import List, Dict

# 检查并安装必要的库
try:
    import openai
    import uvicorn
    from fastapi import FastAPI, HTTPException
    from fastapi.responses import HTMLResponse
    from pydantic import BaseModel
except ImportError:
    print("错误: 缺少必要的库。请运行: pip install 'fastapi[all]' openai uvicorn python-multipart", file=sys.stderr)
    sys.exit(1)

# --- OpenAI API 配置 ---
try:
    openai_client = openai.Client(
      api_key=os.environ.get("OPENAI_API_KEY", "sk-"),
      base_url=os.environ.get("OPENAI_BASE_URL", "https://dashscope.aliyuncs.com/compatible-mode/v1"),
    )
    openai_client.models.list()
    print("OpenAI 客户端初始化成功。")
except openai.AuthenticationError:
    print("错误: OpenAI API 密钥无效或未设置。请设置 OPENAI_API_KEY 环境变量。", file=sys.stderr)
    sys.exit(1)
except Exception as e:
    print(f"OpenAI 客户端初始化失败: {e}", file=sys.stderr)
    sys.exit(1)

# --- FastAPI 应用定义 ---
app = FastAPI()
BASE_PROJECT_DIR = Path("ai_projects").resolve()
BASE_PROJECT_DIR.mkdir(exist_ok=True)

class CodeAssistant:
    def __init__(self, project_name: str):
        if not project_name or ".." in project_name or "/" in project_name:
            raise ValueError("无效的项目名称")
        self.project_dir = (BASE_PROJECT_DIR / project_name).resolve()
        self.project_dir.mkdir(parents=True, exist_ok=True)
        self.decision_model = 'qwen-max'
        self.generation_model = 'qwen-coder-plus'

    def _get_file_context(self) -> str:
        context = []
        ignore_dirs = {".history", ".versions", "__pycache__"}
        for file_path in self.project_dir.rglob("*"):
            if any(d in file_path.parts for d in ignore_dirs):
                continue
            if file_path.is_file():
                try:
                    relative_path = file_path.relative_to(self.project_dir)
                    with open(file_path, 'r', encoding='utf-8', errors='ignore') as f:
                        content = f.read()
                        context.append(f"File: {relative_path}\n```\n{content}\n```\n")
                except Exception as e:
                    print(f"读取文件 {file_path} 时出错: {e}", file=sys.stderr)
        return "\n".join(context)

    def _save_files(self, files: List[Dict[str, str]]):
        for file_info in files:
            file_path = self.project_dir / file_info['name']
            action = file_info.get('action', 'unknown').lower()
            
            if action == "del":
                if file_path.exists():
                    file_path.unlink()
                continue

            file_path.parent.mkdir(parents=True, exist_ok=True)
            with open(file_path, 'w', encoding='utf-8') as f:
                f.write(file_info['content'])
    
    def _parse_ai_response(self, response_text: str) -> List[Dict[str, str]]:
        markdown_code_blocks = re.findall(r"```([^\n]+)\n([\s\S]+?)```", response_text)
        code_blocks = []
        for file_header, code_text in markdown_code_blocks:
            if '--' in file_header:
                action, path = file_header.split('--', 1)
                code_blocks.append({"action": action.strip().lower(), "name": path.strip(), "content": code_text.strip()})
        return code_blocks

    def generate_requirements(self, prompt: str) -> str:
        system_prompt = """你是一个顶级的项目经理。根据用户的初步想法,生成一份详细、清晰、结构化的项目需求文档。
- 使用 Markdown 格式。
- 包括项目概述、核心功能、技术栈建议和文件结构建议等部分。
- **不要生成任何代码**,只生成需求描述文本。
- 你的输出将直接展示给用户进行确认和修改。"""
        response = openai_client.chat.completions.create(
            model=self.decision_model,
            messages=[
                {"role": "system", "content": system_prompt},
                {"role": "user", "content": f"我的项目想法是:{prompt}"}
            ],
            temperature=0.5,
        )
        return response.choices[0].message.content

    def generate_initial_code(self, requirements_text: str) -> str:
        requirements_file = self.project_dir / "README.md"
        with open(requirements_file, 'w', encoding='utf-8') as f:
            f.write(requirements_text)

        system_prompt = """你是一个专业的全栈开发工程师。根据项目根目录下的 `README.md` 需求文档,生成完整的初始项目文件。
- 严格按照 `README.md` 的要求来实现。
- 返回格式必须是代码块,每个代码块代表一个文件的操作。
- 新增文件格式: ```add--path/to/file.py\n...code...```
- 请一次性生成所有必要的文件。"""
        
        context = f"File: README.md\n```\n{requirements_text}\n```\n"
        user_message = f"这是我们确认的需求文档(README.md),请开始搭建项目框架和基础代码:\n\n{context}"

        response = openai_client.chat.completions.create(
            model=self.generation_model,
            messages=[{"role": "system", "content": system_prompt}, {"role": "user", "content": user_message}],
            temperature=0.7,
        )
        full_response_text = response.choices[0].message.content
        code_blocks = self._parse_ai_response(full_response_text)
        
        if code_blocks:
            self._save_files(code_blocks)
            return f"项目初始代码已生成!共创建了 {len(code_blocks)} 个文件。"
        else:
            return "AI 分析了需求,但没有生成任何文件。可能需求不够明确。"

    def modify_code(self, user_prompt: str) -> str:
        system_prompt = """你是一个资深的全栈开发工程师。当前你正在维护一个已有的项目。
- 根据用户的修改要求和现有的项目文件上下文,生成或修改项目文件。
- 用户的要求是最高优先级。
- 仔细分析文件上下文,确保修改的准确性和一致性。
- 返回格式必须是代码块,每个代码块代表一个文件的操作。
.........完整代码请登录后点击上方下载按钮下载查看

网友评论0