jarviscore-framework 0.1.1__py3-none-any.whl → 0.2.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.
- examples/autoagent_distributed_example.py +211 -0
- examples/custom_profile_decorator.py +134 -0
- examples/custom_profile_wrap.py +168 -0
- examples/customagent_distributed_example.py +362 -0
- examples/customagent_p2p_example.py +730 -0
- jarviscore/__init__.py +49 -36
- jarviscore/adapter/__init__.py +15 -9
- jarviscore/adapter/decorator.py +23 -19
- jarviscore/adapter/wrapper.py +303 -0
- jarviscore/cli/scaffold.py +1 -1
- jarviscore/cli/smoketest.py +3 -2
- jarviscore/core/agent.py +44 -1
- jarviscore/core/mesh.py +196 -35
- jarviscore/data/examples/autoagent_distributed_example.py +211 -0
- jarviscore/data/examples/customagent_distributed_example.py +362 -0
- jarviscore/data/examples/customagent_p2p_example.py +730 -0
- jarviscore/docs/API_REFERENCE.md +264 -51
- jarviscore/docs/AUTOAGENT_GUIDE.md +198 -0
- jarviscore/docs/CONFIGURATION.md +35 -21
- jarviscore/docs/CUSTOMAGENT_GUIDE.md +1362 -0
- jarviscore/docs/GETTING_STARTED.md +107 -14
- jarviscore/docs/TROUBLESHOOTING.md +145 -7
- jarviscore/docs/USER_GUIDE.md +138 -361
- jarviscore/orchestration/engine.py +20 -8
- jarviscore/p2p/__init__.py +10 -0
- jarviscore/p2p/coordinator.py +129 -0
- jarviscore/p2p/messages.py +87 -0
- jarviscore/p2p/peer_client.py +576 -0
- jarviscore/p2p/peer_tool.py +268 -0
- jarviscore_framework-0.2.1.dist-info/METADATA +144 -0
- jarviscore_framework-0.2.1.dist-info/RECORD +132 -0
- {jarviscore_framework-0.1.1.dist-info → jarviscore_framework-0.2.1.dist-info}/WHEEL +1 -1
- {jarviscore_framework-0.1.1.dist-info → jarviscore_framework-0.2.1.dist-info}/top_level.txt +1 -0
- test_logs/code_registry/functions/data_generator-558779ed_560ebc37.py +7 -0
- test_logs/code_registry/functions/data_generator-5ed3609e_560ebc37.py +7 -0
- test_logs/code_registry/functions/data_generator-66da0356_43970bb9.py +25 -0
- test_logs/code_registry/functions/data_generator-7a2fac83_583709d9.py +36 -0
- test_logs/code_registry/functions/data_generator-888b670f_aa235863.py +9 -0
- test_logs/code_registry/functions/data_generator-9ca5f642_aa235863.py +9 -0
- test_logs/code_registry/functions/data_generator-bfd90775_560ebc37.py +7 -0
- test_logs/code_registry/functions/data_generator-e95d2f7d_aa235863.py +9 -0
- test_logs/code_registry/functions/data_generator-f60ca8a2_327eb8c2.py +29 -0
- test_logs/code_registry/functions/mathematician-02adf9ee_958658d9.py +19 -0
- test_logs/code_registry/functions/mathematician-0706fb57_5df13441.py +23 -0
- test_logs/code_registry/functions/mathematician-153c9c4a_ba59c918.py +83 -0
- test_logs/code_registry/functions/mathematician-287e61c0_41daa793.py +18 -0
- test_logs/code_registry/functions/mathematician-2967af5a_863c2cc6.py +17 -0
- test_logs/code_registry/functions/mathematician-303ca6d6_5df13441.py +23 -0
- test_logs/code_registry/functions/mathematician-308a4afd_cbf5064d.py +73 -0
- test_logs/code_registry/functions/mathematician-353f16e2_0968bcf5.py +18 -0
- test_logs/code_registry/functions/mathematician-3c22475a_41daa793.py +17 -0
- test_logs/code_registry/functions/mathematician-5bac1029_0968bcf5.py +18 -0
- test_logs/code_registry/functions/mathematician-640f76b2_9198780b.py +19 -0
- test_logs/code_registry/functions/mathematician-752fa7ea_863c2cc6.py +17 -0
- test_logs/code_registry/functions/mathematician-baf9ef39_0968bcf5.py +18 -0
- test_logs/code_registry/functions/mathematician-bc8b2a2f_5df13441.py +23 -0
- test_logs/code_registry/functions/mathematician-c31e4686_41daa793.py +18 -0
- test_logs/code_registry/functions/mathematician-cc84c84c_863c2cc6.py +17 -0
- test_logs/code_registry/functions/mathematician-dd7c7144_9198780b.py +19 -0
- test_logs/code_registry/functions/mathematician-e671c256_41ea4487.py +74 -0
- test_logs/code_registry/functions/report_generator-1a878fcc_18d44bdc.py +47 -0
- test_logs/code_registry/functions/report_generator-25c1c331_cea57d0d.py +35 -0
- test_logs/code_registry/functions/report_generator-37552117_e711c2b9.py +35 -0
- test_logs/code_registry/functions/report_generator-bc662768_e711c2b9.py +35 -0
- test_logs/code_registry/functions/report_generator-d6c0e76b_5e7722ec.py +44 -0
- test_logs/code_registry/functions/report_generator-f270fb02_680529c3.py +44 -0
- test_logs/code_registry/functions/text_processor-11393b14_4370d3ed.py +40 -0
- test_logs/code_registry/functions/text_processor-7d02dfc3_d3b569be.py +37 -0
- test_logs/code_registry/functions/text_processor-8adb5e32_9168c5fe.py +13 -0
- test_logs/code_registry/functions/text_processor-c58ffc19_78b4ceac.py +42 -0
- test_logs/code_registry/functions/text_processor-cd5977b1_9168c5fe.py +13 -0
- test_logs/code_registry/functions/text_processor-ec1c8773_9168c5fe.py +13 -0
- tests/test_01_analyst_standalone.py +124 -0
- tests/test_02_assistant_standalone.py +164 -0
- tests/test_03_analyst_with_framework.py +945 -0
- tests/test_04_assistant_with_framework.py +1002 -0
- tests/test_05_integration.py +1301 -0
- tests/test_06_real_llm_integration.py +760 -0
- tests/test_07_distributed_single_node.py +578 -0
- tests/test_08_distributed_multi_node.py +454 -0
- tests/test_09_distributed_autoagent.py +509 -0
- tests/test_10_distributed_customagent.py +787 -0
- tests/test_mesh.py +35 -4
- jarviscore_framework-0.1.1.dist-info/METADATA +0 -137
- jarviscore_framework-0.1.1.dist-info/RECORD +0 -69
- {jarviscore_framework-0.1.1.dist-info → jarviscore_framework-0.2.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
"""
|
|
2
|
+
PeerTool - LLM Tool Adapter for Peer-to-Peer Communication
|
|
3
|
+
|
|
4
|
+
Wraps PeerClient to provide LLM-friendly tool definitions and execution.
|
|
5
|
+
Get this via `self.peers.as_tool()` in your agent.
|
|
6
|
+
|
|
7
|
+
Example:
|
|
8
|
+
class MyAgent:
|
|
9
|
+
def run(self, task):
|
|
10
|
+
# Get the tool adapter
|
|
11
|
+
peer_tool = self.peers.as_tool()
|
|
12
|
+
|
|
13
|
+
# Add to your tools list
|
|
14
|
+
tools = [SearchTool(), peer_tool]
|
|
15
|
+
|
|
16
|
+
# Get schemas for LLM (includes live peer list)
|
|
17
|
+
schemas = [t.schema for t in tools]
|
|
18
|
+
response = self.llm.chat(task, tools=schemas)
|
|
19
|
+
|
|
20
|
+
# Execute tool calls
|
|
21
|
+
for call in response.tool_calls:
|
|
22
|
+
if call.name in peer_tool.tool_names:
|
|
23
|
+
result = await peer_tool.execute(call.name, call.args)
|
|
24
|
+
"""
|
|
25
|
+
import asyncio
|
|
26
|
+
import logging
|
|
27
|
+
from typing import List, Dict, Any, TYPE_CHECKING
|
|
28
|
+
|
|
29
|
+
if TYPE_CHECKING:
|
|
30
|
+
from .peer_client import PeerClient
|
|
31
|
+
|
|
32
|
+
logger = logging.getLogger(__name__)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class PeerTool:
|
|
36
|
+
"""
|
|
37
|
+
LLM tool adapter for mesh peer communication.
|
|
38
|
+
|
|
39
|
+
Provides:
|
|
40
|
+
- schema: Tool definitions with dynamic peer list
|
|
41
|
+
- execute(): Dispatch tool calls to PeerClient
|
|
42
|
+
- tool_names: List of tool names for filtering
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
# Tool names this adapter handles
|
|
46
|
+
tool_names = ["ask_peer", "broadcast_update", "list_peers"]
|
|
47
|
+
|
|
48
|
+
def __init__(self, peer_client: 'PeerClient'):
|
|
49
|
+
"""
|
|
50
|
+
Initialize PeerTool.
|
|
51
|
+
|
|
52
|
+
Args:
|
|
53
|
+
peer_client: The PeerClient instance to wrap
|
|
54
|
+
"""
|
|
55
|
+
self._peers = peer_client
|
|
56
|
+
self._logger = logging.getLogger(
|
|
57
|
+
f"jarviscore.peer_tool.{peer_client.my_id}"
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
@property
|
|
61
|
+
def name(self) -> str:
|
|
62
|
+
"""Tool adapter name."""
|
|
63
|
+
return "peer_communication"
|
|
64
|
+
|
|
65
|
+
@property
|
|
66
|
+
def schema(self) -> List[Dict[str, Any]]:
|
|
67
|
+
"""
|
|
68
|
+
Tool definitions for LLM injection.
|
|
69
|
+
|
|
70
|
+
Returns list of tool schemas in Anthropic format.
|
|
71
|
+
Includes DYNAMIC peer information so LLM knows who's available.
|
|
72
|
+
"""
|
|
73
|
+
return self.get_tool_definitions()
|
|
74
|
+
|
|
75
|
+
def get_tool_definitions(self) -> List[Dict[str, Any]]:
|
|
76
|
+
"""
|
|
77
|
+
Get tool definitions with live peer information.
|
|
78
|
+
|
|
79
|
+
Returns:
|
|
80
|
+
List of tool schema dicts (Anthropic tool_use format)
|
|
81
|
+
"""
|
|
82
|
+
# Get live peer info
|
|
83
|
+
active_roles = self._peers.list_roles()
|
|
84
|
+
peers_info = self._peers.list_peers()
|
|
85
|
+
|
|
86
|
+
# Format for LLM context
|
|
87
|
+
if active_roles:
|
|
88
|
+
roles_str = ", ".join(active_roles)
|
|
89
|
+
peers_detail = "; ".join([
|
|
90
|
+
f"{p['role']} (can: {', '.join(p['capabilities'])})"
|
|
91
|
+
for p in peers_info
|
|
92
|
+
])
|
|
93
|
+
else:
|
|
94
|
+
roles_str = "none online"
|
|
95
|
+
peers_detail = "No peers available"
|
|
96
|
+
|
|
97
|
+
return [
|
|
98
|
+
{
|
|
99
|
+
"name": "ask_peer",
|
|
100
|
+
"description": (
|
|
101
|
+
f"Ask another agent in the mesh for help, data, or analysis. "
|
|
102
|
+
f"CURRENTLY ONLINE: [{roles_str}]. "
|
|
103
|
+
f"Details: {peers_detail}. "
|
|
104
|
+
f"Use when you need capabilities you don't have."
|
|
105
|
+
),
|
|
106
|
+
"input_schema": {
|
|
107
|
+
"type": "object",
|
|
108
|
+
"properties": {
|
|
109
|
+
"role": {
|
|
110
|
+
"type": "string",
|
|
111
|
+
"description": "The role of the agent to ask",
|
|
112
|
+
"enum": active_roles if active_roles else ["none"]
|
|
113
|
+
},
|
|
114
|
+
"question": {
|
|
115
|
+
"type": "string",
|
|
116
|
+
"description": "Your question or request for the peer"
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
"required": ["role", "question"]
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
"name": "broadcast_update",
|
|
124
|
+
"description": (
|
|
125
|
+
"Send a notification to ALL peers in the mesh. "
|
|
126
|
+
"Use for announcing milestones, state changes, or "
|
|
127
|
+
"important updates everyone should know."
|
|
128
|
+
),
|
|
129
|
+
"input_schema": {
|
|
130
|
+
"type": "object",
|
|
131
|
+
"properties": {
|
|
132
|
+
"message": {
|
|
133
|
+
"type": "string",
|
|
134
|
+
"description": "The update to broadcast"
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
"required": ["message"]
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
"name": "list_peers",
|
|
142
|
+
"description": (
|
|
143
|
+
"Get fresh list of online peers and their capabilities. "
|
|
144
|
+
"Use to discover who can help with specific tasks."
|
|
145
|
+
),
|
|
146
|
+
"input_schema": {
|
|
147
|
+
"type": "object",
|
|
148
|
+
"properties": {},
|
|
149
|
+
"required": []
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
]
|
|
153
|
+
|
|
154
|
+
async def execute(self, tool_name: str, args: Dict[str, Any]) -> str:
|
|
155
|
+
"""
|
|
156
|
+
Execute a peer tool call.
|
|
157
|
+
|
|
158
|
+
Args:
|
|
159
|
+
tool_name: Tool name (ask_peer, broadcast_update, list_peers)
|
|
160
|
+
args: Tool arguments from LLM
|
|
161
|
+
|
|
162
|
+
Returns:
|
|
163
|
+
String result to feed back to LLM
|
|
164
|
+
"""
|
|
165
|
+
self._logger.debug(f"Executing {tool_name} with args: {args}")
|
|
166
|
+
|
|
167
|
+
try:
|
|
168
|
+
if tool_name == "ask_peer":
|
|
169
|
+
return await self._ask_peer(args)
|
|
170
|
+
elif tool_name == "broadcast_update":
|
|
171
|
+
return await self._broadcast_update(args)
|
|
172
|
+
elif tool_name == "list_peers":
|
|
173
|
+
return self._list_peers()
|
|
174
|
+
else:
|
|
175
|
+
return f"Error: Unknown tool '{tool_name}'"
|
|
176
|
+
except Exception as e:
|
|
177
|
+
self._logger.error(f"Tool execution error: {e}")
|
|
178
|
+
return f"Error: {str(e)}"
|
|
179
|
+
|
|
180
|
+
async def _ask_peer(self, args: Dict[str, Any]) -> str:
|
|
181
|
+
"""Execute ask_peer tool."""
|
|
182
|
+
role = args.get("role")
|
|
183
|
+
question = args.get("question")
|
|
184
|
+
|
|
185
|
+
if not role or not question:
|
|
186
|
+
return "Error: 'role' and 'question' are required"
|
|
187
|
+
|
|
188
|
+
# Check peer exists
|
|
189
|
+
peer = self._peers.get_peer(role=role)
|
|
190
|
+
if not peer:
|
|
191
|
+
available = self._peers.list_roles()
|
|
192
|
+
return (
|
|
193
|
+
f"Error: '{role}' is not online. "
|
|
194
|
+
f"Available: {', '.join(available) if available else 'none'}"
|
|
195
|
+
)
|
|
196
|
+
|
|
197
|
+
# Send request
|
|
198
|
+
response = await self._peers.request(
|
|
199
|
+
role,
|
|
200
|
+
{"query": question, "from": self._peers.my_role},
|
|
201
|
+
timeout=30.0
|
|
202
|
+
)
|
|
203
|
+
|
|
204
|
+
if response is None:
|
|
205
|
+
return f"Error: {role} did not respond (timeout)"
|
|
206
|
+
|
|
207
|
+
# Format response
|
|
208
|
+
if isinstance(response, dict):
|
|
209
|
+
if "error" in response:
|
|
210
|
+
return f"Error from {role}: {response['error']}"
|
|
211
|
+
elif "response" in response:
|
|
212
|
+
return f"{role}: {response['response']}"
|
|
213
|
+
else:
|
|
214
|
+
return f"{role}: {response}"
|
|
215
|
+
return f"{role}: {response}"
|
|
216
|
+
|
|
217
|
+
async def _broadcast_update(self, args: Dict[str, Any]) -> str:
|
|
218
|
+
"""Execute broadcast_update tool."""
|
|
219
|
+
message = args.get("message")
|
|
220
|
+
|
|
221
|
+
if not message:
|
|
222
|
+
return "Error: 'message' is required"
|
|
223
|
+
|
|
224
|
+
count = await self._peers.broadcast({
|
|
225
|
+
"type": "broadcast",
|
|
226
|
+
"message": message,
|
|
227
|
+
"from": self._peers.my_role
|
|
228
|
+
})
|
|
229
|
+
|
|
230
|
+
if count == 0:
|
|
231
|
+
return "Broadcast sent (no peers online)"
|
|
232
|
+
return f"Broadcast sent to {count} peer(s)"
|
|
233
|
+
|
|
234
|
+
def _list_peers(self) -> str:
|
|
235
|
+
"""Execute list_peers tool."""
|
|
236
|
+
peers = self._peers.list_peers()
|
|
237
|
+
|
|
238
|
+
if not peers:
|
|
239
|
+
return "No peers currently online"
|
|
240
|
+
|
|
241
|
+
lines = ["Online peers:"]
|
|
242
|
+
for p in peers:
|
|
243
|
+
caps = ", ".join(p["capabilities"])
|
|
244
|
+
lines.append(f" - {p['role']}: {caps}")
|
|
245
|
+
return "\n".join(lines)
|
|
246
|
+
|
|
247
|
+
# ─────────────────────────────────────────────────────────────────
|
|
248
|
+
# Sync wrapper
|
|
249
|
+
# ─────────────────────────────────────────────────────────────────
|
|
250
|
+
|
|
251
|
+
def execute_sync(self, tool_name: str, args: Dict[str, Any]) -> str:
|
|
252
|
+
"""
|
|
253
|
+
Synchronous wrapper for execute().
|
|
254
|
+
|
|
255
|
+
Use if your agent loop is not async.
|
|
256
|
+
"""
|
|
257
|
+
loop = asyncio.get_event_loop()
|
|
258
|
+
if loop.is_running():
|
|
259
|
+
# Create new loop in thread if needed
|
|
260
|
+
import concurrent.futures
|
|
261
|
+
with concurrent.futures.ThreadPoolExecutor() as pool:
|
|
262
|
+
future = pool.submit(
|
|
263
|
+
asyncio.run,
|
|
264
|
+
self.execute(tool_name, args)
|
|
265
|
+
)
|
|
266
|
+
return future.result(timeout=60)
|
|
267
|
+
else:
|
|
268
|
+
return loop.run_until_complete(self.execute(tool_name, args))
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: jarviscore-framework
|
|
3
|
+
Version: 0.2.1
|
|
4
|
+
Summary: Build autonomous AI agents in 3 lines of code. Production-ready orchestration with P2P mesh networking.
|
|
5
|
+
Author-email: Ruth Mutua <mutuandinda82@gmail.com>, Muyukani Kizito <muyukani@prescottdata.io>
|
|
6
|
+
Maintainer-email: Prescott Data <info@prescottdata.io>
|
|
7
|
+
License-Expression: MIT
|
|
8
|
+
Project-URL: Homepage, https://github.com/Prescott-Data/jarviscore-framework
|
|
9
|
+
Project-URL: Documentation, https://github.com/Prescott-Data/jarviscore-framework/tree/main/jarviscore/docs
|
|
10
|
+
Project-URL: Repository, https://github.com/Prescott-Data/jarviscore-framework
|
|
11
|
+
Project-URL: Issues, https://github.com/Prescott-Data/jarviscore-framework/issues
|
|
12
|
+
Keywords: agents,p2p,llm,distributed,workflow,orchestration
|
|
13
|
+
Classifier: Development Status :: 3 - Alpha
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Requires-Python: >=3.10
|
|
20
|
+
Description-Content-Type: text/markdown
|
|
21
|
+
License-File: LICENSE
|
|
22
|
+
Requires-Dist: pydantic>=2.0.0
|
|
23
|
+
Requires-Dist: pydantic-settings>=2.0.0
|
|
24
|
+
Requires-Dist: swim-p2p
|
|
25
|
+
Requires-Dist: pyzmq
|
|
26
|
+
Requires-Dist: python-dotenv>=1.0.0
|
|
27
|
+
Requires-Dist: aiohttp>=3.9.0
|
|
28
|
+
Requires-Dist: beautifulsoup4>=4.12.0
|
|
29
|
+
Requires-Dist: anthropic>=0.18.0
|
|
30
|
+
Requires-Dist: openai>=1.0.0
|
|
31
|
+
Requires-Dist: google-genai>=1.0.0
|
|
32
|
+
Requires-Dist: httpx>=0.25.0
|
|
33
|
+
Provides-Extra: dev
|
|
34
|
+
Requires-Dist: pytest>=7.4.0; extra == "dev"
|
|
35
|
+
Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
|
|
36
|
+
Requires-Dist: pytest-cov>=4.1.0; extra == "dev"
|
|
37
|
+
Requires-Dist: black>=23.0.0; extra == "dev"
|
|
38
|
+
Requires-Dist: mypy>=1.5.0; extra == "dev"
|
|
39
|
+
Requires-Dist: ruff>=0.1.0; extra == "dev"
|
|
40
|
+
Provides-Extra: all
|
|
41
|
+
Requires-Dist: jarviscore[dev]; extra == "all"
|
|
42
|
+
Dynamic: license-file
|
|
43
|
+
|
|
44
|
+
# JarvisCore Framework
|
|
45
|
+
|
|
46
|
+
**Build autonomous AI agents with P2P mesh networking.**
|
|
47
|
+
|
|
48
|
+
## Features
|
|
49
|
+
|
|
50
|
+
- ✅ **AutoAgent** - LLM generates and executes code from natural language
|
|
51
|
+
- ✅ **CustomAgent** - Bring your own logic (LangChain, CrewAI, etc.)
|
|
52
|
+
- ✅ **P2P Mesh** - Agent discovery and communication via SWIM protocol
|
|
53
|
+
- ✅ **Workflow Orchestration** - Dependencies, context passing, multi-step pipelines
|
|
54
|
+
|
|
55
|
+
## Installation
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
pip install jarviscore-framework
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Setup
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
# Initialize project
|
|
65
|
+
python -m jarviscore.cli.scaffold --examples
|
|
66
|
+
cp .env.example .env
|
|
67
|
+
# Add your LLM API key to .env
|
|
68
|
+
|
|
69
|
+
# Validate
|
|
70
|
+
python -m jarviscore.cli.check --validate-llm
|
|
71
|
+
python -m jarviscore.cli.smoketest
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Quick Start
|
|
75
|
+
|
|
76
|
+
### AutoAgent (LLM-Powered)
|
|
77
|
+
|
|
78
|
+
```python
|
|
79
|
+
from jarviscore import Mesh
|
|
80
|
+
from jarviscore.profiles import AutoAgent
|
|
81
|
+
|
|
82
|
+
class CalculatorAgent(AutoAgent):
|
|
83
|
+
role = "calculator"
|
|
84
|
+
capabilities = ["math"]
|
|
85
|
+
system_prompt = "You are a math expert. Store result in 'result'."
|
|
86
|
+
|
|
87
|
+
mesh = Mesh(mode="autonomous")
|
|
88
|
+
mesh.add(CalculatorAgent)
|
|
89
|
+
await mesh.start()
|
|
90
|
+
|
|
91
|
+
results = await mesh.workflow("calc", [
|
|
92
|
+
{"agent": "calculator", "task": "Calculate factorial of 10"}
|
|
93
|
+
])
|
|
94
|
+
print(results[0]["output"]) # 3628800
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### CustomAgent (Your Code)
|
|
98
|
+
|
|
99
|
+
```python
|
|
100
|
+
from jarviscore import Mesh
|
|
101
|
+
from jarviscore.profiles import CustomAgent
|
|
102
|
+
|
|
103
|
+
class ProcessorAgent(CustomAgent):
|
|
104
|
+
role = "processor"
|
|
105
|
+
capabilities = ["processing"]
|
|
106
|
+
|
|
107
|
+
async def execute_task(self, task):
|
|
108
|
+
data = task.get("params", {}).get("data", [])
|
|
109
|
+
return {"status": "success", "output": [x * 2 for x in data]}
|
|
110
|
+
|
|
111
|
+
mesh = Mesh(mode="distributed", config={'bind_port': 7950})
|
|
112
|
+
mesh.add(ProcessorAgent)
|
|
113
|
+
await mesh.start()
|
|
114
|
+
|
|
115
|
+
results = await mesh.workflow("demo", [
|
|
116
|
+
{"agent": "processor", "task": "Process", "params": {"data": [1, 2, 3]}}
|
|
117
|
+
])
|
|
118
|
+
print(results[0]["output"]) # [2, 4, 6]
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## Execution Modes
|
|
122
|
+
|
|
123
|
+
| Mode | Profile | Use Case |
|
|
124
|
+
|------|---------|----------|
|
|
125
|
+
| `autonomous` | AutoAgent | Single machine, LLM code generation |
|
|
126
|
+
| `p2p` | CustomAgent | Agent-to-agent communication, swarms |
|
|
127
|
+
| `distributed` | CustomAgent | Multi-node workflows + P2P |
|
|
128
|
+
|
|
129
|
+
## Documentation
|
|
130
|
+
|
|
131
|
+
- [User Guide](jarviscore/docs/USER_GUIDE.md) - Complete documentation
|
|
132
|
+
- [Getting Started](jarviscore/docs/GETTING_STARTED.md) - 5-minute quickstart
|
|
133
|
+
- [AutoAgent Guide](jarviscore/docs/AUTOAGENT_GUIDE.md) - LLM-powered agents
|
|
134
|
+
- [CustomAgent Guide](jarviscore/docs/CUSTOMAGENT_GUIDE.md) - Bring your own code
|
|
135
|
+
- [API Reference](jarviscore/docs/API_REFERENCE.md) - Detailed API docs
|
|
136
|
+
- [Configuration](jarviscore/docs/CONFIGURATION.md) - Settings reference
|
|
137
|
+
|
|
138
|
+
## Version
|
|
139
|
+
|
|
140
|
+
**0.2.1**
|
|
141
|
+
|
|
142
|
+
## License
|
|
143
|
+
|
|
144
|
+
MIT License
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
examples/autoagent_distributed_example.py,sha256=yXxabyqPqPc-CTroTf-0GAl63ln3zPRMhMYBEi1Tpsc,8586
|
|
2
|
+
examples/calculator_agent_example.py,sha256=x7TrzE45WT_1DqwEnw8U3Fw56WpR9jBe3SLZz5vsKWc,2276
|
|
3
|
+
examples/custom_profile_decorator.py,sha256=4EAgqXrT9an1f5AQ3cEWAhPvI_EeXbQq7O8ByunXb_M,4099
|
|
4
|
+
examples/custom_profile_wrap.py,sha256=0NoQECVBEJOiL7Syr2QL73jnvj2XhGQZUhOvisqEQXw,5088
|
|
5
|
+
examples/customagent_distributed_example.py,sha256=_vt_2sqSCIdHgwuV4VQFzHzmC3bgemPrHFifeA5tRNE,13677
|
|
6
|
+
examples/customagent_p2p_example.py,sha256=tWywC5abc1aYIyW2V6Xgr_XkjZdqzcOeLut3PnzUpB8,30669
|
|
7
|
+
examples/multi_agent_workflow.py,sha256=Sygx3iEBM9WzorVMXqtiwn4rLYrW9BsxsiQSKceuzsE,4303
|
|
8
|
+
examples/research_agent_example.py,sha256=phJ5AHNnZ_pxCfiKvHoTp_IFwOAW7VD1fRNHlXvfgj4,2287
|
|
9
|
+
jarviscore/__init__.py,sha256=KEIOQgfB3Zc73dMMzekxOGbwlTAZV_u63zHeN8F24Y8,2954
|
|
10
|
+
jarviscore/adapter/__init__.py,sha256=fipq2XzgW3Us35tbFhs9B_ypoeEZeaP7bTsNPFFZVRk,1092
|
|
11
|
+
jarviscore/adapter/decorator.py,sha256=ZY-WCF16EvtQWkra_6HNBKdTOJ0G5yvrD5PYKa6bcqk,12040
|
|
12
|
+
jarviscore/adapter/wrapper.py,sha256=kU9nBiezU1M1dq9x5EjnAVHs_QjFFOFx7dR4TNyFdPk,9666
|
|
13
|
+
jarviscore/cli/__init__.py,sha256=OnpJ37xDcbh3jFhALLY1jimgp1mxlB1-VhsKhGS6TDY,123
|
|
14
|
+
jarviscore/cli/__main__.py,sha256=GuIqW9NKJ3n70ei54ItzrBYEVaWG5dAWGxdu87w7YgI,829
|
|
15
|
+
jarviscore/cli/check.py,sha256=eWvk6fkRsJ8hpgT60XUoAn_0nyzF0PFKRl65m7U9cxQ,13955
|
|
16
|
+
jarviscore/cli/scaffold.py,sha256=LZhqOSUVO7ZgBZnu2M2pUsRmTXtInYfOVJDaPkVE0Ck,4898
|
|
17
|
+
jarviscore/cli/smoketest.py,sha256=5ip_EPd-BW0rkBOi2zNEgHbL_glgbX-X7_Iu8yFLrh0,13484
|
|
18
|
+
jarviscore/config/__init__.py,sha256=ZLjbRHSi5azaDyoSOFr9cQ65J5Fvi56xI-WHdczc204,178
|
|
19
|
+
jarviscore/config/settings.py,sha256=ueYpJAZxT1zoEPymzrn0OHAXZxQXBqSMs87VwolPdhg,3516
|
|
20
|
+
jarviscore/context/__init__.py,sha256=FdMfHUPs1vDRDaz2WR_F3IJi9k4FIVBvsGVKD5dJBrQ,1171
|
|
21
|
+
jarviscore/context/dependency.py,sha256=ns6IwTsMBBuP0w8oBRt60iiNsu5k7RomEViUi4kkmBg,4750
|
|
22
|
+
jarviscore/context/jarvis_context.py,sha256=6ai2TjDE5PRiBxF5lTdyBMoK3b8wv6cr0a6q55PoUSk,5775
|
|
23
|
+
jarviscore/context/memory.py,sha256=taonyl24ZUe-NZ5VtvrxljNv6f_BebuH6VE7l0B9S7A,4442
|
|
24
|
+
jarviscore/core/__init__.py,sha256=30K2aqZckYTRZupn6X-mGV2QDSqWCgJ1cpN6Zk1gqlQ,177
|
|
25
|
+
jarviscore/core/agent.py,sha256=bQhuEsXdGHgwLhniE-Zgp4_pAOwFu-S2GdyQeL4wDU0,6888
|
|
26
|
+
jarviscore/core/mesh.py,sha256=XPAX_mRqpLj22vT9SI4MmyT65EQR9KxTEULqJ3BlHwk,22898
|
|
27
|
+
jarviscore/core/profile.py,sha256=sTrGTxV9mAqbt5l3z0-BSNOeWzq8YDLR3mlaPFSgt1c,2190
|
|
28
|
+
jarviscore/data/.env.example,sha256=TCPdye7tYNDOEpcgaEuzUsQ-H7m9G6rsyzNZV9IYQ9s,5156
|
|
29
|
+
jarviscore/data/__init__.py,sha256=757nsqMkytYV0zXiM_mh3LqtGZZ1lgFuMzvaLrW51PM,151
|
|
30
|
+
jarviscore/data/examples/autoagent_distributed_example.py,sha256=yXxabyqPqPc-CTroTf-0GAl63ln3zPRMhMYBEi1Tpsc,8586
|
|
31
|
+
jarviscore/data/examples/calculator_agent_example.py,sha256=x7TrzE45WT_1DqwEnw8U3Fw56WpR9jBe3SLZz5vsKWc,2276
|
|
32
|
+
jarviscore/data/examples/customagent_distributed_example.py,sha256=_vt_2sqSCIdHgwuV4VQFzHzmC3bgemPrHFifeA5tRNE,13677
|
|
33
|
+
jarviscore/data/examples/customagent_p2p_example.py,sha256=tWywC5abc1aYIyW2V6Xgr_XkjZdqzcOeLut3PnzUpB8,30669
|
|
34
|
+
jarviscore/data/examples/multi_agent_workflow.py,sha256=Sygx3iEBM9WzorVMXqtiwn4rLYrW9BsxsiQSKceuzsE,4303
|
|
35
|
+
jarviscore/data/examples/research_agent_example.py,sha256=phJ5AHNnZ_pxCfiKvHoTp_IFwOAW7VD1fRNHlXvfgj4,2287
|
|
36
|
+
jarviscore/docs/API_REFERENCE.md,sha256=rKFXBvfzd2jkLtVY80SOQrUnq4Z5fKNaJBBoh8QQhXk,25363
|
|
37
|
+
jarviscore/docs/AUTOAGENT_GUIDE.md,sha256=ftm8dymihs3Y9PZTZmSD9xRhlRFygfTZKm59Mz8zNRA,4618
|
|
38
|
+
jarviscore/docs/CONFIGURATION.md,sha256=gsYElB2XcoSPx_65ca-NBmIe1HY_KS1zQCeFORKZcyI,14910
|
|
39
|
+
jarviscore/docs/CUSTOMAGENT_GUIDE.md,sha256=CBSghYCtfTQykh3s7AVsAR_cKZO15JabTi3pvwOUjMw,42945
|
|
40
|
+
jarviscore/docs/GETTING_STARTED.md,sha256=W5cHsZVpiIO5Z01eBZWDbLowxLCnW4-mQQmeGy_5YIA,16601
|
|
41
|
+
jarviscore/docs/TROUBLESHOOTING.md,sha256=mFTNWIGToGWaHSthVDVtdpw5Y994mSLyv1UuAqzuWEM,11544
|
|
42
|
+
jarviscore/docs/USER_GUIDE.md,sha256=h2CM4hKPpLcKSEBSiS9ERlsx-nzAz123DFrLquLvpMU,17631
|
|
43
|
+
jarviscore/execution/__init__.py,sha256=yDAMehMO2dVvdKjxVx7zQV2AaxySmvymA24QF3O9tlY,1754
|
|
44
|
+
jarviscore/execution/code_registry.py,sha256=C3_hAVXIeCG31qwSBUrmBBicmd2vnUrXJhJgj8MKlJw,9213
|
|
45
|
+
jarviscore/execution/generator.py,sha256=zY7IxxDu4xoifeuCGZZN8_l8zQCsB5eUO9HGIiLIttw,8696
|
|
46
|
+
jarviscore/execution/llm.py,sha256=a04W7buLXP1BvQoSR9u6hybGwaJqpjStZDipLIVCDVA,16794
|
|
47
|
+
jarviscore/execution/repair.py,sha256=yy6GTX6nFoA38S9V1ZGvqOeH3iRThRkMI3GZ6F_2WrU,9092
|
|
48
|
+
jarviscore/execution/result_handler.py,sha256=7SKr-teFksqNgejhnZNrjAzKbtDXbOSV3Tv7gfYsdig,10590
|
|
49
|
+
jarviscore/execution/sandbox.py,sha256=IVkccce_WHDxXO6l8BCcuxAB5iueJfYtbryydoE972c,19981
|
|
50
|
+
jarviscore/execution/search.py,sha256=JSoT8vb_yT6_EKaAgUQDS8ONgFeKf6s8YlEeTn6FaWQ,9923
|
|
51
|
+
jarviscore/orchestration/__init__.py,sha256=Ia9GfEMWif0tN0Ju89q6M_x_BRw9FcQl5Rf99p8CIKU,386
|
|
52
|
+
jarviscore/orchestration/claimer.py,sha256=ekhHqhtxpi_USnPsIioFK6bA2nhH6jalulBkptYubVU,3106
|
|
53
|
+
jarviscore/orchestration/dependency.py,sha256=UtSSwSC2Ak5V5dYeZWJy3wZZuTE-Y-fcglkoIgNT_70,4377
|
|
54
|
+
jarviscore/orchestration/engine.py,sha256=Xh9Fn3aVY7iwj7cAXdHcN90ogOiVFJlyJeoKnJjZR4A,10937
|
|
55
|
+
jarviscore/orchestration/status.py,sha256=XeKASMNQDwpJ6HpDw3m3eAAMNWsWCj4k9jrvMnLHPbo,2540
|
|
56
|
+
jarviscore/p2p/__init__.py,sha256=k1KkBnbb74jrfWKLiKRsMbepy6xBfQZOGzOlDKvslp0,927
|
|
57
|
+
jarviscore/p2p/broadcaster.py,sha256=PQRBRfVQD1FNntnxi7H8VsOyYGk_63N-QtnRB4Dx_-I,14127
|
|
58
|
+
jarviscore/p2p/coordinator.py,sha256=mZ1MhusDGHcV5BR1R4XZLBzF4B9lHwqqccluwLGDNk0,18728
|
|
59
|
+
jarviscore/p2p/keepalive.py,sha256=Ml4TyXv2pzJ7UZl3uYVgMlHmpjxYV6fAebWLSEEXo5U,14079
|
|
60
|
+
jarviscore/p2p/messages.py,sha256=nd7ZutZ1Xge2C1KkRSwQK3RJ03ScxqESF3fl48hEkhI,2540
|
|
61
|
+
jarviscore/p2p/peer_client.py,sha256=tMUzXPWRZwyymA6mNdMWISpzVI-IOwDrYAri-Bf2ksg,20984
|
|
62
|
+
jarviscore/p2p/peer_tool.py,sha256=qXiF0b2pTo8tJ8bUHxe_XbxE0UFgwu2wCpy-W82ocUo,9098
|
|
63
|
+
jarviscore/p2p/swim_manager.py,sha256=Mdr6D0uxJR0h1JMO_faAda2Ojv6gfjoY-ZOzD9q_DWo,10816
|
|
64
|
+
jarviscore/profiles/__init__.py,sha256=vBV6W5vszx3px4UOZwCh2wsH-TYzIoPp4Zo_STT8pNo,154
|
|
65
|
+
jarviscore/profiles/autoagent.py,sha256=1nJAVf1oU9lLO47BP1xFGBDZtypXXkwKy6kZjtpdlX0,10424
|
|
66
|
+
jarviscore/profiles/customagent.py,sha256=GRauTYlWyYSgZrWyYZlAPNkJoVgjDHjfY_c0rdeoOgM,4618
|
|
67
|
+
jarviscore_framework-0.2.1.dist-info/licenses/LICENSE,sha256=SjsXanvmQJFYz_SVFa17O85-bKIa_aG99wrkPpWtypo,1101
|
|
68
|
+
test_logs/code_registry/functions/data_generator-558779ed_560ebc37.py,sha256=ua0Lueqe1mWCeMpKTMaumfPS-ZrWBFF_Zx6TU5QVjNo,132
|
|
69
|
+
test_logs/code_registry/functions/data_generator-5ed3609e_560ebc37.py,sha256=ua0Lueqe1mWCeMpKTMaumfPS-ZrWBFF_Zx6TU5QVjNo,132
|
|
70
|
+
test_logs/code_registry/functions/data_generator-66da0356_43970bb9.py,sha256=vOkjCOcfXHLJX2TkR3et9vWSwEhCmOn4DdJHMGfTMVY,733
|
|
71
|
+
test_logs/code_registry/functions/data_generator-7a2fac83_583709d9.py,sha256=QnOyRpMYlYOUfqwc17d9O_he-hiOfv1RMtLQP4WuS2Q,1184
|
|
72
|
+
test_logs/code_registry/functions/data_generator-888b670f_aa235863.py,sha256=_TXrRVxxhNKvMt2VNTIMRZNrDWKhtBhUestMzZggfiM,292
|
|
73
|
+
test_logs/code_registry/functions/data_generator-9ca5f642_aa235863.py,sha256=_TXrRVxxhNKvMt2VNTIMRZNrDWKhtBhUestMzZggfiM,292
|
|
74
|
+
test_logs/code_registry/functions/data_generator-bfd90775_560ebc37.py,sha256=ua0Lueqe1mWCeMpKTMaumfPS-ZrWBFF_Zx6TU5QVjNo,132
|
|
75
|
+
test_logs/code_registry/functions/data_generator-e95d2f7d_aa235863.py,sha256=_TXrRVxxhNKvMt2VNTIMRZNrDWKhtBhUestMzZggfiM,292
|
|
76
|
+
test_logs/code_registry/functions/data_generator-f60ca8a2_327eb8c2.py,sha256=GRNO28cRP4QWWsmWFNBRouifn1o3fU4siHs94RlLxOo,1021
|
|
77
|
+
test_logs/code_registry/functions/mathematician-02adf9ee_958658d9.py,sha256=7pRBZ7dYeDNdtzSWNIqlZLsMiEjV-jJ8R1L8fXmOeCw,429
|
|
78
|
+
test_logs/code_registry/functions/mathematician-0706fb57_5df13441.py,sha256=K2Gw5zusxQObi3eLuSRgMHH81a6ojDm0LBYemsttris,589
|
|
79
|
+
test_logs/code_registry/functions/mathematician-153c9c4a_ba59c918.py,sha256=QlXv6Zxh7Z2Zk0RjKcFeI5quyO3-eYSF0ZYZFkAu_Y8,2700
|
|
80
|
+
test_logs/code_registry/functions/mathematician-287e61c0_41daa793.py,sha256=Cf0ogfYTINcVNGdRLKwNQ2fQ9qJsB8h-N-SdzY6ZTO4,373
|
|
81
|
+
test_logs/code_registry/functions/mathematician-2967af5a_863c2cc6.py,sha256=TPRGr7QpDC-krM6fAr1Rz_n5IgcQgALvQSDHXsWwSVk,416
|
|
82
|
+
test_logs/code_registry/functions/mathematician-303ca6d6_5df13441.py,sha256=K2Gw5zusxQObi3eLuSRgMHH81a6ojDm0LBYemsttris,589
|
|
83
|
+
test_logs/code_registry/functions/mathematician-308a4afd_cbf5064d.py,sha256=PZR4euX4DNIZYVE7Z7NgzEAwxj4Wl8mSq3JW04jke40,2341
|
|
84
|
+
test_logs/code_registry/functions/mathematician-353f16e2_0968bcf5.py,sha256=VW-RQ5Zgne7orwB7IZ9JFxL8f7mv9mDNGN-6JNsTbHc,392
|
|
85
|
+
test_logs/code_registry/functions/mathematician-3c22475a_41daa793.py,sha256=RQiCVFfIRpRqU7Gkb7NmwHAwv8ZVyV2D1Ur4ewcSQ7w,364
|
|
86
|
+
test_logs/code_registry/functions/mathematician-5bac1029_0968bcf5.py,sha256=VW-RQ5Zgne7orwB7IZ9JFxL8f7mv9mDNGN-6JNsTbHc,392
|
|
87
|
+
test_logs/code_registry/functions/mathematician-640f76b2_9198780b.py,sha256=IM8BIaTj5HxNlvowWvOAkMdO1HlxueWZ8PSGdfEuJBk,413
|
|
88
|
+
test_logs/code_registry/functions/mathematician-752fa7ea_863c2cc6.py,sha256=TPRGr7QpDC-krM6fAr1Rz_n5IgcQgALvQSDHXsWwSVk,416
|
|
89
|
+
test_logs/code_registry/functions/mathematician-baf9ef39_0968bcf5.py,sha256=VW-RQ5Zgne7orwB7IZ9JFxL8f7mv9mDNGN-6JNsTbHc,392
|
|
90
|
+
test_logs/code_registry/functions/mathematician-bc8b2a2f_5df13441.py,sha256=K2Gw5zusxQObi3eLuSRgMHH81a6ojDm0LBYemsttris,589
|
|
91
|
+
test_logs/code_registry/functions/mathematician-c31e4686_41daa793.py,sha256=Cf0ogfYTINcVNGdRLKwNQ2fQ9qJsB8h-N-SdzY6ZTO4,373
|
|
92
|
+
test_logs/code_registry/functions/mathematician-cc84c84c_863c2cc6.py,sha256=TPRGr7QpDC-krM6fAr1Rz_n5IgcQgALvQSDHXsWwSVk,416
|
|
93
|
+
test_logs/code_registry/functions/mathematician-dd7c7144_9198780b.py,sha256=IM8BIaTj5HxNlvowWvOAkMdO1HlxueWZ8PSGdfEuJBk,413
|
|
94
|
+
test_logs/code_registry/functions/mathematician-e671c256_41ea4487.py,sha256=66ClGnkZxoRu_9vTVdLlNJPmZ33oR4NE8dUnLzgzdgE,2411
|
|
95
|
+
test_logs/code_registry/functions/report_generator-1a878fcc_18d44bdc.py,sha256=cNFFf4EHJedQAt_OTbUYdwNK4Ac-YpMCqukbnWp_3Jc,1360
|
|
96
|
+
test_logs/code_registry/functions/report_generator-25c1c331_cea57d0d.py,sha256=duU3emuBWAaLXQQOkiNrFsXXipWfi0j_hiJueglKF-Y,862
|
|
97
|
+
test_logs/code_registry/functions/report_generator-37552117_e711c2b9.py,sha256=MwIumfa77CZac6nYfrZc9cSrG2ukd2ChxBy3lBzKLt4,806
|
|
98
|
+
test_logs/code_registry/functions/report_generator-bc662768_e711c2b9.py,sha256=MwIumfa77CZac6nYfrZc9cSrG2ukd2ChxBy3lBzKLt4,806
|
|
99
|
+
test_logs/code_registry/functions/report_generator-d6c0e76b_5e7722ec.py,sha256=ubqY5Uo42w8xXVGd6ojHezy7h3Mx0Oe0Ltu-7nMK0pU,1240
|
|
100
|
+
test_logs/code_registry/functions/report_generator-f270fb02_680529c3.py,sha256=LSPK1lcshFDQEGNNzTeVeCyXzQ1QfpO8_mNOWhXFNIQ,1242
|
|
101
|
+
test_logs/code_registry/functions/text_processor-11393b14_4370d3ed.py,sha256=nsCAlCE7nEvCJ6iEtOlNcfNJ6PRNwVFkJRYEu39XVPY,1196
|
|
102
|
+
test_logs/code_registry/functions/text_processor-7d02dfc3_d3b569be.py,sha256=mcas3HXiuOKP7r9ylNFH8eTeXw-cBdHzV8xB1VGfmxE,1153
|
|
103
|
+
test_logs/code_registry/functions/text_processor-8adb5e32_9168c5fe.py,sha256=DdXgvgVHdbXOGVKD6u-14xsWoZL3wKrFu7S9o0Cy6mI,353
|
|
104
|
+
test_logs/code_registry/functions/text_processor-c58ffc19_78b4ceac.py,sha256=sFoPDhbHpLRlDnitUj0HcqNQqR_9AhGDbNwfPxlcKbk,1241
|
|
105
|
+
test_logs/code_registry/functions/text_processor-cd5977b1_9168c5fe.py,sha256=DdXgvgVHdbXOGVKD6u-14xsWoZL3wKrFu7S9o0Cy6mI,353
|
|
106
|
+
test_logs/code_registry/functions/text_processor-ec1c8773_9168c5fe.py,sha256=DdXgvgVHdbXOGVKD6u-14xsWoZL3wKrFu7S9o0Cy6mI,353
|
|
107
|
+
tests/conftest.py,sha256=vK5f8DVxCkOGTz3K1835ru5vRgHnaDL_V9M5AUaJ2Zw,974
|
|
108
|
+
tests/test_01_analyst_standalone.py,sha256=Ye5fDjLJ8QHJydMlVQAzqcby0zLVSDrXd0w24FdWJTo,4058
|
|
109
|
+
tests/test_02_assistant_standalone.py,sha256=cStYjVtAtLqJYP0GZpMlFe-hjr0Tc09UmQt470A0Z1U,5333
|
|
110
|
+
tests/test_03_analyst_with_framework.py,sha256=iUP4ta9k1dikJ_PV5IkP1kP-MM6e5mxJcvVIbawf5OI,37461
|
|
111
|
+
tests/test_04_assistant_with_framework.py,sha256=hrwCjeonoPurNKahHpHdZxZVUWuEbh-S1_uwSbeg15U,39771
|
|
112
|
+
tests/test_05_integration.py,sha256=Q-MnqQNZpnQ_M4D-kg21p0s23C2b50GIvwU8SBRA7Uo,52054
|
|
113
|
+
tests/test_06_real_llm_integration.py,sha256=ZR3ncRP_RKN82wrnMIrL1TnJogOdtSmsSjuE7fuuWwU,26889
|
|
114
|
+
tests/test_07_distributed_single_node.py,sha256=rFL4FmD5-4MVfgnQ5FwAlIm2FFEdmNOBSVf60VSOSxQ,21817
|
|
115
|
+
tests/test_08_distributed_multi_node.py,sha256=GkznK1f9aDEFF5_37WhBh553Ov6bw7IDOAvngo4848I,18039
|
|
116
|
+
tests/test_09_distributed_autoagent.py,sha256=sg5KpHdiYyqQpKAPLNrjkaH4Ur6N8rwYrhbgiCe_KH8,20328
|
|
117
|
+
tests/test_10_distributed_customagent.py,sha256=ZtmZYHPHvW6wPdt3lveixSPm6GO1Fm3v6TCdox6YI6c,29728
|
|
118
|
+
tests/test_agent.py,sha256=qx9SFDTP4DlcQi6hV8y6LZyEYX6IB8D3VnM7fODnW9s,5182
|
|
119
|
+
tests/test_autoagent.py,sha256=_mzinLdQwskOn6a-yGqdfoOsqw2f52XSyTCmj8hLqlg,4628
|
|
120
|
+
tests/test_autoagent_day4.py,sha256=TTb0kSImF9stMsq4cMlkGahf9UBpYjoNXAkgnkKuuQA,4719
|
|
121
|
+
tests/test_context.py,sha256=MftpCCeLkmORo-jBzLZtNjMlEZqkvH9Vyt2h5FPHBzo,15628
|
|
122
|
+
tests/test_customagent.py,sha256=auxU6j3GVVT1r2kwoxarFUSCHtwSTjCrxBTqZzezqzw,8310
|
|
123
|
+
tests/test_decorator.py,sha256=cqJL6gbszWbtEwk8yDcRDbdXcykvM0uvGpjWUUqmw_8,20398
|
|
124
|
+
tests/test_integration.py,sha256=X9TYRW2WKF1doLFARTEyCCYLFAnYsazsshDwBzQZcZE,9191
|
|
125
|
+
tests/test_llm_fallback.py,sha256=CNajpKkQ6MO503dRbgaP2cz9kXHwUGKo5381tHKTe4c,5742
|
|
126
|
+
tests/test_mesh.py,sha256=JmAAvZaduQ8dHThFDBYgUnjiz8a3r4Kt1atvdH1JO5I,11857
|
|
127
|
+
tests/test_p2p_integration.py,sha256=F9B21eWlwRzSRphm2Kacs9nM1FgSbSzi6RSLPDvvt2U,10995
|
|
128
|
+
tests/test_remote_sandbox.py,sha256=80ebc0pWInauWnywsQ0VSzlk8OexSCgGL7BcJUCPkR8,3268
|
|
129
|
+
jarviscore_framework-0.2.1.dist-info/METADATA,sha256=1HFKH6OVKN7PMlGrdblzXtqXTYpY7i6__N1uczT2uew,4512
|
|
130
|
+
jarviscore_framework-0.2.1.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
|
|
131
|
+
jarviscore_framework-0.2.1.dist-info/top_level.txt,sha256=aTco8nlqDftlvhB43Je0xXmb-Pw5qYgj-phawjHX4VY,36
|
|
132
|
+
jarviscore_framework-0.2.1.dist-info/RECORD,,
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import random
|
|
2
|
+
|
|
3
|
+
def main():
|
|
4
|
+
# Word list to choose from
|
|
5
|
+
word_pool = [
|
|
6
|
+
"apple", "banana", "cherry", "dragon", "elephant",
|
|
7
|
+
"forest", "garden", "harmony", "island", "jungle",
|
|
8
|
+
"kingdom", "lantern", "mountain", "nebula", "ocean",
|
|
9
|
+
"phoenix", "quantum", "rainbow", "sunset", "thunder",
|
|
10
|
+
"umbrella", "volcano", "whisper", "xylophone", "yellow",
|
|
11
|
+
"zephyr", "adventure", "brilliant", "cascade", "diamond"
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
# Select 5 random words
|
|
15
|
+
random_words = random.sample(word_pool, 5)
|
|
16
|
+
|
|
17
|
+
result = {
|
|
18
|
+
"random_words": random_words,
|
|
19
|
+
"count": len(random_words),
|
|
20
|
+
"description": "A list of 5 randomly selected words"
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return result
|
|
24
|
+
|
|
25
|
+
result = main()
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import random
|
|
2
|
+
|
|
3
|
+
def main():
|
|
4
|
+
# List of common words to choose from
|
|
5
|
+
word_pool = [
|
|
6
|
+
"apple", "banana", "cherry", "dragon", "elephant",
|
|
7
|
+
"forest", "garden", "harmony", "island", "jungle",
|
|
8
|
+
"kitchen", "lantern", "mountain", "notebook", "ocean",
|
|
9
|
+
"penguin", "quantum", "rainbow", "sunshine", "thunder",
|
|
10
|
+
"umbrella", "village", "whisper", "xylophone", "yellow",
|
|
11
|
+
"zebra", "adventure", "butterfly", "chocolate", "diamond",
|
|
12
|
+
"energy", "freedom", "gravity", "horizon", "imagine",
|
|
13
|
+
"journey", "knowledge", "library", "mystery", "nature",
|
|
14
|
+
"opportunity", "paradise", "question", "reflection", "serenity",
|
|
15
|
+
"treasure", "universe", "velocity", "wonder", "zenith"
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
try:
|
|
19
|
+
# Select 5 random words from the pool
|
|
20
|
+
random_words = random.sample(word_pool, 5)
|
|
21
|
+
|
|
22
|
+
result = {
|
|
23
|
+
"description": "List of 5 randomly selected words",
|
|
24
|
+
"count": 5,
|
|
25
|
+
"words": random_words
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return result
|
|
29
|
+
except Exception as e:
|
|
30
|
+
return {
|
|
31
|
+
"error": str(e),
|
|
32
|
+
"words": []
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
# Execute and store result
|
|
36
|
+
result = main()
|