hanzo 0.3.22__py3-none-any.whl → 0.3.24__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.

Potentially problematic release.


This version of hanzo might be problematic. Click here for more details.

hanzo/streaming.py CHANGED
@@ -3,42 +3,44 @@ Streaming response handler for Hanzo Dev.
3
3
  Provides real-time feedback as AI generates responses.
4
4
  """
5
5
 
6
+ import time
6
7
  import asyncio
7
- from typing import AsyncGenerator, Optional, Callable
8
- from rich.console import Console
8
+ from typing import Callable, Optional, AsyncGenerator
9
+
9
10
  from rich.live import Live
10
11
  from rich.panel import Panel
12
+ from rich.console import Console
11
13
  from rich.markdown import Markdown
12
- import time
13
14
 
14
15
 
15
16
  class StreamingHandler:
16
17
  """Handles streaming responses from AI models."""
17
-
18
+
18
19
  def __init__(self, console: Console = None):
19
20
  """Initialize streaming handler."""
20
21
  self.console = console or Console()
21
22
  self.current_response = ""
22
23
  self.is_streaming = False
23
-
24
+
24
25
  async def stream_openai(self, client, messages: list, model: str = "gpt-4") -> str:
25
26
  """Stream response from OpenAI API."""
26
27
  try:
27
28
  stream = await client.chat.completions.create(
28
- model=model,
29
- messages=messages,
30
- stream=True,
31
- max_tokens=1000
29
+ model=model, messages=messages, stream=True, max_tokens=1000
32
30
  )
33
-
31
+
34
32
  self.current_response = ""
35
33
  self.is_streaming = True
36
-
34
+
37
35
  with Live(
38
- Panel("", title="[bold cyan]AI Response[/bold cyan]",
39
- title_align="left", border_style="dim cyan"),
36
+ Panel(
37
+ "",
38
+ title="[bold cyan]AI Response[/bold cyan]",
39
+ title_align="left",
40
+ border_style="dim cyan",
41
+ ),
40
42
  console=self.console,
41
- refresh_per_second=10
43
+ refresh_per_second=10,
42
44
  ) as live:
43
45
  async for chunk in stream:
44
46
  if chunk.choices[0].delta.content:
@@ -49,34 +51,38 @@ class StreamingHandler:
49
51
  title="[bold cyan]AI Response[/bold cyan]",
50
52
  title_align="left",
51
53
  border_style="dim cyan",
52
- padding=(1, 2)
54
+ padding=(1, 2),
53
55
  )
54
56
  )
55
-
57
+
56
58
  self.is_streaming = False
57
59
  return self.current_response
58
-
60
+
59
61
  except Exception as e:
60
62
  self.console.print(f"[red]Streaming error: {e}[/red]")
61
63
  self.is_streaming = False
62
64
  return None
63
-
64
- async def stream_anthropic(self, client, messages: list, model: str = "claude-3-5-sonnet-20241022") -> str:
65
+
66
+ async def stream_anthropic(
67
+ self, client, messages: list, model: str = "claude-3-5-sonnet-20241022"
68
+ ) -> str:
65
69
  """Stream response from Anthropic API."""
66
70
  try:
67
71
  self.current_response = ""
68
72
  self.is_streaming = True
69
-
73
+
70
74
  with Live(
71
- Panel("", title="[bold cyan]AI Response[/bold cyan]",
72
- title_align="left", border_style="dim cyan"),
75
+ Panel(
76
+ "",
77
+ title="[bold cyan]AI Response[/bold cyan]",
78
+ title_align="left",
79
+ border_style="dim cyan",
80
+ ),
73
81
  console=self.console,
74
- refresh_per_second=10
82
+ refresh_per_second=10,
75
83
  ) as live:
76
84
  async with client.messages.stream(
77
- model=model,
78
- messages=messages,
79
- max_tokens=1000
85
+ model=model, messages=messages, max_tokens=1000
80
86
  ) as stream:
81
87
  async for text in stream.text_stream:
82
88
  self.current_response += text
@@ -86,42 +92,47 @@ class StreamingHandler:
86
92
  title="[bold cyan]AI Response[/bold cyan]",
87
93
  title_align="left",
88
94
  border_style="dim cyan",
89
- padding=(1, 2)
95
+ padding=(1, 2),
90
96
  )
91
97
  )
92
-
98
+
93
99
  self.is_streaming = False
94
100
  return self.current_response
95
-
101
+
96
102
  except Exception as e:
97
103
  self.console.print(f"[red]Streaming error: {e}[/red]")
98
104
  self.is_streaming = False
99
105
  return None
100
-
106
+
101
107
  async def stream_ollama(self, message: str, model: str = "llama3.2") -> str:
102
108
  """Stream response from Ollama local model."""
103
109
  import httpx
104
-
110
+
105
111
  try:
106
112
  self.current_response = ""
107
113
  self.is_streaming = True
108
-
114
+
109
115
  with Live(
110
- Panel("", title="[bold cyan]AI Response (Local)[/bold cyan]",
111
- title_align="left", border_style="dim cyan"),
116
+ Panel(
117
+ "",
118
+ title="[bold cyan]AI Response (Local)[/bold cyan]",
119
+ title_align="left",
120
+ border_style="dim cyan",
121
+ ),
112
122
  console=self.console,
113
- refresh_per_second=10
123
+ refresh_per_second=10,
114
124
  ) as live:
115
125
  async with httpx.AsyncClient() as client:
116
126
  async with client.stream(
117
127
  "POST",
118
128
  "http://localhost:11434/api/generate",
119
129
  json={"model": model, "prompt": message, "stream": True},
120
- timeout=60.0
130
+ timeout=60.0,
121
131
  ) as response:
122
132
  async for line in response.aiter_lines():
123
133
  if line:
124
134
  import json
135
+
125
136
  data = json.loads(line)
126
137
  if "response" in data:
127
138
  self.current_response += data["response"]
@@ -131,52 +142,56 @@ class StreamingHandler:
131
142
  title="[bold cyan]AI Response (Local)[/bold cyan]",
132
143
  title_align="left",
133
144
  border_style="dim cyan",
134
- padding=(1, 2)
145
+ padding=(1, 2),
135
146
  )
136
147
  )
137
148
  if data.get("done", False):
138
149
  break
139
-
150
+
140
151
  self.is_streaming = False
141
152
  return self.current_response
142
-
153
+
143
154
  except Exception as e:
144
155
  self.console.print(f"[red]Ollama streaming error: {e}[/red]")
145
156
  self.is_streaming = False
146
157
  return None
147
-
158
+
148
159
  async def simulate_streaming(self, text: str, delay: float = 0.02) -> str:
149
160
  """Simulate streaming for non-streaming APIs."""
150
161
  self.current_response = ""
151
162
  self.is_streaming = True
152
-
163
+
153
164
  words = text.split()
154
-
165
+
155
166
  with Live(
156
- Panel("", title="[bold cyan]AI Response[/bold cyan]",
157
- title_align="left", border_style="dim cyan"),
167
+ Panel(
168
+ "",
169
+ title="[bold cyan]AI Response[/bold cyan]",
170
+ title_align="left",
171
+ border_style="dim cyan",
172
+ ),
158
173
  console=self.console,
159
- refresh_per_second=20
174
+ refresh_per_second=20,
160
175
  ) as live:
161
176
  for i, word in enumerate(words):
162
177
  self.current_response += word
163
178
  if i < len(words) - 1:
164
179
  self.current_response += " "
165
-
180
+
166
181
  live.update(
167
182
  Panel(
168
183
  Markdown(self.current_response),
169
184
  title="[bold cyan]AI Response[/bold cyan]",
170
185
  title_align="left",
171
186
  border_style="dim cyan",
172
- padding=(1, 2)
187
+ padding=(1, 2),
173
188
  )
174
189
  )
175
190
  await asyncio.sleep(delay)
176
-
191
+
177
192
  self.is_streaming = False
178
193
  return self.current_response
179
-
194
+
180
195
  def stop_streaming(self):
181
196
  """Stop current streaming operation."""
182
197
  self.is_streaming = False
@@ -186,34 +201,38 @@ class StreamingHandler:
186
201
 
187
202
  class TypewriterEffect:
188
203
  """Provides typewriter effect for text output."""
189
-
204
+
190
205
  def __init__(self, console: Console = None):
191
206
  self.console = console or Console()
192
-
207
+
193
208
  async def type_text(self, text: str, speed: float = 0.03):
194
209
  """Type text with typewriter effect."""
195
210
  for char in text:
196
211
  self.console.print(char, end="")
197
212
  await asyncio.sleep(speed)
198
213
  self.console.print() # New line at end
199
-
214
+
200
215
  async def type_code(self, code: str, language: str = "python", speed: float = 0.01):
201
216
  """Type code with syntax highlighting."""
202
217
  from rich.syntax import Syntax
203
-
218
+
204
219
  # Build up code progressively
205
220
  current_code = ""
206
- lines = code.split('\n')
207
-
221
+ lines = code.split("\n")
222
+
208
223
  with Live(console=self.console, refresh_per_second=30) as live:
209
224
  for line in lines:
210
225
  for char in line:
211
226
  current_code += char
212
- syntax = Syntax(current_code, language, theme="monokai", line_numbers=True)
227
+ syntax = Syntax(
228
+ current_code, language, theme="monokai", line_numbers=True
229
+ )
213
230
  live.update(syntax)
214
231
  await asyncio.sleep(speed)
215
- current_code += '\n'
216
- syntax = Syntax(current_code, language, theme="monokai", line_numbers=True)
232
+ current_code += "\n"
233
+ syntax = Syntax(
234
+ current_code, language, theme="monokai", line_numbers=True
235
+ )
217
236
  live.update(syntax)
218
237
 
219
238
 
@@ -222,50 +241,52 @@ async def stream_with_fallback(message: str, console: Console = None) -> Optiona
222
241
  Stream response with automatic fallback to available options.
223
242
  """
224
243
  import os
244
+
225
245
  handler = StreamingHandler(console)
226
-
246
+
227
247
  # Try OpenAI streaming
228
248
  if os.getenv("OPENAI_API_KEY"):
229
249
  try:
230
250
  from openai import AsyncOpenAI
251
+
231
252
  client = AsyncOpenAI()
232
253
  return await handler.stream_openai(
233
- client,
234
- [{"role": "user", "content": message}]
254
+ client, [{"role": "user", "content": message}]
235
255
  )
236
256
  except Exception as e:
237
257
  if console:
238
258
  console.print(f"[yellow]OpenAI streaming failed: {e}[/yellow]")
239
-
259
+
240
260
  # Try Anthropic streaming
241
261
  if os.getenv("ANTHROPIC_API_KEY"):
242
262
  try:
243
263
  from anthropic import AsyncAnthropic
264
+
244
265
  client = AsyncAnthropic()
245
266
  return await handler.stream_anthropic(
246
- client,
247
- [{"role": "user", "content": message}]
267
+ client, [{"role": "user", "content": message}]
248
268
  )
249
269
  except Exception as e:
250
270
  if console:
251
271
  console.print(f"[yellow]Anthropic streaming failed: {e}[/yellow]")
252
-
272
+
253
273
  # Try Ollama streaming
254
274
  try:
255
275
  return await handler.stream_ollama(message)
256
- except:
276
+ except Exception:
257
277
  pass
258
-
278
+
259
279
  # Fallback to non-streaming with simulated effect
260
280
  if console:
261
281
  console.print("[yellow]Falling back to non-streaming mode[/yellow]")
262
-
282
+
263
283
  # Get response from fallback handler
264
284
  from .fallback_handler import smart_chat
285
+
265
286
  response = await smart_chat(message, console)
266
-
287
+
267
288
  if response:
268
289
  # Simulate streaming
269
290
  return await handler.simulate_streaming(response)
270
-
271
- return None
291
+
292
+ return None
@@ -0,0 +1,276 @@
1
+ Metadata-Version: 2.4
2
+ Name: hanzo
3
+ Version: 0.3.24
4
+ Summary: Hanzo AI - Complete AI Infrastructure Platform with CLI, Router, MCP, and Agent Runtime
5
+ Project-URL: Homepage, https://hanzo.ai
6
+ Project-URL: Repository, https://github.com/hanzoai/python-sdk
7
+ Project-URL: Documentation, https://docs.hanzo.ai/cli
8
+ Project-URL: Bug Tracker, https://github.com/hanzoai/python-sdk/issues
9
+ Author-email: Hanzo AI <dev@hanzo.ai>
10
+ Keywords: agents,ai,cli,hanzo,llm,local-ai,mcp,private-ai
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Environment :: Console
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: License :: OSI Approved :: Apache Software License
15
+ Classifier: Operating System :: OS Independent
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.10
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
21
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
22
+ Requires-Python: >=3.10
23
+ Requires-Dist: anthropic>=0.25.0
24
+ Requires-Dist: click>=8.1.0
25
+ Requires-Dist: httpx>=0.23.0
26
+ Requires-Dist: openai>=1.0.0
27
+ Requires-Dist: prompt-toolkit>=3.0.0
28
+ Requires-Dist: pydantic>=2.0.0
29
+ Requires-Dist: pyyaml>=6.0
30
+ Requires-Dist: rich>=13.0.0
31
+ Requires-Dist: typer>=0.9.0
32
+ Provides-Extra: agents
33
+ Requires-Dist: hanzo-agents>=0.1.0; extra == 'agents'
34
+ Requires-Dist: hanzo-network>=0.1.3; extra == 'agents'
35
+ Provides-Extra: ai
36
+ Requires-Dist: hanzoai>=1.0.0; extra == 'ai'
37
+ Provides-Extra: all
38
+ Requires-Dist: hanzo-aci>=0.2.8; extra == 'all'
39
+ Requires-Dist: hanzo-agents>=0.1.0; extra == 'all'
40
+ Requires-Dist: hanzo-mcp>=0.7.0; extra == 'all'
41
+ Requires-Dist: hanzo-memory>=1.0.0; extra == 'all'
42
+ Requires-Dist: hanzo-network>=0.1.3; extra == 'all'
43
+ Requires-Dist: hanzo-repl>=0.1.0; extra == 'all'
44
+ Requires-Dist: hanzoai>=1.0.0; extra == 'all'
45
+ Provides-Extra: dev
46
+ Requires-Dist: hanzo-aci>=0.2.8; extra == 'dev'
47
+ Provides-Extra: mcp
48
+ Requires-Dist: hanzo-mcp>=0.7.0; extra == 'mcp'
49
+ Provides-Extra: repl
50
+ Requires-Dist: hanzo-repl>=0.1.0; extra == 'repl'
51
+ Provides-Extra: router
52
+ Description-Content-Type: text/markdown
53
+
54
+ # Hanzo CLI and Orchestration Tools
55
+
56
+ [![PyPI](https://img.shields.io/pypi/v/hanzo.svg)](https://pypi.org/project/hanzo/)
57
+ [![Python Version](https://img.shields.io/pypi/pyversions/hanzo.svg)](https://pypi.org/project/hanzo/)
58
+
59
+ Core CLI and orchestration tools for the Hanzo AI platform.
60
+
61
+ ## Installation
62
+
63
+ ```bash
64
+ pip install hanzo
65
+ ```
66
+
67
+ ## Features
68
+
69
+ - **Interactive Chat**: Chat with AI models through CLI
70
+ - **Node Management**: Run local AI inference nodes
71
+ - **Router Control**: Manage LLM proxy router
72
+ - **REPL Interface**: Interactive Python REPL with AI
73
+ - **Batch Orchestration**: Orchestrate multiple AI tasks
74
+ - **Memory Management**: Persistent conversation memory
75
+
76
+ ## Usage
77
+
78
+ ### CLI Commands
79
+
80
+ ```bash
81
+ # Interactive chat
82
+ hanzo chat
83
+
84
+ # Use specific model
85
+ hanzo chat --model gpt-4
86
+
87
+ # Use router (local proxy)
88
+ hanzo chat --router
89
+
90
+ # Use cloud API
91
+ hanzo chat --cloud
92
+ ```
93
+
94
+ ### Node Management
95
+
96
+ ```bash
97
+ # Start local node
98
+ hanzo node start
99
+
100
+ # Check status
101
+ hanzo node status
102
+
103
+ # List available models
104
+ hanzo node models
105
+
106
+ # Load specific model
107
+ hanzo node load llama2:7b
108
+
109
+ # Stop node
110
+ hanzo node stop
111
+ ```
112
+
113
+ ### Router Management
114
+
115
+ ```bash
116
+ # Start router proxy
117
+ hanzo router start
118
+
119
+ # Check router status
120
+ hanzo router status
121
+
122
+ # List available models
123
+ hanzo router models
124
+
125
+ # View configuration
126
+ hanzo router config
127
+
128
+ # Stop router
129
+ hanzo router stop
130
+ ```
131
+
132
+ ### Interactive REPL
133
+
134
+ ```bash
135
+ # Start REPL
136
+ hanzo repl
137
+
138
+ # In REPL:
139
+ > /help # Show help
140
+ > /models # List models
141
+ > /model gpt-4 # Switch model
142
+ > /clear # Clear context
143
+ > What is Python? # Ask questions
144
+ ```
145
+
146
+ ## Python API
147
+
148
+ ### Batch Orchestration
149
+
150
+ ```python
151
+ from hanzo.batch_orchestrator import BatchOrchestrator
152
+
153
+ orchestrator = BatchOrchestrator()
154
+ results = await orchestrator.run_batch([
155
+ "Summarize quantum computing",
156
+ "Explain machine learning",
157
+ "Define artificial intelligence"
158
+ ])
159
+ ```
160
+
161
+ ### Memory Management
162
+
163
+ ```python
164
+ from hanzo.memory_manager import MemoryManager
165
+
166
+ memory = MemoryManager()
167
+ memory.add_to_context("user", "What is Python?")
168
+ memory.add_to_context("assistant", "Python is...")
169
+ context = memory.get_context()
170
+ ```
171
+
172
+ ### Fallback Handling
173
+
174
+ ```python
175
+ from hanzo.fallback_handler import FallbackHandler
176
+
177
+ handler = FallbackHandler()
178
+ result = await handler.handle_with_fallback(
179
+ primary_fn=api_call,
180
+ fallback_fn=local_inference
181
+ )
182
+ ```
183
+
184
+ ## Configuration
185
+
186
+ ### Environment Variables
187
+
188
+ ```bash
189
+ # API settings
190
+ HANZO_API_KEY=your-api-key
191
+ HANZO_BASE_URL=https://api.hanzo.ai
192
+
193
+ # Router settings
194
+ HANZO_ROUTER_URL=http://localhost:4000/v1
195
+
196
+ # Node settings
197
+ HANZO_NODE_URL=http://localhost:8000/v1
198
+ HANZO_NODE_WORKERS=4
199
+
200
+ # Model preferences
201
+ HANZO_DEFAULT_MODEL=gpt-4
202
+ HANZO_FALLBACK_MODEL=llama2:7b
203
+ ```
204
+
205
+ ### Configuration File
206
+
207
+ Create `~/.hanzo/config.yaml`:
208
+
209
+ ```yaml
210
+ api:
211
+ key: your-api-key
212
+ base_url: https://api.hanzo.ai
213
+
214
+ router:
215
+ url: http://localhost:4000/v1
216
+ auto_start: true
217
+
218
+ node:
219
+ url: http://localhost:8000/v1
220
+ workers: 4
221
+ models:
222
+ - llama2:7b
223
+ - mistral:7b
224
+
225
+ models:
226
+ default: gpt-4
227
+ fallback: llama2:7b
228
+ ```
229
+
230
+ ## Architecture
231
+
232
+ ### Components
233
+
234
+ - **CLI**: Command-line interface (`cli.py`)
235
+ - **Chat**: Interactive chat interface (`commands/chat.py`)
236
+ - **Node**: Local AI node management (`commands/node.py`)
237
+ - **Router**: LLM proxy management (`commands/router.py`)
238
+ - **REPL**: Interactive Python REPL (`interactive/repl.py`)
239
+ - **Orchestrator**: Batch task orchestration (`batch_orchestrator.py`)
240
+ - **Memory**: Conversation memory (`memory_manager.py`)
241
+ - **Fallback**: Resilient API handling (`fallback_handler.py`)
242
+
243
+ ### Port Allocation
244
+
245
+ - **4000**: Router (LLM proxy)
246
+ - **8000**: Node (local AI)
247
+ - **9550-9553**: Desktop app integration
248
+
249
+ ## Development
250
+
251
+ ### Setup
252
+
253
+ ```bash
254
+ cd pkg/hanzo
255
+ uv sync --all-extras
256
+ ```
257
+
258
+ ### Testing
259
+
260
+ ```bash
261
+ # Run tests
262
+ pytest tests/
263
+
264
+ # With coverage
265
+ pytest tests/ --cov=hanzo
266
+ ```
267
+
268
+ ### Building
269
+
270
+ ```bash
271
+ uv build
272
+ ```
273
+
274
+ ## License
275
+
276
+ Apache License 2.0
@@ -1,34 +1,38 @@
1
1
  hanzo/__init__.py,sha256=f6N_RcJZ0F9ADrROlvPi1OrgwjF8cWQm34cml8hb1zk,169
2
2
  hanzo/__main__.py,sha256=F3Vz0Ty3bdAj_8oxyETMIqxlmNRnJOAFB1XPxbyfouI,105
3
- hanzo/cli.py,sha256=5e_ee4_dOuiVWf--_ycsyBETkMOnrn0a30kORwwTTcY,18586
4
- hanzo/dev.py,sha256=pqsBZu3QdYHtYyqrRkrAyaKCGEoZVgsA2J5dS0jPWGQ,104404
5
- hanzo/fallback_handler.py,sha256=UJOzfGbf_5rg168PyzC9BQlB6yJ-lEW7B8MkHkVSiK8,10148
6
- hanzo/mcp_server.py,sha256=XVygFNn-9CVdu8c95sP7fQjIRtA8K7nsGpgQNe44BRg,460
7
- hanzo/memory_manager.py,sha256=BjnHN0Fu6Lqg3aKGTVPKfQxDBjtengjwG3ac8zoirrQ,15101
3
+ hanzo/base_agent.py,sha256=ojPaSgFETYl7iARWnNpg8eyAt7sg8eKhn9xZThyvxRA,15324
4
+ hanzo/batch_orchestrator.py,sha256=vn6n5i9gTfZ4DtowFDd5iWgYKjgNTioIomkffKbipSM,35827
5
+ hanzo/cli.py,sha256=eI6GxfGugvhYPjhrivyBJLNboXOgaZqTAwms9qjZH1E,18608
6
+ hanzo/dev.py,sha256=7EnQL8mfCmjHCAKlriSpg4VueipilEtLrPpWNSDOW8Q,105817
7
+ hanzo/fallback_handler.py,sha256=-OoUeF-ACjb1mZ86tKJLFuEttRa2pjBEHJY9a9IlOK4,10191
8
+ hanzo/mcp_server.py,sha256=wgTJen1z1g1T1_OxV2tsmlupBK5rBeFXTgQaUjaGiyY,655
9
+ hanzo/memory_manager.py,sha256=uhNE1Wt8dcArE-wZkvK9Os-_AOCTmE8hfZw_KfxqZbY,14893
10
+ hanzo/model_registry.py,sha256=cEO5kb_rpoTbZGK_5TeXCmhDhd1hZuF8H9YQi03jF6A,11921
8
11
  hanzo/orchestrator_config.py,sha256=JV7DS8aVZwBJ9XzgkQronFwV_A50QyXG3MH_pKwmCB8,11006
9
- hanzo/rate_limiter.py,sha256=wDC_dwx1pg87YnfNwaELnW2zYRAYjmrXb0_LhsJbz5c,11442
12
+ hanzo/rate_limiter.py,sha256=8G9-uGMk8Y9Zun41mgnAV3zO5BjB739EbIDRKcxA6sg,10868
10
13
  hanzo/repl.py,sha256=sW1quuqGkJ_AqgjN2vLNdtWgKDlXIkXiO9Bo1QQI0G4,1089
11
- hanzo/streaming.py,sha256=ZcFGD0k-RjURoamqCeq1Ripxs6I-ousaeQUFIs52Sic,10188
14
+ hanzo/streaming.py,sha256=HRMA3x-GnF31oGgQRkbB7D1uculVoJci2DChuBWGN9Q,10219
12
15
  hanzo/commands/__init__.py,sha256=7rh94TPNhdq4gJBJS0Ayf0fGNChQYCQCJcJPmYYehiQ,182
13
16
  hanzo/commands/agent.py,sha256=DXCfuxHfmC90IoIOL6BJyp7h2yNUo-VIxrfl4OMh8CU,3480
14
17
  hanzo/commands/auth.py,sha256=JrM-EV4XDHzNDJeGJMjAr69T0Rxez53HEzlNo0jQ8nE,11187
15
- hanzo/commands/chat.py,sha256=GqBXHpaen3ySEt4q59mmAU4A8PxXZd8ozDw0HptNHYU,6725
16
- hanzo/commands/cluster.py,sha256=7AVjD1nej1WzBoIz_qcNxRMKHRb05_8qt3z3xRREZ-s,15486
18
+ hanzo/commands/chat.py,sha256=mA30iXlPjeGjyhdVPMMMIjFB0Zr7yljwO3Ao5V37S0o,8687
17
19
  hanzo/commands/config.py,sha256=xAzM6n9GhdVIqtn7JrHfLRzj1sshmxCujo7iet2hHqE,7490
18
20
  hanzo/commands/mcp.py,sha256=u1uEKDY6gUIa7VymEnRzy0ZphdIKYoNwPSeffZaiKnk,7418
19
21
  hanzo/commands/miner.py,sha256=_mZT9nQcT2QSSxI0rDDKuSBVdsg_uE_N_j3PXOHoj-Q,11677
20
22
  hanzo/commands/network.py,sha256=wJDxGIxJqc6FzQhbAn0Mw-WGCPUeCOsxmdU6GCmOhgM,11408
21
- hanzo/commands/repl.py,sha256=FwbBmjNDBZCUQlwKbMZl33r3f899rzI2a2-ZRoBe6kE,5977
23
+ hanzo/commands/node.py,sha256=vzSbcm2-cO1-AZqPSA50t8nQUcnWQUCPT7UneD7HWIM,15402
24
+ hanzo/commands/repl.py,sha256=Frc7tVTThFz0M_vwyA-m4pmfGDUr0WZGsxdu6g0ylNU,6081
25
+ hanzo/commands/router.py,sha256=kB8snUM82cFk3znjFvs3jOJGqv5giKn8DiTkdbXnWYU,5332
22
26
  hanzo/commands/tools.py,sha256=fG27wRweVmaFJowBpmwp5PgkRUtIF8bIlu_hGWr69Ss,10393
23
27
  hanzo/interactive/__init__.py,sha256=ENHkGOqu-JYI05lqoOKDczJGl96oq6nM476EPhflAbI,74
24
28
  hanzo/interactive/dashboard.py,sha256=XB5H_PMlReriCip-wW9iuUiJQOAtSATFG8EyhhFhItU,3842
25
- hanzo/interactive/repl.py,sha256=w69ZSiaJ7g2nYKE4SA0IDsQg-V6eYy3z0-mqw0VCYFU,5580
29
+ hanzo/interactive/repl.py,sha256=oAPGxgl54KL-8O6UDyfghpkpJz4wWv8hgau7kV_EASQ,6924
26
30
  hanzo/router/__init__.py,sha256=_cRG9nHC_wwq17iVYZSUNBYiJDdByfLDVEuIQn5-ePM,978
27
31
  hanzo/utils/__init__.py,sha256=5RRwKI852vp8smr4xCRgeKfn7dLEnHbdXGfVYTZ5jDQ,69
28
32
  hanzo/utils/config.py,sha256=FD_LoBpcoF5dgJ7WL4o6LDp2pdOy8kS-dJ6iRO2GcGM,4728
29
33
  hanzo/utils/net_check.py,sha256=YFbJ65SzfDYHkHLZe3n51VhId1VI3zhyx8p6BM-l6jE,3017
30
34
  hanzo/utils/output.py,sha256=W0j3psF07vJiX4s02gbN4zYWfbKNsb8TSIoagBSf5vA,2704
31
- hanzo-0.3.22.dist-info/METADATA,sha256=v6o7Fzl4QLpF2qKgEFI3XxretCxJFDiU_Zx_DXxyMJA,4279
32
- hanzo-0.3.22.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
33
- hanzo-0.3.22.dist-info/entry_points.txt,sha256=pQLPMdqOXU_2BfTcMDhkqTCDNk_H6ApvYuSaWcuQOOw,171
34
- hanzo-0.3.22.dist-info/RECORD,,
35
+ hanzo-0.3.24.dist-info/METADATA,sha256=X1RZ3xdBfmq59fvZ6trPY6R_evVKl95_BJ86E3DulSU,6061
36
+ hanzo-0.3.24.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
37
+ hanzo-0.3.24.dist-info/entry_points.txt,sha256=pQLPMdqOXU_2BfTcMDhkqTCDNk_H6ApvYuSaWcuQOOw,171
38
+ hanzo-0.3.24.dist-info/RECORD,,