ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

FinceptTerminal FinAgent Core 深度解析:基于 Agno 框架的单一可配置金融 Agent 系统

2026/9/10 6:19:25 拓冰建站 浏览量
FinceptTerminal FinAgent Core 深度解析:基于 Agno 框架的单一可配置金融 Agent 系统 FinceptTerminal FinAgent Core 深度解析基于 Agno 框架的单一可配置金融 Agent 系统【免费下载链接】FinceptTerminalFinceptTerminal is a modern finance application offering advanced market analytics, investment research, and economic data tools, designed for interactive exploration and>项目地址: https://gitcode.com/GitHub_Trending/fi/FinceptTerminalFinAgent Core 是 FinceptTerminal 桌面终端Qt/C 前端背后的统一 AI Agent 引擎其设计哲学是一个 Agent 实例服务整个终端通过 JSON 配置在运行时动态切换模型供应商、工具集、系统提示词与记忆策略从而支撑 Portfolio、Geopolitics、Research 等各个页签的差异化智能能力同时通过 Persona 级状态隔离保证多用户、多角色互不干扰。读完本文你将掌握 FinAgent Core 的架构脉络、完整配置 Schema、模型/工具接入方式、Qt/C 调用协议以及 Persona 数据隔离与迁移方案能够直接基于该仓库上手配置与二次开发。架构总览单实例、动态适配、纯框架实现FinAgent Core 的核心定位在 finagent_core/README.md 开篇即被点明——Single configurable agent system for the entire terminal。整个体系只有三层没有任何自定义的执行器代码CoreAgent (single instance) ↓ AgentFactory (creates Agno agent) ↓ Agno Agent (adapts to config)CoreAgentcore_agent.py对外暴露的统一门面内部持有 PersonaRegistry每次run()按(user_id, agent_id)解析出对应的运行时AgentFactoryagent_factory.py根据配置创建 Agno Agent 的工厂负责模型实例化、工具加载、知识库与存储装配Agno Agent由 Agno 框架原生提供的 Agent 对象FinAgent Core 不重写执行循环只做配置到 Agno 参数的适配从而完整继承 Agno 的 Memory、Teams、Workflows、Knowledge、Reasoning、Guardrails、Evaluation、Tracing、Compression、Hooks、Structured Outputs 等全部框架能力。从源码结构看core_agent.py 的类注释明确列出了这套能力矩阵get_system_info()则以version: 2.0.0, framework: agno对外暴露能力清单包含multi_agent_teams、workflow_orchestration、knowledge_base_rag、agentic_memory等 17 项特性。配置 Schema一份 JSON 定义 Agent 的一切FinAgent Core 的配置是一个纯 JSON 对象README 给出了完整 Schema结合源码可进一步展开每个字段的语义与默认值{ model: { provider: openai|anthropic|google|groq|ollama|deepseek, model_id: gpt-4-turbo, temperature: 0.7, max_tokens: 4096 }, name: Agent Name, instructions: System prompt..., tools: [yfinance, calculator, duckduckgo], memory: true, output_format: markdown|text|json, knowledge: { path: docs/, vector_db: {type: pgvector, url: ...}, embedder: {type: openai} }, storage: { type: sqlite|postgres, db_file: sessions.db } }各字段在 config_loader.py 的_validate_config中有明确的校验与默认值逻辑字段是否必填默认值说明model.provider是—缺失直接抛ValueErrormodel.model_id是—缺失直接抛ValueErrormodel.temperature否0.7采样温度model.max_tokens否4096单次输出上限name否f{tab_name.title()} Agent如portfolio页签 →Portfolio Agentinstructions否You are a helpful AI assistant.系统提示词tools否[]工具名列表由 ToolsRegistry 惰性加载memory否false布尔值或{enabled: true, ...}对象output_format否markdownmarkdown/text/json此外core_agent.py 的run()方法还支持若干进阶键reasoning布尔或含min_steps/max_steps/model的对象、markdown默认true、session_id、debug、agent_id、user_id、mcp_servers自定义 MCP 服务器列表、max_iterations工具调用轮次上限默认 10、最高 20见_create_agent中的tool_call_limit逻辑。三个核心组件职责与关键实现1. CoreAgent — 单实例门面core_agent.py 的CoreAgent构造函数只做两件事保存api_keys与user_id并创建PersonaRegistry。所有真正的状态都下沉到 PersonaRuntimeCoreAgent 本身保持轻量、可复用。其run()方法core_agent.py的执行路径是解析user_id优先级显式参数 → 构造参数 → config →default与agent_id显式参数 →config[agent_id]→config[id]→unnamed然后交给PersonaRegistry.get_or_create()取缓存或新建运行时执行。除了单 Agent 执行CoreAgent 还提供run_team()多 Agent 协作遍历team_config[agents]/[members]为每个成员解析运行时再用TeamModule编排团队成员的 keying 与单 Agent 完全一致因此团队中的巴菲特与独立运行的巴菲特共享同一份记忆与存储run_workflow()工作流编排按steps逐步骤执行支持为步骤注入agent_configrun_with_output_model()结构化输出通过OutputModelRegistry查找 Pydantic 模型并用OutputValidator校验返回数据模块装配setup_guardrails/setup_evaluation/setup_tracing/setup_compression/setup_hooks/setup_agentic_memory等链式方法全部支持传配置定制、不传配置用金融领域默认值例如GuardrailsModule.default_financial()、CompressionModule.for_financial_data()。对于希望以编程方式构建配置的开发core_agent.py 提供了CoreAgentBuilder链式构建器如with_model(openai, gpt-4o).with_tools([yfinance, duckduckgo]).with_memory().with_reasoning(chain_of_thought).build()。2. AgentFactory — Agno Agent 装配工厂agent_factory.py 的AgentFactory.create_agent()是 README 中架构图第二层AgentFactory的直接实现依次创建模型、加载工具、组装 agent_kwargs再处理 memory / knowledge / storage。其_create_model()agent_factory.py的分支逻辑非常值得关注自定义base_url任何配置了base_url的 provider除 Ollama 外都会被路由到OpenAIChat 该 base_url并强制使用标准 role_mapsystem→system以兼容 MiniMax、OpenRouter、LM Studio 等 OpenAI 兼容端点——这是一个配置支持任意兼容端点的关键机制OpenAI默认使用标准 role_mapAgno 默认把system映射为developer而 gpt-* 系模型会拒绝developer角色仅当model_id以o1/o3/o4开头时才保留 developer 映射Ollama走独立的Ollama分支host替代base_url温度与 max_tokens 通过options字典传递其中 max_tokens 对应 Ollama 的num_predict键——README 中本地部署场景的实现细节正在于此OpenRouter固定使用https://openrouter.ai/api/v1作为 base_url兜底分支为OpenAIChat保证任何未识别 provider 也能以 OpenAI 兼容方式工作。API Key 的解析优先级在_get_api_key()agent_factory.py中定义先查传入的api_keys字典再回退到环境变量。3. ConfigLoader — 页签配置加载与校验config_loader.py 的ConfigLoader面向按终端页签组织配置的使用方式load_config(tab_name)读取configs/{tab_name}_config.jsonsave_config()写回list_configs()枚举所有*_config.json。仓库中 configs/ 目录下已内置 16 份真实配置覆盖 portfolio、trading、geopolitics、macro、polymarket、sentiment 等角色。支持的模型供应商README 中的模型表是当前源码实现能力的直接反映ProviderModelsOpenAIgpt-4o, gpt-4-turbo, gpt-4, gpt-3.5-turboAnthropicclaude-sonnet-4-5, claude-3-5-sonnet, claude-3-opusGooglegemini-2.0-flash, gemini-1.5-proGroqllama-3.3-70b, mixtral-8x7bOllamallama3.3, mistral, mixtral (local)DeepSeekdeepseek-chat, deepseek-coder对应关系可直接在 agent_factory.py 与 registries/models_registry.py 中验证。ModelsRegistry还提供了list_providers()用于运行时枚举而 main.py 中的active_llm注入机制允许 Qt/C 侧LlmService把用户在设置页选中的完整模型配置provider、model_id、api_key、base_url、temperature、max_tokens直接覆盖进config[model]并会对 base_url 做归一化处理剥离/anthropic、/openai等 SDK 路由前缀并为 minimax、deepseek、groq 等已知主机自动补/v1。工具系统100 Agno 工具的统一入口README 列出的工具分类Finance / Search / Development / Knowledge只是起点完整的 400 余行工具目录位于 registries/tools_registry.py。ToolsRegistry采用惰性加载设计按需 import 工具类以降低启动开销分类代表工具Financeyfinance、financial_datasets、openbbSearchduckduckgo、tavily、exa、serpapi、bravesearch、searxngWebwebsite、webbrowser、firecrawl、crawl4ai、jina、trafilaturaDevelopmentpython、shell、file、docker、e2bDevopsgithub、gitlab、jira、linear、notion、todoistDatabasesql、postgres、duckdb、neo4j、redshiftDatapandas、csv_toolkit、visualizationCommunicationemail、gmail、slack、discord、telegramGooglegoogle_drive、googlesheets、googlecalendarSEC EDGARedgarFincept 内部 MCP无需 API Key在_create_agent()装配时core_agent.py工具来源有三个config[tools]中的名字列表、config[mcp_servers]中用户自配的 MCP 服务器支持 stdio / sse / streamable-http 三种 transport见_connect_mcp_servers以及terminal_mcp_endpointterminal_tools指向的终端内部 MCP 桥通过 tools/terminal_toolkit.py 暴露导航、行情、组合等能力并支持tools_dry_run只读演练模式与独立的terminal_mcp_destructive_token写操作令牌。只要加载了工具Agent 就会被赋予tool_call_limit默认 10上限 20以约束自主工具循环防止无限迭代。从 Qt/C 应用调用JSON 载荷协议FinceptTerminal 的 C 端并不直接 import Python 类而是通过 main.py 这个唯一入口以 JSON 载荷交互。README 中给出的命令行示例即为标准用法# Via agent_manager.py python agent_manager.py execute_single_agent \ {query: Analyze NVDA stock} \ {model: {provider: anthropic, model_id: claude-sonnet-4-5}, instructions: Portfolio analyst} \ {ANTHROPIC_API_KEY: sk-...}main()接收的载荷结构为{action: ..., api_keys: {...}, params: {...}, config: {...}, active_llm: {...}}由dispatch_action()按 action 名路由。从 main.py 可以看到完整 action 清单核心执行run、run_team、run_workflow、run_structured动态加载discover_agents带 30 秒内部超时保护、list_agents、create_agent金融工作流stock_analysis、portfolio_rebal、risk_assessment、macro_scan、earnings_brief、sector_rotation、options_scan、sentiment_scan、custom_query记忆/知识store_memory、recall_memories、search_knowledge治理与评估check_guardrails、evaluate系统信息system_info、list_tools、list_models、list_output_models可恢复任务start_task、resume_task、get_task、list_tasks、agentic_pause_task、agentic_cancel_task调度与技能agentic_schedule_create/list/delete/set_enabled/tick、agentic_skills_list、agentic_skill_deletePaper Tradingpaper_execute_trade、paper_get_portfolio、paper_get_positions。该入口还做了两件工程化处理强制 UTF-8 编码 stdout/stderr避免 Windows cp1252 下 emoji 导致崩溃、把所有日志定向到 stderr 并让 action 内部输出重定向到 stderr保证 stdout 上只出现一个干净的 JSON 信封供 C 端解析。另外支持--stream流式模式chunk 类型为 THINKING / TOKEN / TOOL / TOOL_RESULT / ERROR / DONE与--stdin大载荷输入、file文件载荷。真实配置示例Portfolio Agent仓库内置的 configs/portfolio_agent.json 是一份可直接学习的完整示例其结构展示了 Schema 在实际角色中的用法model选用openai/gpt-4-turbo、温度压低到0.2组合分析需要确定性输出instructions是数段结构化系统提示词明确要求先确认持仓与目标配置再分析、逐项计算漂移、2% 才标记、禁止用 LLM 推理计算 Sharpe 或最优权重tools仅开放[yfinance, calculator]reasoning: true开启扩展思考。这印证了同一 Schema、不同内容即不同角色的设计——configs/ 下其余 15 份配置macro、geopolitical、polymarket、sentiment 等遵循完全相同的结构。Persona 隔离多角色状态互不泄漏2026-04-18 起引入的 Persona 隔离机制是 FinAgent Core 的多租户基石每个角色Buffett、Ackman、Munger……在自己的PersonaRuntime中运行会话、记忆、知识库、Agentic Memory 各占独立 SQLite 文件状态绝不跨角色泄漏。磁盘布局路径由 resources.py 统一推导该模块是路径的唯一事实来源禁止其他模块手拼路径id 会经过sanitize()清洗非[A-Za-z0-9_-]字符替换为_FINAGENT_DATA_DIR/users/user_id/personas/agent_id/ ├── sessions.db # Agno SqliteStorage 会话历史 ├── memory.db # Agno SqliteMemoryDb 长期记忆 ├── knowledge/ # 向量库目录 └── agentic_memory.db # AgenticMemoryModule SQLiteFINAGENT_DATA_DIR的默认值resources.pyWindows 下为%LOCALAPPDATA%/com.fincept.terminal/finagent其他平台为$XDG_DATA_HOME/com.fincept.terminal/finagent无 XDG 时回退~/.local/share/...也可用环境变量显式覆盖。运行时缓存调优persona_registry.py 的PersonaRegistry是(user_id, agent_id)为键的 LRU 缓存FINAGENT_RUNTIME_CACHE_SIZE控制内存中保留的PersonaRuntime实例数上限默认 8非法值回退 8小于 1 收敛到 1超限时淘汰最久未使用的实例并调用其close()幂等依次尝试close/shutdown/dispose见 persona_runtime.py而 SQLite 文件始终保留在磁盘上。PersonaRuntime.build()persona_runtime.py会为每个 persona 预建独立的 memory、storage、knowledge、agentic memory 后端并注入 Agno Agent。从旧版布局迁移2026-04-18 之前的共享文件agent_memory.db、agent_storage.db以及memories_*.db不会被新代码读取也不会被删除留在磁盘上以保证回滚安全。确认新布局工作正常后可手动清理rm FINAGENT_DATA_DIR/agent_memory.db rm FINAGENT_DATA_DIR/agent_storage.db rm current-working-dir/memories_*.dbJSON 配置零改动兼容所有既有 persona JSON 无需任何修改即可继续工作。规则是若 persona 显式指定了memory.db_path、storage.db_path或knowledge.path以 JSON 为准若省略则由(user_id, agent_id)推导出 per-persona 默认路径该优先级逻辑位于 persona_runtime.py。隔离机制的正确性由测试直接验证tests/test_persona_runtime.py 覆盖构建时创建 persona 目录memory/storage 路径包含 user 与 agent idclose() 幂等二次调用不重复关闭同一用户的两个 persona 使用不同路径tests/test_isolation_integration.py 与 tests/test_agentic_memory_isolation.py 则从集成层面保证状态不跨 persona 泄漏。关键设计收益与后续演进综合 README 与源码FinAgent Core 的核心设计取舍可以归纳为单 Agent 实例一个 CoreAgent 服务整个终端避免每页签维护一套 Agent 代码动态配置同一实例按页签/角色切换行为前端只需下发 config query纯框架不写自定义执行器100% 依赖 Agno 框架能力天然获得框架后续更新可扩展新增工具只需在 ToolsRegistry 目录登记一个懒加载条目新增模型只需在模型注册表补一个分支强隔离Persona 级 SQLite 文件 LRU 运行时缓存兼顾多租户安全与内存占用。README 列出的后续路线Next Steps是前端下发 config query → CoreAgent 按配置适配并响应 → 各页签专属配置存入数据库未来。当前版本中配置已落地为 configs/ 下的 JSON 文件并通过ConfigLoader管理而存入数据库仍为演进方向。从源码看main.py的save_session/get_session等 Repository 动作已经为会话持久化铺好了数据库层页签配置的入库化是自然的下一步。【免费下载链接】FinceptTerminalFinceptTerminal is a modern finance application offering advanced market analytics, investment research, and economic data tools, designed for interactive exploration and>项目地址: https://gitcode.com/GitHub_Trending/fi/FinceptTerminal创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考