该应用是一个基于 Flask 框架的 AI 模型 API 管理系统,允许用户添加、删除不同 AI 模型(如 DeepSeek、阿里云、智谱、百度、科大讯飞等)的 API 密钥,并通过这些配置好的 API 与相应的 AI 模型进行交互,获取回复。应用包含后端的 Flask 服务和前端的 HTML 页面及 JavaScript 脚本。
python
from flask import Flask, request, render_template, jsonify
import requests
Flask
:用于构建 Web 应用的轻量级框架。request
:用于处理 HTTP 请求,获取请求中的数据。render_template
:用于渲染 HTML 模板。jsonify
:用于将 Python 对象转换为 JSON 格式并作为 HTTP 响应返回。requests
:用于发送 HTTP 请求,与外部 API 进行交互。python
app = Flask(__name__)
创建一个 Flask 应用实例,__name__
参数用于指定应用的名称。
python
# 存储用户配置的API
apis = {
"deepseek": None,
"aliyun": None,
"zhipu": None,
"baidu": None,
"iflytek": None
}
定义一个字典apis
,用于存储不同 AI 模型的 API 密钥,初始值均为None
。
python
@app.route('/')
def index():
return render_template('index.html', apis=apis)
index.html
模板,并将apis
字典传递给模板,以便在页面上显示和操作。python
@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 密钥存入字典,并返回成功消息;否则返回错误消息。python
@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
,并返回成功消息;否则返回错误消息。python
@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}",
"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
。POST
请求到对应的 API 端点。python
if __name__ == '__main__':
app.run(debug=True)
当脚本直接运行时,启动 Flask 应用,并设置debug
模式为True
,以便在开发过程中查看错误信息和自动重新加载应用。
html
AI Model API Manager
html
AI Model API Manager
API Management
Chat with AI
javascript
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'}`);
});
});
fetch
发送POST
请求到/add_api
端点,传递模型和 API 密钥的 JSON 数据。-------------------------------------------------------------------------------------
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}",
"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代码
AI Model API Manager
AI Model API Manager
API Management
Chat with AI