> ## Documentation Index
> Fetch the complete documentation index at: https://auth0.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Salesforceの商談を取得する

> OpenAI、NextJS、Auth0-AI SDKを使用してSalesforceの商談を取得します

> [tab] Next.js
>
> 前提条件
>
> 開始する前に、以下の手順を完了していることを確認してください。
>
> ## Vercel AIツールとバックエンドAPIルートを定義する
>
> Salesforceから商談の一覧を取得するAIツールと、Auth0を使ってSalesforceのアクセストークンを取得するバックエンドルートを作成します。
>
> * ツールで`auth0.getAccessTokenForConnection()`を呼び出す際は、接続名として`sfdc`を渡すと、Salesforceのアクセストークンを取得できます。
>
> ```tsx app/api/chat/route.js wrap lines theme={null}
> import { openai } from "@ai-sdk/openai";
> import { streamText, tool } from "ai";
> import { z } from "zod";
> import { auth0 } from "@/lib/auth0";
>
> export const maxDuration = 60;
>
> export async function POST(req) {
>   const { messages } = await req.json();
>
>   const system = `You're a helpful AI agent that helps analyze salesforce data`;
>
>   const response = streamText({
>     model: openai("gpt-4o"),
>     messages,
>     system,
>     maxSteps: 10,
>     tools: {
>       listOpportunities: tool({
>         // 商談の一覧を取得するSalesforceツール呼び出し
>         description: "Get a list of opportunities from Salesforce",
>         parameters: z.object({
>           limit: z
>             .number()
>             .default(10)
>             .describe("The maximum number of opportunities to return"),
>         }),
>         execute: async ({ limit }) => {
>           const instanceUrl = process.env.SALESFORCE_INSTANCE_URL;
>
>           const endpoint = `query/?q=${encodeURIComponent(
>             `SELECT Id, Name, StageName, CloseDate FROM Opportunity LIMIT ${limit}`
>           )}`;
>           const url = `${instanceUrl}/services/data/v57.0/${endpoint}`;
>
>           // auth0を呼び出してアクセストークンを取得する
>           const { accessToken } = await auth0.getAccessTokenForConnection({
>             connection: "sfdc",
>           });
>
>           const response = await fetch(url, {
>             method: "GET",
>             headers: {
>               Authorization: `Bearer ${accessToken}`,
>               "Content-Type": "application/json",
>             },
>           });
>           return await response.json();
>         },
>       }),
>     },
>   });
>   return response.toDataStreamResponse();
> }
> ```
>
> ## フロントエンドのチャットUIから呼び出す
>
> `@ai-sdk/react`のHooksを使用して、チャットコンポーネントを組み込みます。
>
> ```tsx src/components/chat.tsx wrap lines theme={null}
> "use client";
> import { useChat } from "@ai-sdk/react";
> export default function Chat() {
>   const { messages, input, handleInputChange, handleSubmit } = useChat();
>   return (
>     <div className="flex flex-col w-full max-w-3xl py-24 mx-auto stretch text-gray-100">
>       {messages.map((message) => (
>         <div key={message.id} className="whitespace-pre-wrap">
>           {message.role === "user" ? "User: " : "AI: "}
>           {message.parts.map((part, i) => {
>             switch (part.type) {
>               case "text":
>                 return <div key={`${message.id}-${i}`}>{part.text}</div>;
>             }
>           })}
>         </div>
>       ))}
>       <form onSubmit={handleSubmit}>
>         <input
>           className="fixed bottom-0 w-full max-w-3xl p-2 mb-8 border border-zinc-300 rounded shadow-xl"
>           value={input}
>           placeholder="Say something..."
>           onChange={handleInputChange}
>         />
>       </form>
>     </div>
>   );
> }
> ```
>
> ## UIの例
>
> `https://localhost:3000`にアクセスすると、チャットUIが表示されます。
>
> &#x20;
>
> ![Salesforceの商談を取得するチャット
> UI](https://mintlify.s3.us-west-1.amazonaws.com/auth0/docs/images/ai/how-tos/get_salesforce_opportunities_chat_ui.png)
>
> チャットUIをカスタマイズすれば、構造化された結果を表やグラフ、要約などの形式で表示することもできます。ユーザーが`Get me 2 opportunities from Salesforce`のようなメッセージを送信すると、GPT-4がリクエストを解釈して`listOpportunities`ツールを呼び出します。このツールは、Auth0経由で取得したアクセストークンを使ってSalesforce APIを安全に呼び出し、結果を返します。

> [tab] LangChain
>
> 近日公開予定です！

> [tab] LlamaIndex
>
> 近日公開予定です！

> [tab] GenKit
>
> 近日公開予定です！

## アカウントリンク

Salesforce と統合していて、ユーザーが別の
方法（ユーザー名とパスワード、または別の外部プロバイダーなど）でサインインできるようにするには、これらの
ID を1つのユーザーアカウントにリンクする必要があります。Auth0 では、このプロセスを
[アカウントリンク](https://auth0.com/docs/manage-users/user-accounts/user-account-linking)
と呼びます。

アカウントリンクは、以下とは別の機能です。
[Token Vault の接続済みアカウント](https://auth0.com/docs/secure/call-apis-on-users-behalf/token-vault/connected-accounts-for-token-vault.md)
：

<ul><li>アカウントリンクでは、複数の Auth0 ID をサインイン用の1つのユーザープロファイルに統合します。</li>
<li>Token Vault の接続済みアカウントでは、サインイン中のユーザーが外部
プロバイダーを認可できるため、Auth0 はそのプロバイダーのトークンを Token Vault に保存できます。</li></ul>

アプリケーションで
[Organizations](https://auth0.com/docs/manage-users/organizations.md) を使用している場合は、接続済みアカウントのフローを開始する前に、
対象の Organization でユーザーを認証してください。Organizations
はセッションコンテキストを定義しますが、Organization 用の共有外部アカウントを作成するものではありません。

アカウントリンクのロジックと処理は、アプリまたはエージェントによって異なります。
実装例は  [Next.js チャットボットアプリ](https://github.com/auth0-lab/market0/blob/main/app/api/auth/%5Bauth0%5D/route.ts#L43)で確認できます
。質問がある場合やベストプラクティスをお探しの場合は、
[Discord に参加](http://discord.gg/XbQpZSF2Ys)し、
`#auth0-for-gen-ai` チャンネルで質問してください。
