hyperpocket-llamaindex 0.1.8__tar.gz → 0.1.10__tar.gz
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.
- {hyperpocket_llamaindex-0.1.8 → hyperpocket_llamaindex-0.1.10}/.gitignore +1 -0
- {hyperpocket_llamaindex-0.1.8 → hyperpocket_llamaindex-0.1.10}/PKG-INFO +2 -2
- {hyperpocket_llamaindex-0.1.8 → hyperpocket_llamaindex-0.1.10}/hyperpocket_llamaindex/pocket_llamaindex.py +35 -6
- {hyperpocket_llamaindex-0.1.8 → hyperpocket_llamaindex-0.1.10}/pyproject.toml +2 -2
- hyperpocket_llamaindex-0.1.10/tests/test_pocket_llamaindex_no_profile.py +137 -0
- hyperpocket_llamaindex-0.1.8/tests/test_pocket_llamaindex.py → hyperpocket_llamaindex-0.1.10/tests/test_pocket_llamaindex_use_profile.py +19 -8
- {hyperpocket_llamaindex-0.1.8 → hyperpocket_llamaindex-0.1.10}/README.md +0 -0
- {hyperpocket_llamaindex-0.1.8 → hyperpocket_llamaindex-0.1.10}/__init__.py +0 -0
- {hyperpocket_llamaindex-0.1.8 → hyperpocket_llamaindex-0.1.10}/hyperpocket_llamaindex/__init__.py +0 -0
- {hyperpocket_llamaindex-0.1.8 → hyperpocket_llamaindex-0.1.10}/tests/__init__.py +0 -0
- {hyperpocket_llamaindex-0.1.8 → hyperpocket_llamaindex-0.1.10}/uv.lock +0 -0
@@ -1,7 +1,7 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: hyperpocket-llamaindex
|
3
|
-
Version: 0.1.
|
4
|
-
Author-email:
|
3
|
+
Version: 0.1.10
|
4
|
+
Author-email: Hyperpocket Team <hyperpocket@vessl.ai>
|
5
5
|
Requires-Python: >=3.10
|
6
6
|
Requires-Dist: hyperpocket>=0.0.3
|
7
7
|
Requires-Dist: llama-index>=0.12.5
|
@@ -1,4 +1,6 @@
|
|
1
|
-
from typing import List,
|
1
|
+
from typing import List, Optional
|
2
|
+
|
3
|
+
from pydantic import BaseModel
|
2
4
|
|
3
5
|
try:
|
4
6
|
from llama_index.core.tools import FunctionTool, BaseTool, ToolMetadata
|
@@ -12,12 +14,27 @@ from hyperpocket.tool import Tool
|
|
12
14
|
|
13
15
|
|
14
16
|
class PocketLlamaindex(Pocket):
|
15
|
-
def get_tools(self) -> List[BaseTool]:
|
17
|
+
def get_tools(self, use_profile: Optional[bool] = None) -> List[BaseTool]:
|
18
|
+
if use_profile is not None:
|
19
|
+
self.use_profile = use_profile
|
20
|
+
|
16
21
|
tools = [self.get_tool(pk) for pk in self.core.tools.values()]
|
17
22
|
return tools
|
18
23
|
|
19
24
|
def get_tool(self, pocket_tool: Tool) -> BaseTool:
|
20
|
-
def _invoke(
|
25
|
+
def _invoke(**kwargs) -> str:
|
26
|
+
if self.use_profile:
|
27
|
+
body = kwargs["body"]
|
28
|
+
thread_id = kwargs.pop("thread_id", "default")
|
29
|
+
profile = kwargs.pop("profile", "default")
|
30
|
+
else:
|
31
|
+
body = kwargs
|
32
|
+
thread_id = "default"
|
33
|
+
profile = "default"
|
34
|
+
|
35
|
+
if isinstance(body, BaseModel):
|
36
|
+
body = body.model_dump()
|
37
|
+
|
21
38
|
result, interrupted = self.invoke_with_state(pocket_tool.name, body=body, thread_id=thread_id,
|
22
39
|
profile=profile, **kwargs)
|
23
40
|
say = result
|
@@ -25,7 +42,19 @@ class PocketLlamaindex(Pocket):
|
|
25
42
|
say = f'{say}\n\nThe tool execution interrupted. Please talk to me to resume.'
|
26
43
|
return say
|
27
44
|
|
28
|
-
async def _ainvoke(
|
45
|
+
async def _ainvoke(**kwargs) -> str:
|
46
|
+
if self.use_profile:
|
47
|
+
body = kwargs["body"]
|
48
|
+
thread_id = kwargs.pop("thread_id", "default")
|
49
|
+
profile = kwargs.pop("profile", "default")
|
50
|
+
else:
|
51
|
+
body = kwargs
|
52
|
+
thread_id = "default"
|
53
|
+
profile = "default"
|
54
|
+
|
55
|
+
if isinstance(body, BaseModel):
|
56
|
+
body = body.model_dump()
|
57
|
+
|
29
58
|
result, interrupted = await self.ainvoke_with_state(pocket_tool.name, body=body,
|
30
59
|
thread_id=thread_id, profile=profile, **kwargs)
|
31
60
|
say = result
|
@@ -37,8 +66,8 @@ class PocketLlamaindex(Pocket):
|
|
37
66
|
fn=_invoke,
|
38
67
|
async_fn=_ainvoke,
|
39
68
|
tool_metadata=ToolMetadata(
|
40
|
-
description=pocket_tool.description,
|
41
69
|
name=pocket_tool.name,
|
42
|
-
|
70
|
+
description=pocket_tool.get_description(use_profile=self.use_profile),
|
71
|
+
fn_schema=pocket_tool.schema_model(use_profile=self.use_profile),
|
43
72
|
)
|
44
73
|
)
|
@@ -1,9 +1,9 @@
|
|
1
1
|
|
2
2
|
[project]
|
3
3
|
name = "hyperpocket-llamaindex"
|
4
|
-
version = "0.1.
|
4
|
+
version = "0.1.10"
|
5
5
|
description = ""
|
6
|
-
authors = [{ name = "
|
6
|
+
authors = [{ name = "Hyperpocket Team", email = "hyperpocket@vessl.ai" }]
|
7
7
|
requires-python = ">=3.10"
|
8
8
|
readme = "README.md"
|
9
9
|
dependencies = ["llama-index>=0.12.5", "hyperpocket>=0.0.3"]
|
@@ -0,0 +1,137 @@
|
|
1
|
+
import ast
|
2
|
+
import json
|
3
|
+
from unittest.async_case import IsolatedAsyncioTestCase
|
4
|
+
|
5
|
+
from llama_index.agent.openai import OpenAIAgent
|
6
|
+
from llama_index.llms.openai import OpenAI
|
7
|
+
from pydantic import BaseModel
|
8
|
+
|
9
|
+
from hyperpocket.config import config, secret
|
10
|
+
from hyperpocket.tool import from_git
|
11
|
+
from hyperpocket_llamaindex import PocketLlamaindex
|
12
|
+
|
13
|
+
|
14
|
+
class TestPocketLlamaindexNoProfile(IsolatedAsyncioTestCase):
|
15
|
+
|
16
|
+
async def asyncSetUp(self):
|
17
|
+
config.public_server_port = "https"
|
18
|
+
config.public_hostname = "localhost"
|
19
|
+
config.public_server_port = 8001
|
20
|
+
config.internal_server_port = 8000
|
21
|
+
config.enable_local_callback_proxy = True
|
22
|
+
|
23
|
+
self.pocket = PocketLlamaindex(
|
24
|
+
tools=[
|
25
|
+
from_git("https://github.com/vessl-ai/hyperawesometools", "main",
|
26
|
+
"managed-tools/none/simple-echo-tool"),
|
27
|
+
self.add,
|
28
|
+
self.sub_pydantic_args
|
29
|
+
],
|
30
|
+
use_profile=False
|
31
|
+
)
|
32
|
+
|
33
|
+
self.llm = OpenAI(model="gpt-4o", api_key=secret["OPENAI_API_KEY"])
|
34
|
+
|
35
|
+
async def asyncTearDown(self):
|
36
|
+
self.pocket._teardown_server()
|
37
|
+
|
38
|
+
async def test_agent_no_profile(self):
|
39
|
+
# given
|
40
|
+
agent = OpenAIAgent.from_tools(
|
41
|
+
tools=self.pocket.get_tools(),
|
42
|
+
llm=OpenAI(model="gpt-4o", api_key=secret["OPENAI_API_KEY"]),
|
43
|
+
verbose=True
|
44
|
+
)
|
45
|
+
|
46
|
+
# when
|
47
|
+
agent.query("add 1, 2")
|
48
|
+
agent.query("sub 1, 2")
|
49
|
+
agent.query("echo 'hello world'")
|
50
|
+
|
51
|
+
async def test_function_tool_no_profile(self):
|
52
|
+
# when
|
53
|
+
response = self.llm.chat_with_tools(user_msg="add 1, 2", tools=self.pocket.get_tools(), verbose=True)
|
54
|
+
message = response.message
|
55
|
+
tool_calls = message.additional_kwargs["tool_calls"]
|
56
|
+
|
57
|
+
tool_name = tool_calls[0].function.name
|
58
|
+
args = tool_calls[0].function.arguments
|
59
|
+
args = json.loads(args)
|
60
|
+
|
61
|
+
result = await self.pocket.ainvoke(tool_name=tool_name, body=args)
|
62
|
+
|
63
|
+
# then
|
64
|
+
self.assertEqual(tool_name, "add")
|
65
|
+
self.assertEqual(args, {
|
66
|
+
"a": 1,
|
67
|
+
"b": 2,
|
68
|
+
})
|
69
|
+
self.assertEqual(result, '3')
|
70
|
+
|
71
|
+
async def test_pydantic_function_tool_no_profile(self):
|
72
|
+
# when
|
73
|
+
response = self.llm.chat_with_tools(user_msg="sub 1, 2", tools=self.pocket.get_tools(), verbose=True)
|
74
|
+
tool_calls = response.message.additional_kwargs["tool_calls"]
|
75
|
+
|
76
|
+
tool_name = tool_calls[0].function.name
|
77
|
+
args = tool_calls[0].function.arguments
|
78
|
+
args = json.loads(args)
|
79
|
+
|
80
|
+
result = await self.pocket.ainvoke(tool_name=tool_name, body=args)
|
81
|
+
|
82
|
+
# then
|
83
|
+
self.assertEqual(tool_name, "sub_pydantic_args")
|
84
|
+
self.assertEqual(args, {
|
85
|
+
"a": {"first": 1},
|
86
|
+
"b": {"second": 2},
|
87
|
+
})
|
88
|
+
self.assertEqual(result, '-1')
|
89
|
+
|
90
|
+
async def test_wasm_tool_no_profile(self):
|
91
|
+
# when
|
92
|
+
response = self.llm.chat_with_tools(user_msg="echo 'hello world'", tools=self.pocket.get_tools(), verbose=True)
|
93
|
+
tool_calls = response.message.additional_kwargs["tool_calls"]
|
94
|
+
|
95
|
+
tool_name = tool_calls[0].function.name
|
96
|
+
args = tool_calls[0].function.arguments
|
97
|
+
args = json.loads(args)
|
98
|
+
|
99
|
+
result = await self.pocket.ainvoke(tool_name=tool_name, body=args)
|
100
|
+
output = ast.literal_eval(result)
|
101
|
+
|
102
|
+
# then
|
103
|
+
self.assertEqual(tool_name, "simple_echo_text")
|
104
|
+
self.assertEqual(args, {
|
105
|
+
"text": "hello world"
|
106
|
+
})
|
107
|
+
self.assertTrue(output["stdout"].startswith("echo message : hello world"))
|
108
|
+
|
109
|
+
@staticmethod
|
110
|
+
def add(a: int, b: int) -> int:
|
111
|
+
"""
|
112
|
+
Add two numbers
|
113
|
+
|
114
|
+
Args:
|
115
|
+
a(int): first number
|
116
|
+
b(int): second number
|
117
|
+
|
118
|
+
"""
|
119
|
+
|
120
|
+
return a + b
|
121
|
+
|
122
|
+
class FirstNumber(BaseModel):
|
123
|
+
first: int
|
124
|
+
|
125
|
+
class SecondNumber(BaseModel):
|
126
|
+
second: int
|
127
|
+
|
128
|
+
@staticmethod
|
129
|
+
def sub_pydantic_args(a: FirstNumber, b: SecondNumber):
|
130
|
+
"""
|
131
|
+
sub two numbers
|
132
|
+
|
133
|
+
Args:
|
134
|
+
a(FirstNumber): first number
|
135
|
+
b(SecondNumber): second number
|
136
|
+
"""
|
137
|
+
return a.first - b.second
|
@@ -1,3 +1,4 @@
|
|
1
|
+
import ast
|
1
2
|
import json
|
2
3
|
from unittest.async_case import IsolatedAsyncioTestCase
|
3
4
|
|
@@ -10,7 +11,7 @@ from hyperpocket.tool import from_git
|
|
10
11
|
from hyperpocket_llamaindex import PocketLlamaindex
|
11
12
|
|
12
13
|
|
13
|
-
class
|
14
|
+
class TestPocketLlamaindexUseProfile(IsolatedAsyncioTestCase):
|
14
15
|
|
15
16
|
async def asyncSetUp(self):
|
16
17
|
config.public_server_port = "https"
|
@@ -21,22 +22,31 @@ class TestPocketLlamaindex(IsolatedAsyncioTestCase):
|
|
21
22
|
|
22
23
|
self.pocket = PocketLlamaindex(
|
23
24
|
tools=[
|
24
|
-
from_git("https://github.com/vessl-ai/hyperawesometools", "main",
|
25
|
+
from_git("https://github.com/vessl-ai/hyperawesometools", "main",
|
26
|
+
"managed-tools/none/simple-echo-tool"),
|
25
27
|
self.add,
|
26
28
|
self.sub_pydantic_args
|
27
29
|
],
|
30
|
+
use_profile=True
|
28
31
|
)
|
29
32
|
|
30
|
-
self.
|
33
|
+
self.llm = OpenAI(model="gpt-4o", api_key=secret["OPENAI_API_KEY"])
|
34
|
+
|
35
|
+
async def asyncTearDown(self):
|
36
|
+
self.pocket._teardown_server()
|
37
|
+
|
38
|
+
async def test_agent_use_profile(self):
|
39
|
+
# given
|
40
|
+
agent = OpenAIAgent.from_tools(
|
31
41
|
tools=self.pocket.get_tools(),
|
32
42
|
llm=OpenAI(model="gpt-4o", api_key=secret["OPENAI_API_KEY"]),
|
33
43
|
verbose=True
|
34
44
|
)
|
35
45
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
46
|
+
# when
|
47
|
+
agent.query("add 1, 2")
|
48
|
+
agent.query("sub 1, 2")
|
49
|
+
agent.query("echo 'hello world'")
|
40
50
|
|
41
51
|
async def test_function_tool(self):
|
42
52
|
# when
|
@@ -87,13 +97,14 @@ class TestPocketLlamaindex(IsolatedAsyncioTestCase):
|
|
87
97
|
args = json.loads(args)
|
88
98
|
|
89
99
|
result = await self.pocket.ainvoke(tool_name=tool_name, **args)
|
100
|
+
output = ast.literal_eval(result)
|
90
101
|
|
91
102
|
# then
|
92
103
|
self.assertEqual(tool_name, "simple_echo_text")
|
93
104
|
self.assertEqual(args["body"], {
|
94
105
|
"text": "hello world"
|
95
106
|
})
|
96
|
-
self.assertTrue(
|
107
|
+
self.assertTrue(output["stdout"].startswith("echo message : hello world"))
|
97
108
|
|
98
109
|
@staticmethod
|
99
110
|
def add(a: int, b: int) -> int:
|
File without changes
|
File without changes
|
{hyperpocket_llamaindex-0.1.8 → hyperpocket_llamaindex-0.1.10}/hyperpocket_llamaindex/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|