NextRaise:利用人工智能代理 GenAI LIVE 简化初创企业的融资流程!| 2025 年 6 月 4 日

2025-06-10

NextRaise:利用人工智能代理简化初创企业的融资流程

GenAI LIVE! | 2025年6月4日

这是Agent.ai挑战赛的参赛作品:全栈代理、Productivity-Pro 代理和代理组装(查看详情

我建造了什么

NextRaise是一款颠覆性的工具,旨在帮助初创公司创始人简化融资流程。通过整合五位专业代理,NextRaise 可将通常需要数天才能完成的任务简化至 2-5 分钟。

作为非洲最大的初创企业社区之一的社区总监,我亲眼目睹了融资是多么令人头疼。从寻找投资者到拓展业务,创始人常常难以平衡这些任务与初创企业的建设。NextRaise 通过自动化整个流程解决了这一痛点。

NextRaise 脱颖而出,因为它符合所有三个挑战提示:

1. 全栈代理

NextRaise 使用并集成了 Agent.ai 中的多项高级功能,例如 webhook、调用 web API 和调用其他代理:

  • Webhook 集成:将用户友好的 Tally.so 表单与 Agent.ai 连接起来,实现无缝输入处理。

Webhook 集成

  • 调用 Web API:将代理的输出编译成精美的 PDF,并生成云托管链接以便于共享。

调用 Web API

  • 代理调用:调用四个独立的代理来处理投资者研究、竞争对手分析、投资者外展模板和条款清单生成等任务。

调用其他代理

2. 代理的组装

NextRaise 充当中央代理,收集用户的输入,然后触发不同的代理执行其任务。它的工作原理如下:

图片描述

  • NextRaise(中央枢纽):一切由此开始。NextRaise 会从用户处收集所有必要信息(例如,初创公司名称、行业、融资阶段、商业模式、目标市场、网站等),并启动整个流程,依次激活其他代理。[运行代理]
  • 投资者搜索代理:此代理根据输入的数据,识别与您的初创企业匹配的投资者。它可以帮助您找到与您的阶段、行业和市场相匹配的合适支持者。[运行代理]
  • 竞争情报代理:这类代理提供重要的市场数据、竞争对手分析和行业洞察。这些信息对于定制你的推介方案以及为投资者提供了解你初创公司潜力所需的背景信息至关重要。[运行代理]
  • 投资者拓展代理:该代理负责起草个性化的拓展信息,确保其符合每位投资者的具体情况。此外,该代理还会安排后续跟进,以保持与潜在投资者的互动。[运行代理]
  • 条款清单创建代理:该代理根据创始人的融资参数起草专业的条款清单。它会创建一份条款清单草稿,供创始人在讨论过程中使用。[运行代理]

通过 API 调用生成 PDF
每个代理都会生成其已完成任务的 PDF,NextRaise 将这些 PDF 合并为统一的格式,并通过输出和电子邮件将它们传递给用户。

3. Productivity-Pro Agent

NextRaise 为创始人节省了数天的手动工作,使他们能够专注于核心使命——打造优秀的产品。

图片描述

演示

现场演示

视频演示

NextRaise Agent Build(屏幕截图)

代理构建图像 1

代理构建图像 2

代理构建图像 3

代码亮点

1. Webhook:将Tally.so连接到Agent.ai

以下是连接 Tally 表单和 Agent.ai 的代码,确保捕获和处理每个输入:

import { createHmac } from "crypto";
import axios from "axios";
import dotenv from 'dotenv';

dotenv.config();

const YOUR_SIGNING_SECRET = process.env.TALLY_SIGNING_SECRET;

export default async function handler(req, res) {
  if (req.method === "POST") {
    const webhookPayload = req.body;
    const receivedSignature = req.headers["tally-signature"];

    const calculatedSignature = createHmac("sha256", YOUR_SIGNING_SECRET)
      .update(JSON.stringify(webhookPayload))
      .digest("base64");

    if (receivedSignature === calculatedSignature) {
      console.log("Webhook received successfully:", webhookPayload);

      const { eventType, data } = webhookPayload;

      if (eventType === "FORM_RESPONSE") {
        console.log("Form Name:", data.formName);
        console.log("Form Fields:", data.fields);

        const founder_name = data.fields.find(
          (f) => f.key === "question_xjN1L5"
        )?.value;
        const founder_email = data.fields.find(
          (f) => f.key === "question_NDBQ9j"
        )?.value;
        const startup_name = data.fields.find(
          (f) => f.key === "question_QMBWaG"
        )?.value;
        const startup_description = data.fields.find(
          (f) => f.key === "question_dN24ed"
        )?.value;
        const startup_website = data.fields.find(
          (f) => f.key === "question_eDxljk"
        )?.value;

        const startup_industry = data.fields.find(
          (f) => f.key === "question_vr0Pyg"
        )?.value;
        const industry_options = data.fields.find(
          (f) => f.key === "question_vr0Pyg"
        )?.options;
        const selected_industry = startup_industry?.map((id) => {
          const option = industry_options.find((opt) => opt.id === id);
          return option?.text || "Unknown";
        });

        const startup_business_model = data.fields.find(
          (f) => f.key === "question_dNZYVD"
        )?.value;
        const model_options = data.fields.find(
          (f) => f.key === "question_dNZYVD"
        )?.options;
        const selected_model = startup_business_model?.map((id) => {
          const option = model_options.find((opt) => opt.id === id);
          return option?.text || "Unknown";
        });

        const startup_market = data.fields.find(
          (f) => f.key === "question_vr0XEd"
        )?.value;
        const market_options = data.fields.find(
          (f) => f.key === "question_vr0XEd"
        )?.options;
        const selected_markets = startup_market?.map((id) => {
          const option = market_options.find((opt) => opt.id === id);
          return option?.text || "Unknown";
        });

        const startup_stage = data.fields.find(
          (f) => f.key === "question_KePpvk"
        )?.value;
        const stage_options = data.fields.find(
          (f) => f.key === "question_KePpvk"
        )?.options;
        const round_type = startup_stage?.map((id) => {
          const option = stage_options.find((opt) => opt.id === id);
          return option?.text || "Unknown";
        });

        const fundraising_round_type = data.fields.find(
          (f) => f.key === "question_LzEDvO"
        )?.value;
        const investment_options = data.fields.find(
          (f) => f.key === "question_LzEDvO"
        )?.options;
        const investment_type = fundraising_round_type?.map((id) => {
          const option = investment_options.find((opt) => opt.id === id);
          return option?.text || "Unknown";
        });

        const unique_selling_point = data.fields.find(
          (f) => f.key === "question_QMx7VY"
        )?.value;

        const investor_type = data.fields.find(
          (f) => f.key === "question_pd0eRZ"
        )?.value;
        const investor_options = data.fields.find(
          (f) => f.key === "question_pd0eRZ"
        )?.options;
        const selected_investor_types = investor_type?.map((id) => {
          const option = investor_options.find((opt) => opt.id === id);
          return option?.text || "Unknown";
        });

        const notable_traction = data.fields.find(
          (f) => f.key === "question_9X67QE"
        )?.value;

        const fundraising_amount = data.fields.find(
          (f) => f.key === "question_OlBeMY"
        )?.value;

        const team_apart = data.fields.find(
          (f) => f.key === "question_eDNaRx"
        )?.value;

        const number_of_investors = data.fields.find(
          (f) => f.key === "question_GKBjAL"
        )?.value;

        console.log({
          founder_name,
          founder_email,
          startup_name,
          startup_description,
          startup_website,
          startup_industry: selected_industry,
          startup_business_model: selected_model,
          startup_market: selected_markets,
          fundraising_round_type: round_type,
          startup_investment_type: investment_type,
          investor_types: selected_investor_types,
          fundraising_amount,
          unique_selling_point,
          notable_traction,
          team_apart,
          number_of_investors,
        });

        const payload = {
          founder_name,
          founder_email,
          startup_name,
          startup_description,
          startup_website,
          startup_industry: selected_industry,
          startup_business_model: selected_model,
          startup_market: selected_markets,
          fundraising_round_type: round_type,
          startup_investment_type: investment_type,
          investor_types: selected_investor_types,
          fundraising_amount,
          unique_selling_point,
          notable_traction,
          team_apart,
          number_of_investors,
        };

        console.log("Prepared Payload:", payload);

        try {
          const response = await axios.post(
            "https://api-lr.agent.ai/v1/agent/4nn8v57mtzbxjlfz/webhook/99cce98b",
            payload,
            { headers: { "Content-Type": "application/json" } }
          );
          console.log("Response from Agent.ai:", response.data);
          res.status(200).send("Webhook processed and forwarded successfully.");
        } catch (error) {
          console.error(
            "Error sending data to Agent.ai:",
            error.response?.data || error.message
          );
          res.status(500).send("Failed to forward webhook data.");
        }
      } else {
        console.error("Unsupported event type received:", eventType);
        res.status(400).send("Unsupported event type.");
      }
    } else {
      console.error("Invalid signature. Rejecting request.");
      res.status(401).send("Invalid signature.");
    }
  } else {
    res.status(405).send("Method Not Allowed");
  }
};
Enter fullscreen mode Exit fullscreen mode

2. 用于生成 PDF 的 Web API

此 API 收集所有代理的输出,生成 PDF,并将其上传到云服务(imagekit.io):

import PDFDocument from "pdfkit";
import ImageKit from "imagekit";
import dotenv from "dotenv";

dotenv.config();

const imagekit = new ImageKit({
  publicKey: process.env.IMAGEKIT_PUBLIC_KEY,
  privateKey: process.env.IMAGEKIT_PRIVATE_KEY,
  urlEndpoint: process.env.IMAGEKIT_URL_ENDPOINT,
});

export default async function handler(req, res) {
  if (req.method === "POST") {
    const { inputText } = req.body;

    if (!inputText) {
      return res.status(400).json({ error: "inputText is required" });
    }

    try {
      const doc = new PDFDocument();

      const fileName = `generated-${Date.now()}.pdf`;

      const pdfBuffer = [];
      doc.on("data", (chunk) => pdfBuffer.push(chunk));
      doc.on("end", async () => {
        const pdfData = Buffer.concat(pdfBuffer);

        try {
          const uploadResult = await imagekit.upload({
            file: pdfData,
            fileName: fileName,
            useUniqueFileName: true,
          });

          const pdfUrl = uploadResult.url;
          res.status(200).json({ pdfUrl });
        } catch (uploadError) {
          console.error("Error uploading to ImageKit:", uploadError);
          res.status(500).json({ error: "Failed to upload PDF to ImageKit" });
        }
      });

      doc.fontSize(12).text(inputText, 50, 50);

      doc.end();
    } catch (error) {
      console.error("Error generating PDF:", error);
      res.status(500).json({ error: "Failed to generate PDF" });
    }
  } else {
    res.status(405).json({ error: "Method Not Allowed" });
  }
};
Enter fullscreen mode Exit fullscreen mode

3. 在 Vercel 上部署

Webhook 和 PDF API 都部署在 Vercel 上,以实现快速、可扩展的性能:

4. GitHub 仓库

完整的源代码可以在这里找到:

GitHub 徽标 sholajegede / nextraise-api

NextRaise AI 代理的 API

Agent.ai 体验

使用 Agent.ai 进行构建是一次非常棒的体验。该平台的Agent Builder工具让我能够直观地设计工作流程,同时充分利用 Webhook 和多代理协作等功能。

亮点

  • 代理调用功能对于自动化复杂的工作流程至关重要。
  • 集成 webhook 和外部 API 为我提供了灵活性和控制力。
  • 看到代理在不到 5 分钟的时间内处理通常需要几天的时间才能完成的流程,我感到非常欣慰。

挑战

我希望“保存到文档”​​选项能够更加灵活。如果它允许用户为文档生成可共享的 URL,或者允许用户选择保存到哪个 Google Drive 账户——无论他们是否拥有 Agent.ai 账户——那将会非常有用。

NextRaise 为何脱颖而出

  • 全栈技术: Webhook、API 调用和代理调用相结合,形成一个强大而灵活的工具。
  • 无缝协作:五位代理共同协作,获得不间断的体验。
  • 现实世界的生产力:创始人可以在几分钟内从不知所措的状态转变为做好推销的准备。

团队提交:

此提交来自https://dev.to/sholajegede

最后的想法

NextRaise 简化了全球初创企业的融资流程,将原本紧张的流程简化为直观的体验。作为初创企业生态系统的深度投资人,我很高兴能够提供一款工具,帮助创始人专注于最重要的事情。

感谢您查看我的投稿!为构建实用且功能强大的AI代理而欢呼!

如果您使用NextRaise AI Agent,我很乐意听到您的反馈!

鏂囩珷鏉ユ簮锛�https://dev.to/sholajgede/nextraise-streamline-your-startups-fundraise-journey-with-ai-agents-3j85
PREV
第 1 部分:在文件共享应用程序中使用 Kinde 和 Convex 掌握身份验证和基于角色的访问控制 (RBAC) 使用 Kinde 的 RBAC(或基于角色的访问控制)最后的想法用户和身份验证示例应用程序
NEXT
Convex 和 Kinde 开始使用