[▲ Vercel Community](/) · [Categories](/categories) · [Latest](/latest) · [Top](/top) · [Live](/live)

[AI SDK](/c/ai-sdk/62)

# Generative UI without generating text

645 views · 2 likes · 3 posts


Jcuzquia (@jcuzquia) · 2025-02-19

I am currently trying to follow the example from the documents regarding tool-calling and generative UI
I would like to call the UI only without any additional text generated by the AI. The image shows a red square of the AI response which I don't want (which happens after the UI was rendered)

![image|690x204](upload://aFKxE430PyR7mTg68PTjutNJkpK.png)




My page.tsx
```
"use client";

import { useChat } from "@ai-sdk/react";
import AskForConfirmation from "./components/AskForConfirmation";
import GetLocation from "./components/GetLocation";
import GetWeatherInformation from "./components/GetWeatherInformation";

export default function Page() {
  const { messages, input, handleInputChange, handleSubmit, addToolResult } =
    useChat({
      maxSteps: 5,

      // run client-side tools that are automatically executed:
      async onToolCall({ toolCall }) {
        if (toolCall.toolName === "getLocation") {
          const cities = [
            "New York",
            "Los Angeles",
            "Chicago",
            "San Francisco",
          ];
          return cities[Math.floor(Math.random() * cities.length)];
        }
      },
    });

  return (
    <div>
      {messages.map((message) => (
        <div key={message.id}>
          <div>
            {message.parts.map((part, index) => {
              switch (part.type) {
                case "text":
                  return <div key={index}>{part.text}</div>;

                case "tool-invocation":
                  const callId = part.toolInvocation.toolCallId;
                  const { toolName, state, args } = part.toolInvocation;
                  switch (toolName) {
                    case "askForConfirmation":
                      return (
                        <AskForConfirmation
                          key={callId}
                          callId={callId}
                          message={args?.message ?? ""}
                          result={
                            part.toolInvocation.state === "result"
                              ? part.toolInvocation.result
                              : undefined
                          }
                          state={state}
                          addToolResult={addToolResult}
                        />
                      );
                    case "getLocation":
                      return (
                        <GetLocation
                          key={callId}
                          callId={callId}
                          result={
                            part.toolInvocation.state === "result"
                              ? part.toolInvocation.result
                              : undefined
                          }
                          state={state}
                        />
                      );
                    case "getWeatherInformation":
                      return (
                        <GetWeatherInformation
                          key={callId}
                          callId={callId}
                          city={args?.city ?? ""}
                          result={
                            part.toolInvocation.state === "result"
                              ? part.toolInvocation.result
                              : undefined
                          }
                          state={state}
                        />
                      );
                  }
                  break;
              }
            })}
          </div>
        </div>
      ))}

      <form onSubmit={handleSubmit}>
        <div className="flex gap-2">
          <input
            className="w-full border-2 border-gray-300 rounded-md p-2"
            value={input}
            onChange={handleInputChange}
            placeholder="Type a message..."
          />
          <button
            type="submit"
            className="bg-blue-500 text-white p-2 rounded-md"
          >
            Send
          </button>
        </div>
      </form>
    </div>
  );
}

```
This is my route.ts
```
import { openai } from "@ai-sdk/openai";
import { streamText } from "ai";
import { z } from "zod";

export async function POST(request: Request) {
  const { messages } = await request.json();

  const result = streamText({
    model: openai("gpt-4o"),
    system: "You are a friendly assistant!",
    toolCallStreaming: true,
    messages,
    maxSteps: 5,
    tools: {
      // server-side tool with execute function:
      getWeatherInformation: {
        description: "show the weather in a given city to the user",
        parameters: z.object({ city: z.string() }),
        execute: async ({}: { city: string }) => {
          const weatherOptions = ["sunny", "cloudy", "rainy", "snowy", "windy"];
          return weatherOptions[
            Math.floor(Math.random() * weatherOptions.length)
          ];
        },
      },
      // client-side tool that starts user interaction:
      askForConfirmation: {
        description: "Ask the user for confirmation.",
        parameters: z.object({
          message: z.string().describe("The message to ask for confirmation."),
        }),
      },
      // client-side tool that is automatically executed on the client:
      getLocation: {
        description:
          "Get the user location. Always ask for confirmation before using this tool.",
        parameters: z.object({}),
      },
    },
  });

  return result.toDataStreamResponse();
}

```

I tried using the ```stop()``` function from the useChat hook, but this sets the ```error``` prop in the useChat hook.
Any insight is greatly appreciated.
Camilo


Nico Albanese (@nicoalbanese) · 2025-02-19 · ♥ 2

Hey! If you don't want follow on text, you have to either omit maxSteps, or set it to 1.


Jcuzquia (@jcuzquia) · 2025-02-19

Great, this solved it thank you!
Do you happen to know if there is a good way to modify the maxSteps for certain tools, but not for others if we have multiple tools?