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.
Files changed (86) hide show
  1. examples/autoagent_distributed_example.py +211 -0
  2. examples/custom_profile_decorator.py +134 -0
  3. examples/custom_profile_wrap.py +168 -0
  4. examples/customagent_distributed_example.py +362 -0
  5. examples/customagent_p2p_example.py +730 -0
  6. jarviscore/__init__.py +49 -36
  7. jarviscore/adapter/__init__.py +15 -9
  8. jarviscore/adapter/decorator.py +23 -19
  9. jarviscore/adapter/wrapper.py +303 -0
  10. jarviscore/cli/scaffold.py +1 -1
  11. jarviscore/cli/smoketest.py +3 -2
  12. jarviscore/core/agent.py +44 -1
  13. jarviscore/core/mesh.py +196 -35
  14. jarviscore/data/examples/autoagent_distributed_example.py +211 -0
  15. jarviscore/data/examples/customagent_distributed_example.py +362 -0
  16. jarviscore/data/examples/customagent_p2p_example.py +730 -0
  17. jarviscore/docs/API_REFERENCE.md +264 -51
  18. jarviscore/docs/AUTOAGENT_GUIDE.md +198 -0
  19. jarviscore/docs/CONFIGURATION.md +35 -21
  20. jarviscore/docs/CUSTOMAGENT_GUIDE.md +1362 -0
  21. jarviscore/docs/GETTING_STARTED.md +107 -14
  22. jarviscore/docs/TROUBLESHOOTING.md +145 -7
  23. jarviscore/docs/USER_GUIDE.md +138 -361
  24. jarviscore/orchestration/engine.py +20 -8
  25. jarviscore/p2p/__init__.py +10 -0
  26. jarviscore/p2p/coordinator.py +129 -0
  27. jarviscore/p2p/messages.py +87 -0
  28. jarviscore/p2p/peer_client.py +576 -0
  29. jarviscore/p2p/peer_tool.py +268 -0
  30. jarviscore_framework-0.2.1.dist-info/METADATA +144 -0
  31. jarviscore_framework-0.2.1.dist-info/RECORD +132 -0
  32. {jarviscore_framework-0.1.1.dist-info → jarviscore_framework-0.2.1.dist-info}/WHEEL +1 -1
  33. {jarviscore_framework-0.1.1.dist-info → jarviscore_framework-0.2.1.dist-info}/top_level.txt +1 -0
  34. test_logs/code_registry/functions/data_generator-558779ed_560ebc37.py +7 -0
  35. test_logs/code_registry/functions/data_generator-5ed3609e_560ebc37.py +7 -0
  36. test_logs/code_registry/functions/data_generator-66da0356_43970bb9.py +25 -0
  37. test_logs/code_registry/functions/data_generator-7a2fac83_583709d9.py +36 -0
  38. test_logs/code_registry/functions/data_generator-888b670f_aa235863.py +9 -0
  39. test_logs/code_registry/functions/data_generator-9ca5f642_aa235863.py +9 -0
  40. test_logs/code_registry/functions/data_generator-bfd90775_560ebc37.py +7 -0
  41. test_logs/code_registry/functions/data_generator-e95d2f7d_aa235863.py +9 -0
  42. test_logs/code_registry/functions/data_generator-f60ca8a2_327eb8c2.py +29 -0
  43. test_logs/code_registry/functions/mathematician-02adf9ee_958658d9.py +19 -0
  44. test_logs/code_registry/functions/mathematician-0706fb57_5df13441.py +23 -0
  45. test_logs/code_registry/functions/mathematician-153c9c4a_ba59c918.py +83 -0
  46. test_logs/code_registry/functions/mathematician-287e61c0_41daa793.py +18 -0
  47. test_logs/code_registry/functions/mathematician-2967af5a_863c2cc6.py +17 -0
  48. test_logs/code_registry/functions/mathematician-303ca6d6_5df13441.py +23 -0
  49. test_logs/code_registry/functions/mathematician-308a4afd_cbf5064d.py +73 -0
  50. test_logs/code_registry/functions/mathematician-353f16e2_0968bcf5.py +18 -0
  51. test_logs/code_registry/functions/mathematician-3c22475a_41daa793.py +17 -0
  52. test_logs/code_registry/functions/mathematician-5bac1029_0968bcf5.py +18 -0
  53. test_logs/code_registry/functions/mathematician-640f76b2_9198780b.py +19 -0
  54. test_logs/code_registry/functions/mathematician-752fa7ea_863c2cc6.py +17 -0
  55. test_logs/code_registry/functions/mathematician-baf9ef39_0968bcf5.py +18 -0
  56. test_logs/code_registry/functions/mathematician-bc8b2a2f_5df13441.py +23 -0
  57. test_logs/code_registry/functions/mathematician-c31e4686_41daa793.py +18 -0
  58. test_logs/code_registry/functions/mathematician-cc84c84c_863c2cc6.py +17 -0
  59. test_logs/code_registry/functions/mathematician-dd7c7144_9198780b.py +19 -0
  60. test_logs/code_registry/functions/mathematician-e671c256_41ea4487.py +74 -0
  61. test_logs/code_registry/functions/report_generator-1a878fcc_18d44bdc.py +47 -0
  62. test_logs/code_registry/functions/report_generator-25c1c331_cea57d0d.py +35 -0
  63. test_logs/code_registry/functions/report_generator-37552117_e711c2b9.py +35 -0
  64. test_logs/code_registry/functions/report_generator-bc662768_e711c2b9.py +35 -0
  65. test_logs/code_registry/functions/report_generator-d6c0e76b_5e7722ec.py +44 -0
  66. test_logs/code_registry/functions/report_generator-f270fb02_680529c3.py +44 -0
  67. test_logs/code_registry/functions/text_processor-11393b14_4370d3ed.py +40 -0
  68. test_logs/code_registry/functions/text_processor-7d02dfc3_d3b569be.py +37 -0
  69. test_logs/code_registry/functions/text_processor-8adb5e32_9168c5fe.py +13 -0
  70. test_logs/code_registry/functions/text_processor-c58ffc19_78b4ceac.py +42 -0
  71. test_logs/code_registry/functions/text_processor-cd5977b1_9168c5fe.py +13 -0
  72. test_logs/code_registry/functions/text_processor-ec1c8773_9168c5fe.py +13 -0
  73. tests/test_01_analyst_standalone.py +124 -0
  74. tests/test_02_assistant_standalone.py +164 -0
  75. tests/test_03_analyst_with_framework.py +945 -0
  76. tests/test_04_assistant_with_framework.py +1002 -0
  77. tests/test_05_integration.py +1301 -0
  78. tests/test_06_real_llm_integration.py +760 -0
  79. tests/test_07_distributed_single_node.py +578 -0
  80. tests/test_08_distributed_multi_node.py +454 -0
  81. tests/test_09_distributed_autoagent.py +509 -0
  82. tests/test_10_distributed_customagent.py +787 -0
  83. tests/test_mesh.py +35 -4
  84. jarviscore_framework-0.1.1.dist-info/METADATA +0 -137
  85. jarviscore_framework-0.1.1.dist-info/RECORD +0 -69
  86. {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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.9.0)
2
+ Generator: setuptools (80.10.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,3 +1,4 @@
1
1
  examples
2
2
  jarviscore
3
+ test_logs
3
4
  tests
@@ -0,0 +1,7 @@
1
+ async def main():
2
+ result = {
3
+ 'name': 'John Smith',
4
+ 'age': 32,
5
+ 'city': 'New York'
6
+ }
7
+ return result
@@ -0,0 +1,7 @@
1
+ async def main():
2
+ result = {
3
+ 'name': 'John Smith',
4
+ 'age': 32,
5
+ 'city': 'New York'
6
+ }
7
+ return result
@@ -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()
@@ -0,0 +1,9 @@
1
+ async def main():
2
+ result = {
3
+ "products": [
4
+ {"name": "Wireless Bluetooth Headphones", "price": 79.99},
5
+ {"name": "Stainless Steel Water Bottle", "price": 24.95},
6
+ {"name": "Portable Phone Charger", "price": 34.50}
7
+ ]
8
+ }
9
+ return result
@@ -0,0 +1,9 @@
1
+ async def main():
2
+ result = {
3
+ "products": [
4
+ {"name": "Wireless Bluetooth Headphones", "price": 79.99},
5
+ {"name": "Stainless Steel Water Bottle", "price": 24.95},
6
+ {"name": "Portable Phone Charger", "price": 34.50}
7
+ ]
8
+ }
9
+ return result