news 2026/7/27 13:50:36

【OpenAI标准调用和异步调用Python代码例子】

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【OpenAI标准调用和异步调用Python代码例子】
fromconfigimportload_or_create_configfrommodelsimportMessagefromtypingimportOptional,List,Dict,AnyfromopenaiimportOpenAI,AsyncOpenAIimportasynciofromasyncioimportSemaphoreimportaiohttpimporttime# 可选的配置管理类def_build_messages(text:str,system_prompt:Optional[str]=None,history:Optional[List[Message]]=None)->List[Dict[str,Any]]:"""构建消息列表"""messages=[]ifsystem_prompt:messages.append({"role":"system","content":system_prompt})ifhistory:formsginhistory:messages.append({"role":msg.role,"content":msg.content})messages.append({"role":"user","content":text})returnmessagesclassLLMClient:def__init__(self,config_path:str="config.yaml",client_name:str="openai",history_max:int=10,system_prompt:Optional[str]=None,max_concurrent_requests:int=5,# 新增:最大并发数timeout:int=30,# 新增:超时时间):self.llm_client_list={}self.async_llm_client_list={}# 新增:异步客户端列表self.config=load_or_create_config(config_path)self.history=[]self.history_max=history_max self.client_name=client_name self.max_concurrent_requests=max_concurrent_requests self.timeout=timeout self.semaphore=Semaphore(max_concurrent_requests)# 并发控制# 初始化同步客户端ifself.client_name=="openai":self.llm_client_list["openai"]=OpenAI(api_key=self.config.models.openai.api_key,base_url=self.config.models.openai.base_url,timeout=timeout)# 新增:初始化异步客户端self.async_llm_client_list["openai"]=AsyncOpenAI(api_key=self.config.models.openai.api_key,base_url=self.config.models.openai.base_url,timeout=timeout)self.system_prompt=system_promptdefllm_call(self,text:str,model_name:str=None)->Optional[Message]:"""同步调用(保持原样)"""history=Noneifmodel_nameisNone:model_name=self.config.models.openai.model_nameifself.client_name=="openai":ifself.history_max>0andself.history:history=self.history[-self.history_max:]res_text=self.llm_openai_call(text,self.system_prompt,history=history,model_name=model_name,max_per_tokens=self.config.models.openai.max_per_tokens)self._add_to_history("user",text)self._add_to_history("assistant",res_text)returnres_textreturnNone# 新增:异步调用方法asyncdefallm_call(self,text:str,model_name:str=None,stream:bool=False)->Optional[str]:""" 异步调用LLM Args: text: 用户输入文本 model_name: 模型名称 stream: 是否使用流式响应 Returns: 模型回复内容 """ifmodel_nameisNone:model_name=self.config.models.openai.model_nameifself.client_name=="openai":# 获取历史记录history=Noneifself.history_max>0andself.history:history=self.history[-self.history_max:]asyncwithself.semaphore:# 并发控制ifstream:# 流式响应returnawaitself.allm_openai_call_stream(text,self.system_prompt,history=history,model_name=model_name,max_per_tokens=self.config.models.openai.max_per_tokens)else:# 普通响应res_text=awaitself.allm_openai_call(text,self.system_prompt,history=history,model_name=model_name,max_per_tokens=self.config.models.openai.max_per_tokens)self._add_to_history("user",text)self._add_to_history("assistant",res_text)returnres_textreturnNone# 新增:批量异步调用asyncdefbatch_allm_call(self,texts:List[str],model_name:str=None,max_workers:int=None)->List[str]:""" 批量异步调用LLM Args: texts: 文本列表 model_name: 模型名称 max_workers: 最大并发数 Returns: 回复列表 """ifmax_workers:self.semaphore=Semaphore(max_workers)ifmodel_nameisNone:model_name=self.config.models.openai.model_name tasks=[]fortextintexts:task=self.allm_call(text,model_name,stream=False)tasks.append(task)# 使用asyncio.gather并发执行try:results=awaitasyncio.gather(*tasks,return_exceptions=True)# 处理结果final_results=[]fori,resultinenumerate(results):ifisinstance(result,Exception):print(f"第{i}个请求失败:{str(result)}")final_results.append(f"请求失败:{str(result)}")else:final_results.append(result)returnfinal_resultsexceptExceptionase:raiseException(f"批量调用失败:{str(e)}")# 新增:异步OpenAI调用asyncdefallm_openai_call(self,text:str,system_prompt:Optional[str]=None,history:Optional[List[Message]]=None,model_name:str=None,max_per_tokens:int=4096,temperature:float=0.2,)->Optional[str]:"""异步OpenAI调用"""messages=_build_messages(text,system_prompt,history)try:response=awaitself.async_llm_client_list["openai"].chat.completions.create(model=model_nameorself.config.models.openai.model_name,messages=messages,stream=False,timeout=self.timeout)ifresponse.choicesandlen(response.choices)>0:assistant_reply=response.choices[0].message.contentreturnassistant_replyexceptasyncio.TimeoutError:raiseException("请求超时")exceptaiohttp.ClientErrorase:raiseException(f"网络错误:{str(e)}")exceptExceptionase:raiseException(f"调用模型时出错:{str(e)}")# 新增:流式响应异步调用asyncdefallm_openai_call_stream(self,text:str,system_prompt:Optional[str]=None,history:Optional[List[Message]]=None,model_name:str=None,max_per_tokens:int=4096,temperature:float=0.2,):"""流式响应异步调用(返回生成器)"""messages=_build_messages(text,system_prompt,history)try:response=awaitself.async_llm_client_list["openai"].chat.completions.create(model=model_nameorself.config.models.openai.model_name,messages=messages,stream=True,timeout=self.timeout)asyncforchunkinresponse:ifchunk.choicesandchunk.choices[0].delta.content:yieldchunk.choices[0].delta.contentexceptasyncio.TimeoutError:yield"【请求超时】"exceptExceptionase:yieldf"【错误:{str(e)}】"defllm_openai_call(self,text:str,system_prompt:Optional[str]=None,history:Optional[List[Message]]=None,model_name:str=None,max_per_tokens:int=4096,temperature:float=0.2,)->Optional[str]:"""同步OpenAI调用(保持原样)"""messages=_build_messages(text,system_prompt,history)try:response=self.llm_client_list["openai"].chat.completions.create(model=model_nameorself.config.models.openai.model_name,messages=messages,max_tokens=max_per_tokens,temperature=temperature,stream=False,)ifresponse.choicesandlen(response.choices)>0:assistant_reply=response.choices[0].message.contentreturnassistant_replyexceptExceptionase:error_msg=f"调用模型时出错:{str(e)}"raiseException(error_msg)def_add_to_history(self,role:str,content:str):"""添加消息到历史,自动管理长度"""self.history.append(Message(role=role,content=content))iflen(self.history)>self.history_max:to_remove=len(self.history)-self.history_max to_remove=to_remove-(to_remove%2)ifto_remove>0:self.history=self.history[to_remove:]# 新增:上下文管理器支持asyncdef__aenter__(self):returnselfasyncdef__aexit__(self,exc_type,exc_val,exc_tb):awaitself.close()# 新增:关闭异步客户端asyncdefclose(self):"""关闭异步客户端连接"""forclientinself.async_llm_client_list.values():ifhasattr(client,'close'):awaitclient.close()# 使用示例asyncdefexample_usage():# 1. 创建客户端client=LLMClient(config_path="config.yaml",history_max=10,system_prompt="你是一个有帮助的助手",max_concurrent_requests=3)# 2. 异步单次调用response=awaitclient.allm_call("介绍一下Python")print(f"Response:{response}")# 3. 批量调用questions=["什么是人工智能?","机器学习有哪些类型?","深度学习是什么?"]responses=awaitclient.batch_allm_call(questions,max_workers=2)fori,respinenumerate(responses):print(f"Q{i+1}:{questions[i][:30]}...")print(f"A{i+1}:{resp[:50]}...")print()# 运行示例if__name__=="__main__":# 运行异步示例asyncio.run(example_usage())
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/22 9:44:28

MajsoulMax 雀魂辅助工具:解锁角色装扮与麻将策略分析的完整指南

MajsoulMax 雀魂辅助工具:解锁角色装扮与麻将策略分析的完整指南 【免费下载链接】MajsoulMax 项目地址: https://gitcode.com/gh_mirrors/ma/MajsoulMax MajsoulMax 是一款专业的雀魂辅助工具,通过先进的中间人攻击技术为玩家提供全方位的游戏体…

作者头像 李华
网站建设 2026/7/23 19:56:48

CosyVoice3能否防止deepfake滥用?内置水印机制建议

CosyVoice3 与防 deepfake 滥用:内置水印机制的必要性与实现路径 在某次网络直播中,一段“知名企业家呼吁投资虚拟币”的语音迅速传播,语气熟悉、口音地道,甚至带有标志性的停顿习惯。数小时后,当事人紧急辟谣——这是…

作者头像 李华
网站建设 2026/7/24 14:31:54

Elasticsearch内存模型入门必看:初学者的资源管理基础课

Elasticsearch内存模型入门必看:初学者的资源管理基础课在部署和运维Elasticsearch的过程中,很多新手都会遇到一个看似简单却影响深远的问题:为什么我的节点频繁GC?查询延迟越来越高?甚至莫名其妙地宕机?答…

作者头像 李华
网站建设 2026/7/26 1:03:52

终极指南:5分钟快速部署TeamSpeak3音乐机器人TS3AudioBot

终极指南:5分钟快速部署TeamSpeak3音乐机器人TS3AudioBot 【免费下载链接】TS3AudioBot Advanced Musicbot for Teamspeak 3 项目地址: https://gitcode.com/gh_mirrors/ts/TS3AudioBot 还在为单调的语音聊天环境而烦恼吗?想要让团队语音频道变得…

作者头像 李华
网站建设 2026/7/20 17:41:10

5个技巧彻底解决Blender与Unity协作难题

5个技巧彻底解决Blender与Unity协作难题 【免费下载链接】blender-to-unity-fbx-exporter FBX exporter addon for Blender compatible with Unitys coordinate and scaling system. 项目地址: https://gitcode.com/gh_mirrors/bl/blender-to-unity-fbx-exporter 在3D游…

作者头像 李华