autonomous-app 0.2.25__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.
- autonomous/__init__.py +5 -2
- autonomous/ai/audioagent.py +32 -0
- autonomous/ai/imageagent.py +31 -0
- autonomous/ai/jsonagent.py +40 -0
- autonomous/ai/models/__init__.py +0 -0
- autonomous/ai/models/openai.py +308 -0
- autonomous/ai/oaiagent.py +20 -194
- autonomous/ai/textagent.py +35 -0
- autonomous/auth/autoauth.py +11 -11
- autonomous/auth/user.py +24 -11
- autonomous/db/__init__.py +41 -0
- autonomous/db/base/__init__.py +33 -0
- autonomous/db/base/common.py +62 -0
- autonomous/db/base/datastructures.py +476 -0
- autonomous/db/base/document.py +1230 -0
- autonomous/db/base/fields.py +767 -0
- autonomous/db/base/metaclasses.py +468 -0
- autonomous/db/base/utils.py +22 -0
- autonomous/db/common.py +79 -0
- autonomous/db/connection.py +472 -0
- autonomous/db/context_managers.py +313 -0
- autonomous/db/dereference.py +291 -0
- autonomous/db/document.py +1141 -0
- autonomous/db/errors.py +165 -0
- autonomous/db/fields.py +2732 -0
- autonomous/db/mongodb_support.py +24 -0
- autonomous/db/pymongo_support.py +80 -0
- autonomous/db/queryset/__init__.py +28 -0
- autonomous/db/queryset/base.py +2033 -0
- autonomous/db/queryset/field_list.py +88 -0
- autonomous/db/queryset/manager.py +58 -0
- autonomous/db/queryset/queryset.py +189 -0
- autonomous/db/queryset/transform.py +527 -0
- autonomous/db/queryset/visitor.py +189 -0
- autonomous/db/signals.py +59 -0
- autonomous/logger.py +3 -0
- autonomous/model/autoattr.py +120 -0
- autonomous/model/automodel.py +121 -308
- autonomous/storage/imagestorage.py +9 -54
- autonomous/tasks/autotask.py +0 -25
- {autonomous_app-0.2.25.dist-info → autonomous_app-0.3.1.dist-info}/METADATA +7 -8
- autonomous_app-0.3.1.dist-info/RECORD +60 -0
- {autonomous_app-0.2.25.dist-info → autonomous_app-0.3.1.dist-info}/WHEEL +1 -1
- autonomous/db/autodb.py +0 -86
- autonomous/db/table.py +0 -156
- autonomous/errors/__init__.py +0 -1
- autonomous/errors/danglingreferenceerror.py +0 -8
- autonomous/model/autoattribute.py +0 -20
- autonomous/model/orm.py +0 -86
- autonomous/model/serializer.py +0 -110
- autonomous_app-0.2.25.dist-info/RECORD +0 -36
- /autonomous/{storage → apis}/version_control/GHCallbacks.py +0 -0
- /autonomous/{storage → apis}/version_control/GHOrganization.py +0 -0
- /autonomous/{storage → apis}/version_control/GHRepo.py +0 -0
- /autonomous/{storage → apis}/version_control/GHVersionControl.py +0 -0
- /autonomous/{storage → apis}/version_control/__init__.py +0 -0
- /autonomous/{storage → utils}/markdown.py +0 -0
- {autonomous_app-0.2.25.dist-info → autonomous_app-0.3.1.dist-info}/LICENSE +0 -0
- {autonomous_app-0.2.25.dist-info → autonomous_app-0.3.1.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
from autonomous import log
|
|
2
|
+
from autonomous.model.autoattr import ReferenceAttr, StringAttr
|
|
3
|
+
from autonomous.model.automodel import AutoModel
|
|
4
|
+
|
|
5
|
+
from .models.openai import OpenAIModel
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class TextAgent(AutoModel):
|
|
9
|
+
client = ReferenceAttr(choices=[OpenAIModel])
|
|
10
|
+
name = StringAttr(default="textagent")
|
|
11
|
+
instructions = StringAttr(
|
|
12
|
+
default="You are highly skilled AI trained to assist with generating text according to the given requirements."
|
|
13
|
+
)
|
|
14
|
+
description = StringAttr(
|
|
15
|
+
default="A helpful AI assistant trained to assist with generating text according to the given requirements."
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
_ai_model = OpenAIModel
|
|
19
|
+
|
|
20
|
+
def get_client(self):
|
|
21
|
+
if self.client is None:
|
|
22
|
+
self.client = self._ai_model(
|
|
23
|
+
name=self.name,
|
|
24
|
+
instructions=self.instructions,
|
|
25
|
+
description=self.description,
|
|
26
|
+
)
|
|
27
|
+
self.client.save()
|
|
28
|
+
self.save()
|
|
29
|
+
return self.client
|
|
30
|
+
|
|
31
|
+
def summarize_text(self, text, primer=""):
|
|
32
|
+
return self.get_client().summarize_text(text, primer)
|
|
33
|
+
|
|
34
|
+
def generate(self, messages, additional_instructions=""):
|
|
35
|
+
return self.get_client().generate_text(messages, additional_instructions)
|
autonomous/auth/autoauth.py
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
|
+
import json
|
|
1
2
|
import uuid
|
|
2
3
|
from datetime import datetime
|
|
3
4
|
from functools import wraps
|
|
4
5
|
|
|
5
6
|
import requests
|
|
6
7
|
from authlib.integrations.requests_client import OAuth2Auth, OAuth2Session
|
|
7
|
-
from flask import
|
|
8
|
+
from flask import redirect, session, url_for
|
|
8
9
|
|
|
9
10
|
from autonomous import log
|
|
10
|
-
from autonomous.auth.user import
|
|
11
|
+
from autonomous.auth.user import User
|
|
11
12
|
|
|
12
13
|
|
|
13
14
|
class AutoAuth:
|
|
14
|
-
user_class =
|
|
15
|
+
user_class: type[User] = User
|
|
15
16
|
|
|
16
17
|
def __init__(
|
|
17
18
|
self,
|
|
@@ -46,13 +47,12 @@ class AutoAuth:
|
|
|
46
47
|
"""
|
|
47
48
|
Returns the current user.
|
|
48
49
|
"""
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
log(e, session["user"])
|
|
50
|
+
|
|
51
|
+
user = (
|
|
52
|
+
cls.user_class.from_json(session["user"]) if session.get("user") else None
|
|
53
|
+
)
|
|
54
|
+
if not user or user.state != "authenticated":
|
|
55
|
+
user = cls.user_class.get_guest()
|
|
56
56
|
return user
|
|
57
57
|
|
|
58
58
|
def authenticate(self):
|
|
@@ -106,7 +106,7 @@ class AutoAuth:
|
|
|
106
106
|
user.last_login = datetime.now()
|
|
107
107
|
# log(user)
|
|
108
108
|
user.save()
|
|
109
|
-
session["user"] = user.
|
|
109
|
+
session["user"] = user.to_json()
|
|
110
110
|
# log(guest, user.is_guest)
|
|
111
111
|
if not guest and user.is_guest:
|
|
112
112
|
return redirect(url_for("auth.login"))
|
autonomous/auth/user.py
CHANGED
|
@@ -5,7 +5,7 @@ This module provides a User class that uses the OpenIDAuth class for authenticat
|
|
|
5
5
|
from datetime import datetime
|
|
6
6
|
|
|
7
7
|
from autonomous import log
|
|
8
|
-
from autonomous.model.
|
|
8
|
+
from autonomous.model.autoattr import DateTimeAttr, StringAttr
|
|
9
9
|
from autonomous.model.automodel import AutoModel
|
|
10
10
|
|
|
11
11
|
|
|
@@ -14,15 +14,18 @@ class AutoUser(AutoModel):
|
|
|
14
14
|
This class represents a user who can authenticate using OpenID.
|
|
15
15
|
"""
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
"state": "unauthenticated",
|
|
22
|
-
"provider": None,
|
|
23
|
-
"role": "user",
|
|
24
|
-
"token": None,
|
|
17
|
+
meta = {
|
|
18
|
+
"abstract": True,
|
|
19
|
+
"allow_inheritance": True,
|
|
20
|
+
"strict": False,
|
|
25
21
|
}
|
|
22
|
+
name = StringAttr(default="Anonymous")
|
|
23
|
+
email = StringAttr(required=True)
|
|
24
|
+
last_login = DateTimeAttr(default=datetime.now)
|
|
25
|
+
state = StringAttr(default="unauthenticated")
|
|
26
|
+
provider = StringAttr()
|
|
27
|
+
role = StringAttr(default="guest")
|
|
28
|
+
token = StringAttr()
|
|
26
29
|
|
|
27
30
|
def __eq__(self, other):
|
|
28
31
|
return self.pk == other.pk
|
|
@@ -36,9 +39,10 @@ class AutoUser(AutoModel):
|
|
|
36
39
|
email = user_info["email"].strip()
|
|
37
40
|
name = user_info["name"].strip()
|
|
38
41
|
user = cls.find(email=email)
|
|
42
|
+
log(email, user)
|
|
39
43
|
if not user:
|
|
40
44
|
log(f"Creating new user for {email}")
|
|
41
|
-
user = cls(name=name, email=email)
|
|
45
|
+
# user = cls(name=name, email=email)
|
|
42
46
|
|
|
43
47
|
# parse user_info into a user object
|
|
44
48
|
user.name = name
|
|
@@ -53,7 +57,7 @@ class AutoUser(AutoModel):
|
|
|
53
57
|
"""
|
|
54
58
|
Returns a guest user.
|
|
55
59
|
"""
|
|
56
|
-
guest = cls.find(name="_GuestOfAutonomous_"
|
|
60
|
+
guest = cls.find(name="_GuestOfAutonomous_")
|
|
57
61
|
if not guest:
|
|
58
62
|
guest = cls(
|
|
59
63
|
name="_GuestOfAutonomous_",
|
|
@@ -84,3 +88,12 @@ class AutoUser(AutoModel):
|
|
|
84
88
|
Returns True if the user is a guest, False otherwise.
|
|
85
89
|
"""
|
|
86
90
|
return self.is_authenticated and self.role == "admin"
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
class User(AutoUser):
|
|
94
|
+
"""
|
|
95
|
+
This class represents a user who can authenticate using OpenID.
|
|
96
|
+
"""
|
|
97
|
+
|
|
98
|
+
def __repr__(self):
|
|
99
|
+
return f"<User {self.pk} {self.email}>"
|
autonomous/db/__init__.py
CHANGED
|
@@ -1 +1,42 @@
|
|
|
1
|
+
# Import submodules so that we can expose their __all__
|
|
2
|
+
# Import everything from each submodule so that it can be accessed via
|
|
3
|
+
# autonomous.db, e.g. instead of `from autonomous.db.connection import connect`,
|
|
4
|
+
# users can simply use `from autonomous.db import connect`, or even
|
|
5
|
+
# `from autonomous.db import *` and then `connect('testdb')`.
|
|
6
|
+
from autonomous.db import (
|
|
7
|
+
connection,
|
|
8
|
+
document,
|
|
9
|
+
errors,
|
|
10
|
+
fields,
|
|
11
|
+
queryset,
|
|
12
|
+
signals,
|
|
13
|
+
)
|
|
14
|
+
from autonomous.db.connection import * # noqa: F401
|
|
15
|
+
from autonomous.db.document import * # noqa: F401
|
|
16
|
+
from autonomous.db.errors import * # noqa: F401
|
|
17
|
+
from autonomous.db.fields import * # noqa: F401
|
|
18
|
+
from autonomous.db.queryset import * # noqa: F401
|
|
19
|
+
from autonomous.db.signals import * # noqa: F401
|
|
1
20
|
|
|
21
|
+
__all__ = (
|
|
22
|
+
list(document.__all__)
|
|
23
|
+
+ list(fields.__all__)
|
|
24
|
+
+ list(connection.__all__)
|
|
25
|
+
+ list(queryset.__all__)
|
|
26
|
+
+ list(signals.__all__)
|
|
27
|
+
+ list(errors.__all__)
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
VERSION = (0, 29, 0)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def get_version():
|
|
35
|
+
"""Return the VERSION as a string.
|
|
36
|
+
|
|
37
|
+
For example, if `VERSION == (0, 10, 7)`, return '0.10.7'.
|
|
38
|
+
"""
|
|
39
|
+
return ".".join(map(str, VERSION))
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
__version__ = get_version()
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Base module is split into several files for convenience. Files inside of
|
|
2
|
+
# this module should import from a specific submodule (e.g.
|
|
3
|
+
# `from autonomous.db.base.document import BaseDocument`), but all of the
|
|
4
|
+
# other modules should import directly from the top-level module (e.g.
|
|
5
|
+
# `from autonomous.db.base import BaseDocument`). This approach is cleaner and
|
|
6
|
+
# also helps with cyclical import errors.
|
|
7
|
+
from autonomous.db.base.common import *
|
|
8
|
+
from autonomous.db.base.datastructures import *
|
|
9
|
+
from autonomous.db.base.document import *
|
|
10
|
+
from autonomous.db.base.fields import *
|
|
11
|
+
from autonomous.db.base.metaclasses import *
|
|
12
|
+
|
|
13
|
+
__all__ = (
|
|
14
|
+
# common
|
|
15
|
+
"UPDATE_OPERATORS",
|
|
16
|
+
"_document_registry",
|
|
17
|
+
"get_document",
|
|
18
|
+
# datastructures
|
|
19
|
+
"BaseDict",
|
|
20
|
+
"BaseList",
|
|
21
|
+
"EmbeddedDocumentList",
|
|
22
|
+
"LazyReference",
|
|
23
|
+
# document
|
|
24
|
+
"BaseDocument",
|
|
25
|
+
# fields
|
|
26
|
+
"BaseField",
|
|
27
|
+
"ComplexBaseField",
|
|
28
|
+
"ObjectIdField",
|
|
29
|
+
"GeoJsonBaseField",
|
|
30
|
+
# metaclasses
|
|
31
|
+
"DocumentMetaclass",
|
|
32
|
+
"TopLevelDocumentMetaclass",
|
|
33
|
+
)
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
from autonomous.db.errors import NotRegistered
|
|
2
|
+
|
|
3
|
+
__all__ = ("UPDATE_OPERATORS", "get_document", "_document_registry")
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
UPDATE_OPERATORS = {
|
|
7
|
+
"set",
|
|
8
|
+
"unset",
|
|
9
|
+
"inc",
|
|
10
|
+
"dec",
|
|
11
|
+
"mul",
|
|
12
|
+
"pop",
|
|
13
|
+
"push",
|
|
14
|
+
"push_all",
|
|
15
|
+
"pull",
|
|
16
|
+
"pull_all",
|
|
17
|
+
"add_to_set",
|
|
18
|
+
"set_on_insert",
|
|
19
|
+
"min",
|
|
20
|
+
"max",
|
|
21
|
+
"rename",
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
_document_registry = {}
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def get_document(name):
|
|
29
|
+
"""Get a registered Document class by name."""
|
|
30
|
+
doc = _document_registry.get(name, None)
|
|
31
|
+
if not doc:
|
|
32
|
+
# Possible old style name
|
|
33
|
+
single_end = name.split(".")[-1]
|
|
34
|
+
compound_end = ".%s" % single_end
|
|
35
|
+
possible_match = [
|
|
36
|
+
k for k in _document_registry if k.endswith(compound_end) or k == single_end
|
|
37
|
+
]
|
|
38
|
+
if len(possible_match) == 1:
|
|
39
|
+
doc = _document_registry.get(possible_match.pop(), None)
|
|
40
|
+
if not doc:
|
|
41
|
+
raise NotRegistered(
|
|
42
|
+
"""
|
|
43
|
+
`%s` has not been registered in the document registry.
|
|
44
|
+
Importing the document class automatically registers it, has it
|
|
45
|
+
been imported?
|
|
46
|
+
""".strip()
|
|
47
|
+
% name
|
|
48
|
+
)
|
|
49
|
+
return doc
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def _get_documents_by_db(connection_alias, default_connection_alias):
|
|
53
|
+
"""Get all registered Documents class attached to a given database"""
|
|
54
|
+
|
|
55
|
+
def get_doc_alias(doc_cls):
|
|
56
|
+
return doc_cls._meta.get("db_alias", default_connection_alias)
|
|
57
|
+
|
|
58
|
+
return [
|
|
59
|
+
doc_cls
|
|
60
|
+
for doc_cls in _document_registry.values()
|
|
61
|
+
if get_doc_alias(doc_cls) == connection_alias
|
|
62
|
+
]
|