GoHumanLoopHub开源上线,开启Agent人际协作新方式

👋 一.前言

Hi,大家好,从我做GohumanLoop想法至今几个月内已经发布了以下几个工具

  • GoHumanLoop SDK: Agent人机协同 Python库,GoHumanLoop的核心
  • gohumanloop-wework: 针对GoHumanLoop在企业微信场景下进行审批、获取信息操作的示例服务。方便用户在使用GohumanLoop时,对接到自己的企业微信环境中
  • gohumanloop-feishu: 针对GoHumanLoop在飞书场景下进行审批、获取信息等人机协同操作的示例服务。
  • gohumanloop-examples: 针对以上工具的使用的示例集合

在做的过程中,我逐渐发现要做好AI时代的人机协作,除了有各种工具之外,还需要一个集中式的管理平台,通过这个管理平台可以链接到各个业务系统,比如各类OA系统,还有其它移动端平台比如微信小程序等。 通过GoHumanLoop SDK与这个平台连接打通用户的Agent, 再通过这个平台分发和管理用户的人机交互协同,实现全场景全闭环人机协作。

这就是我们最近在做的 GoHumanLoopHub ,现在第一个版本已开源上线(坚持开源👊)

今天我们来一起看一下吧

✈️ 二.GoHumanLoopHub介绍

GoHumanLoopHub 是作为 GoHumanLoop SDK 的官方服务平台,专门用于处理人机协同的请求,提供了用户管理、API 密钥管理、任务数据、协同请求管理等功能。

💡 GoHumanLoop: A Python library empowering AI agents to dynamically request human input (approval/feedback/conversation) at critical stages. Core features:

  • Human-in-the-loop control: Lets AI agent systems pause and escalate >decisions, enhancing safety and trust.
  • Multi-channel integration: Supports Terminal, Email, API, and frameworks like LangGraph/CrewAI.
  • Flexible workflows: Combines automated reasoning with human oversight for reliable AI operations.

Ensures responsible AI deployment by bridging autonomous agents and human judgment.

🛠️ 三.技术栈&特性

  • FastAPI ------ 用于 Python 后端 API。

    • 🧰 SQLModel ------ Python 中的 SQL 数据库交互(ORM)。
    • 🔍 Pydantic ------ 被 FastAPI 使用,用于数据验证和配置管理。
    • 💾 PostgreSQL ------ 作为 SQL 数据库。
    • 🔄 Alembic ------ 数据库迁移工具。
    • 🔥 Redis ------ 用于缓存和会话存储。
    • 📖 mongodb ------ 用于存储任务数据。
  • 🚀 React ------ 用于前端开发。

    • 💃 使用 TypeScript、Hooks、Vite 等现代前端技术栈。
    • 🎨 Chakra UI ------ 前端组件库。
    • 🤖 自动生成的前端客户端。
    • 🧪 Playwright ------ 端到端测试。
    • 🦇 支持深色模式(Dark Mode)。
  • 🐋 Docker Compose ------ 用于开发和生产环境部署。

  • 🔒 默认启用安全的密码哈希。

  • 🔑 JWT(JSON Web Token)身份认证。

  • 📫 基于电子邮件的密码找回功能。

  • ✅ 使用 Pytest 进行测试。

  • 📞 Traefik ------ 作为反向代理/负载均衡器。

  • 🚢 使用 Docker Compose 部署说明,包括如何设置前端 Traefik 代理以自动处理 HTTPS 证书。

  • 🏭 基于 GitHub Actions 的 CI(持续集成)和 CD(持续部署)。

📚 四.整体架构设计

架构说明

  1. 基于 LangGraph、CrewAI 等 Agent 框架构建的智能体时,使用GoHumanLoopSDK 能更好进行人机协同,特别是在类似 Manus 长耗时场景,需要异步与 Agent 进行交互的场景,通过简单的封装即可增强人机协同能力
  2. GoHumanLoop内部提供 HumanLoop 任务管理器和请求处理提供者(Provider),通过 API 方式与 GoHumanLoopHub 进行交互
  3. GoHumanLoopHub还能与飞书、企业微信等进行集成,实现与飞书、企业微信等应用的无缝对接。需要依赖一层转换层,目前已提供对应的服务程序例子gohumanloop-feishugohumanloop-wework 后续还会继续拓展其它 OA 平台,让人机协同更好的集成到业务当中
  4. 管理人员通过GoHumanLoopHub提供的 API 接口,Agent 进行交互,提供用户信息、反馈、审批等信息。
  5. GoHumanLoopHub还提供了任务数据管理功能,Agent 可以将任务数据同步到GoHumanLoopHub中,方便后续分析和管理。

📦 五.部署运行

GoHumanLoopHub支持手动Docker运行部署

  • 确保已安装 Docker 和 Docker Compose。
  • 克隆此仓库:git clone https://github.com/ptonlix/gohumanloophub.git
  • 进入项目目录:cd gohumanloophub
  • 复制示例环境变量文件:cp .env.example .env
  • 编辑 .env 文件,配置密码、数据库连接、Redis 连接、MongoDB 连接等。
  • 启动服务:docker compose up -d
  • 访问前端应用:http://localhost:5173
  • 访问 API 文档:http://localhost:8000/docs
  • 注册一个账号并登录。
  • 创建一个 API 密钥。
  • 开始使用 GoHumanLoop SDK 开发对应的智能体。
  • 查看 GoHumanLoop 文档了解更多信息。
  • 在人机协同列表中,查看并操作 SDK 传输上来的人机协同请求。
  • 查看任务数据列表,查看 SDK 同步传输上来的任务数据。

💻 六.体验环境

目前第一个版本测试版本已发布并部署到公网,大家可以访问体验

dashboard.gohumanloop.com

可以自行使用邮箱进行账号注册

注册完成后,登陆 ➡️

目前第一个版本功能主要有以下几点

  • 仪表盘: 支持查看总任务数、总对话数、总请求数等数据,还有基本的人机协同数据
  • 任务列表:支持展示通过GoHumanLoop SDK同步上来的任务数据,任务数据中包括请求信息、状态和相应的审批信息等
  • 人机协同:对GoHumanLoop SDK请求到GoHumanLoopHub的人机协同请求,如审批、信息、对话等
  • API密钥:生成给GoHumanLoop SDK使用的密钥和管理相关密钥

准备Demo

我准备一个测试Demo,使用LangGraph编写了一个Agent,通过GoHumanLoop SDK封装了人机协同的操作

python 复制代码
"""
LangGraph 与 GoHumanLoop 简单集成示例

这是一个最小化示例,展示如何在 LangGraph 中使用 GoHumanLoopManager 和 LangGraphAdapter
进行人机交互。

配置:
- API 地址:https://api.gohumanloop.com/api
- API KEY: gohumanloop
"""

import os
import time
from typing import TypedDict, List, Dict
from dotenv import load_dotenv

# 导入 LangGraph 相关库
from langgraph.graph import StateGraph, END

# 导入 GoHumanLoop 相关库
from gohumanloop.adapters.langgraph_adapter import HumanloopAdapter
from gohumanloop.core.interface import HumanLoopStatus
from gohumanloop import DefaultHumanLoopManager, APIProvider, GoHumanLoopManager
from gohumanloop.utils import get_secret_from_env

import logging

logging.basicConfig(level=logging.INFO)

# 设置环境变量
os.environ["GOHUMANLOOP_API_KEY"] = "AdNsDJ1F33d81tceEm-Rh8VWKJ8ouey016nBTpaHsTc"
os.environ["GOHUMANLOOP_API_BASE_URL"] = "https://api.gohumanloop.com/api"


# 定义简单状态类型
class SimpleState(TypedDict):
    messages: List[Dict[str, str]]


# 创建 LangGraphAdapter 实例
adapter = HumanloopAdapter(
    manager=GoHumanLoopManager(), # 创建 GoHumanLoopManager 实例
    default_timeout=600,  # 默认超时时间为10分钟)
)
# 定义需要人工审批的节点
@adapter.require_info(
    task_id="simple-information-test3",
    additional="这是一个简单的获取信息的示例。",
)
def get_information_node(state: SimpleState, info_result={}) -> SimpleState:
    """获取信息的节点"""
    print("获取人工信息...")
    print(f"info_result: {info_result}")

    
    state["messages"].append({
        "role": "system",
        "content": f"已获取信息: {info_result.get('response')}"
    })
    
    return state


# 定义需要人工审批的节点
@adapter.require_approval(
    task_id="simple-approval-test3",
    additional="这是一个简单的审批示例。",
    execute_on_reject=True,
)
def human_approval_node(state: SimpleState, approval_result=None) -> SimpleState:
    """需要人工审批的节点"""
    print("人工审批完成中...")

    print(f"approval_result: {approval_result}")
    # 处理审批结果
    if approval_result:
        status = approval_result.get("status")
        response = approval_result.get("response", {})

        if status == HumanLoopStatus.APPROVED:
            state["messages"].append(
                {
                    "role": "human",
                    "content": f"审批已通过!理由: {response}",
                }
            )
        elif status == HumanLoopStatus.REJECTED:
            state["messages"].append(
                {
                    "role": "human",
                    "content": f"审批被拒绝。理由: {response}",
                }
            )

    return state


def final_node(state: SimpleState) -> SimpleState:
    """最终节点"""
    state["messages"].append({"role": "system", "content": "工作流程已完成!"})
    return state


# 构建工作流图
def build_simple_graph():
    """构建简单工作流图"""
    graph = StateGraph(SimpleState)

    # 添加节点
    graph.add_node("get_info", get_information_node)
    graph.add_node("human_approval", human_approval_node)
    graph.add_node("final", final_node)

    # 设置边
    graph.add_edge("get_info", "human_approval")
    graph.add_edge("human_approval", "final")
    graph.add_edge("final", END)

    # 设置入口
    graph.set_entry_point("get_info")

    return graph.compile()


# 运行工作流
def run_simple_workflow():
    """运行简单工作流"""
    with adapter:
        # 构建工作流图
        workflow = build_simple_graph()

        # 初始化状态
        initial_state = SimpleState(
            messages=[{"role": "system", "content": "开始简单工作流..."}],
        )

        # 运行工作流
        for output in workflow.stream(initial_state, stream_mode="values"):
            print(f"状态: {output}")

            # 等待一下,便于观察
            time.sleep(1)


# 主函数
if __name__ == "__main__":
    # 加载环境变量
    load_dotenv()

    # 运行工作流
    run_simple_workflow()

以上是一个简单的工作流,有两个节点,分别是get_infohuman_approval, 一个是用来获取信息,一个是来获取审批。

python 复制代码
# 创建 LangGraphAdapter 实例
adapter = HumanloopAdapter(
    manager=GoHumanLoopManager(), # 创建 GoHumanLoopManager 实例
    default_timeout=600,  # 默认超时时间为10分钟)
)

这两个节点都使用@HumanloopAdapter的方法require_inforequire_approval来装饰,使用GoHumanLoopManager管理器,则是要将这两个请求发向对应的GOHUMANLOOP_API_BASE_URL 的地址

我们的测试环境的API地址为:api.gohumanloop.com/api

运行测试

arduino 复制代码
uv run test1.py
  • 开始执行工作流,查看GoHumanLoopHub
  • GoHumanLoopHub收到获取信息协同请求
  • 查看一下请求的详情,可以看到对应工作流节点的上下文信息
  • 处理请求,输入响应信息
  • 接收到从LangGraph工作流发送的审批请求
  • 同意该请求
  • 查看LangGraph工作流,已完成

以上就是我们这个LangGraph框架下GoHumanLoopHub体验Demo的例子

更多例子,欢迎你来探索~ 记得到时候将你的例子发给我~ 🤝🤝🤝

📖 七. 总结

以上就是本期介绍GoHumanLoopHub介绍和基本教程全部内容了,如果觉得本文对您有帮助的话,别忘了点赞收藏转发, 谢谢~

项目地址:

GoHumanLoopHub

参与贡献:

GoHumanLoopHub 和文档均开源,欢迎大家以问题、文档和 PR 等形式做出贡献。

更多信息欢迎你前往查看相关代码仓库

欢迎您的 Star 🌟🌟🌟~

相关推荐
数据智能老司机1 分钟前
面向企业的图学习扩展——图简介
人工智能·机器学习·ai编程
雨落倾城夏未凉19 分钟前
5.通过拷贝构造函数复制一个对象,假如对象的成员中有个指针类型的变量,如何避免拷贝出来的副本中的该成员之下行同一块内存(等价于默认拷贝构造函数有没有缺点)
c++·后端
雨落倾城夏未凉21 分钟前
4.深拷贝VS浅拷贝
c++·后端
dl74324 分钟前
一文看懂spring配置原理
后端
ERP老兵_冷溪虎山27 分钟前
IDEA 幽灵触手实锤!Python 文件一开,Anaconda 全局库让 JDK 编译慢 2-4 秒(附截图证据)
后端
阿华的代码王国35 分钟前
【Android】适配器与外部事件的交互
android·xml·java·前端·后端·交互
写bug写bug35 分钟前
分布式锁的使用场景和常见实现(下)
分布式·后端·面试
Postkarte不想说话36 分钟前
Debian13编译安装FreeSWITCH
后端
mit6.82437 分钟前
[AI React Web] 包与依赖管理 | `axios`库 | `framer-motion`库
前端·人工智能·react.js
SimonKing40 分钟前
Mybatis批量插入,形式不同性能也不同
数据库·后端·程序员