小白也能搞定!Python 零基础玩转星火大模型 API,打造自己的专属接口

序言

想必大家看别人能在自己的程序里面调用AI是不是很眼馋呀?没事,看完了这篇文章你也可以调用独属于你自己的AI大模型

本文用python进行编写,如需要别的语言(如node等语言)请在评论区留言哦~

实现步骤

  1. 前往星火官网进行申请密钥(必不可少)
  2. 根据文档编写代码
  3. 大功告成!测试代码

GET密钥

为什么要申请密钥?

答曰:密钥就像一把钥匙,没有钥匙就打不开门,也打不开过不去心中的那道坎

ok,情感到位了接下来就是正文了😁

1. 前往讯飞开放平台注册一个账号:

  • 如图点击箭头指向的位置进行注册:

2.  注册完成之后点我来到认证页面:

企业的进行企业认证,个人的话请进行个人认证,不然调用会有很多限制~

 3. 领取Spark Lite模型的无限token

ps:需要别的模型,也可以直接切换,这里用Lite进行演示

点击此处圈起来的领取无限量即可领取无限token! 领取后刷新页面显示,接着看向右侧会发现有APPKey,APPID等等的东西,这里的东西不要暴露给别人不然可能会导致恶意调用

如下图所示,我圈起来的部分均不可暴露!!请牢记:

ok,接下来密钥等必要物品就成功获取到了,接下来我们来看看文档

文档分析

打开这个链接即可看到文档:星火认知大模型Web API文档 | 讯飞开放平台文档中心

ps:需要websocket版本的请在评论区留言~这里先使用HTTP

来到文档中可以看到如下为参数列表,也是十分的长,到时候我们使用一个变量进行传递:

同时这里还有对请求头的要求,需要Bearer APIPassword才可以:

 接下来有几个较为重要的参数我先展示出来,因为参数太多所以没展示出来的要自己看看哦~如果不懂,可以在评论区发问,我看到会回复的!

 参数分析

  1. 第一个参数model:为必传选项,看向描述有告诉我们需要填入哪个值,此文章用的是Lite模型,那么我们就选择参数:lite(不是Lite版本的请自行更换哦~)
  2. 第二个参数messages:顾名思义就是用于消息设置的参数,看到他的类型为array(数组),那么他下面还有子参数要设置
  3. 第三个参数messages.role:为messages数组里的参数,这里有四个可选值分别为user,assistant,system,tool;这里我们选择user,即用户(想设置为其他的也可以试一试哦~)
  4. 第四个参数messages.content:为messages数组里的参数,这里就是要传入需要询问的内容

那么文档部分结束,是时候Coding了!

Coding Time

还记得我们的文章题目吗?没错是打造自己的AI接口,那么我们这里选用fastapi库进行接口编写,然后还需要requests(发送请求),fake_useragent(随机请求头)进行辅助,那么我们来安装一下这些库:

pip insrall fastapi
pip insrall requests
pip insrall fake_useragent

打开IDE我这里选择的是Pycharm新建一个项目然后用IDE打开并且新建一个main.py文件,开始编写代码,因为这篇文章是描述如何搭建自己的AI接口所以对代码不做过多解释:

# HTTPException,FakeUserAgentError是用于捕捉错误用的
from fastapi import FastAPI, Header, Query, HTTPException
from fake_useragent import UserAgent, FakeUserAgentError
import requests
import json

# 实例化UserAgent,fastapi对象
ua = UserAgent()
app = FastAPI()

# 对访问根页面的get请求进行处理
@app.get("/")
def read_root():
    return {"msg": "success"}

# 对访问/api/XHchat的get请求进行处理
@app.get("/api/XHchat")
async def getAiChat(
        question: str = Query(None, description="用户问题"),
        APIPassword: str = Header(None, description="API访问凭证"),
        model: str = Query(None, description="模型版本")
):
    # 检查必填参数,没填就返回错误
    missing_params = []
    if not question:
        missing_params.append("question")
    if not APIPassword:
        missing_params.append("APIPassword")
    if not model:
        missing_params.append("model")

    if missing_params:
        raise HTTPException(
            status_code=400,
            detail={
                "code": 400,
                "msg": "缺少必填参数",
                "missing_params": missing_params,
                "detail": f"请提供以下参数: {', '.join(missing_params)}"
            }
        )

    # 检查model值是否为valid_models里的一个,不是就返回错误
    valid_models = ["lite", "generalv3", "pro-128k", "generalv3.5", "max-32k", "4.0Ultra"]
    if model not in valid_models:
        raise HTTPException(
            status_code=400,
            detail={
                "code": 400,
                "msg": "模型参数错误",
                "valid_models": valid_models,
                "detail": f"无效的模型名称: {model}"
            }
        )

    # 请求头部分
    headers = {
        "Authorization": f"Bearer {APIPassword}",
        "Content-Type": "application/json"
    }

    # 随机User-Agent
    try:
        ua = UserAgent()
        headers["User-Agent"] = ua.random
    except FakeUserAgentError:
        # 如果引发了FakeUserAgentError错误的代码
        headers["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"

    # 请求数据,可以参考文档进行增加哦~
    payload = {
        "model": model,
        "messages": [{"role": "user", "content": question}],
        # 这里的tools如果是Lite模型不会生效,详细看官方文档!
        "tools": [{
            "type": "web_search",
            "web_search": {
                "enable": True,
                "show_ref_label": True,
                "search_mode": "deep"
            }
        }]
    }

    try:
        response = requests.post(
            "https://spark-api-open.xf-yun.com/v1/chat/completions",
            headers=headers,
            data=json.dumps(payload),
            timeout=15
        )

        # 检查响应状态
        if response.status_code != 200:
            error_detail = f"API返回错误: HTTP {response.status_code}"
            try:
                error_detail = f"{error_detail} - {response.json().get('error', {}).get('message', '未知错误')}"
            except:
                error_detail = f"{error_detail} - {response.text[:200]}"

            raise HTTPException(
                status_code=500,
                detail={
                    "code": 501,
                    "msg": "请求失败",
                    "detail": error_detail
                }
            )

        # 解析响应
        response_data = response.json()

        # 成功响应
        return {
            "AnswerTime": int(time.time() * 1000),
            "msg": "Success!",
            "code": 200,
            "question": question,
            "answer": response_data['choices'][0]['message']['content'],
            "usage": response_data['usage'],
            "model": model,
            "author": "接口管理员:梦蝶"
        }

    except requests.exceptions.Timeout:
        raise HTTPException(
            status_code=500,
            detail={
                "code": 503,
                "msg": "请求超时",
                "detail": "响应超时,请稍后重试"
            }
        )

    except requests.exceptions.ConnectionError:
        raise HTTPException(
            status_code=500,
            detail={
                "code": 504,
                "msg": "连接失败",
                "detail": "无法连接到服务器"
            }
        )

    except (KeyError, ValueError) as e:
        raise HTTPException(
            status_code=500,
            detail={
                "code": 502,
                "msg": "响应解析错误",
                "detail": f"处理响应时出错: {str(e)}"
            }
        )

    except requests.exceptions.RequestException as e:
        raise HTTPException(
            status_code=500,
            detail={
                "code": 505,
                "msg": "请求异常",
                "detail": f"发送请求时出错: {str(e)}"
            }
        )

if __name__ == '__main__':
    # 设置在3030端口启动
    os.system(f'uvicorn main:app --host 127.0.0.1 --port 3030 --reload ')

我在这些代码里面添加了一些注释,如果有不懂的请在评论区提出哦~看到了会答复的!例外APIPassword的值要放在请求头里哦~

API测试

以下是Postman的测试图片:

可以看到,也是回答了我们并且有了相关信息,至此恭喜你搭建成功!快去玩吧~😎 


这篇文章就到这里了哦,有疑问评论区见哦~嘻嘻;最后:

如果你会了那就会了,如果不会那你就不会

有误地方请指正,接受一切合理反驳与指正(谢谢看完它) 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值