Maison > interface Web > js tutoriel > Construisez un clone de Perplexity avec LangGraph, CopilotKit, Tavily & Next.js

Construisez un clone de Perplexity avec LangGraph, CopilotKit, Tavily & Next.js

Linda Hamilton
Libérer: 2025-01-08 22:52:44
original
849 Les gens l'ont consulté

Les applications basées sur l'IA évoluent au-delà des simples agents autonomes effectuant des tâches. Une nouvelle approche impliquant Human-in-the-Loop permet aux utilisateurs de fournir des commentaires, d'examiner les résultats et de décider des prochaines étapes pour l'IA. Ces agents d'exécution sont appelés CoAgents.

TL;DR

Dans ce didacticiel, vous apprendrez à créer un clone de Perplexity à l'aide de LangGraph, CopilotKit et Tavily.

Il est temps de commencer à construire !

Qu'est-ce qu'un copilote agent ?

Les copilotes agents sont la manière dont CopilotKit intègre les agents LangGraph dans votre application.

Les CoAgents sont l'approche de CopilotKit pour créer des expériences agentiques !

En bref, il traitera les demandes des utilisateurs en effectuant plusieurs requêtes de recherche et diffusera la recherche avec le statut et les résultats en temps réel au client.

Commandez CopilotKit ⭐️


Conditions préalables

Pour bien comprendre ce tutoriel, vous devez avoir une compréhension de base de React ou Next.js.

Nous utiliserons également les éléments suivants :

  • Python - un langage de programmation populaire pour créer des agents IA avec LangGraph ; assurez-vous qu'il est installé sur votre ordinateur.
  • LangGraph - un framework pour créer et déployer des agents IA. Il permet également de définir les flux de contrôle et les actions à effectuer par l'agent.
  • Clé API OpenAI - pour nous permettre d'effectuer diverses tâches à l'aide des modèles GPT ; pour ce tutoriel, assurez-vous d'avoir accès au modèle GPT-4.
  • Tavily AI - un moteur de recherche qui permet aux agents d'IA d'effectuer des recherches et d'accéder aux connaissances en temps réel au sein de l'application.
  • CopilotKit - un framework copilote open source pour créer des chatbots IA personnalisés, des agents IA intégrés à l'application et des zones de texte.
  • Shad Cn UI - fournit une collection de composants d'interface utilisateur réutilisables au sein de l'application.

Comment créer des agents IA avec LangGraph et CopilotKit

Dans cette section, vous apprendrez à créer un agent IA à l'aide de LangGraph et CopilotKit.

Tout d’abord, clonez le référentiel de démarrage CopilotKit CoAgents. Le répertoire ui contient le frontend de l'application Next.js, et le répertoire agent contient le CoAgent de l'application.

Dans le répertoire agent, installez les dépendances du projet à l'aide de Poetry.

cd agent
poetry install
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Créez un fichier .env dans le dossier de l'agent et copiez vos clés API OpenAI et Tavily AI dans le fichier :

OPENAI_API_KEY=
TAVILY_API_KEY=
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Build a clone of Perplexity with LangGraph, CopilotKit, Tavily & Next.js

Copiez l'extrait de code ci-dessous dans le fichier agent.py :

"""
This is the main entry point for the AI.
It defines the workflow graph and the entry point for the agent.
"""
# pylint: disable=line-too-long, unused-import
from langgraph.graph import StateGraph, END
from langgraph.checkpoint.memory import MemorySaver

from ai_researcher.state import AgentState
from ai_researcher.steps import steps_node
from ai_researcher.search import search_node
from ai_researcher.summarize import summarize_node
from ai_researcher.extract import extract_node

def route(state):
    """Route to research nodes."""
    if not state.get("steps", None):
        return END

    current_step = next((step for step in state["steps"] if step["status"] == "pending"), None)

    if not current_step:
        return "summarize_node"

    if current_step["type"] == "search":
        return "search_node"

    raise ValueError(f"Unknown step type: {current_step['type']}")

# Define a new graph
workflow = StateGraph(AgentState)
workflow.add_node("steps_node", steps_node)
workflow.add_node("search_node", search_node)
workflow.add_node("summarize_node", summarize_node)
workflow.add_node("extract_node", extract_node)
# Chatbot
workflow.set_entry_point("steps_node")

workflow.add_conditional_edges(
    "steps_node", 
    route,
    ["summarize_node", "search_node", END]
)

workflow.add_edge("search_node", "extract_node")

workflow.add_conditional_edges(
    "extract_node",
    route,
    ["summarize_node", "search_node"]
)

workflow.add_edge("summarize_node", END)

memory = MemorySaver()
graph = workflow.compile(checkpointer=memory)
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

L'extrait de code ci-dessus définit le flux de travail de l'agent LangGraph. Il part du steps_node, recherche les résultats, les résume et extrait les points clés.

Build a clone of Perplexity with LangGraph, CopilotKit, Tavily & Next.js

Créez ensuite un fichier demo.py avec l'extrait de code ci-dessous :

cd agent
poetry install
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Le code ci-dessus crée un point de terminaison FastAPI qui héberge l'agent LangGraph et le connecte au SDK CopilotKit.

Vous pouvez copier le code restant pour créer le CoAgent à partir du référentiel GitHub. Dans les sections suivantes, vous apprendrez à créer l'interface utilisateur du clone Perplexity et à gérer les demandes de recherche à l'aide de CopilotKit.


Construire l'interface de l'application avec Next.js

Dans cette section, je vais vous guider tout au long du processus de création de l'interface utilisateur de l'application.

Tout d'abord, créez un projet Next.js Typescript en exécutant l'extrait de code ci-dessous :

OPENAI_API_KEY=
TAVILY_API_KEY=
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Build a clone of Perplexity with LangGraph, CopilotKit, Tavily & Next.js

Installez la bibliothèque ShadCn UI sur le projet nouvellement créé en exécutant l'extrait de code ci-dessous :

"""
This is the main entry point for the AI.
It defines the workflow graph and the entry point for the agent.
"""
# pylint: disable=line-too-long, unused-import
from langgraph.graph import StateGraph, END
from langgraph.checkpoint.memory import MemorySaver

from ai_researcher.state import AgentState
from ai_researcher.steps import steps_node
from ai_researcher.search import search_node
from ai_researcher.summarize import summarize_node
from ai_researcher.extract import extract_node

def route(state):
    """Route to research nodes."""
    if not state.get("steps", None):
        return END

    current_step = next((step for step in state["steps"] if step["status"] == "pending"), None)

    if not current_step:
        return "summarize_node"

    if current_step["type"] == "search":
        return "search_node"

    raise ValueError(f"Unknown step type: {current_step['type']}")

# Define a new graph
workflow = StateGraph(AgentState)
workflow.add_node("steps_node", steps_node)
workflow.add_node("search_node", search_node)
workflow.add_node("summarize_node", summarize_node)
workflow.add_node("extract_node", extract_node)
# Chatbot
workflow.set_entry_point("steps_node")

workflow.add_conditional_edges(
    "steps_node", 
    route,
    ["summarize_node", "search_node", END]
)

workflow.add_edge("search_node", "extract_node")

workflow.add_conditional_edges(
    "extract_node",
    route,
    ["summarize_node", "search_node"]
)

workflow.add_edge("summarize_node", END)

memory = MemorySaver()
graph = workflow.compile(checkpointer=memory)
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Ensuite, créez un dossier components à la racine du projet Next.js, puis copiez le dossier ui de ce référentiel GitHub dans ce dossier. Shadcn vous permet d'ajouter facilement divers composants à votre application en les installant via la ligne de commande.

En plus des composants Shadcn, vous devrez créer quelques composants représentant différentes parties de l'interface de l'application. Exécutez l'extrait de code suivant dans le dossier components pour ajouter ces composants au projet Next.js :

"""Demo"""

import os
from dotenv import load_dotenv
load_dotenv()

from fastapi import FastAPI
import uvicorn
from copilotkit.integrations.fastapi import add_fastapi_endpoint
from copilotkit import CopilotKitSDK, LangGraphAgent
from ai_researcher.agent import graph

app = FastAPI()
sdk = CopilotKitSDK(
    agents=[
        LangGraphAgent(
            name="ai_researcher",
            description="Search agent.",
            graph=graph,
        )
    ],
)

add_fastapi_endpoint(app, sdk, "/copilotkit")

# add new route for health check
@app.get("/health")
def health():
    """Health check."""
    return {"status": "ok"}

def main():
    """Run the uvicorn server."""
    port = int(os.getenv("PORT", "8000"))
    uvicorn.run("ai_researcher.demo:app", host="0.0.0.0", port=port, reload=True)

Copier après la connexion
Copier après la connexion
Copier après la connexion

Copiez l'extrait de code ci-dessous dans le fichier app/page.tsx :

# ?? Navigate into the ui folder
npx create-next-app ./
Copier après la connexion
Copier après la connexion

Dans l'extrait de code ci-dessus, ResearchProvider est un fournisseur de contexte React personnalisé qui partage la requête et les résultats de recherche de l'utilisateur, les rendant accessibles à tous les composants de l'application. Le composant ResearchWrapper contient les éléments de base de l'application et gère l'interface utilisateur.

Créez un dossier lib contenant un fichier research-provider.tsx à la racine du projet Next.js et copiez le code ci-dessous dans le fichier :

npx shadcn@latest init
Copier après la connexion
Copier après la connexion

Les états sont déclarés et enregistrés dans le ResearchContext pour garantir qu'ils sont correctement gérés dans plusieurs composants de l'application.

Créez un composant ResearchWrapper comme indiqué ci-dessous :

cd agent
poetry install
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Le composant ResearchWrapper affiche le composant HomeView comme vue par défaut et affiche le ResultView lorsqu'une requête de recherche est fournie. Le hook useResearchContext nous permet d'accéder à l'état researchQuery et de mettre à jour la vue en conséquence.

Enfin, créez le composant HomeView pour restituer l'interface de la page d'accueil de l'application.

OPENAI_API_KEY=
TAVILY_API_KEY=
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Build a clone of Perplexity with LangGraph, CopilotKit, Tavily & Next.js


Comment connecter votre CoAgent à une application Next.js

Dans cette section, vous apprendrez comment connecter le CopilotKit CoAgent à votre application Next.js pour permettre aux utilisateurs d'effectuer des opérations de recherche au sein de l'application.

Installez les packages CopilotKit suivants et le SDK OpenAI Node.js. Les packages CopilotKit permettent au co-agent d'interagir avec les valeurs de l'état React et de prendre des décisions au sein de l'application.

"""
This is the main entry point for the AI.
It defines the workflow graph and the entry point for the agent.
"""
# pylint: disable=line-too-long, unused-import
from langgraph.graph import StateGraph, END
from langgraph.checkpoint.memory import MemorySaver

from ai_researcher.state import AgentState
from ai_researcher.steps import steps_node
from ai_researcher.search import search_node
from ai_researcher.summarize import summarize_node
from ai_researcher.extract import extract_node

def route(state):
    """Route to research nodes."""
    if not state.get("steps", None):
        return END

    current_step = next((step for step in state["steps"] if step["status"] == "pending"), None)

    if not current_step:
        return "summarize_node"

    if current_step["type"] == "search":
        return "search_node"

    raise ValueError(f"Unknown step type: {current_step['type']}")

# Define a new graph
workflow = StateGraph(AgentState)
workflow.add_node("steps_node", steps_node)
workflow.add_node("search_node", search_node)
workflow.add_node("summarize_node", summarize_node)
workflow.add_node("extract_node", extract_node)
# Chatbot
workflow.set_entry_point("steps_node")

workflow.add_conditional_edges(
    "steps_node", 
    route,
    ["summarize_node", "search_node", END]
)

workflow.add_edge("search_node", "extract_node")

workflow.add_conditional_edges(
    "extract_node",
    route,
    ["summarize_node", "search_node"]
)

workflow.add_edge("summarize_node", END)

memory = MemorySaver()
graph = workflow.compile(checkpointer=memory)
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Créez un dossier api dans le dossier Next.js app. Dans le dossier api, créez un répertoire copilotkit contenant un fichier route.ts. Cela créera un point de terminaison API (/api/copilotkit) qui connectera l'application frontale au CopilotKit CoAgent.

"""Demo"""

import os
from dotenv import load_dotenv
load_dotenv()

from fastapi import FastAPI
import uvicorn
from copilotkit.integrations.fastapi import add_fastapi_endpoint
from copilotkit import CopilotKitSDK, LangGraphAgent
from ai_researcher.agent import graph

app = FastAPI()
sdk = CopilotKitSDK(
    agents=[
        LangGraphAgent(
            name="ai_researcher",
            description="Search agent.",
            graph=graph,
        )
    ],
)

add_fastapi_endpoint(app, sdk, "/copilotkit")

# add new route for health check
@app.get("/health")
def health():
    """Health check."""
    return {"status": "ok"}

def main():
    """Run the uvicorn server."""
    port = int(os.getenv("PORT", "8000"))
    uvicorn.run("ai_researcher.demo:app", host="0.0.0.0", port=port, reload=True)

Copier après la connexion
Copier après la connexion
Copier après la connexion

Copiez l'extrait de code ci-dessous dans le fichier api/copilotkit/route.ts :

# ?? Navigate into the ui folder
npx create-next-app ./
Copier après la connexion
Copier après la connexion

L'extrait de code ci-dessus configure le runtime CopilotKit au niveau du point de terminaison de l'API /api/copilotkit, permettant à CopilotKit de traiter les demandes des utilisateurs via le co-agent IA.

Enfin, mettez à jour le app/page.tsx en encapsulant l'ensemble de l'application avec le composant CopilotKit qui fournit le contexte copilote à tous les composants de l'application.

npx shadcn@latest init
Copier après la connexion
Copier après la connexion

Le composant CopilotKit enveloppe l'intégralité de l'application et accepte deux accessoires - runtimeUrl et agent. Le runtimeUrl est la route de l'API backend qui héberge l'agent IA et agent est le nom de l'agent effectuant l'action.

Accepter les demandes et diffuser les réponses vers le frontend

Pour permettre à CopilotKit d'accéder et de traiter les entrées de l'utilisateur, il fournit le hook useCoAgent, qui permet d'accéder à l'état de l'agent depuis n'importe où dans l'application.

Par exemple, l'extrait de code ci-dessous montre comment utiliser le hook useCoAgent. La variable state permet d'accéder à l'état actuel de l'agent, setState est utilisée pour modifier l'état, et la fonction run exécute les instructions à l'aide de l'agent. Les fonctions start et stop lancent et arrêtent l'exécution de l'agent.

cd agent
poetry install
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Mettez à jour le composant HomeView pour exécuter l'agent lorsqu'une requête de recherche est fournie.

OPENAI_API_KEY=
TAVILY_API_KEY=
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Ensuite, vous pouvez diffuser les résultats de la recherche vers le ResultsView en accédant à la variable d'état dans le hook useCoAgent. Copiez l'extrait de code ci-dessous dans le composant ResultsView.

"""
This is the main entry point for the AI.
It defines the workflow graph and the entry point for the agent.
"""
# pylint: disable=line-too-long, unused-import
from langgraph.graph import StateGraph, END
from langgraph.checkpoint.memory import MemorySaver

from ai_researcher.state import AgentState
from ai_researcher.steps import steps_node
from ai_researcher.search import search_node
from ai_researcher.summarize import summarize_node
from ai_researcher.extract import extract_node

def route(state):
    """Route to research nodes."""
    if not state.get("steps", None):
        return END

    current_step = next((step for step in state["steps"] if step["status"] == "pending"), None)

    if not current_step:
        return "summarize_node"

    if current_step["type"] == "search":
        return "search_node"

    raise ValueError(f"Unknown step type: {current_step['type']}")

# Define a new graph
workflow = StateGraph(AgentState)
workflow.add_node("steps_node", steps_node)
workflow.add_node("search_node", search_node)
workflow.add_node("summarize_node", summarize_node)
workflow.add_node("extract_node", extract_node)
# Chatbot
workflow.set_entry_point("steps_node")

workflow.add_conditional_edges(
    "steps_node", 
    route,
    ["summarize_node", "search_node", END]
)

workflow.add_edge("search_node", "extract_node")

workflow.add_conditional_edges(
    "extract_node",
    route,
    ["summarize_node", "search_node"]
)

workflow.add_edge("summarize_node", END)

memory = MemorySaver()
graph = workflow.compile(checkpointer=memory)
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

L'extrait de code ci-dessus récupère les résultats de la recherche à partir de l'état de l'agent et les diffuse vers le frontend à l'aide du hook useCoAgent. Les résultats de la recherche sont renvoyés au format markdown et transmis au composant AnswerMarkdown, qui restitue le contenu sur la page.

Enfin, copiez l'extrait de code ci-dessous dans le composant AnswerMarkdown. Cela rendra le contenu markdown sous forme de texte formaté à l'aide de la bibliothèque React Markdown.

"""Demo"""

import os
from dotenv import load_dotenv
load_dotenv()

from fastapi import FastAPI
import uvicorn
from copilotkit.integrations.fastapi import add_fastapi_endpoint
from copilotkit import CopilotKitSDK, LangGraphAgent
from ai_researcher.agent import graph

app = FastAPI()
sdk = CopilotKitSDK(
    agents=[
        LangGraphAgent(
            name="ai_researcher",
            description="Search agent.",
            graph=graph,
        )
    ],
)

add_fastapi_endpoint(app, sdk, "/copilotkit")

# add new route for health check
@app.get("/health")
def health():
    """Health check."""
    return {"status": "ok"}

def main():
    """Run the uvicorn server."""
    port = int(os.getenv("PORT", "8000"))
    uvicorn.run("ai_researcher.demo:app", host="0.0.0.0", port=port, reload=True)

Copier après la connexion
Copier après la connexion
Copier après la connexion

Build a clone of Perplexity with LangGraph, CopilotKit, Tavily & Next.js

Félicitations ! Vous avez terminé le projet de ce didacticiel. Vous pouvez également regarder l'enregistrement vidéo ici :

Enregistrement complet du webinaire


L'emballer

L'intelligence LLM est la plus efficace lorsqu'elle fonctionne aux côtés de l'intelligence humaine, et CopilotKit CoAgents vous permet d'intégrer des agents d'IA, des copilotes et divers types d'assistants dans vos applications logicielles en quelques minutes seulement.

Si vous avez besoin de créer un produit d'IA ou d'intégrer des agents d'IA dans votre application, vous devriez envisager CopilotKit.

Le code source de ce tutoriel est disponible sur GitHub :

https://github.com/CopilotKit/CopilotKit/tree/main/examples/coagents-ai-researcher

Merci d'avoir lu !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal