Build an AI App

Put It Together

First, set up a basic function that uses streamText to generate a response.

const main = async (prompt: string) => {
  const { fullStream } = streamText({
    model: openai("gpt-4o"),
    prompt,
    maxSteps: 10,
  });
};

Set up tools for company research. These tools fetch basic company info and competitor data.

tools: {
  getCompanyInfo: tool({
    description: "Get information about a company",
    parameters: z.object({
      companyName: z.string(),
    }),
    execute: async ({ companyName }) => {
      return await getCompanyInfo(companyName);
    },
  }),
  getCompetitors: tool({
    description: "Get competitors of a company",
    parameters: z.object({
      companyName: z.string(),
    }),
    execute: async ({ companyName }) => {
      return await getCompetitors(companyName);
    },
  }),
}

Add tools for founder analysis. These help gather founder background info and assess market fit.

getPersonInfo: tool({
  description: "Get information (tweets, blog posts, linkedin profile) about a person",
  parameters: z.object({
    name: z.string(),
  }),
  execute: async ({ name: founderName }) => {
    return await getFounderInfo(founderName);
  },
}),
assessFounderMarketFit: tool({
  description: "Assess the market fit of a founder",
  parameters: z.object({
    founderName: z.string(),
    companyInfo: z.string(),
  }),
  execute: async ({ founderName, companyInfo }) => {
    return await assessFounderMarketFit({ founderName, companyInfo });
  },
})

Include tools for financial analysis and report generation.

getFinancialInformation: tool({
  description: "Get financial information about a company",
  parameters: z.object({
    companyName: z.string(),
  }),
  execute: async ({ companyName }) => {
    return await getCompanyFinancials(companyName);
  },
}),
generateInvestmentPitch: tool({
  description: "Generate an investment pitch for a company",
  parameters: z.object({
    companyName: z.string(),
    companyInfo: z.string(),
    competitors: z.array(z.string()),
    founderInfo: z.string(),
    financialInfo: z.string(),
  }),
  execute: async ({
    companyName,
    companyInfo,
    competitors,
    founderInfo,
    financialInfo,
  }) => {
    return await generateReport(
      companyName,
      JSON.stringify({
        companyInfo,
        competitors,
        founderInfo,
        financialInfo,
      }),
    );
  },
})

Process and display the results through a streaming interface.

for await (const delta of fullStream) {
  if (delta.type === "tool-call") {
    console.log(delta);
  }
  if (delta.type === "tool-result") {
    if (delta.toolName === "generateInvestmentPitch") {
      console.log(delta.result);
    } else {
      console.log(delta.result);
    }
  }
  if (delta.type === "text-delta") {
    process.stdout.write(delta.textDelta);
  }
}

Finally, call the main function with a query.

main("Please write an investment pitch for investing in the Humane AI pin.");