mirror of
https://github.com/hanzoai/python-sdk.git
synced 2026-10-23 20:23:00 +00:00
`hanzo` depends on `hanzo-cli`, and BOTH declared `[project.scripts] hanzo`. Entry-point resolution is install-order dependent, so which CLI a user got was a coin flip — and hanzo-cli kept winning. The result: $ hanzo auth login Error: No such command 'auth'. So the "auth login is broken by Cloudflare 1010" story was real but unreachable: users never got as far as the HTTP call, because the binary they had did not have an `auth` command at all. Publishing that fix would have changed nothing. One command, one owner: - hanzo-cli drops its console script. `hanzo` is the ONE command. - `paas` and `bot` are mounted into it — the only two groups with no equivalent. `kms` is NOT mounted: `hanzo secrets` is a strict superset (audit/grant/ revoke/rollback/rotate/versions on top of the same get/list/set/delete), and two commands for one concern is what we are removing. - hanzo_cli grows a __main__ so it stays invocable as `python -m hanzo_cli`, and its e2e suite targets that instead of whatever `hanzo` resolves to. Endpoints, one definition: - models.IAMConfig (the class the package EXPORTS) gains the HIP-0111 endpoint properties. config.IAMConfig had them, but nothing imports that one — a second same-named class nobody uses is how the legacy path survived. - config.py + fastapi.py stop hand-assembling paths and read the constants. - password_login posted to `/oauth/token`, which is not a 404: IAM serves a 200 text/html SPA catch-all for unregistered paths, so it received a login PAGE and json() blew up on HTML. Verified: legacy 200 text/html vs canonical 401 application/json. PKCE, because this is a public client: - browser_login ships no client_secret, so the authorization code was the only secret in the flow and it arrives over a plaintext loopback redirect. The SDK already accepted code_challenge/code_verifier; the CLI simply never passed them. RFC 8252 §8.1 / RFC 7636 S256. Version, one source: - pyproject said 0.4.4, __init__ said 0.3.47, cli.py said 0.3.48, and the installed binary reported 0.1.0 — four answers, none right. Now resolved from the installed distribution. Verified on a clean venv: entry-point providers 2 -> 1, commands 10 -> 58, `hanzo --version` 0.1.0 -> 0.4.4, all four endpoints canonical. hanzo-iam 19/19 pass; hanzo-cli's 20 failures are unchanged before and after and are all live-service auth (no stored token in this environment). Co-authored-by: Hanzo Dev <[email protected]>
Hanzo CLI and Orchestration Tools
Core CLI and orchestration tools for the Hanzo AI platform.
Installation
pip install hanzo
Features
- Interactive Chat: Chat with AI models through CLI
- Node Management: Run local AI inference nodes
- Router Control: Manage LLM proxy router
- REPL Interface: Interactive Python REPL with AI
- Batch Orchestration: Orchestrate multiple AI tasks
- Memory Management: Persistent conversation memory
Usage
CLI Commands
# Interactive chat
hanzo chat
# Use specific model
hanzo chat --model gpt-4
# Use router (local proxy)
hanzo chat --router
# Use cloud API
hanzo chat --cloud
Node Management
# Start local node
hanzo node start
# Check status
hanzo node status
# List available models
hanzo node models
# Load specific model
hanzo node load llama2:7b
# Stop node
hanzo node stop
Router Management
# Start router proxy
hanzo router start
# Check router status
hanzo router status
# List available models
hanzo router models
# View configuration
hanzo router config
# Stop router
hanzo router stop
Interactive REPL
# Start REPL
hanzo repl
# In REPL:
> /help # Show help
> /models # List models
> /model gpt-4 # Switch model
> /clear # Clear context
> What is Python? # Ask questions
Python API
Batch Orchestration
from hanzo.batch_orchestrator import BatchOrchestrator
orchestrator = BatchOrchestrator()
results = await orchestrator.run_batch([
"Summarize quantum computing",
"Explain machine learning",
"Define artificial intelligence"
])
Memory Management
from hanzo.memory_manager import MemoryManager
memory = MemoryManager()
memory.add_to_context("user", "What is Python?")
memory.add_to_context("assistant", "Python is...")
context = memory.get_context()
Fallback Handling
from hanzo.fallback_handler import FallbackHandler
handler = FallbackHandler()
result = await handler.handle_with_fallback(
primary_fn=api_call,
fallback_fn=local_inference
)
Configuration
Environment Variables
# API settings
HANZO_API_KEY=your-api-key
HANZO_BASE_URL=https://api.hanzo.ai
# Router settings
HANZO_ROUTER_URL=http://localhost:4000/v1
# Node settings
HANZO_NODE_URL=http://localhost:8000/v1
HANZO_NODE_WORKERS=4
# Model preferences
HANZO_DEFAULT_MODEL=gpt-4
HANZO_FALLBACK_MODEL=llama2:7b
Configuration File
Create ~/.hanzo/config.yaml:
api:
key: your-api-key
base_url: https://api.hanzo.ai
router:
url: http://localhost:4000/v1
auto_start: true
node:
url: http://localhost:8000/v1
workers: 4
models:
- llama2:7b
- mistral:7b
models:
default: gpt-4
fallback: llama2:7b
Architecture
Components
- CLI: Command-line interface (
cli.py) - Chat: Interactive chat interface (
commands/chat.py) - Node: Local AI node management (
commands/node.py) - Router: LLM proxy management (
commands/router.py) - REPL: Interactive Python REPL (
interactive/repl.py) - Orchestrator: Batch task orchestration (
batch_orchestrator.py) - Memory: Conversation memory (
memory_manager.py) - Fallback: Resilient API handling (
fallback_handler.py)
Port Allocation
- 4000: Router (LLM proxy)
- 8000: Node (local AI)
- 9550-9553: Desktop app integration
Development
Setup
cd pkg/hanzo
uv sync --all-extras
Testing
# Run tests
pytest tests/
# With coverage
pytest tests/ --cov=hanzo
Building
uv build
License
Apache License 2.0