跳转至

引擎系统配置 (Engine Configuration)

在个人工作站或服务器上运行 Griptape Nodes 执行引擎时,系统提供了一整套实用工具来灵活管理各项底层配置。随着工作流项目复杂度不断攀升,或需要与跨部门团队协同共享工程时,深入理解配置系统的加载机制、文件层级与环境变量覆盖顺序至关重要。

安装引导阶段,系统已自动为你执行过 gtn init 初始化。

若需要查找具体的某项配置键名,请参阅 配置完全技术参考。该参考手册按业务模块系统列举了所有配置项的字段名、数据类型、默认缺省值、对应环境变量与详细技术说明。


在可视化编辑器中修改配置

修改配置的最简捷推荐方式,是使用内置在编辑器顶部的 配置编辑器 (Configuration Editor):

  1. 打开编辑器顶部菜单栏的 Settings(设置),选择 All Settings(所有设置)。该子菜单也提供了诸如 Engine Settings(引擎设置)或 Library Settings(算子库设置)等直达快捷入口;
  2. 在弹窗左侧导航栏中选择配置分类:Editor Settings(编辑器设置)、Engine Settings(引擎设置)、File System(文件系统)、Libraries(算子库)、Library Settings(算子库专属设置)、MCP Servers(MCP 服务)、API Keys & Secrets(密钥与机密管理),或直接在顶部搜索框中按名称实时过滤;
  3. 修改配置值后,配置编辑器会自动为你将修改同步持久化至底层的配置文件中。

需要注意的是:部分系统级底层配置项仅在引擎守护进程重启后才会重新加载生效,例如 static_server_base_url 静态文件服务根地址(详见下文的 静态多媒体文件服务器配置)。

本文档的其余部分将深入剖析底层的配置存储逻辑:各个层级配置文件的物理路径、环境变量覆盖机制以及合并优先级裁决原则。通常仅在编写自动化部署脚本、无头集群静默调度或构建团队统一镜像环境时,才需要直接手写这些配置文件。


配置文件加载机制与合并优先级 (Configuration Loading)

Griptape Nodes 采用严格的搜索路径与优先级链路从环境变量和配置文件中逐级解析配置项。

1. 环境变量与机密凭据 (.env)

环境变量用于安全存储 API 密钥等高敏感机密凭证。Griptape Nodes 会在启动时自动读取 env 文件,将机密安全注入到应用运行环境中:

  • 主系统级 .env 文件从操作系统的用户配置根目录中读取:xdg_config_home() / "griptape_nodes" / ".env"(在 Linux/macOS 上通常为 ~/.config/griptape_nodes/.env,Windows 上位于对应 AppData 路径);
  • 该文件专门用于安全存储诸如 GT_CLOUD_API_KEY、OPENAI_API_KEY 等外部大模型调用凭据;
  • 提示:通常无需手动编辑该文件,Griptape Nodes 在前端设置面板中提供了安全的操作界面。

2. 核心配置文件 (griptape_nodes_config.json)

配置文件承载着维持 Griptape Nodes 正常运转的关键基础设施路径(例如算子库的落盘寻址目录)以及用户的个性化偏好。

  • 若全系统未找到任何配置文件,引擎将采用硬编码在代码内部的出厂默认值兜底启动;
  • 配置文件始终为 JSON 格式 (griptape_nodes_config.json)。系统支持最多从三个不同层级的物理文件、一个运行时内存覆盖层以及环境变量中按序加载并多层合并;
  • 加载顺序与层级合并优先级(数字越小越先加载,数字越大优先级越高,高层级无条件覆盖低层级):
    1. 原生出厂缺省值 (Built-in defaults) —— 内置于软件代码中的基线硬编码;
    2. 用户全局配置 (User config) —— ~/.config/griptape_nodes/griptape_nodes_config.json。代表当前单机设备上的全局基线偏好;
    3. 项目同级配置 (Project-adjacent config) —— <project_dir>/griptape_nodes_config.json。当某个具体项目被激活为活动项目时按需动态加载。常用于随项目工程代码库一起提交并共享通用的团队项目级默认项;
    4. 工作区配置 (Workspace config) —— <workspace_dir>/griptape_nodes_config.json。在解析完工作区物理根路径后加载。用于存放覆盖项目公共配置的本地个人特定配置。当工作区目录与项目目录完全相同时,此文件等同于项目同级配置,系统不会重复加载;
    5. 项目专属工作区运行时覆盖 (Per-project workspace override) —— 当当前活动项目的物理路径命中了用户全局配置中 project_workspaces 映射字典中的某个 Key 时,该工作区路径会被强制注入。该层级仅作用于 workspace_directory 单一字段,且会强制覆盖上述所有配置文件的取值。该数据不落盘为物理文件,在 gtn self info 中展示为 runtime 内存层。项目自身的模板配置 workspace_dir 或从父级项目继承来的工作区也遵循此机制;
    6. 环境变量覆盖 (Environment variables) —— 带有 GTN_CONFIG_* 前缀的环境变量拥有全系统绝对最高裁决优先级,将压倒上述一切文件层级的配置!

3. 默认值与清除机制

  • 引擎的一大关键默认项是 workspace_directory:如果在所有已加载的配置文件中均未指定该字段,系统默认兜底采用 <当前终端运行目录>/GriptapeNodes;
  • 如果某个配置项的值在文件中被留空(如 "" 或 null),表示该文件“不声明此项”。清空某个配置项等同于将其从该文件中彻底移除,此时系统会自动沿着优先级链路顺延下沉,采用更低层级文件中的值或出厂缺省值,而无需手动逐行删除 JSON 键。

4. 运行时配置管理器 (ConfigManager)

在完成初次启动配置合并后,后端的 ConfigManager 单例负责接管所有运行时的动态状态。当用户在画布或界面上执行动态修改(例如新注册一个本地工作流)时,ConfigManager 会自动将该变更回写至当前所解析出的 workspace_directory 下的 griptape_nodes_config.json 文件中。


典型配置加载链路示例

场景 1:采用全套标准默认值

  • 你执行了 gtn init 并全程一路回车确认;
  • 初始化程序自动创建了 ~/.config/griptape_nodes/griptape_nodes_config.json 与 ~/.config/griptape_nodes/.env,并将 workspace_directory 写入为执行初始化时所在目录下的 GriptapeNodes 子文件夹;
  • 随后你在 /home/user/my_project/ 目录下运行 gtn 启动服务;
  • 文件拓扑结构:

    /home/user/
        my_project/          <-- 运行 gtn 时的终端当前工作目录 (CWD)
            GriptapeNodes/   <-- 默认工作区 (后续动态保存的配置文件存放于此)
            my_flow.graph.json
        .config/
            griptape_nodes/
                .env                     # 加载注入敏感环境变量
                griptape_nodes_config.json # 记录 workspace_directory = /home/user/my_project/GriptapeNodes
    
  • 加载执行时序:

    1. 加载代码出厂缺省值;
    2. 加载 ~/.config/griptape_nodes/griptape_nodes_config.json 并覆盖默认值;
    3. 最终生效结果:工作区路径精准指向 /home/user/my_project/GriptapeNodes。后续通过界面产生的运行期变更将持久化保存进 /home/user/my_project/GriptapeNodes/griptape_nodes_config.json。

场景 2:显式指定独立的高速工作区

  • 你执行了 gtn init --workspace-directory /data/gtn_work;
  • 系统全局配置将 workspace_directory 固化为 /data/gtn_work;
  • 你在 /data/gtn_work/ 内部手动放置了一份 griptape_nodes_config.json 用于微调该工作区的专有参数;
  • 你在任意其他目录(如 /home/user/some_dir/)启动 gtn;
  • 文件拓扑结构:

    /home/user/
        some_dir/            <-- 运行 gtn 时的终端目录
        .config/
            griptape_nodes/
                .env
                griptape_nodes_config.json # 声明 workspace_directory = /data/gtn_work
    /data/
        gtn_work/            <-- 自定义工作区根路径
            griptape_nodes_config.json # 工作区专属配置 (优先级压倒全局配置)
            project_flows/
    
  • 加载执行时序:

    1. 加载代码默认值;
    2. 加载全局配置,将工作区重定向为 /data/gtn_work;
    3. 寻址并加载工作区专属的 /data/gtn_work/griptape_nodes_config.json,将其合并并覆盖对应的全局配置;
    4. 最终生效结果:工作区目录锁定为 /data/gtn_work,且工作区内部定义的个性化设置优先于全局机台配置生效。

场景 3:无全局配置时的纯净启动

  • 在一台全新未执行过 gtn init 的机器上直接运行 gtn;
  • 全局路径未找到任何配置文件,当前亦无活动项目;
  • 最终生效结果:引擎纯净依赖出厂缺省值启动。工作区自动 fallback 回退至 <当前终端运行目录>/GriptapeNodes,且首次持久化动作将在该路径下就地创建新配置文件。

环境变量强制覆盖机制 (GTN_CONFIG_*)

任何配置项均可通过带有 GTN_CONFIG_ 前缀的环境变量进行单点或全局强行覆盖。顶层配置键名直接采用大写形式:

GTN_CONFIG_<配置项大写键名>=<数值>

对于嵌套在对象内部的多级子配置(例如归属于 worker、agent 或 library 命名空间下的子属性),层级之间使用双下划线 (__) 进行分隔:

GTN_CONFIG_<父级模块大写>__<子属性大写>=<数值>

为什么必须使用双下划线?
因为很多独立的配置键名本身就天然包含单个下划线(例如 worker_heartbeat_timeout_s)。若采用单下划线,解析器将无法分辨 WORKER_HEARTBEAT_TIMEOUT_S 到底是指顶层名为 worker_heartbeat_timeout_s 的独立键,还是指 worker.heartbeat_timeout_s 这个二级对象。由于任何系统键名均不包含双下划线,因此 __ 能够 100% 毫无二义性地标识对象的深层下钻。

环境变量具备全系统最高统治优先级——直接覆盖全局 JSON、项目级 JSON、工作区级 JSON 以及运行时覆盖层。

常见核心配置与环境变量映射对照表

配置字段路径 对应强行覆盖的环境变量
workspace_directory GTN_CONFIG_WORKSPACE_DIRECTORY
libraries_directory GTN_CONFIG_LIBRARIES_DIRECTORY
project_file GTN_CONFIG_PROJECT_FILE
log_level GTN_CONFIG_LOG_LEVEL
storage_backend GTN_CONFIG_STORAGE_BACKEND
worker.heartbeat_timeout_s GTN_CONFIG_WORKER__HEARTBEAT_TIMEOUT_S
library.lazy_node_loading GTN_CONFIG_LIBRARY__LAZY_NODE_LOADING
agent.system_prompt GTN_CONFIG_AGENT__SYSTEM_PROMPT

此机制在 CI/CD 自动化集群、Docker 容器化镜像构建与 Kubernetes 部署中极其强大,允许你在不修改任何落盘文件的前提下静默装配引擎行为:

GTN_CONFIG_PROJECT_FILE=/shared/studio-project.yml gtn
GTN_CONFIG_WORKER__HEARTBEAT_TIMEOUT_S=30 gtn
GTN_CONFIG_LIBRARY__LAZY_NODE_LOADING=false gtn
GTN_CONFIG_AGENT__SYSTEM_PROMPT="请始终使用严谨的工业化语气回答。" gtn

系统在加载环境变量时会自动将其转换为该字段声明的强类型(例如布尔字段中的 "false" 字符串会被正确转换为 Python 的 False,而非真值文本;数字 "30" 会被转换为整型数值 30)。

环境变量的两处技术局限与特殊行为

  1. 不支持列表 (List) 类型配置与大小写敏感键名:列表类型数据无法通过扁平的字符串环境变量清晰表达,因此诸如 app_events.on_app_initialization_complete.libraries_to_register 或 mcp_servers 等数组项无法通过环境变量注入。映射字典型变量可以通过 GTN_CONFIG_<模块>__<子键>=<值> 写入,但因解析器会强制将变量名全部转为小写,导致区分大小写的 Key(如区分大小写的项目 ID 路径或全大写 Secret 键名)无法可靠映射。此类复杂配置请直接编写 griptape_nodes_config.json;
  2. 非法值的兜底逻辑差异:当传入无法解析的非法格式数据时,绝大多数配置项会输出告警并自动退回使用配置文件中的值;但有四项关键配置例外:log_level、workflow_execution_mode、thread_storage_backend 与 library.dependency_install_behavior。若这四项接收到非法枚举值,系统将静默直接回退至内置出厂默认值,且不会输出报错警告。

递归发现最大扫描深度 (discovery_max_depth)

当配置项中的 projects_to_register、libraries_to_register 或 workflows_to_register 指向某个物理目录时,引擎会在启动引导期间递归深潜扫描该目录下的有效文件(依次为项目配置、算子库清单与工作流文件)。为防止遭遇过深的文件系统死循环软链接导致启动阻塞,系统引入了 discovery_max_depth 深度截断参数。

默认深度为 5 层子目录,已充分满足绝大多数生产目录规划。你可以在配置文件中调整,或通过环境变量覆盖:

GTN_CONFIG_DISCOVERY_MAX_DEPTH=20 gtn   # 支持更深层级的复杂文件树

若将其设为 0,则引擎仅扫描目标根目录自身,严禁深潜探测任何子文件夹。


工作区物理目录规划 (Workspace Directory)

工作区是项目工程、保存的工作流以及生成多媒体资产的统一根基。尽管系统默认提供 <CWD>/GriptapeNodes 作为缺省路径,但你完全可以自由定义。

系统严格遵守你在配置文件中写入的绝对物理路径,绝对不会在代码里强行硬编码或盲目拼凑任何名为 GriptapeNodes 的魔法子目录。

将算子库与工作区分离以提升性能

在出厂默认模式下,通过系统安装下载的第三方算子库会默认存放在工作区内部的 libraries/ 相对路径下(因为 libraries_directory 缺省为相对路径)。如果你的本地工作区放置在速度较慢的机械硬盘、网络共享 NAS 或远程云挂载存储盘上,频繁从远程网络磁盘读取 Python 算子代码会导致图执行发生严重的性能衰减与延迟卡顿。

最佳性能架构实践:将 libraries_directory 显式重定向至本地超高速 SSD 固态硬盘的绝对路径,而将庞大的工作区多媒体资产留在远程网络存储盘中。只要 libraries_directory 声明为绝对路径,系统便会彻底无视工作区位置,直连本地高速缓存:

{
    "workspace_directory": "/Volumes/team-share/GriptapeNodes",
    "libraries_directory": "/Users/me/.griptape-nodes-libraries"
}

通过环境变量等价配置:

GTN_CONFIG_LIBRARIES_DIRECTORY=/Users/me/.griptape-nodes-libraries gtn

同样的相对 vs 绝对路径寻址规则完全适用于 sandbox_library_directory 与 static_files_directory,使你能够极为灵活地实现冷热数据分离治理。


引擎对外发布的系统级环境变量

前文介绍的所有环境变量均是由你主动配置并灌入系统的。与此同时,Griptape Nodes 执行引擎在启动引导完毕后,也会在其自身的运行时环境中主动向外发布一个只读的系统环境变量,供各个项目工程与上层算子在无硬编码的前提下透明读取:

引擎发布的变量名 承载的具体数值与含义
GTN_DEFAULT_LIBRARIES_ROOT 当前引擎底层算子库实际落盘安装目录的全局绝对物理路径。

该变量由引擎自动计算生成,严禁由用户手动去赋值。其核心技术价值在于:允许项目工程文件(Project YAML)能够以标准化语法引用当前运行机器上的公共算子库根目录,彻底避免在每个项目文件中硬编码不同操作系统的绝对路径:

libraries_dir: "${GTN_DEFAULT_LIBRARIES_ROOT}/shared"

这会自动解析到 gtn init 安装官方标准库的公共物理目录中,从而让整个项目工程直接复用现存的算子库代码树,杜绝反复重复下载。

变量缺失会导致项目加载强行失败

如果一个项目工程文件中显式使用了 ${GTN_DEFAULT_LIBRARIES_ROOT} 宏语法,但所运行的引擎版本较旧、尚未支持发布该变量,项目工程在加载阶段会被引擎立即拒收并拒绝打开。请确保团队引擎保持最新版本。


静态多媒体文件服务器配置 (Static File Server)

当 Griptape Nodes 运行时,后端会自动在本地拉起一个高性能轻量静态 HTTP 服务器,用于向前端编辑器画布高效呈现工作流生成的图像、音频与视频缩略图。

配置项 static_server_base_url 控制着引擎在为这些多媒体资产生成访问 URL 时所采用的基准前缀。出厂默认值为 http://localhost:8124。在复杂的企业内网、反向代理、内网穿透或容器化场景下,你通常需要对该 URL 进行重写。

何时需要重写此配置?

  • 使用内网穿透隧道:使用 ngrok、Cloudflare Tunnel 或 frp 将本机服务暴露至外部互联网进行远程演示;
  • 容器与微服务部署 (Docker / K8s):容器内部监听的端口与外部 Ingress / 宿主机映射端口不一致;
  • 前置反向代理网关:引擎挂载在 Nginx、Apache 或企业 API 网关后方,外部流量通过特定子路径或域名统一接入;
  • 跨机远程开发:引擎运行在机房高性能主机上,而你在笔记本的浏览器中通过局域网 IP 进行画布编辑;
  • 团队实时协同评审:与团队其他成员共享正在运行的工作流实例,对方需要能够实时预览你画布上生成的高清多媒体渲染图。

配置与生效步骤

在编辑器的配置设置面板中找到 static_server_base_url 并填入对外暴露的完整根协议与域名端口(若留空则自动回退至默认的 http://localhost:8124)。

重要提示:修改静态文件服务器配置后,必须完全重启 Griptape Nodes 引擎服务方能使新端口与 URL 路由生效!

经典实战场景:配合 ngrok 穿透调试 Webhook

假设你正在调试外部 Webhook 集成,需要让外部第三方服务能够直接抓取你的工作流生成图:

  1. 启动 ngrok 穿透隧道:ngrok http 8124;
  2. 复制生成的公网 HTTPS 域名(例如 https://abc123.ngrok.app);
  3. 打开 Griptape Nodes 编辑器顶部的 Settings 设置弹窗;
  4. 将 static_server_base_url 的值更新为你复制的 ngrok 公网地址;
  5. 重启本地引擎守护进程:gtn。

配置完成后: - 本地与远程浏览器均能稳定通过公网隧道拉取生成的多媒体缩略图; - 外部 Webhook 能够直接访问图片资源; - 引擎已自动针对该隧道域名完成跨域资源共享 (CORS) 策略放行。