概要
nanobot は、WebUI、チャットチャネル、ツール、メモリ、MCP、モデルルーティング、自動化、デプロイをサポートする、オープンソースの超軽量パーソナル AI Agent ランタイムです。コアコードは簡潔で読みやすく、カスタマイズや拡張が容易です。
README プレビュー
\n \n \n\n\n\n \n English |\n 简体中文 |\n 繁體中文 |\n Español |\n Français |\n Bahasa Indonesia |\n 日本語 |\n 한국어 |\n Русский |\n Tiếng Việt\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n🐈 **nanobot** is an open-source, ultra-lightweight personal AI agent you can truly own. It keeps the agent core small and readable while giving you the practical pieces for real long-running work: WebUI, chat channels, tools, memory, MCP, model routing, automation, and deployment.\n\n## Start Here\n\n| You want to... | Go to |\n|---|---|\n| Install nanobot with no terminal/config background | [Start Without Technical Background](./docs/start-without-technical-background.md) |\n| Install quickly and get one CLI reply | [Install](#-install) and [Quick Start](#-quick-start) |\n| Open the bundled browser UI | [WebUI](#-webui) |\n| Connect Telegram, Discord, WeChat, Slack, Email, Mattermost, or another chat app | [Chat Apps](./docs/chat-apps.md) |\n| Configure providers, fallback models, Langfuse, MCP, web tools, or security | [Docs](./docs/README.md) and [Configuration](./docs/configuration.md) |\n| Understand or extend the internals | [Architecture](./docs/architecture.md) and [Development](./docs/development.md) |\n| Deploy to the cloud in one click | [Deploy to Render](#deploy-to-render) |\n\n## Deploy to Render\n\nDeploy nanobot's gateway and bundled WebUI as a single web service with persistent memory. Render reads [`render.yaml`](./render.yaml) and prompts for two secrets on deploy: `ANTHROPIC_API_KEY` and `NANOBOT_WEB_TOKEN` (the password that gates the public WebUI — generate a strong random value, e.g. `openssl rand -hex 32`).\n\n> **Note:** The blueprint attaches a persistent disk so sessions, memory, and WebUI history survive restarts. Persistent disks require a paid service (they are not available on Render's free tier).\n\n[](https://render.com/deploy?repo=https://github.com/HKUDS/n
FAQ (5)
トラブル対応Nanobot で WhatsApp のリプレイフィルターがまったく発火せず、タイムスタンプがはるか未来の日付を表示する問題を修正する方法
単位の不一致は、neonize が MessageInfo.Timestamp を Unix ミリ秒で提供する一方、time.time() と下流のメタデータが Unix 秒を使用しているために発生します。nanobot/channels/whatsapp/runtime.py でタイムスタンプを読み取った直後に正規化してください:
timestamp = float(_safe_attr(info, "Timestamp", 0) or 0)
if timestamp >= 1e11: # Unix milliseconds; seconds would be past year 5000
timestamp /= 1000.0
この変更後、timestamp < self._started_at はリプレイされたメッセージを正しくフィルタリングし、"timestamp": int(timestamp) は整数のエポック秒を転送します。古いミリ秒タイムスタンプが破棄されること、新しいものが保持されること、およびメタデータのタイムスタンプが秒単位であることをカバーするテストを追加してください。
トラブル対応Windowsでnanobot webuiのメモリリークを修正する方法(アイドル時にPythonプロセスが5GB以上に増大する)?
これは nanobot/process_runtime.py 内の _windows_process_identity() が原因で発生する既知のバグです。この関数は、呼び出されるたびに ctypes.Structure サブクラス、POINTER 型、および WinDLL('kernel32') バインディングを再定義していました。ctypes はこれらを永続的なモジュールレベルの _pointer_type_cache に保持するため、ガベージコレクタが回収できない約 6.5 KB が呼び出しごとにリークしていました(約 2.6 MB/分、約 3.7 GB/日)。webui ランチャーは 0.5 秒ごとに runtime.status() をポーリングし、ゲートウェイは 1 秒ごとにクライアントの状態をポーリングするため、アイドル状態でもメモリが継続的に増加していました。
修正方法: PR #6507 を含むバージョンに nanobot をアップデートしてください。このパッチでは、FileTime 構造体と POINTER 型をモジュールレベルに移動し、kernel32 バインディングを @lru_cache(maxsize=1) で一度だけキャッシュします:
class _FileTime(ctypes.Structure):
_fields_ = [("low", ctypes.c_uint32), ("high", ctypes.c_uint32)]
_FILE_TIME_PTR = ctypes.POINTER(_FileTime)
@lru_cache(maxsize=1)
def _windows_kernel32():
kernel32 = ctypes.WinDLL("kernel32", use_last_error=True)
# configure argtypes/restype once here
return kernel32
def _windows_process_identity(pid: int):
if os.name != "nt":
return None
kernel32 = _windows_kernel32()
handle = kernel32.OpenProcess(0x1000, False, pid)
...
すぐにアップグレードできない場合は、一時的な回避策として webui プロセスを定期的に再起動してください。このコードパスは Windows 専用であるため、Linux/macOS は影響を受けません。
トラブル対応ターミナルでは正常に動作するのに、nanobot CLI App内でObsidian CLIが「unable to find Obsidian」を返す問題を修正する方法
これは、nanobot 0.3.5 の CLI Apps が削減された環境で実行され、XDG_RUNTIME_DIR を破棄するために発生します。Obsidian は GNOME/Wayland 上で実行中のデスクトップアプリを見つけるためにこの変数を必要とします。修正 fix(cli-apps): preserve XDG_RUNTIME_DIR for desktop CLIs を含むリリースに nanobot をアップグレードしてください。回避策として、変数を明示的に設定した上で shell exec ツール経由で Obsidian CLI を実行し、CLI ランチャーのパスを使用してください。
XDG_RUNTIME_DIR=/run/user/$(id -u) /home/<user>/.local/bin/obsidian tags total
例:
XDG_RUNTIME_DIR=/run/user/1000 /home/alice/.local/bin/obsidian tags counts
値は次のコマンドで確認できます。
echo "$XDG_RUNTIME_DIR"
また、ゲートウェイが XDG_RUNTIME_DIR を継承するよう、デスクトップセッションから起動されていることを確認してください。/usr/bin/obsidian を使用すると、~/.local/bin/obsidian にあるユーザーがインストールした CLI ではなく、デスクトップランチャーに解決される場合があります。
トラブル対応なぜ nanobot CLI は macOS で、コマンドラインが中国語/CJK文字で終わると起動時に UnicodeDecodeError でクラッシュするのか、またそれを修正するにはどうすればよいですか?
原因: nanobot/cli/process_identity.py は、setproctitle をインポートする前に無条件で SPT_NOENV=1 を設定します。macOS では、これにより setproctitle (<=1.3.8) が argv とまったく同じ長さのバッファを使用するようになり、その off-by-one バグによって最終バイトが欠落します (py-setproctitle#167)。最後の引数がマルチバイト UTF-8 文字 (CJK/絵文字) で終わっている場合、シーケンスが切り詰められ、インポート時に macOS 固有の getproctitle() 呼び出しが UnicodeDecodeError を発生させ、モデル呼び出しが行われる前に CLI が強制終了します。修正: SPT_NOENV は Linux でのみ設定します (macOS では無意味です)。nanobot/cli/process_identity.py を編集してください:
import sys
def _set_process_title(title: str) -> None:
if sys.platform == "linux":
os.environ.setdefault("SPT_NOENV", "1")
from setproctitle import setproctitle
setproctitle(title)
uv ツール環境内で python -c "import nanobot.cli.process_identity as m; print(m.__file__)" を実行してファイルの場所を特定し、変更を適用すると、CJK 引数でも CLI が正常に起動します。オプションとして、import/setproctitle 呼び出しを try/except でラップし、プロセス名の設定が致命的なエラーになることを防ぐこともできます。このパッチによる Linux の動作の変更はありません。
トラブル対応Windows で複数の Nanobot インスタンスを使用する際に NANOBOT_HOME が無視され、Telegram の競合が発生する問題を修正する方法
影響を受ける Windows ビルドでは、Nanobot はデフォルトの設定とワークスペースを USERPROFILE から解決するため、両方のインスタンスが C:\Users\<user>\.nanobot\config.json を読み込み、同じ Telegram ボットトークンを使用することになります。
**回避策:** 各インスタンスを別々の CMD ウィンドウで、異なる USERPROFILE を設定して起動します:
set "USERPROFILE=C:\Nanobot\instance2"nanobot gateway
必要に応じて、まずそのホームを初期化/オンボードしてから、各インスタンスに個別の Telegram ボットトークンを設定してください。
永続的な --home セレクターが #6128 で追加される予定です。利用可能になったら、以下を使用してください:
nanobot --home C:\Nanobot\instance2 onboardnanobot --home C:\Nanobot\instance2 gateway