hyperpocket 0.0.1__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- hyperpocket/__init__.py +7 -0
- hyperpocket/auth/README.KR.md +309 -0
- hyperpocket/auth/README.md +323 -0
- hyperpocket/auth/__init__.py +24 -0
- hyperpocket/auth/calendly/__init__.py +0 -0
- hyperpocket/auth/calendly/context.py +13 -0
- hyperpocket/auth/calendly/oauth2_context.py +25 -0
- hyperpocket/auth/calendly/oauth2_handler.py +146 -0
- hyperpocket/auth/calendly/oauth2_schema.py +16 -0
- hyperpocket/auth/context.py +38 -0
- hyperpocket/auth/github/__init__.py +0 -0
- hyperpocket/auth/github/context.py +13 -0
- hyperpocket/auth/github/oauth2_context.py +25 -0
- hyperpocket/auth/github/oauth2_handler.py +143 -0
- hyperpocket/auth/github/oauth2_schema.py +16 -0
- hyperpocket/auth/github/token_context.py +12 -0
- hyperpocket/auth/github/token_handler.py +79 -0
- hyperpocket/auth/github/token_schema.py +9 -0
- hyperpocket/auth/google/__init__.py +0 -0
- hyperpocket/auth/google/context.py +15 -0
- hyperpocket/auth/google/oauth2_context.py +31 -0
- hyperpocket/auth/google/oauth2_handler.py +137 -0
- hyperpocket/auth/google/oauth2_schema.py +18 -0
- hyperpocket/auth/handler.py +171 -0
- hyperpocket/auth/linear/__init__.py +0 -0
- hyperpocket/auth/linear/context.py +15 -0
- hyperpocket/auth/linear/token_context.py +15 -0
- hyperpocket/auth/linear/token_handler.py +68 -0
- hyperpocket/auth/linear/token_schema.py +9 -0
- hyperpocket/auth/provider.py +16 -0
- hyperpocket/auth/schema.py +19 -0
- hyperpocket/auth/slack/__init__.py +0 -0
- hyperpocket/auth/slack/context.py +15 -0
- hyperpocket/auth/slack/oauth2_context.py +40 -0
- hyperpocket/auth/slack/oauth2_handler.py +151 -0
- hyperpocket/auth/slack/oauth2_schema.py +40 -0
- hyperpocket/auth/slack/tests/__init__.py +0 -0
- hyperpocket/auth/slack/tests/test_oauth2_handler.py +32 -0
- hyperpocket/auth/slack/tests/test_token_handler.py +23 -0
- hyperpocket/auth/slack/token_context.py +14 -0
- hyperpocket/auth/slack/token_handler.py +64 -0
- hyperpocket/auth/slack/token_schema.py +9 -0
- hyperpocket/auth/tests/__init__.py +0 -0
- hyperpocket/auth/tests/test_google_oauth2_handler.py +147 -0
- hyperpocket/auth/tests/test_slack_oauth2_handler.py +147 -0
- hyperpocket/auth/tests/test_slack_token_handler.py +66 -0
- hyperpocket/cli/__init__.py +0 -0
- hyperpocket/cli/__main__.py +12 -0
- hyperpocket/cli/pull.py +18 -0
- hyperpocket/cli/sync.py +17 -0
- hyperpocket/config/__init__.py +9 -0
- hyperpocket/config/auth.py +36 -0
- hyperpocket/config/git.py +17 -0
- hyperpocket/config/logger.py +81 -0
- hyperpocket/config/session.py +35 -0
- hyperpocket/config/settings.py +62 -0
- hyperpocket/constants.py +0 -0
- hyperpocket/curated_tools.py +10 -0
- hyperpocket/external/__init__.py +7 -0
- hyperpocket/external/github_client.py +19 -0
- hyperpocket/futures/__init__.py +7 -0
- hyperpocket/futures/futurestore.py +48 -0
- hyperpocket/pocket_auth.py +344 -0
- hyperpocket/pocket_main.py +351 -0
- hyperpocket/prompts.py +15 -0
- hyperpocket/repository/__init__.py +5 -0
- hyperpocket/repository/lock.py +156 -0
- hyperpocket/repository/lockfile.py +56 -0
- hyperpocket/repository/repository.py +18 -0
- hyperpocket/server/__init__.py +3 -0
- hyperpocket/server/auth/__init__.py +15 -0
- hyperpocket/server/auth/calendly.py +16 -0
- hyperpocket/server/auth/github.py +25 -0
- hyperpocket/server/auth/google.py +16 -0
- hyperpocket/server/auth/linear.py +18 -0
- hyperpocket/server/auth/slack.py +28 -0
- hyperpocket/server/auth/token.py +51 -0
- hyperpocket/server/proxy.py +63 -0
- hyperpocket/server/server.py +178 -0
- hyperpocket/server/tool/__init__.py +10 -0
- hyperpocket/server/tool/dto/__init__.py +0 -0
- hyperpocket/server/tool/dto/script.py +15 -0
- hyperpocket/server/tool/wasm.py +31 -0
- hyperpocket/session/README.KR.md +62 -0
- hyperpocket/session/README.md +61 -0
- hyperpocket/session/__init__.py +4 -0
- hyperpocket/session/in_memory.py +76 -0
- hyperpocket/session/interface.py +118 -0
- hyperpocket/session/redis.py +126 -0
- hyperpocket/session/tests/__init__.py +0 -0
- hyperpocket/session/tests/test_in_memory.py +145 -0
- hyperpocket/session/tests/test_redis.py +151 -0
- hyperpocket/tests/__init__.py +0 -0
- hyperpocket/tests/test_pocket.py +118 -0
- hyperpocket/tests/test_pocket_auth.py +982 -0
- hyperpocket/tool/README.KR.md +68 -0
- hyperpocket/tool/README.md +75 -0
- hyperpocket/tool/__init__.py +13 -0
- hyperpocket/tool/builtins/__init__.py +0 -0
- hyperpocket/tool/builtins/example/__init__.py +0 -0
- hyperpocket/tool/builtins/example/add_tool.py +18 -0
- hyperpocket/tool/function/README.KR.md +159 -0
- hyperpocket/tool/function/README.md +169 -0
- hyperpocket/tool/function/__init__.py +9 -0
- hyperpocket/tool/function/annotation.py +30 -0
- hyperpocket/tool/function/tool.py +87 -0
- hyperpocket/tool/tests/__init__.py +0 -0
- hyperpocket/tool/tests/test_function_tool.py +266 -0
- hyperpocket/tool/tool.py +106 -0
- hyperpocket/tool/wasm/README.KR.md +144 -0
- hyperpocket/tool/wasm/README.md +144 -0
- hyperpocket/tool/wasm/__init__.py +3 -0
- hyperpocket/tool/wasm/browser.py +63 -0
- hyperpocket/tool/wasm/invoker.py +41 -0
- hyperpocket/tool/wasm/script.py +82 -0
- hyperpocket/tool/wasm/templates/__init__.py +28 -0
- hyperpocket/tool/wasm/templates/node.py +87 -0
- hyperpocket/tool/wasm/templates/python.py +75 -0
- hyperpocket/tool/wasm/tool.py +147 -0
- hyperpocket/util/__init__.py +1 -0
- hyperpocket/util/extract_func_param_desc_from_docstring.py +97 -0
- hyperpocket/util/find_all_leaf_class_in_package.py +17 -0
- hyperpocket/util/find_all_subclass_in_package.py +29 -0
- hyperpocket/util/flatten_json_schema.py +45 -0
- hyperpocket/util/function_to_model.py +46 -0
- hyperpocket/util/get_objects_from_subpackage.py +28 -0
- hyperpocket/util/json_schema_to_model.py +69 -0
- hyperpocket-0.0.1.dist-info/METADATA +304 -0
- hyperpocket-0.0.1.dist-info/RECORD +131 -0
- hyperpocket-0.0.1.dist-info/WHEEL +4 -0
- hyperpocket-0.0.1.dist-info/entry_points.txt +3 -0
@@ -0,0 +1,45 @@
|
|
1
|
+
import copy
|
2
|
+
|
3
|
+
|
4
|
+
def flatten_json_schema(schema: dict):
|
5
|
+
"""
|
6
|
+
Flatten JSON Schema by resolving all $refs using definitions in $defs
|
7
|
+
and convert to a fully nested schema.
|
8
|
+
"""
|
9
|
+
definitions = schema.get('$defs', {})
|
10
|
+
schema_copy = copy.deepcopy(schema)
|
11
|
+
|
12
|
+
# Resolve references within $defs first
|
13
|
+
resolved_definitions = {}
|
14
|
+
for key, value in definitions.items():
|
15
|
+
resolved_definitions[key] = resolve_refs(value, definitions)
|
16
|
+
|
17
|
+
# Resolve references in the main schema
|
18
|
+
schema_copy.pop('$defs', None) # Remove $defs
|
19
|
+
return resolve_refs(schema_copy, resolved_definitions)
|
20
|
+
|
21
|
+
|
22
|
+
def resolve_refs(schema, definitions):
|
23
|
+
"""
|
24
|
+
Recursively resolve $ref references within the schema using $defs.
|
25
|
+
"""
|
26
|
+
if isinstance(schema, dict):
|
27
|
+
# Recursively check nested dictionaries
|
28
|
+
resolved_schema = {}
|
29
|
+
for key, value in schema.items():
|
30
|
+
# If $ref exists, resolve the reference
|
31
|
+
if key == '$ref':
|
32
|
+
ref_path = schema['$ref']
|
33
|
+
ref_name = ref_path.split('/')[-1] # Extract the reference name from $defs/Req -> Req
|
34
|
+
resolved = definitions.get(ref_name)
|
35
|
+
if resolved:
|
36
|
+
resolved_schema |= resolve_refs(copy.deepcopy(resolved), definitions)
|
37
|
+
else:
|
38
|
+
resolved_schema[key] = resolve_refs(value, definitions)
|
39
|
+
return resolved_schema
|
40
|
+
|
41
|
+
elif isinstance(schema, list):
|
42
|
+
# Recursively resolve references in list items
|
43
|
+
return [resolve_refs(item, definitions) for item in schema]
|
44
|
+
|
45
|
+
return schema
|
@@ -0,0 +1,46 @@
|
|
1
|
+
import inspect
|
2
|
+
from inspect import signature, Parameter
|
3
|
+
from typing import Any, Dict, Type, Tuple, List
|
4
|
+
|
5
|
+
from pydantic import BaseModel, create_model
|
6
|
+
from pydantic.fields import FieldInfo
|
7
|
+
|
8
|
+
from hyperpocket.config import pocket_logger
|
9
|
+
from hyperpocket.util.extract_func_param_desc_from_docstring import extract_param_docstring_mapping
|
10
|
+
|
11
|
+
|
12
|
+
def function_to_model(func: callable) -> Type[BaseModel]:
|
13
|
+
docstring = inspect.getdoc(func)
|
14
|
+
if docstring is None:
|
15
|
+
pocket_logger.info("not found docstring. use function name as description instead.")
|
16
|
+
docstring = func.__name__
|
17
|
+
fields: Dict[str, Tuple[Type, Any]] = {}
|
18
|
+
sig = signature(func)
|
19
|
+
param_desc_map = extract_param_docstring_mapping(func)
|
20
|
+
|
21
|
+
for param_name, param in sig.parameters.items():
|
22
|
+
if param_name in ('self', 'cls'):
|
23
|
+
continue
|
24
|
+
|
25
|
+
if param.kind == Parameter.VAR_POSITIONAL:
|
26
|
+
# don't support var positional args
|
27
|
+
continue
|
28
|
+
|
29
|
+
elif param.kind == Parameter.VAR_KEYWORD:
|
30
|
+
fields[param_name] = (Dict[str, Any], {})
|
31
|
+
continue
|
32
|
+
|
33
|
+
if param.annotation is Parameter.empty:
|
34
|
+
raise Exception(f"Should all arguments be annotated but {param_name} is not annotated")
|
35
|
+
|
36
|
+
if param.annotation.__module__ != "builtins" and not issubclass(param.annotation, BaseModel):
|
37
|
+
raise Exception(
|
38
|
+
f"currently only support builtin types and pydantic BaseModel but {param_name} is not builtin type")
|
39
|
+
|
40
|
+
default = param.default if param.default is not Parameter.empty else ...
|
41
|
+
|
42
|
+
fields[param_name] = (
|
43
|
+
param.annotation, FieldInfo(default=default, description=param_desc_map.get(param_name, "")))
|
44
|
+
|
45
|
+
model = create_model(f"{func.__name__.capitalize()}Model", **fields, __doc__=docstring)
|
46
|
+
return model
|
@@ -0,0 +1,28 @@
|
|
1
|
+
import importlib
|
2
|
+
import pkgutil
|
3
|
+
from typing import Type, Optional
|
4
|
+
|
5
|
+
|
6
|
+
def get_objects_from_subpackage(package_name, interface_type: Optional[Type] = None):
|
7
|
+
"""
|
8
|
+
Retrieves objects from a specific subpackage.
|
9
|
+
|
10
|
+
Args:
|
11
|
+
package_name (str): The name of the package to search (e.g., "mypackage.subpackage").
|
12
|
+
interface_type (Optional[Type]): A type to filter objects. Defaults to None (returns all objects).
|
13
|
+
Returns:
|
14
|
+
list: A list of objects matching the interface_type
|
15
|
+
"""
|
16
|
+
objects = []
|
17
|
+
|
18
|
+
package = importlib.import_module(package_name)
|
19
|
+
package_path = package.__path__
|
20
|
+
|
21
|
+
for module_info in pkgutil.walk_packages(package_path, package_name + "."):
|
22
|
+
module = importlib.import_module(module_info.name)
|
23
|
+
|
24
|
+
for name, obj in vars(module).items():
|
25
|
+
if interface_type is None or isinstance(obj, interface_type):
|
26
|
+
objects.append(obj)
|
27
|
+
|
28
|
+
return objects
|
@@ -0,0 +1,69 @@
|
|
1
|
+
from typing import Type
|
2
|
+
|
3
|
+
from pydantic import BaseModel, create_model, Field
|
4
|
+
|
5
|
+
|
6
|
+
# Convert JSON Schema to a Pydantic model
|
7
|
+
def json_schema_to_model(schema: dict, model_name: str = "DynamicModel") -> Type[BaseModel]:
|
8
|
+
"""Recursively create a Pydantic model from a JSON Schema."""
|
9
|
+
fields = {}
|
10
|
+
config_extra = "forbid"
|
11
|
+
|
12
|
+
required_fields = schema.get("required", [])
|
13
|
+
for property_name, property_schema in schema.get("properties", {}).items():
|
14
|
+
field_type, field_default, field_description, required = None, None, None, False
|
15
|
+
if "type" in property_schema:
|
16
|
+
json_type = property_schema["type"]
|
17
|
+
if json_type == "integer":
|
18
|
+
field_type = int
|
19
|
+
elif json_type == "string":
|
20
|
+
field_type = str
|
21
|
+
elif json_type == "object":
|
22
|
+
if "properties" in property_schema:
|
23
|
+
# Recursively create nested models
|
24
|
+
field_type = json_schema_to_model(property_schema, model_name)
|
25
|
+
else:
|
26
|
+
field_type = dict
|
27
|
+
|
28
|
+
elif json_type == "array":
|
29
|
+
# Handle arrays; currently assuming array of objects or primitives
|
30
|
+
item_schema = property_schema.get("items", {})
|
31
|
+
if item_schema.get("type") == "object":
|
32
|
+
field_type = list[json_schema_to_model(item_schema, model_name)]
|
33
|
+
else:
|
34
|
+
field_type = list
|
35
|
+
if "default" in property_schema:
|
36
|
+
field_default = property_schema["default"]
|
37
|
+
if "description" in property_schema:
|
38
|
+
field_description = property_schema["description"]
|
39
|
+
if property_name in required_fields:
|
40
|
+
required = True
|
41
|
+
|
42
|
+
if required:
|
43
|
+
fields[property_name] = (field_type, Field(description=field_description))
|
44
|
+
else:
|
45
|
+
fields[property_name] = (field_type, Field(default=field_default, description=field_description))
|
46
|
+
|
47
|
+
# Handle additionalProperties
|
48
|
+
if "additionalProperties" in schema:
|
49
|
+
if schema["additionalProperties"] is True:
|
50
|
+
config_extra = "allow" # Allow additional properties
|
51
|
+
elif schema["additionalProperties"] is False:
|
52
|
+
config_extra = "forbid" # Disallow additional properties
|
53
|
+
elif isinstance(schema["additionalProperties"], dict):
|
54
|
+
# If additionalProperties is a schema, allow and validate its type
|
55
|
+
additional_model = json_schema_to_model(
|
56
|
+
schema["additionalProperties"], f"{model_name}_AdditionalProperties"
|
57
|
+
)
|
58
|
+
fields["additional_properties"] = (dict[str, additional_model], {})
|
59
|
+
|
60
|
+
# Create the model
|
61
|
+
model = create_model(model_name, **fields)
|
62
|
+
|
63
|
+
# Add custom Config class to handle extra properties
|
64
|
+
class Config:
|
65
|
+
extra = config_extra
|
66
|
+
|
67
|
+
model.Config = Config
|
68
|
+
|
69
|
+
return model
|
@@ -0,0 +1,304 @@
|
|
1
|
+
Metadata-Version: 2.1
|
2
|
+
Name: hyperpocket
|
3
|
+
Version: 0.0.1
|
4
|
+
Summary: Building AI agent with hyperpocket tool in a flash
|
5
|
+
Home-page: https://vessl-ai.github.io/hyperpocket
|
6
|
+
Author: VESSL AI Devs
|
7
|
+
Author-email: dev@vessl.ai
|
8
|
+
Requires-Python: >=3.11,<4.0
|
9
|
+
Classifier: Programming Language :: Python :: 3
|
10
|
+
Classifier: Programming Language :: Python :: 3.11
|
11
|
+
Classifier: Programming Language :: Python :: 3.12
|
12
|
+
Classifier: Programming Language :: Python :: 3.13
|
13
|
+
Requires-Dist: click (>=8.1.7,<9.0.0)
|
14
|
+
Requires-Dist: dynaconf (>=3.2.6,<4.0.0)
|
15
|
+
Requires-Dist: fastapi (>=0.115.5,<0.116.0)
|
16
|
+
Requires-Dist: gitpython (>=3.1.43,<4.0.0)
|
17
|
+
Requires-Dist: httpx (>=0.28.0,<0.29.0)
|
18
|
+
Requires-Dist: jinja2 (>=3.1.4,<4.0.0)
|
19
|
+
Requires-Dist: multiprocess (>=0.70.17,<0.71.0)
|
20
|
+
Requires-Dist: playwright (>=1.49.0,<2.0.0)
|
21
|
+
Requires-Dist: pydantic (>=2.10.2,<3.0.0)
|
22
|
+
Requires-Dist: pygithub (>=2.5.0,<3.0.0)
|
23
|
+
Requires-Dist: python-multipart (>=0.0.19,<0.0.20)
|
24
|
+
Requires-Dist: redis (>=5.2.1,<6.0.0)
|
25
|
+
Requires-Dist: requests (>=2.32.3,<3.0.0)
|
26
|
+
Requires-Dist: toml (>=0.10.2,<0.11.0)
|
27
|
+
Requires-Dist: uvicorn (>=0.32.1,<0.33.0)
|
28
|
+
Project-URL: Repository, https://github.com/vessl-ai/hyperpocket
|
29
|
+
Description-Content-Type: text/markdown
|
30
|
+
|
31
|
+
# Pocket 👛
|
32
|
+
|
33
|
+
Pocket is where tools belong. Power your agent up with a pocket of tools. 👛
|
34
|
+
|
35
|
+
<figure>
|
36
|
+
<img src="image.png" alt="4d-pocket" width="200"/>
|
37
|
+
<figcaption>© Doraemon</figcaption>
|
38
|
+
</figure>
|
39
|
+
|
40
|
+
## Introduction
|
41
|
+
|
42
|
+
Pocket is a tool that allows you to easily use tool and auth for agents on your machine.
|
43
|
+
|
44
|
+
**_Start fast._** Just install Pocket and use it. We know you don't have time to authenticate to our server.
|
45
|
+
|
46
|
+
**_Go securely._** Not like others, you are the only one who knows your secret tokens. We do NOT. All of your secret
|
47
|
+
tokens belong to your infrastructure, not ours.
|
48
|
+
|
49
|
+
**_Power up with public tools._** Without worries for tool integration, use others' tools just with copy-and-paste the
|
50
|
+
link to the tool. Your tool will run on isolated environment based on WebAssembly technology, and you don't have to deal
|
51
|
+
with the dependency spaghetti.
|
52
|
+
|
53
|
+
**_Battery Included_** You can use popular tools and authentication providers out-of-the-box.
|
54
|
+
|
55
|
+
<figure>
|
56
|
+
<img src="pocket1.png" alt="pocket-flow" width="400"/>
|
57
|
+
<figcaption></figcaption>
|
58
|
+
</figure>
|
59
|
+
|
60
|
+
## Installation
|
61
|
+
|
62
|
+
1. install pocket
|
63
|
+
|
64
|
+
```bash
|
65
|
+
pip install pocket
|
66
|
+
```
|
67
|
+
|
68
|
+
2. install playwright
|
69
|
+
|
70
|
+
```bash
|
71
|
+
playwright install
|
72
|
+
```
|
73
|
+
|
74
|
+
## Usage
|
75
|
+
|
76
|
+
Supported agent frameworks
|
77
|
+
|
78
|
+
- [x] Langgraph [link](https://www.langchain.com/langgraph)
|
79
|
+
- [x] Langchain [link](https://www.langchain.com/)
|
80
|
+
- [x] Llamaindex [link](https://www.llamaindex.ai/)
|
81
|
+
|
82
|
+
Or just use LLM API Clients out of the box.
|
83
|
+
|
84
|
+
- [x] OpenAI [link](https://openai.com/)
|
85
|
+
- [x] Anthropic [link](https://www.anthropic.com/)
|
86
|
+
|
87
|
+
### Using out-of-the-box tools
|
88
|
+
|
89
|
+
```python
|
90
|
+
from langchain_openai import ChatOpenAI
|
91
|
+
|
92
|
+
import hyperpocket as pk
|
93
|
+
import hyperpocket.curated_tools
|
94
|
+
from pocket_langchain import PocketLangchain
|
95
|
+
|
96
|
+
pklc = PocketLangchain(
|
97
|
+
tools=[
|
98
|
+
*pk.curated_tools.SLACK, # SLACK = [slack_get_message, slack_post_message, ..]
|
99
|
+
*pk.curated_tools.LINEAR,
|
100
|
+
"https://github.com/my-org/some-awesome-tool",
|
101
|
+
]
|
102
|
+
)
|
103
|
+
tools = pklc.get_tools()
|
104
|
+
|
105
|
+
llm = ChatOpenAI()
|
106
|
+
llm_tool_binding = llm.bind_tools(tools)
|
107
|
+
llm_tool_binding.invoke(...)
|
108
|
+
```
|
109
|
+
|
110
|
+
### Using out-of-the-box auth for various tools
|
111
|
+
|
112
|
+
There are two kinds of auth process, one is using system auth(developer api key) and the other is using end user auth.
|
113
|
+
|
114
|
+
Pocket provides way to use end user auth easily.
|
115
|
+
(Of course, you can also just set your STRIPE_API_KEY when using Stripe API related tools)
|
116
|
+
|
117
|
+
- Supported methods
|
118
|
+
|
119
|
+
- [x] OAuth
|
120
|
+
- [x] Token
|
121
|
+
- [ ] Basic Auth (Username, Password)
|
122
|
+
|
123
|
+
- Supported OAuth Providers
|
124
|
+
- [x] Google
|
125
|
+
- [x] GitHub
|
126
|
+
- [x] Slack
|
127
|
+
- [x] Linear
|
128
|
+
- [ ] Facebook
|
129
|
+
- [ ] X (Previously Twitter)
|
130
|
+
- [ ] LinkedIn
|
131
|
+
- [ ] Discord
|
132
|
+
- [ ] Zoom
|
133
|
+
- [ ] Microsoft
|
134
|
+
- [ ] Spotify
|
135
|
+
- [ ] Twitch
|
136
|
+
|
137
|
+
You can manage your auths in request-wise level. (e.g. you can use different auths for different requests)
|
138
|
+
|
139
|
+
```python
|
140
|
+
from langchain_openai import ChatOpenAI
|
141
|
+
from langgraph.graph import StateGraph, START, MessagesState
|
142
|
+
from langgraph.prebuilt import tools_condition
|
143
|
+
|
144
|
+
import hyperpocket as pk
|
145
|
+
import hyperpocket.curated_tools
|
146
|
+
from pocket_langgraph import PocketLanggraph
|
147
|
+
|
148
|
+
pklg = PocketLanggraph(
|
149
|
+
tools=[
|
150
|
+
*pk.curated_tools.SLACK, # SLACK = [slack_get_message, slack_post_message, ..]
|
151
|
+
*pk.curated_tools.LINEAR,
|
152
|
+
"https://github.com/my-org/some-awesome-tool",
|
153
|
+
],
|
154
|
+
)
|
155
|
+
llm = ChatOpenAI()
|
156
|
+
|
157
|
+
# Langgraph
|
158
|
+
pk_tool_node = pklg.get_tool_node()
|
159
|
+
llm_tool_binding = llm.bind_tools(pklg.get_tools())
|
160
|
+
|
161
|
+
# ...
|
162
|
+
|
163
|
+
graph_builder = StateGraph(MessagesState)
|
164
|
+
|
165
|
+
graph_builder.add_node('llm', llm)
|
166
|
+
graph_builder.add_node('tools', pk_tool_node)
|
167
|
+
graph_builder.add_edge(START, llm)
|
168
|
+
graph_builder.add_conditional_edges("llm", tools_condition)
|
169
|
+
graph_builder.add_edge(pk_tool_node, llm)
|
170
|
+
|
171
|
+
# ...
|
172
|
+
|
173
|
+
graph_builder.compile()
|
174
|
+
|
175
|
+
```
|
176
|
+
|
177
|
+
```python
|
178
|
+
from llama_index.core.agent import FunctionCallingAgent
|
179
|
+
from llama_index.llms.openai import OpenAI
|
180
|
+
from pocket_llamaindex import PocketLlamaindex
|
181
|
+
|
182
|
+
from hyperpocket.config import secret
|
183
|
+
from hyperpocket.tool import from_git
|
184
|
+
|
185
|
+
llm = OpenAI(api_key=secret["OPENAI_API_KEY"])
|
186
|
+
pocket = PocketLlamaindex(
|
187
|
+
tools=[
|
188
|
+
from_git("https://github.com/vessl-ai/tool-calling", "main", "examples/slack-get-message"),
|
189
|
+
from_git("https://github.com/vessl-ai/tool-calling", "main", "examples/slack-post-message"),
|
190
|
+
from_git("https://github.com/vessl-ai/tool-calling", "main", "examples/linear-get-issues"),
|
191
|
+
from_git("https://github.com/vessl-ai/tool-calling", "main", "examples/google-get-calendar-events"),
|
192
|
+
from_git("https://github.com/vessl-ai/tool-calling", "main", "examples/google-get-calendar-list"),
|
193
|
+
from_git("https://github.com/vessl-ai/tool-calling", "main", "examples/google-insert-calendar-events"),
|
194
|
+
from_git("https://github.com/vessl-ai/tool-calling", "main", "examples/github-pr-list"),
|
195
|
+
]
|
196
|
+
)
|
197
|
+
tools = pocket.get_tools()
|
198
|
+
|
199
|
+
agent = FunctionCallingAgent.from_tools(tools=tools, llm=llm)
|
200
|
+
```
|
201
|
+
|
202
|
+
### Specifying auth methods for tool type
|
203
|
+
|
204
|
+
Some resources support multiple auth methods. Your end user should be able to select between those methods.
|
205
|
+
|
206
|
+
```text
|
207
|
+
Human: List my slack messages in 'general' channel
|
208
|
+
|
209
|
+
Assistance: To access your slack messages, you need authentication. Slack api provides 1) bot token auth 2) OAuth auth. Which do you want to proceed?
|
210
|
+
|
211
|
+
Human: I'll go with OAuth
|
212
|
+
|
213
|
+
Assistance: You need chat:read, channel:history scopes to list messages. Do you confirm?
|
214
|
+
|
215
|
+
Human: OK.
|
216
|
+
|
217
|
+
Assistance: Please proceed to the following url and finish authentication. After that, let me know.
|
218
|
+
> https://slack.com/authorize?clientId=xxx&scope=chat:read,channel:history&redirect_url=xxx
|
219
|
+
|
220
|
+
Human: I'm done. (if necessary)
|
221
|
+
|
222
|
+
Assistance: I've checked you finished your auth. Let me search messages in slack channel 'general'.
|
223
|
+
|
224
|
+
Assistance: Here are the recent 10 messages.
|
225
|
+
(...)
|
226
|
+
|
227
|
+
|
228
|
+
```
|
229
|
+
|
230
|
+
### Config
|
231
|
+
|
232
|
+
Running `pocket config init` will create your config file in `$HOME/.pocket/settings.toml`
|
233
|
+
|
234
|
+
The `settings.toml` looks as follows.
|
235
|
+
|
236
|
+
TODO: Add `secrets.toml`.
|
237
|
+
|
238
|
+
```toml
|
239
|
+
log_level = "debug"
|
240
|
+
internal_server_port = "8000" # optional, default is 8000
|
241
|
+
public_hostname = "localhost" # optional, default is localhost
|
242
|
+
public_server_protocol = "https" # optional, default is https
|
243
|
+
public_server_port = "8001" # optional, default is 8001
|
244
|
+
enable_local_callback_proxy = "true" # optional, default is true, can be turned off when running in production behind TLS termination
|
245
|
+
callback_url_rewrite_prefix = "proxy" # optional, default is proxy, auth callback url prefix
|
246
|
+
|
247
|
+
[session]
|
248
|
+
session_type = "redis" # optional, default is in-memory
|
249
|
+
[session.redis]
|
250
|
+
host = "localhost"
|
251
|
+
port = 6379
|
252
|
+
db = 0
|
253
|
+
|
254
|
+
[git]
|
255
|
+
[git.github]
|
256
|
+
github_token = "<Your github PAT>" # optional, your github personal access token
|
257
|
+
app_id = "<Your github app id>" # optional, your github app id
|
258
|
+
app_installation_id = "<Your github app installation id>" # optional, your github app installation id
|
259
|
+
app_private_key = "<Your github app private key>" # optional, your github app private key
|
260
|
+
|
261
|
+
[auth]
|
262
|
+
[auth.slack] # add your slack app's client id and secret for slack auth
|
263
|
+
client_id = "" # your slack client id
|
264
|
+
client_secret = "" # your slack client secret
|
265
|
+
|
266
|
+
[auth.github] # add your github app's client id and secret for github auth
|
267
|
+
client_id = "" # your github client id
|
268
|
+
client_secret = "" # your github client secret
|
269
|
+
```
|
270
|
+
|
271
|
+
#### How to integrate github OAuth app
|
272
|
+
|
273
|
+
1. Follow the github documentation to create a new OAuth
|
274
|
+
app. https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/creating-an-oauth-app
|
275
|
+
|
276
|
+
- While creating your github OAuth app, configuring your app's `Authorization callback URL` is different for your
|
277
|
+
development environment and production environment.
|
278
|
+
- For development environment, you can use `http://localhost:8000/auth/github/callback`
|
279
|
+
- **Note**: Default port for pocket dev server is `8000`. If you are using a different port, make sure to
|
280
|
+
replace `8000` with your actual port number.
|
281
|
+
- For production environment, you can use `https://yourdomain.com/auth/github/callback`
|
282
|
+
- **Note**: Make sure to replace `yourdomain.com` with your actual domain name that this app will be hosted on.
|
283
|
+
|
284
|
+
#### How to integrate SLACK OAuth app
|
285
|
+
|
286
|
+
1. Follow the slack documentation to create a new Oauth APP. https://api.slack.com/quickstart
|
287
|
+
|
288
|
+
2. Setting Redirect URLs, Scopes at OAuth & Permissions tap in slack APP page
|
289
|
+
|
290
|
+
- Redirect URLs :
|
291
|
+
`{public_server_protocol}://{public_hostname}:[{public_server_port}]/{callback_url_rewrite_prefix}/auth/slack/oauth2/callback`
|
292
|
+
- Scopes : What you want to request to user.
|
293
|
+
- Recommended scopes :
|
294
|
+
- channels:history,
|
295
|
+
- channels:read,
|
296
|
+
- chat:write,
|
297
|
+
- groups:history,
|
298
|
+
- groups:read,
|
299
|
+
- im:history,
|
300
|
+
- mpim:history,
|
301
|
+
- reactions:read,
|
302
|
+
- reactions:write,
|
303
|
+
|
304
|
+
3. Set your Slack APP Client ID / Client Secret in `$HOME/.pocket/settings.toml`
|
@@ -0,0 +1,131 @@
|
|
1
|
+
hyperpocket/__init__.py,sha256=iaJvrZ0rgHwAndGFVv8m1Iz_DWtWEcphFPL-1D8f9SY,136
|
2
|
+
hyperpocket/auth/README.KR.md,sha256=IdVj2XHpeI-zuJMEAcRJo3DgzvWFIG4lK4olEcTyId4,13337
|
3
|
+
hyperpocket/auth/README.md,sha256=Z7hkeJCLqPXGjA3teXcswNMbE3QnXoBwkwxW174DzKg,11547
|
4
|
+
hyperpocket/auth/__init__.py,sha256=bPmdxg9OjjzCLGkEywoDitEuhYziepqxgBT_19O_VF0,1152
|
5
|
+
hyperpocket/auth/calendly/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
6
|
+
hyperpocket/auth/calendly/context.py,sha256=oUQzLy_w5NPvbXjFPOhLD-ggONVSy9VVpFabvX4ZpsY,408
|
7
|
+
hyperpocket/auth/calendly/oauth2_context.py,sha256=SiMeZaoWh3aneZVH_MXsT_cZ8qCSVeL-pWHVbfYUS6g,848
|
8
|
+
hyperpocket/auth/calendly/oauth2_handler.py,sha256=ulfhIcj_GCGIIZHVV9v42p2miHVsE3fpKODnrwz4qU0,5296
|
9
|
+
hyperpocket/auth/calendly/oauth2_schema.py,sha256=9JFogAWFAB7nzCww7NXDYuunY6S28wQZzPX41TWfMig,373
|
10
|
+
hyperpocket/auth/context.py,sha256=r19VtTK5FGcmvCgCOr16oNJ0GMFYmgaMEe2EHKJhtQY,1302
|
11
|
+
hyperpocket/auth/github/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
12
|
+
hyperpocket/auth/github/context.py,sha256=Y0QOCNbtQfNDsmgq47s0YGUxTl1QQC-qq4Hm2aZonJ8,404
|
13
|
+
hyperpocket/auth/github/oauth2_context.py,sha256=Ge8rkScRpcAWMMzSWTt2gWrDyi0UehTeZepf39Q6BK0,828
|
14
|
+
hyperpocket/auth/github/oauth2_handler.py,sha256=4HP0WE9cd3I6v4s9ZXvwNPhFPNk9b6L_MByTOvFvAIc,5059
|
15
|
+
hyperpocket/auth/github/oauth2_schema.py,sha256=XfeSF820natq9kwoDKbY2I9TgdjxP-hPkdoGGrKjSuA,371
|
16
|
+
hyperpocket/auth/github/token_context.py,sha256=evstL4mZsWHe9Io1RwBc90VfFOnVAbRk8BI1HseYwg8,446
|
17
|
+
hyperpocket/auth/github/token_handler.py,sha256=Vz5CqkGk8a6mb4xpw_Lhidwy4cZD7wTrK6iPKIRb15E,2777
|
18
|
+
hyperpocket/auth/github/token_schema.py,sha256=8vbJIYWqX_p4GPAtM5xMx5iwo9oZOtZTuSYcnpFGeio,209
|
19
|
+
hyperpocket/auth/google/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
20
|
+
hyperpocket/auth/google/context.py,sha256=1ziH27dXPsxp4WkdlyKos37lF623IIs4kX8cmat8QrY,426
|
21
|
+
hyperpocket/auth/google/oauth2_context.py,sha256=u7TayAfxPUFWuggtlceub22vHIURF0ZV5Do4jUqLWQ0,1023
|
22
|
+
hyperpocket/auth/google/oauth2_handler.py,sha256=547NPhFhi7lpmeVgZ99g_O3IizBMKZ9iAd27RrRNhS4,4880
|
23
|
+
hyperpocket/auth/google/oauth2_schema.py,sha256=E_hyNrb-Ro2UWs2AjhmFDBHwaTEsHZa0rQBhUcCWWKk,411
|
24
|
+
hyperpocket/auth/handler.py,sha256=9R6uQ7bPwmkZUUyg0Q1iOSwmWEQKnGEe92XiLeaxM0w,6580
|
25
|
+
hyperpocket/auth/linear/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
26
|
+
hyperpocket/auth/linear/context.py,sha256=hkxVDYO2jB3FCqIz_bMyB3n6OO74PpLI4LiW-42NFNQ,429
|
27
|
+
hyperpocket/auth/linear/token_context.py,sha256=Sr3toWp_TwN0K73WDvdvtwUMmnOIXXjMwph5DF4ytf4,472
|
28
|
+
hyperpocket/auth/linear/token_handler.py,sha256=wLOodmgXHH4AQWz1tJEHtjrglP3tP1uEDeMQOgQHrRA,2683
|
29
|
+
hyperpocket/auth/linear/token_schema.py,sha256=oTy-gOZvXEmGVStgFfnNmlbkknNepOTI5KIeTQLRxus,209
|
30
|
+
hyperpocket/auth/provider.py,sha256=e7i7RMN1Vv8ymMRj2IbsKjOzuw3jA1wkoMU5u0OGwPw,435
|
31
|
+
hyperpocket/auth/schema.py,sha256=8J6PIXpFIJyuVhkZzz6X_TiKOz7sFGdUW0qmZD8x3MA,529
|
32
|
+
hyperpocket/auth/slack/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
33
|
+
hyperpocket/auth/slack/context.py,sha256=f8dMs7QtSSyissOlPGw8rCZXsVUckFnZWjZ_LAmNXpA,429
|
34
|
+
hyperpocket/auth/slack/oauth2_context.py,sha256=0FJjJIIcVp1-G4EZu85gJeSXor-zOFI4ua2z0R_sFqI,1374
|
35
|
+
hyperpocket/auth/slack/oauth2_handler.py,sha256=8v9gSGkKMPoqEFGFyjCI1qdvklpyeml-5qeoUFo54Xg,5902
|
36
|
+
hyperpocket/auth/slack/oauth2_schema.py,sha256=eu2jF2thmaz66AKcnivTvIBLTbeF-a-xQFMkR4RQYX8,1056
|
37
|
+
hyperpocket/auth/slack/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
38
|
+
hyperpocket/auth/slack/tests/test_oauth2_handler.py,sha256=_tY4gGRgo6plVrtg7XnsinTCyI0DoaLLl7-SKRoCva8,1189
|
39
|
+
hyperpocket/auth/slack/tests/test_token_handler.py,sha256=fN6MifNKofyUhCBbDXHglVWG-A-gUxkBRK2nLmd_QF8,784
|
40
|
+
hyperpocket/auth/slack/token_context.py,sha256=FN19UKrTU-gozrc-i5q9ZhIJZz6joF8yIND5r_9m7jc,462
|
41
|
+
hyperpocket/auth/slack/token_handler.py,sha256=yaJtlOqJP436ubY2VluGxLuFpPo0jh8Y8V3PHUai4X8,2557
|
42
|
+
hyperpocket/auth/slack/token_schema.py,sha256=mAwOtRO2tW5OtDzbllDJtR_uhLD8ShQAjezkAZnAgd0,207
|
43
|
+
hyperpocket/auth/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
44
|
+
hyperpocket/auth/tests/test_google_oauth2_handler.py,sha256=bGWUvKF3X_UQEdp7hmwTBLdma3qcmWxB716d3r5s09o,5658
|
45
|
+
hyperpocket/auth/tests/test_slack_oauth2_handler.py,sha256=7WU26bVqDI3RdzDYsHEz2ooAGTwNVl2CxliYttbb17k,5412
|
46
|
+
hyperpocket/auth/tests/test_slack_token_handler.py,sha256=1hpOQ85i_yJFsOdSN8Tzk8tZbw9SPhPRcZWDty76hA4,2641
|
47
|
+
hyperpocket/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
48
|
+
hyperpocket/cli/__main__.py,sha256=9x5rL3NnEH8j9cyMBEvCtPncf9HM9dvRZvoDrr1lpjY,119
|
49
|
+
hyperpocket/cli/pull.py,sha256=1Ku0WKLtlZFnEDvU0m10XsVJcysMxDwdEMzTYgNz0xE,548
|
50
|
+
hyperpocket/cli/sync.py,sha256=joL5aMVZSkKJxDiaSPRiLDhgmdak6CtOUiWx5H1K6lM,526
|
51
|
+
hyperpocket/config/__init__.py,sha256=deIffu5NBOlSS1X774QuMlf_yb6P2qBQm6tkcf4s8DU,307
|
52
|
+
hyperpocket/config/auth.py,sha256=5Zk7OZmElIqIn7LxsT7H4g3bimBxaKpnbL2v9Fs9MlA,797
|
53
|
+
hyperpocket/config/git.py,sha256=CGbY7J1LyN4ccZr9CFGAQwwhjC9kvdU0On_nsAsZ1FQ,362
|
54
|
+
hyperpocket/config/logger.py,sha256=Wwl-8lllaCNLZruxXU-bcC74Ciy5SmPOX4AJE5BUzWM,2769
|
55
|
+
hyperpocket/config/session.py,sha256=CSXENtWx6Gh4DiPh4u9E-4MFYkM8JRjl2hSPV9PVfrE,801
|
56
|
+
hyperpocket/config/settings.py,sha256=YJ5cPXdy8r5lJVVyn4HXcpQHVhozk2B9zUhS8QYwao8,2103
|
57
|
+
hyperpocket/constants.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
58
|
+
hyperpocket/curated_tools.py,sha256=YxTQGXsbWgB1KyC7JEzS9CS86SlyCZCODMJEanW6PHE,353
|
59
|
+
hyperpocket/external/__init__.py,sha256=d6G2TAJSKvu3Bq1kE8j2_M0eTAqYZRWcAm3ePh0qaMI,119
|
60
|
+
hyperpocket/external/github_client.py,sha256=89DkXoyBrpE_YoBasTJ5d87w3Ih47UTD_Aw8w9RaN1k,639
|
61
|
+
hyperpocket/futures/__init__.py,sha256=_pRnYZLbogkYFInA3jokkxrcEVRt6YNaBmkf_dSk3SM,136
|
62
|
+
hyperpocket/futures/futurestore.py,sha256=4DeLlnLz-vdwjYKSVvgx-DNeEPLtzuIDo0xCuY1Aq9Y,1328
|
63
|
+
hyperpocket/pocket_auth.py,sha256=5zN8l2DJOy9ogBFGPmO3-F0NoiGVTw4raRrwk0vbXpw,16001
|
64
|
+
hyperpocket/pocket_main.py,sha256=ReQctlEOyrZftnnZshmT3R9Conk1s1Pyru7jDBH-CtI,12368
|
65
|
+
hyperpocket/prompts.py,sha256=Kl19Vlzc3hX_g04s17WSW5dLp-mvi0JELxJxCy2z7tU,754
|
66
|
+
hyperpocket/repository/__init__.py,sha256=dVwj6KN-cazbIbFC2t0cqz7BOtoZWRgGfnC5-lrsXAg,202
|
67
|
+
hyperpocket/repository/lock.py,sha256=wg1zkDYh58U6D1EU-gXhCwrwnZI-qe0esO1dJsjkldA,5359
|
68
|
+
hyperpocket/repository/lockfile.py,sha256=qiJiLPRT7zhR3WY6OiCrsxDF45CZBQtM5pi5bjGmPVQ,2003
|
69
|
+
hyperpocket/repository/repository.py,sha256=Kw5FiFWdjCl07477bb9vCmUmFnP889mBIvb6JfMmKh4,567
|
70
|
+
hyperpocket/server/__init__.py,sha256=TLqok_mBeV3VRnbZ_spwrwwbsjJ1q9o375AdBk7tKNA,89
|
71
|
+
hyperpocket/server/auth/__init__.py,sha256=UsXwHbu6BVgCD9REcIyD3sY0aj3svRnArPi375joE2U,653
|
72
|
+
hyperpocket/server/auth/calendly.py,sha256=mi9_ysn0SffhnEgaoNa2jcHWCcD_yzqkS0rvzpJG2Qg,478
|
73
|
+
hyperpocket/server/auth/github.py,sha256=cgUtdCYPhf_e51fEQgiYjyG6yuPfMV5RmltjujuWcBw,759
|
74
|
+
hyperpocket/server/auth/google.py,sha256=_C33Bzow7yzjnvf0WUObu8p-dSU5rXqBgSPrENORAmY,470
|
75
|
+
hyperpocket/server/auth/linear.py,sha256=3Ii8jewBCwS2pH3_mSJzBWot1t8IcVghC9K_ohid-H8,448
|
76
|
+
hyperpocket/server/auth/slack.py,sha256=HSfru4_S3B_sEF_keCBLEsNyYeyc92eL5I2a-2TKf64,716
|
77
|
+
hyperpocket/server/auth/token.py,sha256=Q38Tt5ly2vLsR0dxjmnJNX2IqS-FkTsm94bO6e2wtYk,1700
|
78
|
+
hyperpocket/server/proxy.py,sha256=OhpAWpilM5ioKAsqInKudtvpYk56nMFeZ-dwoGAYIDA,1905
|
79
|
+
hyperpocket/server/server.py,sha256=y_VaN97UUhCHbIPiadcjh_e1-A0LgZYZvDUbVYgizoo,6604
|
80
|
+
hyperpocket/server/tool/__init__.py,sha256=khNLe3H2W7WXKQlHjXuuvd9R87eHOAZhDsQmjDcbYsg,210
|
81
|
+
hyperpocket/server/tool/dto/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
82
|
+
hyperpocket/server/tool/dto/script.py,sha256=SPbEIUY9vi_OMsYPMFOkJdpbQCT4-Z3Wy4taiQ3Efy4,361
|
83
|
+
hyperpocket/server/tool/wasm.py,sha256=TiOcymQq0o_nvRwF9HfshnfP6K1LvFMv2fC5DqQOz8k,1170
|
84
|
+
hyperpocket/session/README.KR.md,sha256=SakXbqbrXYr9hUWBW-muvd5wo2fXSq72q4FbDX8x80k,1968
|
85
|
+
hyperpocket/session/README.md,sha256=MVE14e0A1XL-XJlE2toxaXrk1u2t1ytguejWOrkJRdQ,1958
|
86
|
+
hyperpocket/session/__init__.py,sha256=-zdfZfXwR336liAYjwcZULIHg_72NxMMcDFz_RQGLGk,260
|
87
|
+
hyperpocket/session/in_memory.py,sha256=ynPuFcoXiLdeyPRGO_l7aZqHckNMI7fuTxsM9TAo5s8,2928
|
88
|
+
hyperpocket/session/interface.py,sha256=M5GAVjLDJYtABAoX8ne-Na7cY69Xv1FyQ_vLS4atxdw,4467
|
89
|
+
hyperpocket/session/redis.py,sha256=3zHdSEytB0e9jksvTPK_YJmqeQlQG0JlOWHLwZazBXU,4653
|
90
|
+
hyperpocket/session/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
91
|
+
hyperpocket/session/tests/test_in_memory.py,sha256=hc8-u9hxGds7KJA6yUQjcgI1XN0a3zfTVGvr8dJwsG0,4887
|
92
|
+
hyperpocket/session/tests/test_redis.py,sha256=_wUMnQFTMty4BckSNQMRreH7nlkvNUYgL0HRkstf0Jg,5025
|
93
|
+
hyperpocket/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
94
|
+
hyperpocket/tests/test_pocket.py,sha256=JN1WDaOa03pfpdlBwc1dFXQldQTgauDaRIDITDZ2IHg,2821
|
95
|
+
hyperpocket/tests/test_pocket_auth.py,sha256=mKKiIZzriOHgbavP5eiW5P5LrZ2JKJHwh_TZDHsLK6Q,39115
|
96
|
+
hyperpocket/tool/README.KR.md,sha256=BNllN_z-_40cRg8VRmWoAr4pufNUsw3tgta60iBtZuU,2744
|
97
|
+
hyperpocket/tool/README.md,sha256=cOH1EGubzlKkugkvrO-r7rSIhwbwaAyl1p69_eoV8fs,2689
|
98
|
+
hyperpocket/tool/__init__.py,sha256=GgqQp6Zm_ti4eXuBsYQWDWOQyrlXrOu7bzdJxVbkEJE,318
|
99
|
+
hyperpocket/tool/builtins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
100
|
+
hyperpocket/tool/builtins/example/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
101
|
+
hyperpocket/tool/builtins/example/add_tool.py,sha256=zab3KyenJ3iw9qXrPUR5MDbH3TfcraZCpuVSjHLPpDY,525
|
102
|
+
hyperpocket/tool/function/README.KR.md,sha256=tnMVdiwIVGBhDCxB8pI2zRSCrM9f6rSp2TO9QAApNpM,2833
|
103
|
+
hyperpocket/tool/function/README.md,sha256=Fkq7SNijhmLo8T7dbMDPXZLyxI0-qqJ7LrTPUcTcgC4,2999
|
104
|
+
hyperpocket/tool/function/__init__.py,sha256=1IPjND3wgBeBj2tecBNZ3VxtpRZ3VWtlIphzm3too5U,207
|
105
|
+
hyperpocket/tool/function/annotation.py,sha256=EKoBZpgYWxC3BCo0NjhtCVNeVHmmp_lpNH5fLVLUS7g,952
|
106
|
+
hyperpocket/tool/function/tool.py,sha256=sHhrngUNpoRXyrJ3Xd6Rn0RoxnBuU9Sbbfde5q7RKBk,2646
|
107
|
+
hyperpocket/tool/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
108
|
+
hyperpocket/tool/tests/test_function_tool.py,sha256=e8RgXJg_ShbIxxFS7rjAO4lCsXvbsyJF9YCf3CuT79o,8125
|
109
|
+
hyperpocket/tool/tool.py,sha256=TwilwztUXwSa5w6rJ_DpiDtTOjwfKlMmVGtgNMaotNA,4428
|
110
|
+
hyperpocket/tool/wasm/README.KR.md,sha256=qOUcwuJOuKVFKgKqe7EE_xwVh8Zn5IJmwEtSpuLW0Vg,3438
|
111
|
+
hyperpocket/tool/wasm/README.md,sha256=l4rNlU2WVZ8fx3M1EkOnt3w1hRfqnTeRBttFdYk8eeY,3259
|
112
|
+
hyperpocket/tool/wasm/__init__.py,sha256=KGOPPyA1CnbW-T9bgSpfIXf9952l_p5HJDhHGBb3b9o,71
|
113
|
+
hyperpocket/tool/wasm/browser.py,sha256=X2aw9sZy306dKDR0knqn4fGC6O1fw08M9t_zIkjUeWs,2083
|
114
|
+
hyperpocket/tool/wasm/invoker.py,sha256=u8ZfGW871IVBaG4_XbOQHfp7QYLS093QdwVa3HOL-_k,1520
|
115
|
+
hyperpocket/tool/wasm/script.py,sha256=nhCQ_Ve_Kz5zaKJcV9O6Ixw1a-Rd1zq1yZk5HOwZqt0,2612
|
116
|
+
hyperpocket/tool/wasm/templates/__init__.py,sha256=cQ-uNsO418xvv54i8bD0IrqcAKUxMuyZoG3ShP72olw,949
|
117
|
+
hyperpocket/tool/wasm/templates/node.py,sha256=8ghVQGS9L3IJGdBB8waLK_ej4FS34dCA_bwPKjm8QSU,2782
|
118
|
+
hyperpocket/tool/wasm/templates/python.py,sha256=uTjdaccwSi-QeDxsA5qfAAckxI7jsxtrPKi9in4X7EM,2347
|
119
|
+
hyperpocket/tool/wasm/tool.py,sha256=UcolQQh5qeiAYUUJlyyGE6y-zet-PGlBQTimXGqYoTc,4782
|
120
|
+
hyperpocket/util/__init__.py,sha256=oXUL2g9SDCOQNhd5OW_VZoUcKy3vghoHWHqsmdm_BGA,59
|
121
|
+
hyperpocket/util/extract_func_param_desc_from_docstring.py,sha256=2l8LmpreJZekIDXEA7FXY32nT9xlOa26P2h3AmekNQ4,4031
|
122
|
+
hyperpocket/util/find_all_leaf_class_in_package.py,sha256=afGLqe5s7irOOPh7DI70v-utDL2a0vhNzHjtgSmDeZU,528
|
123
|
+
hyperpocket/util/find_all_subclass_in_package.py,sha256=CfsM5sWHHbFZD6M-jbJRN8Zo3m57R1E7FGg_V__HdFU,964
|
124
|
+
hyperpocket/util/flatten_json_schema.py,sha256=PXK6I1S2QDxwSGmUVEl5bbSPrjTa38GBllBQ8uKXJNQ,1587
|
125
|
+
hyperpocket/util/function_to_model.py,sha256=f6806fVJfZp2PyXwN5ZoD8-4Bw81KMYlUEgFAXJuUas,1806
|
126
|
+
hyperpocket/util/get_objects_from_subpackage.py,sha256=Aq87PD_H57c2IjLS28Hf0Wu5vLVyoOtDoBvKzvQ1UPw,929
|
127
|
+
hyperpocket/util/json_schema_to_model.py,sha256=YFQSv_a-7OYf_6XPMyi097CKVm4sjDxy9k8DjlU9FP8,2897
|
128
|
+
hyperpocket-0.0.1.dist-info/METADATA,sha256=IutmsgAiMQGHLNMt1xsO-Dy2HkhzugzoQFx2LUxkybY,9977
|
129
|
+
hyperpocket-0.0.1.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
|
130
|
+
hyperpocket-0.0.1.dist-info/entry_points.txt,sha256=HP1S7F8Sozcu87qCmOSbUpl-bvodrJvjeodWKi4TlF0,50
|
131
|
+
hyperpocket-0.0.1.dist-info/RECORD,,
|