欢迎光临
我们一直在努力

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

在这里插入图片描述

在这里插入图片描述

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大模型服务

  • 打开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', 'devsecretkey123456')
    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>
    .chatscrollbar::webkitscrollbar { width: 6px; }
    .chatscrollbar::webkitscrollbarthumb { background: #d1d5db; borderradius: 3px; }
    .chatscrollbar::webkitscrollbarthumb:hover { background: #9ca3af; }
    .codeblock {
    backgroundcolor: #f7f7f7;
    borderradius: 6px;
    padding: 1em;
    overflowx: auto;
    fontfamily: 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">GPT5 Chat</option>
    <option value="claude-sonnet-4.5">Claude Sonnet 4.5</option>
    <option value="gpt-5-codex">GPT5 Codex</option>
    <option value="grok-4">Grok4</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">当前模型:GPT5 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/switchmodel`, {
    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/clearhistory`, {
    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)
    未经允许不得转载:171主机测评 » AiOnly大模型服务实测:从零开始Python调用ChatGPT/Claude API,打造专属AI智能体
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址