AiOnly大模型服务实测:从零开始Python调用ChatGPT/Claude API,打造专属AI智能体
本文围绕 AiOnly 一站式 Mass 模型服务平台展开,先介绍其基础概念与服务,平台聚焦降低模型应用门槛,整合全球前沿模型,提供企业级 API 服务,降低成本且支持高并发,可调用多种顶尖大模型。接着详细说明平台注册、免费额度领取及 API 密钥获取步骤,还介绍热门模型功能。随后重点讲解 Python 调用 API 的实战,包括环境准备、基础与进阶调用,以及专属 Python 学习智能体的封装与


AiOnly大模型服务实测:从零开始Python调用ChatGPT/Claude API,打造专属AI智能体
本文围绕 AiOnly 一站式 Mass 模型服务平台展开,先介绍其基础概念与服务,平台聚焦降低模型应用门槛,整合全球前沿模型,提供企业级 API 服务,降低成本且支持高并发,可调用多种顶尖大模型。接着详细说明平台注册、免费额度领取及 API 密钥获取步骤,还介绍热门模型功能。随后重点讲解 Python 调用 API 的实战,包括环境准备、基础与进阶调用,以及专属 Python 学习智能体的封装与功能扩展,提及对话和图片理解、入参参数。最后列出常见问题与解决方案,并总结平台优势及进一步开发方向,让你更方便上手。

一、关于AiOnly

1.1 AiOnly的基础概念
AiOnly是一站式Mass模型服务平台,聚焦降低模型应用门槛,加速场景智能化进程,以一键调用、敏捷开发为核心,整合全球前沿模型,通过标准化API接口与模块化组件,将复杂模型技术转化为可快速集成的“智能积木”。
1.2 AiOnly的模型服务
AiOnly提供企业级API服务,极大降低了海外访问成本,以及模型Token使用成本,同时,平台调用支持高并发,多账号轮询超越原厂水平,并提供了高速专线,可畅享全球顶尖大模型,包括GPT、Claude、Gemini等最新模型,也可在线体验文本/图片/视频大模型的强大性能。
二、AiOnly平台注册与API密钥获取
要调用 AiOnly 的 API,首先需要完成平台注册并获取 API 密钥,这是所有操作的基础,步骤简单无门槛。
2.1 平台注册流程

- 打开AiOnly官方网站(https://www.aiionly.com/login?inviteCode=0001143),点击右上角“注册”按钮;
- 支持手机号或微信、支付宝三种注册方式,输入对应信息后完成验证码验证;
- 验证通过后直接登录,自动跳转至平台“控制台”首页。
2.2 领取免费额度与创建API密钥

-
完成注册后即可获得token免费体验额度,可在控制台卡券中心确认,足够完成前期开发测试;
-
开通自己想应用的大模型,我这里选择的是GPT-5-Chat ,大家可以根据自己的需求选择对应的模型,然后开通服务。

-
点击左侧菜单栏“API Key”,进入密钥创建页面;

-
点击“新建密钥”,输入密钥名称(如“Python智能体开发”),无需额外配置,直接点击“确认”;
⚠️ 注意: API密钥是调用接口的核心凭证,请勿分享给他人,避免被恶意使用导致额度消耗或额外费用。
2.3 热门模型免费体验
在 AiOnly 平台,无需复杂配置即可通过国内直连专线免费体验全球顶尖大模型,所有模型共享统一 API 接口,仅需修改model参数即可切换调用。以下为各热门模型的功能介绍与使用说明:
2.3.1 ChatGPT5
作为 OpenAI 旗舰级模型,ChatGPT5 在自然语言理解、逻辑推理与多模态交互能力上实现全面突破。擅长万字级长文本创作与逻辑保持,多轮对话记忆达 15 轮,推理正确率提升至 92%,支持多模态分析与文化适配的精准翻译,适合报告撰写、学术研究等场景。
在线体验:

AI给的代码效果演示:

2.3.2 Claude Sonnet 4.5
Anthropic 发布的 Claude Sonnet 4.5 以 “编程与智能体构建标杆” 为定位,多项能力实现行业突破。编码能力突出,SWE-bench 得分达 82%,支持多文件重构与安全敏感场景开发,长文档处理与数学推理能力强,新增工具调用与上下文编辑功能。
在线体验:

AI给的代码效果演示:

2.3.3 GPT-5-Codex
GPT-5-Codex 是 OpenAI 专为代码开发场景打造的细分模型系列,按性能梯度分为三个版本,精准适配不同开发需求。分 High/Medium/Low 三版本,覆盖深度学习开发、API 编写到轻量脚本任务,代码生成准确率最高 92%,支持仓库级理解与动态推理,适配不同复杂度开发需求。
在线体验:

AI给的代码效果演示:

2.3.4 Grok-4
Grok-4 作为侧重实时信息与个性化交互的模型,以 “敏捷响应与场景适配” 为核心优势。文本模态专用,13 万 token 上下文窗口,推理性能强劲,HLE 得分 44.4% 超同类模型,支持函数调用与结构化输出,擅长实时信息分析与个性化交互。
在线体验:

AI给的代码效果演示:

2.3.5 Gemini-2.5 Pro
Google DeepMind 推出的 Gemini-2.5 Pro 以 “多模态融合与高效推理” 为特色,百万级 token 上下文,支持文本、图像等多模态融合处理,推理速度提升 40%,具备结构化输出与 “思考” 功能,适配跨境业务与轻量化部署。
在线体验:

AI给的代码效果演示:

2.3.6 更多模型
AiOnly 模型广场持续更新主流模型,免费体验覆盖文本、图像、语音等全场景,国内外主流大模型都有!

随心切换开通模型,一键应用所有国内外热门模型 ,这点非常nice!

三、Python调用AiOnly API核心实战(支持ChatGPT/Claude)
AiOnly 的优势在于 “统一接口”—— 无论是调用 ChatGPT 还是 Claude,只需修改 “model” 参数,无需学习不同模型的接口规范。下面先从基础调用开始,再逐步升级到智能体开发。
3.1 环境准备:安装依赖库
首先安装 Python 调用 API 所需的库,官方推荐使用requests(通用 HTTP 请求库),也可使用 AiOnly 官方 SDK,这里以更通用的requests为例:
# 安装 Flask 框架(用于搭建 Web 服务)和 requests(调用 AiOnly API)
pip install flask requests
3.2 chatgpt基础调用:单轮对话(以ChatGPT为例)
单轮对话适用于简单的 “一问一答” 场景,比如查询某个知识点、生成一段文本。代码如下,每一行都附带详细注释:
import requests
# -------------------------- 1. 配置核心参数 --------------------------
# 替换为你在AiOnly平台获取的API密钥
API_KEY = "你的AiOnly API密钥"
# AiOnly API的基础地址(固定不变)
BASE_URL = "https://api.aionly.com/v1/chat/completions"
# 选择要调用的模型:ChatGPT-3.5可填"gpt-3.5-turbo",Claude-3可填"claude-3-sonnet-20240229"
TARGET_MODEL = "gpt-5-chat"
# -------------------------- 2. 构造请求数据 --------------------------
# messages参数:存储对话内容,每个元素包含"role"(角色)和"content"(内容)
# role可选值:user(用户)、assistant(AI助手)、system(系统,用于定义AI角色)
request_data = {
"model": TARGET_MODEL,
"messages": [
# 系统提示:定义AI的身份和回答规则(这是打造智能体的关键第一步)
{"role": "system", "content": "你是一个专业的Python编程助手,回答需包含完整代码和详细注释,语言简洁易懂"},
# 用户问题:实际需要AI处理的需求
{"role": "user", "content": "请写一个Python函数,实现列表去重功能"}
],
"temperature": 0.6 # 随机性控制:0-1之间,值越小回答越稳定,值越大创造力越强
}
# -------------------------- 3. 构造请求头 --------------------------
# 必须包含Authorization(身份验证)和Content-Type(数据格式)
request_headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
# -------------------------- 4. 发送请求并解析结果 --------------------------
try:
# 发送POST请求(AiOnly API仅支持POST方式)
response = requests.post(
url=BASE_URL,
json=request_data, # 自动将Python字典转为JSON格式
headers=request_headers,
timeout=30 # 超时时间:避免请求卡住,根据需求调整
)
# 检查请求是否成功(状态码200表示成功)
if response.status_code == 200:
# 解析返回的JSON数据
result = response.json()
# 提取AI的回复内容(固定从choices[0].message.content获取)
ai_reply = result["choices"][0]["message"]["content"]
print("Python编程助手回复:")
print(ai_reply)
else:
# 请求失败时,打印错误信息
error_info = response.json()
print(f"API调用失败!错误原因:{error_info['error']['message']}")
except Exception as e:
# 捕获网络异常等其他错误
print(f"程序运行出错:{str(e)}")
运行效果:

3.3 chatgpt进阶调用:多轮对话(实现上下文记忆)
智能体需要具备 “上下文记忆” 能力,比如用户先问 “如何读取 Excel”,再问 “如何筛选其中的数据”,AI 能关联上一轮对话。核心逻辑是保存历史对话记录,每次请求时将完整历史传入 API,代码如下:
import requests
# 基础配置(与单轮对话一致)
API_KEY = "你的AiOnly API密钥"
BASE_URL = "https://api.aionly.com/v1/chat/completions"
TARGET_MODEL = "gpt-5-chat" # 切换为Claude模型
# -------------------------- 关键:初始化对话历史 --------------------------
# 存储所有轮次的对话,包括system提示、用户输入、AI回复
conversation_history = [
{"role": "system", "content": "你是Python编程助手,需基于上一轮对话内容回答,避免重复,代码需可运行"}
]
def get_ai_response(user_question):
"""
调用AiOnly API获取AI回复,并更新对话历史
:param user_question: 用户当前的问题
:return: AI的回复内容
"""
# 1. 将用户当前问题添加到对话历史
conversation_history.append({"role": "user", "content": user_question})
# 2. 构造请求数据(messages传入完整对话历史)
request_data = {
"model": TARGET_MODEL,
"messages": conversation_history,
"temperature": 0.5
}
# 3. 发送请求
request_headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
try:
response = requests.post(BASE_URL, json=request_data, headers=request_headers, timeout=30)
if response.status_code == 200:
ai_reply = response.json()["choices"][0]["message"]["content"]
# 4. 将AI回复添加到对话历史(用于下一轮上下文关联)
conversation_history.append({"role": "assistant", "content": ai_reply})
return ai_reply
else:
return f"调用失败:{response.json()['error']['message']}"
except Exception as e:
return f"运行出错:{str(e)}"
# -------------------------- 测试多轮对话 --------------------------
if __name__ == "__main__":
print("Python编程助手(输入'退出'结束对话):你好!有什么Python问题可以帮你?")
while True:
user_input = input("你:")
if user_input.lower() in ["退出", "exit"]:
print("Python编程助手:再见!")
break
# 调用函数获取AI回复并打印
ai_answer = get_ai_response(user_input)
print(f"Python编程助手:{ai_answer}")
可以持续提问,并回答。

四、打造专属Python学习智能体:功能封装与场景扩展
前面的代码已经实现了基础对话能力,接下来我们将其封装成一个可复用的 “智能体类”,并扩展功能(如支持模型切换、对话记录保存),让智能体更贴近实际使用场景。
4.1 智能体类封装(可直接复用)
智能体类是整个系统的核心,我们将所有与 AI 交互相关的功能封装在PythonLearningAgent类中,使其具备高内聚、低耦合的特性,方便后续维护和扩展。里面包含各种热门国外大模型,也可以根据自己的需求自定义添加 。
"gpt-5-chat": "GPT-5 Chat",
"claude-sonnet-4.5": "Claude Sonnet 4.5",
"gpt-5-codex": "GPT-5 Codex",
"grok-4": "Grok-4",
"gemini-2.5-flash": "Gemini 2.5 Flash"
完整代码(安装上面依赖,可以直接使用)
from flask import Flask, request, jsonify, render_template_string, session
from flask_cors import CORS
from flask_session import Session
import requests
import json
from datetime import datetime
import uuid
import os
from functools import wraps
# 配置文件加载
class Config:
SECRET_KEY = os.environ.get('SECRET_KEY', 'dev-secret-key-123456')
SESSION_TYPE = 'filesystem'
SESSION_FILE_DIR = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'sessions')
AI_API_KEY = os.environ.get('AI_API_KEY', '填写 自己的 APK')
AI_BASE_URL = "https://api.aionly.com/v1/chat/completions"
MAX_RETRIES = 2
TIMEOUT = 30
# 初始化Flask服务
app = Flask(__name__)
app.config.from_object(Config)
CORS(app, supports_credentials=True)
Session(app)
# 会话管理装饰器
def require_session(f):
@wraps(f)
def decorated_function(*args, **kwargs):
if 'user_id' not in session:
session['user_id'] = str(uuid.uuid4())
session['agents'] = {}
return f(*args, **kwargs)
return decorated_function
# 智能体核心类封装
class AiOnlyWebAgent:
def __init__(self, api_key, base_url):
self.api_key = api_key
self.base_url = base_url
self.supported_models = {
"gpt-5-chat": "GPT-5 Chat",
"claude-sonnet-4.5": "Claude Sonnet 4.5",
"gpt-5-codex": "GPT-5 Codex",
"grok-4": "Grok-4",
"gemini-2.5-flash": "Gemini 2.5 Flash"
}
self.default_model = "gpt-5-chat"
self.conversation_history = [
{"role": "system", "content": "你是专业智能助手,回答精准简洁,代码需带注释"}
]
self.max_history_length = 20 # 限制历史记录长度
def get_response(self, user_question, temperature=0.6, max_retries=2):
# 限制对话历史长度,防止请求过大
if len(self.conversation_history) > self.max_history_length:
self.conversation_history = [self.conversation_history[0]] + self.conversation_history[
-self.max_history_length + 1:]
self.conversation_history.append({"role": "user", "content": user_question})
request_data = {
"model": self.default_model,
"messages": self.conversation_history,
"temperature": temperature
}
headers = {
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
}
for attempt in range(max_retries + 1):
try:
resp = requests.post(
self.base_url,
json=request_data,
headers=headers,
timeout=app.config['TIMEOUT']
)
if resp.status_code == 200:
ai_reply = resp.json()["choices"][0]["message"]["content"]
self.conversation_history.append({"role": "assistant", "content": ai_reply})
return {
"status": "success",
"reply": ai_reply,
"model": self.supported_models[self.default_model]
}
else:
error_msg = f"AiOnly API错误:{resp.json().get('error', {}).get('message', '未知错误')}"
if attempt < max_retries:
continue # 重试
return {"status": "fail", "error": error_msg}
except requests.exceptions.Timeout:
error_msg = f"请求超时(第{attempt + 1}次尝试)"
except requests.exceptions.ConnectionError:
error_msg = f"连接错误(第{attempt + 1}次尝试)"
except Exception as e:
error_msg = f"系统错误:{str(e)}"
if attempt < max_retries:
continue
return {"status": "fail", "error": error_msg}
def switch_model(self, model_key):
if model_key in self.supported_models:
self.default_model = model_key
return {
"status": "success",
"current_model": self.supported_models[model_key]
}
else:
return {
"status": "fail",
"error": "不支持该模型,请选择下拉框中的选项"
}
def clear_history(self):
self.conversation_history = [
{"role": "system", "content": "你是专业智能助手,回答精准简洁,代码需带注释"}
]
return {"status": "success", "msg": "对话历史已清空"}
# 获取当前用户的智能体实例
def get_current_agent():
user_id = session['user_id']
if user_id not in session['agents']:
session['agents'][user_id] = AiOnlyWebAgent(
api_key=app.config['AI_API_KEY'],
base_url=app.config['AI_BASE_URL']
)
return session['agents'][user_id]
# 接口1:获取前端页面
@app.route("/")
def index():
# 使用原始字符串(在字符串前加r)避免转义序列警告
html_content = r'''
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Python智能体对话</title>
<script src="https://cdn.tailwindcss.com"></script>
<link href="https://cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css" rel="stylesheet">
<style>
.chat-scrollbar::-webkit-scrollbar { width: 6px; }
.chat-scrollbar::-webkit-scrollbar-thumb { background: #d1d5db; border-radius: 3px; }
.chat-scrollbar::-webkit-scrollbar-thumb:hover { background: #9ca3af; }
.code-block {
background-color: #f7f7f7;
border-radius: 6px;
padding: 1em;
overflow-x: auto;
font-family: monospace;
margin: 1em 0;
}
</style>
</head>
<body class="bg-gray-100 min-h-screen flex flex-col">
<!-- 顶部导航栏 -->
<header class="bg-white shadow-md py-4 px-6 flex justify-between items-center">
<h1 class="text-2xl font-bold text-blue-600 flex items-center">
<i class="fa fa-robot mr-3"></i>
Python学习智能体对话
</h1>
<div class="flex items-center gap-4">
<!-- 模型切换下拉框 -->
<div class="relative">
<select id="model-select" class="appearance-none bg-gray-50 border border-gray-300 rounded-lg py-2 px-4 pr-8 focus:outline-none focus:ring-2 focus:ring-blue-500">
<option value="gpt-5-chat">GPT-5 Chat</option>
<option value="claude-sonnet-4.5">Claude Sonnet 4.5</option>
<option value="gpt-5-codex">GPT-5 Codex</option>
<option value="grok-4">Grok-4</option>
<option value="gemini-2.5-flash">Gemini 2.5 Flash</option>
</select>
<div class="pointer-events-none absolute inset-y-0 right-0 flex items-center px-2 text-gray-700">
<i class="fa fa-chevron-down text-xs"></i>
</div>
</div>
<!-- 清空对话按钮 -->
<button id="clear-btn" class="bg-red-50 text-red-600 border border-red-200 rounded-lg py-2 px-4 hover:bg-red-100 transition-colors flex items-center">
<i class="fa fa-trash-o mr-2"></i>清空对话
</button>
</div>
</header>
<!-- 中间对话区域 -->
<main class="flex-1 container mx-auto px-4 py-6 max-w-4xl">
<div id="chat-container" class="bg-white rounded-xl shadow-md h-[70vh] flex flex-col overflow-hidden">
<!-- 对话历史区域 -->
<div id="chat-history" class="flex-1 p-6 overflow-y-auto chat-scrollbar space-y-6">
<!-- 初始欢迎消息 -->
<div class="flex items-start gap-3">
<div class="w-10 h-10 rounded-full bg-blue-100 flex items-center justify-center flex-shrink-0">
<i class="fa fa-robot text-blue-600"></i>
</div>
<div class="bg-gray-50 rounded-lg px-4 py-3 max-w-[80%]">
<p class="text-gray-800">你好!我是Python智能体,相关python问题我都能帮你解决,有什么可以帮你的?</p>
<p class="text-xs text-gray-500 mt-1">当前模型:GPT-5 Chat</p>
</div>
</div>
</div>
<!-- 输入区域 -->
<div class="border-t border-gray-100 p-4 bg-gray-50">
<form id="chat-form" class="flex gap-3">
<textarea
id="user-input"
placeholder="请输入你的问题...(支持代码、文案、推理等需求)"
class="flex-1 border border-gray-300 rounded-lg px-4 py-3 focus:outline-none focus:ring-2 focus:ring-blue-500 resize-none min-h-[60px] max-h-[120px]"
></textarea>
<button
type="submit"
id="send-btn"
class="bg-blue-600 text-white rounded-lg px-6 py-3 hover:bg-blue-700 transition-colors flex items-center justify-center"
>
<i class="fa fa-paper-plane mr-2"></i>发送
</button>
</form>
<p id="status-text" class="text-xs text-gray-500 mt-2 text-right">支持Enter键发送,Shift+Enter换行</p>
</div>
</div>
</main>
<!-- 底部版权信息 -->
<footer class="bg-white py-3 px-6 text-center text-gray-500 text-sm">
<p>Powered by AiOnly | 国内直连全球大模型</p>
</footer>
<script>
// 后端接口基础地址
const BASE_URL = "";
// DOM元素
const chatForm = document.getElementById("chat-form");
const userInput = document.getElementById("user-input");
const chatHistory = document.getElementById("chat-history");
const modelSelect = document.getElementById("model-select");
const clearBtn = document.getElementById("clear-btn");
const sendBtn = document.getElementById("send-btn");
const statusText = document.getElementById("status-text");
// 格式化消息内容,特别是代码块
function formatMessage(content) {
// 处理代码块,使用原始字符串避免转义问题
let formatted = content.replace(/```([\s\S]*?)```/g, (match, code) => {
// 提取语言类型
const langMatch = code.match(/^(\w+)\n/);
let lang = '';
let codeContent = code;
if (langMatch) {
lang = langMatch[1];
codeContent = code.slice(langMatch[0].length);
}
return `<div class="code-block"><pre><code${lang ? ` class="language-${lang}"` : ''}>${escapeHtml(codeContent)}</code></pre></div>`;
});
// 处理换行
formatted = formatted.replace(/\n/g, '<br>');
return formatted;
}
// HTML转义
function escapeHtml(unsafe) {
return unsafe
.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">")
.replace(/"/g, """)
.replace(/'/g, "'");
}
// 发送消息函数
async function sendMessage() {
const content = userInput.value.trim();
if (!content) return;
// 1. 清空输入框并禁用按钮(防止重复发送)
userInput.value = "";
sendBtn.disabled = true;
sendBtn.innerHTML = '<i class="fa fa-spinner fa-spin mr-2"></i>发送中';
statusText.textContent = "AI正在思考...";
// 2. 添加用户消息到对话区
const userMsgHtml = `
<div class="flex items-start gap-3 justify-end">
<div class="bg-blue-500 text-white rounded-lg px-4 py-3 max-w-[80%]">
<p>${formatMessage(content)}</p>
</div>
<div class="w-10 h-10 rounded-full bg-gray-200 flex items-center justify-center flex-shrink-0">
<i class="fa fa-user text-gray-600"></i>
</div>
</div>
`;
chatHistory.insertAdjacentHTML("beforeend", userMsgHtml);
chatHistory.scrollTop = chatHistory.scrollHeight;
// 3. 调用后端接口获取AI回复
try {
const resp = await fetch(`${BASE_URL}/api/chat`, {
method: "POST",
headers: { "Content-Type": "application/json" },
credentials: "include", // 支持跨域会话
body: JSON.stringify({ content: content })
});
const data = await resp.json();
// 4. 添加AI回复到对话区
let aiMsgHtml = "";
if (data.status === "success") {
aiMsgHtml = `
<div class="flex items-start gap-3">
<div class="w-10 h-10 rounded-full bg-blue-100 flex items-center justify-center flex-shrink-0">
<i class="fa fa-robot text-blue-600"></i>
</div>
<div class="bg-gray-50 rounded-lg px-4 py-3 max-w-[80%]">
<p>${formatMessage(data.reply)}</p>
<p class="text-xs text-gray-500 mt-1">当前模型:${data.model}</p>
</div>
</div>
`;
statusText.textContent = "回复完成,可继续提问";
} else {
aiMsgHtml = `
<div class="flex items-start gap-3">
<div class="w-10 h-10 rounded-full bg-red-100 flex items-center justify-center flex-shrink-0">
<i class="fa fa-exclamation-circle text-red-600"></i>
</div>
<div class="bg-red-50 rounded-lg px-4 py-3 max-w-[80%]">
<p class="text-red-600">${data.error}</p>
</div>
</div>
`;
statusText.textContent = "请求失败,请重试";
}
chatHistory.insertAdjacentHTML("beforeend", aiMsgHtml);
chatHistory.scrollTop = chatHistory.scrollHeight;
} catch (err) {
// 5. 处理网络错误
const errorHtml = `
<div class="flex items-start gap-3">
<div class="w-10 h-10 rounded-full bg-red-100 flex items-center justify-center flex-shrink-0">
<i class="fa fa-exclamation-circle text-red-600"></i>
</div>
<div class="bg-red-50 rounded-lg px-4 py-3 max-w-[80%]">
<p class="text-red-600">网络错误,请检查连接后重试</p>
</div>
</div>
`;
chatHistory.insertAdjacentHTML("beforeend", errorHtml);
chatHistory.scrollTop = chatHistory.scrollHeight;
statusText.textContent = "网络错误,请重试";
} finally {
// 6. 恢复按钮状态
sendBtn.disabled = false;
sendBtn.innerHTML = '<i class="fa fa-paper-plane mr-2"></i>发送';
}
}
// 切换模型函数
async function switchModel(modelKey) {
try {
const resp = await fetch(`${BASE_URL}/api/switch-model`, {
method: "POST",
headers: { "Content-Type": "application/json" },
credentials: "include",
body: JSON.stringify({ model_key: modelKey })
});
const data = await resp.json();
if (data.status === "success") {
statusText.textContent = `已切换至${data.current_model},可继续提问`;
// 添加模型切换提示到对话区
const tipHtml = `
<div class="flex justify-center my-2">
<span class="bg-gray-100 text-gray-600 text-xs px-3 py-1 rounded-full">
已切换模型:${data.current_model}
</span>
</div>
`;
chatHistory.insertAdjacentHTML("beforeend", tipHtml);
chatHistory.scrollTop = chatHistory.scrollHeight;
} else {
statusText.textContent = data.error;
}
} catch (err) {
statusText.textContent = "模型切换失败,请重试";
}
}
// 清空对话历史函数
async function clearChat() {
if (chatHistory.children.length <= 1) {
statusText.textContent = "对话历史已为空";
return;
}
if (!confirm("确定要清空所有对话历史吗?")) return;
try {
const resp = await fetch(`${BASE_URL}/api/clear-history`, {
method: "POST",
credentials: "include"
});
const data = await resp.json();
if (data.status === "success") {
// 保留初始欢迎消息,清空其他
const welcomeMsg = chatHistory.firstElementChild;
chatHistory.innerHTML = "";
chatHistory.appendChild(welcomeMsg);
statusText.textContent = "对话历史已清空";
}
} catch (err) {
statusText.textContent = "清空失败,请重试";
}
}
// 绑定事件
chatForm.addEventListener("submit", (e) => {
e.preventDefault();
sendMessage();
});
modelSelect.addEventListener("change", (e) => {
switchModel(e.target.value);
});
clearBtn.addEventListener("click", clearChat);
userInput.addEventListener("keydown", (e) => {
if (e.key === "Enter" && !e.shiftKey) {
e.preventDefault();
sendMessage();
}
});
</script>
</body>
</html>
'''
return render_template_string(html_content)
# 接口2:处理聊天请求
@app.route("/api/chat", methods=["POST"])
@require_session
def chat():
try:
data = request.get_json()
user_content = data.get("content")
if not user_content:
return jsonify({"status": "fail", "error": "请输入消息内容"})
agent = get_current_agent()
result = agent.get_response(
user_content,
max_retries=app.config['MAX_RETRIES']
)
return jsonify(result)
except Exception as e:
return jsonify({"status": "fail", "error": f"服务器内部错误:{str(e)}"})
# 接口3:切换模型
@app.route("/api/switch-model", methods=["POST"])
@require_session
def switch_model():
try:
data = request.get_json()
model_key = data.get("model_key")
if not model_key:
return jsonify({"status": "fail", "error": "请选择模型"})
agent = get_current_agent()
result = agent.switch_model(model_key)
return jsonify(result)
except Exception as e:
return jsonify({"status": "fail", "error": f"服务器内部错误:{str(e)}"})
# 接口4:清空对话历史
@app.route("/api/clear-history", methods=["POST"])
@require_session
def clear_history():
try:
agent = get_current_agent()
result = agent.clear_history()
return jsonify(result)
except Exception as e:
return jsonify({"status": "fail", "error": f"服务器内部错误:{str(e)}"})
# 启动服务
if __name__ == "__main__":
# 确保会话目录存在
if not os.path.exists(app.config['SESSION_FILE_DIR']):
os.makedirs(app.config['SESSION_FILE_DIR'], exist_ok=True)
# 开发环境配置
app.run(host="0.0.0.0", port=5000, debug=True)
4.2 实现功能(热门模型在线使用)
基于上述智能体类,我们可以快速构建一个完整的 Python 学习辅助系统,包含以下核心功能:

- 场景化对话能力针对 Python 学习场景优化了系统提示,使智能体能够:
- 结合示例解释语法
- 提供带注释的代码
- 分步骤讲解复杂概念
- 根据用户水平调整讲解深度
- 模型切换机制提供 4 种针对性模型,满足不同学习需求:
- 通用对话模型:适合 Python 基础概念学习
- 代码专项模型:适合编程实践和调试
- 文档理解模型:适合解读官方文档和技术文章
- 快速响应模型:适合语法查询和快捷问答
- 对话管理功能
- 自动截断过长对话历史,保证响应速度
- 支持手动清空对话,重新开始学习
- 可将重要对话保存为 JSON 文件,方便复习
- 错误处理机制完善的异常捕获和错误提示,包括:
- API 请求失败处理
- 网络连接错误提示
- 无效操作的友好提示
4.3 对话/图片理解
描述图像中的内容或者对其进行分类打标,如识别人物、地点、花鸟鱼虫等。
文本生成所需的输入(提示或Prompt)可以是简单的关键词、一句话概述或是更复杂的指令和上下文信息。文本生成模型通过分析大量现有数据,学习语言模式,广泛应用于以下领域:
内容创作:自动生成新闻报道、商品介绍、短视频脚本等。
客户服务:在聊天机器人中应用,提供24小时客服支持,解答常见问题。
文本翻译:快速准确地将文本从一种语言翻译成另一种语言。
摘要生成:为长篇文章、报告、客户邮件自动生成摘要。
法律文档编写:自动化生成合同模板、法律意见书的基础框架
4.4 入参参数说明
| 参数名称 | 参数解释 | 必填 | 参数类型 |
|---|---|---|---|
| model | 模型ID | 是 | String |
| messages | “聊天上下文信息(详细参数请参照下列Messages参数说明) 提供的array类型的消息列表,包含从头到尾的对话历史” |
是 | 数组 |
| max_tokens | 本次请求返回的最大 Token 数 | 否 | integer |
| temperature | “说明: 1.影响模型输出多样性,模型已有默认参数,不传值时使用各模型推荐值,不推荐用户修改。 2.取值区间为[0.0,2.0]。较高的数值会使输出更加多样化和不可预测,而较低的数值会使其更加集中和确定。” |
否 | float |
| top_p | “说明: 1.影响输出文本的多样性。模型已有默认参数,不传值时使用各模型推荐值,不推荐用户修改。 2.取值区间为[0.0,1.0]。取值越大,生成文本的多样性越强。” |
否 | float |
| stream | “是否流式接口(boolean类型) true流式接口 false非流式接口 若不传值默认false” |
否 | boolean |
| thinking | “是否开启思考(boolean类型) true开启 false不开启 不同模型针对思考模型会自动开启或关闭,如需手动控制,请手动设置” |
否 | boolean |
五、常见问题与解决方案
在调用API和开发智能体过程中,可能会遇到一些问题,这里整理了高频问题及解决方案:
| 常见问题 | 可能原因 | 解决方案 |
|---|---|---|
| API调用返回“Invalid API key” | 1. API密钥填写错误;2. 密钥已过期 | 1. 重新核对密钥,确保无多余空格;2. 登录AiOnly控制台检查密钥状态,过期则重新创建 |
| 回复内容与智能体角色不符 | system提示不够明确,未清晰定义AI职责 | 优化system提示,例如补充“禁止回答与Python无关的问题”“代码必须包含异常处理” |
| 多轮对话上下文丢失 | 未将历史对话完整传入messages参数 | 确保每次请求时,messages包含从初始化到当前轮次的所有对话记录(参考2.3节代码) |
| 调用超时(timeout错误) | 网络波动或模型处理复杂请求耗时较长 | 1. 延长timeout参数(如设为60秒);2. 将复杂需求拆分为多个简单问题,分轮次提问 |
| 免费额度快速耗尽 | 1. 频繁调用大模型(如GPT-4);2. 单次请求输入/输出文本过长 | 1. 开发测试阶段优先使用GPT-3.5或Claude-Haiku(消耗token更少);2. 精简输入内容,避免冗余描述 |
六、总结
通过本文教程,你已经掌握了AiOnly模型服务的核心使用流程:从平台注册获取密钥,到用Python实现基础API调用,再到封装专属智能体。AiOnly的高速专线解决了海外模型的网络问题,统一API降低了多模型切换的学习成本,非常适合国内开发者快速落地AI应用。
如果你想进一步提升智能体能力,可尝试集成前端页面(如用Flask+HTML打造可视化界面)、对接数据库实现对话持久化,或接入企业内部系统实现定制化需求。快去AiOnly平台注册体验(https://www.aiionly.com/login?inviteCode=0001143),开启你的智能体开发之旅吧!
💎 现在可以免费体验,联系博主 ,还能额外领取大量体验!让ChatGPT、Claude等更多热门大模型,随时可用。
如果在开发过程中遇到任何问题,欢迎在评论区留言交流,也可以分享你的智能体应用场景,一起探讨更多可能性~
联系博主
xcLeigh 博主,全栈领域优质创作者,博客专家,目前,活跃在CSDN、微信公众号、小红书、知乎、掘金、快手、思否、微博、51CTO、B站、腾讯云开发者社区、阿里云开发者社区等平台,全网拥有几十万的粉丝,全网统一IP为 xcLeigh。希望通过我的分享,让大家能在喜悦的情况下收获到有用的知识。主要分享编程、开发工具、算法、技术学习心得等内容。很多读者评价他的文章简洁易懂,尤其对于一些复杂的技术话题,他能通过通俗的语言来解释,帮助初学者更好地理解。博客通常也会涉及一些实践经验,项目分享以及解决实际开发中遇到的问题。如果你是开发领域的初学者,或者在学习一些新的编程语言或框架,关注他的文章对你有很大帮助。
亲爱的朋友,无论前路如何漫长与崎岖,都请怀揣梦想的火种,因为在生活的广袤星空中,总有一颗属于你的璀璨星辰在熠熠生辉,静候你抵达。
愿你在这纷繁世间,能时常收获微小而确定的幸福,如春日微风轻拂面庞,所有的疲惫与烦恼都能被温柔以待,内心永远充盈着安宁与慰藉。
至此,文章已至尾声,而您的故事仍在续写,不知您对文中所叙有何独特见解?期待您在心中与我对话,开启思想的新交流。
💞 关注博主 🌀 带你实现畅游前后端!
🥇 从零到一学习Python 🌀 带你玩转Python技术流!
🏆 人工智能学习合集 🌀 搭配实例教程与实战案例,帮你构建完整 AI 知识体系
💦 注:本文撰写于CSDN平台,作者:xcLeigh(所有权归作者所有) ,https://xcleigh.blog.csdn.net/,如果相关下载没有跳转,请查看这个地址,相关链接没有跳转,皆是抄袭本文,转载请备注本文原地址。

📣 亲,码字不易,动动小手,欢迎 点赞 ➕ 收藏,如 🈶 问题请留言(或者关注下方公众号,看见后第一时间回复,还有海量编程资料等你来领!),博主看见后一定及时给您答复 💌💌💌
更多推荐


所有评论(0)