Files
go-sip/docs/开源组件选型与复用清单_v0.2.md
T

25 KiB
Raw Blame History

开源组件选型与复用清单 v0.2

更新:P1基础栈按§1.3收敛,AI供应商范围已确认百炼/火山ASR、OpenAI兼容LLM、火山TTS;可调参数来自Dispatcher读取的SaaS任务配置。当前为单活D、1 Agent/1 Asterisk、单 Cell、至少3 SIP fixture、单租户和静态SIP配置;双节点、第二 Cell、双租户和真实供应商联调延期第二阶段。技术方向确认不等于SDK版本/参数能力已通过。 未安装依赖、编译或调用真实供应商。

1. 结论与证据边界

用户已确认:SIP 及其它组件有现成的适用开源库/SDK 时必须使用,绝不从零手写替代实现。 Asterisk/PJSIP 继续承担 SIPGo Agent 重点实现项目特有的授权、配额、状态机和可靠性,不另造协议栈。

本轮核查了上游仓库、README、LICENSE、GitHub 元数据、Go module 元数据及相关 issue;搜索结果只用于发现,关键风险以源项目材料复核。这是选型调研,不是依赖锁版、Go 1.27.1 编译、漏洞清零、媒体压测或真实供应商验收报告。 未安装依赖、创建 Go 模块或运行收费调用。

许可证表是初步识别,不替代锁定源码/传递依赖的完整许可核验。未归档、最近有提交、星数多都不证明正确性或安全;开发分支也不等于可用发行版。

1.1 强制实施规则

  1. 先复用标准库、Asterisk 原生能力、现成官方/社区 SDK;协议能力不能因为“只有几十行”就自写。
  2. 业务侧允许自写租户约束、CAS、事务、inbox/outbox、公平调度、最终许可、资产绑定及必要薄适配。这些不能让 SDK 的默认行为替代。
  3. 不允许自写 SIP/SDP 协议栈、ARI 客户端、RTP/RTCP 编解包、G.711、WebSocket 握手/帧、AMQP 客户端、SQL 驱动、OSS 签名、可用 SDK 已覆盖的 AI 协议或 Schema 解析器。
  4. 不合适的库按“同类替代→现有 API 组合→上游修复/受控补丁”处理;记录维护/许可证/兼容性缺口并阻塞对应功能。不能自行决定退回手写;例外必须用户另行批准。 受控补丁也不得暗中演变为整套自研客户端。
  5. 不把整张候选表全装进项目。每个真实需要只选必要的一套依赖,保留许可证、固定版本/commit、校验和、变更理由和维护责任人。

1.2 首发最小选型范围

  • P0/P1只核验实际采用的Cobra、grpc/protobuf、SQLite/迁移、AMQP、ARI/媒体、Schema与必要健康采样、各类AI SDK、录音/受限OSS上传能力;不要求所有候选逐一PoC。
  • 三家SIP通过现有Asterisk/PJSIP独立trunk接入,不引三套Go SIP客户端。静态发布用批准制品与受控部署入口,不先引在线发布/回滚平台。
  • ASR-only及ASR+LLM+TTS均交付;本轮用户明确选定百炼/火山两种ASR、OpenAI兼容LLM、火山TTS。每个适配只选一套SDK,不增加自动AI编排;模型/协议、参数与真实验收仍是P1门禁,见交互GAP-08/09。
  • P1调度骨架/单 Cell 配额与第二阶段等权公平都在单活D事务和普通有界循环内完成;不增加调度框架、分布式锁、规则引擎或插件系统。
  • 生成/校验覆盖使用入口及引用闭包,来源包不裁剪、只读索引不手改。未来功能启用时再增量核验依赖;已用依赖的许可证/漏洞/SDK重试安全不得削减。

1.3 当前阶段的实施选型

下表为本次采用方向;只有完成module/tag/commit/hash/许可证、Go1.27.1构建和对应PoC后才进入锁文件。不把历史@latest观察当锁定版本,不同时安装同能力候选。

能力 P1采用方向 暂不引入/必须证明
语言/CLI/配置 Go1.27.1、github.com/spf13/cobra;部署配置使用标准库JSON,业务AI配置走SaaS源Schema 不引Viper/热配置中心,不用env覆盖模型/音色等业务值
Unary/mTLS google.golang.org/grpc、google.golang.org/protobuf及官方生成工具 已批Proto、身份/许可PoC;不加内部MQ/双向音频流
D存储/迁移 database/sqlmodernc.org/sqlitegithub.com/golang-migrate/migrate/v4的database/sqlite后端 无CGO方向;核验现代SQLite驱动和迁移事务语义,Agent无DB;不引ORM/PG
MQ github.com/rabbitmq/amqp091-go 直接使用官方ACK/confirm/return;不同时加go-rabbitmq封装或自研AMQP客户端
SIP/ARI 固定Asterisk/PJSIPgithub.com/CyCoreSystems/ari/v5以v5.3.1为当前隔离核验目标 Asterisk 22.10.1 下的 ExternalMedia/bridge/PCMA RTP/录音 runtime PoC 已通过,模块许可证为 Apache-2.0 且 Go1.27.1 临时 module 可 go vet/go test;隔离 PJSIP/PJSUA2 mock leg 已通过同通道 PCMA RTP/录音/ARI cleanup;仍需正式 tag/commit/hash、依赖/安全审查、生产静态制品、供应商真实 SIP 门禁,不能采用module错配的v5.4.0;不引sipgo/diago/NATS
媒体/录音 github.com/pion/rtp;按通道需要pion/rtcpAsterisk原生转码/录音;Go侧必要时zaf/g711 不自写编解包/重采样/WAV;音频格式由有效配置与实际媒体能力协商/校验
Schema/生成 github.com/santhosh-tekuri/jsonschema/v6github.com/oapi-codegen/oapi-codegen/v2作生成器首选 用发行版验证本项目3.1/2020-12及可选零值;libopenapi只作替代评估,不预装双解析栈
百炼ASR github.com/devinyf/dashscopegoparaformer)为首选PoC 仅在批准模型匹配run-task时采用;FunASR/Qwen/NLS不能按名称替换,必要字段/取消不满足先替代或补上游
火山ASR/TTS github.com/GizClaw/doubao-speech-go共用一套薄适配底座 ASR SAUC与选中TTS协议分别验证;可调参数覆盖仍有门禁,见§4.3,不能先宣称已最终锁库
OpenAI兼容LLM 官方github.com/openai/openai-go/v3,先验证目标Chat Completions流式路径 SaaS提供受控端点/模型;不自动启用Responses/Realtime/收费OpenAI端点;重试显式关闭
OSS 标准库net/http消费SaaS签名PUT;只有需要OSS API/受限凭据时引官方aliyun/alibabacloud-oss-go-sdk-v2 不自写签名、不持多余长期AK、不另建上传配置源
健康/日志/HTTP github.com/shirou/gopsutil/v4、log/slog、net/http、context、crypto/tls 指标接入Prometheus时再引client_golangSDK自带WS,不并行引通用WS框架

本轮公开搜索/包文档补核可用方向,但raw GitHub/Go proxy读取被工具SSRF保护拒绝,未绕过限制;确切源码、发行tag/hash和全部参数能力仍待受控环境核验。不能把上述优先目标写成已生成go.mod/go.sum或生产准入。

2. 推荐与候选矩阵

“优先”是PoC顺序,不是生产准入;实际采用组件须通过 验收方案L01L08及相应A项,适用阶段以该文§1.2为准。

能力 优先复用的项目/原生能力 本轮许可/维护观察 决策与边界
CLI双命令 spf13/cobra 已核对README和Apache-2.0许可文本;仓库API维护元数据本轮受限 唯一main/单module注册agent、dispatcher;不手写flag解析、不增加第三业务命令或为配置自动引入Viper
内部RPC grpc/grpc-go 已核对Apache-2.0许可 使用google.golang.org/grpc的Unary、连接复用、TLS/拦截器;不加内部MQ/双向流,不手写RPC框架
协议编码/生成 protocolbuffers/protobuf-go 已核对BSD-3-Clause许可 使用protoc及官方生成插件;Proto须先冻结,原JSON契约不能手工复制成另一套业务字段
主机/进程采样 shirou/gopsutil 已核对BSD-3-Clause等源许可声明;需继续核验传递依赖 CPU/load/内存/磁盘/进程/FD优先用库,区分host/cgroup/process;权限不足报告unknown,不自写/proc解析
SIP、注册、协商、通话桥 已选定的 Asterisk/PJSIP 沿用固定镜像;发行及组件许可清单在打包时核验 继续复用,不在 Go 里重新实现 SIP,不变更生产架构
ARI HTTP/事件/桥/录音 CyCoreSystems/ari Apache-2.0,未归档;main 已为 /v6tag/模块有不一致风险 首选评估,但必须先验证 major/tag、ExternalMedia 和镜像兼容;不用示例中的 NATS proxy 引入第二条业务总线
直接 Go SIP 的备选 emiago/sipgoemiago/diago 前者 BSD-2-Clause,后者 MPL-2.0;均未归档 确有现成实现,但当前不引入;它们不是 ARI 客户端,不能借选库替换 Asterisk 路线
RTP/RTCP pion/rtppion/rtcp MIT,未归档 用于编解包、扩展、payload;RTCP 按实际通道需要引入,不为 RTP 拉入完整 WebRTC 栈
G.711/音频变换 Asterisk 原生转码;必要时 zaf/g711 g711 为 BSD-3-Clause,未归档 Go 侧确需 PCMA/PCMU↔PCM 才引入;Pion 的 G.711 payload 处理不等于 PCM 解码/重采样
录音/WAV Asterisk 已有录音能力及 ARI SDK go-audio/wav 为 Apache-2.0,但本轮 API 标记 archived=true 不选该归档库作为新生产默认,不因此手写 WAV/重采样器;如需替换录音路径先评估维护中的库并证明双向录音/封口等价
AMQP 0-9-1 rabbitmq/amqp091-go 官方维护,未归档;API 许可为 NOASSERTION,读取 LICENSE 为 BSD 风格二条款 推荐;confirm/return/ACK/关闭需显式处理;库不自动提供业务幂等或 exactly-once
AMQP 自动恢复封装 wagslane/go-rabbitmq MIT,未归档,README提供恢复抽象 P1不引入,直接用官方客户端的连接/channel生命周期与业务恢复;未来替换须证明manual ACK、confirm/return/世代/窗口语义
PostgreSQL(历史调研) jackc/pgx 原调研为MIT 用户已确定不接PG,本项目不引入;保留此行仅作选型历史
Dispatcher SQLite modernc.org/sqlite BSD-3-Clause、无CGO,主源GitLab P1驱动方向确定,锁匹配libc并测WAL/Sync/锁/checkpoint/恢复;未通过不入镜像,Agent不建SQLite
数据库迁移 golang-migrate/migrate API NOASSERTION,但LICENSE全文MIT 只验证本项目SQLite后端兼容,使用现成迁移工具;不借迁移功能引入PG或Agent DB,可逆性须实测
WebSocket SDK 自带传输;必要时 gorilla/websocketcoder/websocket Gorilla 为 BSD-2-ClauseCoder 为 ISC,未归档 优先沿用被选 SDK 的传输,避免两套并存;不手写帧/握手。原 ASR 服务直接依赖 Gorilla,不能把其 Go 1.26.2 模块一并改版
JSON Schema santhosh-tekuri/jsonschema/v6 Apache-2.0;本轮 proxy 返回 v6.0.3;仓库默认分支是 boon 候选用于 2020-12 校验;锁 Go module/release,不克隆默认分支就假设是 Go 包;远端引用访问默认关闭/受控
OpenAPI 生成/解析 oapi-codegen、必要时 libopenapi Apache-2.0 / MIT,未归档 当前本地契约是 3.1;用真实发行版跑完整生成/校验 PoC;不把原契约改成3.0,不另手写Schema;不是默认同时引入两个运行库
OSS 签名 PUT 用标准库 net/http;需要 OSS API 时 阿里云 OSS Go SDK v2 Apache-2.0,官方、未归档 Agent 消费 SaaS 授权,不另持长期AK/接管签名服务;SDK/HTTP保留 headers、会话、对象和不可覆盖约束
指标 prometheus/client_golang Apache-2.0,未归档 需要 Prometheus 时直接复用;不得自写 exposition 格式或无限维度指标
日志/HTTP/TLS/并发 log/slognet/httpcrypto/tlscontext 等 Go 标准库 随固定工具链交付 不新增同功能框架;认证、权限和资源上限仍须落实

2.1 本轮新增组件证据范围

Cobra、grpc-go、protobuf-go、gopsutil的GitHub API查询被rate limit限制,未获得可用于判断当前归档/更新时间的API元数据。随后通过公开源码README/LICENSE核对用途与许可证,不把这一步说成已完成维护/漏洞/版本可用性审查。正式选版仍须L01。

gRPC采用Unary,不传整通话音频;官方health服务只能证明RPC可响应,业务ready另由AgentStatus/配置/许可判断。共享Agent证书+受限节点会话属于业务授权策略,复用TLS/凭据/拦截器能力,不自创加密协议。Agent文件用标准库与现成录音能力,不以“无SQLite”为名重写通用数据库。

3. ARI 是首个兼容 PoC 门禁

本轮发现的真实风险,不应靠 README 安装命令跳过:

  • 仓库 main 的 go.mod 声明 github.com/CyCoreSystems/ari/v6、Go 1.24README 同时保留“5.x current”描述,声明 v6 需要 Asterisk 14+。这是文档/版本线不一致信号,不是本项目镜像已经兼容的证明。
  • GitHub tags 列出 v5.4.0,但本轮读取 v5.4.0 URL 下的 go.mod 也声明 /v6。在 go get/构建验证前,不能把该 tag 写成已锁定的 /v5 依赖。
  • issue #190 指出 ExternalMedia 创建响应中的变量信息难以取得;而本项目必须拿到媒体本地地址/端口并验证就绪。
  • SDK 已有 Channel.GetVariable,先验证它能否满足 UNICASTRTP_LOCAL_ADDRESS/PORT 读取与时序。失败则修上游/选择替代库,不借机手写一套 HTTP/WS ARI 客户端。
  • SDK 的 Stage/Subscribe/Exec 模式可帮助先订阅后创建,必须测试事件快于响应、断连和重复事件;它不能自动解决执行账本、最后授权和不确定 originate。

P0 的最小证明:锁定可用模块/commit → 本地固定 Asterisk + Mock SIP → 经 SDK 创建与订阅 → ExternalMedia 端口/桥成员就绪 → 双向标识音/封口录音 → 断连/响应丢失不二次拨号。真实公网线路不是该 PoC 前置。

4. AI 接入:供应商范围已定,协议与参数须PoC

用户确认百炼/火山ASR、OpenAI兼容LLM、火山TTS。模型ID、voice/resource、API版本与参数不是源码常量,由SaaS不可变任务配置经D下发;端点/凭据仅来自可信引用。ASR两个适配首发均需验证,但单执行只选其中一个,不因超时自动切换。完整参数链路和上游缺口以 交互§6.1–§6.3 为唯一设计说明,本表不复制Schema。

4.1 已有 ASR 行为基线

现有 Go ASR 的代码检查表明:百炼走 WebSocket run-taskPCM 16kHz;火山已有新 API-key 与旧鉴权兼容逻辑、序列/压缩等帧语义。迁移先复用测试与经过核验的行为,不以现有实现是手写为理由在新项目继续手写。

服务 现成候选与证据 判定
DashScope 实时 Paraformer devinyf/dashscopegocasibase/dashscopego 社区 MIT、未归档;devinyf README 明确勾选实时 Paraformer,TTS 尚未完成;两个仓库本轮最近 push 仍在2025年,不能标成已验证活跃生产维护
DashScope 另一候选 ceoifung/go-dashscope MIT、未归档;README 声明 WebSocket Paraformer/上下文支持。候选而非官方背书,Linux/依赖/取消/包边界须实测
阿里 NLS aliyun/alibabacloud-nls-go-sdk 官方 Apache-2.0,但 NLS 与 DashScope/FunASR 并非相同服务。不能因“都是阿里ASR”就直接替换端点/凭据/模型
火山 SAUC GizClaw/doubao-speech-go 社区 MIT、未归档;README 声明 ASR V2 SAUC、鉴权与流式接口;不等于经典火山接口也覆盖,成熟度与兼容性仍待PoC
火山 LLM/其它云 API volcengine/volcengine-go-sdk 的 arkruntime 等 官方 Apache-2.0;已确认目录存在,但不能以 Ark LLM SDK 冒充 WebSocket ASR SDK
OpenAI 协议 LLM openai/openai-go 官方 Apache-2.0,支持流式/取消与可配置重试;只有批准供应商的接口确实匹配才使用,不默认接入收费 OpenAI
火山TTS 优先核验GizClaw/doubao-speech-go的流式TTS能力 模型/音色/协议和可调字段仍须匹配;当前真实TTS未启用且属P1门禁,不能用可导入或只返回音频替代参数验收

FunASR、Paraformer、Qwen实时等名称不代表相同事件/结束语义;P0针对实际选中模型核验帧/最终结果/取消/超时/背压及错误映射。双模式使用同一套已批准能力的必要子集,ASR-only不初始化LLM/TTS;不为每种模式另造框架。缺适配先修上游或换库,不能复制旧LLM/TTS或手写替代协议。

4.2 SDK 默认重试必须审查

OpenAI Go README 明确默认对部分连接/408/409/429/5xx 错误重试2次,可用 WithMaxRetries(0) 关闭。对已消费流、已产生音频、取消和不确定外部副作用不能默认重发。ARI 的 originate、SaaS 控制、OSS PUT/complete 同样逐操作定策略;“用了 SDK”不构成幂等证明。

MQ publisher confirm 重试与业务重拨不是一件事,SaaS 授权/CPS/控制屏障仍是最终裁决;依赖的自动恢复不得另放一份额度或漏掉 ACK/return。

4.3 参数可达性是选库门禁,不是后期优化

  • 先制作“源字段/默认/单位 → D有效快照 → SDK请求字段或本地控制器 → 协议Mock观测/真实行为”的映射样本。已有temperature/max_tokens/voice/speed/language/interim/timeout/音频格式和对话控制必须逐项覆盖,扩展按GAP-09批准后同样覆盖;不能用SDK默认值或固定构造器参数盖掉SaaS值。
  • DashScope Paraformer示例包含格式、采样率、语言提示及识别控制;示例16kHz、模型名或词表不是生产配置。须逐项核验所选百炼模型的热词/VAD/标点等支持及取消语义;不支持FunASR不能冒充百炼全部模型已支持。
  • 本轮检索到的火山SDK TTSV2WSConfig/AudioParams 文档对语速/音量/音调等控制的暴露尚不足以证明所需覆盖。必须在锁定源码/协议请求上确认;缺失字段优先替代或提交有类型上游补丁并复测。不能忽略已有tts.speed、写死speaker/resource_id,或退回自写WS/二进制客户端。 必要能力未补齐则TTS SDK锁定/P1保持blocked。
  • OpenAI兼容不保证每种model支持相同temperature/top_p/stop/Token语义;由SaaS的受控供应商/API版本和能力矩阵选择SDK请求。LLM BaseURL/模型/Token上限从有效快照解析;SDK默认的环境变量、模型和2次重试不能成为隐藏行为。
  • 共享HTTP/WS连接设施不等于共享可变业务请求;用两个Agent并发运行不同参数的合成任务,确认没有串model/voice/凭据。温度0、false、空列表和未提供必须保真;实际SDK字段或本地控制器收不到参数即验收失败。
  • 新配置以新版本用于新任务,无需重启;单通话固定快照和SDK版本,脱敏诊断可追溯。库不具备必需可调能力就不要过早锁库;换库/补上游仍须许可证和供应链检查,不扩成通用插件框架。

5. 版本/许可/能力核验记录

下表是此前调研观察,不是最终go.mod;P0对实际采用项重新核验/锁定,未采用候选无需为首发补齐PoC。

对象 本轮可核验信息 仍未证明
ARI main / v5.4.0 路径的 module 均观察到 /v6;有 GetVariable、ExternalMedia、Stage API 正确可解析的 tag/major、当前 Asterisk 镜像语义、重连/录音可用性
modernc SQLite Go proxy 返回 v1.59.0go.mod 为 Go1.25.0、libc v1.75.7,源码来自GitLab 本项目Go1.27.1所有目标平台/锁争用/恢复/内存性能
jsonschema/v6 proxy 返回 v6.0.3go.mod 为 Go1.21 本地所有2020-12约束/引用、JSON v2绑定及拒绝边界
libopenapi proxy 返回 v0.38.7go.mod 为 Go1.25.7MIT 是否有必要引入、与生成器及本地契约完全兼容
oapi-codegen 当前 main README 声明3.0/3.1,同时明确说明可能含未发行功能 被选发行版对本项目3.1的生成/运行校验是否完整
amqp091-go / migrate GitHub license字段为NOASSERTION,但 LICENSE 全文分别为BSD风格二条款/MIT 所选tag全部源码、传递依赖、修改/发行NOTICE与漏洞处置
go-audio/wav API archived=true,最后push观察为2024-10-28 不作为新生产默认;任何替代仍须录音等价证明
JSON/UUID 标准库升级 本机已核验Go1.27.1具备相关API 不代表现有ID、哈希、空值/重复键与事件语义可直接替换

go 最低版本满足不等于编译/兼容测试通过;上游代码的 LICENSE、SBOM、transitive notices 和漏洞可达性必须留档。MPL 等许可证不是看到名称就直接批准或拒绝,按实际链接/修改/分发方式核验;不得去掉原作者声明。

6. 可执行的选库交付要求

P0/P1为每个实际采用组件留一条记录:使用阶段/能力、不自写范围、源URL、module、tag/commit、hash、许可证/NOTICE、维护/安全风险、Go/Asterisk/供应商协议版本、重试/取消策略、PoC结果、替代/上游问题与责任人。后续阶段按实际需要扩展,不建立所有候选的重复验收项目。

  • 对不适用候选记录为什么淘汰,例如“不同供应商API”“归档”“必要字段无法取得”“方言不匹配”,而不是只写“不好用”。
  • PoC未通过、无许可证依据或安全缺口不可接受时阻塞相应组件,不生成假接口或fallback到手写协议。
  • 不在本轮运行 go get、创建假运行入口或宣称库已适配;后续实施走验收 L01–L08、S/E 故障矩阵。
  • 研究资料不授予供应商消费、云创建或真实拨号权限;SDK可以先连接独立协议Mock验证,真实供应商单独签收。

7. 一手核验入口

以下链接用于复核本轮观察;动态 main/@latest 不能用作发行锁文件: