尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

code2prompt Python 绑定(code2prompt_rs):用原生 PyO3 绑定在 Python 中驱动代码库转 LLM Prompt 工作流

code2prompt Python 绑定(code2prompt_rs):用原生 PyO3 绑定在 Python 中驱动代码库转 LLM Prompt 工作流 code2prompt Python 绑定code2prompt_rs用原生 PyO3 绑定在 Python 中驱动代码库转 LLM Prompt 工作流【免费下载链接】code2promptA CLI tool to convert your codebase into a single LLM prompt with source tree, prompt templating, and token counting.项目地址: https://gitcode.com/GitHub_Trending/co/code2promptcode2prompt 是一个将整个代码库转换为单个 LLM Prompt 的命令行工具核心能力包括源码目录树、提示词模板化与 token 计数。本篇文章围绕其官方 Python 绑定code2prompt_rs展开该绑定基于 PyO3 maturin 把有状态的code2prompt_coreAPI 原样暴露给 PythonPython 3.11让你可以在不离开 Python 生态的前提下完成配置 → 会话 → 加载代码库 → 选中文件 → 生成 Prompt的完整流程。读完本文你将掌握安装方式、全部配置参数与默认值、会话级选择/加载/生成 API、token 估算原理以及如何用 uv 进行本地开发与构建发布 wheel。什么是 code2prompt_rscode2prompt_rs是 code2prompt 项目中的 Python 绑定 crate源码位于 crates/code2prompt-python/src/lib.rs 与 crates/code2prompt-python/src/python.rs。它不是简单地把 CLI 包装一层 shell 调用而是通过 pyo3 直接绑定 Rust 侧code2prompt_core的有状态会话 API与 Rust 端使用方式几乎一一对应Rust 侧的Code2PromptConfig、Code2PromptSession、RenderedPrompt、CodebaseAnalysis等类型被投影为同名 Python 类见 python.rs 中#[pyclass]定义Python 侧不引入字符串别名枚举全部以原生 Python 枚举类呈现OutputFormat、TokenizerType、TokenFormat、FileSortMethod构建系统采用 maturinbindings pyo3发布到 PyPI 的包名为code2prompt_rs具体配置见 crates/code2prompt-python/pyproject.toml。注意当前 Python wheel 未包含 Rust 侧可选的entity-map特性因此Code2PromptConfig中对应的实体映射字段在 Python 绑定中不可用python.rs 中硬编码entity_map: false。安装与运行环境绑定支持Python 3.11 或更新版本安装命令pip install code2prompt_rs包依赖[dependencies]为空见 pyproject.toml即安装后不需要任何第三方运行时依赖绑定逻辑全部编译在原生扩展中。官方通过requires-python 3.11与分类器声明支持 Python 3.11/3.12/3.13/3.14pyproject.toml。类型转换约定Rust 的PathBuf在 Python 侧接收str或os.PathLike对象而在返回值中统一以pathlib.Path呈现。测试 test_session.py 中get_selected_files() [Path(src/main.py)]即为这一约定的直接验证。快速上手三行代码生成第一个 Prompt与 Rust 端一致Python 侧的使用心智是创建一个核心配置 → 移入会话 → 在会话上操作 → 生成结果。官方 README 给出的最小示例from code2prompt_rs import Code2PromptConfig, Code2PromptSession config Code2PromptConfig( ., include_patterns[**/*.py, **/*.rs], exclude_patterns[**/tests/**], line_numbersTrue, deselectedTrue, ) session Code2PromptSession(config) session.select_file(src/main.rs) session.select_file(src/lib.rs) result session.generate_prompt() print(result.prompt) print(result.token_count) print(result.files)对应的可运行示例也存在于仓库中examples/basic_usage.py 与上面的流程一致并额外打印了生成文件的个数result session.generate_prompt() print(fGenerated {result.token_count} tokens from {len(result.files)} files)generate_prompt()返回一个强类型的RenderedPrompt对象包含以下只读属性对应 python.rs 中的 getter属性类型说明promptstr最终渲染出的提示词文本Markdown/XML/JSONdirectory_namestr代码库根目录的显示名token_countint估算的 Prompt token 数model_infostr所用 tokenizer 的描述信息fileslist[str]参与生成的文件路径列表链式调用方法修改并返回同一会话会话中的选择类方法原地修改并返回同一个 session 对象因此可以连续链式调用session.select_file(src/main.rs).deselect_file(src/generated.rs)测试 test_session.py 也验证了select_file(...) is session、toggle_file_selection(...) is session、clear_user_actions() is session等链式语义。配置详解Code2PromptConfig 全参数与默认值Code2PromptConfig暴露了 code2prompt-core 4.3 版本的全部用户可见字段。其构造函数签名可以在 python.rs 中看到第一个位置参数是代码库根目录path其余均为关键字参数。下表汇总了全部参数及其默认值参数类型默认值说明pathstr/os.PathLike必填代码库根目录路径include_patternslist[str][]包含的 glob 模式如[**/*.py]exclude_patternslist[str][]排除的 glob 模式如[**/tests/**]line_numbersboolFalse输出中是否为代码行添加行号absolute_pathboolFalse输出路径使用绝对路径而非相对路径full_directory_treeboolFalse生成完整目录树忽略 include/exclude 规则no_codeblockboolFalse代码块不再用 Markdown 围栏包裹follow_symlinksboolFalse遍历时是否跟随符号链接hiddenboolFalse是否包含隐藏文件与目录no_ignoreboolFalse是否忽略.gitignore规则sort_methodFileSortMethod \| NoneNone文件排序方式见下方枚举output_formatOutputFormatOutputFormat.Markdown输出格式Markdown / Json / Xmlcustom_templatestr \| NoneNone自定义 Handlebars 模板内容覆盖默认模板encodingTokenizerTypeTokenizerType.Cl100kBase用于 token 计数的 tokenizer 编码token_formatTokenFormatTokenFormat.Rawtoken 计数格式Raw / Formatdiff_enabledboolFalse是否包含 HEAD 与 index 之间的 git diffdiff_branchestuple[str, str] \| NoneNone两个分支名生成二者之间的 git difflog_branchestuple[str, str] \| NoneNone两个分支名获取二者之间的 git logtemplate_namestr模板名称配合template_str使用template_strstr模板字符串本体user_variablesdict[str, str]{}注入模板的额外变量token_map_enabledboolFalse是否在输出中展示细粒度 token map 明细deselectedboolFalse初始是否让所有文件处于未选中状态processorsFileProcessorsConfig默认值文件处理器设置如 Jupyter 笔记本上述默认值直接来自 python.rs 中构造函数对各参数的unwrap_or处理。这些默认值与 configuration.rs 中 Rust 侧Code2PromptConfig的字段一一对应并经过测试 test_config.py 验证例如默认encoding TokenizerType.Cl100kBase、默认processors.ipynb.max_code_cells 3。原生枚举类配置中的枚举一律使用原生 Python 枚举类禁止传入字符串。这一点非常关键测试 test_config.py 明确验证了Code2PromptConfig(str(project), output_formatxml)会抛出TypeError。可用枚举及其变体如下OutputFormatMarkdown、Json、Xmlpython.rsTokenizerTypeO200kBase、Cl100kBase、P50kBase、P50kEdit、R50kBasepython.rsTokenFormatRaw、Formatpython.rsFileSortMethodNameAsc、NameDesc、DateAsc、DateDescpython.rs文件处理器配置ipynbFileProcessorsConfig目前只包含ipynb子配置IpynbProcessorConfig用于控制 Jupyter Notebook.ipynb文件的提取行为from code2prompt_rs import ( Code2PromptConfig, FileProcessorsConfig, FileSortMethod, IpynbProcessorConfig, OutputFormat, TokenFormat, TokenizerType, ) config Code2PromptConfig( ., absolute_pathFalse, no_codeblockFalse, output_formatOutputFormat.Markdown, sort_methodFileSortMethod.NameAsc, encodingTokenizerType.Cl100kBase, token_formatTokenFormat.Raw, processorsFileProcessorsConfig( ipynbIpynbProcessorConfig( max_code_cells5, include_outputsTrue, include_markdownTrue, ) ), )IpynbProcessorConfig的字段与默认值python.rs字段类型默认值说明max_code_cellsint3最多提取的代码单元格数量include_outputsboolFalse是否包含单元格输出include_markdownboolFalse是否包含 Markdown 单元格同时配置对象也支持属性读写get_all, set_all你可以构造后修改再传入测试 test_config.py 展示了将全部用户可见配置项构造后经会话configgetter 原样读回的完整往返round-trip验证。Session API有状态的会话操作Code2PromptSession是操作的主入口对应 Rust 侧 session.rs 中的Code2PromptSession。创建方式session Code2PromptSession(config)会话提供以下四类方法全部可在 python.rs 中找到实现模式更新返回自身可链式session.add_include_pattern(**/*.py) session.add_exclude_pattern(**/tests/**)这两个方法会向配置追加模式并重建内部的SelectionEngineRust 侧逻辑见 session.rs因此后续加载会立即生效。文件选择返回自身可链式session.select_file(src/main.rs) # 显式选中 session.deselect_file(src/generated.rs) # 显式取消选中 session.toggle_file_selection(src/main.rs)# 切换选中状态 session.is_file_selected(src/main.rs) # - bool session.get_selected_files() # - list[Path] session.clear_user_actions() # 清除所有用户操作回到纯模式选择 session.has_user_actions() # - bool session.set_deselected(True) # 设置默认未选中状态绝对路径自动归一化选择方法接受绝对路径或相对路径内部会自动将绝对路径裁剪为相对于配置根目录的相对路径Rust 侧实现见 session.rs。测试 test_session.py 验证了用绝对路径选中后get_selected_files()返回的是相对路径Path(src/utils.py)。数据加载session.load_codebase() # 扫描目录填充 source_tree 与 files session.load_git_diff() # 加载 HEAD 与 index 的 diff session.load_git_diff_between_branches() # 加载两个分支间的 diff需配置 diff_branches session.load_git_log_between_branches() # 加载两个分支间的 git log需配置 log_branches这些方法分别对应 Rust 侧 session.rs 的实现。加载完成后会话的数据快照可以通过session.data属性获取返回强类型SessionData包含字段类型说明absolute_code_pathstr \| None代码库绝对路径source_treestr \| None渲染后的源码目录树fileslist[FileEntry] \| None文件条目列表git_diffstr \| Nonegit diff 内容git_diff_branchstr \| None分支间 diffgit_log_branchstr \| None分支间 log其中FileEntry包含path、extension、code、token_count、metadata含is_dir、is_symlink、mod_time字段python.rs测试 test_session.py 对其逐一做了断言。加载之前调用session.raw_analysis()会返回None加载之后才有值同一测试 L62 验证。结果生成与分析result session.generate_prompt() # - RenderedPrompt analysis session.raw_analysis() # - CodebaseAnalysis | None analysis session.contextual_analysis(result) # 基于渲染结果的分析generate_prompt()内部会依次完成加载代码库 →若开启加载 git diff / 分支 diff / 分支 log → 构建模板上下文 → 渲染并估算 tokenRust 侧完整流程见 session.rs。token 计数原理为什么 token_count 是估算值README 明确说明了result.token_count的语义result.token_count基于缓存的逐文件 token 计数包含可选的行号与估算的模板开销相加得到。完整的渲染结果不会被重新 tokenizeJSON 输出信封output envelope也不计入。从源码可以还原这一机制的实现细节session.rs文件内容 token 在 I/O 阶段并行统计并缓存在每个FileEntry.token_count中生成时直接求和避免对完整 Prompt 重复 tokenize这也是token_map_enabled只控制是否展示明细而内部始终计数的原因见 configuration.rs模板结构开销通过骨架渲染估算用空代码但保留相同结构/元数据的骨架文件渲染一遍模板再对渲染结果计数calculate_structural_tokens若骨架渲染失败会退化为基于字符数的启发式估算约 4 字符/token 100 缓冲。因此该值是估计值而非精确值token 边界跨越、自定义模板对内容的重复/省略/改写都可能导致实际计数与输出有出入。README 同时强调JSON 输出格式下的外层信封结构不计入token_count。分析 APICodebaseAnalysis 的三个视角CodebaseAnalysis提供三种对代码库的分析视角对应 Rust 侧crates/code2prompt-core/src/analysis.rs的实现Python 投影见 python.rsraw_files()→list[FileEntry]原始文件列表含 token 数by_extension()→list[ExtensionStat]按扩展名聚合的统计ExtensionStat包含extension、file_count、tokens、percentagetoken_map(options)→list[TokenMapEntry]树形 token mapTokenMapEntry包含path、name、tokens、percentage、depth、is_last_child、has_children等字段可直观看出哪些路径最吃 token。token_map接受TokenMapOptions控制粒度默认值max_lines20、min_percent0.1python.rsfrom code2prompt_rs import TokenMapOptions entries analysis.token_map(TokenMapOptions(max_lines4, min_percent0.0))raw_analysis()使用原始token 总和Σ 各文件 token_count含行号、不含模板结构开销适合生成前的成本估算或纯代码库统计contextual_analysis(rendered)则使用RenderedPrompt.token_count含模板开销适合生成后基于实际输出规模的百分比分析。二者的差异在 Rust 侧文档注释中有明确说明session.rs测试 test_analysis.py 验证了两者的对象类型与字段完整性。本地开发与构建仓库采用 uv 管理 Python 开发环境测试与构建命令如下uv sync uv run pytestuv sync会创建.venv、安装开发依赖maturin、pytest见 pyproject.toml并以 editable 模式构建原生扩展。lockfileuv.lock已提交保证开发环境可复现uv.lock的缓存键覆盖了 pyproject.toml、Cargo.toml/Cargo.lock、src/**/*.rs以及 core crate 的源码与模板pyproject.toml意味着 core 的任何改动都会正确触发扩展重建。本地构建 release wheeluv run maturin build --release构建产物即为可安装的code2prompt_rswheel。测试套件分布在 tests/ 下test_config.py配置默认值与 round-trip、test_session.py会话选择与加载、test_analysis.py分析模型、test_git.pyGit 加载、test_processors.pyipynb 处理器、test_generation.pyPrompt 生成配合 tests/conftest.py 中的 fixture 构建临时项目可以作为理解各 API 行为边界的活文档。与 Rust 侧的对应关系小结Python 侧Rust 侧code2prompt_rs.Code2PromptConfigconfiguration.rs 的Code2PromptConfigcode2prompt_rs.Code2PromptSessionsession.rs 的Code2PromptSessioncode2prompt_rs.RenderedPromptsession.rs 的RenderedPromptcode2prompt_rs.CodebaseAnalysisanalysis.rs 的CodebaseAnalysis枚举类OutputFormat等template.rs / tokenizer.rs / sort.rs 中的对应枚举得益于绑定层是配置直接转成 Rust 配置、会话直接包装 Rust 会话python.rs 中的FromPyCode2PromptConfig for Code2PromptConfig你在 Python 中获得的语义与 Rust 端完全一致模式过滤、git 集成、token 估算、模板渲染的底层逻辑都由同一个code2prompt_core提供。若需要自定义输出结构可在配置中设置custom_template/template_strHandlebars 语法并配合user_variables注入变量仓库内 templates/ 下的 13 个内置模板如write-git-commit.hbs、refactor.hbs与 default_template_md.hbs 均可作为编写自定义模板的参考。至此你已经掌握了 code2prompt_rs 从安装、配置、会话操作到源码级原理的完整链路可以在自己的 Python 脚本、自动化工具或 Agent 工作流中直接复用这套代码库 → LLM Prompt的成熟能力。【免费下载链接】code2promptA CLI tool to convert your codebase into a single LLM prompt with source tree, prompt templating, and token counting.项目地址: https://gitcode.com/GitHub_Trending/co/code2prompt创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表