RORK LABEN
TOOLING — Rorkの開発者向けリポジトリが動き続けています。rork-xcodeが7月16日、rork-deviceが7月15日、rork-plistが7月13日に更新されましたOPUS46 — RorkでClaude Opus 4.6が稼働しています。Rork MaxはClaude Codeを土台にアプリを組み立てる設計ですSIM — ブラウザ上で動くクラウドのiOSシミュレータを備え、実機へのインストールは1クリック、App Storeへの提出は2クリックと案内されていますMAX — Rork MaxはReact Nativeではなく純粋なSwiftを出力します。iPhone・iPad・Apple Watch・Apple TV・Vision Pro、そしてiMessageまでが射程ですNATIVE — HealthKit、ARKitとLiDAR、NFC、Dynamic Island、Live Activities、Metalによる3D、Core MLのオンデバイス推論まで扱えますSEED — RorkはLeft Lane Capitalが主導する1,500万ドルのシードラウンドを実施し、Peak XVとa16z Speedrunが参加しましたTOOLING — Rorkの開発者向けリポジトリが動き続けています。rork-xcodeが7月16日、rork-deviceが7月15日、rork-plistが7月13日に更新されましたOPUS46 — RorkでClaude Opus 4.6が稼働しています。Rork MaxはClaude Codeを土台にアプリを組み立てる設計ですSIM — ブラウザ上で動くクラウドのiOSシミュレータを備え、実機へのインストールは1クリック、App Storeへの提出は2クリックと案内されていますMAX — Rork MaxはReact Nativeではなく純粋なSwiftを出力します。iPhone・iPad・Apple Watch・Apple TV・Vision Pro、そしてiMessageまでが射程ですNATIVE — HealthKit、ARKitとLiDAR、NFC、Dynamic Island、Live Activities、Metalによる3D、Core MLのオンデバイス推論まで扱えますSEED — RorkはLeft Lane Capitalが主導する1,500万ドルのシードラウンドを実施し、Peak XVとa16z Speedrunが参加しました
記事一覧/開発ツール
開発ツール/2026-05-06初級

Rorkで作るAIアプリにオフラインエッジモデルを組み込む — ネット接続不要のAI機能実装入門

Rorkで開発するアプリにオフラインで動くエッジAIを組み込む方法を解説。ネット環境がない場面でもAI機能を提供できるアプリの作り方、ユースケース、実装のポイントを初心者向けに紹介します。

Rork515エッジAI4オフラインAI2ローカルLLM2Ollama2モバイルアプリ12AIアプリ開発7

Rorkで「AIチャット機能付きアプリを作りたい」というとき、最初に思い浮かぶのはOpenAIやGeminiのAPIでしょう。でも、「地下鉄の中でも使える」「センシティブなデータを送信したくない」「APIコストをゼロにしたい」という要件が加わると、話が変わります。

こういったケースで選択肢になるのが、デバイス上またはローカルサーバー上で動く「エッジAI」です。RorkアプリにOllamaベースのローカルAI機能を組み込む基本的な考え方と実装のポイントを順番にご紹介します。

エッジAIを使うべきシチュエーション

全てのAIアプリにエッジAIが適しているわけではありません。どんなケースで検討すべきかを整理します。

向いているケース

  • 日記・メモアプリなど、プライバシーを最優先するアプリ
  • 登山・キャンプガイドなど、電波が届かない場所で使うアプリ
  • 医療・法律など、データを外部に送信できないアプリ
  • APIコストを抑えたい無料アプリ

向いていないケース

  • 最新のニュースや時事情報が必要なアプリ
  • 高い創造性や汎用的な知識が必要なアプリ
  • デバイスのスペックが低い環境をターゲットにするアプリ

Rorkアプリからローカルサーバーへの接続

最も現実的な構成は「デバイス内ではなく、同じLAN内のPCでOllamaを動かし、アプリからHTTPで接続する」アプローチです。デバイスのスペック制限を回避しながら、ネット環境なしで動作します。

Rorkアプリ側からは、OpenAI互換のAPIエンドポイントとして呼び出せます:

// Rorkアプリ内でのAPI呼び出し(Expo/React Native)
const callLocalAI = async (userMessage) => {
  // OllamaはOpenAI互換のエンドポイントも提供
  const response = await fetch('http://192.168.1.10:11434/api/generate', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      model: 'gemma4:9b',
      prompt: userMessage,
      stream: false
    })
  });
  
  const data = await response.json();
  return data.response;
};

192.168.1.10 はOllamaを動かしているPCのローカルIPアドレスに変更してください。同じWiFiに繋がっていれば、スマートフォンからアクセスできます。

接続できない場合のフォールバック実装

ローカルサーバーに接続できない状況(外出先など)のためのフォールバックも実装しておきましょう:

// フォールバックありのAI呼び出し
const callAI = async (userMessage) => {
  // まずローカルを試みる
  try {
    const controller = new AbortController();
    const timeoutId = setTimeout(() => controller.abort(), 3000); // 3秒でタイムアウト
    
    const response = await fetch('http://192.168.1.10:11434/api/generate', {
      method: 'POST',
      signal: controller.signal,
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({
        model: 'gemma4:9b',
        prompt: userMessage,
        stream: false
      })
    });
    
    clearTimeout(timeoutId);
    const data = await response.json();
    return { text: data.response, source: 'local' };
    
  } catch (localError) {
    // ローカルが使えない場合はクラウドAPIにフォールバック
    console.log('ローカルAI接続失敗、クラウドにフォールバック');
    return await callCloudAI(userMessage);
  }
};

Rorkでのシンプルなチャット実装

Rorkを使ってこの仕組みを組み込んだ基本的なチャット画面の構成:

// ChatScreen.js(Rorkで生成されるコンポーネントに組み込む)
import React, { useState } from 'react';
import { View, TextInput, FlatList, TouchableOpacity, Text } from 'react-native';
 
export default function ChatScreen() {
  const [messages, setMessages] = useState([]);
  const [input, setInput] = useState('');
  const [loading, setLoading] = useState(false);
 
  const sendMessage = async () => {
    if (!input.trim() || loading) return;
    
    const userMessage = { id: Date.now(), role: 'user', text: input };
    setMessages(prev => [...prev, userMessage]);
    setInput('');
    setLoading(true);
    
    try {
      const response = await callAI(input);
      const aiMessage = {
        id: Date.now() + 1,
        role: 'assistant',
        text: response.text,
        isLocal: response.source === 'local'
      };
      setMessages(prev => [...prev, aiMessage]);
    } catch (error) {
      console.error('AI呼び出しエラー:', error);
    } finally {
      setLoading(false);
    }
  };
 
  return (
    <View style={{ flex: 1, padding: 16 }}>
      <FlatList
        data={messages}
        keyExtractor={item => item.id.toString()}
        renderItem={({ item }) => (
          <View style={{
            alignSelf: item.role === 'user' ? 'flex-end' : 'flex-start',
            backgroundColor: item.role === 'user' ? '#007AFF' : '#E5E5E5',
            borderRadius: 12,
            padding: 12,
            marginBottom: 8,
            maxWidth: '80%'
          }}>
            <Text style={{ color: item.role === 'user' ? 'white' : 'black' }}>
              {item.text}
            </Text>
            {item.isLocal && (
              <Text style={{ fontSize: 10, color: '#666', marginTop: 4 }}>
                🔒 オフライン処理
              </Text>
            )}
          </View>
        )}
      />
      
      <View style={{ flexDirection: 'row', marginTop: 8 }}>
        <TextInput
          value={input}
          onChangeText={setInput}
          placeholder="メッセージを入力..."
          style={{ flex: 1, borderWidth: 1, borderRadius: 8, padding: 8 }}
        />
        <TouchableOpacity
          onPress={sendMessage}
          disabled={loading}
          style={{ marginLeft: 8, backgroundColor: '#007AFF', borderRadius: 8, padding: 8 }}
        >
          <Text style={{ color: 'white' }}>送信</Text>
        </TouchableOpacity>
      </View>
    </View>
  );
}

まずは試してみることから

Rorkで「Ollamaに繋がるチャットアプリ」を作ることは、難しくありません。PCでOllamaを起動し、Rorkで生成したアプリのAPIエンドポイントをローカルIPに向けるだけです。

プライバシー重視のアプリや、オフライン対応が必要なアプリの開発を考えているなら、まず実際に動かしてみることをお勧めします。より高度な実装(完全オフラインのオンデバイスAI、ファインチューニングモデルの配布、バックグラウンド推論)については、プレミアム記事で詳しく解説しています。

12年の個人開発で見えてきたこと

リリース直後にチェックしているもの

  • クラッシュレポートの上位エラーを24時間ごとに確認しているか
  • AdMob/StoreKit の収益ダッシュボードに異常検知が出ていないか
  • ユーザーレビューに技術的な指摘が含まれていないか
シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

もしこの記事がお役に立ちましたら、チップ(¥150)で応援いただけると大変励みになります。広告なしでの運営を続けるため、皆さまのご支援が大きな力になっています。

関連記事

開発ツール2026-05-06
RorkアプリにエッジAIを本番実装する — Ollama連携・ストリーミング・会話履歴管理・コスト設計まで
RorkアプリにOllama経由のローカルLLMを本番レベルで組み込む完全ガイド。トークンストリーミング・会話履歴のSQLite管理・クラウドフォールバック設計・個人開発者の収益モデルまで体系的に解説します。
開発ツール2026-04-28
Rork で作るモバイルアプリの AI バックエンド:Cloudflare Containers と Workers AI の使い分け実践ガイド
Rorkで作ったモバイルアプリのAI機能をCloudflare Containers と Workers AIでどう使い分けるか、実装コストと運用コストの両面から具体的に解説します。
開発ツール2026-03-20
Google Stitch × Rork — Vibe Design でアプリUIを設計し、Rork で即座に実装する方法
無料の Google Stitch で Vibe Design によりアプリの UI を設計し、Rork / Rork Max で即座にネイティブアプリとして実装する方法を解説。デザイン初心者でもプロ品質のアプリが作れる。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →