ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

基于 Gemini 与 Pydantic AI 构建自动化 SWOT 分析 Agent:swot-agent 实战指南

基于 Gemini 与 Pydantic AI 构建自动化 SWOT 分析 Agent:swot-agent 实战指南 基于 Gemini 与 Pydantic AI 构建自动化 SWOT 分析 Agentswot-agent 实战指南【免费下载链接】generative-aiSample code and notebooks for Generative AI on Google Cloud, with Gemini Enterprise Agent Platform项目地址: https://gitcode.com/GitHub_Trending/ge/generative-ai导读swot-agent是 Generative AI 示例仓库中一个端到端可运行的智能体示例用户输入一个网址AI Agent 便会自动抓取网页内容、检索 Reddit 社区观点、调用 Gemini 生成竞品分析最终输出结构化的 SWOT优势、劣势、机会、威胁结论。本文以 swot-agent/README.md 为主体骨架深入其 agent.py、main.py、三个 HTML 模板与两套测试完整讲解从环境配置、Agent 编排、FastAPI HTMX 交互到 Cloud Run 部署与测试验证的全过程帮助你在自己的项目中快速复刻一个多工具调用 结构化输出 实时进度反馈的 LLM 应用。项目概览与技术选型swot-agent 是一个基于 Web 的自动化 SWOT 分析应用核心链路为用户提交 URL → Agent 调度三个工具收集情报 → Gemini 2.0 Flash 生成结构化分析 → 前端可视化呈现。底层技术栈清晰且现代组件选型作用大模型Gemini 2.0 Flash生成 SWOT 分析、竞品分析Agent 框架Pydantic AI编排工具调用、结构化输出、结果校验与重试Web 框架FastAPI Uvicorn提供 HTTP 接口与异步任务调度前端交互HTMX Tailwind CSS无刷新轮询、渐进式状态展示内容解析BeautifulSoup httpx抓取并抽取网页正文社区数据PRAWReddit API获取相关 subreddit 的社区洞察Agent 内置三个工具与 README 描述一一对应Content Extractionfetch_website_content根据 URL 抓取网页并提取文本内容Community Insightsget_reddit_insights调用 Reddit API 获取相关社区讨论作为市场佐证Competitive Analysisanalyze_competition调用 Gemini API 生成竞争格局分析。三个工具的完整实现可分别参见 agent.py。快速开始环境准备与本地运行前置条件Python 3.10仓库 Dockerfile 使用 Python 3.13-slim兼容 3.10Google Cloud 项目及 Vertex AI 可用额度可选Reddit API 凭证在 Reddit 应用管理页面创建应用后获取client_id与client_secret用于社区洞察工具安装依赖进入swot-agent目录后安装 requirements.txt 中的依赖pip install -r requirements.txt核心依赖版本以仓库锁定为准fastapi[standard]0.115.12 google-genai0.8.0 httpx0.28.1 praw7.8.1 pydantic-ai[vertexai]0.0.49 beautifulsoup44.13.3 pytest8.3.5 pytest-asyncio0.26.0其中pydantic-ai[vertexai]是 Agent 编排与 Vertex AI 模型接入的关键依赖praw用于 Reddit 社区洞察google-genai用于竞品分析的独立 Gemini 调用。配置环境变量# Google Cloud 设置必填缺少则 Gemini 客户端无法初始化 export GOOGLE_CLOUD_PROJECTyour_project_id export GOOGLE_APPLICATION_CREDENTIALSpath_to_service_account.json # 可选Reddit API 凭证缺少则社区洞察工具不可用 export REDDIT_CLIENT_IDyour_reddit_client_id export REDDIT_CLIENT_SECRETyour_reddit_client_secret # 可选应用会话密钥生产环境务必设置 export APP_SECRET_KEYyour_secret_key从 agent.py 源码可以看到这些环境变量的实际消费逻辑PROJECT_ID os.environ.get(GOOGLE_CLOUD_PROJECT) SERVICE_ACCOUNT_FILE os.environ.get(GOOGLE_APPLICATION_CREDENTIALS) LOCATION us-central1 MODEL gemini-2.0-flash-live-preview-04-09 REDDIT_CLIENT_ID os.environ.get(REDDIT_CLIENT_ID) REDDIT_CLIENT_SECRET os.environ.get(REDDIT_CLIENT_SECRET)几点关键信息模型服务区域固定为us-central1模型名为gemini-2.0-flash-live-preview-04-09README 中概述为 Gemini 2.0 Flash实际调用的是该模型的具体版本标识若缺少 Google Cloud 凭证SwotAgentDeps中的 Gemini 客户端会被置为None并记录日志提示缺少 Reddit 凭证同理Agent 仍可运行但相关工具会返回空结果。启动应用方式一直接运行入口脚本python main.py方式二使用 FastAPI CLI适合开发热重载fastapi dev --port 8080随后浏览器访问http://localhost:8080。若希望以 Docker 方式运行仓库提供了现成的 Dockerfile其启动命令为CMD [uvicorn, main:app, --host, 0.0.0.0, --port, 8080]使用流程从提交 URL 到可视化分析在首页输入框中输入一个合法 URL如产品官网、竞品主页点击Analyze按钮发起分析AI Agent 按序执行抽取网页内容 → 调用 Gemini 2.0 处理 → 生成结构化 SWOT 洞察 → 以卡片形式呈现查看四象限结果Strengths / Weaknesses / Opportunities / Threats与综合结论。这一交互过程由 templates/index.html 中的 HTMX 属性驱动实现其核心机制是form idswot-form hx-post/analyze hx-triggersubmit hx-target#status ... /form div idstatus hx-get/status hx-triggerload, every 1s hx-swapinnerHTML transition:false .../div div idresult hx-get/result hx-triggerload, every 1s[...] hx-swapinnerHTML .../div即提交表单后立即渲染status.html片段之后浏览器每隔 1 秒向/status轮询进度消息并在拿到完整结果后隐藏状态区、展示result.html渲染的 SWOT 四象限卡片。result.html还借助 marked.js 将analysis字段的 Markdown 文本渲染为Analysis Summary综合结论区。源码剖析Pydantic AI Agent 的三层设计agent.py 是 Agent 的完整实现可按依赖注入 → 结构化输出 → 工具调用三层来理解。第一层依赖注入 SwotAgentDepsdataclass class SwotAgentDeps: request: Optional[Any] None update_status_func: Optional[Callable] None tool_history: List[str] field(default_factorylist) reddit: praw.Reddit ... client: genai.Client ...该数据类承载 Agent 运行所需的全部上下文update_status_func回调函数用于把工具调用进度推送给 Web 层由main.py注入tool_history记录已使用过的工具名称避免重复上报状态reddit与client分别封装 PRAW 与 Google GenAI 客户端初始化失败时置为None并打日志保证应用降级可用。第二层结构化输出 SwotAnalysis 与结果校验Agent 的result_typeSwotAnalysis这是一个基于 Pydantic 的结构化模型class SwotAnalysis(BaseModel): strengths: List[str] # 内部优势 weaknesses: List[str] # 内部劣势 opportunities: List[str] # 外部机会 threats: List[str] # 外部威胁 analysis: str # 综合分析结论Agent 还注册了一个结果校验器swot_agent.result_validator质量门槛如下四个类别每类至少包含2 条要点综合结论analysis长度至少100 字符。若校验不通过则抛出ModelRetry触发 Agent 自动重试retriesRETRIESRETRIES 3这是 Pydantic AI 保证输出质量的核心机制实现在 agent.py。Agent 本身还配备了系统提示词要求模型以战略业务分析师身份工作将社区洞察用于验证发现并分别给出内部视角S/W与外部视角O/T的分析方向见 agent.py。第三层三个工具与进度上报每个工具通过swot_agent.tool(preparereport_tool_usage)注册。report_tool_usage作为prepare钩子在工具被调用前把Using tool: {name}...消息推送到前端实现当前正在使用哪个工具的实时可见性agent.py。工具 1网页内容抽取swot_agent.tool(preparereport_tool_usage) async def fetch_website_content(_ctx, url: str) - str: async with httpx.AsyncClient(follow_redirectsTrue) as http_client: response await http_client.get(url) response.raise_for_status() html_content response.text soup BeautifulSoup(html_content, html.parser) text_content soup.get_text(separator , stripTrue) return text_content使用httpx.AsyncClient跟随重定向抓取 HTML再由BeautifulSoup抽取纯净文本作为模型输入。工具 2Reddit 社区洞察swot_agent.tool(preparereport_tool_usage) async def get_reddit_insights(ctx, query: str, subreddit_name: str googlecloud) - str: subreddit ctx.deps.reddit.subreddit(subreddit_name) search_results subreddit.search(query, limitREDDIT_MAX_INSIGHTS, sortrelevance, time_filterall)默认在r/googlecloud子版块中按相关度搜索最多取REDDIT_MAX_INSIGHTS 5条帖子每条内容截取REDDIT_MAX_INSIGHT_LENGTH 400字符作为社区佐证注入分析。若 Reddit 客户端未初始化工具直接返回空串并记录日志。工具 3Gemini 竞品分析swot_agent.tool(preparereport_tool_usage) async def analyze_competition(ctx, product_name: str, product_description: str) - str: prompt fYou are a competitive analysis expert. Analyze the competition for the following product: ... response await ctx.deps.client.aio.models.generate_content(modelMODEL, contentsprompt) return response.text使用google-genai的异步客户端从关键竞对与市场地位、竞争优势与劣势、市场趋势与潜在颠覆、进入壁垒与竞争压力四个维度生成竞品分析输出作为 SWOT 的外部环境佐证。执行入口 run_agentasync def run_agent(urlANALYZE_URL, depsSwotAgentDeps()): deps.tool_history [] result await swot_agent.run( fPerform a comprehensive SWOT analysis for this product: {url}, depsdeps) if deps.update_status_func: await deps.update_status_func(deps.request, Analysis Complete) return result.dataAgent 收到用户提示词后自主决定调用哪些工具、按什么顺序调用最终产出SwotAnalysis。默认分析目标为ANALYZE_URL https://wikipedia.org也可通过命令行直接验证 Agent 能力python agent.pyWeb 层实现FastAPI 异步编排与进度轮询main.py 实现了完整的 Web 层包含三个核心端点端点方法职责/GET渲染首页index.html/analyzePOST接收 URL创建会话并后台启动 Agent返回status.html片段/statusGET返回该会话的进度消息列表/resultGET返回该会话的 SWOT 分析结果result.html关键设计点会话隔离每个分析请求用request.session[analysis_id]基于请求对象的id()生成标识配合status_storedefaultdict(list)与result_storedict实现多会话互不干扰异步后台任务/analyze通过asyncio.create_task(run_agent_with_progress(...))将耗时的 Agent 推理放入后台立即返回Analyzing...状态避免阻塞 HTTP 请求main.py会话中间件SessionMiddleware使用APP_SECRET_KEY签名会话 Cookie默认开发密钥为your-placeholder-development-key-123若未配置会在启动时打印警告生产环境必须覆盖Cookie 名为swot_session有效期 3600 秒进度模拟由于 Pydantic AI 没有现成的后处理钩子main.py中的emulate_tool_completion通过随机 0–5 秒延时模拟工具执行完成的效果使前端状态区呈现渐进式刷新的体验main.py结果流转update_status收到SwotAnalysis实例时调用model_dump()存入result_store并追加 Analysis complete! 消息收到字符串消息则进入进度队列main.py。前端三个模板各司其职templates/index.html表单、HTMX 轮询配置、动画样式templates/status.html进度消息渲染支持错误红色、加载中旋转图标、工具使用中代码块高亮三种样式templates/result.htmlSWOT 四象限卡片 Markdown 综合结论渲染。部署到 Cloud RunREADME 提供了一键部署命令gcloud run deploy swot-agent --source . --region us-central1 --allow-unauthenticated部署前后的要点为服务账号添加aiplatform.userIAM 角色以便访问 Vertex AI 的 Gemini 模型在 Cloud Run 控制台为APP_SECRET_KEY、REDDIT_CLIENT_ID、REDDIT_CLIENT_SECRET配置 Secret。不配置也能运行但 Reddit 工具将不可用代码中模型区域为us-central1部署时建议与该区域保持一致避免跨区域访问产生额外延迟或配额问题。常见问题排查Gemini 配额超限若收到配额相关报错可在 Google Cloud 控制台申请提升生成式 AI 配额或替换为其他可用模型将 agent.py 中的MODEL常量改为目标模型名Reddit 工具无输出检查REDDIT_CLIENT_ID/REDDIT_CLIENT_SECRET是否已设置且有效未设置时工具返回空串并记录Reddit client not initialized日志Gemini 客户端未初始化确认GOOGLE_CLOUD_PROJECT与GOOGLE_APPLICATION_CREDENTIALS已正确导出代码会在启动时打印对应提示日志开发密钥告警日志中出现 Using default development secret key 时请在启动前设置APP_SECRET_KEY。测试验证Agent 与 Web 端双套测试README 指出测试套件位于tests目录包含 AI Agent 测试与 FastAPI 应用测试两部分。安装测试依赖pip install pytest pytest-asyncio httpx运行全部测试pytest -vAgent 测试tests/test_agent.py通过models.ALLOW_MODEL_REQUESTS False显式禁止测试期间的真实模型请求保证测试零成本、可离线运行验证SwotAnalysis结构化模型可正常实例化且字段正确验证SwotAgentDeps初始化后tool_history、request、update_status_func的默认值以及 Gemini/Reddit 客户端属性存在校验SwotAnalysis.model_fields是否完整包含strengths/weaknesses/opportunities/threats/analysis五个必填字段。Web 测试tests/test_main.py基于fastapi.testclient.TestClient覆盖首页GET /返回 200 且包含 SWOT Analysis 字样/analyze对合法 URL、非法 URL、空 URL 均能正常响应/status、/result无结果时返回空内容端点可用完整分析流程提交 → 查状态 → 查结果链路通畅连续 3 个并发请求均被接受验证异步任务调度在多请求场景下的稳定性。项目结构速览gemini/sample-apps/swot-agent/ ├── main.py # FastAPI 应用路由、会话、后台任务与进度轮询 ├── agent.py # Pydantic AI Agent三个工具、结构化输出与校验 ├── Dockerfile # 容器化构建与启动配置uvicorn :8080 ├── requirements.txt # 全部 Python 依赖及锁定版本 ├── templates/ # 前端模板 │ ├── index.html # 首页输入表单与 HTMX 轮询 │ ├── status.html # 分析进度状态片段 │ └── result.html # SWOT 四象限结果卡片 ├── tests/ # 测试套件 │ ├── test_agent.py # Agent 与数据模型测试 │ └── test_main.py # FastAPI 端点与并发测试 └── README.md # 项目文档小结一个可复用的多工具 Agent 范式swot-agent 虽以 SWOT 分析为业务场景但其架构本身是一个高度可复用的 LLM 应用范式Pydantic AI 负责工具编排与结构化输出质量result_validator ModelRetryFastAPI asyncio 负责异步长任务与多会话隔离HTMX 负责低成本的实时进度反馈Cloud Run 负责一键部署。你可以基于该示例将三个工具替换为任意业务数据源数据库查询、内部 API、文档检索等并将SwotAnalysis模型替换为你的业务结构化 Schema即可快速搭建出具备同样实时交互体验的企业级 AI Agent 应用。【免费下载链接】generative-aiSample code and notebooks for Generative AI on Google Cloud, with Gemini Enterprise Agent Platform项目地址: https://gitcode.com/GitHub_Trending/ge/generative-ai创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表