Strands エンジン
Libre WebUI には、オープンソースの Strands Agents harness(@strands-agents/sdk 1.19.0 上の @strands-agents/harness 0.1.1)をベースにしたエージェントエンジンが組み込まれています。エンジンは Libre WebUI のバックエンドプロセス内で動作するため、別途デーモンをインストールする必要はありません。SDK はエンジンを初めて使うときに読み込まれ、Strands をオフにしているサーバーでは一切読み込まれません。
エンジンは、Libre WebUI がすでに提供しているモデルを動かします。
- Ollama が有効な場合は Ollama のモデル
- 有効なチャットまたは補完プロバイダープラグインのモデル
すべてのモデル呼び出しは、チャットが使うものと同じ Ollama サービスとプラグインサービスを経由します。プロバイダーの設定や API キーを別に用意する必要はありません。プロバイダーの認証情報と Ollama のスイッチは、そのまま適用されます。
エンジンは次の 3 か所で使えます。
- Strands ページ: 永続的なエージェントセッション用
- チャット: モデルセレクターの Strands 項目から
- Work: コンポーザーの エンジン コントロールの Strands オプションとして
アクセス
エンジンを使えるユーザーは、管理者が 設定 → ユーザー管理 → アクセスとポリシー → Strands エンジン で選択します。
| モード | 設定での表示 | Strands を使えるユーザー |
|---|---|---|
disabled | オフ | だれも使えません。管理者も含みます(既定) |
admins | 管理者 | 有効な管理者 |
all-users | すべてのユーザー | 有効なすべてのアカウント |
変更は次のリクエストから反映され、再起動は不要です。
デプロイ単位でモードを固定するには、LIBRE_STRANDS_ACCESS を設定します。
LIBRE_STRANDS_ACCESS=admins # or disabled, all-users
モードを固定すると、ユーザー管理のコントロールはロックされます。disabled、admins、all-users 以外の値を指定すると、保存済みの設定に戻るのではなく、エンジンはオフの状態でロックされます。
サーバーは、すべての REST リクエスト、WebSocket チャット、そして Work 実行中のすべてのモデル呼び出しでこのモードを適用します。モードを読み取れない場合はアクセスを拒否します。アクセス権のないアカウントには、Strands ページ、チャットの Strands 項目、Strands の Work エンジンのいずれも表示されず、API は 403 を返します。
Strands ページ
サイドバーから Strands(/strands)を開きます。
- セッションは再起動後も保持され、1 アカウントあたり最大 200 件です。新しいセッションには最初のメッセージから名前が付きます。
- セッションごとにモデルを選べます。既定のモデル を選ぶと、既定のチャットモデルが使われます。
- 返信は生成と同時にストリーミング表示され、モデルの推論と、ツール呼び出しごとのカードも表示されます。
- 停止 を押すと実行中のターンがキャンセルされます。1 つのセッションで同時に実行できるターンは 1 つだけです。
- セッションを削除すると、その履歴とワークスペースも削除されます。
チャット
モデルセレクターで Strands を選びます。エージェントCLIモデルと並んで エージェント グループに表示されます。
- Strands(
strands)はエンジンの既定、つまり既定のチャットモデルを使います。 - Strands · モデル(プロバイダー)(
strands:<route>)は、その会話で使うモデルとプロバイダーを 1 つに固定します。
チャットで Strands を使えるかどうかは、Strands へのアクセス権だけで決まります。エージェントCLIモデルの切り替えは不要で、その切り替えがオフでも表示されます。チャットでも、エージェントは Strands ページと同じファイルツールを使えます。ワークスペースはアカウントごとに 1 つの非公開ワークスペースで、返信はテキストと推論として届きます。エージェントグループの詳細や、Strands 項目をタイトルと思考サマリーのタスクモデルとして使う方法は、インストール済みコーディングエージェントを参照してください。
Work
Work のコンポーザーでは、エンジン コントロールで Libre WebUI または Strands を選び、モデルは別に選択します。Strands を選ぶと、Strands エージェントが各ステップを計画し、要求されたツールを Work が通常の承認ポリシーに従って Work のサンドボックス内で実行します。トランスクリプト、承認、ツールの実行、実行履歴の正本は常に Work が持ちます。Work 内では、Strands エージェントが独自にツールを実行することはありません。
基盤となるプロバイダーモデルはツール呼び出しに対応している必要があります。Work は実行開始前にこれを確認し、ツール対応を示していないモデルを拒否します。
以前のリリースで dsh: モデル接頭辞付きで保存された Work 実行は、Strands の実行として開きます。エンジンの選択と、チャットから引き継いだモデルとの関係については、Work: Strands エンジンを参照してください。
セキュリティモデル
Strands ページとチャットでは、エージェントが使えるツールを意図的に最小限にしています。
read、write、edit: ワークスペース内のファイル用- harness の
todosプラグイン: 複数ステップの作業を計画するため
シェル、Web 取得、メモリ、スキルはいずれも使えず、指示に AGENTS.md ファイルが注入されることもありません。
各セッションには非公開のワークスペースディレクトリがあり、エージェントからは /workspace として見えます。すべてのパスはシンボリックリンクをたどったうえで解決され、そのディレクトリ内に収まっている必要があります。そのため、ワークスペース内のリンクからディスクのほかの場所に到達することはできません。サンドボックスはコマンドの実行を拒否します。
| 項目 | 上限 |
|---|---|
| アカウントあたりのセッション数 | 200 |
| プロンプトの長さ | 32,000 文字 |
| メッセージあたりのエージェントターン | 24 |
| ファイルの読み取りまたは書き込み | 1 回の呼び出しで 2 MB |
| セッションのタイトル | 120 文字 |
ターン数の上限に達すると、その時点で停止し、上限に達したことが表示されます。1 回のターンでプロバイダーへのモデル呼び出しが複数回発生することがあるため、プロバイダーの予算を消費するほかのモデルアクセスと同じように、慎重にアクセス権を付与してください。
ストレージ
Strands のデータは、アプリケーションデータベースではなく <DATA_DIR>/strands/ 以下に保存されます。アカウントごとに専用のディレクトリ <DATA_DIR>/strands/users/<account-hash>/ があり、次のものが入っています。
registry.json: アカウントのセッション一覧sessions/: エージェントがコンテキストとして使う Strands のセッションスナップショットtranscripts/: Strands ページに表示される各セッションのトランスクリプトworkspaces/: 各セッションの非公開ワークスペースchat-workspace/: チャットのターンで使うワークスペース
セッションを残しておきたい場合は、<DATA_DIR>/strands/ をバックアップに含めてください。
使用状況
プロバイダー使用状況(/usage)では、Strands の呼び出しは エージェント セクションの Strands エージェントに集計されます。エージェント使用量を参照してください。
API
/api/strands/access は管理者が必要です。それ以外のすべてのルートには、Strands へのアクセス権を持つ認証済みアカウントが必要です。
| メソッド | パス | 用途 |
|---|---|---|
GET | /api/strands/access | アクセスモードと、LIBRE_STRANDS_ACCESS で固定されているかどうかを読み取る(管理者) |
PUT | /api/strands/access | mode を disabled、admins、all-users のいずれかに設定する(管理者。固定されている場合は 409) |
GET | /api/strands/health | エンジンの可用性と、harness および SDK のバージョン |
GET | /api/strands/models | このアカウントでエンジンが動かせるモデル |
GET | /api/strands/sessions | セッションを一覧表示する |
POST | /api/strands/sessions | セッションを作成する(title と model は任意) |
GET | /api/strands/sessions/:sessionId | セッション、そのトランスクリプト、ターンが実行中かどうかを読み取る |
PATCH | /api/strands/sessions/:sessionId | セッションのタイトルまたはモデルを変更する |
DELETE | /api/strands/sessions/:sessionId | セッションを、トランスクリプトとワークスペースごと削除する |
POST | /api/strands/sessions/:sessionId/messages | { "text": "..." } を送信し、ターンを NDJSON でストリーミングする |
POST | /api/strands/sessions/:sessionId/cancel | 実行中のターンを停止する |
メッセージストリームは 1 行に 1 つの JSON イベントを書き出します。イベントは turn-start、text、reasoning、tool-start、tool-result、done(停止理由と、プロバイダーが報告した場合はトークン使用量を含む)、error です。接続を閉じるとターンはキャンセルされます。ターンの実行中にメッセージを送信すると 409 が返ります。
設定
| 変数 | 既定値 | 用途 |
|---|---|---|
LIBRE_STRANDS_ACCESS | 未設定(管理者の設定、admins) | disabled、admins、all-users のいずれかに固定する。それ以外の値ではエンジンがオフのままロックされる |
トラブルシューティング
Strands エンジンの問題を参照してください。