Skip to content

Commit e4e9af3

Browse files
committed
python sdk for superagi
0 parents  commit e4e9af3

29 files changed

+697
-0
lines changed

.gitignore

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
.idea
2+
**/.env
3+
**/.venv
4+
__pycache__
5+
**/__gitpycache__/
6+
venv
7+
.DS_Store
8+
dist
9+
superagi_client.egg-info

LICENSE

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
MIT License
2+
3+
Copyright (c) 2023 TransformerOptimus
4+
5+
Permission is hereby granted, free of charge, to any person obtaining a copy
6+
of this software and associated documentation files (the "Software"), to deal
7+
in the Software without restriction, including without limitation the rights
8+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
copies of the Software, and to permit persons to whom the Software is
10+
furnished to do so, subject to the following conditions:
11+
12+
The above copyright notice and this permission notice shall be included in all
13+
copies or substantial portions of the Software.
14+
15+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+
SOFTWARE.

__init__.py

Whitespace-only changes.

setup.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
from setuptools import setup, find_packages
2+
3+
setup(
4+
name="superagi_client",
5+
version="0.0.1",
6+
packages=find_packages(exclude=[".idea", ".git", "tests", "venv"]),
7+
url="https://app.superagi.com",
8+
license="MIT",
9+
author="superagi",
10+
author_email="mukunda@superagi.com",
11+
description="Python package for Superagi",
12+
install_requires=["pydantic==1.10.8", "requests==2.31.0", "pytest==7.3.2"],
13+
)

superagi_client/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from superagi_client.superagi_client import SuperagiClient

superagi_client/dto/__init__.py

Whitespace-only changes.

superagi_client/dto/agent_config.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from typing import Optional, List
2+
3+
from pydantic import BaseModel
4+
5+
from superagi_client.dto.agent_schedule import AgentSchedule
6+
7+
8+
class AgentConfig(BaseModel):
9+
name: str
10+
description: str
11+
project_id: Optional[int]
12+
goal: List[str]
13+
instruction: List[str]
14+
agent_workflow: str
15+
constraints: List[str]
16+
tools: List[dict]
17+
LTM_DB: Optional[str]
18+
exit: Optional[str]
19+
permission_type: Optional[str]
20+
iteration_interval: int
21+
model: str
22+
schedule: Optional[AgentSchedule]
23+
max_iterations: int
24+
user_timezone: Optional[str]
25+
knowledge: Optional[int]
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from typing import Optional, List
2+
3+
from pydantic import BaseModel
4+
5+
6+
class AgentExecution(BaseModel):
7+
name: Optional[str]
8+
goal: Optional[List[str]]
9+
instruction: Optional[List[str]]
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from typing import Optional, List
2+
3+
from pydantic import BaseModel
4+
5+
6+
class AgentRunFilter(BaseModel):
7+
run_ids: Optional[List[int]]
8+
run_status_filter: Optional[str]

superagi_client/dto/agent_schedule.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from datetime import datetime
2+
from typing import Optional
3+
4+
from pydantic import BaseModel
5+
6+
7+
class AgentSchedule(BaseModel):
8+
agent_id: Optional[int]
9+
start_time: datetime
10+
recurrence_interval: Optional[str] = None
11+
expiry_date: Optional[datetime] = None
12+
expiry_runs: Optional[int] = -1
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from pydantic import BaseModel
2+
from typing import Optional, List
3+
4+
from superagi_client.dto.agent_schedule import AgentSchedule
5+
6+
7+
class AgentUpdateConfig(BaseModel):
8+
name: Optional[str]
9+
description: Optional[str]
10+
project_id: Optional[int]
11+
goal: Optional[List[str]]
12+
instruction: Optional[List[str]]
13+
agent_workflow: Optional[str]
14+
constraints: Optional[List[str]]
15+
tools: Optional[List[dict]]
16+
LTM_DB: Optional[str]
17+
exit: Optional[str]
18+
permission_type: Optional[str]
19+
iteration_interval: Optional[int]
20+
model: Optional[str]
21+
schedule: Optional[AgentSchedule]
22+
max_iterations: Optional[int]
23+
user_timezone: Optional[str]
24+
knowledge: Optional[int]

superagi_client/exceptions/__init__.py

Whitespace-only changes.
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
from superagi_client.lib.logger import logger
2+
3+
4+
class BadRequestException(Exception):
5+
def __init__(self, message="Bad Request", status_code=400, additional_info=None):
6+
self.message = message
7+
self.status_code = status_code
8+
self.additional_info = additional_info
9+
super().__init__(
10+
f"{self.message} => {self.additional_info}"
11+
if self.additional_info
12+
else self.message
13+
)
14+
15+
logger.error(
16+
f"BadRequestException: {self.message}, Status Code: {self.status_code}, "
17+
f"Additional Info: {self.additional_info}"
18+
)
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
from superagi_client.lib.logger import logger
2+
3+
4+
class ConflictException(Exception):
5+
def __init__(self, message="Unauthorized", status_code=409, additional_info=None):
6+
self.message = message
7+
self.status_code = status_code
8+
self.additional_info = additional_info
9+
super().__init__(
10+
f"{self.message} => {self.additional_info}"
11+
if self.additional_info
12+
else self.message
13+
)
14+
15+
logger.error(
16+
f"BadRequestException: {self.message}, Status Code: {self.status_code}, "
17+
f"Additional Info: {self.additional_info}"
18+
)
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from superagi_client.exceptions.bad_request_exception import BadRequestException
2+
from superagi_client.exceptions.conflict_exception import ConflictException
3+
from superagi_client.exceptions.internal_server_error_exception import (
4+
InternalServerErrorException,
5+
)
6+
from superagi_client.exceptions.not_found_exception import NotFoundException
7+
from superagi_client.exceptions.unauthorized_exception import UnauthorizedException
8+
from superagi_client.lib.logger import logger
9+
10+
11+
def http_status_code_to_exception(status_code, additional_info):
12+
status_code_to_exception_map = {
13+
400: BadRequestException,
14+
401: UnauthorizedException,
15+
404: NotFoundException,
16+
409: ConflictException,
17+
500: InternalServerErrorException,
18+
}
19+
20+
exception = status_code_to_exception_map.get(status_code)
21+
if exception is None:
22+
logger.error(f"Status Code:{status_code}, Additional Info:{additional_info}")
23+
raise Exception() if exception is None else exception(
24+
additional_info=additional_info
25+
)
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from superagi_client.lib.logger import logger
2+
3+
4+
class InternalServerErrorException(Exception):
5+
def __init__(
6+
self, message="Internal Server Error", status_code=500, additional_info=None
7+
):
8+
self.message = message
9+
self.status_code = status_code
10+
self.additional_info = additional_info
11+
super().__init__(
12+
f"{self.message} => {self.additional_info}"
13+
if self.additional_info
14+
else self.message
15+
)
16+
17+
logger.error(
18+
f"BadRequestException: {self.message}, Status Code: {self.status_code}, "
19+
f"Additional Info: {self.additional_info}"
20+
)
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
from superagi_client.lib.logger import logger
2+
3+
4+
class NotFoundException(Exception):
5+
def __init__(self, message="Not Found", status_code=404, additional_info=None):
6+
self.message = message
7+
self.status_code = status_code
8+
self.additional_info = additional_info
9+
super().__init__(
10+
f"{self.message} => {self.additional_info}"
11+
if self.additional_info
12+
else self.message
13+
)
14+
15+
logger.error(
16+
f"BadRequestException: {self.message}, Status Code: {self.status_code}, "
17+
f"Additional Info: {self.additional_info}"
18+
)
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
from superagi_client.lib.logger import logger
2+
3+
4+
class UnauthorizedException(Exception):
5+
def __init__(self, message="Unauthorized", status_code=401, additional_info=None):
6+
self.message = message
7+
self.status_code = status_code
8+
self.additional_info = additional_info
9+
super().__init__(
10+
f"{self.message} => {self.additional_info}"
11+
if self.additional_info
12+
else self.message
13+
)
14+
15+
logger.error(
16+
f"BadRequestException: {self.message}, Status Code: {self.status_code}, "
17+
f"Additional Info: {self.additional_info}"
18+
)

superagi_client/lib/__init__.py

Whitespace-only changes.

superagi_client/lib/auth.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import requests as requests
2+
3+
from superagi_client.exceptions.unauthorized_exception import UnauthorizedException
4+
5+
6+
def validate_api_key(base_url: str, api_key: str):
7+
response = requests.get(
8+
f"{base_url}/api/api-keys/validate", headers={"X-API-Key": api_key}
9+
)
10+
11+
if response.status_code == 401:
12+
raise UnauthorizedException()

superagi_client/lib/logger.py

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
import logging
2+
import inspect
3+
4+
5+
class CustomLogRecord(logging.LogRecord):
6+
def __init__(self, *args, **kwargs):
7+
super().__init__(*args, **kwargs)
8+
9+
frame = inspect.currentframe().f_back
10+
while frame:
11+
if (
12+
frame.f_globals["__name__"] != __name__
13+
and frame.f_globals["__name__"] != "logging"
14+
):
15+
break
16+
frame = frame.f_back
17+
18+
if frame:
19+
self.filename = frame.f_code.co_filename
20+
self.lineno = frame.f_lineno
21+
else:
22+
self.filename = "unknown"
23+
self.lineno = 0
24+
25+
26+
class SingletonMeta(type):
27+
_instances = {}
28+
29+
def __call__(cls, *args, **kwargs):
30+
if cls not in cls._instances:
31+
instance = super().__call__(*args, **kwargs)
32+
cls._instances[cls] = instance
33+
return cls._instances[cls]
34+
35+
36+
class Logger(metaclass=SingletonMeta):
37+
def __init__(
38+
self, logger_name="Super AGI superagi_client", log_level=logging.DEBUG
39+
):
40+
if not hasattr(self, "logger"):
41+
self.logger = logging.getLogger(logger_name)
42+
self.logger.setLevel(log_level)
43+
self.logger.makeRecord = self._make_custom_log_record
44+
45+
console_handler = logging.StreamHandler()
46+
console_handler.setLevel(log_level)
47+
48+
formatter = logging.Formatter(
49+
"%(asctime)s - %(name)s - %(levelname)s - [%(filename)s:%(lineno)d] - %(message)s",
50+
datefmt="%Y-%m-%d %H:%M:%S %Z",
51+
)
52+
53+
console_handler.setFormatter(formatter)
54+
self.logger.addHandler(console_handler)
55+
56+
def _make_custom_log_record(
57+
self,
58+
name,
59+
level,
60+
fn,
61+
lno,
62+
msg,
63+
args,
64+
exc_info,
65+
func=None,
66+
extra=None,
67+
sinfo=None,
68+
):
69+
return CustomLogRecord(
70+
name,
71+
level,
72+
fn,
73+
lno,
74+
msg,
75+
args,
76+
exc_info,
77+
func=func,
78+
extra=extra,
79+
sinfo=sinfo,
80+
)
81+
82+
def debug(self, message, *args):
83+
self.logger.debug(message)
84+
if args:
85+
self.logger.debug(*args)
86+
87+
def info(self, message, *args):
88+
self.logger.info(message)
89+
if args:
90+
self.logger.info(*args)
91+
92+
def warning(self, message, *args):
93+
self.logger.warning(message)
94+
if args:
95+
self.logger.warning(*args)
96+
97+
def error(self, message, *args):
98+
self.logger.error(message)
99+
if args:
100+
self.logger.error(*args)
101+
102+
def critical(self, message, *args):
103+
self.logger.critical(message)
104+
if args:
105+
self.logger.critical(*args)
106+
107+
108+
logger = Logger("Super AGI superagi_client")

0 commit comments

Comments
 (0)