Advertisement
ma39isy

Untitled

Sep 12th, 2024
203
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. async function submitUserMessage(content: string) {
  2.   'use server'
  3.  
  4.   const aiState = getMutableAIState<typeof AI>()
  5.  
  6.   aiState.update({
  7.     ...aiState.get(),
  8.     messages: [
  9.       ...aiState.get().messages,
  10.       {
  11.         id: nanoid(),
  12.         role: 'user',
  13.         content
  14.       }
  15.     ]
  16.   })
  17.  
  18.   let textStream: undefined | ReturnType<typeof createStreamableValue<string>>
  19.   let textNode: undefined | React.ReactNode
  20.  
  21.   const result = await streamUI({
  22.     model: openai('gpt-3.5-turbo'),
  23.     initial: <SpinnerMessage />,
  24.     system: `\
  25.     You are a stock trading conversation bot and you can help users buy stocks, step by step.
  26.     You and the user can discuss stock prices and the user can adjust the amount of stocks they want to buy, or place an order, in the UI.
  27.  
  28.     Messages inside [] means that it's a UI element or a user event. For example:
  29.    - "[Price of AAPL = 100]" means that an interface of the stock price of AAPL is shown to the user.
  30.    - "[User has changed the amount of AAPL to 10]" means that the user has changed the amount of AAPL to 10 in the UI.
  31.  
  32.    If the user requests purchasing a stock, call \`show_stock_purchase_ui\` to show the purchase UI.
  33.    If the user just wants the price, call \`show_stock_price\` to show the price.
  34.    If you want to show trending stocks, call \`list_stocks\`.
  35.    If you want to show events, call \`get_events\`.
  36.    If the user wants to sell stock, or complete another impossible task, respond that you are a demo and cannot do that.
  37.  
  38.    Besides that, you can also chat with users and do some calculations if needed.`,
  39.    messages: [
  40.      ...aiState.get().messages.map((message: any) => ({
  41.        role: message.role,
  42.        content: message.content,
  43.        name: message.name
  44.      }))
  45.    ],
  46.    text: ({ content, done, delta }) => {
  47.      if (!textStream) {
  48.        textStream = createStreamableValue('')
  49.        textNode = <BotMessage content={textStream.value} />
  50.      }
  51.  
  52.      if (done) {
  53.        textStream.done()
  54.        aiState.done({
  55.          ...aiState.get(),
  56.          messages: [
  57.            ...aiState.get().messages,
  58.            {
  59.              id: nanoid(),
  60.              role: 'assistant',
  61.              content
  62.            }
  63.          ]
  64.        })
  65.      } else {
  66.        textStream.update(delta)
  67.      }
  68.  
  69.      return textNode
  70.    },
  71.    tools: {
  72.      listStocks: {
  73.        description: 'List three imaginary stocks that are trending.',
  74.        parameters: z.object({
  75.          stocks: z.array(
  76.            z.object({
  77.              symbol: z.string().describe('The symbol of the stock'),
  78.              price: z.number().describe('The price of the stock'),
  79.              delta: z.number().describe('The change in price of the stock')
  80.            })
  81.          )
  82.        }),
  83.        generate: async function* ({ stocks }) {
  84.          yield (
  85.            <BotCard>
  86.              <StocksSkeleton />
  87.            </BotCard>
  88.          )
  89.  
  90.          await sleep(1000)
  91.  
  92.          const toolCallId = nanoid()
  93.  
  94.          aiState.done({
  95.            ...aiState.get(),
  96.            messages: [
  97.              ...aiState.get().messages,
  98.              {
  99.                id: nanoid(),
  100.                role: 'assistant',
  101.                content: [
  102.                  {
  103.                    type: 'tool-call',
  104.                    toolName: 'listStocks',
  105.                    toolCallId,
  106.                    args: { stocks }
  107.                  }
  108.                ]
  109.              },
  110.              {
  111.                id: nanoid(),
  112.                role: 'tool',
  113.                content: [
  114.                  {
  115.                    type: 'tool-result',
  116.                    toolName: 'listStocks',
  117.                    toolCallId,
  118.                    result: stocks
  119.                  }
  120.                ]
  121.              }
  122.            ]
  123.          })
  124.  
  125.          return (
  126.            <BotCard>
  127.              <Stocks props={stocks} />
  128.            </BotCard>
  129.          )
  130.        }
  131.      },
  132.      showStockPrice: {
  133.        description:
  134.          'Get the current stock price of a given stock or currency. Use this to show the price to the user.',
  135.        parameters: z.object({
  136.          symbol: z
  137.            .string()
  138.            .describe(
  139.              'The name or symbol of the stock or currency. e.g. DOGE/AAPL/USD.'
  140.            ),
  141.          price: z.number().describe('The price of the stock.'),
  142.          delta: z.number().describe('The change in price of the stock')
  143.        }),
  144.        generate: async function* ({ symbol, price, delta }) {
  145.          yield (
  146.            <BotCard>
  147.              <StockSkeleton />
  148.            </BotCard>
  149.          )
  150.  
  151.          await sleep(1000)
  152.  
  153.          const toolCallId = nanoid()
  154.  
  155.          aiState.done({
  156.            ...aiState.get(),
  157.            messages: [
  158.              ...aiState.get().messages,
  159.              {
  160.                id: nanoid(),
  161.                role: 'assistant',
  162.                content: [
  163.                  {
  164.                    type: 'tool-call',
  165.                    toolName: 'showStockPrice',
  166.                    toolCallId,
  167.                    args: { symbol, price, delta }
  168.                  }
  169.                ]
  170.              },
  171.              {
  172.                id: nanoid(),
  173.                role: 'tool',
  174.                content: [
  175.                  {
  176.                    type: 'tool-result',
  177.                    toolName: 'showStockPrice',
  178.                    toolCallId,
  179.                    result: { symbol, price, delta }
  180.                  }
  181.                ]
  182.              }
  183.            ]
  184.          })
  185.  
  186.          return (
  187.            <BotCard>
  188.              <Stock props={{ symbol, price, delta }} />
  189.            </BotCard>
  190.          )
  191.        }
  192.      },
  193.      showStockPurchase: {
  194.        description:
  195.          'Show price and the UI to purchase a stock or currency. Use this if the user wants to purchase a stock or currency.',
  196.        parameters: z.object({
  197.          symbol: z
  198.            .string()
  199.            .describe(
  200.              'The name or symbol of the stock or currency. e.g. DOGE/AAPL/USD.'
  201.            ),
  202.          price: z.number().describe('The price of the stock.'),
  203.          numberOfShares: z
  204.            .number()
  205.            .optional()
  206.            .describe(
  207.              'The **number of shares** for a stock or currency to purchase. Can be optional if the user did not specify it.'
  208.            )
  209.        }),
  210.        generate: async function* ({ symbol, price, numberOfShares = 100 }) {
  211.          const toolCallId = nanoid()
  212.  
  213.          if (numberOfShares <= 0 || numberOfShares > 1000) {
  214.            aiState.done({
  215.              ...aiState.get(),
  216.              messages: [
  217.                ...aiState.get().messages,
  218.                {
  219.                  id: nanoid(),
  220.                  role: 'assistant',
  221.                  content: [
  222.                    {
  223.                      type: 'tool-call',
  224.                      toolName: 'showStockPurchase',
  225.                      toolCallId,
  226.                      args: { symbol, price, numberOfShares }
  227.                    }
  228.                  ]
  229.                },
  230.                {
  231.                  id: nanoid(),
  232.                  role: 'tool',
  233.                  content: [
  234.                    {
  235.                      type: 'tool-result',
  236.                      toolName: 'showStockPurchase',
  237.                      toolCallId,
  238.                      result: {
  239.                        symbol,
  240.                        price,
  241.                        numberOfShares,
  242.                        status: 'expired'
  243.                      }
  244.                    }
  245.                  ]
  246.                },
  247.                {
  248.                  id: nanoid(),
  249.                  role: 'system',
  250.                  content: `[User has selected an invalid amount]`
  251.                }
  252.              ]
  253.            })
  254.  
  255.            return <BotMessage content={'Invalid amount'} />
  256.          } else {
  257.            aiState.done({
  258.              ...aiState.get(),
  259.              messages: [
  260.                ...aiState.get().messages,
  261.                {
  262.                  id: nanoid(),
  263.                  role: 'assistant',
  264.                  content: [
  265.                    {
  266.                      type: 'tool-call',
  267.                      toolName: 'showStockPurchase',
  268.                      toolCallId,
  269.                      args: { symbol, price, numberOfShares }
  270.                    }
  271.                  ]
  272.                },
  273.                {
  274.                  id: nanoid(),
  275.                  role: 'tool',
  276.                  content: [
  277.                    {
  278.                      type: 'tool-result',
  279.                      toolName: 'showStockPurchase',
  280.                      toolCallId,
  281.                      result: {
  282.                        symbol,
  283.                        price,
  284.                        numberOfShares
  285.                      }
  286.                    }
  287.                  ]
  288.                }
  289.              ]
  290.            })
  291.  
  292.            return (
  293.              <BotCard>
  294.                <Purchase
  295.                  props={{
  296.                    numberOfShares,
  297.                    symbol,
  298.                    price: +price,
  299.                    status: 'requires_action'
  300.                  }}
  301.                />
  302.              </BotCard>
  303.            )
  304.          }
  305.        }
  306.      },
  307.      getEvents: {
  308.        description:
  309.          'List funny imaginary events between user highlighted dates that describe stock activity.',
  310.        parameters: z.object({
  311.          events: z.array(
  312.            z.object({
  313.              date: z
  314.                .string()
  315.                .describe('The date of the event, in ISO-8601 format'),
  316.              headline: z.string().describe('The headline of the event'),
  317.              description: z.string().describe('The description of the event')
  318.            })
  319.          )
  320.        }),
  321.        generate: async function* ({ events }) {
  322.          yield (
  323.            <BotCard>
  324.              <EventsSkeleton />
  325.            </BotCard>
  326.          )
  327.  
  328.          await sleep(1000)
  329.  
  330.          const toolCallId = nanoid()
  331.  
  332.          aiState.done({
  333.            ...aiState.get(),
  334.            messages: [
  335.              ...aiState.get().messages,
  336.              {
  337.                id: nanoid(),
  338.                role: 'assistant',
  339.                content: [
  340.                  {
  341.                    type: 'tool-call',
  342.                    toolName: 'getEvents',
  343.                    toolCallId,
  344.                    args: { events }
  345.                  }
  346.                ]
  347.              },
  348.              {
  349.                id: nanoid(),
  350.                role: 'tool',
  351.                content: [
  352.                  {
  353.                    type: 'tool-result',
  354.                    toolName: 'getEvents',
  355.                    toolCallId,
  356.                    result: events
  357.                  }
  358.                ]
  359.              }
  360.            ]
  361.          })
  362.  
  363.          return (
  364.            <BotCard>
  365.              <Events props={events} />
  366.            </BotCard>
  367.          )
  368.        }
  369.      }
  370.    }
  371.  })
  372.  
  373.  return {
  374.    id: nanoid(),
  375.    display: result.value
  376.  }
  377. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement