序言
想必大家看别人能在自己的程序里面调用AI是不是很眼馋呀?没事,看完了这篇文章你也可以调用独属于你自己的AI大模型!
本文用python进行编写,如需要别的语言(如node等语言)请在评论区留言哦~
实现步骤
- 前往星火官网进行申请密钥(必不可少)
- 根据文档编写代码
- 大功告成!测试代码
GET密钥
为什么要申请密钥?
答曰:密钥就像一把钥匙,没有钥匙就打不开门,也打不开过不去心中的那道坎
ok,情感到位了接下来就是正文了😁
1. 前往讯飞开放平台注册一个账号:
- 如图点击箭头指向的位置进行注册:
2. 注册完成之后点我来到认证页面:
是企业的进行企业认证,个人的话请进行个人认证,不然调用会有很多限制~
3. 领取Spark Lite模型的无限token
ps:需要别的模型,也可以直接切换,这里用Lite进行演示
点击此处圈起来的领取无限量即可领取无限token! 领取后刷新页面显示,接着看向右侧会发现有APPKey,APPID等等的东西,这里的东西不要暴露给别人不然可能会导致恶意调用!
如下图所示,我圈起来的部分均不可暴露!!请牢记:
ok,接下来密钥等必要物品就成功获取到了,接下来我们来看看文档~
文档分析
打开这个链接即可看到文档:星火认知大模型Web API文档 | 讯飞开放平台文档中心
ps:需要websocket版本的请在评论区留言~这里先使用HTTP
来到文档中可以看到如下为参数列表,也是十分的长,到时候我们使用一个变量进行传递:
同时这里还有对请求头的要求,需要Bearer APIPassword才可以:
接下来有几个较为重要的参数我先展示出来,因为参数太多所以没展示出来的要自己看看哦~如果不懂,可以在评论区发问,我看到会回复的!
参数分析
- 第一个参数model:为必传选项,看向描述有告诉我们需要填入哪个值,此文章用的是Lite模型,那么我们就选择参数:lite(不是Lite版本的请自行更换哦~)
- 第二个参数messages:顾名思义就是用于消息设置的参数,看到他的类型为array(数组),那么他下面还有子参数要设置
- 第三个参数messages.role:为messages数组里的参数,这里有四个可选值分别为user,assistant,system,tool;这里我们选择user,即用户(想设置为其他的也可以试一试哦~)
- 第四个参数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的测试图片:
可以看到,也是回答了我们并且有了相关信息,至此恭喜你搭建成功!快去玩吧~😎
这篇文章就到这里了哦,有疑问评论区见哦~嘻嘻;最后:
如果你会了那就会了,如果不会那你就不会
有误地方请指正,接受一切合理反驳与指正(谢谢看完它)