KADATH
Kernel for Agentic Darwinian Adaptation, Tooling, and Heredity
KADATH接受一个目标,并耗费海量模型token来进化出越来越擅长实现该目标的智能体。经过多代繁衍,一个智能体种群尝试完成目标,根据可测量的基准独立评分,向最强表现者学习,变异、繁殖,并淘汰低效方法。KADATH不把所有赌注押在一个提示词或一个智能体上,而是通过反复竞争和选择,为用户期望的结果产出尽可能优秀的智能体。
被进化的不仅仅是响应。每个基因组包含一个完整的可编辑智能体框架:其系统提示、Python实现、工具、依赖声明和支持文件。KADATH将进化控制平面置于基因组之外,因此一个有机体可以在不获得改写自身分数、目标、调度器、谱系或隔离规则能力的情况下改进自己。
由 i3t4an 制作。感谢 Hugging Face 的 smolagents。
系统一览
这里有两个不同的层面:
- 内核拥有运行、基准、截止时间、容器、证据、评分公式、种群选择、数据库、Git谱系、恢复、导出和清理。它本身不进化。
- 有机体执行目标。它们的完整框架是可进化的,但在纪元运行期间其仓库是只读的。它们只能在评分后的变异阶段发生变化。
运行启动时会发生什么
启动 ./kadath.sh 会打开交互式终端界面。方向键在菜单中移动,Ctrl-C 干净退出。

首次启动时,KADATH会要求提供:
- 一个OpenAI API密钥;
- 将驱动Architect、有机体、Grader、Tweaker和Birther的OpenAI模型ID。


KADATH在本地生成其PostgreSQL、MinIO、LiteLLM和SearXNG密钥。生成的配置存储在 .kadath/config.env 中,权限仅限所有者。Docker镜像和支持服务在首次启动的进度屏幕期间准备。后续启动会复用已安装的运行时,并提供编辑已保存模型凭据或删除旧完成运行的菜单选项。
对于新运行,界面会收集:
- 目标;
- 每个纪元的持续时间;
- 种群规模;
- 纪元数量。




然后Architect将目标转化为完整的基准。在种群运行之前,批准屏幕会显示目标、指标、归因方法、基线、分数范围、加权评分标准、所需证据、自动失败条件、平局策略、反欺诈规则、已启用工具、外部测量、已知限制以及专家智能体的指令。拒绝批准会使拟议的运行保持未激活状态。

Architect与基准锁定
Architect是一个模型驱动的专家,而非硬编码的基准生成器。它接收目标、时间、种群规模、可用服务、可用外部测量连接器、资源限制以及已配置的智能体环境变量名称。它只接收凭据名称,绝不接收秘密值。
其基准必须满足严格的机器可读契约:
- 分数范围必须是有限的;
- 评分标准权重必须为正且总和恰好为100%;
- 每个评分标准项必须使用受支持的测量类型;
- 必需输出必须指明具体的证据来源;
- 自动失败规则和反欺诈检查必须明确;
- 平局输入必须具有数值范围和方向;
- 工具和外部连接器必须已存在于运行时清单中。
受支持的评分标准测量包括二元事实、线性数值测量和锁定描述级别。如果所请求的真实世界结果无法用现有环境验证,Architect必须定义一个诚实的可测量代理指标并披露局限性。
批准会执行运行时预检,将可变的Docker镜像标签解析为不可变的镜像ID,创建第一代,并锁定目标、Architect输出、工具清单和运行时配置的哈希。这些锁在执行前会再次验证。批准后编辑任何锁定的输入都会停止运行,而不是静默更改实验。
第一代
每个第一代有机体都从相同的完整vendored smolagents框架和KADATH有机体运行时开始。框架代码在诞生时完全相同。Birther会为每个初始智能体创建不同的系统提示变体(分批有界),内核会添加唯一的世代索引,以免重复的模型散文将两个初始基因组合并为一个。
每个新基因组被提交到运行本地的裸Git仓库中。基因组的标识来自:
- 完整的Git树;
- 有效的系统提示;
- 锁定的运行时配置。
仅凭提交历史无法区分两个相同的基因组。KADATH拒绝重复的内容签名。
纪元内部
在纪元开始时,内核验证每个活动工作树是干净的,并且与其注册的提交、树哈希、提示和运行时签名完全匹配。然后,相同的已检查基因组被以只读方式挂载到其各自的父容器中。
每个有机体会收到:
- 用户目标和已批准的测量标准;
- 它自己的系统提示和完整框架源代码;
- 一个持久可写工作区;
- 它自己的排名记忆视图;
- 工件存储;
- 其作用域模型网关令牌;
- 任何Architect批准的搜索、HTTP、浏览器和worker能力;
- 一个硬性纪元截止时间,以及接近截止时间时的最终确定信号。
默认有机体是一个 CodeAgent。它以全新上下文的方式进行多轮处理。每轮之后,它写入持久的进度、候选输出、高层活动和临时结果信封。如果时间允许,它可以开始另一轮。临时数值永远不会被接受为适应度;它仅作为执行契约的一部分存在。
智能体在工作时可以检查自己的框架,但不能编辑已挂载的基因组。它们可以自由读写持久工作区、运行有界工作区命令、保存工件、搜索记忆,并使用为该运行批准的可选能力。
智能体活动与遥测
KADATH同时保留简洁的操作记忆和详细证据:
- 智能体发布高层记录,描述它们调查了什么、做了什么、发生了什么以及下一步应该做什么;
- 低层推理步骤和工具调用标识符保留在本地跟踪文件中;
- 父级和worker模型请求与响应由内核拥有的代理捕获,并带有运行、纪元、尝试、智能体、worker和基因组归因;
- 专家请求和响应被单独记录;
- 已配置的密钥会从保留的跟踪中被编辑;
- 崩溃、worker结果、证据引用、评分结果、谱系和变异都会被记录并带有其所属身份。
实时仪表板显示纪元进度、已解析和失败的智能体、当前排行榜、模型调用计数、worker活动、崩溃计数以及最近的高层活动。

研究、浏览与临时worker
网络搜索通过本地SearXNG服务提供。直接HTTP检索只接受公共HTTP和HTTPS目标,拒绝私有和保留网络地址,在重定向后遵循相同的验证,限制响应大小,并且只接受文本类内容。
当浏览器访问被批准时,每个父级都会获得自己的持久Chromium配置文件和自己专用的Playwright MCP容器。浏览器工件存储在该智能体的状态中。活动父级之间不共享上下文。
有机体可以通过内核代理将有界的子问题委托给临时worker。它不能自行启动容器。内核强制执行:
- 每个父级最多五个活动worker;
- 一个总体worker并发限制;
- 每个worker只使用父级已批准可选工具的一个明确子集;
- 一个单独的容器、身份、截止时间、文件系统、结果文件和模型token;
- 对父级精确基因组的只读访问;
- 有界的结果大小和返回文件;
- 自动worker和浏览器容器清理。
如果worker需要浏览器访问,KADATH会创建父级持久Chromium配置文件的一致快照。SQLite浏览器数据库使用SQLite备份而不是原始活动文件复制来拷贝。worker从该快照获得自己的浏览器实例,因此它保留相关的cookie和状态,而不共享活动父级上下文。
Worker将发现和文件返回给父级。它们不进行评分、繁殖、变异父级,也不成为独立可遗传的实体。
证据冻结与评分
当执行结束时,在开始选择之前,每个父级和worker都会被停止。内核将每个尝试复制到一个冻结的证据边界中,其中包含:
- 候选输出和有机体结果信封;
- 工作区文件和保存的工件;
- 浏览器工件;
- worker输出;
- 模型调用跟踪;
- 高层活动和详细工具跟踪;
- 崩溃状态和身份元数据;
- 精确的目标和基因组哈希。
文件在复制时不跟随符号链接,流式计算哈希,并记录在清单中。不安全的文件被拒绝。默认冻结尝试上限为每个智能体512 MiB。成功评分后,整个冻结树会获得第二个完整性封条并变为只读。
Grader审查这个冻结边界,而不是智能体的活动工作区。大型证据被分成重叠的、带检查点的块。文本被流式处理;图像被直接附加;每个PDF页面都被提取文本并渲染以供视觉审查;视频在五个点采样;音频被分成有界的片段。每个片段必须恰好被确认一次。如果累积的笔记仍然太大,则进行分层合并,同时保留内核拥有的覆盖计数和校验和。
模型Grader不选择分数。它提取:
- 每个评分标准项的键入事实或锁定级别ID;
- 每个平局输入的数值事实;
- 每个自动失败的决策;
- 每个反欺诈规则的决策;
- 每个被认可或否定声明的证据引用;
- 智能体活动的高层描述。
内核验证这些引用并自己应用锁定的公式。智能体自评分被忽略。排名首先将已验证的成功者放在前面,然后按内核计算的分数、归一化平局结果和稳定智能体ID排序。
可选的外部测量连接器可以提供外部事实。连接器必须在Architect能选择它之前就已配置,并且每个响应都必须归因于确切的运行、纪元、智能体和基因组。第一个有效响应被冻结并在任何重新评分期间复用。
选择与进化
在每个已评分的非最终纪元之后,KADATH按已验证结果和排名划分种群:
- 前30%: 完全按实际表现保留。它们的提示、源代码、依赖和完整框架保持不变。
- 中间群体: 每个存活的非精英智能体都会收到自己的证据、种群结果、精英语义记录、精英框架快照和排名记忆。它独立决定变异或明确保持原样。
- 淘汰群体: 失败的智能体首先被淘汰,其次是达到正常30%替换目标所需的最低排名成功智能体。如果失败者超过该目标,则每个失败者都被淘汰,替换数量相应增加。
最终纪元被评分后停止。它不会淘汰、反思、变异或产生下一代。

中间智能体反思
中间群体不会收到Tweaker的指令。每个中间智能体在评分后重新进入其自己的模型驱动运行时,并检查其自身的已评分行为、精确框架、有用的种群记忆和直接精英证据。然后它调用变异接口一次,要么是:
mutate,包括理由以及任何提示、源代码、依赖或文件更改;或unchanged,保留刚执行过的精确基因组。
提议不会追溯性地改变已测试的基因组。内核仅在纪元之后将有效提议应用到新工作树,提交它,注册新的内容寻址基因组,并将其激活用于下一个纪元。无效、重复或崩溃的适应会保留先前已评分的基因组。
Tweaker
Tweaker会收到每个排名智能体的档案:结果、证据、活动、记忆和worker行为、失败、谱系、提示、清单以及完整框架的有界视图。档案被分块并精简,同时不丢失覆盖范围。
它的工作是解释哪些高层特征使精英有效,哪些模式失败,以及每个符合条件的精英应该产生多少个后代。它为Birther创建特定于精英的繁殖简报。它不编辑基因组、更改分数或指导中间群体。
Birther
对于每个空的种群位置,Birther会收到:
- 一个选定的精英的确切已评分基因组;
- 该父级框架的视图;
- Tweaker为该父级准备的繁殖简报;
- 已为那个孩子拒绝的任何重复变异尝试。
孩子从完整的精英提交开始,包括已进化的框架——而不是从原始种子开始。Birther提出一个有界的变异,内核将其提交为新基因组,链接其谱系,并复制父级的持久状态和继承记忆。完全重复项被丢弃并重试最多五次。
活动种群会在下一个纪元之前恢复到配置的大小。如果每个有机体都失败且没有已验证的基因组留下,则运行会干净地作为失败结束,而不是从未验证的工作中繁殖。
记忆与遗传
KADATH将活动和经验存储为规范知识记录。来自同一所有者和记录类型的完全重复记录会合并为一个库条目。孩子继承对其父级记录的引用,而不是在每一代递归复制相同的负载。
对于有机体,记忆以三个范围呈现:
- 自己的: 当前智能体创建的记录;
- 继承的: 父级和祖先记录作为智能体持续的个人记忆呈现,保留原始出处;
- 种群的: 故意发布供其他有机体检查的记录。
智能体可以搜索最多500条可见记录,并将另一个智能体的记忆评为有用或误导。它们不能评价自己的记录。检索结合查询相关性、记录类型、证据存在、同行评分、最近性以及产生该记忆的确切纪元中来源的已验证质量。精英产生的记忆获得最强的可信度;中间智能体在反思期间会获得额外的精英记忆提升。同行影响是有界的,并按评分者自身的已验证表现加权。
PostgreSQL存储生产运行状态,并对智能体知识桶强制执行行级安全。有机体永远不会收到PostgreSQL凭据,也无法直接访问分数、基因组、谱系、目标、记忆链接、评分或调度器表。它们的作用域代理令牌是发布、检索和评价记忆的唯一路径。SQLite仍然可用于本地证明执行器和无模型生命周期套件。
持久文件系统遗传与数据库记忆是分开的。后代接收父级的持久工作区、进度、浏览器配置文件和其他非瞬态状态。结果文件、待处理变异、worker目录、活动检查点和崩溃控制文件被有意排除。
基因组边界与进化依赖
完整的有机体仓库是可进化的。变异可以更改系统提示、有机体入口点、vendored框架模块、工具用法、依赖,或添加和删除普通文件。它不能写入仓库外部、接触 .git 或递归删除目录。
在每个有机体启动之前,内核拥有的容器入口点会对 pyproject.toml 和 requirements.txt 进行哈希。如果进化的基因组更改了其依赖声明,这些依赖会被安装到该智能体当前纪元的持久状态中,并放置在基本环境之前(在 PYTHONPATH 上)。当声明的输入在后续纪元发生变化时,依赖环境会在该纪元开始时再次刷新。
默认变异保护允许最多512个文件操作、32 MiB的替换内容和2 MiB的系统提示。这些是完整性限制,而非模型支出预算。
隔离与凭据
只有控制容器接收Docker套接字和基础设施凭据。父级和worker容器不接收套接字、数据库凭据、MinIO凭据或LiteLLM主密钥。
每个父级运行具有:
- 只读根文件系统和只读基因组挂载;
- 非root用户;
- 所有Linux capabilities被丢弃;
no-new-privileges;- 私有可写状态挂载和有界临时文件系统;
- 默认一个CPU、2 GiB内存以及PID/文件大小限制;
- 一个用于模型、记忆和worker操作的作用域代理令牌。
Worker使用相同的安全姿态,半个CPU、1 GiB内存,以及更严格的PID、文件、临时存储和输出限制。
父级和worker模型调用通过内核代理,然后到达LiteLLM。代理添加不可变的身份元数据,应用每智能体和全局并发限制,重试瞬时网关故障,强制执行纪元截止时间,并存储已编辑的请求/响应跟踪。模型密钥由LiteLLM持有,而不是放置在有机体容器内。
Docker栈将内部控制平面与智能体网络和提供商出口分开。PostgreSQL和MinIO保留在控制平面上,有机体容器不连接到该控制平面网络;它们使用其作用域代理和批准的面向智能体的服务。
失败处理与恢复
KADATH将执行、评分和进化选择视为单独的可持久边界。
- 没有有效结果而崩溃的父级会从相同的持久状态和锁定基因组重新启动,直到配置的重试限制,并且只在纪元时间剩余时进行。
- 一个失败的父级成为一个失败的已评分结果;它不会中止种群的其余部分。
- 中断的纪元会恢复纪元前的状态快照,并在重新运行前丢弃部分分数、活动、尝试和测量。
- Grader或提供商中断会在
grading_interrupted处暂停。冻结的有机体尝试保持完整,并在不重新运行种群的情况下重新评分。 - 专家分块输出会针对其完整输入的哈希进行检查点,使大型Grader、Tweaker、Birther和适应工作能够恢复,而无需盲目重复已完成的调用。
- 选择会拍摄智能体、状态、基因组、记忆链接、评分、谱系、Git分支和基因组标签的完整快照。在淘汰、反思或诞生期间的失败会完全回滚转换。
- 每次运行的文件锁防止两个控制进程同时操作同一个运行。
- 受管容器带有运行和智能体标签。启动、恢复、重置或恢复运行只能删除属于该运行的孤立容器。
- 暂停请求在当前可持久纪元边界之后生效。然后运行可以从该边界恢复。
运行保留的数据
主机可见的运行数据位于 .kadath/runs/<run-id>/ 下。PostgreSQL和MinIO保存生产关系状态和工件副本,而运行目录包含可恢复的文件系统状态。
重要保留数据包括:
- 锁定的目标、Architect输出、运行时、环境清单和工具清单;
- 裸Git谱系仓库和每个已注册的基因组清单;
- 活动和存档的智能体工作树及持久状态;
- 纪元和选择恢复快照;
- 冻结的尝试及其完整性封条;
- Grader、Tweaker、Birther和适应检查点;
- 专家和有机体模型跟踪;
- 排行榜、证据、记忆、评分、事件、崩溃和谱系;
- 本地或MinIO支持的工件。
运行ID包含时间戳和随机后缀,因此重复启动不会覆盖先前的运行。
最终导出与继续
终端运行可以导出到 .kadath/exports/<run-id>/。导出包含最终和存档的框架、智能体状态、纪元冠军、顶级历史基因组、原始分数、排行榜、谱系、记忆、评分、事件、基准和运行时锁、冻结尝试、专家报告、模型跟踪、工件、规范裸Git仓库和框架差异。
检索最佳智能体
运行结束后,使用以下命令导出:
./kadath.sh export RUN_ID
获胜智能体随后可在 .kadath/exports/RUN_ID/final-population/ 中找到,每个智能体有一个完整的可运行框架目录。epoch-champions/records.json 标识每个纪元的获胜者,包括最终获胜者,而 leaderboards/records.json 包含完整排名。未存活到最终种群的历史高分表现者被索引在 top-historical-genomes/records.json 中,并可从导出的 git-repository/ 使用基因组注册表恢复。
每个普通文件都由包含其字节大小和SHA-256校验和的导出清单覆盖。从导出继续首先验证完整清单,拒绝未列出的文件和符号链接,然后从所选基因组的精确提交、提示、持久状态、冻结历史和继承记忆诞生新种群。
一个已完成的实时运行也可以直接从注册到该运行的任何基因组继续。继续是一个新运行,有自己的批准边界和设置;它不会覆盖源历史。
清理与重置
主菜单可以删除所有已完成历史或仅删除超过30天的已完成运行。活动、暂停、就绪和等待批准运行受保护。CLI清理支持相同行为,带有自定义年龄。

重置范围限定为一个已知运行。它通过分阶段删除移除该运行的带标签Docker容器、关系行、工件前缀和运行目录。如果基础设施清理失败,文件系统移动会被反转,而不是留下半删除的运行。已验证导出位于运行目录之外,并被有意保留。
运行时服务
| 组件 | 职责 |
|---|---|
control | 固定内核、CLI后端、调度器、评分公式、选择、恢复、导出 |
organism-worker 镜像 | 父级和临时worker运行时,包含基础框架和内核拥有的依赖启动器 |
| PostgreSQL | 运行、智能体、基因组、分数、尝试、谱系、事件、知识、记忆链接和评分 |
| MinIO | 兼容S3的工件存储,位于run/epoch/agent前缀下 |
| LiteLLM | 面向专家、父级和worker的OpenAI兼容模型网关 |
| SearXNG | 本地网络搜索服务,作为批准的有机体工具暴露 |
| Playwright MCP | 浏览器自动化,用于创建隔离的父级和worker浏览器上下文 |
仓库地图
| 路径 | 内容 |
|---|---|
kadath.sh | 交互式前端、首次启动配置、运行时准备和Docker支持的命令启动器 |
kadath/engine.py | 运行状态机、纪元执行、证据冻结、评分协调、进化、遗传、恢复、导出和重置 |
kadath/specialists.py | Architect、Grader、Tweaker、Birther、模型网关客户端、多模态证据审查和检查点契约 |
kadath/store.py | SQLite/PostgreSQL模式、行级安全、规范记忆、排名和删除 |
kadath/containers.py | 隔离的父级执行、截止时间处理、崩溃重启和适应容器 |
kadath/worker_broker.py | 作用域模型代理、记忆API、worker API、身份归因、编辑和遥测 |
kadath/workers.py | worker限制、worker容器、结果收集和worker浏览器隔离 |
kadath/browsers.py | 每父级浏览器集群和一致的配置文件快照 |
kadath/gitstore.py | 运行本地裸Git仓库、工作树具体化、基因组提交、分支和永久基因组标签 |
kadath/mutations.py | 变异模式、路径验证、大小限制和文件应用 |
kadath/artifacts.py | 流式内容寻址本地和兼容S3工件存储 |
kadath/cli.py | 后端命令、批准渲染、状态输出和实时仪表板 |
seed/organism.py | 默认可进化CodeAgent循环和工具组装 |
seed/kadath_runtime.py | 用于工作区、工件、记忆、活动、网络访问、worker和变异提议的有机体工具 |
seed/container_entrypoint.py | 内核拥有的、对进化基因组声明的依赖的激活 |
| `seed/smolagents/`` | 完整可编辑框架种子,复制到每个谱系 |
deploy/ | PostgreSQL角色引导、LiteLLM模型映射和SearXNG配置 |
assets/ | 启动艺术作品及其终端颜色渲染器 |
tests/ | 生命周期套件和实时Docker、崩溃恢复、进化依赖和PostgreSQL隔离探针 |
直接操作命令
交互式前端是正常入口点:
./kadath.sh
现有运行也可以通过同一启动器直接操作:
./kadath.sh status RUN_ID
./kadath.sh dashboard RUN_ID --watch
./kadath.sh pause RUN_ID
./kadath.sh resume RUN_ID
./kadath.sh export RUN_ID
./kadath.sh continue RUN_ID --genome GENOME_HASH --epochs 3
./kadath.sh continue-export .kadath/exports/RUN_ID --genome GENOME_HASH --epochs 3
./kadath.sh reset RUN_ID --yes
./kadath.sh cleanup --older-than-days 30
./kadath.sh cleanup --all
这些命令在进入控制内核之前仍然会准备并验证Docker运行时;它们不会绕过锁定的目标、恢复、隔离或清理规则。