コンテンツにスキップ

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.htmlhttp://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 を設定して再起動します。

    export OLLAMA_ORIGINS="file://*,http://localhost:*"
    ollama serve
    

  • 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)を使ってツールを作りたいということであれば、そちらに最適なライブラリをご紹介しましょうか?