注意は、モデルが持つすべて。
集中は、niuma_code が行うこと。
2017年、「Attention is All You Need」が時代を定義しました — すべてのモデル知能は注意に基づいて構築されています。8年後、私たちはモデルが注意メカニズムを欠いているのではないことに気づきました — 重要な場所に注意を置くことを欠いているのです。コンテキストが長くなればなるほど、ノイズが真に重要な情報を薄めてしまいます。niuma_code は一つのことをします:コンテキストを引き、集中を加える — すべてのトークンがそのあるべき場所に届くように。
実際の動作を見る
IDE オーケストレーションモードの実際のスクリーンレコーディング — 1分で niuma_code の集中力をお試しください
niuma_code が選ばれる理由
Claude Code の代替ではなく、より集中力を高める補完ツールです
自律 Harness モード
デフォルトモード — コマンド不要。LLM がツールループ内で自律的に探索し、考えながら行動し、タスクが完了するまで実行し続けます。
- Tool-use ループ: LLM がファイルの読み取り / コードの編集 / コマンドの実行を自律的に判断
- API エラー自動リトライ、ストリーミング描画 + ESC キャンセル + 長い出力の自動圧縮
- 曖昧で分解しにくいタスクに最適 — LLM が完了を判断
Loop エンジニアリングオーケストレーション
/loop <goal> で目標指向の自己ループに入ります:
検証コマンドで計画し、順次実行し、各ステップを検証し、失敗時に自己修正します。
- 計画 → 実行 → 検証 → 失敗リトライ(3回まで、失敗理由をフィードバック)
- 二重直交ゲート: MAX_ROUNDS=20 タスク上限 + MAX_RETRIES=3 自己修正
- 各ラウンドで harness を呼び出し1ステップ実行 — 分解可能な検証可能なエンジニアリングタスクに最適
TUI フルスクリーンモード
prompt_toolkit のフルスクリーン UI ベース。入力は常に下部に固定され、 LLM ストリーミング中いつでも新しいメッセージを追加できます — コンテンツが押し出されることはありません。
- 5つのモーダルオーバーレイ: モデル設定、メッセージキュー、コンテキスト切替、会話管理、権限確認
- マウスドラッグ選択ハイライト、スクロール閲覧、左クリック自動コピー、Ctrl+スクロールフォントズーム
- リアルタイムステータスバー: 思考プレビュー、入出力トークン数、圧縮進捗 + ESC キャンセル
IDE オーケストレーションモード
フルスクリーンコードエディタ。ネイティブ Python 構文でオーケストレーションスクリプトを記述し、 LLM 呼び出しを制御可能なスクリプトワークフローに組み込みます。
- llm_call / llm_confirm / llm_judge 関数を注入して制御可能な LLM オーケストレーション
- F5 プレビュー(AST 静的解析)、F6 実行(無人、ツール権限自動付与)
- セキュアサンドボックス実行 + 危険なインポートブラックリスト(os/subprocess/socket 等)— 無人モード唯一の安全ネット
マルチプロバイダールーティング
settings.json で複数の API エンドポイントを設定 — リクエストはモデル名に基づいて自動的に正しいプロバイダーにルーティングされ、セッション内で自由に切替可能。
- 各プロバイダーが base_url / api_key / サポートモデルリストを宣言
- #tag または /model でモデル切替 — リクエストが自動的に正しいエンドポイントに接続
- 3層設定カスケード(ユーザーレベル / プロジェクトレベル / プロジェクトローカル)、後に定義されたものが優先
並列コンテキスト管理
単一の会話をN個の並列コンテキストに拡張し、各コンテキストが独立して履歴、 トークン数、圧縮状態を管理 — クロスコンタミネーションゼロ。
- LRU 駆除、デフォルト上限5(max_contexts で設定可能)— 駆除 = アーカイブ済みで復元可能
- /context ビジュアルオーバーレイで切替;退出時に非同期サマリー生成
- /messages ユニット単位で複数選択 — 削除 / 並べ替え / LLM サマリー統合
コード知識グラフ
tree-sitter をベースにコード構造を解析し、シンボル定義、 呼び出しチェーン、依存関係グラフを構築 — LLM が行を読む前に正確に位置を特定します。
- 4つの読み取り専用クエリツール: シンボル検索、ファイル依存関係、参照、呼び出しチェーン
- ファイル:行番号とシグネチャを返却 — grep の大海撈 needle 的なアプローチを代替
- オンデマンドリビルドの3要素判断 — 起動時の全体パースを回避
並列サブエージェント調査
読み取り専用のサブエージェントが並列でツールを実行し、分離されたコンテキストで調査し、 サマリーのみを返却 — メインコンテキストは清潔なまま。
- 複数のサブエージェントが読み取り専用ツールを並列実行、非ブロッキング
- 分離されたコンテキストでの調査、サマリーのみ — メイン会話を汚染しない
- デフォルトの harness パラダイムに属し、スタンドアロンモードではなくオンデマンドで呼び出し
知覚駆動メモリ
memory-palace による永続メモリ — 実行中のイベントが リアルタイムでメモリとしてキャプチャされ、セッション間で経験を蓄積します。
- 10種類の知覚イベント(視覚/身体/舌/鼻/成果など)、会話後ではなくリアルタイムで書き込み
- 事実三組 + 会話サマリー、4層リトリーバル + ベイズ減衰
- 次回セッションでシステムプロンプトに自動注入、安定した回想位置
成果報酬トラッキング
タスク目標の全ライフサイクルをトラッキングし、完了品質に基づいて報酬スコアを算出し、 知覚イベントとしてメモリに書き込みます。
- OutcomeTracker が全タスクライフサイクルで 0.0〜1.0 の報酬スコアを算出
- 報酬スコアはメモリの再利用価値評価シグナルとなる
- 10種類の知覚イベントの一つとして、read/write/tool-call イベントと統合
両モードを効果的に活用する方法
ステップが不明な場合は記述して反復(harness)。チェックリストがある場合は /loop を使用
harness の要点
harness には再計画ループがありません — 入力が明確であればあるほど、自律探索が正確になります。
- 制約を事前に明記: 目標 + 触れないファイル/関数 + 受入基準 — 実行中に要件を変更しない
- 境界は曖昧だが目標が明確な場合に最適; ステップが明確であればあるほど収束が速い
- 制御ポイントを使用: ESC でいつでも停止、長い出力は自動圧縮、API エラーは自動リトライ
- 「完了した」と「実際に完了した」は別物 — 重要な変更後は自分でテスト/コンパイルを実行
loop の要点
自己修正は「検証」に完全に依存 — 検証可能な目標のみが3回の修正を意味あるものにします。
- 目標は検証コマンド付きのステップに分解可能でなければならない — 「もっと洗練して」は検証できない
- 検証方法を目標に直接記述(py_compile / テスト)すると計画精度が最も高くなる
- 3回の修正失敗は通常、検証情報が不足していることを意味 — より頑張るより、さらに分解する
- 3回の失敗で停止せず — 記録されループは続行; サマリーの [!!] マーカーを確認
3ステップで起動
ダウンロード、設定、起動 — 数秒で準備完了
settings.json パラメータ一覧
設定ファイルパス: ~/.niuma/settings.json
factories — マルチプロバイダー API 設定。各プロバイダーが base_url / api_key / サポートモデルリストを宣言;リクエストはモデル名で自動ルーティング
{
"factories": [
{
"base_url": "https://api.anthropic.com", // Anthropic official endpoint
"api_key": "sk-ant-xxx", // Required; all three fields must be present
"options": ["claude-sonnet-4-6", "claude-opus-4-8"] // Supported models for this provider
},
{
"base_url": "https://your-proxy.example.com", // Anthropic-compatible proxy endpoint
"api_key": "sk-proxy-xxx",
"options": ["claude-sonnet-4-6"] // Supported models for this endpoint
}
]
}
| パラメータ | 型 | デフォルト | 説明 |
|---|---|---|---|
| base_url | string | --- | API エンドポイント URL(必須) |
| api_key | string | --- | API キー(必須) |
| options | string[] | [] | このプロバイダーのサポートモデル名 |
llm — モデル、エフェクトレベル、思考予算 & コンテキスト管理
{
"llm": {
"default_model": "claude-sonnet-4-6", // Default value for /model switch
"default_effort": "high", // Determines which thinking_budget is used
"max_contexts": 5, // Max parallel contexts; LRU eviction beyond limit
"resume_latest_context": true, // Resume last active context on startup
"options": [ // Model -> effort mapping
{"claude-sonnet-4-6": ["low", "medium", "high"]},
{"claude-opus-4-8": ["low", "medium", "high", "max"]}
],
"thinking_budget_low": "0", // 0 = disable extended thinking
"thinking_budget_medium": "0",
"thinking_budget_high": "10000", // Thinking budget for high effort
"thinking_budget_max": "20000" // Thinking budget for max effort (deepest reasoning)
}
}
| パラメータ | 型 | デフォルト | 説明 |
|---|---|---|---|
| default_model | string | "claude-sonnet-4-6" | デフォルトモデル(セッション中固定、/model で切替可能) |
| default_effort | string | "high" | デフォルトエフェクトレベル — 思考予算の深さを制御 |
| max_contexts | integer | 5 | 最大アクティブ並列コンテキスト数;超過時は LRU で最古を駆除 |
| resume_latest_context | boolean | true | 起動時に最後のアクティブコンテキストを復元;false = 新規開始 |
| options | object[] | [] | モデル→エフェクトマッピング、/model 切替の検証に使用 |
| thinking_budget_low | string/int | "0" | low エフェクト時の思考トークン予算(0 = 無効) |
| thinking_budget_medium | string/int | "0" | medium エフェクト時の思考トークン予算 |
| thinking_budget_high | string/int | "10000" | high エフェクト時の思考トークン予算 |
| thinking_budget_max | string/int | "20000" | max エフェクト時の思考トークン予算(最も深い推論) |
env — os.environ に書き込まれる環境変数。ペルソナ、デバッグ、ネットワーク、権限動作を制御
{
"env": {
"PERSONA_NAME": "niuma", // AI persona name, injected into system prompt
"MODEL_BACKGROUND": "claude-haiku-4-5", // Background task model (memory extraction, compression, etc.)
"LANG": "zh", // UI language (zh/en); also controls LLM response language
"TEMPERATURE_ZERO": "true", // Note: all values are strings
"API_TIMEOUT": "30", // Streaming stall timeout (seconds)
"API_ROUND_MAX": "120", // Per-turn wall-clock hard limit (seconds)
"API_STALL_MAX_RETRIES": "2", // Max auto-retries on stream stall
"PERMISSION_MODE": "auto", // auto=whitelist+confirm / manual=whitelist only / skip=allow all
"ALLOWED_TOOLS": "" // Whitelisted tools (comma-separated); empty = built-in defaults
}
}
| パラメータ | 型 | デフォルト | 説明 |
|---|---|---|---|
| PERSONA_NAME | string | "niuma" | システムプロンプトに注入されるペルソナ名 |
| MODEL_BACKGROUND | string | "claude-haiku-4-5" | メモリ抽出、圧縮などのバックグラウンドタスク用モデル |
| LANG | string | "en" | UI 言語(zh/en)、LLM 応答言語も制御 |
| TEMPERATURE_ZERO | string(bool) | "true" | temperature=0 を固定して決定論的出力;false = モデルデフォルト |
| API_TIMEOUT | string/int | "30" | ストリーミング停滞タイムアウト(秒)— これ以上イベントがない場合は再接続 |
| API_ROUND_MAX | string/int | "120" | ターンごとの壁時計ハードリミット(秒)— 古いストリームを強制終了 |
| API_STALL_MAX_RETRIES | string/int | "2" | ストリーム停滞時の最大リトライ回数 |
| PERMISSION_MODE | string | "auto" | 権限モード: auto(ホワイトリスト+確認)/ manual(ホワイトリストのみ)/ skip(すべて許可) |
| ALLOWED_TOOLS | string | "" | カンマ区切りツールホワイトリスト;空 = ビルトインデフォルト |
compact — コンテキスト圧縮: 長い会話を自動圧縮して重要な情報を保持
{
"compact": {
// -- Inline compression (blocks main loop until done) --
"inline_trigger": 0.8, // Triggers at 80% of MAX_TOKENS
"inline_keep_ratio": 0.4, // Keep latest 40% of messages after compression
// -- Post-reply async compression (non-blocking, runs in background) --
"idle_trigger": 0.5, // Triggers at 50% of MAX_TOKENS
"idle_keep_ratio": 0.4, // Keep latest 40% of messages after compression
// -- LLM summary output limit --
"max_summary_tokens": 4096 // Max tokens for generated summary
}
}
| パラメータ | 型 | デフォルト | 説明 |
|---|---|---|---|
| inline_trigger | float | 0.8 | インライン圧縮トリガー率 — 到達時にメインループをブロック |
| inline_keep_ratio | float | 0.4 | インライン圧縮後に保持する最近のメッセージ比率 |
| idle_trigger | float | 0.5 | アイドル圧縮トリガー率 — 応答完了後に非同期実行 |
| idle_keep_ratio | float | 0.4 | アイドル圧縮後に保持する最近のメッセージ比率 |
| max_summary_tokens | integer | 4096 | LLM 生成の圧縮サマリーの最大出力トークン |
memory_palace — Memory Palace LLM 設定;llm ブロックとは独立し、別途パースされる
// Basic mode: rule-based extraction only (no LLM, zero cost)
{
"memory_palace": {
"enable_v9": false, // Disable V9; falls back to legacy V8 mode
"llm_enabled": false // Disable LLM enhancement
}
}
// Full mode: LLM-enhanced extraction (all three fields required; otherwise falls back to rule-based)
{
"memory_palace": {
"enable_v9": true,
"llm_enabled": true, // Once enabled, the following three fields are required
"base_url": "https://api.anthropic.com",
"api_key": "sk-ant-xxx",
"model": "claude-haiku-4-5" // Recommend a lightweight model to save tokens
}
}
| パラメータ | 型 | デフォルト | 説明 |
|---|---|---|---|
| enable_v9 | boolean | true | V9 知覚駆動メモリを有効化;false = レガシー V8 モード |
| llm_enabled | boolean | false | LLM 強化メモリ抽出を有効化;false = ルールベースのみ |
| base_url | string | "" | メモリ LLM API エンドポイント(3フィールドすべて必須、否则ルールベースにフォールバック) |
| api_key | string | "" | メモリ LLM API キー |
| model | string | "" | メモリ LLM 用モデル(haiku のような軽量モデルを推奨) |
memory_quality — メモリ品質ゲートしきい値;書き込みフィルタリングと回想精度を制御
{
"memory_quality": {
"min_store_importance": 0.4, // Write gate: discard facts with importance below this threshold
"min_recall_score": 0.35, // Recall gate: skip memories scoring below this threshold
"dedup_threshold": 0.3 // Dedup threshold: Jaccard similarity above this = duplicate
}
}
| パラメータ | 型 | デフォルト | 説明 |
|---|---|---|---|
| min_store_importance | float | 0.4 | 書き込みゲート: 重要度がこのしきい値未満の事実は抽出時に破棄 |
| min_recall_score | float | 0.35 | 回想ゲート: このスコア未満のメモリはプロンプトに注入されない |
| dedup_threshold | float | 0.3 | 重複除去しきい値: この値を超える Jaccard 類似度 = 重複、最新を保持 |
利用可能なコマンド一覧
スラッシュコマンドでクイックアクションを実行
| コマンド | 説明 |
|---|---|
| /ide | フルスクリーンコードエディタを起動 |
| /context | マルチコンテキスト管理(新規/リネーム/切替/削除) |
| /help | ヘルプ情報を表示 |
| /copy | 最後のレスポンスをクリップボードにコピー |
| /resume | 未完了のタスクを再開 |
| /clear | 会話コンテキストをクリア |
| /restart | niuma を再起動 |
| /model | モデルの確認/切替 |
| /quit | プログラム終了 |