# AIアシスタント

FolderSkinは、言葉の説明からスキンを生成できます。方法は2つあります。

- **ローカルモデル**は、あなたのコンピュータ上で無料で描きます。一度セットアップすれば（FLUX.2 [klein] 4B。ダウンロードはMacで4.6GB、それ以外で5.2GBです）、オフラインで動き、キーは不要で、どこにも何も送りません。macOS 14以降のAppleシリコン搭載Mac、WindowsとLinuxのPCで動きます。
- **自分のキーを使う**場合は、すでにアカウントを持っているプロバイダのAPIキーを貼り付けます。キーはコンピュータ上の非公開のファイルに保存され、FolderSkinはあなたのコンピュータからそのプロバイダと直接やり取りします。

どちらを使うかは**設定 → AIプロバイダ**で選びます。チェックマークは、ローカルモデルがセットアップ済みであること、またはプロバイダにキーが設定されていることを示します。

![設定のAIプロバイダ画面。ローカルモデルと7つのプロバイダが並び、それぞれにチェックマークか「キーなし」が付いていて、その下にこのコンピュータのモデルが表示されている](https://folderskin.app/docs/images/ai-providers.webp)

FolderSkinのサーバも、プロキシも、同梱のキーも、FolderSkinが費用を肩代わりする無料枠もありません。キーを使う場合、**生成**を押すまでは何も送信されません。送られるのは、プロンプト、選んだサイズ、そして参照画像を選んだ場合はその画像です（参照画像なしでフォルダ全体を描く場合は、FolderSkin自身の空のフォルダテンプレートが送られます）。

## キーの保存場所

キーは暗号化され、FolderSkin専用のフォルダに、あなたのユーザアカウントだけが読める形で保存されます。

| | |
|---|---|
| macOS | `~/Library/Application Support/app.folderskin.desktop/keys.json` |
| Windows | `%APPDATA%\app.folderskin.desktop\keys.json` |
| Linux | `~/.config/app.folderskin.desktop/keys.json` |

キーは書き込む前にAES-256-GCMで暗号化されます。暗号鍵は、`keys.json`の隣にある`keys.secret`のランダムな秘密値と、このコンピュータのハードウェアIDから（HKDF-SHA256で）導出されます。そのため`keys.json`だけでは何もわからず、2つのファイルを別のコンピュータにコピーしても、そこでは開けません。新しいコンピュータでは、キーをもう一度入力してください。どちらのファイルも所有者だけが読み書きできる権限（0600）で作られ、アトミックに書き込まれます。ただし、すでにあなたの権限で動いているプログラムは両方のファイルを読めてしまい、これはどんなファイルでも防げません。防げるのはシステムのキーチェーンだけですが、その場合は後述のパスワード入力が必要になります。

システムのキーチェーンを使わない理由は次のとおりです。macOSは、キーチェーンに保存した項目を、保存したアプリの署名と厳密に結び付けます。オープンソースのビルドは署名なしかアドホック署名であることが多く、再ビルドやアップデートのたびに別のアプリと見なされて、ログインパスワードを何度も求められてしまいます。ダウンロードしたばかりのアプリからパスワードを求められると、まさに悪意のあるアプリのように見えてしまいます。そこでFolderSkinは、キーチェーンをまったく使いません。

キーはリクエストの瞬間にだけ読み込まれ、エラーメッセージに含まれることも、アプリのウィンドウに返されることもありません。プロバイダのダイアログで**キーを削除**を押すとファイルから削除され、`keys.json`を削除するとすべてのキーが消えます。

## 2つの形

これはいちばん大事な選択ですが、品質の問題ではありません。

**絵だけ**では、モデルに1024 × 958の平面の画像を描かせ、FolderSkinがそれを自分のフォルダテンプレートにはめ込みます。写真を追加するときとまったく同じです。形はFolderSkinが決めるので、どのアイコンサイズでも、すべてのスキンがきれいにそろいます。透明に対応していないプロバイダを含め、どのプロバイダでも使えます。これが既定の方法で、たいていの場合はこれが正解です。

**フォルダ全体**では、モデルに透明な背景またはキーイング用の背景の上にフォルダそのものを描かせ、その画像をコンポジターを通さずにそのままアイコンにします。ピクセル単位で正確な形はあきらめることになりますが、そのかわり、本物の立体感があり、フォルダの上端からはみ出すようなアートワークが手に入ります。

モデルが画像をもとに描ける場合（OpenAI、Grok、Gemini）で、画像を添付していないときは、FolderSkinが自分の空のフォルダテンプレートをその画像として送ります。明るいグレー一色で塗ったFolderSkinのフォルダを、指定されたサイズの単色マゼンタの中央に置いたものです（`compositor::blank_template`）。プロンプトでは、このフォルダをそのまま描き直し、輪郭、タブ、紙の帯、サイズ、位置を保って、マゼンタは単色のまま残すようモデルに指示します。こうすると、モデルが勝手に考え出したフォルダではなく、FolderSkinのシルエットを保った結果になります。テンプレートがマゼンタの上にあるので、透明を返せるモデルであっても、この場合は必ず後述のキーイングの方法で処理します。自分で添付した参照画像は、これまでどおりアートワークとして使われます。

## 透明部分の扱い

モデルは2つのグループに分かれ、FolderSkinは選んだモデルに合った方法を使います。

- **アルファに対応**：リクエストで透明な背景を指定し、返ってくるPNGにはすでに透明な背景があります。FolderSkinは透明な余白を切り詰めるだけです。
- **アルファに非対応**：プロンプトで、単色のマゼンタ（`#FF00FF`）の上にフォルダだけを描くよう指示します。FolderSkinはそのあとでその色を取り除き、やわらかいふちににじんだマゼンタも取り除いて（切り抜いた画像にピンクのにじみが出ないようにするための処理です）、余白を切り詰めます。マゼンタを使う理由は2つあります。フォルダの絵にはまず出てこない色であること、そして背景が描かれていないことを検出できることです。周囲がマゼンタでなければ、モデルが指示を無視したということなので、FolderSkinは壊れたアイコンを適用せず、そのことを伝えます。

キーイングのコードは`crates/folderskin-core/src/matte.rs`にあり、マゼンタの背景の上に本当にピンクの被写体がある場合も含めて、ユニットテストされています。

## プロンプト

`crates/folderskin-ai/src/prompts.rs`は、あなたの言葉に決まりごとを加えてプロンプトを組み立てます。効いているのは、スタイルに関する部分ではなく、構造に関する部分です。

- **「絵だけ」用のプロンプト**は、フォルダ、アイコン、デバイス、モックアップを描くことを禁じ、上部の8分の1と周囲6%の余白を、何も描かない領域として確保します。テンプレートがその部分を切り取ったり曲げたりするからです。
- **「フォルダ全体」用のプロンプト**は、構造をはっきり固定します。パーツはちょうど3つ（タブ1つ、見えている紙のふち1つ、前面パネル1つ）で、レイヤーを追加しないよう明示的に指示します。この一文がないと、モデルは決まって重なったフォルダや二重のタブを描いてしまいます。
- **テンプレート用のプロンプト**（`compose_on_template`）は、空のテンプレートと組み合わせて使います。添付した画像が描き直す対象のフォルダそのものであること、形と構図はそのまま保つこと、アイデアを背面と前面のパネルにまたがって描くこと、マゼンタは単色のまま残すことを指示します。
- **どのプロンプトも**、最後に厳密な出力の条件で締めくくります。ピクセルサイズ、被写体だけを描くこと、そしてキーカラーか透明な背景のどちらかを指定します。

これらのテンプレートは編集できます。普通のRustの文字列定数で、要となるフレーズが含まれていることをテストで確認しています。

## 料金

リクエストはすべて、プロバイダからあなた自身のアカウントに請求されます。生成画面では、ボタンを押す前にモデルのおおよその料金が表示されます。FolderSkinは1回押すごとにちょうど1回だけリクエストを送り、勝手にリトライすることはありません。

## ビルドとクロスコンパイル

プロバイダの層はTLSに`rustls`を使っていて、その暗号バックエンド（`aws-lc-sys`）はCのコードをコンパイルします。各プラットフォームのCIランナーでは問題なくビルドでき、FolderSkinのリリースもこの方法で作っています。あるデスクトップOSから別のOS向けにクロスコンパイルする場合（たとえばMacで`cargo check --target x86_64-pc-windows-msvc`を実行する場合）は、ターゲット向けのCのクロスツールチェーンが必要で、ないと`aws-lc-sys`のビルドスクリプトで失敗します。ワークスペースのそれ以外の部分は、ツールチェーンなしでもクロスチェックできます。

## 表示されるエラーメッセージ

| メッセージ | 何が起きたか |
|---|---|
| 「add your … API key first」 | そのプロバイダのキーが保存されていません |
| 「that key was rejected by …」 | プロバイダが401または403を返しました |
| 「… is rate limiting you right now」 | 429です。しばらく待ってから、もう一度試してください |
| 「the model drew a scene instead of a folder on a plain backdrop」 | フォルダ全体モードで、キーイングできる背景がありませんでした。もう一度試すか、「絵だけ」に切り替えてください |
| 「the provider returned something that is not an image」 | 形式が不正なレスポンスか、画像ではないレスポンスが返ってきました |

## チャットアシスタントで作ったフォルダ

ChatGPTやGrokなどのチャットアシスタントでフォルダ全体を描いて、**写真を追加**で取り込むこともできます。フォルダを、単色の#FF00FFの背景か、透明な背景の上に描くよう頼んでください。FolderSkinはどちらも認識し、自分のフォルダにもう一度はめ込むことはせずに、切り抜いて余白を詰めたうえで、画像をそのままアイコンとして使います。それ以外の画像は、テンプレート用のアートワークとして扱われます。正確なルールは[ARCHITECTURE.md](https://github.com/prajwal-svm/folderskin/blob/main/docs/ARCHITECTURE.md#artwork-or-a-finished-folder)にあり、マゼンタの紙の上にあるものの写真が、なぜ普通の画像のまま扱われるのかも説明しています。

## 生成したスキンの保存

生成したスキンは、取り込んだ画像と同じように、届いた瞬間にプロバイダ、モデル、プロンプトと一緒に保存されます。再起動後もギャラリーのマイスキンにあり、そこで削除するとディスクからも消えます。ファイルの保存場所は[ARCHITECTURE.md](https://github.com/prajwal-svm/folderskin/blob/main/docs/ARCHITECTURE.md#saved-skins)にあります。書き込みに失敗しても（ディスクがいっぱいの場合など）、スキンは失われず、そのセッションの間は残ります。

生成したスキンをみんなと共有するには、コミュニティパックにします。タグを付けてアプリの**コミュニティで共有**を使うか、保存したレンダリング画像のフォルダを`folderskin-tools packs make`でパックにしてください。どちらの方法も[PACKS.md](https://folderskin.app/ja/docs/packs/)で説明しています。画像がフォルダにどう載るかは[SKINS.md](https://folderskin.app/ja/docs/skins/)をご覧ください。
