在这里插入图片描述

在这里插入图片描述

AiOnly大模型服务实测:从零开始Python调用ChatGPT/Claude API,打造专属AI智能体

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

在这里插入图片描述

一、关于AiOnly

AiOnly大模型

1.1 AiOnly的基础概念

AiOnly是一站式Mass模型服务平台,聚焦降低模型应用门槛,加速场景智能化进程,以一键调用、敏捷开发为核心,整合全球前沿模型,通过标准化API接口与模块化组件,将复杂模型技术转化为可快速集成的“智能积木”。

1.2 AiOnly的模型服务

AiOnly提供企业级API服务,极大降低了海外访问成本,以及模型Token使用成本,同时,平台调用支持高并发,多账号轮询超越原厂水平,并提供了高速专线,可畅享全球顶尖大模型,包括GPT、Claude、Gemini等最新模型,也可在线体验文本/图片/视频大模型的强大性能。

二、AiOnly平台注册与API密钥获取

要调用 AiOnly 的 API,首先需要完成平台注册并获取 API 密钥,这是所有操作的基础,步骤简单无门槛。

2.1 平台注册流程

AiOnly大模型服务

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

2.2 领取免费额度与创建API密钥

在这里插入图片描述

  1. 完成注册后即可获得token免费体验额度,可在控制台卡券中心确认,足够完成前期开发测试;

  2. 开通自己想应用的大模型,我这里选择的是GPT-5-Chat ,大家可以根据自己的需求选择对应的模型,然后开通服务。
    在这里插入图片描述

  3. 点击左侧菜单栏“API Key”,进入密钥创建页面;
    在这里插入图片描述

  4. 点击“新建密钥”,输入密钥名称(如“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, "&amp;")
                .replace(/</g, "&lt;")
                .replace(/>/g, "&gt;")
                .replace(/"/g, "&quot;")
                .replace(/'/g, "&#039;");
        }

        // 发送消息函数
        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 学习辅助系统,包含以下核心功能:

在这里插入图片描述

  1. 场景化对话能力针对 Python 学习场景优化了系统提示,使智能体能够:
  • 结合示例解释语法
  • 提供带注释的代码
  • 分步骤讲解复杂概念
  • 根据用户水平调整讲解深度
  1. 模型切换机制提供 4 种针对性模型,满足不同学习需求:
  • 通用对话模型:适合 Python 基础概念学习
  • 代码专项模型:适合编程实践和调试
  • 文档理解模型:适合解读官方文档和技术文章
  • 快速响应模型:适合语法查询和快捷问答
  1. 对话管理功能
  • 自动截断过长对话历史,保证响应速度
  • 支持手动清空对话,重新开始学习
  • 可将重要对话保存为 JSON 文件,方便复习
  1. 错误处理机制完善的异常捕获和错误提示,包括:
  • 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/,如果相关下载没有跳转,请查看这个地址,相关链接没有跳转,皆是抄袭本文,转载请备注本文原地址。


在这里插入图片描述

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

Logo

更多推荐