一个中转代码,底层调用openai,上层 模拟openai

news/2024/10/1 7:33:16

openai的调用api几乎成为了实质性的大模型社区的调用标准,你看不论是阿里的灵积,智谱,together,vllm,ollama,fastchat等都支持openai的调用方式,所以这也是大势所趋,

有时候我们想做个中间层,底层调用大模型,上层提供业务服务,特别是许多公司的多节点的agent,如果我们都保持一致那么统一性就很好了

代码如下,代码不是很精细,个别小细节需要改下,但是整体不影响使用和借鉴:

import time
import json
import asyncio
from typing import List, Optionalimport uvicorn
from openai import OpenAI
from fastapi import FastAPI
from pydantic import BaseModel
from starlette.responses import StreamingResponseapp = FastAPI(title="OpenAI-compatible API")class ChatMessage(BaseModel):role: strcontent: strclass ChatCompletionRequest(BaseModel):model: str = "mock-gpt-model"messages: List[ChatMessage]max_tokens: Optional[int] = 512temperature: Optional[float] = 0.1stream: Optional[bool] = Falseclass CallOpenAI:'''调用底层大模型的部分 '''def __init__(self):self.client = OpenAI(api_key="EMPTY",base_url="http://127.0.0.1:9001/v1")def invoke(self,messages):messages=[{'role':'user','content':messages}]completion = self.client.chat.completions.create(model='Qwen2-72-gptq-int4',messages=messages,
#          temperature = 0.5,max_tokens=500,
#          top_p=1.0,
#          presence_penalty=0.0,
#          frequency_penalty = 0.0stream=True)return completion
model = CallOpenAI()async def _resp_async_generator1(text_resp: str):response = model.invoke(text_resp)stream_messages = ''for chunk in response:content = chunk.choices[0].delta.contentstream_message = contentif not content:stream_message = ''stream_messages += stream_messagechunk = {"id": 1,"object": "chat.completion.chunk","created": time.time(),"model": "blah","choices": [{"delta": {"content": stream_message}}],}yield f"data: {json.dumps(chunk)}\n\n"await asyncio.sleep(0)yield "data: [DONE]\n\n"@app.post("/v1/chat/completions")
async def chat_completions(request: ChatCompletionRequest):if request.messages:resp_content = "As a mock AI Assitant, I can only echo your last message:" + request.messages[-1].contentelse:resp_content = "As a mock AI Assitant, I can only echo your last message, but there wasn't one!"resp_content = '请基于春天写一篇1000字的文章'if request.stream:return StreamingResponse(_resp_async_generator1(resp_content), media_type="application/x-ndjson")return {"id": "1337","object": "chat.completion","created": time.time(),"model": request.model,"choices": [{"message": ChatMessage(role="assistant", content=resp_content)        }]}if __name__ == '__main__':uvicorn.run(app, host="0.0.0.0", port=8000)

拉起如下

写个代码测试下:

from openai import OpenAI# init client and connect to localhost server
client = OpenAI(api_key="fake-api-key",base_url="http://localhost:8000/v1/" # change the default port if needed
)stream = client.chat.completions.create(model="mock-gpt-model",messages=[{"role": "user", "content": "Say this is a test"}],stream=True,
)for chunk in stream:print(chunk.choices[0].delta.content or "",end='',flush=True)

结果如下图进行流式输出

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/45040.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

Generative News Recommendation论文阅读笔记

Generative News Recommendation论文阅读笔记 Abstract 现存的问题: ​ 大多数现有的新闻推荐方法都是通过在候选新闻和历史点击新闻产生的用户表示之间进行语义匹配来解决这一任务。然而,他们忽略了不同新闻文章之间的高级联系,也忽略了这些新闻文章与用户之间的深刻关系。…

Windows11[虚拟机] Kettle 通过SSH隧道 连接远程[Mac] Mysql数据库

Kettle无法直接连接使用SSH通道的MySQL,需要通过SSH隧道(推荐),具体操作如下所示: 一、搭建Xshell SSH 隧道转发 1、点击“连接” 借助Xshell7,首先创建会话mac(名字随便写),右键-->属性,在弹出窗口中填写名称(随便写),填写主机:SSH隧道的ip地 点击“添加”按钮出…

Linux之JDK安装

JDKjdk 即 Java Development Kit(Java开发工具包),包括了java运行环境,基础类库和一些java工具,是java运行的基础。简单来说 凡是需要java运行的程序都需要安装jdk。下载 官方下载网址 登录并下载安装包安装JDK # pwd /data/apps/ # ll jdk-8u411-linux-x64.tar.gz -rw-r-…

记一次 .NET某机械臂上位系统 卡死分析

一:背景 1. 讲故事 前些天有位朋友找到我,说他们的程序会偶发性的卡死一段时间,然后又好了,让我帮忙看下怎么回事?窗体类的程序解决起来相对来说比较简单,让朋友用procdump自动抓一个卡死时的dump,拿到dump之后,上 windbg 说话。 二:WinDbg 分析 1. 主线程在做什么 要…

什么是SC命令

一、SC命令是XP系统中功能强大的DOS命令,SC命令能与“服务控制器”和已安装设备进行通讯。二、SC.exe提供的功能类似于“控制面板”中“管理工具”项中的“服务” 三、SC命令主要的几个功能: 1. 更改服务的启动状态(这是比较有用的一个功能) ,可以设置存储在注册表中的服务属…

如何基于项目人力和管线方案选择FGUI和UGUI

1)如何基于项目人力和管线方案选择FGUI和UGUI2)TMP字体出包丢失字体描边3)如何将一张贴图经过Shader处理后的结果输出给另外一个Shader使用4)为什么我的水这么干净,和UE教程里的有差别这是第390篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子…

部署搭建帮帮派平台的手册

一、目的 二、过程: 首先有自己的服务器然后会重置一下 然后进入之后上传文件: 创建两个文件夹子: 一个是tools 另一个是helper 解压文件到目录下: 对zip文件来说(防止乱码的问题)unzip -O CP936 基于django的帮帮派在线交易服务平台.zip[root@iZt4n6uqh3zrvvzxfdo3xlZ h…

解决非小程序运行环境,不能调用wx.login()生成code

参考: https://www.cnblogs.com/du-jun/p/12720945.html https://www.cnblogs.com/1zero1/p/13470610.html 1.先调用接口 https://mp.weixin.qq.com/debug/cgi-bin/webdebugger/refreshticket?os=darwin&clientversion=1062402040 生成newticket 2.调用接口 https://serv…