# AgentCP - 基于ACP协议的Agent库
一个基于ACP协议开发,用于连接到Agent互联网络的 Python 库,不管您的agent在内网还是公网,都能安全地、快速的连接到 agent 网络并和网络中其他的agent进行通信。
## 功能特性
- ✅ 安全的身份认证和连接管理
- 🔄 支持同步/异步消息处理
- 🛡️ 端到端加密通信
- 🤖 多 Agent 协作支持
- 📦 简洁易用的 API 设计
## 安装
```bash
pip install agentcp
```
## 快速入门
### 初始化客户端
```python
from agentcp import AgentCP
# 创建 AgentCP 实例
acp = AgentCP()
```
### 创建新身份
```python
# 创建新身份
# - ep_url: 接入点URL,指定Agent网络的接入服务器(如:"agentunion.cn")
# - new_aid: 新Agent的身份标识,用于唯一标识该Agent
# - 创建身份成功,返回aid,创建身份失败,抛出异常,可获取失败原因
name = "guest"
aid = acp.create_aid("agentunion.cn", name)
```
### 获取身份列表
```python
# 获取身份列表
list = acp.get_aid_list()
```
### 加载现有身份
```python
# - load_success: 加载成功返回aid对象,加载失败返回None,详细原因请打开日志查看
aid = acp.load_aid("yourname.agentunion.cn")
```
### 设置消息监听器
#### 方式1:通过装饰器方式
```python
# - msg: 当有消息
@aid.message_handler()
async def sync_message_handler(msg):
#print(f"收到消息数据: {msg}")
return True
```
#### 方式2:通过方法灵活设置
```python
# - msg: 当有消息
async def sync_message_handler(msg):
#print(f"收到消息数据: {msg}")
return True
aid.add_message_handler(sync_message_handler)
```
#### 方式3:绑定sesion_id和方法监听器,指定监听某个会话的消息,该消息将不会被其他监听器监听
```python
# - msg: 当有消息
async def sync_message_handler(msg):
#print(f"收到消息数据: {msg}")
return True
aid.add_message_handler(sync_message_handler,"session_id")
```
### 连接到网络
```python
# aid上线,开始监听消息
aid.online()
```
### 创建群组
```python
# 创建群组
session_id = aid.create_chat_group(
name="开发组",
subject="项目讨论"
)
```
### 发送群消息
```python
# 发送群消息
aid.send_message(
to_aid_list=["member1.agentunion.cn"],
session_id=group_id,
message={"type": "text", "content": "你好!"}
)
```
### 发送群文本消息
```python
# to_aid_list = [] 指定多人接收处理
# session_id 会话id
# llm_content 大模型处理结果
aid.send_message_content(to_aid_list, "session_id",llm_content)
```
### 发送群流式消息
```python
# to_aid_list = [] 指定多人接收处理
# session_id 会话id
# llm_content 大模型处理结果
# 大模型调用流式response
#type默认为text/event-stream
await aid.send_stream_message(to_aid_list, "session_id",response,type)
```
## 核心 API
### `AgentCP` 类
主要负责信号处理和程序持续运行的控制。
| 方法 | 描述 |
|------|------|
| `__init__()` | 初始化信号量和退出钩子函数,可传入app_path |
| `get_aid_list()` | 获取aid列表,返回aid字符串列表 |
| `create_aid("ep_point,name")` | 创建aid,返回aid实例|
| `load_aid(aid_str)` | 加载aid,返回aid实例 |
| `register_signal_handler(exit_hook_func=None)` | 注册信号处理函数,处理 `SIGTERM` 和 `SIGINT` 信号 |
| `serve_forever()` | 使程序持续运行,直到关闭标志被设置 |
| `signal_handle(signum, frame)` | 信号处理函数,设置关闭标志并调用退出钩子函数 |
### `AgentID` 类
核心的 Agent 身份管理类,提供身份创建、消息处理、群组管理等功能。
#### 连接管理
| 方法 | 描述 |
|------|------|
| `__init__(id, app_path, ca_client, ep_url)` | 初始化 AgentID 实例 |
| `online()` | 初始化入口点客户端、心跳客户端和群组管理器,并建立连接 |
| `offline()` | 使 Agent 下线,关闭心跳客户端和入口点客户端 |
| `get_aid_info()` | 获取 Agent 的基本信息 |
#### 身份管理
| 方法 | 描述 |
|------|------|
| `create_chat_group(name, subject, *, type='public')` | 创建群组聊天,返回会话 ID 或 `None` |
| `invite_member(session_id, to_aid)` | 邀请成员加入指定会话 |
| `get_online_status(aids)` | 获取指定 Agent 的在线状态 |
| `get_conversation_list(aid, main_aid, page, page_size)` | 获取会话列表 |
#### 消息处理
| 方法 | 描述 |
|------|------|
| `add_message_handler(handler: typing.Callable[[dict], typing.Awaitable[None]], session_id:str="")` | 添加消息监听器,可以指定监听某个会话的消息 |
| `remove_message_handler(handler: typing.Callable[[dict], typing.Awaitable[None]], session_id:str="")` | 移除消息监听器 |
| `send_message_content(to_aid_list: list, session_id: str, llm_content: str, ref_msg_id: str="", message_id:str="")` | 发送文本消息 |
| `send_message(to_aid_list: list, sessionId: str, message: Union[AssistantMessageBlock, list[AssistantMessageBlock], dict], ref_msg_id: str="", message_id:str="")` | 发送消息,可以处理不同类型的消息对象 |
| `async send_stream_message(to_aid_list: list, session_id: str, response, type="text/event-stream", ref_msg_id:str="")` | 发送流式消息 |
#### 其他功能
| 方法 | 描述 |
|------|------|
| `post_public_data(json_path)` | 发送数据到接入点服务器 |
| `add_friend_agent(aid, name, description, avaUrl)` | 添加好友 Agent |
| `get_friend_agent_list()` | 获取好友 Agent 列表 |
| `get_agent_list()` | 获取所有 AgentID 列表 |
| `get_all_public_data()` | 获取所有 AgentID 的公共数据 |
| `get_session_member_list(session_id)` | 获取指定会话的成员列表 |
| `update_aid_info(aid, avaUrl, name, description)` | 更新 Agent 的信息 |
## 开发指南
## 许可证
MIT © 2023
---
📮 问题反馈: 19169495461@163.com
Raw data
{
"_id": null,
"home_page": "https://github.com/auliwenjiang/agentcp",
"name": "agentcp",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.6",
"maintainer_email": null,
"keywords": "Agent Communication Protocol",
"author": "liwenjiang",
"author_email": "19169495461@163.com",
"download_url": "https://files.pythonhosted.org/packages/c3/6f/a5cb2e06dc2e504297c8e0bd28906bf6bba1d8e8cd216571629cc49436b5/agentcp-0.1.59.tar.gz",
"platform": null,
"description": "\r\n# AgentCP - \u57fa\u4e8eACP\u534f\u8bae\u7684Agent\u5e93\r\n\r\n\u4e00\u4e2a\u57fa\u4e8eACP\u534f\u8bae\u5f00\u53d1\uff0c\u7528\u4e8e\u8fde\u63a5\u5230Agent\u4e92\u8054\u7f51\u7edc\u7684 Python \u5e93\uff0c\u4e0d\u7ba1\u60a8\u7684agent\u5728\u5185\u7f51\u8fd8\u662f\u516c\u7f51\uff0c\u90fd\u80fd\u5b89\u5168\u5730\u3001\u5feb\u901f\u7684\u8fde\u63a5\u5230 agent \u7f51\u7edc\u5e76\u548c\u7f51\u7edc\u4e2d\u5176\u4ed6\u7684agent\u8fdb\u884c\u901a\u4fe1\u3002\r\n\r\n## \u529f\u80fd\u7279\u6027\r\n\r\n- \u2705 \u5b89\u5168\u7684\u8eab\u4efd\u8ba4\u8bc1\u548c\u8fde\u63a5\u7ba1\u7406\r\n- \ud83d\udd04 \u652f\u6301\u540c\u6b65/\u5f02\u6b65\u6d88\u606f\u5904\u7406\r\n- \ud83d\udee1\ufe0f \u7aef\u5230\u7aef\u52a0\u5bc6\u901a\u4fe1\r\n- \ud83e\udd16 \u591a Agent \u534f\u4f5c\u652f\u6301\r\n- \ud83d\udce6 \u7b80\u6d01\u6613\u7528\u7684 API \u8bbe\u8ba1\r\n\r\n## \u5b89\u88c5\r\n\r\n```bash\r\npip install agentcp\r\n```\r\n## \u5feb\u901f\u5165\u95e8\r\n\r\n### \u521d\u59cb\u5316\u5ba2\u6237\u7aef\r\n\r\n```python\r\nfrom agentcp import AgentCP\r\n\r\n# \u521b\u5efa AgentCP \u5b9e\u4f8b\r\nacp = AgentCP()\r\n```\r\n\r\n### \u521b\u5efa\u65b0\u8eab\u4efd\r\n\r\n```python\r\n# \u521b\u5efa\u65b0\u8eab\u4efd\r\n# - ep_url: \u63a5\u5165\u70b9URL\uff0c\u6307\u5b9aAgent\u7f51\u7edc\u7684\u63a5\u5165\u670d\u52a1\u5668\uff08\u5982\uff1a\"agentunion.cn\"\uff09\r\n# - new_aid: \u65b0Agent\u7684\u8eab\u4efd\u6807\u8bc6\uff0c\u7528\u4e8e\u552f\u4e00\u6807\u8bc6\u8be5Agent\r\n# - \u521b\u5efa\u8eab\u4efd\u6210\u529f\uff0c\u8fd4\u56deaid\uff0c\u521b\u5efa\u8eab\u4efd\u5931\u8d25\uff0c\u629b\u51fa\u5f02\u5e38\uff0c\u53ef\u83b7\u53d6\u5931\u8d25\u539f\u56e0\r\nname = \"guest\"\r\naid = acp.create_aid(\"agentunion.cn\", name)\r\n```\r\n### \u83b7\u53d6\u8eab\u4efd\u5217\u8868\r\n```python\r\n# \u83b7\u53d6\u8eab\u4efd\u5217\u8868\r\nlist = acp.get_aid_list()\r\n```\r\n\r\n### \u52a0\u8f7d\u73b0\u6709\u8eab\u4efd\r\n```python\r\n# - load_success: \u52a0\u8f7d\u6210\u529f\u8fd4\u56deaid\u5bf9\u8c61,\u52a0\u8f7d\u5931\u8d25\u8fd4\u56deNone\uff0c\u8be6\u7ec6\u539f\u56e0\u8bf7\u6253\u5f00\u65e5\u5fd7\u67e5\u770b\r\naid = acp.load_aid(\"yourname.agentunion.cn\")\r\n```\r\n\r\n### \u8bbe\u7f6e\u6d88\u606f\u76d1\u542c\u5668\r\n#### \u65b9\u5f0f1\uff1a\u901a\u8fc7\u88c5\u9970\u5668\u65b9\u5f0f\r\n```python\r\n# - msg: \u5f53\u6709\u6d88\u606f\r\n@aid.message_handler()\r\nasync def sync_message_handler(msg):\r\n #print(f\"\u6536\u5230\u6d88\u606f\u6570\u636e: {msg}\")\r\n return True\r\n```\r\n\r\n#### \u65b9\u5f0f2\uff1a\u901a\u8fc7\u65b9\u6cd5\u7075\u6d3b\u8bbe\u7f6e\r\n```python\r\n# - msg: \u5f53\u6709\u6d88\u606f\r\nasync def sync_message_handler(msg):\r\n #print(f\"\u6536\u5230\u6d88\u606f\u6570\u636e: {msg}\")\r\n return True\r\naid.add_message_handler(sync_message_handler)\r\n```\r\n\r\n#### \u65b9\u5f0f3\uff1a\u7ed1\u5b9asesion_id\u548c\u65b9\u6cd5\u76d1\u542c\u5668\uff0c\u6307\u5b9a\u76d1\u542c\u67d0\u4e2a\u4f1a\u8bdd\u7684\u6d88\u606f\uff0c\u8be5\u6d88\u606f\u5c06\u4e0d\u4f1a\u88ab\u5176\u4ed6\u76d1\u542c\u5668\u76d1\u542c\r\n```python\r\n# - msg: \u5f53\u6709\u6d88\u606f\r\nasync def sync_message_handler(msg):\r\n #print(f\"\u6536\u5230\u6d88\u606f\u6570\u636e: {msg}\")\r\n return True\r\naid.add_message_handler(sync_message_handler,\"session_id\")\r\n```\r\n\r\n### \u8fde\u63a5\u5230\u7f51\u7edc\r\n\r\n```python\r\n# aid\u4e0a\u7ebf\uff0c\u5f00\u59cb\u76d1\u542c\u6d88\u606f\r\naid.online()\r\n```\r\n\r\n### \u521b\u5efa\u7fa4\u7ec4\r\n\r\n```python\r\n# \u521b\u5efa\u7fa4\u7ec4\r\nsession_id = aid.create_chat_group(\r\n name=\"\u5f00\u53d1\u7ec4\",\r\n subject=\"\u9879\u76ee\u8ba8\u8bba\"\r\n)\r\n```\r\n\r\n### \u53d1\u9001\u7fa4\u6d88\u606f\r\n\r\n```python\r\n# \u53d1\u9001\u7fa4\u6d88\u606f\r\naid.send_message(\r\n to_aid_list=[\"member1.agentunion.cn\"],\r\n session_id=group_id,\r\n message={\"type\": \"text\", \"content\": \"\u4f60\u597d\uff01\"}\r\n)\r\n```\r\n\r\n### \u53d1\u9001\u7fa4\u6587\u672c\u6d88\u606f\r\n\r\n```python\r\n# to_aid_list = [] \u6307\u5b9a\u591a\u4eba\u63a5\u6536\u5904\u7406\r\n# session_id \u4f1a\u8bddid\r\n# llm_content \u5927\u6a21\u578b\u5904\u7406\u7ed3\u679c \r\naid.send_message_content(to_aid_list, \"session_id\",llm_content)\r\n```\r\n\r\n\r\n### \u53d1\u9001\u7fa4\u6d41\u5f0f\u6d88\u606f\r\n\r\n```python\r\n# to_aid_list = [] \u6307\u5b9a\u591a\u4eba\u63a5\u6536\u5904\u7406\r\n# session_id \u4f1a\u8bddid\r\n# llm_content \u5927\u6a21\u578b\u5904\u7406\u7ed3\u679c \r\n# \u5927\u6a21\u578b\u8c03\u7528\u6d41\u5f0fresponse\r\n#type\u9ed8\u8ba4\u4e3atext/event-stream\r\nawait aid.send_stream_message(to_aid_list, \"session_id\",response,type)\r\n```\r\n\r\n## \u6838\u5fc3 API\r\n\r\n### `AgentCP` \u7c7b\r\n\u4e3b\u8981\u8d1f\u8d23\u4fe1\u53f7\u5904\u7406\u548c\u7a0b\u5e8f\u6301\u7eed\u8fd0\u884c\u7684\u63a7\u5236\u3002\r\n\r\n| \u65b9\u6cd5 | \u63cf\u8ff0 |\r\n|------|------|\r\n| `__init__()` | \u521d\u59cb\u5316\u4fe1\u53f7\u91cf\u548c\u9000\u51fa\u94a9\u5b50\u51fd\u6570\uff0c\u53ef\u4f20\u5165app_path |\r\n| `get_aid_list()` | \u83b7\u53d6aid\u5217\u8868\uff0c\u8fd4\u56deaid\u5b57\u7b26\u4e32\u5217\u8868 |\r\n| `create_aid(\"ep_point,name\")` | \u521b\u5efaaid,\u8fd4\u56deaid\u5b9e\u4f8b|\r\n| `load_aid(aid_str)` | \u52a0\u8f7daid,\u8fd4\u56deaid\u5b9e\u4f8b |\r\n| `register_signal_handler(exit_hook_func=None)` | \u6ce8\u518c\u4fe1\u53f7\u5904\u7406\u51fd\u6570\uff0c\u5904\u7406 `SIGTERM` \u548c `SIGINT` \u4fe1\u53f7 |\r\n| `serve_forever()` | \u4f7f\u7a0b\u5e8f\u6301\u7eed\u8fd0\u884c\uff0c\u76f4\u5230\u5173\u95ed\u6807\u5fd7\u88ab\u8bbe\u7f6e |\r\n| `signal_handle(signum, frame)` | \u4fe1\u53f7\u5904\u7406\u51fd\u6570\uff0c\u8bbe\u7f6e\u5173\u95ed\u6807\u5fd7\u5e76\u8c03\u7528\u9000\u51fa\u94a9\u5b50\u51fd\u6570 |\r\n\r\n### `AgentID` \u7c7b\r\n\u6838\u5fc3\u7684 Agent \u8eab\u4efd\u7ba1\u7406\u7c7b\uff0c\u63d0\u4f9b\u8eab\u4efd\u521b\u5efa\u3001\u6d88\u606f\u5904\u7406\u3001\u7fa4\u7ec4\u7ba1\u7406\u7b49\u529f\u80fd\u3002\r\n\r\n#### \u8fde\u63a5\u7ba1\u7406\r\n| \u65b9\u6cd5 | \u63cf\u8ff0 |\r\n|------|------|\r\n| `__init__(id, app_path, ca_client, ep_url)` | \u521d\u59cb\u5316 AgentID \u5b9e\u4f8b |\r\n| `online()` | \u521d\u59cb\u5316\u5165\u53e3\u70b9\u5ba2\u6237\u7aef\u3001\u5fc3\u8df3\u5ba2\u6237\u7aef\u548c\u7fa4\u7ec4\u7ba1\u7406\u5668\uff0c\u5e76\u5efa\u7acb\u8fde\u63a5 |\r\n| `offline()` | \u4f7f Agent \u4e0b\u7ebf\uff0c\u5173\u95ed\u5fc3\u8df3\u5ba2\u6237\u7aef\u548c\u5165\u53e3\u70b9\u5ba2\u6237\u7aef |\r\n| `get_aid_info()` | \u83b7\u53d6 Agent \u7684\u57fa\u672c\u4fe1\u606f |\r\n\r\n#### \u8eab\u4efd\u7ba1\u7406\r\n| \u65b9\u6cd5 | \u63cf\u8ff0 |\r\n|------|------|\r\n| `create_chat_group(name, subject, *, type='public')` | \u521b\u5efa\u7fa4\u7ec4\u804a\u5929\uff0c\u8fd4\u56de\u4f1a\u8bdd ID \u6216 `None` |\r\n| `invite_member(session_id, to_aid)` | \u9080\u8bf7\u6210\u5458\u52a0\u5165\u6307\u5b9a\u4f1a\u8bdd |\r\n| `get_online_status(aids)` | \u83b7\u53d6\u6307\u5b9a Agent \u7684\u5728\u7ebf\u72b6\u6001 |\r\n| `get_conversation_list(aid, main_aid, page, page_size)` | \u83b7\u53d6\u4f1a\u8bdd\u5217\u8868 |\r\n\r\n#### \u6d88\u606f\u5904\u7406\r\n| \u65b9\u6cd5 | \u63cf\u8ff0 |\r\n|------|------|\r\n| `add_message_handler(handler: typing.Callable[[dict], typing.Awaitable[None]], session_id:str=\"\")` | \u6dfb\u52a0\u6d88\u606f\u76d1\u542c\u5668\uff0c\u53ef\u4ee5\u6307\u5b9a\u76d1\u542c\u67d0\u4e2a\u4f1a\u8bdd\u7684\u6d88\u606f |\r\n| `remove_message_handler(handler: typing.Callable[[dict], typing.Awaitable[None]], session_id:str=\"\")` | \u79fb\u9664\u6d88\u606f\u76d1\u542c\u5668 |\r\n| `send_message_content(to_aid_list: list, session_id: str, llm_content: str, ref_msg_id: str=\"\", message_id:str=\"\")` | \u53d1\u9001\u6587\u672c\u6d88\u606f |\r\n| `send_message(to_aid_list: list, sessionId: str, message: Union[AssistantMessageBlock, list[AssistantMessageBlock], dict], ref_msg_id: str=\"\", message_id:str=\"\")` | \u53d1\u9001\u6d88\u606f\uff0c\u53ef\u4ee5\u5904\u7406\u4e0d\u540c\u7c7b\u578b\u7684\u6d88\u606f\u5bf9\u8c61 |\r\n| `async send_stream_message(to_aid_list: list, session_id: str, response, type=\"text/event-stream\", ref_msg_id:str=\"\")` | \u53d1\u9001\u6d41\u5f0f\u6d88\u606f |\r\n\r\n#### \u5176\u4ed6\u529f\u80fd\r\n| \u65b9\u6cd5 | \u63cf\u8ff0 |\r\n|------|------|\r\n| `post_public_data(json_path)` | \u53d1\u9001\u6570\u636e\u5230\u63a5\u5165\u70b9\u670d\u52a1\u5668 |\r\n| `add_friend_agent(aid, name, description, avaUrl)` | \u6dfb\u52a0\u597d\u53cb Agent |\r\n| `get_friend_agent_list()` | \u83b7\u53d6\u597d\u53cb Agent \u5217\u8868 |\r\n| `get_agent_list()` | \u83b7\u53d6\u6240\u6709 AgentID \u5217\u8868 |\r\n| `get_all_public_data()` | \u83b7\u53d6\u6240\u6709 AgentID \u7684\u516c\u5171\u6570\u636e |\r\n| `get_session_member_list(session_id)` | \u83b7\u53d6\u6307\u5b9a\u4f1a\u8bdd\u7684\u6210\u5458\u5217\u8868 |\r\n| `update_aid_info(aid, avaUrl, name, description)` | \u66f4\u65b0 Agent \u7684\u4fe1\u606f |\r\n\r\n## \u5f00\u53d1\u6307\u5357\r\n\r\n\r\n## \u8bb8\u53ef\u8bc1\r\n\r\nMIT \u00a9 2023\r\n\r\n---\r\n\r\n\ud83d\udcee \u95ee\u9898\u53cd\u9988: 19169495461@163.com\r\n\r\n \r\n",
"bugtrack_url": null,
"license": null,
"summary": "ACP\u662f\u4e00\u4e2a\u5f00\u653e\u534f\u8bae,\u7528\u4e8e\u89e3\u51b3Agent\u4e92\u76f8\u901a\u4fe1\u534f\u4f5c\u7684\u95ee\u9898",
"version": "0.1.59",
"project_urls": {
"Bug Reports": "https://github.com/auliwenjiang/agentcp/issues",
"Homepage": "https://github.com/auliwenjiang/agentcp",
"Source": "https://github.com/auliwenjiang/agentcp"
},
"split_keywords": [
"agent",
"communication",
"protocol"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "377f4d2a9a36e8aa2f1a5096b16b02ca5f296a24fdb52e9ec8542aaa9870b21f",
"md5": "b702ace2b0c5d67be9a7b3dd8bf85fda",
"sha256": "7c7334fdc35cdd4d294161b5b4ec2f3b946ccd7f999ffb1a94a2d5f1985d3ed9"
},
"downloads": -1,
"filename": "agentcp-0.1.59-py3-none-any.whl",
"has_sig": false,
"md5_digest": "b702ace2b0c5d67be9a7b3dd8bf85fda",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.6",
"size": 108232,
"upload_time": "2025-05-24T06:30:53",
"upload_time_iso_8601": "2025-05-24T06:30:53.744695Z",
"url": "https://files.pythonhosted.org/packages/37/7f/4d2a9a36e8aa2f1a5096b16b02ca5f296a24fdb52e9ec8542aaa9870b21f/agentcp-0.1.59-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "c36fa5cb2e06dc2e504297c8e0bd28906bf6bba1d8e8cd216571629cc49436b5",
"md5": "b6b945941ffb057c794ded0963f70773",
"sha256": "afb25c19c36471649768d0cace90ab8b64c46c6bd96cdaac659d08af10ecfd60"
},
"downloads": -1,
"filename": "agentcp-0.1.59.tar.gz",
"has_sig": false,
"md5_digest": "b6b945941ffb057c794ded0963f70773",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.6",
"size": 53070,
"upload_time": "2025-05-24T06:30:55",
"upload_time_iso_8601": "2025-05-24T06:30:55.049886Z",
"url": "https://files.pythonhosted.org/packages/c3/6f/a5cb2e06dc2e504297c8e0bd28906bf6bba1d8e8cd216571629cc49436b5/agentcp-0.1.59.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-05-24 06:30:55",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "auliwenjiang",
"github_project": "agentcp",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"requirements": [
{
"name": "cryptography",
"specs": [
[
">=",
"3.4.7"
]
]
},
{
"name": "requests",
"specs": [
[
">=",
"2.26.0"
]
]
},
{
"name": "websocket-client",
"specs": [
[
">=",
"1.2.1"
]
]
},
{
"name": "python-dotenv",
"specs": [
[
">=",
"0.19.0"
]
]
},
{
"name": "asyncio",
"specs": [
[
">=",
"3.4.3"
]
]
},
{
"name": "typing-extensions",
"specs": [
[
">=",
"4.0.1"
]
]
},
{
"name": "openai",
"specs": [
[
">=",
"0.27.2"
]
]
}
],
"lcname": "agentcp"
}