Ollamaをfile://からfetch()でアクセスする
[質問]
ollamaに file:// スキームの HTMLファイルからfetch()でアクセスできますか
[回答] Gemini
結論から申し上げますと、通常のブラウザ環境(JavaScript)から file:// スキームで開いたHTMLファイルを使って、OllamaのAPI(http://localhost:11434)に fetch() でアクセスすることは、セキュリティ制限(CORS)により原則できません。
「ローカルファイルなんだからいいじゃないか」と感じるかもしれませんが、ブラウザにとっては非常に高い壁があります。
なぜできないのか?(CORSの壁)
ブラウザには同一生成元ポリシー(Same-Origin Policy)という厳格なルールがあります。
- Origin(生成元)の不一致:
file://path/to/index.htmlとhttp://localhost:11434は、プロトコル(file vs http)もドメインも異なるため、別々のサイトとみなされます。 - file:// の特殊性: 多くのブラウザにおいて、
file://スキームはセキュリティ上の理由から「Originがnullまたは一意」として扱われ、外部へのリクエストが厳しく制限されます。
解決策:どうすればアクセスできるか
この問題を回避して Ollama と連携させるには、主に3つの方法があります。
1. ローカルサーバーを立てる(推奨)
HTMLファイルを file:// で直接開くのではなく、簡単なローカルサーバー経由で(http://localhost:8000 など)開きます。
- 手順: ターミナルでHTMLのあるフォルダに移動し、以下を実行します。
- Pythonがある場合:
python -m http.server 8000 -
Node.jsがある場合:
npx serve -
メリット: 標準的なWeb開発の手法であり、セキュリティ的にも健全です。
2. Ollama 側の CORS 設定を変更する
Ollama サーバー自体に「どのサイトからのアクセスを許可するか」を教えてあげる必要があります。
-
設定方法 (macOS/Linux): 環境変数
OLLAMA_ORIGINSを設定して再起動します。 -
Windows: システム環境変数に
OLLAMA_ORIGINSを追加し、値に*または特定のURLを入れてOllamaを再起動します。
3. ブラウザのセキュリティ設定を一時的に下げる(非推奨)
ブラウザの起動オプションで ---disable-web-security を指定する方法もありますが、PC全体のセキュリティが脆弱になるため、開発中であってもおすすめしません。
実装のヒント
もしローカルサーバー経由でアクセスする場合、以下のようなコードで Ollama を叩けます。
async function askOllama(prompt) {
const response = await fetch('http://localhost:11434/api/generate', {
method: 'POST',
body: JSON.stringify({
model: 'llama3', // インストール済みのモデル名
prompt: prompt,
stream: false
})
});
const data = await response.json();
console.log(data.response);
}
まずは Python などで簡易サーバーを立ててみる のが一番スムーズかと思います。
もし特定のプログラミング言語(PythonやNode.js)を使ってツールを作りたいということであれば、そちらに最適なライブラリをご紹介しましょうか?