【免费下载链接】rocketride-serverHigh-performance AI pipeline engine with a C core and 50 Python-extensible nodes. Build, debug, and scale LLM workflows with 13 model providers, 8 vector databases, and agent orchestration, all from your IDE. Includes VS Code extension, TypeScript/Python SDKs, and Docker deployment.项目地址https://gitcode.com/gh_mirrors/ro/rocketride-server点击查看免费下载本文以 RocketRide 开源仓库中的currency_convert_explicit节点节点 README为核心讲解如何在金融数据提取管道中插入一个不联网、不隐式取汇率的货币转换步骤你显式声明源币种、目标币种、转换汇率与汇率日期节点用精确的十进制算术完成换算并为每条转换记录写入可审计的 provenance溯源条目。读完本文你将掌握该节点的全部配置参数、输出结构、在审计级金融提取套件中的管道位置以及它背后的纯 Python 实现与测试验证。节点定位什么时候该用它currency_convert_explicit是一个 RocketRidefilter 型节点它把结构化事实fact记录从一种货币按你显式给出的汇率换算到另一种货币。它适合财务管道需要一个可复现、可审计的换算步骤例如财报数字提取后按既定报告政策统一折算不希望依赖实时汇率服务——节点从不拉取汇率、不访问任何网络服务结果只取决于你声明的配置同一输入永远产生同一输出需要区分只做货币标记如上游 normalize_facts 只标签币种不换算与真正换算两种职责。节点注册信息位于 services.jsonregister为filter、classType为[text]、capabilities为[experimental]即尚未标记为生产就绪协议为currency_convert_explicit://Python 实现路径为nodes.currency_convert_explicit。工作方式读取并重发 answers 通道节点在answers通道上读取并重发数据Lanes 定义见下表与 services.json 中的lanes: {answers: [answers]}一致Lane inLane out说明answersanswers转换匹配的 JSON 事实记录且每条输入记录恰好转发一次对于一条币种字段与配置的源币种匹配的事实保留原始事实——原始amount与currency永不被修改新增converted对象——包含换算后的amount与currency追加 provenance 条目——记录rate、rate_date、source_currency、target_currency。输入可以是单个 JSON 事实对象或事实对象列表。纯文本、标量 JSON、非事实对象、无效金额、以及币种不匹配的事实全部原样透传因此这是一个安全的、结构化解耦后可选的步骤。输入 / 输出示例结合 convert.py 的实现逻辑与 单元测试test_converts_matching_currency、test_provenance_entry_recorded设配置为source_currencyEUR、target_currencyUSD、rate1.1、rate_date2026-06-30、decimals2输入{ amount: 100, currency: EUR, provenance: [{ op: extract }] }输出为{ amount: 100, currency: EUR, converted: { amount: 110.0, currency: USD }, provenance: [ { op: extract }, { op: currency_convert_explicit, rate: 1.1, rate_date: 2026-06-30, source_currency: EUR, target_currency: USD } ] }原始amount: 100与currency: EUR保持原样converted块被新增provenance 列表被复制并追加新条目。配置详解配置在 services.json 的fields中定义。默认 profile 提供 EUR→USD 的字段名与中性汇率但节点只有一个 profile真正定制换算的是下面这些独立字段。所有配置项在 IGlobal.py 的beginGlobal()中一次性读取并规范化字符串去空白、amount_field/currency_field空值回退为amount/currency。源币种与目标币种源币种Source currency决定哪些事实会被换算。匹配大小写不敏感convert_fact中currency.strip().upper() ! source_currency.upper()比较测试test_case_insensitive_currency_match用eur验证。字段约束minLength1、maxLength16。目标币种Target currency按配置原样写入新的converted.currency。约束同上。两个代码都不能为空任一为空时IGlobal.py 会调用rocketlib.warning记录警告answers will pass through unchanged所有 answers 原样透传不会让管道失败对应测试test_missing_target_passthrough。转换汇率与汇率日期转换汇率Conversion rate作为target source × rate中的乘数不检索、不推断。请按相关报告政策使用对应的汇率。字段约束typenumber、default1.0、minimum0。如果汇率无法被解释为有限数IGlobal.beginGlobal会警告并让所有 answers 原样透传测试test_invalid_rate_passthrough用not-a-number验证。汇率日期Rate date记录该汇率适用的 ISO-8601 日期如2026-06-30会保留在 provenance 条目中。约束typestring、default、maxLength32。金额字段与币种字段Amount field与Currency field指定从每条事实中读取的键名。上游提取器若不用amount/currency命名可改这两个字段测试test_custom_field_names用amount_fieldvalue、currency_fieldccy验证。金额支持整数int浮点数float可与十进制兼容的字符串如100.005Decimal类型。布尔值与无穷/NaN 等非有限值不是货币金额原样保留convert.py 的_to_decimal显式拒绝bool测试test_boolean_amount_rejected验证amountTrue不产生converted。字段缺失、币种字段非字符串、或源币种不匹配同样让该事实原样通过测试test_missing_fields_passthrough、test_non_matching_currency_passthrough。舍入小数位Rounding decimals控制converted.amount的小数位数默认2schema 约束minimum0、maximum10。换算结果使用十进制算术并四舍五入ROUND_HALF_UP写为最终 JSON 数字前不会引入二进制浮点噪声。需要整数结果设0下游事实契约需要更高精度时可调大测试test_decimals_config用rate1.23456、decimals4验证100 × 1.23456 → 123.456test_rounding_half_up验证100.005 × 1 → 100.01。完整 Schema 表以下为节点 README 中由nodes:docs-generate自动生成的参数字段表与 services.json 的fields一一对应字段类型说明默认值currency_convert_explicit.amount_fieldstringAmount field持有待换算数值的事实字段。amountcurrency_convert_explicit.currency_fieldstringCurrency field持有币种代码的事实字段。currencycurrency_convert_explicit.decimalsintegerRounding decimals换算结果的小数位数四舍五入 half-up。2currency_convert_explicit.profilestringConversion显式货币换算配置defaultcurrency_convert_explicit.ratenumberConversion rate作用于源金额的声明乘数target source × rate。请有意提供不拉取任何数据。1currency_convert_explicit.rate_datestringRate date汇率适用的日期ISO 8601如 2026-06-30记录于换算 provenance。currency_convert_explicit.source_currencystringSource currency要从该币种换算如 EUR。仅带此币种标记的事实被换算大小写不敏感。EURcurrency_convert_explicit.target_currencystringTarget currency要换到的币种如 USD。USD默认 profileservices.json 的preconfig.profiles.default提供 EUR→USD、rate1.0、rate_date、amount_fieldamount、currency_fieldcurrency、decimals2。输出与溯源provenance非破坏性与 converted 块原始amount与currency永不被修改测试test_does_not_mutate_input验证输入字典完全不变。节点在顶层新增converted对象result[converted] { amount: _number(converted_amount), currency: target_currency, }provenance 的追加语义provenance 处理逻辑convert.py 的convert_fact已有列表复制后追加新条目绝不修改调用方的原列表不存在新建单元素列表存在但非列表保留该意外值作为新列表的第一项测试test_non_list_provenance_preserved验证provenance: origin变成[origin, entry]。因此后续再次换算会替换converted块但保留更早的 provenance 条目形成完整的审计链。provenance 条目结构NODE_OP currency_convert_explicit{ op: currency_convert_explicit, rate: rate, rate_date: cfg.get(rate_date, ), source_currency: source_currency, target_currency: target_currency, }Answers 转发机制与 isJson 门控延迟转发防止重复IInstance.py 中节点抑制引擎的默认立即转发调用self.preventDefault()与anonymize节点同款做法在writeAnswers阶段把每条 answer 的转换结果收集到pending列表在closing()阶段统一写回。这样既保证每条记录恰好出现一次又不会因默认透传产生重复。JSON 答案与看起来像 JSON 的文本的区分只有answer.isJson()为真的JSON 通道答案才会被当作事实处理纯文本答案即使内容恰好是合法 JSON如{amount: 10, currency: EUR}也会保持expectJsonFalse原样走文本通道不会被升级到 JSON 通道。回归测试test_text_answer_that_looks_like_json_stays_text专门守护这一行为防止类 JSON 文本被误当事实换算的 bug。payload None if answer is not None and answer.isJson(): try: payload answer.getJson() except ValueError: payload None if isinstance(payload, (dict, list)): self.pending.append((True, convert_payload(payload, self.IGlobal.config))) else: self.pending.append((False, answer.getText() if answer is not None else )) self.preventDefault()源码级实现纯函数换算内核转换逻辑全部收敛在 convert.py刻意不依赖任何 RocketRide / rocketlib 导入从而可以在引擎外单独做单元测试。三个核心辅助函数_to_decimal(value)把 JSON 标量尽力转换为有限Decimal。布尔值直接拒绝浮点数通过str()中转如0.1不会带上二进制浮点噪声字符串先strip()再解析InvalidOperation/ValueError返回None_quantize(amount, decimals)用Decimal(1).scaleb(-decimals)构造 10 的负幂次指数按ROUND_HALF_UP量化_number(d)把Decimal渲染为可 JSON 序列化的float。主入口convert_fact(fact, cfg)的执行顺序是非 dict 直接返回 → 取字段名带空值回退→ 源/目标币种任一为空则返回 → 字段缺失则返回 → 币种不匹配大小写不敏感则返回 → 金额或汇率为非有限数则返回 → 计算amount × rate并量化 → 构造converted块 → 追加 provenance。convert_payload则负责对单个 dict 或 list 递归应用其他载荷形状标量、字符串原样返回。在审计级金融提取管道中的位置按 normalize_facts README 给出的管道骨架该节点位于datalab_parse → extract_facts → normalize_facts → currency_convert_explicit → schema_validate → …normalize_facts负责把标签映射为标准指标名、解析数字与符号、标记tag货币但绝不换算——换算职责正是单独交给currency_convert_explicitnormalize_facts 会仅在缺失时把amount与currency镜像到事实顶层以便下游本节点用默认字段名直接工作注意当scale_factor ! 1如$1,234 in millions时amount镜像会被扣留——因为本节点只读amount而不读scale_factor把以百万计的 as-stated 数字直接乘汇率会得到偏差一个量级的换算结果。带缩放的事实必须显式去缩放后再接入本节点。测试与质量保证该节点的正确性由两层测试守护纯逻辑单元测试nodes/test/test_currency_convert_explicit.py覆盖换算数学100 EUR × 1.1 → 110 USD、half-up 舍入、decimals配置、大小写不敏感匹配、各类透传非匹配币种、缺字段、非 dict、N/A、布尔金额、非法汇率、空目标币种、自定义字段名、输入不可变性、非列表 provenance 保留、列表/标量载荷透传引擎胶水回归测试nodes/test/currency_convert_explicit/test_isjson_gate.py以 importlib 方式从源码加载IGlobal/IInstance通过伪造引擎捕获writeAnswers验证 isJson() 门控——真实 JSON 事实仍被换算类 JSON 纯文本仍原样透传。使用建议小结把本节点放在结构化提取与归一化之后、schema 校验之前确保输入是事实对象每次换算都显式填写rate与rate_date让 provenance 里的每个数字都可追溯到报告政策上游有缩放单位millions/bn时先去缩放再接入避免量级错误该节点标记为experimental不要依赖引擎级动态测试注入 answers 事实如 services.json 注释所述webhook 注入的answers通道因 Answer schema 校验恒为空请以纯逻辑单元测试与契约测试作为验证手段。赞分享【免费下载链接】rocketride-serverHigh-performance AI pipeline engine with a C core and 50 Python-extensible nodes. Build, debug, and scale LLM workflows with 13 model providers, 8 vector databases, and agent orchestration, all from your IDE. Includes VS Code extension, TypeScript/Python SDKs, and Docker deployment.项目地址https://gitcode.com/gh_mirrors/ro/rocketride-server点击查看免费下载相关推荐AntdUI颜色选择器ColorPicker控件的高级用法与颜色管理AntdUI颜色选择器ColorPicker控件的高级用法与颜色管理 引言为什么需要专业的颜色选择器 在现代WinForm应用程序开发中颜色选择是一个常金融科技image2cpp 项目推荐image2cpp 项目推荐 1. 项目基础介绍和主要编程语言 image2cpp 是一个开源项目旨在将图像转换为字节数组以便在单色显示器如OLED上使前端Wallos货币转换引擎Fixer API集成与汇率更新机制完全指南在当今全球化的订阅服务环境中管理来自不同国家的订阅并准确跟踪支出成为许多用户的痛点。Wallos作为开源个人订阅管理工具通过集成Fixer API构建了强大后端上一篇从 v1.0.0 到 v1.0.3wxt-dev/module-vue 版本演进与源码实现解析下一篇NV-Generate-MR安全与伦理考量医疗AI模型的负责任使用指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考