AI AgentAgent 框架后端【免费下载链接】julepJulep — durable, composable AI agents. Flows that crash and resume, retry safely, and explain every step.项目地址https://gitcode.com/gh_mirrors/ju/julep点击查看免费下载导读本文以 Julep 仓库中的实现计划 docs/plans/2026-07-01-mem-mcp-adoption-phase2-dotctx-compat.md 为主线系统讲解 Julep 如何让 composable-agents 的提示词加载层完整兼容 mem-mcp 的真实.ctx提示词包 role:... 角色标记模板、单文件.ctxYAML frontmatter Jinja 正文、require_tool_call:/response_format:声明式设置键、Yglu 数值字符串强转以及eval.py/eval.yaml数据面的无执行加载。读完本文你将掌握这一兼容层的全部行为契约、源码实现位置与验收标准能够直接在 Julep 中加载、校验和部署 mem-mcp 风格提示词包。一、Phase 2 的目标与背景mem-mcp 是一个以.ctx目录或单文件为单位的提示词包格式一个包描述一次模型调用包含模型、温度、轮次上限、系统提示词与可选回复 schema。Phase 1见 docs/plans/2026-07-01-mem-mcp-adoption-phase1-llm-prompt-core.md已经打通了 LLM 与提示词核心层推理 effort 透传、mem-mcp 模型 slug 兼容、response_format回退的有据记录、有界结构化输出重试以及带显式 env 绑定的 Yglu 求值settings.yaml。Phase 2 的目标是让 Julep 的提示词加载层能够忠实加载 mem-mcp 全部真实.ctx提示词包具体覆盖五类能力 role:... 角色标记模板role-marker templates单文件.ctxYAML frontmatter Jinja 正文require_tool_call:与response_format:两个设置键声明式记录循环内强制留待 Phase 3/4Yglu 数值字符串强转numeric-string coercioneval.py/eval.yaml数据面sample()/score()契约——但加载提示词时绝不执行 eval 代码。1.1 参考实现与关键源文件计划以 mem-mcp 为语义基准参考仓库为/home/diwank/github.com/julep-ai/mem-mcp属于开发环境本地路径仅作行为镜像参考其关键语义来源包括加载器语义dotctx/loader.py中的FRONTMATTER_PATTERN、ROLE_MARKER_PATTERN \s*role:(\w)\s*、_parse_role_markers、_load_single_file、_load_directoryEval 数据面dotctx/eval_types.pySample、Expected、ExpectedToolCall、MockToolConfig、Turn、StopFn、stop_after_turns、stop_when_terminal_tool、stop_when_non_tool、any_stop、all_stop、eval_loader.pyEvalModule必须提供sample(limit)score(input, output, expected)、llm_utils.pyextract_llm_content、parse_llm_json、strip_markdown_codeblock、eval_config.pyeval.yaml 结构models/datasets/threshold/concurrency/scoring/agent/profiles真实提示词apps/memory-api/prompts/**/*.ctx共 33 个目录。计划还给出了 mem-mcp 真实提示词包的设置键普查结论model, temperature, output_retries, reasoning_effort, max_rounds, require_tool_call5 处、response_format4 处恒为 {type: json_object}、max_tokens角色只用system26 处和user25 处没有messages/目录6 个tools.pyi。1.2 CA 侧涉及文件按计划Julep 侧原文中为 composable_agents 包仓库中即julep/包触及的文件为julep/dotctx.py、julep/dotctx_rich.py、新增julep/dotctx_evals.py、julep/execution/llm.py、julep/execution/llm_result.py仅在需要新 meta 键时优先复用现有response_format_fallback、julep/deploy.py的_reasoner_identity约第 159 行起。二、全局约束兼容层的质量底线Phase 2 在开工前先立下五条全局约束它们决定了实现的形态质量门禁测试必须用python -m pytest禁止裸pytest类型检查用uv run mypy --strict composable_agents仅包内不含测试静态检查用ruff check composable_agents tests无 Temporal 依赖新增测试不得依赖 Temporal保证 temporaloff 的 CI 任务保持绿色部署 golden 字节级不变新增 identity 字段必须按既有约定以 omit-when-unset未设置即省略方式进入_reasoner_identity使既有制品哈希完全一致G-8禁止静默回退——不支持的值必须是响亮的教学式错误teaching errorprovider 回退必须记录在LlmCallMeta上依赖隔离jinja2 留在[dotctx]extra 之后yglu 留在[yglu]之后julep/dotctx_evals.py必须在两者都未安装时也能干净导入必要时使用惰性导入。此外有一条安全红线加载.ctx时绝不执行eval.py——eval 加载是独立、显式的入口。这些约束在源码中均有对应落地例如julep/dotctx_rich.py顶部在缺少 jinja2 时抛出带安装提示的硬错误jinja2 is required for the rich dotctx layout (prompt.j2 / messages/); install julep[dotctx]julep/dotctx_evals.py模块 docstring 明确写明 Loading a.ctxprompt NEVER executes eval code;load_ctx_evalsis the one explicit entry point。三、Task 1角色标记模板拆分role-marker splitting3.1 行为契约mem-mcp 的单文件多消息格式用 role:name 标记把模板切成按角色分区的片段。Phase 2 在 rich 加载器中实现了等价的拆分行为契约如下prompt.j2源码中若匹配\s*role:(\w)\s*则被拆分为按角色的模板源码标记行的空格布局是灵活的——role:system同样匹配镜像 mem-mcp 的正则v1 只接受与messages/包完全一致的形状一个system段可选地后跟一个user段重复角色、其他角色如assistant或 user 在 system 之前 → 抛出ValueError错误信息中带文件名与违规角色教学式错误第一个标记之前的内容必须为空白或 Jinja 注释/纯空白该前置内容会被前拼到 system 段源码保留{# AI-ANCHOR #}之类的头部渲染时输出为空非注释的普通文本 →ValueError没有标记 → 维持既有行为整个文件即 system 模板拆分出的片段作为独立的渲染器注册system/user角色与今天messages/包完全一致——复用下游system_render/user_render接线Reasoner 无需改动。3.2 源码级实现julep/dotctx_rich.py中的_split_role_markers(source, origin)完整实现了上述契约标记正则_ROLE_MARKER_RE re.compile(r\s*role:(\w)\s*)julep/dotctx_rich.py与 mem-mcp 的ROLE_MARKER_PATTERN一一对应注释里特别指出裸/heredoc 定界符不会误匹配因为没有role:用_JINJA_COMMENT_RE先把{# ... #}注释遮罩掉保留换行、抹除其他字符再逐行检查首个标记前的可见内容只允许空白、Jinja 注释和#注释行——#头部行mem-mcp 若干真实.j2文件中的 AI-ANCHOR 约定会被丢弃因为 mem-mcp 会丢弃所有标记前内容而保留#行会渲染出可见文本段校验用expected (system, user)逐段比对段数超过 2 时报错并点名多余角色julep/dotctx_rich.py拆分后返回(system, user | None)随后由_register_role_templates注册为dotctx/package/rolevcontent-hash-prefix形式的渲染器内容哈希前缀 12 位与任何注册的纯函数一致从而提示词编辑可被 §6.4 漂移检测覆盖。3.3 测试要点tests/test_dotctx_rich.py扩展覆盖真实形状 fixture 字符串Jinja 注释头 system user精神上取自episode_summary.ctx/prompt.j2、紧凑标记间距、未知角色报错、重复 system 报错、user 在前报错、无标记文件行为不变、渲染器在 StrictUndefined 上下文下可渲染。四、Task 2单文件.ctx支持4.1 行为契约load_dotctx(path)当path是以.ctx结尾的文件时走单文件解析用 mem-mcp 的 frontmatter 正则^---\n(.*?)\n---\n(.*)$DOTALL解析frontmatter YAML 走与settings.yaml相同的 Yglu-aware 设置路径把_read_settings的文本解析核心重构为共享 helper两边共用保留has_yglu_tags门控正文即模板按 Task 1 的角色标记逻辑拆分单文件.ctx总是路由到dotctx_rich正文是模板 ⇒ 必然需要 jinja2缺 extra 时同样硬抛 ImportError无 frontmatter 匹配 → 设置为空{}镜像 mem-mcpJulep 既有默认值生效Reasoner 名默认为去掉.ctx的文件名主干is_rich_dotctx与目录处理不变名为foo.ctx的目录继续正常工作rich 加载器的未知设置键校验对 frontmatter 同样生效。4.2 源码级实现julep/dotctx_rich.py的load_single_file_dotctx(path, *, registry, env)是核心实现frontmatter 正则_FRONTMATTER_RE re.compile(r^---\n(.*?)\n---\n(.*)$, re.DOTALL)julep/dotctx_rich.py文件必须以.ctx结尾否则ValueError读取后尝试匹配 frontmatter匹配则解析设置 取正文否则settings, body {}, content全模板、空设置、默认值生效_validate_settings_keys(settings, path)对 frontmatter 做与目录版一致的未知键校验单文件格式无法携带schema.pyi/tools.pyi因此reply_schema恒为Nonetools 只来自 frontmatterskills设置在此被显式拒绝skills 需要目录布局package.ctx/skills/name/SKILL.md正文经由_split_role_markers拆分后注册角色渲染器最后构造 Reasoner 并注册julep/dotctx_rich.py。在julep/dotctx.py的load_dotctx中文件路径统一分发到单文件加载器并在加载后给出缺失输出 schema 的警告MissingOutputSchemaWarning因为单文件格式没有schema.pyi。4.3 测试要点tests/test_dotctx_single_file.py覆盖frontmatter 角色标记正文加载断言 model/temperature/name带显式env映射的 yglu!?标记 frontmatter无 frontmatter 文件 → 纯模板 默认值仅 frontmatter无标记→ system 模板非.ctx文件 → 明确错误文件缺失 → 明确错误。五、Task 3require_tool_call/response_format键 Yglu 数值强转5.1 Reasoner 新字段julep/dotctx.py的Reasonerfrozen dataclass新增两个关键字专用字段默认值保持既有行为require_tool_call: bool False # declarative; loop enforcement is Phase 3/4 response_format: Optional[str] None # json_object; reply_schema wins at call time从源码可见julep/dotctx.pyReasoner现已具备的完整字段还包括reasoning_effort、output_retries、prompt_cache、skills等。Reasoner的 docstring 明确记录require_tool_call在 Phase 2 是声明式的——记录在案并哈希进部署 identityagent 循环内的强制落地随原生工具调用在 Phase 3/4 到来。response_format把 mem-mcp 的response_format: {type: json_object}记录为字符串json_object同时声明 reply schema 与response_format是允许的调用时 schema 胜出provider 调用永远不同时携带两者。5.2 设置解析两种加载器、snake 与 camel 变体require_tool_call:必须是布尔值。_require_tool_call_settingjulep/dotctx.py同时接受requireToolCall变体非布尔 →ValueError: require_tool_call must be true or falseresponse_format:必须是映射{type: json_object}存为字符串json_object任何其他形状/类型 → 教学式ValueError列出唯一支持形式julep/dotctx.pyunsupported response_format {value!r}; the only supported form is the mapping response_format: {type: json_object}5.3 Yglu 数值字符串强转Yglu/env 值以字符串到达真实案例record/execute.ctx的max_rounds: !? $env.get(RECORD_EXECUTE_MAX_ROUNDS, 12)。两种加载器均需对以下键做强转max_rounds、max_tokens、output_retries→inttemperature→float非数值字符串 → 教学式ValueError。源码中的_as_int/_as_floatjulep/dotctx.py实现该契约拒绝布尔值接受原生 int/float接受可解析的数字字符串否则抛出带 key 名的ValueError并提示 env-sourced values must be numeric strings。_model_and_effortjulep/dotctx.py在此基础上完成模型 slug 规范化与reasoning_effort校验显式键优先于suffix非法 effort 报错并列出合法集合output_retries 0也会报错。5.4 部署 identityomit-when-unset 保持 golden 不变julep/deploy.py的_reasoner_identity以 未设置即省略 的方式把新字段写入制品哈希julep/deploy.pyif reasoner.require_tool_call: ident[requireToolCall] True if reasoner.response_format is not None: ident[responseFormat] reasoner.response_format由于未设置时字段不进入 identity 字典既有部署 goldentests/ 中 freeze/golden/deploy 相关测试保持字节级不变——这是计划中明确要求验证的Existing deploy goldens must be byte-for-byte unchanged。5.5 Provider 接线json_object 的调用路径与回退契约julep/execution/llm.py中的complete_reasoner实现julep/execution/llm.py 区域当reply_schema is None且reasoner.response_format json_object时按 schema 派生的response_format同一路径发送response_format{type: json_object}同样遵守_PROMPT_FALLBACK_PROVIDERS、native_ok闩锁latched一次 response_format 失败后不再重试 native与有据回退契约json_object 的回退行为是重发请求但不带该 kwarg并在LlmCallMeta.response_format_fallback上记录回退原因无提示词注入——mem-mcp 提示词自训 JSON 输出回退只记录一次由闩锁保证reason 不会被覆盖并发出logging.warningCONFIG 类错误仍会重抛Phase 1 规则认证/配置失败绝不能被回退掩盖schema 与 json_object 同时存在时schema 路径胜出不会出现双重 kwarg。对应测试位于tests/test_dotctx_reply.py/tests/test_dotctx_rich.py扩展及tests/execution/下既有 response_format-fallback 测试附近加载器解析true/false/absent、json_object、坏形状报错含 yglu 加载设置的强转矩阵identity omit-when-unsetgolden 相等性 设置后新字段出现llm fake-provider 测试发送 json_object kwarg、不支持 provider 的回退只记录一次并闩锁、schema 优先。六、Task 4eval 兼容 ——dotctx_evals.py数据面6.1 设计边界julep/dotctx_evals.py是 mem-mcp eval数据面的忠实移植不含 runner类型与函数从 mem-mcp 的eval_types.py/llm_utils.py1:1 移植加载器使真实 eval 文件原样加载。它只是数据——没有 runner、没有评分循环、没有 mock-tool 执行留待 Phase 3/4。关键安全属性加载.ctx提示词永不执行 eval 代码load_ctx_evals是唯一显式入口load_rich_dotctx不会调用它。模块 docstring 还承诺不安装[dotctx]jinja2extra 也能干净导入yaml 在配置加载器内部惰性加载标记式 env 表达式用内置求值器。6.2 移植的数据面类型/函数来自eval_types.pyInput/Output/Score别名、Turn、StopFn、stop_after_turns、stop_when_terminal_tool、stop_when_non_tool、any_stop、all_stop、ExpectedToolCall、Expected、Sample、MockToolConfig辅助函数来自llm_utils.pystrip_markdown_codeblock、extract_llm_content、parse_llm_json镜像 mem-mcp 行为含边界情形。从源码看julep/dotctx_evals.pyTurn携带output、tool_calls、tool_results、content、refusal五个字段stop_after_turns(max_turns)生成的 StopFn 还带一个_julep_max_turns标记属性供 Julep eval runner 无需内省不透明闭包即可读取 stop_after_turns(n) - max_rounds 覆盖。6.3EvalModule与 sys.modules shimload_eval_module(path) - EvalModule通过 importlib spec 以唯一模块名 execeval.py要求sample和score为可调用对象错误消息形状与 mem-mcp 完全一致教学式。exec 之前会为sys.modules安装兼容别名dotctx、dotctx.eval_types、dotctx.llm_utils指向本模块的命名空间——仅当这些名字尚不可导入时绝不覆盖真实安装的dotctx并在finally中恢复sys.modules。文档明确标注仅限 CLI/测试时使用非线程安全与 Phase 1 的 yglu env 交换同样的注意事项。真实eval.py会写from dotctx.eval_types import Sample/from dotctx import extract_llm_contentshim 正是为此设计。6.4EvalConfig与唯一入口load_eval_config(path) - EvalConfig解析eval.yaml/eval.yml通过dotctx_yglu实现 Yglu-aware显式env参数为小型类型化 dataclassmodels{id, tags} 列表、datasets{file, format, tags} 列表、threshold: float、concurrency: int、scoring: dict、agent: dict、profiles: dict[str, EvalConfig 形状的覆盖项]未知顶层键 → 教学式错误只取数据不执行求值load_ctx_evals(ctx_dir, *, envNone) - CtxEvalseval_module eval_config两者均可 Optional唯一显式入口load_rich_dotctx不得调用它。6.5 测试要点tests/test_dotctx_evals.py覆盖使用from dotctx.eval_types import Samplefrom dotctx import extract_llm_content的 fixture eval.py 经 shim 加载成功缺sample/score→ 教学式错误加载后sys.modules干净未触碰的键被保留带 yglu!? 显式 env 的 eval.yaml 解析成功profiles 以原始数据解析extract_llm_content/parse_llm_json/strip_markdown_codeblock行为矩阵镜像 mem-mcpfenced JSON、dict 响应、嵌套输出。七、Task 5真实提示词 fixtures、兄弟仓库扫描与文档7.1 Fixtures 仓库tests/fixtures/memmcp/收录 mem-mcp 真实提示词内容的 vendor 化 fixtures长正文可裁剪结构保持原样episode_summary.ctx/jinja 注释头 角色标记 Input-onlyschema.pyi yglu model eval.py一个以record/execute.ctx为模型的require_tool_call设置目录yglumax_roundscluster_label.ctx风格目录response_format: {type: json_object}一个 mem-mcp frontmatter 格式的单文件.ctx以briefs/draft.ctx为模型的eval.yaml。从仓库现状看tests/fixtures/memmcp/已包含brief_draft.ctx/含 skills/natural-writing/SKILL.md、cluster_label.ctx/、episode_summary.ctx/含 eval.py、prompt.j2、schema.pyi、settings.yaml、execute.ctx/含 eval.yaml、prompt.j2、settings.yaml、tools.pyi、execute_eval.ctx/、record_execute.ctx/含 eval.py、eval.yaml、prompt.j2、settings.yaml、tools.pyi、anchor_choose.ctx等。7.2 兼容扫描测试tests/test_memmcp_compat.py加载每个 fixture显式env{}断言规范 model、effort、require_tool_call/response_format 字段、渲染器拆分、eval 模块/配置加载通过load_ctx_evals加载 eval证明提示词加载未 exec 它。另有一个兄弟仓库全量扫描测试用pytest.mark.skipif(not os.path.isdir(/home/diwank/github.com/julep-ai/mem-mcp), ...)门控在兄弟仓库中 globapps/memory-api/prompts/**/*.ctx并逐一load_dotctx(..., env{})每次加载使用全新 Registry 或唯一名字需检查register_reasoner的重注册语义并妥善处理。全部 33 个必须能加载。扫描不加载 eval 模块任意代码风险fixture 测试已覆盖 eval 加载。7.3 文档docs/中的 dotctx 页面如有则补记否则模块 docstring 已足够julep/dotctx_rich.py的 docstring 已更新原文曾写 eval 文件 are ignored here现指向julep.dotctx_evals.load_ctx_evals为显式入口。八、验收标准Phase 2 的完整验收条件为mem-mcp 全部33 个.ctx提示词都能通过load_dotctx以env{}加载角色标记提示词产出 system user 渲染器require_tool_call/response_format记录在 Reasoner 与部署 identity 上goldens 不变eval sample/score 模块与 eval.yaml 配置通过显式兼容入口加载全部质量门禁python -m pytest、mypy --strict、ruff绿色。九、显式非目标Phase 3/4为保证 Phase 2 范围收敛以下内容被显式排除在 agent 循环中强制require_tool_call原生工具调用native tool-calling运行evalsrunner、评分循环、mock-tool 执行、成本核算——Phase 2 只加载它们MCP 客户端、resilience-policy 移植、sub_deployments、CAS/wasm 分发。这些内容属于后续阶段本文档所述的加载层兼容为它们提供了稳定的数据底座提示词包可以被忠实加载、校验与哈希而无需在加载期承担任何执行风险。十、关键文件速查关注点仓库路径Phase 2 实现计划docs/plans/2026-07-01-mem-mcp-adoption-phase2-dotctx-compat.mdPhase 1LLM 提示词核心、yglu 显式 envdocs/plans/2026-07-01-mem-mcp-adoption-phase1-llm-prompt-core.mdReasoner新字段、设置解析、数值强转、load_dotctxjulep/dotctx.py角色标记拆分、单文件.ctx、rich 加载器、_ALLOWED_SETTINGSjulep/dotctx_rich.pyeval 数据面load_eval_module/load_eval_config/load_ctx_evalsjulep/dotctx_evals.pyYglu 求值设置与显式 env 绑定julep/dotctx_yglu.py模型 slug / effort 规范化julep/model_slugs.py部署 identityomit-when-unsetjulep/deploy.pyjson_object 接线与有据回退julep/execution/llm.py兼容 fixtures 与扫描测试tests/fixtures/memmcp/、tests/test_memmcp_compat.py单文件.ctx/ eval / yglu / rich 测试tests/test_dotctx_single_file.py、tests/test_dotctx_evals.py、tests/test_dotctx_yglu.py、tests/test_dotctx_rich.py赞分享AI AgentAgent 框架后端【免费下载链接】julepJulep — durable, composable AI agents. Flows that crash and resume, retry safely, and explain every step.项目地址https://gitcode.com/gh_mirrors/ju/julep点击查看免费下载相关推荐用 Core 30 Content Audit 提示词在 claude-seo 中落地 FLOW Optimize 阶段的内容审计用 Core 30 Content Audit 提示词在 claude seo 中落地 FLOW Optimize 阶段的内容审计 本篇文章围绕 claudeJulep dotctx 格式详解声明式 AI Reasoner 包的统一装载与渐进式技能体系Julep dotctx 格式详解声明式 AI Reasoner 包的统一装载与渐进式技能体系 导读 本文基于 Julep 仓库的 dotctx 格式设计文档AI AgentAgent 框架后端Cemu图形包深度解析从高清分辨率到60FPS的性能飞跃Cemu图形包深度解析从高清分辨率到60FPS的性能飞跃 Cemu图形包是为Wii U模拟器Cemu设计的社区图形增强包集合能够显著提升Wii U游戏在PC上一篇AutoClip 产品路线图全解析从本地桌面工具到 credits 商业化平台的演进规划下一篇Redwood 教程第 4 章将全栈应用部署到 Netlify 的完整实战指南Postgres 数据库迁移 Serverless 部署创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考