agentx-python 0.2.1__py3-none-any.whl → 0.3.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- agentx/__init__.py +13 -0
- agentx/agentx.py +51 -0
- agentx/resources/__init__.py +0 -0
- agentx/resources/agent.py +46 -0
- agentx/resources/conversation.py +128 -0
- agentx/util.py +5 -0
- agentx/version.py +1 -0
- agentx_python/__init__.py +2 -2
- agentx_python/agentx.py +2 -2
- agentx_python/resources/agent.py +1 -1
- agentx_python/resources/conversation.py +1 -1
- {agentx_python-0.2.1.dist-info → agentx_python-0.3.1.dist-info}/METADATA +15 -6
- agentx_python-0.3.1.dist-info/RECORD +19 -0
- {agentx_python-0.2.1.dist-info → agentx_python-0.3.1.dist-info}/WHEEL +1 -1
- agentx_python-0.3.1.dist-info/top_level.txt +1 -0
- agentx_python-0.2.1.dist-info/RECORD +0 -12
- agentx_python-0.2.1.dist-info/top_level.txt +0 -1
- {agentx_python-0.2.1.dist-info → agentx_python-0.3.1.dist-info}/LICENSE +0 -0
agentx/__init__.py
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
|
|
3
|
+
from agentx.agentx import AgentX
|
|
4
|
+
from agentx.version import VERSION
|
|
5
|
+
|
|
6
|
+
logging.basicConfig(
|
|
7
|
+
level=logging.INFO,
|
|
8
|
+
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
|
|
9
|
+
datefmt="%Y-%m-%d %H:%M:%S %Z",
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
__all__ = ["AgentX"]
|
|
13
|
+
__version__ = VERSION
|
agentx/agentx.py
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
from typing import List
|
|
2
|
+
import requests
|
|
3
|
+
import os
|
|
4
|
+
import logging
|
|
5
|
+
|
|
6
|
+
from agentx.util import get_headers
|
|
7
|
+
from agentx.resources.agent import Agent
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class AgentX:
|
|
11
|
+
|
|
12
|
+
def __init__(self, api_key: str = None):
|
|
13
|
+
self.api_key = api_key or os.getenv("AGENTX_API_KEY")
|
|
14
|
+
if self.api_key and not os.getenv("AGENTX_API_KEY"):
|
|
15
|
+
os.environ["AGENTX_API_KEY"] = self.api_key
|
|
16
|
+
|
|
17
|
+
def get_agent(self, id: str) -> Agent:
|
|
18
|
+
url = f"https://api.agentx.so/api/v1/access/agents/{id}"
|
|
19
|
+
# Make a GET request to the AgentX API
|
|
20
|
+
response = requests.get(url, headers=get_headers())
|
|
21
|
+
# Check if response was successful
|
|
22
|
+
if response.status_code == 200:
|
|
23
|
+
agent_res = response.json()
|
|
24
|
+
return Agent(
|
|
25
|
+
id=agent_res.get("_id"),
|
|
26
|
+
name=agent_res.get("name"),
|
|
27
|
+
avatar=agent_res.get("avatar"),
|
|
28
|
+
createdAt=agent_res.get("createdAt"),
|
|
29
|
+
updatedAt=agent_res.get("updatedAt"),
|
|
30
|
+
)
|
|
31
|
+
else:
|
|
32
|
+
raise Exception(f"Failed to retrieve agent: {response.reason}")
|
|
33
|
+
|
|
34
|
+
def list_agents(self) -> List[Agent]:
|
|
35
|
+
url = "https://api.agentx.so/api/v1/access/agents"
|
|
36
|
+
# Make a GET request to the AgentX API
|
|
37
|
+
response = requests.get(url, headers=get_headers())
|
|
38
|
+
# Check if response was successful
|
|
39
|
+
if response.status_code == 200:
|
|
40
|
+
return [
|
|
41
|
+
Agent(
|
|
42
|
+
id=agent_res.get("_id"),
|
|
43
|
+
name=agent_res.get("name"),
|
|
44
|
+
avatar=agent_res.get("avatar"),
|
|
45
|
+
createdAt=agent_res.get("createdAt"),
|
|
46
|
+
updatedAt=agent_res.get("updatedAt"),
|
|
47
|
+
)
|
|
48
|
+
for agent_res in response.json()
|
|
49
|
+
]
|
|
50
|
+
else:
|
|
51
|
+
raise Exception(f"Failed to list agents: {response.reason}")
|
|
File without changes
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
from typing import Optional, List
|
|
2
|
+
from pydantic import BaseModel, Field
|
|
3
|
+
import requests
|
|
4
|
+
import os
|
|
5
|
+
import logging
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
from agentx.util import get_headers
|
|
8
|
+
from .conversation import Conversation
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@dataclass
|
|
12
|
+
class Agent(BaseModel):
|
|
13
|
+
id: str
|
|
14
|
+
name: str
|
|
15
|
+
avatar: Optional[str]
|
|
16
|
+
createdAt: Optional[str]
|
|
17
|
+
updatedAt: Optional[str]
|
|
18
|
+
|
|
19
|
+
def __init__(self, **data):
|
|
20
|
+
super().__init__(**data)
|
|
21
|
+
|
|
22
|
+
def get_conversation(self, id: str) -> Conversation:
|
|
23
|
+
list_of_conversations = self.list_conversations()
|
|
24
|
+
return next(
|
|
25
|
+
(conv for conv in list_of_conversations if conv.id == id),
|
|
26
|
+
Exception("404 - Conversation not found"),
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
def list_conversations(self) -> List[Conversation]:
|
|
30
|
+
url = f"https://api.agentx.so/api/v1/access/agents/{self.id}/conversations"
|
|
31
|
+
response = requests.get(url, headers=get_headers())
|
|
32
|
+
if response.status_code == 200:
|
|
33
|
+
return [
|
|
34
|
+
Conversation(
|
|
35
|
+
agent_id=self.id,
|
|
36
|
+
id=conv_res.get("_id"),
|
|
37
|
+
title=conv_res.get("title"),
|
|
38
|
+
users=conv_res.get("users"),
|
|
39
|
+
agents=conv_res.get("bots"),
|
|
40
|
+
createdAt=conv_res.get("createdAt"),
|
|
41
|
+
updatedAt=conv_res.get("updatedAt"),
|
|
42
|
+
)
|
|
43
|
+
for conv_res in response.json()
|
|
44
|
+
]
|
|
45
|
+
else:
|
|
46
|
+
raise Exception(f"Failed to retrieve agent details: {response.reason}")
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import requests
|
|
3
|
+
from typing import Optional, List, Any, Iterator
|
|
4
|
+
from pydantic import BaseModel, Field
|
|
5
|
+
from agentx.util import get_headers
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class ChatResponse(BaseModel):
|
|
9
|
+
text: str | None
|
|
10
|
+
cot: str | None
|
|
11
|
+
botId: str
|
|
12
|
+
reference: Optional[Any]
|
|
13
|
+
tasks: Optional[Any]
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class Message(BaseModel):
|
|
17
|
+
id: str = Field(alias="_id")
|
|
18
|
+
conversationId: str
|
|
19
|
+
role: str # user or bot
|
|
20
|
+
botId: Optional[str] = Field(alias="bot", default=None)
|
|
21
|
+
userId: Optional[str] = Field(alias="user", default=None)
|
|
22
|
+
text: str | None
|
|
23
|
+
cot: str | None
|
|
24
|
+
createdAt: str
|
|
25
|
+
updatedAt: str
|
|
26
|
+
|
|
27
|
+
class Config:
|
|
28
|
+
populate_by_name = True
|
|
29
|
+
extra = "ignore"
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class Conversation(BaseModel):
|
|
33
|
+
agent_id: str
|
|
34
|
+
id: str = Field(alias="_id")
|
|
35
|
+
title: Optional[str] = Field(default=None) # conversation customized title
|
|
36
|
+
users: List[str]
|
|
37
|
+
agents: List[str] = Field(alias="bots")
|
|
38
|
+
createdAt: Optional[str]
|
|
39
|
+
updatedAt: Optional[str]
|
|
40
|
+
|
|
41
|
+
class Config:
|
|
42
|
+
populate_by_name = True
|
|
43
|
+
extra = "ignore"
|
|
44
|
+
|
|
45
|
+
def __init__(self, **data):
|
|
46
|
+
super().__init__(**data)
|
|
47
|
+
|
|
48
|
+
def new_conversation(self) -> "Conversation":
|
|
49
|
+
url = f"https://api.agentx.so/api/v1/access/agents/{self.agent_id}/conversations/new"
|
|
50
|
+
response = requests.post(
|
|
51
|
+
url,
|
|
52
|
+
headers=get_headers(),
|
|
53
|
+
json={"type": "chat"},
|
|
54
|
+
)
|
|
55
|
+
if response.status_code == 200:
|
|
56
|
+
new_conv = response.json()
|
|
57
|
+
new_conv["agent_id"] = self.agent_id
|
|
58
|
+
return Conversation(**new_conv)
|
|
59
|
+
else:
|
|
60
|
+
raise Exception(
|
|
61
|
+
f"Failed to create new conversation: {response.status_code} - {response.reason}"
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
def list_messages(self) -> List[Message]:
|
|
65
|
+
url = f"https://api.agentx.so/api/v1/access/agents/{self.agent_id}/conversations/{self.id}"
|
|
66
|
+
response = requests.get(url, headers=get_headers())
|
|
67
|
+
if response.status_code == 200:
|
|
68
|
+
res = response.json()
|
|
69
|
+
if res.get("messages"):
|
|
70
|
+
message_list = []
|
|
71
|
+
for message in res["messages"]:
|
|
72
|
+
if message.get("bot"):
|
|
73
|
+
message["role"] = "bot"
|
|
74
|
+
else:
|
|
75
|
+
message["role"] = "user"
|
|
76
|
+
message_list.append(Message(**message))
|
|
77
|
+
return message_list
|
|
78
|
+
else:
|
|
79
|
+
raise Exception("No messages found in the conversation.")
|
|
80
|
+
else:
|
|
81
|
+
raise Exception(
|
|
82
|
+
f"Failed to retrieve agent details: {response.status_code} - {response.reason}"
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
def chat(self, message: str, context: int = None):
|
|
86
|
+
url = f"https://api.agentx.so/api/v1/access/conversations/{self.id}/message"
|
|
87
|
+
response = requests.post(
|
|
88
|
+
url,
|
|
89
|
+
headers=get_headers(),
|
|
90
|
+
json={"message": message, "context": context},
|
|
91
|
+
)
|
|
92
|
+
return response.json()
|
|
93
|
+
|
|
94
|
+
def chat_stream(self, message: str, context: int = None) -> Iterator[ChatResponse]:
|
|
95
|
+
url = f"https://api.agentx.so/api/v1/access/conversations/{self.id}/jsonmessagesse"
|
|
96
|
+
response = requests.post(
|
|
97
|
+
url, headers=get_headers(), json={"message": message, "context": context}
|
|
98
|
+
)
|
|
99
|
+
result = ""
|
|
100
|
+
if response.status_code == 200:
|
|
101
|
+
buf = b""
|
|
102
|
+
for chunk in response.iter_content():
|
|
103
|
+
buf += chunk
|
|
104
|
+
try:
|
|
105
|
+
chunk = buf.decode("utf-8")
|
|
106
|
+
# yield chunk
|
|
107
|
+
except UnicodeDecodeError:
|
|
108
|
+
continue
|
|
109
|
+
result += chunk
|
|
110
|
+
buf = b""
|
|
111
|
+
try:
|
|
112
|
+
if result.count("{") == result.count("}"):
|
|
113
|
+
catch_json = json.loads(result)
|
|
114
|
+
if catch_json:
|
|
115
|
+
result = ""
|
|
116
|
+
yield ChatResponse(
|
|
117
|
+
text=catch_json.get("text"),
|
|
118
|
+
cot=catch_json.get("cot"),
|
|
119
|
+
botId=catch_json.get("botId"),
|
|
120
|
+
reference=catch_json.get("reference"),
|
|
121
|
+
tasks=catch_json.get("tasks"),
|
|
122
|
+
)
|
|
123
|
+
except json.JSONDecodeError:
|
|
124
|
+
continue
|
|
125
|
+
else:
|
|
126
|
+
raise Exception(
|
|
127
|
+
f"Failed to send message: {response.status_code} - {response.reason}"
|
|
128
|
+
)
|
agentx/util.py
ADDED
agentx/version.py
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
VERSION = "0.3.0"
|
agentx_python/__init__.py
CHANGED
agentx_python/agentx.py
CHANGED
agentx_python/resources/agent.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.2
|
|
2
2
|
Name: agentx-python
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.1
|
|
4
4
|
Summary: Offical Python SDK for AgentX (https://www.agentx.so/)
|
|
5
5
|
Home-page: https://github.com/AgentX-ai/AgentX-python-sdk
|
|
6
6
|
Author: Robin Wang and AgentX Team
|
|
@@ -11,8 +11,17 @@ Classifier: Operating System :: OS Independent
|
|
|
11
11
|
Requires-Python: >=3.6
|
|
12
12
|
Description-Content-Type: text/markdown
|
|
13
13
|
License-File: LICENSE
|
|
14
|
-
Requires-Dist: urllib3
|
|
14
|
+
Requires-Dist: urllib3>=1.26.11
|
|
15
15
|
Requires-Dist: certifi
|
|
16
|
+
Dynamic: author
|
|
17
|
+
Dynamic: author-email
|
|
18
|
+
Dynamic: classifier
|
|
19
|
+
Dynamic: description
|
|
20
|
+
Dynamic: description-content-type
|
|
21
|
+
Dynamic: home-page
|
|
22
|
+
Dynamic: requires-dist
|
|
23
|
+
Dynamic: requires-python
|
|
24
|
+
Dynamic: summary
|
|
16
25
|
|
|
17
26
|
# AgentX Python SDK API library
|
|
18
27
|
|
|
@@ -34,7 +43,7 @@ You can get an API key from https://app.agentx.so
|
|
|
34
43
|
|
|
35
44
|
### Agent
|
|
36
45
|
|
|
37
|
-
```
|
|
46
|
+
```python
|
|
38
47
|
from agentx_python import AgentX
|
|
39
48
|
|
|
40
49
|
client = AgentX(api_key="<your api key here>")
|
|
@@ -47,7 +56,7 @@ print(client.list_agents())
|
|
|
47
56
|
|
|
48
57
|
Each Conversation has `agents` and `users` tied to it.
|
|
49
58
|
|
|
50
|
-
```
|
|
59
|
+
```python
|
|
51
60
|
# get agent
|
|
52
61
|
my_agent = client.get_agent(id="<agent id here>")
|
|
53
62
|
|
|
@@ -59,7 +68,7 @@ print(my_agent.list_conversations())
|
|
|
59
68
|
|
|
60
69
|
A `chat` needs to happen in the conversation. You can do `stream` response too, default `False`.
|
|
61
70
|
|
|
62
|
-
```
|
|
71
|
+
```python
|
|
63
72
|
a_conversation = my_agent.get_conversation(id="<conversation id here>")
|
|
64
73
|
|
|
65
74
|
response = a_conversation.chat("Hello, what is your name?", stream=True)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
agentx/__init__.py,sha256=AiY83tsCtjSMIBVsvNuxOgSU4i-rCREQrqDrNmCoSd0,279
|
|
2
|
+
agentx/agentx.py,sha256=kmpAgnvtLdA3ytn0TJuDmchOQZydjuD4NSP77K3tsYM,1859
|
|
3
|
+
agentx/util.py,sha256=grYAa8YTvoQSyuy4GvUOwq6SVBRr4DdrBlcTuZwQpzw,132
|
|
4
|
+
agentx/version.py,sha256=OgfvlOui_Z4FwAja2bTJgiUkMeuAXZ561wYewaEr6SQ,18
|
|
5
|
+
agentx/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
6
|
+
agentx/resources/agent.py,sha256=SMu4H1UDL31Bub4hnaySoySeckgAchRSaAaHDpXa1L8,1521
|
|
7
|
+
agentx/resources/conversation.py,sha256=Xwy3IfFF6C7U7Xu6BNC32IOPqmaKNwCBTbN2w4FpI8w,4485
|
|
8
|
+
agentx_python/__init__.py,sha256=AiY83tsCtjSMIBVsvNuxOgSU4i-rCREQrqDrNmCoSd0,279
|
|
9
|
+
agentx_python/agentx.py,sha256=kmpAgnvtLdA3ytn0TJuDmchOQZydjuD4NSP77K3tsYM,1859
|
|
10
|
+
agentx_python/util.py,sha256=grYAa8YTvoQSyuy4GvUOwq6SVBRr4DdrBlcTuZwQpzw,132
|
|
11
|
+
agentx_python/version.py,sha256=CpXi3jGlx23RvRyU7iytOMZrnspdWw4yofS8lpP1AJU,18
|
|
12
|
+
agentx_python/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
13
|
+
agentx_python/resources/agent.py,sha256=SMu4H1UDL31Bub4hnaySoySeckgAchRSaAaHDpXa1L8,1521
|
|
14
|
+
agentx_python/resources/conversation.py,sha256=MR0ZBkpSWxUdWoN5HklaoP79zKxp-uzrnX5koX3m504,2179
|
|
15
|
+
agentx_python-0.3.1.dist-info/LICENSE,sha256=6ZbiPNFmv3xBb44LGhAa3PZYK0ROAztsd5LRFZDlGFE,1074
|
|
16
|
+
agentx_python-0.3.1.dist-info/METADATA,sha256=YHCO7IJsO9XajdldjKJtWvgIwVhRRj8z3ffISqzarIs,2065
|
|
17
|
+
agentx_python-0.3.1.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
|
18
|
+
agentx_python-0.3.1.dist-info/top_level.txt,sha256=s-q-HB9Gb_QdrZNacSeQyF_c25gQooMy7DlxzgLOHPk,7
|
|
19
|
+
agentx_python-0.3.1.dist-info/RECORD,,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
agentx
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
agentx_python/__init__.py,sha256=5VThp1fX_kBYM2afhhiTQZxcbg_kBeDiPExAH88ZPT4,293
|
|
2
|
-
agentx_python/agentx.py,sha256=D4R8cAam0LF8_PuHmAN7FXaRmrMTKsdzPdSs0HJkf6I,1873
|
|
3
|
-
agentx_python/util.py,sha256=grYAa8YTvoQSyuy4GvUOwq6SVBRr4DdrBlcTuZwQpzw,132
|
|
4
|
-
agentx_python/version.py,sha256=CpXi3jGlx23RvRyU7iytOMZrnspdWw4yofS8lpP1AJU,18
|
|
5
|
-
agentx_python/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
6
|
-
agentx_python/resources/agent.py,sha256=wpsiiYp3ZjYaonq9wL2KDrUuCnFHvrxS9xfQgaKlLrk,1528
|
|
7
|
-
agentx_python/resources/conversation.py,sha256=zpGOpSJsRTtHbeK_pizOtuGsYxpvLOUCkb-zThB0-cs,2186
|
|
8
|
-
agentx_python-0.2.1.dist-info/LICENSE,sha256=6ZbiPNFmv3xBb44LGhAa3PZYK0ROAztsd5LRFZDlGFE,1074
|
|
9
|
-
agentx_python-0.2.1.dist-info/METADATA,sha256=oJwDiWb1rt6LXftOI5fLuswBUANA9irYFFkL7jWMP1U,1851
|
|
10
|
-
agentx_python-0.2.1.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
|
11
|
-
agentx_python-0.2.1.dist-info/top_level.txt,sha256=YYLKtZsKSxhcVZ9ijHXupbsRJ7lhEjETXLwAB7lG2Y8,14
|
|
12
|
-
agentx_python-0.2.1.dist-info/RECORD,,
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
agentx_python
|
|
File without changes
|