首页 > 其他分享 >openAI assistants的自定义函数调用——类似HiAgent

openAI assistants的自定义函数调用——类似HiAgent

时间:2024-05-22 17:54:59浏览次数:22  
标签:function run 自定义 thread 函数调用 openAI print Run id

openAI assistants的自定义函数调用功能

先添加函数:

 

和字节的hiagent非常相似。

定义好函数以后。然后就是在客户端通过如下代码调用:

 

 

# 读取系统变量
from dotenv import load_dotenv
load_dotenv()  

from openai import OpenAI
# 初始化客户端
client = OpenAI()

# 检索您之前创建的Assistant
assistant_id = "asst_pF2pMtIHOL4CpXpyUdHkoKG3" # 你自己的助手ID
# thread_id = 'thread_ZBhfduW0rklxu120EnIH0QZT'

# 创建一个新的Thread
thread = client.beta.threads.create()
print(thread)
thread_id = thread.id

# 向Thread添加用户的消息
message = client.beta.threads.messages.create(
    thread_id=thread_id,
    # thread_id='thread_xSyXlruUzMIW1zD8rQUP3aFp',
    role="user",
    content="快安慰一下伤心的小雪!"
)
print(message)

# 运行Assistant来处理Thread
run = client.beta.threads.runs.create(
  thread_id=thread_id,
  assistant_id=assistant_id
)
print(run)

# 轮询Run,从'queue'等到'requires_action'
import time
# 定义一个轮询的函数
def poll_run_status(client, thread_id, run_id, interval=2):
    """ 轮询Run的状态,直到它不再是'requires_action'或直到完成 """
    while True:
        run = client.beta.threads.runs.retrieve(thread_id=thread_id, 
                                                       run_id=run_id)
        print(run)
        if run.status in ['requires_action', 'completed']:
            return run
        time.sleep(interval)  # 等待后再次检查

# 轮询以检查Run的状态
print('这时,Run应该是进入了requires_action状态')
run = poll_run_status(client, thread_id, run.id)
print(run)

# 定义一个从Run中读取Function信息的函数
def get_function_details(run):
  
  function_name = run.required_action.submit_tool_outputs.tool_calls[0].function.name
  arguments = run.required_action.submit_tool_outputs.tool_calls[0].function.arguments
  function_id = run.required_action.submit_tool_outputs.tool_calls[0].id 

  return function_name, arguments, function_id

# 拿到Function的元数据信息
function_name, arguments, function_id = get_function_details(run)
print("function_name:", function_name)
print("arguments:", arguments)
print("function_id:", function_id)

# 再次检查Run的状态 - 不需要轮询 -- 一直是Queue
print('这时,Run已经从requires_action出来了')
run = client.beta.threads.runs.retrieve(thread_id=thread_id, 
                                                run_id=run.id)
print(run)

# 定义鼓励函数
def get_encouragement(name, mood):
    # 基础鼓励消息
    messages = {
        "happy": "继续保持积极的心态,做得好!",
        "sad": "记住,即使在最黑暗的日子里,也会有阳光等待着你。",
        "tired": "你做得足够好了,现在是时候休息一下了。",
        "stressed": "深呼吸,一切都会好起来的。"
    }
    
    # 获取对应心情的鼓励消息
    message = messages.get(mood.lower(), "你今天感觉如何?我总是在这里支持你!")
    
    # 返回定制化的鼓励消息
    return f"亲爱的{name},{message}"

# ---- 这里,我可要动态调用程序了!!!
import json

# 定义可用的函数字典
available_functions = {
    "get_encouragement": get_encouragement
}

# 解析参数
function_args = json.loads(arguments)

# 动态调用函数
function_to_call = available_functions[function_name]
encouragement_message = function_to_call(
    name=function_args.get("name"),
    mood=function_args.get("mood")
)

# 打印结果以进行验证
print(encouragement_message)

# 向Run提交结果
def submit_tool_outputs(run,thread,function_id,function_response):
    run = client.beta.threads.runs.submit_tool_outputs(
    thread_id=thread.id,
    run_id=run.id,
    tool_outputs=[
      {
        "tool_call_id": function_id,
        "output": str(function_response),
      }
    ]
    ) 
    return run

run = submit_tool_outputs(run,thread,function_id,encouragement_message)
print('这时,Run收到了结果')
print(run)

print('这时,Run继续执行直至完成')
# 再次轮询Run直至完成
run = poll_run_status(client, thread_id, run.id) 
print(run)

# 获取Assistant在Thread中的回应
messages = client.beta.threads.messages.list(
  thread_id=thread_id
)

# 输出Assistant的回应
print('下面打印最终的Message')
for message in messages.data:
    if message.role == "assistant":
        print(message.content)

  

代码使用OpenAI API来创建一个客户端,并与OpenAI的助手进行交互。下面是代码的功能分析:

  1. 读取系统变量:从环境中加载变量。
  2. 初始化OpenAI客户端。
  3. 创建一个新的线程(Thread)。
  4. 添加用户的消息到线程中。
  5. 运行Assistant处理线程。
  6. 轮询Run以检查其状态直到状态不再是'requires_action'或完成。
  7. 获取Function的元数据信息。
  8. 再次检查Run的状态。
  9. 定义鼓励函数,根据心情返回鼓励消息。
  10. 解析参数并动态调用函数。
  11. 向Run提交结果。
  12. 再次轮询Run直至完成。
  13. 获取Assistant在线程中的回应并输出。

总体而言,该代码用于与OpenAI的助手进行交互,实现了用户与助手之间的消息传递和交流,并通过动态调用函数来生成鼓励性消息。

标签:function,run,自定义,thread,函数调用,openAI,print,Run,id
From: https://www.cnblogs.com/bonelee/p/18206799

相关文章

  • 摸清自定义流程表单开发优点 实现降本增效!
    随着社会竞争压力的增大,很多企业都希望实现降本增效提质的办公效果。那么,借助什么样的软件平台可以让企业在提升市场竞争力的前提下,还能降低开发成本,提高成效?低代码技术平台是目前流行于中小企业办公职场中的平台产品,其中自定义流程表单开发优势特点多、灵活高效、可视化操作界面,......
  • 【unity】在EditorWindow添加自定义的Toolbar按钮
    好久没写了,最近做工具,写了个EditorWindow,为了让使用者方便查看这个工具的文档,想着在导航栏加个问号按钮,点一下打开说明文档就完事~查了下unity手册,发现Unity提供了一个ShowButton 方法,用于在自定义Editor窗口的工具栏中添加自定义内容,下面是实现的例子:privateGUIStyle......
  • duilib 自定义控件
    1.主窗口自定义FramWnd继承WindowImplBase,重写CreateControl,HandleMessage.组合CPaintManagerUI.2.自定义控件自定义mycontrol继承CControlUI重写DoEvent,DoPaint,SetPos.main.cpp#include"FramWnd.h"intAPIENTRYWinMain(HINSTANCEhInstance,HINSTANCE/*hPrev......
  • Python:自定义类或模块时的注意事项
     Python进阶版:定义类时应用的9种最佳做法1.好的命名2.显式实例属性3.使用属性——但要精简4.定义有意义的字符串表示法5.实例方法,类方法和静态方法6.使用私有属性进行封装7.分离关注点和解耦8.考虑使用__slots__进行优化9.文件 1.好的命名定义自己的类,就......
  • keycloak~自定义认证流设置固定redirect_uri
    redirect_uri在keycloak进行认证成功之后,会重定向到这个目标页面,一般为用户的来源页,即你在登录之前访问的页面;自定义认证流是指对keycloak中的brower和directgrant两个认证方式的过程添加自定义策略,如在用户登录成功时,检查它的密码强度,如果不符合要求,就跳到一个说明页面,告诉用户,......
  • 自定义分页控件
    自定义分页控件tip:该控件的样式用的是materialDesign库,需要下载Nuget包CodeXaml<UserControlx:Class="TestTool.CustomControls.PagingControl"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.mic......
  • 自定义可移动点二维坐标轴控件
    自定义可移动点二维坐标轴控件目录路由参数坐标轴控件定义Demo路由参数X_YResultCollection为当前X轴对应Y轴值存储字典publicclassResultCollectionChangedEventArgs(RoutedEventroutedEvent,objectsource,IDictionary<double,double>resultCollection):Route......
  • 不同场景下的构造函数调用
    本文为对不同场景下的构造函数调用进行跟踪。构造函数默认情况下,在C++之后至少存在六个函数默认构造/析构函数,复制构造/复制赋值,移动构造/移动赋值。以下代码观测发生调用的场景#include<iostream>structFoo{Foo():fd(0){std::cout<<"Foo::Foo()this="<<......
  • form-create-designer中怎么扩展自定义组件
    form-create-designer中怎么扩展自定义组件form-create-designer是基于 @form-create/element-ui实现的表单设计器组件。可以通过拖拽的方式快速创建表单,提高开发者对表单的开发效率,节省开发者的时间。FormCreate官网:https://www.form-create.com帮助文档:https://pro.form-cr......
  • 高并发系统-使用自定义日志埋点快速排查问题
    背景在高并发的系统中,通常不会打印除参数校验失败或捕获异常之外的日志,防止对接口的性能产生影响。那对于请求不符合预期的情况,我们如何快速找到是哪块逻辑影响的至关重要。Pfinder提供的链路监控,更多的是性能层面的监控,无法满足我们上述的诉求。下面我将通过自定义通用上下......