ウェブサイト検索

JavaScriptを使ったAIアシスタントのトレーニング方法:初心者ガイド


紹介

このチュートリアルでは、JavaScriptを使用してテキストを処理し、OpenAIのAPIを通じて画像を生成できるマルチモーダルAIアシスタントを構築します。あなたのアシスタントは、ReactとNext.jsで構築された現代的なChatGPTのようなインターフェースを備えており、会話を処理し、GPT-4oの視覚機能を利用して画像を作成することができます。

このチュートリアルの終わりまでに、自然な会話を行い、テキストの説明に基づいて画像を生成できる完全な機能を持つAIアシスタントを作成することができます。最新のJavaScriptフレームワーク、API統合、リアルタイムのAIインタラクションを処理するレスポンシブユーザーインターフェースの構築に関する実践的な経験を得ることができます。

さらに、あなたはAIアシスタントをApp Platformにデプロイし、DigitalOceanモデルコンテキストプロトコル(MCP)サーバーを使用して、クラウドインフラストラクチャとのシームレスな統合とスケーラブルなデプロイメント戦略を確保します。

前提条件

このチュートリアルを完了するためには、次のものが必要です:

  • ローカルマシンにNode.jsバージョン18以上がインストールされている必要があります。あなたのオペレーティングシステム用のNode.jsのインストール方法とローカル開発環境の作成に従ってください。
  • あなたのコンピュータにインストールされたCursorのようなコードエディタ。
  • OpenAIのAPIキー。OpenAIのプラットフォームでアカウントを作成することで取得できます。
  • JavaScriptとReactの基本的な知識。スキルを向上させるために、「JavaScriptのコーディング方法」シリーズをチェックしてください。
  • バージョン管理のためのGitHubアカウント。
  • あなたのCursor IDEにインストールされたDigitalOcean MCPサーバー。

ステップ 1 — 開発環境の設定

このステップでは、新しいNext.jsプロジェクトを作成し、AIアシスタントを構築するために必要な依存関係をインストールします。

最初に、create-next-appコマンドを使用して新しいNext.jsアプリケーションを作成します:

npx create-next-app@latest ai-assistant --typescript --tailwind --app

指示されたら、次のオプションを選択してください。

  • ESLintを使用しますか?はい
  • src/ディレクトリを使用しますか?はい
  • デフォルトのインポートエイリアスをカスタマイズしますか?いいえ

このコマンドは、TypeScript、Tailwind CSS、およびAIアシスタントを構築するために必要な依存関係を持つ新しいNext.jsプロジェクトを作成します。

次に、プロジェクトディレクトリに移動します。

cd ai-assistant

次に、チャットインターフェースを扱うためのOpenAI SDKと追加の依存関係をインストールします:

npm install openai react-markdown remark-gfm

この openai パッケージは、OpenAIのAPIと対話するための公式JavaScriptクライアントを提供します。 react-markdown と remark-gfm パッケージは、AIアシスタントからのフォーマットされた応答をレンダリングするのに役立ちます。

プロジェクトのルートに .env.local ファイルを作成して、OpenAI APIキーを保存してください:

touch .env.local

.env.localファイルにあなたのOpenAI APIキーを追加してください。

OPENAI_API_KEY=your_openai_api_key

your_openai_api_key_hereを実際のOpenAI APIキーに置き換えてください。この環境変数は、APIキーを安全に保ち、コードとは別に管理します。

次に、Next.jsと必要な依存関係を使って開発環境を設定しました。次のステップでは、AIリクエストを処理するAPIエンドポイントを作成します。

ステップ 2 — API エンドポイントの作成

このステップでは、AIリクエストを処理するためのAPIエンドポイントを作成します。

このステップでは、テキスト会話と画像生成リクエストの両方を処理するOpenAIのAPIとの通信を処理するNext.jsのAPIルートを作成します。

APIエンドポイントの新しいファイルを作成します。

mkdir -p src/app/api/chat
touch src/app/api/chat/route.ts

「src/app/api/chat/route.ts」を開き、APIリクエストを処理するために次のコードを追加します:

import { NextRequest, NextResponse } from 'next/server';
import OpenAI from 'openai';

const openai = new OpenAI({
  apiKey: process.env.OPENAI_API_KEY,
});

export async function POST(request: NextRequest) {
  try {
    const { messages, mode, model = 'gpt-4o' } = await request.json();

    // Validate input
    if (!messages || !Array.isArray(messages) || messages.length === 0) {
      return NextResponse.json(
        { error: 'Invalid messages format' },
        { status: 400 }
      );
    }

    if (mode === 'chat') {
      const completion = await openai.chat.completions.create({
        model: model,
        messages: messages,
        temperature: 0.7,
        max_tokens: 1000,
      });

      return NextResponse.json({
        content: completion.choices[0].message.content,
        role: 'assistant',
      });
    } else if (mode === 'image') {
      const lastMessage = messages[messages.length - 1];

      // Using DALL-E 3 for image generation
      // Note: As of 2025, GPT-4o with vision can analyze images but doesn't generate them
      // For image generation, we use DALL-E 3 which is the latest image generation model
      const imageResponse = await openai.images.generate({
        model: 'dall-e-3',
        prompt: lastMessage.content,
        n: 1,
        size: '1024x1024',
        quality: 'hd', // Use HD quality for better results
        style: 'vivid', // More vibrant and detailed images
      });

      return NextResponse.json({
        content: imageResponse.data[0].url,
        role: 'assistant',
        type: 'image',
      });
    }

    return NextResponse.json({ error: 'Invalid mode' }, { status: 400 });
  } catch (error) {
    console.error('API Error:', error);

    if (error instanceof OpenAI.APIError) {
      return NextResponse.json(
        { error: `OpenAI API error: ${error.message}` },
        { status: error.status || 500 }
      );
    }

    return NextResponse.json(
      { error: 'Failed to process request' },
      { status: 500 }
    );
  }
}

このAPIエンドポイントは、メッセージ配列とモードパラメータを含むPOSTリクエストを受け付けます。モードがチャットの場合、テキスト応答を生成するためにGPT-4oを使用します。モードが画像の場合、DALL-E 3を使用して画像を生成します。温度パラメータは応答のランダム性を制御し、0.7は創造性と一貫性の良いバランスを提供します。

あなたはテキストと画像生成のリクエストの両方を処理できるAPIエンドポイントを作成しました。次のステップでは、AIアシスタントのユーザーインターフェースを構築します。

ステップ3 — チャットインターフェースの構築

このステップでは、メッセージ履歴と入力処理を備えた、ChatGPTのデザインに似たモダンでレスポンシブなチャットインターフェースを作成します。

まず、チャットインターフェース用の新しいコンポーネントを作成します:

mkdir -p src/components
touch src/components/ChatInterface.tsx

コード src/components/ChatInterface.tsx を開き、次のコードを追加します:

'use client';

import { useState, useRef, useEffect } from 'react';
import ReactMarkdown from 'react-markdown';
import remarkGfm from 'remark-gfm';

interface Message {
  role: 'user' | 'assistant';
  content: string;
  type?: 'text' | 'image';
  model?: string;
}

const AVAILABLE_MODELS = [
  { id: 'gpt-4o', name: 'GPT-4o', description: 'Great for most tasks' },
  { id: 'o3', name: 'o3', description: 'Uses advanced reasoning' },
  { id: 'o4-mini', name: 'o4-mini', description: 'Fastest at advanced reasoning' },
  { id: 'o4-mini-high', name: 'o4-mini-high', description: 'Great at coding and visual reasoning' },
];

export default function ChatInterface() {
  const [messages, setMessages] = useState<Message[]>([]);
  const [input, setInput] = useState('');
  const [isLoading, setIsLoading] = useState(false);
  const [mode, setMode] = useState<'chat' | 'image'>('chat');
  const [selectedModel, setSelectedModel] = useState('gpt-4o');
  const [showModelDropdown, setShowModelDropdown] = useState(false);
  const messagesEndRef = useRef<HTMLDivElement>(null);
  const textareaRef = useRef<HTMLTextAreaElement>(null);

  const scrollToBottom = () => {
    messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });
  };

  useEffect(() => {
    scrollToBottom();
  }, [messages]);

  // Auto-resize textarea
  useEffect(() => {
    if (textareaRef.current) {
      textareaRef.current.style.height = 'auto';
      textareaRef.current.style.height = textareaRef.current.scrollHeight + 'px';
    }
  }, [input]);

  const handleSubmit = async (e: React.FormEvent) => {
    e.preventDefault();
    if (!input.trim() || isLoading) return;

    const userMessage: Message = { 
      role: 'user', 
      content: input,
      model: selectedModel 
    };
    setMessages(prev => [...prev, userMessage]);
    setInput('');
    setIsLoading(true);

    try {
      const response = await fetch('/api/chat', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({
          messages: [...messages, userMessage],
          mode: mode,
          model: selectedModel,
        }),
      });

      const data = await response.json();
      setMessages(prev => [...prev, { ...data, model: selectedModel }]);
    } catch (error) {
      console.error('Error:', error);
      setMessages(prev => [...prev, {
        role: 'assistant',
        content: 'Sorry, I encountered an error. Please try again.',
        model: selectedModel,
      }]);
    } finally {
      setIsLoading(false);
    }
  };

  const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {
    if (e.key === 'Enter' && !e.shiftKey) {
      e.preventDefault();
      handleSubmit(e as any);
    }
  };

  const clearConversation = () => {
    setMessages([]);
  };

  return (
    <div className="flex flex-col h-screen bg-gray-50">
      {/* Header */}
      <div className="bg-white border-b border-gray-200 px-4 py-2">
        <div className="max-w-3xl mx-auto flex items-center justify-between">
          <div className="flex items-center gap-3">
            <h1 className="text-lg font-semibold">ChatGPT 4o</h1>
            <div className="relative">
              <button
                onClick={() => setShowModelDropdown(!showModelDropdown)}
                className="flex items-center gap-2 px-3 py-1.5 text-sm text-gray-600 hover:text-gray-800 transition-colors"
              >
                <span>{AVAILABLE_MODELS.find(m => m.id === selectedModel)?.name}</span>
                <svg className="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
                  <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 9l-7 7-7-7" />
                </svg>
              </button>

              {showModelDropdown && (
                <div className="absolute top-full left-0 mt-1 w-80 bg-white rounded-xl shadow-lg border border-gray-200 py-2 z-50">
                  <div className="px-4 py-2 text-sm text-gray-500">Models</div>
                  {AVAILABLE_MODELS.map(model => (
                    <button
                      key={model.id}
                      onClick={() => {
                        setSelectedModel(model.id);
                        setShowModelDropdown(false);
                      }}
                      className={`w-full text-left px-4 py-3 hover:bg-gray-50 flex items-center justify-between group ${
                        selectedModel === model.id ? 'bg-gray-50' : ''
                      }`}
                    >
                      <div>
                        <div className="font-medium text-sm">{model.name}</div>
                        <div className="text-xs text-gray-500">{model.description}</div>
                      </div>
                      {selectedModel === model.id && (
                        <svg className="w-5 h-5 text-gray-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
                          <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M5 13l4 4L19 7" />
                        </svg>
                      )}
                    </button>
                  ))}
                  <div className="border-t border-gray-200 mt-2 pt-2">
                    <button className="w-full text-left px-4 py-3 hover:bg-gray-50 flex items-center justify-between text-sm">
                      <span>More models</span>
                      <svg className="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
                        <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 5l7 7-7 7" />
                      </svg>
                    </button>
                  </div>
                </div>
              )}
            </div>
          </div>

          <button
            onClick={clearConversation}
            className="p-2 text-gray-600 hover:text-gray-800 transition-colors"
          >
            <svg className="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
              <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 4v16m8-8H4" />
            </svg>
          </button>
        </div>
      </div>

      {/* Messages */}
      <div className="flex-1 overflow-y-auto">
        <div className="max-w-3xl mx-auto">
          {messages.length === 0 && (
            <div className="text-center py-24">
              <h2 className="text-3xl font-semibold text-gray-900 mb-2">How can I help you today?</h2>
            </div>
          )}

          {messages.map((message, index) => (
            <div
              key={index}
              className={`group ${
                message.role === 'user' ? '' : ''
              } px-4 py-6`}
            >
              <div className="max-w-3xl mx-auto flex gap-4">
                <div className={`w-8 h-8 rounded-full flex items-center justify-center flex-shrink-0 ${
                  message.role === 'user' 
                    ? 'bg-white border border-gray-300' 
                    : 'bg-black text-white'
                }`}>
                  {message.role === 'user' ? (
                    <svg className="w-5 h-5 text-gray-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
                      <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z" />
                    </svg>
                  ) : (
                    <svg className="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
                      <path d="M12 2L2 7v10c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V7l-10-5z"/>
                    </svg>
                  )}
                </div>

                <div className="flex-1 overflow-hidden">
                  <div className="font-semibold text-sm mb-1">
                    {message.role === 'user' ? 'You' : 'ChatGPT'}
                  </div>
                  {message.type === 'image' ? (
                    <img
                      src={message.content}
                      alt="Generated image"
                      className="max-w-full rounded-lg shadow-sm"
                    />
                  ) : (
                    <div className="prose prose-sm max-w-none text-gray-800">
                      <ReactMarkdown remarkPlugins={[remarkGfm]}>
                        {message.content}
                      </ReactMarkdown>
                    </div>
                  )}
                </div>
              </div>
            </div>
          ))}

          {isLoading && (
            <div className="px-4 py-6">
              <div className="max-w-3xl mx-auto flex gap-4">
                <div className="w-8 h-8 rounded-full bg-black flex items-center justify-center flex-shrink-0">
                  <div className="flex space-x-1">
                    <div className="w-1.5 h-1.5 bg-white rounded-full animate-pulse" />
                    <div className="w-1.5 h-1.5 bg-white rounded-full animate-pulse" style={{ animationDelay: '0.2s' }} />
                    <div className="w-1.5 h-1.5 bg-white rounded-full animate-pulse" style={{ animationDelay: '0.4s' }} />
                  </div>
                </div>
                <div className="flex-1">
                  <div className="font-semibold text-sm mb-1">ChatGPT</div>
                  <div className="text-gray-600 text-sm">Thinking...</div>
                </div>
              </div>
            </div>
          )}

          <div ref={messagesEndRef} />
        </div>
      </div>

      {/* Input Area */}
      <div className="border-t bg-white">
        <div className="max-w-3xl mx-auto p-4">
          <div className="flex gap-2 mb-3">
            <button
              onClick={() => setMode('chat')}
              className={`flex items-center gap-2 px-4 py-2 rounded-lg text-sm font-medium transition-all ${
                mode === 'chat'
                  ? 'bg-black text-white'
                  : 'bg-gray-100 text-gray-700 hover:bg-gray-200'
              }`}
            >
              <svg className="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
                <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M8 10h.01M12 10h.01M16 10h.01M9 16H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-5l-5 5v-5z" />
              </svg>
              Chat
            </button>
            <button
              onClick={() => setMode('image')}
              className={`flex items-center gap-2 px-4 py-2 rounded-lg text-sm font-medium transition-all ${
                mode === 'image'
                  ? 'bg-black text-white'
                  : 'bg-gray-100 text-gray-700 hover:bg-gray-200'
              }`}
            >
              <svg className="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
                <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z" />
              </svg>
              Generate Image
            </button>
          </div>

          <form onSubmit={handleSubmit} className="relative">
            <textarea
              ref={textareaRef}
              value={input}
              onChange={(e) => setInput(e.target.value)}
              onKeyDown={handleKeyDown}
              placeholder={
                mode === 'chat'
                  ? 'Message ChatGPT...'
                  : 'Describe the image you want to generate...'
              }
              className="w-full px-4 py-3 pr-12 bg-gray-100 border border-gray-200 rounded-2xl resize-none focus:outline-none focus:ring-2 focus:ring-black focus:border-transparent"
              rows={1}
              style={{ maxHeight: '200px' }}
              disabled={isLoading}
            />
            <button
              type="submit"
              disabled={isLoading || !input.trim()}
              className={`absolute right-3 bottom-3 p-1.5 rounded-lg transition-all ${
                isLoading || !input.trim()
                  ? 'text-gray-300 cursor-not-allowed'
                  : 'text-white bg-black hover:bg-gray-800'
              }`}
            >
              <svg className="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
                <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M5 10l7-7m0 0l7 7m-7-7v18" />
              </svg>
            </button>
          </form>

          <p className="text-xs text-gray-500 mt-2 text-center">
            {mode === 'chat' 
              ? 'ChatGPT can make mistakes. Check important info.' 
              : 'AI-generated images may vary from your description.'}
          </p>
        </div>
      </div>
    </div>
  );
}

このコンポーネントは、メッセージ履歴を持つ全画面チャットインターフェースを作成し、チャットと画像生成のモード切替、読み込みインジケーターを提供します。インターフェースはTailwind CSSを用いてスタイリングされており、最新のメッセージを常に表示するためのスムーズなスクロールが含まれています。

あなたは、AIアシスタントのためのレスポンシブなチャットインターフェースを構築しました。次のステップでは、このコンポーネントをアプリケーションに統合します。

ステップ4 — チャットインターフェースの統合

このステップでは、チャットインターフェースをNext.jsアプリケーションに統合し、洗練されたユーザー体験を作り上げるための仕上げを行います。

src/app/page.tsx を開き、その内容を以下のように置き換えてください:

import ChatInterface from '@/components/ChatInterface';

export default function Home() {
  return (
    <main className="h-screen">
      <ChatInterface />
    </main>
  );
}

次に、レイアウトファイルを更新してヘッダーを含めます。src/app/layout.tsxを開いて修正してください。

import type { Metadata } from 'next';
import { Inter } from 'next/font/google';
import './globals.css';

const inter = Inter({ subsets: ['latin'] });

export const metadata: Metadata = {
  title: 'AI Assistant - Powered by GPT-4o',
  description: 'A multimodal AI assistant built with JavaScript',
};

export default function RootLayout({
  children,
}: {
  children: React.ReactNode;
}) {
  return (
    <html lang="en">
      <body className={inter.className}>
        <header className="bg-white border-b border-gray-200 px-4 py-3">
          <div className="max-w-7xl mx-auto flex items-center justify-between">
            <h1 className="text-xl font-semibold text-gray-800">
              AI Assistant
            </h1>
            <span className="text-sm text-gray-500">
              Powered by GPT-4o
            </span>
          </div>
        </header>
        {children}
      </body>
    </html>
  );
}

では、ランタイムエラーを優雅に処理するためにカスタムエラーバウンダリを作成してください。新しいファイルを作成します:

touch src/app/error.tsx

次のエラーハンドリングコードを追加してください。

'use client';

export default function Error({
  error,
  reset,
}: {
  error: Error & { digest?: string };
  reset: () => void;
}) {
  return (
    <div className="flex h-screen items-center justify-center">
      <div className="text-center">
        <h2 className="text-2xl font-semibold text-gray-800 mb-4">
          Something went wrong!
        </h2>
        <p className="text-gray-600 mb-4">{error.message}</p>
        <button
          onClick={reset}
          className="px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600"
        >
          Try again
        </button>
      </div>
    </div>
  );
}

ステップ5 — あなたのAIアシスタントをテストする

このステップでは、AIアシスタントが正しく機能しているかをテストします。

開発サーバーを起動します:

npm run dev

ブラウザで http://localhost:3000 に移動してください。チャットと画像生成モードを切り替えるオプションを持ったAIアシスタントインターフェースが表示されるはずです。

次のステップでは、DigitalOcean MCPサーバーを使ってJavascript AIアシスタントをDigitalOcean App Platformにデプロイします。

ステップ6 — DigitalOcean MCPサーバーを使用してDigitalOcean App Platformにデプロイする

あなたのJavaScript AIアシスタントをDigitalOcean App Platformにデプロイするには、DigitalOcean MCPサーバーをセットアップする必要があります。このプロセスでは、DigitalOcean APIトークンを生成し、AIアシスタントがそれを使用するように設定します。

ステップ1: DigitalOcean APIトークンを生成する

まず、DigitalOceanアカウントからパーソナルアクセス トークンを生成する必要があります。このトークンは、あなたのAIアシスタントをDigitalOcean App Platformで認証するために使用されます。それを行うには:

  1. DigitalOceanアカウントにログインし、API設定に移動します。
  2. 新しいトークンを生成ボタンをクリックしてください。
  3. アプリプラットフォームをトークンのスコープとして選択します。
  4. トークンに名前を付けて(例:“AIアシスタントトークン”)、トークンを生成をクリックしてください。

ステップ2:APIトークンでAIアシスタントを設定する

次に、生成されたAPIトークンを使用するためにAIアシスタントを設定する必要があります。これには、Cursorを使用してDigitalOcean MCPサーバーをセットアップすることが含まれます。

カーソルの設定

  • カーソル設定を開き、MCPに移動してください。
  • “新しいグローバルMCPサーバーを追加”をクリックしてください。
  • 設定ファイル~/.cursor/mcp.jsonに次のJSONブロックを追加します:
{
  "mcpServers": {
    "github": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-github"
      ],
      "env": {
        "GITHUB_PERSONAL_ACCESS_TOKEN": "YOUR_GITHUB_PERSONAL_ACCESS_TOKEN"
      }
    },
    "everything": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-everything"]
    },
    "sequential-thinking": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-sequential-thinking"
      ]
    },
    "digitalocean": {
      "command": "npx",
      "args": ["@digitalocean/mcp"],
      "env": {
        "DIGITALOCEAN_API_TOKEN": "YOUR_DO_TOKEN"
      }
    }
  }
}

以下のJSONブロックは、カーソルツールのためのMCP(モデルコンテキストプロトコル)サーバーを構成します。

  • 「github」サーバーは、GitHub パーソナルアクセストークンを使用して、@modelcontextprotocol/server-github パッケージを使用するために、Github MCP サーバーをセットアップしています。
  • 「everything」サーバーは、@modelcontextprotocol/server-everythingパッケージを使用するためにEverything MCPサーバーを使用します。
  • 「シーケンシャル・シンキング」サーバーは、@modelcontextprotocol/server-sequential-thinking パッケージを使用するために、シーケンシャル・シンキング MCP サーバーを使用します。
  • 「digitalocean」サーバーは、DigitalOcean APIトークンを使用して@digitalocean/mcpパッケージを利用するためにDigitalOcean MCPサーバーを使用します。

MCPサーバーのテスト

DigitalOceanのMCPサーバーをセットアップしたら、Cursorでいくつかのコマンドを実行してテストできます。サーバーが正しく動作していることを確認するために、次のプロンプトを試してみてください:

私のアカウントのすべてのアクティブなアプリをリストする
このGitHubリポジトリから2GB RAMの新しいFlaskアプリを作成する - https://github.com/do-community/do-one-click-deploy-flask
古いステージング環境アプリを削除する

あなたのAIアシスタントを展開する

DigitalOcean MCPサーバーが設定され、テストされたので、これでJavaScript AIアシスタントをDigitalOcean App Platformにデプロイできます。これを行うには、Cursorで次のプロンプトを使用します:

Deploy this Javascript AI assistant to DigitalOcean App Platform

これらのMCPサーバーを使用して、AIアシスタントをDigitalOcean App Platformにデプロイする手順に従ってください。

要するに、新しいGitHubリポジトリを作成し、それをDigitalOceanアプリプラットフォームにデプロイします。

あなたは次のような質問をすることができます:

ここにあなたのJavaScript AIアシスタントがDigitalOcean App Platformで動いています:

よくある質問

1. JavaScriptを使って完全に機能するAIアシスタントを作ることはできますか?

はい、JavaScriptを使用して完全に機能するAIアシスタントを構築することは可能です。JavaScriptライブラリやフレームワークの進歩により、OpenAI、Dialogflow、またはBotpressなどのツールを活用して、ユーザーの入力を理解し応答する会話型AIアシスタントを作成できます。JavaScriptの多様性とこれらのライブラリの利用可能性は、AIアシスタントを構築するための理想的な選択肢となります。

2. AIチャットボットのトレーニングに最適なJavaScriptライブラリはどれですか?

AIチャットボットをトレーニングするための最適なJavaScriptライブラリは、プロジェクトの具体的な要件と目標に依存します。いくつかの人気のある選択肢には次のようなものがあります:

  • OpenAI: テキスト生成、画像作成など、さまざまなAIモデルを提供しています。高度な言語能力を持つ会話型AIアシスタントを構築するのに最適です。
  • Dialogflow: 会話型インターフェースを構築するためのGoogle開発のプラットフォームです。チャットボットとの統合のためのJavaScriptクライアントライブラリを提供しています。
  • Botpress: 会話型AIアシスタントを構築するためのオープンソースのフレームワークです。自然言語処理(NLP)や機械学習(ML)統合などの高度な機能を持つチャットボットを作成するためのJavaScript SDKを提供しています。

3. JavaScriptでチャットボットを訓練するために機械学習を使う必要がありますか?

機械学習(ML)は、チャットボットの機能を大幅に向上させることができますが、JavaScriptでチャットボットをトレーニングするために必ずしもMLを使用する必要はありません。ルールベースのシステムや決定木を使用して、MLなしでシンプルなチャットボットを作成することができます。ただし、ユーザーとの対話から学び、時間と共に改善できるより高度なチャットボットを構築したい場合は、NLPや深層学習などのML技術を取り入れることが有益です。

4. AIにはPythonとJavaScriptのどちらが良いですか?

PythonとJavaScriptの両方はAI開発に適しており、最終的な選択はプロジェクトの特定の要件と個人の好みに依存します。Pythonは、TensorFlow、Keras、scikit-learnなどの幅広いライブラリがあるため、AIおよび機械学習タスクにしばしば好まれ、複雑なAIモデルの実装が容易になります。一方、JavaScriptはチャットボットなどのクライアントサイドのAIアプリケーションに最適であり、Node.jsやTensorFlow.jsなどのライブラリを使用することでサーバーサイドのAIタスクにも利用できます。

結論と今後のステップ

このチュートリアルでは、テキストを処理し画像を生成することができるJavaScriptを使用したマルチモーダルAIアシスタントを成功裏に構築し、デプロイしました。OpenAIのAPIとNext.js、Reactの統合を探求し、会話の処理と画像生成のための最新のChatGPTのようなインターフェースを作成しました。また、DigitalOcean MCPサーバーを使用してDigitalOceanアプリプラットフォームにAIアシスタントをデプロイしました。

あなたのAIアシスタントをさらに強化したり、他のAI関連プロジェクトを探索したりするために、以下のチュートリアルとリソースをチェックすることをお勧めします:

  • AIパーソナルコーディングアシスタントチュートリアル:コード補完やデバッグを支援するパーソナルコーディングアシスタントの作り方を学びましょう。
  • 1クリックモデルパーソナルアシスタント:AIモデルの力を活用して、ワンクリックで展開できるパーソナルアシスタントの作成方法を発見してください。
  • GenAIプラットフォームを使ったAIエージェントチャットボットの構築: GenAIプラットフォームを利用してAIエージェントチャットボットを構築するプロセスを探求し、高度な会話能力を実現します。
  • 最高のAIコーディングアシスタント:利用可能な最高のAIコーディングアシスタント、その機能、およびコーディング体験を向上させる方法について読んでください。
  • MCPサーバーを使用したアプリの制御: AIアシスタントを含むアプリケーションを制御および管理するために、モデルコンテキストプロトコル(MCP)サーバーの使用方法を学びましょう。

関連記事: