
使用 MLflow TypeScript SDK 的 mlflow/openai 集成实现 OpenAI 调用自动追踪【免费下载链接】mlflowThe open source AI engineering platform for agents, LLMs, and ML models. MLflow enables teams of all sizes to debug, evaluate, monitor, and optimize production-quality AI applications while controlling costs and managing access to models and data.项目地址: https://gitcode.com/GitHub_Trending/ml/mlflowMLflow 的 TypeScript SDK 为前端、Node.js 后端与 Agent 应用提供了原生的可观测性能力其中mlflow/openai包通过一个极简的包装函数tracedOpenAI即可对 OpenAI 官方 SDK 的 Chat Completions、Responses 与 Embeddings 调用实现零侵入自动埋点并将输入、输出、Token 用量、错误与延迟完整写入 MLflow Tracking Server。读完本文你将掌握从安装、启动服务端、初始化 SDK 到在生产代码中接入并理解 trace 详情的完整链路同时能从源码层面理解其基于 JavaScript Proxy 与 OpenTelemetry 的自动插桩原理。一、包定位与依赖关系mlflow/openai是 MLflow TypeScript SDK 生态中的自动插桩集成包auto-instrumentation integration位于 libs/typescript/integrations/openai其职责非常聚焦把 OpenAI 官方openai包的客户端实例包装成被追踪的版本所有经过包装的模型调用都会自动生成 MLflow trace 并上报。从 package.json 可以看到两个关键约束peerDependenciesmlflow/core^0.4.0与openai4.0.0。这意味着它自身不捆绑这两个包需要你的项目显式安装enginesnode 18即要求 Node.js 18 及以上运行时包以dist/为发布产物main指向dist/index.js类型声明为dist/index.d.ts。因此mlflow/openai只是接线层真正的 trace 创建、导出与 MLflow 服务端通信能力全部来自核心包 mlflow/core。mlflow/core是一个瘦包skinny package提供核心追踪功能与手动插桩 APItrace、startSpan、withSpan等其公开导出见 core/src/index.ts。二、安装与前置条件2.1 安装依赖npm install mlflow/openai由于mlflow/core与openai是 peer dependencies根据你使用的包管理器npm 7 通常会自动安装 peer 依赖可能需要手动补充安装npm install mlflow/openai mlflow/core openai2.2 启动 MLflow Tracking Servertrace 数据需要写入一个 MLflow Tracking Server。如果本机有 Python 环境最简单的方式是pip install mlflow mlflow server --backend-store-uri sqlite:///mlruns.db --port 5000--backend-store-uri sqlite:///mlruns.db将元数据含 trace持久化到本地 SQLite 文件--port 5000指定服务端口即下文trackingUri使用的地址。如果本地没有 Python 环境MLflow 也支持 Docker 部署或托管服务仓库自带的 Helm 图表位于 charts含 values.yaml 与 README.md可用于在 Kubernetes 上自托管。2.3 初始化 MLflow SDK在应用启动处进程级调用一次初始化 SDKimport * as mlflow from mlflow/core; mlflow.init({ trackingUri: http://localhost:5000, experimentId: experiment-id, });experimentId对应 MLflow 中的一个实验Experimenttrace 会归属到该实验下。你可以先通过MlflowClient创建实验拿到 IDconst client new mlflow.MlflowClient({ trackingUri: http://localhost:5000 }); const experimentId await client.createExperiment(my-openai-app);init 的完整配置项结合 config.ts 的MLflowTracingConfig定义init支持以下关键参数参数说明默认/解析来源trackingUritrace 上报地址。可为 HTTP(S) URL、databricks使用默认 profile或databricks://profile未传入时读取环境变量MLFLOW_TRACKING_URI两者都缺则抛错experimentIdtrace 归属的实验 ID未传入时读取MLFLOW_EXPERIMENT_ID两者都缺则抛错databricksConfigPathDatabricks 配置文件路径默认~/.databrickscfgtrackingServerUsername/trackingServerPasswordOSS MLflow 服务端 Basic Auth亦可使用MLFLOW_TRACKING_USERNAME/MLFLOW_TRACKING_PASSWORDtrackingServerTokenOSS MLflow 服务端 Bearer Token亦可使用MLFLOW_TRACKING_TOKENworkspace启用了 workspace 的 MLflow 服务端OSS/非 Databricks工作区名会写入X-MLFLOW-WORKSPACE请求头亦可使用MLFLOW_WORKSPACE优先级更高traceLocationDatabricks Unity Catalog trace 位置catalogName/schemaName/tablePrefix提供时生成 V4 trace ID 并走 UC 路径省略时使用 V3 实验后端的 trace 路径认证解析优先级在 init 实现 中体现OSS 场景依次尝试 Basic Auth、Bearer Token、无认证。值得注意init()设计为每进程调用一次重复调用会拆除并重建底层 OpenTelemetry SDK异步关闭可能与后续 tracer 注册产生竞态因此应在启动时配置好不要运行中反复重配。三、快速开始一行代码开启自动追踪在完成mlflow.init之后对 OpenAI 调用的接入只需要一个包装动作import { OpenAI } from openai; import { tracedOpenAI } from mlflow/openai; // 用 tracedOpenAI 包装 OpenAI 客户端 const client tracedOpenAI(new OpenAI()); // 之后照常调用即可所有调用自动生成 trace const response await client.chat.completions.create({ model: o4-mini, messages: [ { role: system, content: You are a helpful weather assistant. }, { role: user, content: Whats the weather like in Seattle? }, ], });调用完成后打开 MLflow UIhttp://localhost:5000即可看到该次调用的 trace输入消息、模型输出、Token 用量、耗时与状态一应俱全如上图所示。整个过程无需修改任何调用参数或返回值——tracedOpenAI返回的对象在类型层面与原客户端完全一致T T对业务代码透明。三个自动被追踪的入口从 src/index.ts 的常量定义可以看到当前支持的模块与方法为// NB: Completions 即 chat.completions const SUPPORTED_MODULES [Completions, Responses, Embeddings]; const SUPPORTED_METHODS [create]; // chat.completions.create, embeddings.create, responses.create即自动追踪的范围包括client.chat.completions.create(...)—— Chat Completionsclient.responses.create(...)—— Responses APIclient.embeddings.create(...)—— Embeddings其余模块与方法的调用会被原样透传不受影响。四、源码原理基于 Proxy 的透明拦截tracedOpenAI的实现src/index.ts并不修改 OpenAI 客户端本身而是利用 JavaScript 的Proxy返回一个包装层函数属性当访问到目标对象上的方法时若该方法所在模块与方法名命中SUPPORTED_MODULES/SUPPORTED_METHODS通过shouldTraceMethod判定就用wrapWithTracing将其包装为带埋点的版本否则原样bind(target)返回保持this上下文正确。嵌套对象当访问到对象属性如chat、chat.completions时递归地对该对象再次调用tracedOpenAI实现多层路径chat.completions.create的逐级包装。其他值普通值直接返回。这种懒包装设计有两个实际好处一是只有真正命中的方法才产生额外开销二是包装对业务代码完全透明客户端的所有既有类型与行为保持不变。span 命名与类型映射包装时以模块名作为 span 名称并按模块映射 span 类型getSpanTypesrc/index.ts模块span 名称span 类型CompletionsCompletionsLLMResponsesResponsesLLMEmbeddingsEmbeddingsEMBEDDINGSpanType是核心包的枚举之一完整取值见 constants.ts包括LLM、CHAIN、AGENT、TOOL、RETRIEVER、EMBEDDING等。每个被追踪的 span 还会统一写入mlflow.message.format openai属性SpanAttributeKey.MESSAGE_FORMAT供 UI 等下游解析消息格式token 用量则写入mlflow.chat.tokenUsageSpanAttributeKey.TOKEN_USAGE。与手动 span 的嵌套span 父子关系tracedOpenAI包装的调用默认作为根 span 上报。如果你的应用代码用mlflow.withSpan(...)或mlflow.trace(...)包裹业务逻辑OpenAI 调用会自动成为其子 span——这得益于核心包的withSpan使用 OpenTelemetry 的startActiveSpan管理活动上下文见 core/src/core/api.ts。在 集成测试 中验证了这一行为外层predictCHAIN类型为父 span内层CompletionsLLM类型为子 span同一 trace 内共 2 个 span且父 span 默认DEBUG级别、LLM 子 span 为INFO级别。这意味着你可以在 OpenAI 调用外层自由组合withSpan/trace构建完整的 Agent 调用链观测。五、Token 用量追踪兼容两种响应格式tracedOpenAI会自动从响应中提取 token 用量并写入 span 属性与 trace 元数据。提取逻辑extractTokenUsagesrc/index.ts同时兼容两种响应格式Responses API 格式优先读取input_tokens/output_tokens字段total_tokens缺失时由二者相加ChatCompletion API 格式回退读取prompt_tokens/completion_tokens并统一归一化为{ input_tokens, output_tokens, total_tokens }结构。对应的 MLflow 侧存储键TokenUsageKey即input_tokens、output_tokens、total_tokens。测试 index.test.ts 验证了 Embeddings 场景prompt_tokens映射为input_tokens输出 token 数为 0total_tokens与响应一致。提取到的用量同时落在两个位置span 的TOKEN_USAGE属性键mlflow.chat.tokenUsage以及 trace 级别的汇总信息trace.info.tokenUsage。六、流式输出Streaming的完整追踪tracedOpenAI对流式调用stream: true做了专门的深度处理这是它最复杂也最体现工程质量的部分。当Completions.create的入参stream true时src/index.ts不会立刻结束 span而是先启动 span、写入输入与MESSAGE_FORMAT属性调用原始方法拿到Stream对象通过wrapChatCompletionStreamL181-L227返回一个 Proxy 包装的流。逐 chunk 累积还原完整消息流式输出由多个 chunk 组成每个 chunk 只带增量delta。包装后的迭代器wrapChatCompletionIteratorL247-L323会按choice.index累积每个 choice 的role、content、tool_calls含id、type、function.name、function.arguments与finish_reason将累积结果作为 span 的outputs形如{ choices: [...] }在流结束时写入流结束done后统一span.end()。长文本截断保护为避免超大输出拖垮内存与 UI累积内容有长度上限MAX_ACCUMULATED_LENGTH 10000字符超出后截断并追加...[truncated]后缀appendBoundedL325-L334且截断后不再继续累积。各种消费方式都能被追踪真实 SDK 的Stream存在多条消费路径for await、tee()、toReadableStream()。实现刻意在内部iterator方法SDK 所有消费路径的唯一汇聚点上做包装避免每 chunk 重复累积同时对非标准duck-typed流回退到包装Symbol.asyncIterator。测试覆盖了 tee()、toReadableStream() 与流身份保持返回的仍是Stream实例L267-L280等场景。提前终止与放弃消费的兜底流被break提前退出、中途失败或被消费者放弃从未迭代时span 都不会泄漏放弃消费wrapChatCompletionStream监听controller.signal的abort事件在流未被消费时立即结束 spanL185-L199对应测试见 L249-L265提前 break迭代器finally块中主动iterator.return?.()并结束 span保留已累积的输出对应测试见 L176-L197流中途抛错recordStreamError将 span 状态置为ERROR并记录异常后结束。七、错误处理与失败状态非流式调用出错时包装逻辑会捕获异常、把 span 状态置为ERROR、记录异常消息并结束 span然后原样抛出错误不影响业务侧的异常处理流程src/index.ts。测试用 MSW 模拟了 429 限流错误index.test.ts验证trace 状态为ERROR、spanstatusCode为ERROR、span 记录了输入但没有输出、startTime/endTime 均已写入。流式创建阶段同步抛错、迭代中途失败也都有对应测试覆盖L282-L328保证任何失败路径都不会留下悬挂的 span。八、验证与测试基础设施该集成自带完整的 Jest 测试套件tests/index.test.ts使用 MSWMock Service Worker拦截api.openai.com的 HTTP 请求无需真实调用 OpenAI 即可离线验证。测试中通过mlflow.flushTraces()冲刷内存中的 trace再用MlflowClient.getTrace()回读断言 span 的名称、类型、状态、输入输出与 token 用量。如果你在仓库中开发该包可以运行cd libs/typescript/integrations/openai npm test # 运行 Jest 测试 npm run build # tsc 编译到 dist/九、已知边界与使用建议从源码注释与测试可以总结出当前版本mlflow/openai0.4.0的边界Responses API 的流式响应尚未特殊处理源码中标注TODO: Handle Responses API streaming responses流式埋点目前主要针对chat.completions.create自动追踪仅覆盖create方法与上述三个模块其他 OpenAI 能力如 moderation、files 等可通过mlflow/core的手动 APItrace/startSpan/withSpan自行埋点init必须在任何追踪调用之前完成且建议每进程一次未初始化就调用追踪函数会抛出 not configured 错误建议在chat.completions.create流式调用时显式传入stream_options: { include_usage: true }以便拿到流末尾的用量信息测试中即如此使用。接入mlflow/openai后你的 OpenAI 应用即获得了与 Python 生态对齐的可观测性输入输出、Token 成本、延迟、错误与完整调用链都会沉淀为结构化 trace可在 MLflow UI 中检索、对比与排障为后续评估与监控打基础。【免费下载链接】mlflowThe open source AI engineering platform for agents, LLMs, and ML models. MLflow enables teams of all sizes to debug, evaluate, monitor, and optimize production-quality AI applications while controlling costs and managing access to models and data.项目地址: https://gitcode.com/GitHub_Trending/ml/mlflow创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考