統合小説執筆環境(VSCode拡張機能)
小説を書くための作品管理・文字数計測・AI支援を1つにまとめたVSCode拡張機能です。
現在の配布版:0.6.35(実際に使って見つかった不具合の修正)
できること
執筆の流れに沿って並べると、次のようになります。
| 場面 |
できること |
| 始める |
プロットから、または本文から新規作品を作る。既存のフォルダやGitHubの作品を登録する |
| 書く |
話数・文字数の自動集計、原稿用紙換算、執筆量の記録とグラフ、用語ハイライト |
| 資料をためる |
本文から登場人物・場所・スキル・組織・世界観を抽出して設定資料にする |
| 整える |
プロットを本文から逆算する。各話あらすじ・作品紹介文・キャッチコピーを作る。各話の盛り上がりを感情曲線で見る |
| 直す |
誤字脱字の検知、表記ゆれの検知。指摘は1件ずつ確認して適用する |
| 相談する |
開いている画面についてAIに日本語で質問する。質問に近い場面を作品全体から探して答えます。 この拡張機能の使い方も聞ける |
| 持ち運ぶ |
GitHubで複数の環境を行き来する。競合は並べて見比べて解決する |
| 書き出す |
設定資料集のMarkdown、IME辞書(Google日本語入力・MS-IME・ATOK) |
AIは原稿(本文)を勝手に書き換えません。 指摘や提案は必ず作者が確認してから反映します。使うAIは Ollama(無料・ローカル)、Claude、ChatGPT、Gemini から選べます。
インストール
VS Codeの拡張機能ビュー(Ctrl + Shift + X)で「統合小説執筆環境」を検索して「インストール」を押してください。コマンドでも入れられます。
code --install-extension nonahisa.novel-ai-assistant
更新はVS Codeが自動で行います。
VSIXファイルから入れる(配布前の版を試す場合)
GitHubのReleaseに置いたVSIXから入れることもできます。新規インストールと上書き更新の両方に使えます。
gh release download v0.6.35 --repo nonahisa/novel-ai-assistant --pattern "novel-ai-assistant-0.6.35.vsix" --clobber
code --install-extension ".\novel-ai-assistant-0.6.35.vsix" --force
画面から操作する場合は、VS Codeの「拡張機能」ビュー右上の ... →「VSIXからのインストール」を選び、同じVSIXファイルを指定します。
インストール後にVS Codeを再読み込みすると、左端のアクティビティバーにキーボードと万年筆のアイコン(小説執筆)が追加されます。対応バージョンはVS Code 1.90.0以降です。
最初にやること(セットアップ)
この拡張機能を入れただけでは、AIを使う機能は動きません。 作品の管理・文字数の集計・執筆量のグラフはそのまま使えます。
操作メニューの「拡張機能の設定 → セットアップを開始 → セットアップ(必要なものを入れる)」を実行してください。何が足りていて、それぞれ何のために要るのかを一覧で見せ、選んだものをその場で入れます。
| 何 |
何のために |
要否 |
大きさ |
| Ollama本体 |
手元のパソコンでAIを動かします。無料で、原稿を外部へ送りません |
必須 |
約1GB |
会話モデル(gemma4:e4b) |
設定資料の抽出、あらすじ・紹介文の生成、誤字脱字の検知、AIへの相談 |
必須 |
約9.6GB |
埋め込みモデル(bge-m3) |
相談の意味検索(言い換えでの質問に強くなります) |
任意 |
約1.2GB |
| Git |
複数のパソコンで同じ作品を書く。過去の版へ戻す |
任意 |
約60MB |
| GitHub CLI |
非公開リポジトリの作成・取り寄せ |
任意 |
約12MB |
すべてを入れる必要はありません。
- クラウドのAI(Claude・ChatGPT・Gemini)だけを使う場合、Ollamaとモデルは要りません。「AI設定」からAPIキーを登録してください(実行のたびに課金されます)
- 1台のパソコンだけで書く場合、GitとGitHub CLIは要りません
- 非力なパソコンでは、埋め込みモデルは入れないほうが軽く動きます
入れる前に、何を・どれだけ取得するかを必ず確認します。 途中で中止できます。回線の速さによっては数十分かかります。
入れたものを消したくなったら、モデルは ollama rm <モデル名>、本体は Windows の「アプリと機能」から削除できます。消しても作品のファイルや設定資料は変わりません。
開発者向けセットアップ
1. 依存パッケージのインストール
このフォルダをVSCodeで開き、ターミナル(Ctrl + @)で実行します。
npm install
2. ビルド
npm run build
3. デバッグ起動
VSCodeで F5 を押すと、拡張機能が読み込まれた新しいVSCodeウィンドウ(拡張機能開発ホスト)が起動します。
開発中は以下を実行しておくと、保存のたびに自動でビルドされます。
npm run watch
Sakura AI Engine スモークテスト
さくらのAI Engine の接続確認は、拡張機能からは実行されません。GitHub Actions では
workflow_dispatch(手動実行)
main 向け pull_request(opened/synchronize/reopened)
で preview/gemma-4-31B-it 呼び出しを行います。fork PR は Secret が使えないため、安全のためスキップします。
- リポジトリの Settings → Secrets and variables → Actions で、リポジトリシークレット
SAKURA_AI_ACCOUNT_TOKEN を登録します。トークンをコード、ログ、.env に書かないでください。
- 手動実行する場合は、ワークフローが既定ブランチに入った後、リポジトリの Actions
タブで Sakura AI Engine Smoke Test を選び、Run workflow を押して対象ブランチを選択します。
必要ならリポジトリ変数
SAKURA_AI_SMOKE_MODEL に preview/gemma-4-31B-it など利用可能なモデル名を設定してください。
- 成功条件は、
preview/gemma-4-31B-it から空でない応答を受け、ログに
Sakura AI smoke test passed が表示されることです。応答本文やトークンはログに出ません。
HTTP 401 の失敗時はシークレット名・値を確認してから、必要時だけ手動で再実行します。
HTTP 429 の失敗時はレート制限なので、待ってから手動で再実行します。どちらも秘密情報を
出さずに失敗する設計であり、自動リトライや自動実行には切り替えません。
HTTP 400 の失敗時は、トークンは届いているもののリクエスト内容(モデル名やパラメータ)に
問題がある可能性があります。エラーメッセージの本文が出る場合は、その内容を元にモデル名の
見直し(またはプロバイダ設定)を行ってください。
使い方
起動したウィンドウの左端アクティビティバーに、キーボードと万年筆のアイコン(小説執筆)が追加されます。開くと2つのビューが並びます。
作品一覧:登録した作品と話数ファイル。右クリックで作品ごとの操作ができます。
操作メニュー:できることの一覧です。コマンド名を覚えていなくても、ここから選べます。作品を登録していない間、作品を必要とする操作は灰色になり「作品を登録すると使えます」と出ます(消えはしません)。
分類 → 小分類 → 操作の3階層です。
執筆データ 執筆統計・文字数
作品管理 GitHubで作品管理(同期・競合解決・復元)/新作開始/既存作追加
執筆AI支援 プロット/校正・校閲/広報支援/その他支援
資料管理 資料生成/設定資料閲覧
拡張機能の設定 設定管理/AI/セットアップを開始
ヘルプ ログ
項目の末尾には印が付きます。
| 印 |
意味 |
| AI |
AIを呼ぶ操作です。クラウドのAI(Gemini・ChatGPT・Claude)は実行のたびに課金されます |
| 数字 |
承認待ちの更新の件数です。「更新分を反映」と、「資料管理」の見出しに出ます |
分類は最初はすべて閉じています。開いた分類は次に起動したときも開いたままになるので、よく使う分類だけ開いておけます。小分類も分類とは別に覚えます。
作品を登録する
- フォルダから追加:すでに原稿があるフォルダを指定します。カクヨム・小説家になろうからダウンロードしたファイルをそのまま入れたフォルダでも構いません。
- GitHubから追加:別の環境で書いている作品を、GitHubから取り寄せて登録します。新しいPCで続きを書き始めるときに使います。同じ名前のフォルダーがある場合は、中身を失わないよう取り寄せを中止します。非公開のリポジトリは、GitHub CLI(
gh)が入っていればそちら経由で取り寄せます。
- 新規作品を作成:フォルダ構造を作ります。作品名を入れたあとに、どこから始めるかを選びます。
| 選択 |
起きること |
| プロットから始める |
設定/plot.md にログライン・テーマ・世界観・あらすじなどの見出しを用意して開きます |
| 本文から書き始める |
プロットは作りません。第1話のファイル(本文/001.txt)を作って開きます |
プロットを立ててから書く作者と、書きながら考える作者がいます。どちらかに決めつけると、片方には使わないテンプレートが残り、もう片方には最初の一歩が見えません。
あとからどちらへも移れます。 プロットは操作メニューの「執筆AI支援 → プロットをつくる」でいつでも足せます(すでに書きかけのプロットがあれば、上書きせずそのまま開きます)。本文は「新規話数ファイルを追加」で足せます。
新規作成時のフォルダ構造:
作品名/
├─ 本文/ ← 原稿を入れる
├─ 設定/
│ ├─ plot.md ← プロットから始めた場合のみ
│ └─ icons/ ← キャラクターアイコン用
├─ .aiwriter/ ← 拡張機能の管理領域
└─ .gitignore
話数の自動認識
ファイル名から話数を解析します。以下の形式に対応しています。
| ファイル名 |
認識結果 |
001.txt |
第1話(初期名) |
007_湖畔の誓い.txt |
第7話「湖畔の誓い」 |
003-005_合本.txt |
第3〜5話 |
第12話 再会.md |
第12話「再会」 |
プロローグ.txt |
プロローグ |
幕間1.txt |
幕間 |
全角数字、〜 による範囲指定にも対応しています。
ファイル名が数字のみのものは、ツリー上で白丸アイコンになります。これは後の「サブタイトル自動提案」機能の対象を示すものです。
全話が1ファイルに入っている場合(なろうのダウンロード形式)
小説家になろうからダウンロードすると、全話が1ファイルにまとまった形になります。この形式は中を読んで話ごとに分けて扱います(エピソードN開始 の区切りと 【エピソードタイトル】)。一覧には「219話ぶん」と表示されます。
- 話数とサブタイトルは、各話のタイトル(
1話 転生)から読み取ります
- 後書き・リアクションは本文に含めません。 文字数にも数えず、AIにも渡しません(実データの70万字の作品で1万字ありました)
- AIへ送る単位は分ける前と同じです。話ごとに分けたぶんだけ呼び出しが増えることはありません
話数が書かれていないタイトル(「プロローグ」など)は、話数なしとして扱います。並び順で数えると、以降の話が1つずつずれてしまうためです。
新規話数ファイルの追加
作品を右クリック →「新規話数ファイルを追加」。既存の最大話数 + 1 のファイル名(例 008.txt)が初期値になります。
文字数計測
- ツリー上に、ファイルごと・作品ごとの文字数が表示されます
- ステータスバー右下に、現在開いているファイルの文字数が表示されます
- テキストを選択すると、選択範囲の文字数も表示されます
- ツールチップに総文字数・段落数・原稿用紙換算が出ます
計測仕様
- 純文字数:改行・空白(半角/全角/タブ)をすべて除いた数
- 総文字数:改行のみ除いた数
- サロゲートペア(
𠮟 など)は1文字として数えます
- Markdownのルビ記法
{漢字|かんじ} は、ルビ部分を除外します(設定で変更可)
原稿用紙の枚数は、文字数を400で割ったものではありません。 原稿用紙は20字×20行で、1行20字で折り返すため段落の最終行に余白が残り、空行も1行分の場所を取ります。小説は会話文や短い段落が多く、この余白が積み上がります。実データでは割り算より70%以上多くなりました(4.3万字の作品で110枚ではなく190枚)。行ごとに占める行数を数えて合算しています。組版で前後するため「約N枚」と表記します。
執筆量の記録とグラフ
本文を保存するたびに、前回からの増減をその日の執筆量として記録します。 作品の現在の文字数はいつでも数えられますが、書いた量は記録しておかないと二度と分かりません。
操作メニューの「執筆データ → 執筆統計を表示」でパネルが開きます(作品の右クリックからも開けます)。
- 執筆量タブ:日次(30日)・週次(12週)・月次(12か月)・年次を切り替えられるグラフ。目標を設定していれば目標線が引かれます
- 話ごとタブ:話数・タイトル・文字数・原稿用紙の枚数・平均比の一覧。クリックするとその話が開きます
書かなかった日も0として並びます。書いた日だけを並べると毎日書いているように見えて、途切れていることに気づけないためです。
何を「書いた量」として数えるか
差をそのまま採ると、書いていないのに数万字書いたことになる場面があります。次の場合は基準を置き直すだけで、執筆量には数えません。
| 場面 |
数えない理由 |
| 初回の測定 |
すでにある原稿を「今日書いた」ことにしてしまう |
| ファイルが増減した |
ダウンロードした本文を入れれば数十万字増え、消せば同じだけ減る |
| 競合の件数が変わった |
競合中の話は集計から外れるので、解決した瞬間に書いたように見える |
| 別の環境の変更を取り込んだ(pull) |
同じ文章を2台ぶん数えることになる |
推敲で削った日は負のまま残します。0で止めると記録の合計と作品の総字数が食い違い、削った日が無かったことになるためです。
1日の区切りは既定で午前4時です。深夜0時で切ると、夜中に書いた分が翌日に付いてしまうためです(設定で変更できます)。
全作品をまとめて見る
「執筆データ → 全作品の執筆統計を表示」で、登録している全作品を合わせた執筆量を見られます。作品ごとの内訳も出ます。
1日・1月の目標は作品ごとではなく設定全体で共有する値なので、達成率はこちらのほうが正確です(1作品の画面では、その日に他の作品へ書いた分が入りません)。
複数のPCで書く場合
記録は 作品フォルダ/.aiwriter/stats/<環境名>.json に、環境ごとに別のファイルとして残ります。1つのファイルを共有すると2台で書いた瞬間に必ず競合するためです。読むときは全部を合算するので、どの環境から見ても総執筆量は同じになります。パネルには環境ごとの内訳も出るので、「自宅では書けているが外では進まない」といった傾向が分かります。
目標と達成率
novelai.stats.dailyGoal に1日の目標字数を入れると、ステータスバーが「今日 560/1,000字」の形になり、達成すると印が付きます。novelai.stats.monthlyGoal を設定すると、月の達成率と「残りの日で1日あたり何字書けばよいか」がパネルに出ます。
連続して書いている日数も表示します。今日まだ書いていなくても、昨日まで続いていれば途切れた扱いにはしません。
記録したくない場合
novelai.stats.enabled を false にすると記録しません。すでにある記録は消えず、パネルでも読めます。
設定
Ctrl + , で設定を開き、「novelai」で検索してください。
| 設定 |
既定値 |
説明 |
novelai.countMode |
net |
ステータスバーに表示する文字数の種類 |
novelai.excludeRubyFromCount |
true |
ルビ部分を文字数から除外する |
novelai.episodeFileExtension |
.txt |
新規ファイルの既定の拡張子 |
novelai.episodeNumberDigits |
3 |
話数のゼロ埋め桁数(3なら 001.txt) |
novelai.logs.retentionDays |
7 |
ログに残す日数。これより古い行は起動時に消える(0で消さない) |
novelai.chatter.enabled |
true |
書いている最中に、AIが相談パネルへひとこと差し込む(Ollamaのときだけ) |
novelai.stats.enabled |
true |
保存のたびに執筆量を記録する |
novelai.stats.showInStatusBar |
true |
ステータスバーに今日の執筆量を出す |
novelai.stats.dailyGoal |
0(目標なし) |
1日の目標字数 |
novelai.stats.monthlyGoal |
0(目標なし) |
1か月の目標字数 |
novelai.stats.dayBoundaryHour |
4 |
1日の区切りとする時刻。0時で切ると夜中に書いた分が翌日に付きます |
novelai.stats.weekStart |
monday |
週次グラフで週の始まりとする曜日 |
文字コードについて
UTF-8(BOM有無どちらも)と Shift_JIS を自動判別して読み込みます。なろう・カクヨムからのダウンロードファイルはShift_JISの場合があるためです。
AI機能
初期設定
サイドバー右上の歯車アイコン、またはコマンドパレット(Ctrl+Shift+P)から「小説執筆: AI設定」を実行します。操作メニューの「拡張機能の設定 → AI → AI設定」からも開けます。
- 使用するAIを選ぶ(1つで構いません)
- 接続テストが自動で走る
- 利用できるモデルの一覧から選ぶ(コンテキスト長・対応機能が表示されます)
対応しているAIは4つです。
| AI |
費用 |
APIキーの発行元 |
| Ollama |
無料・オフライン可 |
不要 |
| Gemini |
無料枠あり。超えると課金 |
aistudio.google.com |
| ChatGPT |
実行するたびに課金 |
platform.openai.com |
| Claude |
実行するたびに課金 |
console.anthropic.com |
Ollamaを使う場合、事前に起動してモデルを取得しておいてください。
ollama pull gemma4:e4b
APIキーはVS Codeの資格情報ストアへ保存され、settings.json や作品フォルダーには書き込みません。 Gitで同期されて漏洩することを避けるためです。
キーの扱いは次のようにしています。
- 保存先はOSの資格情報ストア(Windowsでは資格情報マネージャー)です
- 送信はHTTPヘッダーで行います。URLに載せると、ログや履歴に残りやすいためです
- ログに出るときは伏せ字になります。 接頭辞での判定ではなく、実際に登録されたキーの値そのものを消すので、キーの形式が変わっても効きます
- ログの保存先
.aiwriter/logs/ はGitの同期対象外です
キーを消したいときは「AI設定」からやり直してください。
クラウドのAIは実行のたびに利用量が加算されます。設定資料の抽出のように呼び出し回数が多い処理では、実行前にトークン量の目安を表示します。
ChatGPTを使う場合の注意
OpenAIのモデル一覧APIはコンテキスト長を返しません。そのため設定 novelai.openai.contextWindow(既定128000)の値を使います。この値は本文の分割単位を決めるので、実際のモデルより大きいと入力が黙って切り捨てられます。 使用するモデルの仕様に合わせて設定してください。
GeminiとOllamaはモデル側から取得できるため、設定は不要です。
設定資料の抽出
操作メニューの「資料管理 → 資料生成 → まとめて生成」。全話を解析して、登場人物・能力・組織・場所・世界観をまとめて取り出します。
1回のAI応答から5種類すべてを取り出すため、種別ごとにAIを呼ぶ場合の5分の1の処理量で済みます。抽出したJSONを保存したあと、読みやすい一覧(設定/characters.md・abilities.md・organizations.md・locations.md・world.md)まで続けて生成します。
抽出したJSONから読むための資料集を書き出すのが「設定資料集を出力」(執筆AI支援 → その他支援)です。JSONを手直ししたあとや、人物をまとめたあと・更新を反映したあとに実行すると、上の5つのMarkdownが最新の内容になります。AIは呼びません。
種別ごとに書き出すこともできます(操作メニューの「資料管理 → 資料生成」)。人物のJSONだけを直したときに、その一覧だけを作り直せます。
| 操作 |
書き出すもの |
| 人物一覧を生成 |
characters.md |
| 場所一覧を生成 |
locations.md |
| スキル一覧を生成 |
abilities.md(作品での呼び方に合わせます) |
| 世界観一覧を生成 |
world.md |
いずれもAIは呼びません。全部まとめて作り直したいときは「設定資料集を出力」を使ってください。
設定資料パネル
操作メニューの「資料管理 → 設定資料閲覧 → 設定資料集を閲覧」。抽出した登場人物・能力・組織・場所・世界観を1枚の画面で扱えます。左が一覧、右が選んだ1件の詳細です。
組織
人物の「所属」に対応する設定です。所属で人物をまとめているのに、組織そのものを説明する場所がありませんでした。
所属する人物は組織側に持ちません。 人物の「所属」から引いて表示します。両方に持つと、片方だけ直したときに食い違うためです。
AIが組織として出さなかった所属も、名前だけの組織として登録します。説明は入れません。本文に根拠のない説明を足さないためです。中身は「項目を充実させる」か手入力で埋めてください。
「冒険者ギルド」は組織、「冒険者ギルドの受付」は場所として分けています。建物そのものを指すなら場所、人の集まりを指すなら組織です。両方に出ることもあります。
世界観
人物でも場所でもない、作品世界の決まりごとです。7つに分類します。
| 分類 |
例 |
| ジャンル・作品の性格 |
現代を舞台にした学園もの |
| 時代背景 |
大戦から20年後 |
| 世界の法則 |
詠唱には制約がある |
| 社会構造 |
三つの評議会が並び立つ |
| 文化・風習 |
成人の儀 |
| 地理 |
大陸は東西に分かれている |
| 固有の用語 |
作品の造語 |
名前は本文に出てこない言葉になります。 「詠唱の制約」のような見出しは、何についての項目かを示すためにAIに付けさせるものだからです。他の設定は「名前が本文に実在すること」を確かめてから保存しますが、世界観だけは引用が本文に逐語で存在することだけを確かめます。名前で確かめると、正しく読み取れた項目まで全部落ちてしまうためです。
分類が違っていても項目は捨てません。 知らない分類名が来たら「固有の用語」に寄せます。分類は資料の見出しを決めるだけで、中身の正しさとは関係がないからです。分類はパネルで直せます。
また、1つの項目が複数の分類に当てはまるのは普通のことなので(「詠唱の制約」は法則とも用語とも読めます)、分類の食い違いは「変化かもしれない」に出しません。判断を求めても得るものがないためです。
IME辞書には「固有の用語」だけを入れます。作品の造語は変換で出てこないためです。見出しは本文で打つ言葉ではないので入れません。
設定を書き換える
名前・読み・別名・性別・役割・性格・外見・説明・作者メモなどをその場で直せます。登場話数や抽出根拠は本文から機械的に求まる値なので、読み取り専用です。
保存すると、その項目は以後の抽出で上書きされなくなります(autoGenerated が false になります)。直した内容をAIに戻されては意味がないためです。
性別について
男性・女性は「男性」「女性」の2語に揃えます。本文が「男」「少年」と書いていても揃えるので、同じ人物が話ごとに揺れることはありません。どちらでもない場合だけ、本文の記載に合わせた言い方になります。
AIが埋めるのは、地の文の「彼」「彼女」、性別を示す語、本人や他人による明言など、本文で確認できる場合だけです。名前の響きや一人称からは推測しません。造語の名前は判断できないのが普通ですし、一人称の使い分けは作品によって違うためです。根拠がなければ空欄のままになります。誤った断定より空欄のほうが害が少ないと考えています。
性格について
他の項目は本文に書かれていることしか採りませんが、性格だけは本文の言動からの推論を認めています。小説では性格が地の文で説明されることは少なく、行動と台詞で示されるためです。明記だけを採ると、この項目はほぼ常に空欄になってしまいます。
代わりに、必ず「どう振る舞ったか」が添えられます。
|
例 |
| 出力される形 |
命令口調で指示を出し、部下の反論を最後まで聞かない |
| 出力しない形 |
傲慢 |
根拠が値そのものに残るので、読んで納得できなければ直せます。名前の響き・性別・ジャンルからは推論しません。
項目を増やす(誕生日・身長など)
「一覧に項目を増やす」(資料管理 → 資料生成)で、作品に必要な項目を人物設定に足せます。作品によって必要な項目は違うので、最初から用意しておくことができないためです。
足した項目は全員の設定資料に並びます。人物ごとに違う項目にすると見比べられませんし、誰に何を書いたか覚えていられないためです。値を入れていない人物では、資料に出力されません。
項目を足すときに説明文(「本文中で誕生日に触れている箇所があれば書く」など)を添えておくと、「項目を充実させる」でAIがその項目も埋めようとします。ただし一括の抽出では埋まりません。項目を足すたびに抽出のプロンプトが伸び、AIが既定の項目まで落とすようになるためです。
外しても入力済みの内容は消えません。 表示されなくなるだけで、項目を戻せば中身も戻ります。項目名を付け替えている途中で中身まで消えるのを防ぐためです。
定義は 設定/custom_fields.json に保存され、Gitで共同作業者にも渡ります。
AIで項目を充実させる(承認制)
「項目を充実させる」を押すと、AIが本文を読み直して、各項目に入れる内容そのものを提案します。
反映するかは項目ごとに選べます。空欄を埋める提案だけが最初からチェックされ、すでに書かれている内容を置き換える提案は「現在の内容を置き換えます」と警告が付き、既定では選ばれません。提案はその場で直してから反映できます。
登場話数や抽出根拠は提案されません。本文から機械的に求まる値をAIに書かせると、次の抽出で戻されて食い違うためです。
なおAIの提案を採用しただけの内容は、作者が確定させた記述としては扱いません。 中身はAIが書いたものなので、以後の抽出で更新されることがあります。自分で入力して「保存」を押した項目だけが、抽出で上書きされなくなります。
AIに相談する(承認制)
こちらは項目ではなく、文章のメモを書かせる機能です。
「第12話で嘘をついた理由は本文から読み取れますか?」のような質問にも、「生い立ち」のような掘り下げたい観点にも使えます。空欄のまま押すと、全体的に掘り下げます。
やり取りは保存されません。 残したい回答は「この回答をメモにする」を押すと下書きになり、手直ししてから「追記する」で保存できます。パネルを閉じるとやり取りは消えます。
承認したメモは、抽出した設定とは別の場所(aiNotes)に追記されます。既存の項目は書き換えません。抽出結果は本文に根拠がある事実ですが、相談の答えは「本文からこう読める」という解釈で、根拠を逐語で照合できないためです。設定資料のMarkdownでも引用形式で出力され、事実と区別できます。
AIに渡す本文について
73万字の作品をそのままAIに渡すことはできないため、その設定の名前・別名が出てくる場面だけを集めて渡します(既定で30箇所・12,000字まで)。作品全体から均等に選ぶので、序盤だけでなく終盤の場面も含まれます。
そのため、抜粋に含まれなかった場面については答えられません。AIが「本文の抜粋からは分かりません」と答えた場合、作品にその記述がないとは限りません。
なお「マルキオ・イークェス」のように区切りのある名前は、「マルキオ」「イークェス」でも本文を探します。小説では姓名を続けて書かず、片方だけで呼ぶことが多いためです。
本文中の用語に色を付ける
登録済みの名前は、本文中で種類ごとに色が変わります。
| 種類 |
色 |
| 登場人物 |
青 |
| 場所 |
緑 |
| 能力 |
紫 |
| 組織 |
橙 |
カーソルを合わせると、その設定の要点がその場に出ます。食い違いもここに出るので、本文を書いている最中に気づけます。
食い違いは「変化かもしれない(外見): 黒髪(第1〜3話)→ 銀髪(第7話)」のように、その値が出てきた話数と並べて表示します。小説では登場人物が作中で変わるので、値が2つ並んでいるだけでは、AIが取り違えたのか作中で変えたのか分かりません。話数が付いていれば「第7話で銀髪にした」と思い出せて、直す必要がないとその場で判断できます。話数の記録がない値は「それ以前」と出ます(いつ書かれたかを遡って知る手段がないので、推測では埋めません)。
モブ扱いの人物には色を付けません。「兵士たち」「冒険者」のような語は地の文の普通名詞と重なりやすく、色だらけになって読めなくなるためです。
「マルキオ・イークェス」のように区切りのある人名は、「マルキオ」だけでも色が付きます。組織名は区切りません。「冒険者ギルド」を「冒険者」「ギルド」に割ると、関係のない語まで色が付いてしまうためです。
抽出・更新の反映・同一人物のまとめを実行すると、色付けは自動で作り直されます。
本文を読みながら設定を見る
本文中の人名などにカーソルを置いて、右クリック →「設定情報を表示」。設定資料が本文の右側に開き、その項目が表示されます。
一度開けば、以後は本文をクリックするたびに追従します。カーソルは本文に残るので、書きながら参照できます。
重複をまとめる(同一人物の統合)
「リン」と「リンセップ・アウクト」のように、同じ人物が別々に登録されてしまうことがあります。「重複をまとめる」(資料管理 → 資料生成)で1件にまとめられます。
呼称の記録(誰が誰をどう呼ぶか)を手掛かりに候補を挙げますが、自動では統合しません。どちらの名前を残すかは作者が選びます。もう一方は別名として残ります。
まとめた側のファイルは削除せず、回復用の場所へ移します。 別人をまとめてしまっても元に戻せます。作者メモは片方を捨てず、両方が残ります。
更新分を反映(承認制)
作品を書き進めてから再抽出すると、既存の人物にも新しい情報(登場話数、新しい呼称、性格の記述など)が見つかります。これらはその場では保存されず、承認待ちになります。
「更新分を反映」(資料管理 → 資料生成)を実行すると、何がどう変わるかが人物ごとに一覧で出ます。
12 人の設定に更新があります。
・リンセップ・アウクト: 登場話を追加 / 呼称を変更
・マルキオ・イークェス: 性格を追加 / 関係を追加
…ほか 9 人
[内容を確認] [すべて反映] [選んで反映]
「内容を確認」で項目ごとの変更内容を読めます。JSONを見比べる必要はありません。
登場人物
設定/characters/ に人物ごとのJSONを生成します。
保存形式は1人1ファイルです。
設定/characters/
├─ char_001_月島灯.json
├─ char_002_白瀬澪.json
大きな characters.json ひとつだと、別の環境で別々の人物を追記しただけでGitの競合が起きるためです。ファイル名に人名を含めているのは、GitHubの差分画面で何の変更か判別できるようにするためです。
抽出される情報:
- 名前、別名、役割、性格(行動動機を含む)、外見
- 一人称(既定形+場面による変化形)
- 呼称(誰が誰をどう呼ぶか。相手ごと・呼び方ごとに保持)
- 他人物との関係、登場話数
呼称の扱い
「同じ相手への複数の呼び方」をすべて保持します。第7話まで「白瀬さん」、第8話から「澪」という変化も、両方を話数付きで記録します。呼び分けそのものが管理対象の情報のためです。
再実行時の挙動
処理済みのチャンクはキャッシュされ、変更のないファイルは再処理しません。キャッシュのキーには内容ハッシュに加えてモデル名とプロンプトのバージョンを含めているため、モデルを変えた場合は再処理されます。
作者が編集した情報は保護されます。
authorNotes(作者メモ)は上書きされません
autoGenerated: false にした人物は、登場話数の追記のみ行われます
- 既存の記述と食い違う情報が出た場合、上書きせず
conflicts に記録します
新しく見つかった人物はそのまま保存し、既にいる人物への変更は承認待ちに回します。 抽出のたびに黙って書き換えると、作者が直した内容が消えるためです。溜まった変更は「資料管理 → 資料抽出 → 更新分を反映」で、内容を見てから取り込めます(操作メニューには未反映の件数が印として出ます)。
書き込みそのものは、元の内容を .novelai-recovery/ へ退避してから作り直す手順で行います。途中で失敗しても、元の内容が失われることはありません。
他のAIに設定資料の更新を頼む
Copilot・Claude Codeなど、ファイルを触れるAIならどれでも設定資料を更新できます。設定は 設定/ の中の普通のJSONだからです。
そのために、AI向けの定義を 設定/_schema/ に書き出しています。「設定資料集を出力」または抽出を実行すると作られます。
| ファイル |
中身 |
README.md |
日本語の注意書き。これがいちばん重要です |
character.schema.json ほか |
構造の定義(JSON Schema) |
注意書きには「作者メモは書き換えない」「作者が確定させた項目は触らない」といった約束が書いてあります。AIに頼むときは、このフォルダーを読ませてから指示してください。
例:「設定/_schema/README.md を読んでから、第5話の内容をもとに 設定/characters/ の人物を更新して」
変更されたら知らせます
外部から設定JSONが書き換えられると、拡張機能が気づいて通知します。内容を確認してから取り込めます。
書き換えを止めることはしません。 ファイルが正本なので、書き戻すと相手の作業が消えてしまいます。気づいて知らせるところまでが役目です。
JSONとして壊れている場合は取り込まず、エラーを表示します。勝手に修復することはありません。
生成物(characters.md などの資料、_schema/ の定義)は監視の対象外です。編集しても次の生成で上書きされます。
相談で使う検索
相談すると、質問に近い場面を作品全体から探してAIに渡します。探す先は3つです。
- 本文(原稿)
- 設定資料(登場人物・場所・スキル・組織・世界観)
- 各話あらすじ
渡すときに出どころを書きます(《本文/第105話》)。設定資料とあらすじは本文からAIが作ったものなので、本文と食い違うときは本文を優先します。 作者ご自身が書いた「作者メモ」には別の印を付けます。
追加のものは何も要りません。 これだけで、これまでより答えられる質問が増えます。
さらに強くする(任意)
「AI設定 → 相談で使う検索 → 意味検索(ベクトルDB)の準備」から入れられます。入れると、言い換えで聞いたときにも見つかりやすくなります(例:「妬ましさを感じる場面」→「嫉妬」の場面)。
|
かかるもの |
| 一度だけ |
埋め込みモデルの取得(約1.2GB) |
| 作品ごと |
索引づくり(78.5万字・219話で約48秒) |
| 置き場所 |
同じ作品で約10MB(.aiwriter/cache/ なのでGitHubへは送りません) |
索引づくりは手元のOllamaで行うので料金はかかりません。 本文を直したときは、変わった話のぶんだけ自動で追加します(1話ぶんで約0.2秒)。
既定は「切」です。非力なパソコンでは切ったままで構いません。 切っていても、質問を使って場面を探すこと自体は行われます。処理の途中で詰まった場合は、自動で1回あたりの量を減らして続けます。
感情曲線(各話の盛り上がりと明暗)
「各話あらすじを生成」を実行すると、あらすじと一緒にその話の感情値も測ります。設定/synopsis.md の作品紹介文と各話あらすじの間に、話数順の起伏がグラフとして入ります。
- 盛り上がり(0〜10):山と谷、平坦な区間、クライマックスの位置が見えます
- 明暗(−5〜+5):暗い話が続いていないか、救いをどこに置いたかが見えます
- 話ごとに「主だった感情(喜怒哀楽)」と、そう判断した理由も表に出します
あらすじと同じ1回の呼び出しで測るので、AIの料金は増えません。
グラフは図(SVG)と文字の2通りで置いています。図が表示されない場所(GitHub上での閲覧など)でも、文字のほうで起伏が読めます。
盛り上がり ▃▆███▆▁▆ (5〜8)
明暗 ▅▁█▁▁▁▅▁ (-2〜+3)
縦軸は「実際に出ている幅」へ引き伸ばしています(図の横に幅を書いています)。感情値は1話ずつ独立に測るため値が狭い範囲に固まりやすく、0〜10の目盛りのままだと起伏がつぶれて読めないためです。数値そのものではなく、山と谷の形を見てください。 AIが測った目安なので、測り直すと多少変わります。
既にあらすじを作ってある場合:感情値を出すには、各話あらすじを一度作り直してください(あらすじの作り方を変えたためです)。Ollamaなら無料です。
本文からプロットを起こす
「執筆AI支援 → 本文からプロットを起こす」。既に書いた本文から、ログライン・テーマ・世界観・舞台・人称・主人公の行動原理・あらすじ・主要人物を組み立てて 設定/plot.md へ書きます。
材料には各話あらすじを使うので、先に「各話あらすじを生成」を済ませてください。あらすじが無いと冒頭だけを見て中盤以降を推測することになり、本文に無い筋書きが混ざります。あらすじが無い場合は実行せず、先に作るよう案内します。
本文全体を読み直さないため、AIの呼び出しは1回で済みます。
作者が既に書いた項目は、確認せずに書き換えません。 空の項目だけを埋め、書かれている項目は「今の内容」と「AIの案」を並べて、置き換えるかどうかを選べます。作者が独自に足した見出しもそのまま残します。
表記ゆれを検知
「執筆AI支援 → 校正・校閲 → 表記ゆれを検知」。「良い/よい」のように、同じ語が2通りの書き方で使われている箇所を作品全体から探します。AIを使わないので料金はかかりません。
組ごとに「揃えるかどうか」「どちらに揃えるか」を選ぶと、少数派の箇所が指摘として「AI指摘」パネルに並びます。1件ずつ確認して適用できます。
対象は、登録済みの固有名詞のひらがな・カタカナ揺れと、厳選した22組のかな⇔漢字の揺れです。「事/こと」「時/とき」のような語は、漢字側が熟語(事件・時間)に紛れて誤検出になるため、あえて対象にしていません。
AIに相談する
左サイドバーの「AIに相談」、本文の右クリック、または「執筆AI支援 → AIに相談する」。いま開いているファイルについて、日本語で質問できます。本文でもプロットでも設定資料でも構いません。
- 範囲を選んでから聞くと、そこについての相談として扱います
- 返事には「次の一手」の選択肢が2〜4個付きます。押しても、番号を打っても選べます
- 材料が足りないとき、AIは作品フォルダー内の別のファイルを読ませてほしいと求めます(読むのは登録済みの作品フォルダーの中だけです)
- プロット・作品紹介文・キャッチコピー・各話あらすじは、内容を確かめてボタンを押すと書き込めます(押すまで何も書き換わりません。小説の本文は対象外です)
- 誤字脱字や表記ゆれを頼むと、専用機能の起動を提案します
- 該当箇所を指して「そこを見せて」ができます。ファイルを開き、その一文を光らせます
- この拡張機能の使い方も聞けます(「誤字脱字ってどうやるの?」など)
有料のAIを使っているときは、上部に「有料・送るたびに課金」と表示し、会話ごとに一度だけ確認を取ります。
ログ
AI処理の記録は「ログを開く」(ヘルプ)で開けます。あわせて 作品フォルダ/.aiwriter/logs/actions.log にも保存されるので、VS Codeを閉じたあとでも読み返せます(Gitの同期対象外です)。
抽出では、話ごとに「AIへ送信」「応答を受信(所要秒数)」を記録します。途中で止まった場合、記録は送信の行で終わります。 どの話で止まったかは、このファイルの最後の行を見れば分かります。
ログには本文そのものは書きません。APIキーらしき文字列は伏せ字にします。1MBを超えると古いほうから捨てます。
過去の版に戻す(復元)
操作メニューの「作品管理 → GitHubで作品管理 → 復元」。書き直して失敗したときに、送信済みの過去の版へ原稿を戻せます。
日時と件名の一覧から戻したい版を選ぶと、戻すと何が起きるかを先に見せます。
2026-08-13 09:15 の版に戻しますか?
12 個のファイルが、その時点の内容に戻ります。
2 個のファイルが消えます(その版より後に作ったもの):
本文/013.txt、本文/014.txt
1 個のファイルが復活します:
設定/plot.md
いまの原稿は、戻す前に履歴へ自動で残します。あとから戻し直せます。
履歴は消しません。 戻す前にいまの原稿を「復元の前に自動保存」として記録し、戻したことも1つの変更として記録します。やり直したくなったら、もう一度「復元」で1つ前の版を選べば戻せます。取り返しのつかない操作にはしていません。
Ollamaのセットアップ
操作メニューの「拡張機能の設定 → セットアップを開始 → Ollamaのセットアップ」。Ollamaは無料で、原稿を外部に送らずに使えます。
導入・起動・モデル取得の3段階を順に確かめ、足りないものだけを案内します(入っていなければ配布ページ、起動していなければその場で起動、モデルが無ければ ollama pull をターミナルで実行)。勝手にインストールすることはありません。
安全対策
- 競合マーカーの検出:Gitの未解決競合(
<<<<<<<)を含むファイルは処理対象から除外します
- 未保存の変更:AI処理の前に保存を促し、保存失敗または保存後もdirtyな文書が残る場合は処理を開始しません
- 人物設定の再検査:人物JSONは開始時と保存直前に再検査し、作者の未保存編集があれば抽出結果を書き込みません
- 壊れたJSON:読み込めない設定ファイルがある場合、上書きせず処理を中止します
- 回復ファイル:安全に自動置換できない既存ファイルの提案内容は
.novelai-recovery/ へ置きます。登録済み作品も起動時に移行し、作者の既存バイト列を置換せず .gitignore へ除外ルールを一度だけ追記します
設定
| 設定 |
既定値 |
説明 |
novelai.ollama.endpoint |
http://localhost:11434 |
OllamaのURL |
novelai.ollama.executablePath |
""(自動検出) |
ollama 実行ファイルの場所。拡張機能からOllamaを起動するときにだけ使います |
novelai.ollama.numCtx |
0(自動) |
AIへ渡すコンテキスト長。Ollamaは既定値が小さく、指定しないと入力が切り捨てられます |
novelai.ollama.timeoutSeconds |
180 |
1回の呼び出しのタイムアウト |
novelai.claude.timeoutSeconds |
300 |
Claudeの1回の呼び出しのタイムアウト。新しいモデルは思考しながら答えるため3分を超えることがあり、短すぎると応答の直前で打ち切ってそのチャンクを丸ごと失います |
novelai.openai.endpoint |
https://api.openai.com/v1 |
ChatGPTのURL。互換サービスを使う場合のみ変更します |
novelai.openai.timeoutSeconds |
180 |
ChatGPTの1回の呼び出しのタイムアウト |
novelai.openai.contextWindow |
128000 |
ChatGPTのコンテキスト長。APIから取得できないため、実際より大きいと入力が切り捨てられます |
novelai.gemini.endpoint |
https://generativelanguage.googleapis.com/v1beta |
GeminiのURL。通常は変更不要です |
novelai.gemini.timeoutSeconds |
180 |
Geminiの1回の呼び出しのタイムアウト |
novelai.maxOutputTokens |
16384 |
1回の応答で受け取る最大トークン数。Claude・ChatGPT・Geminiへはこの値をそのまま送ります。出力は入力より単価が高いので、必要以上に大きくしないでください。Ollamaへは送りませんが、確保するコンテキスト長の計算には使われます |
novelai.chunkChars |
0(自動) |
1チャンクの文字数 |
novelai.mergeChunkChars |
6000 |
短い話をまとめて1回で送るときの目安。1回ごとに本文とは別に約5,600字の指示を送るため、1話が短い作品ではまとめると呼び出し回数と送信量(=料金)が下がります。0 でまとめません |
novelai.git.autoFetch |
true |
別の環境の変更を自動で取得します。取得(fetch)だけで、原稿は書き換わりません。 取り込み(pull)は必ず作者の操作から行います |
novelai.git.autoFetchIntervalMinutes |
10 |
自動取得の最小間隔。短くすると回線の遅い環境で操作が重くなります |
novelai.git.syncCache |
false |
抽出キャッシュをGitの同期対象にするかどうか。切り替えると .gitignore へ規則を1行追記します |
novelai.vectorSearch.enabled |
false |
相談で使う意味検索(ベクトルDB)を使うかどうか。切っていても、質問を使って場面を探すこと自体は行われます(語句一致)。入にすると言い換えでの質問にも当たりやすくなりますが、埋め込みモデルの取得(約1.2GB)と作品ごとの索引づくりが要ります。非力な機械では切ったままで構いません |
novelai.vectorSearch.model |
bge-m3 |
意味検索に使う埋め込みモデル(Ollama)。変更すると索引は作り直しになります |
novelai.vectorSearch.autoUpdate |
true |
相談を始めるときに、変更ぶんだけ索引を自動で追加します。切ると「検索用の索引を作る」を実行するまで更新されません |
novelai.chatLog.enabled |
true |
AIとの相談のやり取りを .aiwriter/logs/chat.md に残します。何を材料にAIが何を答えたかを後から確かめられます。原稿の一部を含みます(この場所はGitHubへ送られません)。残したくない場合は切ってください |
novelai.claude.maxOutputTokens はClaude専用だった旧設定です。novelai.maxOutputTokens に置き換わりました。
現在の制約
- AIの結果は作者が確認してください。 抽出結果は本文との逐語照合で根拠のないものを除きますが、実モデルの精度を保証するものではありません。とくに小型のローカルモデルでは、代名詞や話者の取り違え、抽出漏れが残ります。
- 本文(原稿)をAIが勝手に書き換えることはありません。 誤字脱字・表記ゆれの指摘は、作者が1件ずつ「適用」を押したときだけ本文に入ります。相談パネルから書き込めるのはプロット・紹介文・あらすじで、本文は対象外です。
- 本文へ書き戻すときは、読み込んだ時点の内容と変わっていないかを照合します。外部ツールで編集されていた場合は書き込みを中止します。文字コード・改行コードは保持し、変更箇所だけを差し替えます。
- 実際のAIへの接続確認は通常のCIに含めません。資格情報やローカルモデルが必要なため、手動で確認しています。CIが通っていることは、実モデルの品質や可用性を保証しません。
- 推敲・プロット逸脱検知・矛盾検知は未実装です。 ルビ機能、締切からの逆算、提供先別の設定資料エクスポートも未実装です。
- 設定資料への書き込みを相談パネルから行うことは、まだできません(プロット・紹介文・あらすじのみ)。
アンインストール
拡張機能ビューから「統合小説執筆環境」をアンインストールするか、次を実行します。
code --uninstall-extension nonahisa.novel-ai-assistant
アンインストールしても、原稿、.aiwriter/、設定/characters/ は削除されません。不要な場合は内容を確認して手動で削除してください。
今後の実装予定
- 推敲:冗長な表現、同語反復、係り受けの不明瞭さ、長すぎる文の指摘
- プロット逸脱・間延び検知:書いた話がプロットから離れていないかの確認
- 矛盾検知:設定資料と本文の食い違いの検出
- プロットモード:対話しながらプロットを組み立てる専用画面(本文からの逆算は実装済み)
- ルビ機能:
{漢字|かんじ} 記法のプレビューと、投稿サイト記法への変換
- 設定資料エクスポート:コミカライズ・映像化・翻訳など、提供先に合わせた書き出し
- 設定資料への書き込み:相談パネルから人物・場所などを直せるようにする
ライセンス
この拡張機能は MIT ライセンスです(LICENSE)。自由に使い、改変し、再配布できます。作者は何の保証も負いません。
あなたが書いた小説・プロット・設定資料は、このライセンスの対象外です。 作品の権利はあなたのものです。この拡張機能が作ったファイル(設定資料集・IME辞書・あらすじなど)についても同じです。
拡張機能には次のライブラリを組み込んで配布しています。著作権はそれぞれの権利者に属します。全文は THIRD-PARTY-NOTICES.md にあります。
| ライブラリ |
ライセンス |
用途 |
@anthropic-ai/sdk |
MIT |
Claudeへの接続 |
iconv-lite |
MIT |
Shift_JIS の読み書き |
diff |
BSD-3-Clause |
本文の差分 |