基于Flask框架添加多个AI模型的API并进行交互

2025-03-28 15:50

本文主要是介绍基于Flask框架添加多个AI模型的API并进行交互,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下...

1. 概述

该应用是一个基于 Flask 框架的 AI 模型 API 管理系统,允许用户添加、删除不同 AI 模型(如 DeepSeek、阿里云、智谱、百度、科大讯飞等)的 API 密钥,并通过这些配置好的 API 与相应的 AI 模型进行交互,获取回复。应用包含后端的 Flask 服务和前端的 HTML 页面及 javascript 脚本。

2. 后端代码说明

2.1 依赖库导入

from flask import Flask, request, render_template, jsonify
import requests

Flask:用于构建 Web 应用的轻量级框架。

request:用于处理 HTTP 请求,获取请求中的数据。

render_template:用于渲染 HTML 模板。

jsonify:用于将 python 对象转换为 JSON 格式并作为 HTTP 响应返回。

requests:用于发送 HTTP 请求,与外部 API 进行交互。

2.2 应用初始化

app = Flask(__name__)

创建一个 Flask 应用实例,__name__参数用于指定应用的名称。

2.3 API 存储字典

# 存储用户配置的API
apis = {
    "deepseek": None,
    "aliyun": None,
    "zhipu": None,
    "baidu": None,
    "iflytek": None
}

定义一个字典apis,用于存储不同 AI 模型的 API 密钥,初始值均为None。

2.4 路由函数

1.首页路由:

@app.route('/')
def index():
    return render_template('index.html', apis=apis)

当用户访问根路径时,渲染index.html模板,并将apis字典传递给模板,以便在页面上显示和操作。

2.添加 API 路由:

@app.route('/add_api', methods=['POST'])
def add_api():
    try:
        data = request.get_json()
        if not data:
            return jsonify({"status": "error", "message": "No data provided"}), 400
            
        model = data.get('model')
        api_key = data.get('api_key')
        
        if not model or not api_key:
            return jsonify({"status": "error", "message": "Missing required parameters"}), 400
            
        if model in apis:
            apis[model] = api_key
            return jsonify({"status": "success", "message": f"{model} API added successfully!"})
        else:
            return jsonify({"status": "error", "message": "Invalid model specified."}), 400
    except Exception as e:
        return jsonify({"status": "error", "message": str(e)}), 500

处理POST请求,从请求中获取 JSON 数据,提取model和api_key。

检查数据的完整性,若缺少必要参数或模型不合法,则返回相应的错误信息。

若模型存在于apis字典中,则将对应的 API 密钥存入字典,并返回成功消息;否则返回错误消息。

若发生异常,返回异常信息和 500 状态码。

3.删除 API 路由:

@app.route('/remove_api', methods=['POST'])
def remove_api():
    try:
        data = request.get_json()
        if not data:
            return jsonify({"status": "error", "message": "No data provided"}), 400
            
        model = data.get('model')
        
        if not model:
            return jsonify({"status": "error", "message": "Missing model parameter"}), 400
            
        if model in apis:
            apis[model] = None
            return jsonify({"status": "success", "message": f"{model} API removed successfully!"})
        else:
            return jsonify({"status": "error", "message": "Invalid model specified."}), 400
    except Exception as e:
        return jsonify({"status": "error", "message": str(e)}), 500

处理POST请求,从请求中获取 JSON 数据,提取model。

检查数据的完整性,若缺少模型参数或模型不合法,则返回相应的错误信息。

若模型存在于apis字典中,则将其 API 密钥设置为None,并返回成功消息;否则返回错误消息。

若发生异常,返回异常信息和 500 状态码。

4.获取响应路由:

@app.route('/get_response', methods=['POST'])
def get_response():
    try:
        data = request.get_json()
        if not data:
            return jsonify({"status": "error", "message": "No data provided"}), 400
            
        model = data.get('model')
        prompt = data.get('prompt')
        
        if not model or not prompt:
            return jsonify({"status": "error", "message": "Missing required parameters"}), 400
            
        if model in apis and apis[model]:
            try:
                # 这里根据不同的模型调用相应的API
                if model == "deepseek":
                    headers = {
                        "Authorization": f"Bearer {apis[model]}",
                        "Content-Type": "application/json"
                    }
                    payload = {
                        "model": "deepseek-chat",
                        "messages": [{"role": "user", "content": prompt}],
                        "temperature": 0.7
                    }
                    response = requests.post(
                        "https://api.deepseek.com/v1/chat/completions",
                        headers=headers,
                        json=payload
                    )
                elif model == "aliyun":
                    headers = {
                        "Authorization": f"Bearer {apis[model]}",
                        "Content-Type": "application/json"
                    }
                    payload = {
                        "model": "bailian",
                        "input": {
                            "messages": [{"role": "user", "content": prompt}]
                        }
                    }
                    response = requests.post(
                        "https://bailian.aliyuncs.com/v2/app/completions",
                        headers=headers,
                        json=payload
                    )
                elif model == "zhipu":
                    headers = {
                        "Authorization": f"Bearer {apis[model]}",
                        "Content-Type": "application/json"
                    }
                    payload = {
                        "model": "chatglm_turbo",
                        "messages": [{"role": "user", "content": prompt}]
                    }
                    response = requests.post(
                        "https://open.bigmodel.cn/api/paas/v3/model-api/chatglm_turbo/invoke",
                        headers=headers,
                        json=payload
                    )
    China编程            elif model == "baidu":
                    headers = {
                        "Content-Type": "application/json",
                        "Accept": "application/json"
                    }
                    payload = {
                        "messages": [{"role": "user", "content": prompt}]
                    }
                    response = requests.post(
                        f"https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions?Access_token={apis[model]}",
                        headers=headers,
                        json=payload
                    )
                elif model == "iflytek":
                    headers = {
                        "Content-Type": "application/json",
                        "X-Appid": "your_app_id",  # 需要替换为实际AppID
                        "X-CurTime": str(int(time.time())),
                        "X-Param": json.dumps({"scene": "main"}),
                        "X-CheckSum": ""  # 需要计算校验和
                    }
                    payload = {
                        "text": prompt
                    }
                    response = requests.post(
                        "https://api.xfyun.cn/v1/aiui/v1/text",
                        headers=headers,
                        json=payload
                    )
                
                if response.status_code == 200:
                    response_data = response.json()
                    # 根据不同API的响应格式提取回复
                    if model == "deepseek":
                        reply = response_data['choices'][0]['message']['content']
                    elif model == "aliyun":
                        reply = response_data['output']['text']
                    elif model == "zhipu":
                        reply = response_data['data']['choices'][0]['content']
                    elif model == "baidu":
                        reply = response_data['result']
                    elif model == "iflytek":
                        reply = response_data['data'][0]['content']
                    
                    return jsonify({
                        "status": "success", 
                        "response": reply,
                        "model": model
                    })
                else:
                    return jsonify({
                        "status": "error", 
                        "message": f"API call failed with status code {response.status_code}",
                        "response_text": response.text,
                        "request_payload": payload  # 添加请求负载用于调试
                    }), response.status_code
            except requests.exceptions.RequestException as e:
                return jsonify({
                    "status": "error", 
                    "message": f"Network error: {str(e)}"
                }), 500
            except Exception as e:
                return jsonify({
                    "status": "error", 
                    "message": str(e),
                    "error_type": type(e).__name__
                }), 500
        else:
            return jsonify({
                "status": "error", 
                "message": "API not configured or invalid model."
            }), 400
    except Exception as e:
        return jsonify({"status": "error", "message": str(e)}), 500

处理POST请求,从请求中获取 JSON 数据,提取model和prompt。

检查数据的完整性,若缺少必要参数或模型未配置 API 密钥,则返回相应的错误信息。

根据不同的模型,构造相应的请求头和请求负载,发送POST请求到对应的 API 端点。

若 API 调用成功(状态码为 200),根据不同模型的响应格式提取回复内容,并返回成功消息;否则返回错误消息,包括状态码、响应文本和请求负载(用于调试)。

若发生网络错误或其他异常,返回相应的错误信息和状态码。

2.5 应用运行

if __name__ == '__main__':
    app.run(debug=True)

当脚本直接运行时,启动 Flask 应用,并设置debug模式为True,以便在开发过程中查看错误信息和自动重新加载应用。

3. 前端代码说明

3.1 HTML 结构

头部部分:

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>AI Model API Manager</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="external nofollow"  rel="external nofollow"  rel="stylesheet">
    <style>
        .chat-window {
            height: 400px;
            overflow-y: auto;
            border: 1px solid #ccc;
            padding: 10px;
            margin-bottom: 20px;
            background-color: #f9f9f9;
        }
        .message {
            margin-bottom: 10px;
            padding: 8px;
            border-radius: 5px;
        }
        .user-message {
            background-color: #e3f2fd;
            margin-left: 20%;
        }
        .bot-message {
            background-color: #f1f1f1;
            margin-right: 20%;
        }
        .model-info {
            font-size: 0.8em;
            color: #666;
            margin-top: 5px;
        }
        .error-message {
            background-color: #ffebee;
            color: #d32f2f;
        }
    </style>
</head>

设置页面的字符编码、视口等基本信息。

引入 Bootstrap 的 CSS 样式表,用于页面布局和样式。

自定义一些 CSS 样式,用于聊天窗口、消息显示、错误消息显示等。

主体部分:

<body>
    <div class="container mt-5">
        <h1 class="text-center mb-4">AI Model API Manager</h1>
        <div class="row">
            <div class="col-md-6">
                <div class="card mb-3">
                    <div class="card-header">API Management</div>
                    <div class="card-body">
                        <form id="addApiForm" class="mb-3">
                            <div class="mb-3">
                                <label for="addModel" class="form-label">Model:</label>
                                <select id="addModel" name="model" class="form-select">
                                    <option value="deepseek">DeepSeek</option>
                                    <option value="aliyun">Aliyun</option>
                                    <option value="zhipu">Zhipu</option>
                                    <option value="baidu">Baidu</option>
                                    <option value="iflytek">Iflytek</option>
                                </select>
                            </div>
                            <div class="mb-3">
                                <label for="api_key" class="form-label">API Key:</label>
                                <input type="text" id="api_key" name="api_key" class="form-control" required>
                            </div>
                            <button type="submit" class="btn btn-primary">Add API</button>
                        </form>
                        <form id="removeApiForm">
                            <div class="mb-3">
                                <label for="removeModel" class="form-label">Model:</label>
                                <select id="removeModel" name="model" class="form-select">
                                    <option value="deepseek">DeepSeek</option>
                                    <option value="aliyun">Aliyun</option>
                                    <option value="zhipu">Zhipu</option>
                                    <option value="baidu">Baidu</option>
                                    <option value="iflytek">Iflytek</option>
                                </select>
                            </div>
                            <button type="submit" class="btn btn-danger">Remove API</button>
                        </form>
                    </div>
                </div>
            </div>
            <div class="col-md-6">
                <div class="card">
                    <div class="card-header">Chat with AI</div>
                    <div class="card-body">
                        <div class="chat-window" id="chatWindow"></div>
                        <form id="getResponseForm">
                            <div class="mb-3">
                                <label for="chatModel" class="form-label">Model:</label>
                                <select id="chatModel" name="model" class="form-select">
                                    <option value="deepseek">DeepSeek</option>
                                    <option value="aliyun">Aliyun</option>
                                    <option value="zhipu">Zhipu</option>
                                    <option value="baidu">Baidu</option>
                                    <option value="iflytek">Iflytek</option>
                                </select>
                            </div>
                            <div class="mb-3">
                                <label for="prompt" class="form-label">Prompt:</label>
                                <input type="text" id="prompt" name="prompt" class="form-control" required>
                            </div>
                            <button type="submit" class="btn btn-success">Get Response</button>
                        </form>
                    </div>
                </div>
            </div>
        </div>
    </div>

页面主体部分使用 Bootstrap 的栅格系统布局。

左侧部分用于 API 管理,包含添加 API 和移除 API 的表单,表单中包含模型选择和 API 密钥输入框。

右侧部分用于与 AI 聊天,包含聊天窗口和发送请求的表单,表单中包含模型选择和提示输入框。

3.2 JavaScript 脚本

添加 API 功能:

document.getElementById('addApiForm').addEventListener('submit', function(e) {
    e.preventDefault();
    const model = document.getElementById('addModel').value;
    const apiKey = document.getElementById('api_key').value;
    
    fetch('/add_api', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
        },
        body: JSON.stringify({
            model: model,
            api_key: apiKey
        })
    })
    .then(response => {
        if (!response.ok) {
            return response.json().then(err => { throw err; });
        }
        return response.json();
    })
    .then(data => {
        alert(data.message);
        document.getElementById('api_key').value = '';
    })
    .catch(error => {
        alert(`Error: ${error.message || 'Failed to add API'}`);
    });
});

监听添加 API 表单的提交事件,阻止表单的默认提交行为。

获取用户选择的模型和输入的 API 密钥。

使用fetch发送POST请求到/add_api端点,传递模型和 API 密钥的 JSON 数据。

处理响应,若响应失败,抛出错误;若成功,显示提示信息并清空 API 密钥输入框;若发生异常,显示错误提示。

app.py代码

from flask import Flask, request, render_template, jsonify
import requests
 
app = Flask(__name__)
 
# 存储用户配置的API
apis = {
    "deepseek": None,
    "aliyun": None,
    "zhipu": None,
    "baidu": None,
    "iflytek": None
}
 
@app.route('/')
def index():
    return render_template('index.html', apis=apis)
 
@app.route('/add_api', methods=['POST'])
def add_api():
    try:
        data = request.get_json()
        if not data:
            return jsonify({"status": "error", "message": "No data provided"}), 400
            
        model = data.get('model')
        api_key = data.get('api_key')
        
        if not model or not api_key:
            return jsonify({"status": "error", "message": "Missing required parameters"}), 400
            
        if model in apis:
            apis[model] = api_key
            return jsonify({"status": "success", "message": f"{model} API added successfully!"})
        else:
            return jsonify({"status": "error", "message": "Invalid model specified."}), 400
    except Exception as e:
        return jsonify({"status": "error", "message": str(e)}), 500
 
@app.route('/remove_api', methods=['POST'])
def remove_api():
    try:
        data = request.get_json()
        if not data:
            return jsonify({"status": "error", "message": "No data provided"}), 400
            
        model = data.get('model')
        
        if not model:
            return jsonify({"status": "error", "message": "Missing model parameter"}), 400
            
        if model in apis:
            apis[model] = None
            return jsonify({"status": "success", "message": f"{model} API removed successfully!"})
        else:
            return jsonify({"status": "error", "message": "Invalid model specified."}), 400
    except Exception as e:
        return jsonify({"status": "error", "message": str(e)}), 500
 
@app.route('/get_response', methods=['POST'])
def get_response():
    try:
        data = request.get_json()
        if not data:
            return jsonify({"status": "error", "message": "No data provided"}), 400
            
        model = data.get('model')
        prompt = data.get('prompt')
        
        if not model or not prompt:
            return jsonify({"status": "error", "message": "Missing required parameters"}), 400
            
        if model in apis and apis[model]:
            try:
                # 这里根据不同的模型调用相应的API
                if model == "deepseek":
                    headers = {
                        "Authorization": f"Bearer {apis[model]}",
                        "Content-Type": "application/json"
                    }
                    payload = {
                        "model": "deepseek-chat",
                        "messages": [{"role": "user", "content": prompt}],
                        "temperature": 0.7
                    }
                    response = requests.post(
                        "https://api.deepseek.com/v1/chat/completions",
                        headers=headers,
                        json=payload
                    )
                elif model == "aliyun":
                    headers = {
                        "Authorization": f"Bearer {apis[model]}",
                        "Content-Type": "application/json"
                    }
                    payload = {
                        "model": "bailian",
                        "input": {
                            "messages": [{"role": "user", "content": prompt}]
                        }
                    }
                    response = requests.post(
                        "https://bailian.aliyuncs.com/v2/app/completions",
                        headers=headers,
                        json=payload
                    )
                elif model == "zhipu":
                    headers = {
                        "Authorization": f"Bearer {apis[model]}",
                        "Content-Type": "application/json"
                    }
                    payload = {
                        "model": "chatglm_turbo",
                        "messages": [{"role": "user", "content": prompt}]
                    }
                    response = requests.post(
                        "https://open.bigmodel.cn/api/paas/v3/model-api/chatglm_turbo/invoke",
                        headers=headers,
                        json=payload
                    )
                elif model == "baidu":
                    headers = {
                        "Content-Type": "application/json",
                        "Accept": "application/json"
                    }
                    payload = {
                        "messages": [{"role": "user", "content": prompt}]
                    }
                    response = requests.post(
                        f"https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions?access_token={apis[model]}",
                        headers=headers,
                        json=payload
                    )
                elif model == "iflytek":
                    headers = {
                        "Content-Type": "application/json",
                        "X-Appid": "your_app_id",  # 需要替换为实际AppID
                        "X-CurTime": str(int(time.time())),
                        "X-Param": json.dumps({"scene": "main"}),
                        "X-CheckSum": ""  # 需要计算校验和
                    }
                    payload = {
                        "text": prompt
                    }
                    response = requests.post(
                        "https://api.xfyun.cn/v1/aiui/v1/text",
                        headers=headers,
                        json=payload
                    )
                
                if response.status_code == 200:
                    response_data = response.json()
                    # 根据不同API的响应格式提取回复
                    if model == "deepseek":
                        reply = response_data['choices'][0]['message']['content']
                    elif model == "aliyun":
                        reply = response_data['output']['text']
                    elif model == "zhipu":
                        reply = response_data['data']['choices'][0]['content']
                    elif model == "baidu":
                        reply = response_data['result']
                    elif model == "iflytek":
                        reply = response_data['data'][0]['content']
                    
                    return jsonify({
                        "status": "success", 
                        "response": reply,
                        "model": model
                    })
                else:
                    return jsonify({
                        "status": "error", 
                        "message": f"API call failed with status code {response.status_code}",
                     China编程   "response_text": response.text,
                        "request_payload": payload  # 添加请求负载用于调试
                    }), response.status_code
            except requests.exceptions.RequestException as e:
                return jsonify({
                    "status": "error", 
                    "message": f"Network error: {str(e)}"
                }), 500
            except Exception as e:
                return jsonify({
                    "status": "error", 
                    "message": str(e),
                    "error_type": type(e).__name__
                }), 500
        else:
            return jsonify({
                "status": "error", 
                "message": "API not configured or invalid model."
            }), 400
    except Exception as e:
        return jsonify({"status": "error", "message": str(e)}), 500
 
if __name__ == '__main__':
    app.run(debug=True)

index.html代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>AI Model API Manager</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="external nofollow"  rel="external nofollow"  rel="stylesheet">
    <style>
        .chat-window {
            height: 400px;
            overflow-y: auto;
            border: 1px solid #ccc;
            padding: 10px;
            margin-bottom: 20px;
            background-color: #f9f9f9;
        }
        .message {
            margin-bottom: 10px;
            padding: 8px;
            border-radius: 5px;
        }
        .jsuser-message {
            background-color: #e3f2fd;
            margin-left: 20%;
        }
        .bot-message {
            background-color: #f1f1f1;
            margin-right: 20%;
        }
        .model-info {
            font-size: 0.8em;
            color: #666;
            margin-top: 5px;
        }
        .error-message {
            background-color: #ffebee;
            color: #d32f2f;
        }
    </style>
</head>
<body>
    <div class="container mt-5">
        <h1 class="text-center mb-4">AI Model API Manager</h1>
        <div class="row">
            <div class="col-md-6">
                <div class="card mb-3">
                    <div class="card-header">API Management</div>
                    <div class="card-body">
                        <form id="addApiForm" class="mb-3">
                            <div class="mb-3">
                                <label for="addModel" class="form-label">Model:</label>
                                <select id="addModel" name="model" class="form-select">
                                    <option value="deepseek">DeepSeek</option>
                                    <option value="aliyun">Aliyun</option>
                                    <option value="zhipu">Zhipu</option>
                                    <option value="baidu">Baidu</option>
                                    <option value="iflytek">Iflytek</option>
                                </select>
                            </div>
                            <div class="mb-3">
                                <label for="api_key" class="form-label">API Key:</label>
                                <input type="text" id="api_key" name="api_key" class="form-control" required>
                            </div>
                            <button type="submit" class="btn btn-primary">Add API</button>
                        </form>
                        <form id="removeApiForm">
                            <div class="mb-3">
                                <label for="removeModel" class="form-label">Model:</label>
                                <select id="removeModel" name="model" class="form-select">
                                    <option value="deepseek">DeepSeek</option>
                                    <option value="aliyun">Aliyun</option>
                                    <option value="zhipu">Zhipu</option>
                                    <option value="baidu">Baidu</option>
                                    <option value="iflytek">Iflytek</option>
                                </select>
                            </div>
                            <button type="submit" class="btn btn-danger">Remove API</button>
                        </form>
                    </div>
                </div>
            </div>
            <div class="col-md-6">
                <div class="card">
                    <div class="card-header">Chat with AI</div>
                    <div class="card-body">
                        <div class="chat-window" id="chatWindow"></div>
                        <form id="getResponseForm">
                            <div class="mb-3">
                                <label for="chatModel" class="form-label">Model:</label>
                                <select id="chatModel" name="model" class="form-select">
                                    <option value="deepseek">DeepSeek</option>
                                    <option value="aliyun">Aliyun</option>
                                    <option value="zhipu">Zhipu</option>
                                    <option value="baidu">Baidu</option>
                                    <option value="iflytek">Iflytek</option>
                                </select>
                            </div>
                            <div class="mb-3">
                                <label for="prompt" class="form-label">Prompt:</label>
                                <input type="text" id="prompt" name="prompt" class="form-control" required>
                            </div>
                            <button type="submit" class="btn btn-success">Get Response</button>
                        </form>
                    </div>
                </div>
            </div>
        </div>
    </div>
 
<!-- 保持之前的HTML结构不变,只修改JavaScript部分 -->
<script>
    // 添加API
    document.getElementById('addApiForm').addEventListener('submit', function(e) {
        e.preventDefault();
        const model = document.getElementById('addModel').value;
        const apiKey = document.getElementById('api_key').value;
        
        fetch('/add_api', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
            },
            body: JSON.stringify({
                model: model,
                api_key: apiKey
            })
        })
        .then(response => {
            if (!response.ok) {
                return response.json().then(err => { throw err; });
            }
            return response.json();
        })
        .then(data => {
            alert(data.message);
            document.getElementById('api_key').value = '';
        })
        .catch(error =&javascriptgt; {
            alert(`Error: ${error.message || 'Failed to add API'}`);
        });
    });
 
    // 移除API
    document.getElementById('removeApiForm').addEventListener('submit', function(e) {
        e.preventDefault();
        const model = document.getElementById('removeModel').value;
        
        fetch('/remove_api', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
            },
            body: JSON.stringify({
                model: model
            })
        })
        .then(response => {
            if (!response.ok) {
                return response.json().then(err => { throw err; });
            }
            return response.json();
        })
        .then(data => {
            alert(data.message);
        })
        .catch(error => {
            alert(`Error: ${error.message || 'Failed to remove API'}`);
        });
    });
 
    // 获取响应
    document.getElementById('getResponseForm').addEventListener('submit', function(e) {
        e.preventDefault();
        const model = document.getElementById('chatModel').value;
        const prompt = document.getElementById('prompt').value;
        const chatWindow = document.getElementById('chatWindow');
        
        // 添加用户消息
        chatWindow.innerHTML += `
            <div class="message user-message">
                <strong>You:</strong> ${prompt}
            </div>
        `;
        
        const submitBtn = document.querySelector('#getResponseForm button[type="submit"]');
        submitBtn.disabled = true;
        
        fetch('/get_response', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
            },
            body: JSON.stringify({
                model: model,
                prompt: prompt
            })
        })
        .then(response => {
            if (!response.ok) {
                return response.json().then(err => { throw err; });
            }
            return response.json();
        })
        .then(data => {
            if (data.status === "success") {
                chatWindow.innerHTML += `
                    <div class="message bot-message">
                        <strong>Bot (${data.model}):</strong> ${data.response}
                    </div>
                `;
            } else {
                // 显示更详细的错误信息
                let errorMsg = data.message;
                if (data.response_text) {
                    try {
                        const errorData = JSON.parse(data.response_text);
                        errorMsg += ` - ${errorData.error || errorData.message || ''}`;
                    } catch (e) {
                        errorMsg += ` - ${data.response_text}`;
                    }
                }
                
                chatWindow.innerHTML += `
                    <div class="messagewww.chinasem.cn error-message">
                        <strong>Error:</strong> ${errorMsg}
                    </div>
                `;
            }
            chatWindow.scrollTop = chatWindow.scrollHeight;
            document.getElementById('prompt').value = '';
        })
        .catch(error => {
            let errorMsg = error.message || 'Failed to get response';
            if (error.response_text) {
                errorMsg += ` - ${error.response_text}`;
            }
            
            chatWindow.innerHTML += `
                <div class="message error-message">
                    <strong>Error:</strong> ${errorMsg}
                </div>
            `;
            chatWindow.scrollTop = chatWindow.scrollHeight;
        })
        .finally(() => {
            submitBtn.disabled = false;
        });
    });
</script>
 
</body>
</html>

到此这篇关于基于Flask框架添加多个AI模型的API并进行交互的文章就介绍到这了,更多相关Flask AI模型API管理内容请搜索编程China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于基于Flask框架添加多个AI模型的API并进行交互的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1153989

相关文章

Linux使用scp进行远程目录文件复制的详细步骤和示例

《Linux使用scp进行远程目录文件复制的详细步骤和示例》在Linux系统中,scp(安全复制协议)是一个使用SSH(安全外壳协议)进行文件和目录安全传输的命令,它允许在远程主机之间复制文件和目录,... 目录1. 什么是scp?2. 语法3. 示例示例 1: 复制本地目录到远程主机示例 2: 复制远程主

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

windows系统上如何进行maven安装和配置方式

《windows系统上如何进行maven安装和配置方式》:本文主要介绍windows系统上如何进行maven安装和配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录1. Maven 简介2. maven的下载与安装2.1 下载 Maven2.2 Maven安装2.

C/C++的OpenCV 进行图像梯度提取的几种实现

《C/C++的OpenCV进行图像梯度提取的几种实现》本文主要介绍了C/C++的OpenCV进行图像梯度提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录预www.chinasem.cn备知识1. 图像加载与预处理2. Sobel 算子计算 X 和 Y

SpringBoot整合Sa-Token实现RBAC权限模型的过程解析

《SpringBoot整合Sa-Token实现RBAC权限模型的过程解析》:本文主要介绍SpringBoot整合Sa-Token实现RBAC权限模型的过程解析,本文给大家介绍的非常详细,对大家的学... 目录前言一、基础概念1.1 RBAC模型核心概念1.2 Sa-Token核心功能1.3 环境准备二、表结

Python函数返回多个值的多种方法小结

《Python函数返回多个值的多种方法小结》在Python中,函数通常用于封装一段代码,使其可以重复调用,有时,我们希望一个函数能够返回多个值,Python提供了几种不同的方法来实现这一点,需要的朋友... 目录一、使用元组(Tuple):二、使用列表(list)三、使用字典(Dictionary)四、 使

python web 开发之Flask中间件与请求处理钩子的最佳实践

《pythonweb开发之Flask中间件与请求处理钩子的最佳实践》Flask作为轻量级Web框架,提供了灵活的请求处理机制,中间件和请求钩子允许开发者在请求处理的不同阶段插入自定义逻辑,实现诸如... 目录Flask中间件与请求处理钩子完全指南1. 引言2. 请求处理生命周期概述3. 请求钩子详解3.1

Python Flask 库及应用场景

《PythonFlask库及应用场景》Flask是Python生态中​轻量级且高度灵活的Web开发框架,基于WerkzeugWSGI工具库和Jinja2模板引擎构建,下面给大家介绍PythonFl... 目录一、Flask 库简介二、核心组件与架构三、常用函数与核心操作 ​1. 基础应用搭建​2. 路由与参

Go语言中使用JWT进行身份验证的几种方式

《Go语言中使用JWT进行身份验证的几种方式》本文主要介绍了Go语言中使用JWT进行身份验证的几种方式,包括dgrijalva/jwt-go、golang-jwt/jwt、lestrrat-go/jw... 目录简介1. github.com/dgrijalva/jwt-go安装:使用示例:解释:2. gi

SpringBoot如何对密码等敏感信息进行脱敏处理

《SpringBoot如何对密码等敏感信息进行脱敏处理》这篇文章主要为大家详细介绍了SpringBoot对密码等敏感信息进行脱敏处理的几个常用方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录​1. 配置文件敏感信息脱敏​​2. 日志脱敏​​3. API响应脱敏​​4. 其他注意事项​​总结