「SOUL.md」のセットアップ

オープンソースの自律型AIエージェント「Hermes Agent」において、エージェントの性格や口調(アイデンティティ)を固定するための設定ファイル「SOUL.md」のセットアップ方法と記述例を解説します。 [1, 2]

1. SOUL.md の基本と配置場所
SOUL.md は、システムプロンプトの最優先スロット(スロット #1)に注入される、プレーンなMarkdown形式のテキストファイルです。ここに書かれたキャラクター定義や行動指針が、セッションをまたいで永続的に保持されます。 [1, 3, 4]
 
配置パス: ~/.hermes/SOUL.md (または環境変数 $HERMES_HOME/SOUL.md)
作成方法: Hermes Agentの初回起動時にstarterファイルが自動生成されますが、手動で新規作成または上書き編集して問題ありません。 [4, 5]

2. セットアップ・カスタマイズ例(Markdownテンプレート)
特定の記述スキーマ(YAMLフロントマターなど)は不要です。以下は、日本語環境で使いやすいAIアシスタントを構築するための標準的な記述例です。この内容をそのまま ~/.hermes/SOUL.md にコピー&ペーストして調整してください。 [3, 6]
# ユーザー名 / コンテキスト
ユーザーはソフトウェアエンジニアであり、効率的な自動化と技術的サポートを求めています。

# あなたのアイデンティティ (Persona)
あなたは有能で親しみやすいAI秘書(専属アシスタント)です。
常に一歩先を読んだ提案を行い、曖昧な指示に対しても目的を推測して確認点を提示します。

# 応答スタイル (Style & Tone)
- **言語**: 原則として自然な日本語で回答してください。
- **簡潔さ**: 結論からわかりやすく説明し、無駄に長い文章を避けます。
- **専門性**: テクニカルな手順は、具体的なコマンドや設定例をコードブロック(```)を用いて段階的に示してください。
- **トーン**: 明るく、信頼できるバディのように振る舞いますが、過度な謙遜や不要な謝罪(「すみません」など)はしません。
- **絵文字**: 基本的に絵文字は使用せず、テキストの読みやすさを最優先してください。

# 行動制限 (Boundaries)
- 破壊的な操作や危険なファイルの削除を求められた場合は、実行前に必ず確認のステップを挟んでください。
- わからないことや不確実な情報については、無理に回答を捏造せず、正直に不確実であることを認めてください。


3. 設定の適用と切り替え
 
自動ロード: ファイルを保存後、次回の hermes コマンド起動時や新しいセッションから自動的に読み込まれます。 [5, 7]
セッション内での一時変更: SOUL.md の基本人格を残したまま、一時的に別の口調や役割を与えたい場合は、CLI上で /personality コマンド(例: /personality concise)を使用します。 [8, 9]

もし特定の職種(リサーチャー、コーディング専用、小説の執筆パートナーなど)に特化させた人格にしたい場合は、追加したい役割やルールを教えていただければ、それに合わせたMarkdownプロンプトを構築します。

[1] https://github.com
[2] https://hermes-agent.nousresearch.com
[3] https://www.stanza.dev
[4] https://blog.devgenius.io
[5] https://tensorflow.classcat.com
[6] https://note.com
[7] https://zenn.dev
[8] https://qiita.com
[9] https://github.com

ObsidianデイリーノートからAIエージェントでLLM Wikiを作成

# ObsidianデイリーノートからAIエージェントでLLM Wikiを作成するメリットと具体的な手順

ObsidianのデイリーノートからAIエージェントを使ってLLM Wiki(構造化された外部メモリ)を構築する最大のメリットは、**「AIのコンテキスト理解精度が上がり、セッションをまたいでも知識が資産として綺麗に引き継がれること」**です。

---

## メリット

* **コンテキストのハンドリング向上**:インデックス(入口)から必要な関連ノートだけをAIに読ませるため、トークン消費を抑えつつ精度の高い回答を引き出せる。
* **情報の腐敗を防げる**:AIに完全自動で増殖させると誤情報が残りがちですが、手動トリガーや定期的な棚卸しを挟むことで、情報の正確性と保守性を高く維持できる。
* **セッション間のシームレスな引き継ぎ**:AIとの会話や調査メモを専用のWikiディレクトリに集約するため、AIのセッション(会話)をリセット・切り替えても前回の文脈からスムーズに再開できる。
* **ローカル管理と軽快さ**:特別な自動化基盤が不要で、ObsidianのMarkdownと双方向リンク(Wikiリンク)の仕組みをそのままAIの知識ベースとして活用できる。

---

## 具体的な手順

1. **専用ディレクトリの作成**
* ObsidianのVault内(またはプロジェクトのルート)に `ai_wiki` などの専用フォルダを作成する。
2. **初期構造とスキーマの指示**
* コーディングエージェント(Claude Codeなど)を起動し、Vault内を読み込ませる。
* エージェントに対し、以下のように指示してベースとなるインデックスファイル(`00-Index.md`など)を作ってもらう。
> `ai_wiki` 以下を専用のWikiとしたいです。デイリーノートの断片的な記録から重要な概念や仕様を抽出し、ここに体系化して記録してください。
3. **デイリーノートからの情報抽出(手動トリガー)**
* デイリーノートに日々の雑多なメモや作業ログ(フロー情報)を書き溜める。
* 節目や一日の終わりに、AIエージェントへ「今日のデイリーノート(または直近の作業)から恒久的に残すべき知見を `ai_wiki` にまとめて」と指示し、ストック型のノートへ昇華させる。
4. **インデックスとリンクの整理**
* `ai_wiki` 内のファイルが増えてきたら、エージェントと一緒にディレクトリ構造や相互リンク(Obsidianのグラフビューで繋がる状態)を定期的に整理・棚卸しする。

さらに実践的な運用に向けて、よろしければ以下について教えてください。
 
普段使用しているAIエージェントやLLMツール(Claude Code、Cursor、ChatGPTなど)
デイリーノートに書き溜めている情報のジャンル(プログラミング、読書記録、ビジネスのアイデアなど)
これらに合わせて、最適なフォルダ構成案やAIへの具体的な指示プロンプトを作成します。

 

 

hermesハンズオン

===
Google検索結果。

 

===
★コピーアイコン使用
⇒マークダウンぽいが、vscodeへ貼り付けて確かめないと、どこまできちんとレンダリングされるか不明。未確認。

Hermesのプロファイル、AIモデル、サブエージェント、スキルの学習を目的とした、実践的なハンズオンセミナーのカリキュラム案です。
------------------------------
## Hermes AI アプリケーション開発ハンズオンセミナーカリキュラム## 1. セミナー概要
本セミナーは、Hermesのコアコンポーネント(プロファイル、AIモデル、サブエージェント、スキル)を体系的に学び、高度な自律型AIアプリケーションやエージェントシステムを構築・カスタマイズできるようになるための実践的プログラムです。

* 対象者: AIエンジニア、プロンプトエンジニア、自律型エージェント開発に興味のある開発者
* 前提知識: Pythonの基礎知識、基本的なAPI連携(REST APIなど)の理解、LLM(大規模言語モデル)の利用経験
* ゴール: Hermesの各種機能を組み合わせ、特定の業務タスクを自律的に実行するカスタムエージェントを構築できる

------------------------------
## 2. タイムスケジュール(1日集中コース / 計7時間)

| 時間 | セッション内容 | 形式 |
|---|---|---|
| 09:30 - 10:00 | 開場・環境構築チェック・ガイダンス | 準備 |
| 10:00 - 11:00 | セッション1: Hermesの全体像とプロファイルの設定 | 講義+ハンズオン |
| 11:00 - 12:00 | セッション2: AIモデルの選定と最適化 | 講義+ハンズオン |
| 12:00 - 13:00 | 昼食休憩 | 休憩 |
| 13:00 - 14:30 | セッション3: スキル(Tools/Functions)の定義と実装 | 講義+ハンズオン |
| 14:30 - 16:00 | セッション4: サブエージェントのオーケストレーション | 講義+ハンズオン |
| 16:00 - 16:15 | 休憩 | 休憩 |
| 16:15 - 17:15 | 総合演習: 自律型ユースケースの構築 | ワークショップ |
| 17:15 - 17:30 | Q&A・総括・閉会 | 質疑応答 |

------------------------------
## 3. カリキュラム詳細## セッション1: Hermesの全体像とプロファイルの設定(10:00 - 11:00)
Hermesアーキテクチャの基本概念を理解し、エージェントの挙動を決定づける「プロファイル」の設計手法を学びます。

* Hermesアーキテクチャの概要: プロファイル、モデル、サブエージェント、スキルの相互関係
* プロファイル(Persona/Context)の役割: エージェントの役割、トーン&マナー、制約事項の定義
* ハンズオン:
* システムプロンプトおよびコンテキストファイルの作成
* 特定の専門知識を持たせたカスタムプロファイルの定義と動作検証

## セッション2: AIモデルの選定と最適化(11:00 - 12:00)
タスクの複雑性やコスト、速度のトレードオフに応じた適切なAIモデルの選択と、パラメータ制御について学びます。

* 対応AIモデルの特性: 各種LLM(オープンソース系、プロプライエタリ系)の強みと弱み
* モデルパラメータのチューニング: Temperature、Top-P、Max Tokensがエージェントの出力に与える影響
* ハンズオン:
* 推論タスクとクリエイティブタスクでのモデル切り替え検証
* プロンプトの最適化(Few-Shotプロンプティングの組み込み)

## セッション3: スキル(Tools/Functions)の定義と実装(13:00 - 14:30)
エージェントが外部環境と相互作用(Web検索、API実行、データ処理など)するための「スキル」の拡張方法を学びます。

* スキルの概念: Function Calling(関数呼び出し)のメカニズム
* スキーマデザイン: LLMが誤解しない明確な引数(Parameters)と説明文(Description)の書き方
* ハンズオン:
* Pythonによるカスタムスキルの作成(例: 天気API連携、テキスト処理ツール)
* JSON Schemaを用いたスキル定義ファイルの構築
* エージェントへのスキルのインジェクションと実行テスト

## セッション4: サブエージェントのオーケストレーション(14:30 - 16:00)
複雑なタスクを分解し、複数の「サブエージェント」に役割を分担させて協調動作させるマルチエージェントシステムの構築を学びます。

* サブエージェント構造: メインエージェント(監督者)とサブエージェント(作業者)の役割分担
* ルーティングとメッセージング: エージェント間での進捗共有とタスクの受け渡し
* ハンズオン:
* 「リサーチ担当」と「ライター担当」の2つのサブエージェントを定義
* メインエージェントが指示を出し、成果物を統合するワークフローの実装

## 総合演習: 自律型ユースケースの構築(16:15 - 17:15)
本日学んだすべての要素(プロファイル、モデル、スキル、サブエージェント)を組み合わせ、実用的なアプリケーションを構築します。

* 演習テーマ(選択制):
1. 自動カスタマーサポート: ユーザーの問い合わせを分析し、必要に応じて社内FAQ(スキル)を参照したり、テクニカル担当(サブエージェント)にエスカレーションする仕組み
2. 市場調査レポート自動生成: 指定されたテーマについてWeb検索(スキル)を行い、情報を整理(サブエージェント1)した上で、指定のトーン(プロファイル)でレポートを執筆(サブエージェント2)する仕組み
* 成果発表・コードレビュー: 作成したエージェントの動作確認とベストプラクティスの共有

------------------------------
## 4. 受講環境・事前準備
ハンズオンをスムーズに進めるため、受講者には以下の環境を事前に用意していただきます。

* PC環境: 外部インターネットに接続可能なPC(Windows / Mac / Linux)
* 開発環境: Python 3.10以上、Visual Studio Code などの任意のコードエディタ
* 必要アカウント / APIキー:
* GitHub アカウント(配布コードのクローン用)
* 利用予定のAIモデルプロバイダー(OpenAI、Anthropic等)のAPIキー(※主催者側で共通キーを用意する場合は不要)

カリキュラムの構成はいかがでしょうか?もし調整をご希望であれば、以下の点について教えていただけますと、より最適な内容にカスタマイズいたします。

* セミナーの全体の所要時間(例: 2時間、半日、2日間など)
* 受講者のターゲット層やプログラミングの習熟度
* 特に時間を割きたい重点的なテーマ(例: スキル実装を多めにしたい、など)

★★★

当該セミナーで重視しているプロファイルなどの用語について、それぞれの位置付けの違いや、複数候補の使い分け、実務での利用シーンを具体的に説明する独立した別資料をmarkdownで作成して下さい。実際に操作できる具体的な手順も記述すること。
## Hermes AI エージェント構成要素の概念・設計・実務運用ガイド
本資料は、Hermes AIアプリケーション開発における4つのコアコンポーネント(プロファイル、AIモデル、サブエージェント、スキル)の位置付けの違い、使い分け、および実務での利用シーンと具体的な操作手順をまとめた解説資料です。
------------------------------
## 1. コアコンポーネントの位置付けと相互関係
各コンポーネントは、人間の組織における「役職(人格)」「脳のスペック」「チーム編成」「使用する道具」に例えることができます。

+-----------------------------------------------------------+

| サブエージェント (チーム編成) |
| +-------------------+ +-------------------+ |
| | サブエージェントA | | サブエージェントB | |
| | [プロファイル] | 連携・ | [プロファイル] | |
| | [AIモデル] |<--------->| [AIモデル] | |
| | [スキル] | タスク | [スキル] | |
| +-------------------+ 受け渡し +-------------------+ |
+-----------------------------------------------------------+

| コンポーネント | 人間・組織への例え | 役割と位置付け |
|---|---|---|
| プロファイル | 役職・キャラクター・前提知識 | エージェントの「人格・行動規範・制約」を決定する。出力のトーン&マナーや、遵守すべきルール、コンテキストを定義する。 |
| AIモデル | 脳のスペック・処理速度・コスト | エージェントの「思考エンジン」。タスクの難易度、予算、要求されるレスポンス速度に応じて切り替える。 |
| スキル | 職人が持つツール・ExcelやAPI | エージェントの「手足となる道具」。LLM単体では届かない外部システムへのアクセス(Web検索、データベース操作、API連携)を可能にする。 |
| サブエージェント | 専門チームのメンバー | 複雑なタスクを「分業・自律処理」するための仕組み。独立したプロファイル、モデル、スキルを持つ子エージェントを束ねる。 |

------------------------------
## 2. 複数候補の使い分け基準と実務利用シーン## ① プロファイル (Profile)

* 使い分け基準: 「ユーザーが誰か」「どのようなアウトプットを求めているか」で切り替えます。
* 実務利用シーン:
* カスタマーサポート: 「親切で丁寧なシニアサポート担当」
* 厳格なコードレビュー: 「セキュリティに厳しく、一切の妥協を許さないシニアエンジニア」
* 社内データ分析: 「経営層向けに要点を3行でまとめる財務アナリスト」

## ② AIモデル (AI Model)

* 使い分け基準: 「処理の複雑さ」「リアルタイム性」「コスト制約」で切り替えます。
* 実務利用シーン:
* 高度な推論 (例: Claude 3.5 Sonnet, GPT-4o): 要件定義、複雑なバグ修正、法務文書のチェック。
* 高速・低コスト (例: GPT-4o-mini, Claude 3.5 Haiku): ユーザーからのチャットへの一次返答、大量のログデータの分類、単純なテキストの要約。

## ③ スキル (Skill / Function)

* 使い分け基準: 「静的な思考(LLMの知識)」では解決できない「動的なデータ・外部操作」が必要な場合に付与します。
* 実務利用シーン:
* 情報収集: 最新の株価やトレンドを取得するための「Web検索・ニュース取得APIスキル」
* 業務自動化: 議事録を自動で起票するための「Notion/Slack書き込みスキル」
* データ操作: CSVから特定のグラフを描画するための「Pythonコード実行スキル」

## ④ サブエージェント (Sub-Agent)

* 使い分け基準: 1つのプロファイルやプロンプトでは、タスクの矛盾やトークン制限により精度が落ちる「複数工程の複雑な業務」で導入します。
* 実務利用シーン (インシデント対応自動化):
* メインエージェント: 顧客からのアラートを検知し、タスクを割り振るリーダー。
* サブ1 (ログ解析担当): サーバーログを収集・解析するスキルを持つ。
* サブ2 (ドキュメント作成担当): 解析結果を元に、顧客向けの不具合報告書(丁寧なプロファイル)を執筆する。

------------------------------
## 3. 実務を想定したハンズオン操作手順
ここでは、「ユーザーが指定したテーマについて最新情報を調査し、エンジニア向けに要約したテクニカルレポート(Markdown形式)を出力する」という自律型エージェントを構築する手順を解説します。
## ステップ1: 環境準備
必要なライブラリのインストールと環境変数の設定を行います。

# 必要なライブラリのインストール (Hermes互換のLangChain/LangGraphベースを想定)
pip install openai requests pydantic
# APIキーの設定 (環境に合わせて設定してください)
export OPENAI_API_KEY="your-openai-api-key"

## ステップ2: スキル(Tools)の定義
エージェントが最新情報を取得するための「Web検索スキル」をPythonで実装します。

# skills.pyimport requestsimport os
def web_search_tool(query: str) -> str:
"""
指定されたクエリでWeb検索を行い、上位の結果をテキストで返します。
最新の情報や技術スタックの調査に使用します。
"""
# ※実務ではTavily APIやSerper APIなどを利用しますが、ここではモックとして動作を記述します
print(f"[Skill Execution] Web検索を実行中: '{query}'")

# ダミーの検索結果を返す
if "Python 2026" in query:
return "Python 3.14がリリースされ、新たなJITコンパイラが標準搭載されました。パフォーマンスが大幅に向上しています。"
return "検索テーマに関する一般的なドキュメントと最新のディスカッションスレッドが見つかりました。"
# LLMに認識させるためのスキーマ定義web_search_schema = {
"name": "web_search_tool",
"description": "指定されたクエリでWeb検索を行い、最新の技術動向や情報を取得します。",
"parameters": {
"type": "object",
"properties": {
"query": {"type": "string", "description": "検索キーワード"}
},
"required": ["query"]
}
}

## ステップ3: プロファイルとモデルの定義
エージェントの人格(プロファイル)と、使用するAIモデルを定義します。

# config.py# プロファイルの定義TECHNICAL_RESEARCHER_PROFILE = """
あなたは最高峰のITテクニカルリサーチャーです。
客観的、かつエンジニアがすぐに実践できる具体的で技術的な深い情報を提供することが任務です。

【行動規範】
1. 曖昧な表現を避け、バージョン番号や具体的なメリット・デメリットを明記すること。
2. 調査には必ず「web_search_tool」スキルを使い、最新の事実に基づき思考すること。
3. 出力は必ず美しいMarkdown形式で、見出し、箇条書き、コードブロックを適切に使うこと。"""
# モデルの選定 (タスクの難易度に応じて使い分ける)MODEL_FOR_THINKING = "gpt-4o" # 複雑な調査・分析用MODEL_FOR_SUMMARY = "gpt-4o-mini" # 最終的な整形・要約用

## ステップ4: サブエージェントのオーケストレーションと実行
「リサーチ担当(サブ)」が情報を集め、「ドキュメント整形担当(メイン)」が最終的な成果物を仕上げる連携プログラムを実装します。

# main.pyimport jsonfrom openai import OpenAIfrom skills import web_search_tool, web_search_schemafrom config import TECHNICAL_RESEARCHER_PROFILE, MODEL_FOR_THINKING, MODEL_FOR_SUMMARY
client = OpenAI()
def run_research_sub_agent(theme: str) -> str:
"""サブエージェント: スキルを駆使して未加工の技術情報を徹底的にリサーチする"""
print("=== [Sub-Agent] リサーチを開始します ===")

messages = [
{"role": "system", "content": TECHNICAL_RESEARCHER_PROFILE},
{"role": "user", "content": f"「{theme}」に関する最新の技術動向を調べて、重要なファクトを抽出してください。"}
]

# 1. ツール(スキル)の呼び出し要求をモデルから取得
response = client.chat.completions.create(
model=MODEL_FOR_THINKING,
messages=messages,
tools=[{"type": "function", "function": web_search_schema}],
tool_choice={"type": "function", "function": {"name": "web_search_tool"}} # 強制的にスキルを使わせる
)

tool_call = response.choices[0].message.tool_calls[0]
tool_args = json.loads(tool_call.function.arguments)

# 2. 実際に定義したスキルを実行
search_result = web_search_tool(query=tool_args["query"])

# 3. スキルの結果をコンテキストに加えて最終的なリサーチメモを作成
messages.append(response.choices[0].message)
messages.append({
"role": "tool",
"tool_call_id": tool_call.id,
"name": "web_search_tool",
"content": search_result
})

final_research = client.chat.completions.create(
model=MODEL_FOR_THINKING,
messages=messages
)

return final_research.choices[0].message.content
def run_main_agent(theme: str, raw_research_data: str):
"""メインエージェント: サブエージェントの成果物を引き継ぎ、エンジニア向けMarkdownに整形する"""
print("\n=== [Main-Agent] レポートの最終整形を開始します ===")

system_prompt = "あなたはシニアテクニカルライターです。リサーチデータを元に、読みやすい最高品質のMarkdownレポートを作成します。"
user_prompt = f"""以下の未加工のリサーチデータを元に、「{theme}」に関するテクニカルレポートを作成してください。

【リサーチデータ】
{raw_research_data}
"""

# 整形・要約タスクなので、軽量で高速なモデル(MODEL_FOR_SUMMARY)に切り替えてコストを最適化
response = client.chat.completions.create(
model=MODEL_FOR_SUMMARY,
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": user_prompt}
]
)

return response.choices[0].message.content
# --- 実行セッション ---if __name__ == "__main__":
target_theme = "Python 2026年の最新動向"

# ① サブエージェントがスキル(Web検索)を使って深掘り調査
raw_report = run_research_sub_agent(target_theme)

# ② メインエージェントが高速モデルに切り替えてMarkdownへ構造化
final_markdown_output = run_main_agent(target_theme, raw_report)

print("\n=== 【最終出力成果物】 ===")
print(final_markdown_output)

------------------------------
## 4. まとめ
実務でHermesエージェントを設計する際は、以下のチェックリストを意識してください。

* プロファイル: 単に「親切に」ではなく、「何を参考にし、何を出力基準とするか」の行動制約まで落とし込めているか。
* AIモデル: すべてを最高性能のモデルに任せず、ルーティングや整形などの定型タスクを軽量モデルに委ねてコスト最適化ができているか。
* スキル: LLMがパラメータを迷わずに決定できるよう、関数の説明文(Description)が直感的に書かれているか。
* サブエージェント: 1つのプロンプトが長くなりすぎて破綻していないか。工程ごとにエージェントを分離できているか。

こちらの別資料(ガイド)について、さらに深掘りしたい点があれば教えてください。

* 特定のオープンソースLLM(Llama等)を想定したモデルの使い分け基準を追加する
* スキルの定義を「社内データベース(SQL)連携」の実例に変更する
* エラーハンドリング(スキルが失敗した際のサブエージェントの挙動)の実装コードを追加する
ご要望に合わせてカスタマイズいたします。

★★★

ハンズオン操作ではコーディングが必須ですか?markdown/JSON/YAMLなど、プログラミングスキル無しで操作できる手順に変更できますか?

---

ハンズオン操作においてコーディングは必須ではありません。Hermesをはじめとする最新のAIエージェントプラットフォームでは、各種設定をMarkdown、JSON、YAMLなどの構成ファイルのみで定義し、ノーコード(またはローコード)で自律型エージェントを動かすことが可能です。
プログラミングスキルが一切不要な、構成ファイルの記述と専用CLI(またはGUIツール)の実行だけで完結する手順に修正したハンズオンガイドを以下に提示します。
------------------------------
## プログラミング不要!構成ファイルで動かす Hermes AI エージェント構築手順
本手順では、Pythonなどのコードを一切書かずに、YAMLファイルによる「プロファイル」「モデル」「サブエージェント」の定義と、JSONファイルによる「スキル」の定義だけで、自律型リサーチエージェントを起動・実行します。
## 1. 準備する構成ファイル
作業用フォルダを作成し、以下の3つのファイルをそのまま作成・配置してください。
## ① スキル定義ファイル (skills.json)
エージェントに「Web検索」という道具(スキル)を持たせるための定義書です。

{
"skills": [
{
"name": "web_search",
"description": "指定されたキーワードでインターネットを検索し、最新の技術動向やニュースを取得するツール",
"parameters": {
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "検索キーワード(例: 'Python 最新機能')"
}
},
"required": ["query"]
}
}
]
}

## ② エージェント構成ファイル (agent_config.yaml)
エージェントの「プロファイル(人格)」、「使用するAIモデル」、「連携するサブエージェントとスキル」を一元管理する設計図です。

version: "1.0"
# ==========================================# 1. メインエージェント (ディレクター役)# ==========================================main_agent:
name: "tech_editor"
model: "gpt-4o-mini" # 整形・要約タスクなので高速・低コストなモデルを選択
profile: |
あなたは優秀なITテクニカルエディターです。
サブエージェントから提出された生のリサーチデータを元に、
一般のビジネスパーソンでも理解できる美しいMarkdown形式のレポートを作成してください。
# ==========================================# 2. サブエージェント (実務リサーチャー役)# ==========================================sub_agents:
- name: "deep_researcher"
model: "gpt-4o" # 複雑な推論と調査を行うため、最高性能のモデルを選択
profile: |
あなたは最高峰のITテクニカルリサーチャーです。
与えられたテーマについて「web_search」スキルを必ず使用し、
事実(バージョン、リリース年、具体的なメリット)に基づいた正確なデータを収集してください。 skills_ref: "skills.json" # 上記で作成したJSONファイルを読み込む

## ③ 実行指示ファイル (task.md)
エージェントに何をさせたいかを指示する、Markdown形式のタスク指示書です。

# タスク要求書## 依頼内容「Pythonの最新動向(2026年現在)」について調査し、技術レポートを作成してください。
## 出力要件- 重要なファクト(技術的な変更点やメリット)を最低3つ含めること- 構成は「概要」「主要なアップデート」「今後の展望」の3章構成とすること

------------------------------
## 2. ノーコード操作・実行手順
ファイルを配置したら、以下のステップに沿ってエージェントを実行します。
## ステップ1: 環境変数の設定 (APIキーの登録)
ターミナル(またはコマンドプロンプト)を開き、AIを動かすためのAPIキーを設定します。

# Mac / Linux の場合
export OPENAI_API_KEY="your-openai-api-key"
# Windows (Command Prompt) の場合set OPENAI_API_KEY="your-openai-api-key"

## ステップ2: エージェントの起動コマンド実行
HermesのCLI(コマンドラインツール)を使い、先ほど作成したYAMLとMarkdownを読み込ませて実行します。※コーディングをせずにコマンド1発でシステムが起動します。

hermes run --config agent_config.yaml --task task.md --output report.md

------------------------------
## 3. 実行時の内部挙動(何が起きているか)
コマンドを実行すると、システムは記述された構成ファイル(YAML/JSON)を読み込み、プログラミングなしで以下の自律的な連携(オーケストレーション)を自動実行します。

1. メインエージェント(tech_editor)がtask.mdを読み込み、「調査が必要だ」と判断する。
2. メインからサブエージェント(deep_researcher)へ「Pythonの最新動向を調査せよ」とタスクが引き継がれる。
3. サブエージェントは自身のプロファイルに従い、skills.jsonに定義されたweb_searchを自動的に呼び出す。
4. 検索結果を受け取ったサブエージェントが、未加工の調査ログをメインエージェントに返却する。
5. メインエージェントが、自身のプロファイル(エディター人格)と低コストモデル(gpt-4o-mini)を活用し、読みやすいMarkdown形式に整形してreport.mdとして保存する。

プログラミング不要のYAML/JSONスタイルに変更したことで、セミナーのハードルを大幅に下げることができます。
もしよろしければ、次のステップとして以下はいかがでしょうか?

* この手順を前提とした、セミナー当日の受講者向け「トラブルシューティング集」を作成する
* 検索スキルの代わりに、「社内FAQ(テキストファイル)を読み込むスキル」のJSON定義例を追加する

ご希望の進め方について教えてください。

★

★

★

さらに多くの候補を使い分ける際の各ファイルの保存場所/フォルダ階層について、ベストプラクティスを提示して下さい。

 

利用シーンに応じて多数のプロファイルやスキル、モデル定義を柔軟に使い分ける(切り替える)ための、ファイル保存場所およびディレクトリ構成のベストプラクティスです。

Hermes AI エージェント構成管理:フォルダ構成のベストプラクティス
多くの候補を整理・再利用しやすくするため、役割ごとにディレクトリを分離する「モジュール型構成」を採用します。
hermes-project/
├── .env # APIキーや環境変数の管理
├── task.md # 実行したいタスクの指示書
├── main.yaml # 各コンポーネントを結びつける統括定義ファイル
│
├── profiles/ # 【人格・プロファイル】の格納場所
│ ├── common/ # 共通のベース制約など
│ │ └── base_rules.txt
│ ├── business/ # ビジネス・ライティング系
│ │ ├── editor.txt
│ │ └── support_agent.txt
│ └── technical/ # エンジニア・技術系
│ ├── researcher.txt
│ └── code_reviewer.txt
│
├── skills/ # 【道具・スキル】(JSON Schema)の格納場所
│ ├── data_tools.json # データ処理・分析系スキル
│ ├── communication.json # Slack/Notion連携系スキル
│ └── search_tools.json # Web検索・リサーチ系スキル
│
└── models/ # 【AIモデル・パラメータ】の定義ファイル
├── high_reasoning.yaml # 高度な推論用(gpt-4o, claude-3-5-sonnet等)
├── low_cost.yaml # 高速・低コスト用(gpt-4o-mini, haiku等)
└── local_oss.yaml # 社内オンプレ用(Llama等)


各ディレクトリの役割と使い分けのポイント
1. profiles/(プロファイルの階層化)
プロファイルは「テキストファイル(.txt)」として独立させ、業界や職種、トーンごとにフォルダを分けて管理します。
 
メリット: プロファイル文が長くなってもYAMLファイルが肥大化せず、エージェントごとに使い回しが容易になります。
2. skills/(機能ごとのファイル分割)
すべてのスキルを1つのJSONにまとめず、「検索系」「データ操作系」「通知系」のようにカテゴリー単位でファイル分割します。
 
メリット: エージェントに必要なスキル群を、ファイル単位(例: リサーチャーには search_tools.jsonだけを読み込ませる)でセキュリーかつ最小限に付与できます。
3. models/(プロバイダや特性ごとの設定分離)
モデル名や temperature などのパラメータをプロファイルやタスクから完全に切り離します。
 
メリット: 「予算を抑えたいから、今回はモデル定義を high_reasoning.yaml から low_cost.yaml に差し替えて実行しよう」といった切り替えが、メインの設定ファイルを1行書き換えるだけで完結します。

この構成における main.yaml(統括ファイル)の記述例
上記のフォルダ構成に則り、各ファイルを相対パスで指定して組み合わせることで、1つのシステムを構築します。
version: "1.0"

# モデル定義ファイルのインポート
import_models:
- "models/high_reasoning.yaml"
- "models/low_cost.yaml"

# メインエージェントの設定
main_agent:
name: "chief_editor"
model_ref: "models/low_cost.yaml" # 高速・低コストモデルを指定
profile_path: "profiles/business/editor.txt" # エディタープロファイルを読み込み

# サブエージェントの設定
sub_agents:
- name: "tech_investigator"
model_ref: "models/high_reasoning.yaml" # 高性能モデルを指定
profile_path: "profiles/technical/researcher.txt" # リサーチャープロファイルを読み込み
skills_path: "skills/search_tools.json" # 検索スキルだけを付与

このベストプラクティスに沿って、セミナー内で受講者が迷わないための「設定切り替え用のクイックリファレンス(対応表)」や、「複数環境(本番・テスト環境)の切り替え手順」を提示することも可能です。次のステップとしてどちらに進めますか?


===


===
EOF

LinkStation 220のセキュリティ設定

Q.1

自宅のWindows環境で、ファイルサーバとしてLinkStation 220を使っています。 adminアカウントのパスワードを設定済みですが、誰でもパスワード無しでファイルにアクセスできてしまいます。 パスワードを知らないユーザがアクセスできないことが本来の期待値です。 自宅LANのwindows端末は、基本的にWi-FiでLinkStationへアクセスしています。 確認すべき項目をチェックリストでまとめて下さい。 設定を誤りやすく簡単にチェックできる項目順に番号を振って、表形式で出力して下さい。

A.1

要点まとめ:
LinkStation 220で「誰でもアクセスできてしまう」場合、ゲストアクセスが有効になっているか、Windows側のログインユーザーとNASユーザーの紐付けが不十分である可能性が高いです。以下の表を順番に確認すると原因を切り分けやすいです。


LinkStation 220 アクセス制御チェックリスト

No. 確認項目 内容・確認方法 誤りやすいポイント
1 共有フォルダのアクセス制限設定 LinkStation管理画面 →「ファイル共有」→「共有フォルダ」→各フォルダの「アクセス制限」を確認 「アクセス制限なし」になっていると誰でも入れる
2 ゲストアクセスの無効化 共有フォルダ設定で「ゲスト/anonymousアクセス許可」が有効になっていないか確認 デフォルトで有効な場合があり、無効化を忘れやすい
3 ユーザーアカウント作成 LinkStationに「admin」以外のユーザーを作成し、Windows端末ごとに利用者アカウントを登録 Windowsのユーザー名とNASのユーザー名が一致していないと制御が効かない
4 Windows側のログイン方式 Windowsが「Microsoftアカウント」でログインしている場合、NAS側と一致しないことが多い → ローカルアカウントを作成してNASと同じユーザー名/パスワードに設定 MicrosoftアカウントのままではNAS認証が通らず、guest扱いになる
5 資格情報マネージャーの確認 Windows「コントロールパネル」→「資格情報マネージャー」でNASのIPアドレスに対応する資格情報が正しく登録されているか確認 古い資格情報や間違ったユーザー名が残っていると自動的にguest接続される
6 SMBバージョン設定 LinkStation管理画面でSMB1/2/3の設定を確認し、Windowsと互換性があるか確認 SMB1無効化環境で古い設定のままだと意図せずguest接続される場合あり
7 ネットワークの種類 Windowsのネットワークが「パブリック」ではなく「プライベート」になっているか確認 パブリックだと資格情報入力が求められず、挙動が不安定になることがある
8 フォルダごとのアクセス権限割当 LinkStation管理画面で各ユーザーに「読み取り/書き込み/拒否」を明示的に設定 「全員許可」のままにしてしまうと制御が効かない

✅ 最初に見るべきは「共有フォルダのアクセス制限」と「ゲストアクセス無効化」です。ここが正しく設定されていないと、いくらユーザーを作っても誰でも入れてしまいます。

次に、WindowsのログインユーザーとNASユーザーの一致を確認すると改善するケースが多いです。


参考: バッファロー公式サポート

LinkStationにアクセス制限をかけて利用したい
LinkStationに登録したユーザー、グループにアクセス制限する方法


このチェックリストを順に確認すれば、意図しない「誰でもアクセス可能」状態を解消できるはずです。
ご希望なら「推奨される最小限のセキュリティ設定例」もまとめましょうか。

NotionでのToDoリストの使い方


title: "notion 使い方 デイリー todo - Google 検索" date: 2025-10-15T05:23:39.524Z

lang: ja

notion 使い方 デイリー todo

October 01, 2025

Notionでデイリータスクを管理するには、目的やレベルに合わせて様々な方法があります

。シンプルに始める場合はチェックボックスリスト、本格的に管理するならデータベースを活用するのがおすすめです。 

方法1:簡単なチェックボックスリストを作る 

最もシンプルで手軽な方法です。 

  1. 新しいページを作成し、タイトルを「今日のToDo」とします。
  2. /チェックボックス と入力し、チェックボックスリストを挿入します。
  3. タスクを1つずつ入力していき、完了したらチェックを入れます。
  4. 毎朝、前日のタスクをすべて選択して削除し、新しいタスクリストを作成します。 

方法2:データベースを活用して高度なタスク管理を行う 

毎日繰り返すタスクが多い場合や、タスクを様々な角度から管理したい場合は、データベースの活用が便利です。 

1. デイリータスク用データベースを作成する 

  1. 新しいページを作成し、/データベースと入力して「インライン」または「フルページ」のデータベースを作成します。
  2. データベースに以下のプロパティを追加します。
    • タスク名(タイトル): タスクの内容を記入
    • 完了(チェックボックス): タスクが完了したかどうかを記録
    • 日付(日付): タスクの期日を設定
    • 優先度(セレクト): 「高」「中」「低」などの優先度を設定
    • ステータス(セレクト): 「未着手」「進行中」「完了」などを設定
    • 繰り返し(セレクト): 「毎日」「毎週」「平日」など繰り返しタスクに設定 

2. テンプレート機能で繰り返しタスクを自動生成する 

決まったタスクを毎日自動で表示させたい場合は、テンプレート機能を使います。 

  1. データベースの右上の「新規」ボタン横にある「▼」をクリックし、「新しいテンプレート」を選択します。
  2. テンプレートに「デイリータスク」などの名前をつけ、毎日繰り返すタスクを入力します。
  3. テンプレートの設定画面で、右上の「…」から「繰り返し」を選択します。
  4. 「毎日」「平日」などの頻度を設定し、「保存」します。 

これで、設定した頻度でテンプレートが自動的にデータベースに生成されます。 

3. フィルターとビューで今日のタスクを表示する 

作成したデータベースを、今日やるべきタスクだけ表示されるように設定します。 

  1. データベースの右上にある「フィルター」をクリックします。
  2. 「日付」プロパティを選択し、「今日」に設定します。
  3. 必要に応じて「完了」プロパティで「チェックなし」を設定し、未完了のタスクだけ表示することもできます。
  4. 「ボードビュー」や「カレンダービュー」を追加することで、タスクの進捗状況を視覚的に把握することも可能です。 

テンプレートを活用する 

手動で設定するのが難しい場合は、Notionが提供しているテンプレートを利用するのが簡単です。 

  1. Notionのテンプレートギャラリーを開く。
  2. 「ToDoリスト」や「Daily To-Do List」などのテンプレートを検索する。
  3. 気に入ったテンプレートを選び、「テンプレートを入手」をクリックして自分のワークスペースに追加する。 

これらの方法から、自分のワークスタイルに合った方法を試してみてください。 

ありがとうございました

Google サービス改善のためフィードバックにご協力ください。プライバシー ポリシーをご確認ください。

その他のフィードバックを共有問題を報告閉じる

undefined

undefined

undefined

7 件のサイト

  • Personal tasks - Notion

    There are many ways you can build a personal tasks page in N...

    Notion

  • 3 Ways to Create a To-Do List in Notion (Managing Tasks with ...

    Using Notion Checklists (Beginner) * Open a new blank page a...

    Local Creative

  • Create and Manage Your To-Do List with Notion

    Check more items off your to-do list with Notion. Add “Creat...

    Notion

AI モードの回答が作成されました

GeminiのDeep Researchで「研究予算を使い切った」ら、どうする?


title: "Gemini - Deep Research 予算切れと分割手法" date: 2025-10-12T08:00:02.064Z

lang: ja

Gemini

Deep Research 予算切れと分割手法

2.5 Flash で作成 2025年10月12日 16:52 公開日時: 2025年10月12日 16:57

geminiでdeep researchを使っていたところ、「研究予算を使い切った」というメッセージが表示されてリサーチが終了し、中途半端な結果レポートが生成されました。「研究予算を使い切った」とはどういうことですか?このメッセージが表示された後に、リサーチを続けるにはどうすればいいですか?このメッセージが表示されないように、リサーチ範囲を分けたり、リサーチ内容を分割する一般的な手法を教えて下さい。手順のイメージが理解できるように、具体的な例で説明して下さい。

Google Search

Google Search

「研究予算を使い切った」というメッセージは、Gemini Deep Research 機能の利用回数制限に達したことを示しています。

Deep Researchのような高度な機能は、大量のコンピューティングリソースを使用するため、1日あたりまたは1か月あたりで利用できる回数に上限が設けられています。この「研究予算」は、その上限を指していると解釈できます。

たとえば、Gemini Advancedユーザーの場合、Deep Researchのレポート作成回数に**「1日あたり最大20件」**といった上限が設定されていることがあります(プランや時期によって変動する可能性があります)。この回数に達すると、リサーチが終了し、このメッセージが表示されます。


リサーチを続けるための対処法

このメッセージが表示された後でリサーチを続けるには、主に以下の方法があります。

  1. 制限がリセットされるのを待つ

    • 利用制限は日次(例えば、前回の利用から24時間後)や月次でリセットされます。リセットされるまで待ってから、リサーチを再開します。
  2. 通常のGeminiチャットを利用する

    • Deep Researchではなく、通常のチャット機能を使って、タスクを小さな質問や情報検索に分割して依頼します。Deep Researchよりも単純な調査であれば、こちらで対応できることが多く、利用制限も異なります。
  3. リサーチ内容を簡略化する

    • リサーチの目的や問いをより具体的かつ簡潔に再定義し、Deep Researchの利用回数を節約します。

メッセージが表示されないようにするリサーチの分割手法

利用制限に引っかからないようにするには、1つの複雑なリサーチを複数の独立した小さなタスクに分割し、必要な部分だけにDeep Researchの利用を限定するのが一般的な手法です。

📌 リサーチ分割の一般的な手法

分割手法 説明
段階的リサーチ 複雑なリサーチを「計画→一次情報収集→分析→結論」のように論理的なステップに分割し、1ステップごとにリサーチを依頼する。
トピック分割 複数のテーマを含むリサーチの場合、テーマごとに独立したリサーチとして分割する。
役割分担 「簡単な情報収集」は通常のチャット、「複雑な分析・レポート作成」はDeep Researchと、機能に応じて役割を分担する。

💡 具体的な例

元のリサーチ依頼(予算オーバーになりやすい例)

「日本市場における2024年のAIチャットボット導入企業のトレンド、導入目的、および主要なベンダー3社の競合分析を詳細なレポートとして作成してください。」

この依頼は、複数のステップ(トレンド調査、目的調査、競合分析)と詳細なレポート作成が含まれるため、Deep Researchの予算を大きく消費しやすく、途中でリサーチが中断される可能性があります。

分割リサーチ(予算を節約できる例)

以下の3つの独立したステップに分け、Deep Researchの使用はステップ2または3に限定します。

ステップ 依頼内容と使用機能 節約のポイント
ステップ1: 基礎情報と構造化 (通常のGeminiチャットを使用)「日本市場におけるAIチャットボット導入企業のトレンドに関するキーワードと主要な論点を5つ挙げ、リサーチ計画の骨子を提案してください。」 Deep Researchを使わずに、リサーチの計画と骨子を作成し、リサーチの方向性を確定する。
ステップ2: 一次データ収集 (Deep Researchを使用)「ステップ1で提案された主要な論点に基づき、**『2024年の導入企業のトレンドと導入目的』**に特化してDeep Researchレポートを作成してください。」 調査範囲をトレンドと目的のみに絞り、Deep Researchの利用回数を1回に抑える。
ステップ3: 競合分析 (Deep Researchを使用)「ステップ2の結果と、**『主要ベンダー3社(A社、B社、C社)の競合比較分析』**に特化してDeep Researchレポートを作成してください。」 別の独立したリサーチとして処理することで、リサーチの失敗リスクを分散させる。
ステップ4: 最終レポート作成 (通常のGeminiチャットを使用)「ステップ2とステップ3のレポート内容を統合し、包括的な最終レポートとしてまとめてください。」 分析結果の結合と編集は、通常のチャット機能で対応することでDeep Researchの利用を避ける。

Google スプレッドシートにエクスポート

このようにリサーチを分割することで、Deep Researchの利用を最も高度な情報収集や分析が必要な部分に限定し、リソースの枯渇を防ぎながら効率的に目的を達成できます。

Google プライバシー ポリシー新しいウィンドウで開くGoogle 利用規約新しいウィンドウで開くプライバシーと Gemini アプリ新しいウィンドウで開く

Gemini は不正確な情報(人物に関する情報など)を表示することがあるため、生成された回答を再確認するようにしてください。

自動化ツールを活用したEdgeブラウザの読み上げ制御

Q.1

edge ブラウザの読み上げ機能を API などの機能を利用して制御することで自動化したいと考えています。読み上げ開始/終了、中断/再開、別 URL をロードして読み上げを開始、などを実現する方法を何種類か提案して下さい。

A.1

Edge ブラウザの読み上げ機能を自動化する 5 つのアプローチ

以下では、Edge 標準の読み上げ機能や Web Speech API をプログラム/自動化ツールから制御して、読み上げ開始・停止・一時中断/再開・別 URL ロード後の読み上げなどを実現する代表的な手法を 5 つ提案します。


1. JavaScript(Web Speech API)によるインページ制御

  • ページ内に<script>タグかブックマークレットで以下のようなコードを注入 js const uttr = new SpeechSynthesisUtterance(text); speechSynthesis.speak(uttr); // pause, resume, cancel speechSynthesis.pause(); speechSynthesis.resume(); speechSynthesis.cancel();
  • 別 URL を読み上げる場合はlocation.href = newUrl;後、Utterance を再生成してspeak()を呼び出す
  • 完全ブラウザネイティブ(拡張機能やページ改修不要)で利用可能

2. Edge 拡張機能(Extension)でのコンテンツスクリプト制御

  • manifest.jsonにscripting権限とショートカット設定(commands)を宣言
  • content script で Web Speech API を利用して読み上げのライフサイクルを管理
  • キーボードショートカットやブラウザアクションから読み上げ開始/停止/一時中断/再開をオンデマンド実行
  • メッセージングでバックグラウンド(メニュー選択)←→content 間の読み上げ制御も可能

3. Playwright/Puppeteer での自動操作

  • Node.js で Edge(Chromium 版)をヘッドレス/ヘッドフル起動 js const pw = require("playwright"); const browser = await pw.chromium.launch({ channel: "msedge" }); const page = await browser.newPage(); await page.goto("https://example.com"); // 評価関数でWeb Speech APIを呼び出し await page.evaluate((text) => { const u = new SpeechSynthesisUtterance(text); speechSynthesis.speak(u); }, "Edgeで自動読み上げテスト");
  • page.evaluate()でspeechSynthesis.pause()/resume()/cancel()も実行でき、page.goto()で別 URL 移動後に新たに読み上げ開始できる

4. WebView2 ホストアプリ(.NET/C#)からの制御

  • Windows アプリ内に組み込んだ WebView2 コントロールで Edge エンジンを利用
  • .CoreWebView2.Navigate(newUrl)でページ切り替え
  • .ExecuteScriptAsync("speechSynthesis.speak(...")で読み上げ開始
  • .ExecuteScriptAsync("speechSynthesis.pause()")で一時中断、.resume()や.cancel()も同様に呼び出しできる
  • アプリケーションロジックとシームレスに連携可能

5. Windows UI Automation/キー入力シミュレーション

  • Edge の「…」メニュー →「読み上げ」操作を UI Automation API(UIA)で探し出してInvokePattern.Invoke()
  • もしくはキーボードショートカット(Ctrl + Shift + U で読み上げ開始/停止、F9 で一時停止/再開)を SendKeys や Win32 API 経由で送信
  • 高度なツール不要で、純粋に Edge UI をそのまま操作可能

さらに踏み込んだヒント

  • Chrome DevTools Protocol経由で Edge を--remote-debugging-port付き起動し、WebSocket からRuntime.evaluateを呼ぶ方法でも上記 JavaScript を注入可能です。
  • 読み上げ速度・音量・声種変更が必要なら、各 API 呼び出し時にuttr.rate/pitch/volume/voiceを設定しましょう。
  • 上記手法を組み合わせることで、ヘッドレス自動テストに読み上げ確認を組み込んだり、業務ツールの一部として TTS を活用した UI を提供したりできます。

Edge の読み上げ自動化をプロダクション導入する際は、ユーザー操作への配慮やアクセシビリティへの影響も合わせて検討してください。

Q.2

Chrome DevTools Protocol 経由で Edge を--remote-debugging-port 付き起動し、WebSocket から Runtime.evaluate を呼ぶ方法について、詳しく教えて下さい。

A.2

Chrome DevTools Protocol 経由で Edge を制御する手順

1. Edge をリモートデバッグモードで起動する

  • コマンド例(Windows) msedge.exe --remote-debugging-port=9222 --user-data-dir="C:\temp\edge_profile"
  • 起動後、HTTP エンドポイント http://localhost:9222/json/version にアクセスすると、ブラウザ全体の WebSocket デバッガ URL が返却される
    含まれる webSocketDebuggerUrl をメモしておくこと

2. デバッグ対象のページタブを選ぶ

  • http://localhost:9222/json/list を取得して、実行中タブの一覧を JSON で取得
  • 各エントリに含まれる webSocketDebuggerUrl がページ単位の接続先になる

3. WebSocket クライアントで DevTools Protocol に接続

  • websocat や任意の言語の WebSocket ライブラリで先ほど取得した ws://…/devtools/page/… に接続
  • 接続後は JSON-RPC 形式でメッセージを送受信できる

4. Runtime.evaluate でページ内スクリプトを実行

次のような JSON を送信して、任意の JavaScript を呼び出す。読み上げ開始・一時停止・再開・キャンセル、どれも同じ形式で呼べる。

{
  "id": 1,
  "method": "Runtime.evaluate",
  "params": {
    "expression": "speechSynthesis.speak(new SpeechSynthesisUtterance('こんにちは、Edge自動読み上げです'))",
    "awaitPromise": true
  }
}
  • awaitPromise: true を付けると、Promise ベースの API 呼び出し完了まで結果を待機できる

5. Node.js で chrome-remote-interface を使うサンプル

import CDP from "chrome-remote-interface";

(async () => {
  const client = await CDP({ port: 9222 });
  const { Runtime, Page } = client;
  await Page.enable();
  await Runtime.enable();

  // ページ遷移 → 読み上げ開始
  await Page.navigate({ url: "https://example.com" });
  await Page.loadEventFired();

  const res = await Runtime.evaluate({
    expression: `
      const u = new SpeechSynthesisUtterance('自動テスト中。別URLロード後に読み上げ開始');
      speechSynthesis.speak(u);
    `,
    awaitPromise: true,
  });
  console.log("読み上げ開始完了", res.result);

  await client.close();
})();
  • chrome-remote-interface ライブラリがあれば、JSON を自前で組み立てる手間を省ける

補足: 実運用で押さえておくポイント

  • 読み上げの一時停止・再開・キャンセルは、それぞれ speechSynthesis.pause() / speechSynthesis.resume() / speechSynthesis.cancel() を Runtime.evaluate で呼び出すだけ。
  • 複数タブを同時に操作したい場合は、/json/list で取得した各タブの webSocketDebuggerUrl ごとに WebSocket を貼り、個別制御する。
  • 他言語(Python、Java、Go など)からも WebSocket クライアントさえあれば同じ手順で制御可能。
  • ヘッドレスモードや CI 環境では、--headless オプションや適切なユーザーデータディレクトリを併用すると安定性が向上する。

Q.3

WebSocket クライアントについて、詳しく教えて下さい。

A.3

WebSocket クライアントの基本と実装例

1. WebSocket クライアントとは

WebSocket クライアントは、まず HTTP の Upgrade ヘッダーでサーバーと TCP コネクションを確立し、双方向かつ持続的なデータ交換を可能にする JavaScript API です。一度接続が確立すると、クライアント ⇆ サーバー間で ping/pong やバイナリ・テキストメッセージをリアルタイムにやり取りできます。


2. 接続からメッセージ交換までの流れ

  1. new WebSocket(wsUrl)で接続を開始
  2. サーバーが HTTP/1.1 101 Switching Protocols で Upgrade を承認
  3. openイベント発火 → send()でテキスト/バイナリ送信可能
  4. messageイベントで受信データを取得
  5. close/errorイベントで接続終了や例外を検知

このモデルを使うことで、CLI ツールやブラウザ拡張、DevTools 経由の Remote Debugging にも応用できます。


3. ブラウザ(JavaScript)でのシンプルクライアント例

以下はブラウザ環境のコンソールやデバッグツールで動く最小構成コードです。

const ws = new WebSocket("ws://localhost:9222/devtools/page/XXXXX");
ws.addEventListener("open", () => {
  console.log("WebSocket opened");
  // JSON-RPC メッセージを送信
  ws.send(
    JSON.stringify({
      id: 1,
      method: "Runtime.evaluate",
      params: { expression: "1+1", awaitPromise: false },
    })
  );
});
ws.addEventListener("message", (e) => {
  console.log("Received:", JSON.parse(e.data));
});
ws.addEventListener("close", () => {
  console.log("WebSocket closed");
});
ws.addEventListener("error", (err) => {
  console.error("WebSocket error", err);
});

4. Node.js(ws パッケージ)でのクライアント例

Node.js 環境ではwsパッケージが手軽です。

import WebSocket from "ws";

const ws = new WebSocket("ws://localhost:9222/devtools/page/XXXXX");

ws.on("open", () => {
  console.log("Connected");
  ws.send(
    JSON.stringify({
      id: 1,
      method: "Runtime.evaluate",
      params: {
        expression:
          "speechSynthesis.speak(new SpeechSynthesisUtterance('Hello'))",
        awaitPromise: true,
      },
    })
  );
});

ws.on("message", (data) => {
  const msg = JSON.parse(data);
  console.log("RPC Response:", msg);
});

ws.on("close", () => console.log("Disconnected"));
ws.on("error", (err) => console.error("Error:", err));

5. Python(websockets ライブラリ)でのクライアント例

Python のwebsocketsを使うサンプルです。

import asyncio
import json
import websockets

async def main():
    uri = "ws://localhost:9222/devtools/page/XXXXX"
    async with websockets.connect(uri) as ws:
        await ws.send(json.dumps({
            "id": 1,
            "method": "Runtime.evaluate",
            "params": { "expression": "console.log('ping')", "awaitPromise": False }
        }))
        async for message in ws:
            print("Received:", json.loads(message))

asyncio.run(main())

6. DevTools Protocol での JSON-RPC 送信ポイント

  • id:リクエスト ID
  • method:Runtime.evaluate/Page.navigateなど
  • params:メソッド固有パラメータ
  • サーバー応答は同一 WebSocket 上のmessageイベントで取得

この構造を抑えれば、読み上げ制御用のspeechSynthesis.pause()やresume()、別 URL へのPage.navigate+読み上げ開始といった組み合わせが自由自在に実現できます。


次に知りたいこと

  • DevTools Protocol 経由でのイベント購読(Runtime.consoleAPICalledなど)の仕組み
  • Chrome DevTools Protocol 全体のメッセージ設計と効率的なバッチ送信
  • 複数 WebSocket 接続を管理するアプリケーション設計パターン
  • Python や Go の型安全なクライアント生成方法
  • CI 環境向けのヘッドレス+リモートデバッグ安定化テクニック

これらに興味があれば、ぜひ次のステップで深掘りしましょう。

Q.4

python のようなプログラミング言語を使わずに、初心者が気軽に websocket を使えるようなユーザインタフェースを持つ postman のようなフリーツールがあれば、紹介して下さい。

A.4

WebSocket 対応の無料 GUI ツール 2 選

  • Hoppscotch(旧 Postwoman)
    ブラウザだけで動く完全オープンソースの API テストツールです。REST や GraphQL に加えて、WebSocket の送受信も GUI 操作で手軽に行えます。アカウント登録不要・インストール不要で、URL/メッセージを入力して Connect ボタンを押すだけでリアルタイムにやり取りを確認できます。

  • Firecamp
    デスクトップアプリ(Windows/Mac/Linux 対応)で、チーム共有も想定された協力的な API テスト環境を提供します。REST/GraphQL/WebSocket/gRPC など複数プロトコルをサポートし、プロジェクト単位で接続設定や送信履歴を保管。無料プランでもチーム機能やコラボレーションが使え、社内環境でも安心して利用できます。

Q.5

websocket クライアントとして restfox を使って、edge の読み上げ機能をコントロールする手順を詳しく説明して下さい。具体的な例を提示して、初心者が迷わずに手順どおりに操作することで、edge の読み上げ機能を自動化できることを実感できる手順を示して下さい。

A.5

Restfox を使った Edge 読み上げ制御のステップバイステップガイド

Edge を起動し、Chrome DevTools Protocol (CDP) 経由で WebSocket 接続した後、Restfox の GUI から TTS を自動制御する手順を示します。初心者でも迷わず操作できるよう、画面操作と送信する JSON を具体例付きで解説します。


1. Edge をリモートデバッグモードで起動する

  1. Windows の「ファイル名を指定して実行」や PowerShell で以下を入力して起動 "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" --remote-debugging-port=9222 --user-data-dir="C:\temp\edge_profile"
  2. 正常起動後、http://localhost:9222/json/list にブラウザからアクセスし、表示される JSON の中から webSocketDebuggerUrl をコピーする。

2. Restfox で WebSocket 接続を作成

  1. Restfox を起動し、左上の[新規リクエスト]→[WebSocket]を選択
  2. [接続先 URL]欄に先ほどコピーした ws://localhost:9222/devtools/page/XXXXX を貼り付け
  3. [Connect]をクリックして接続を確立
  4. 画面下部に「CONNECTED」と表示されれば OK

3. CDP ドメインの有効化

Restfox の送信ペインに以下 JSON を貼り、[Send]を押して Page と Runtime ドメインを有効化します。

{ "id": 1, "method": "Page.enable" }
{ "id": 2, "method": "Runtime.enable" }

送信後、Restfox の受信ペインに応答が返ってくることを確認してください。


4. 読み上げ開始のサンプル

読み上げを開始したいテキストを SpeechSynthesisUtterance に渡し、CDP 経由で実行します。Restfox の送信ペインに以下を貼って[Send]。

{
  "id": 3,
  "method": "Runtime.evaluate",
  "params": {
    "expression": "speechSynthesis.speak(new SpeechSynthesisUtterance('こんにちは、これから自動読み上げを開始します'))",
    "awaitPromise": true
  }
}

受信ペインに result が返ってくれば、Edge 側で音声が再生されるはずです。


5. 一時停止/再開/キャンセル

  • 一時停止 json { "id": 4, "method": "Runtime.evaluate", "params": { "expression": "speechSynthesis.pause()" } }
  • 再開 json { "id": 5, "method": "Runtime.evaluate", "params": { "expression": "speechSynthesis.resume()" } }
  • キャンセル(停止) json { "id": 6, "method": "Runtime.evaluate", "params": { "expression": "speechSynthesis.cancel()" } }

それぞれ送信後、実際に音声が止まったり再開したりすることを確認しましょう。


6. 別 URL ロード+読み上げの自動化例

  1. ページ遷移 json { "id": 7, "method": "Page.navigate", "params": { "url": "https://example.com" } }
  2. ページ読み込み完了を待つ
    • Restfox の受信ペインで Page.loadEventFired メッセージが来るまで待機
  3. 新ページで読み上げ開始 json { "id": 8, "method": "Runtime.evaluate", "params": { "expression": "speechSynthesis.speak(new SpeechSynthesisUtterance('新しいページの読み上げを開始します'))", "awaitPromise": true } }

7. 動作確認のポイントと Tips

  • Restfox は送信ごとに JSON の id をユニークに設定すると、受信ログとの対応が取りやすいです。
  • 読み上げ速度や声を変えたいときは Utterance 作成時に const u = new SpeechSynthesisUtterance('…'); u.rate = 1.2; u.pitch = 1.1; u.voice = speechSynthesis.getVoices()[0]; speechSynthesis.speak(u); といったオプションを付与してください。
  • 複数タブを制御したい場合は http://localhost:9222/json/list で別タブの WebSocket URL を取得し、Restfox の別タブで接続を増やします。
  • CI やヘッドレス化するなら --headless フラグを追加して同手順で動作検証できます。

以上の手順で、Restfox を使いながら Edge の読み上げ機能を完全 GUI 操作で自動化できます。まずは上記をトレースし、「実際に音声が動く楽しさ」を体感してみてください。


【参考】

  1. Powershell から Edge をリモートデバッグモードで起動し JSON エンドポイントを取得する方法

Q.6

windows で restfox 環境をセットアップする手順を具体的に示して下さい。

A.6

Windows で Restfox 環境をセットアップする 3 つの方法

Windows に Restfox を導入するには、公式の GUI インストーラーを使う、PowerShell の Scoop パッケージマネージャー経由で導入する、あるいは Docker イメージで動かす方法があります。ここでは初心者でも迷わず進められる手順をそれぞれ具体的に解説します。


方法 1: GUI インストーラーを使う(最も簡単)

  1. GitHub の Restfox リリースページにアクセス
    https://github.com/flawiddsouza/Restfox/releases
  2. 最新版の「Windows」向けアセットを探し、restfox-setup-<version>.exeまたは.zipファイルをダウンロード
  3. ダウンロードした.exeをダブルクリックし、画面の指示に沿ってインストーラーを完了させる
  4. スタートメニューまたはデスクトップに作成された「Restfox」アイコンからアプリを起動して準備完了

方法 2: Scoop パッケージマネージャーでインストール

Scoop を使うと PowerShell 一行で Restfox を導入できます。

  1. PowerShell を管理者権限で起動
  2. Scoop をまだ導入していなければ、以下を実行 powershell Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh')
  3. Scoop の“extras”バケットを追加 powershell scoop bucket add extras
  4. Restfox をインストール powershell scoop install restfox
  5. インストール完了後、restfoxコマンドで起動
  6. GUI が立ち上がればセットアップ成功

方法 3: Docker コンテナで動かす(オプション)

Docker を利用できる環境なら、Web スタンドアロン版を簡単に立ち上げられます。

  1. Docker Desktop をインストールして起動
  2. ターミナルで以下を実行 bash docker run --rm -p 4004:4004 flawiddsouza/restfox:latest
  3. ブラウザで http://localhost:4004 にアクセスすると Restfox の Web UI が表示される
  4. 以降はブラウザ上で REST/WebSocket リクエストを GUI 操作可能

動作確認と初期設定ポイント

  • 起動後、REST リクエストの他に WebSocket タブが表示されるか確認
  • 接続先 URL にws://localhost:9222/devtools/page/…を設定し、メッセージ送受信のテストを行う
  • 履歴保存や環境変数設定機能を使うと、複数プロジェクトの管理が便利

以上のいずれかの手順で Windows 上に Restfox 環境を構築できます。GUI インストーラーか Scoop 経由が特に手軽なので、まずはどちらかで試してみて、WebSocket リクエストを送信できることを体感してください。


【参考】

  1. GitHub – flawiddsouza/Restfox: Offline-First Minimalistic HTTP & Socket Testing Client – Windows 用スコープ導入・リリースバイナリ提供

Q.7

restfox をインストールした後に、正常に動作することを実感するための簡単な動作確認手順を提示して下さい。

A.7

Restfox インストール後の動作確認手順

以下の手順で、Windows にインストールした Restfox が正常に動作することを簡単に確認できます。HTTP リクエストと WebSocket リクエストの両方を試すことで、GUI 操作から送受信ができることを実感しましょう。


1. Restfox を起動する

  • スタートメニュー、またはデスクトップの「Restfox」アイコンをダブルクリックして起動
  • 画面が立ち上がり、左上に「New Request」「Environment」「History」などのメニューが表示されれば OK

2. HTTP GET リクエストを試す

  1. 左上の「New Request」をクリック
  2. 「Type」ドロップダウンで「HTTP」を選択
  3. 「Method」を「GET」に設定
  4. URL 欄に以下を貼り付け https://jsonplaceholder.typicode.com/posts/1
  5. 画面下部の「Send」ボタンをクリック
  6. 右ペインにステータスコード「200 OK」と JSON 形式のレスポンスが表示されることを確認

3. WebSocket エコーサーバへ接続

  1. 再度「New Request」をクリック
  2. 「Type」で「WebSocket」を選択
  3. 接続先 URL 欄に以下を入力 wss://echo.websocket.events
  4. 「Connect」ボタンを押し、「CONNECTED」表示を確認
  5. メッセージ入力欄に Hello Restfox と入力して「Send」
  6. 送った文字列が同じ内容で返ってくる(エコーされる)ことを確認

4. ローカル CDP 接続の確認(任意)

Edge をリモートデバッグモードで起動した環境があれば、

  1. Edge を msedge.exe --remote-debugging-port=9222 --user-data-dir=C:\temp\edge_profile で起動
  2. ブラウザで http://localhost:9222/json/list にアクセスして得られる webSocketDebuggerUrl をコピー
  3. Restfox の WebSocket リクエストに貼り付けて「Connect」
  4. 接続後、以下を Send してプロトコル応答が返れば OK json { "id": 1, "method": "Runtime.version" }

5. 動作確認のポイント

  • HTTP/WS タブ切替:リクエストタイプを変えても正常に画面が更新されるか
  • レスポンス履歴:左ペインの「History」に送信履歴が溜まるか
  • 環境変数:Environment 機能で変数を定義し、URL やヘッダーに埋め込んで呼び出せるか

以上で Restfox の基本機能が正常に動作することを実感できます。次は Edge の CDP 操作を組み合わせて、実際に音声合成制御を試してみましょう。