syntax = "proto3"; option go_package = ".;pb"; import "user/user_msg_v2.proto"; import "db.proto"; // v3 客户端配置下发:一次拿全「环境变量 + agent + 产品 + 第三方服务 + 会议记录能力」。 // 与 v2 的差别(v1/v2 保持原样不动,老客户端不受影响): // - 不再单独下发 mcps:MCP 已并入第三方服务配置(svc_config 的 MCP 类别),在 thirdsvcs 里, // 按 categories 含 "10" 识别;url/type/tools 在 fields 里。 // - 新增 meet:会议记录支持的语言与可选总结大模型,来自后台「会议记录服务」编排。 // - agents 换成 AgentItemV3(与 user_getagents_v3 同一结构):带 type(chat|sts-chat) 与服务编排 // (stt/llm/tts/sts_svc_id)、MCP 绑定、变量、已补全的音色表。v2 下发的旧 DBAgent 结构没有这些, // 客户端拿到 agent 却不知道该走哪条链路、调哪个服务。 // - 新增 call_translate:通话翻译的选路规则 + 规则用到的翻译 agent。后台把「什么语言走哪套 // 服务编排」配成规则,这里按用户所在区域筛好一并下发,客户端据此在通话里选路。 // 整体响应经网关 AES-CBC 加密(响应头 X-Encrypted:1),故 fields 里的凭据不再单独加密。 message UserGetAppConfigV3Req{ } //可选总结大模型项(与 echomeet_getsummaryservices 的同名字段口径一致) message MeetSummaryServiceItem{ string svc_id = 1; //@go_tags(`json:"svc_id"`) 服务id(starttask/summary 的 summary_svc_id 传它) string name = 2; //@go_tags(`json:"name"`) 服务显示名 bool is_default = 3; //@go_tags(`json:"is_default"`) 是否后台默认模型 } //会议记录能力:支持的语言 + 可选总结大模型 message MeetCapabilitiesItem{ repeated string transcribe_languages = 1; //@go_tags(`json:"transcribe_languages"`) 录音识别支持的语言(BCP-47) bool transcribe_any_language = 2; //@go_tags(`json:"transcribe_any_language"`) true=存在未限定语言的识别服务,不受上面列表约束 repeated string translate_languages = 3; //@go_tags(`json:"translate_languages"`) 翻译支持的目标语言(BCP-47) bool translate_any_language = 4; //@go_tags(`json:"translate_any_language"`) true=存在未限定语言的翻译服务 bool summary_client_choice = 5; //@go_tags(`json:"summary_client_choice"`) 后台是否允许客户端指定总结模型;false 时 summary_services 仅含默认项 repeated MeetSummaryServiceItem summary_services = 6; //@go_tags(`json:"summary_services"`) 可选总结大模型列表 } message UserGetAppConfigV3Resp{ map env = 1; //@go_tags(`json:"env"`) 应用环境变量(app_config + 本区域 global_config) repeated AgentItemV3 agents = 2; //@go_tags(`json:"agents"`) 智能体列表(结构同 user_getagents_v3,含 type 与服务编排) repeated DBProduct products = 3; //@go_tags(`json:"products"`) 产品列表 repeated ThirdSvcItem thirdsvcs = 4; //@go_tags(`json:"thirdsvcs"`) 第三方服务(含 MCP 类,按用户区域合并、凭据已解密为明文) MeetCapabilitiesItem meet = 5; //@go_tags(`json:"meet"`) 会议记录能力(语言 + 总结大模型) CallTranslateItem call_translate = 6; //@go_tags(`json:"call_translate"`) 通话翻译配置(本区域生效的选路规则 + 规则引用的翻译 agent) } // ===================== 通话翻译(call_translate) ===================== // // 后台「通话翻译配置」把「什么语言走哪套服务编排」拆成两层:规则负责按语言选路, // 选中的翻译 agent 负责给出具体服务(三段式 translate = stt+mt+tts;端到端 ast-translate = ast)。 // 这里下发的是**已按用户所在区域筛过**的那一份:不限区域(region=0)的兜底规则与本区域的规则, // 已停用的规则、以及引用不到可用翻译 agent 的规则都不会出现。 //通话翻译选路规则:一条规则覆盖「多源语言 × 多目标语言」,命中后走 agent_id 指定的翻译 agent。 message CallTranslateRuleItem{ uint64 id = 1; //@go_tags(`json:"id"`) 规则 id(仅用于日志/排障) string name = 2; //@go_tags(`json:"name"`) 规则名(仅便于识别) string src_langs = 3; //@go_tags(`json:"src_langs"`) 源语言集合,逗号分隔 BCP-47;单个 "*" = 任意语言 string dst_langs = 4; //@go_tags(`json:"dst_langs"`) 目标语言集合,同上 bool bidir = 5; //@go_tags(`json:"bidir"`) true=反向(dst→src)也命中这条规则 string agent_id = 6; //@go_tags(`json:"agent_id"`) 命中后使用的翻译 agent(在同响应的 call_translate.agents 里) int32 priority = 7; //@go_tags(`json:"priority"`) 优先级,越大越先匹配 } //通话翻译配置:规则集 + 规则引用到的翻译 agent。 // //匹配口径(与服务端 comm.MatchCallTranslateRule 完全一致,客户端照此实现即可): // 1. 两侧都命中才算候选。单侧命中分三档:全等=2、主语言子标签相同(zh-CN 规则接住 zh/zh-TW)=1、被 "*" 接住=0; // 规则的语言集合里取最好的一档。bidir 规则同时试反向,取更好的一次。 // 2. 候选间取最优:优先级大 > 两侧得分之和高 > 精确度高(src/dst 每一侧非 "*" 各记 1 分) > id 小。 // 3. rules 已按「优先级降序 → id 升序」排好,但**不能只取第一条命中的**——得分与精确度会改变名次。 // 4. 一条都不命中 = 该方向没配通话翻译。 message CallTranslateItem{ repeated CallTranslateRuleItem rules = 1; //@go_tags(`json:"rules"`) 本区域生效的规则(已按优先级降序 → id 升序排好) repeated AgentItemV3 agents = 2; //@go_tags(`json:"agents"`) 上面规则引用到的翻译 agent(type=translate|ast-translate),结构同 agents } // v3 agent 列表:相比 v2 多了「绑定的 MCP 服务 + 变量」,并且 voice_map 是**已补全**的—— // 服务端按内置音色表(comm/ttsvoice.go)把 agent 支持的每种语言都解析出最终音色, // 客户端不必自带音色表,切语言时按 language 直接取即可。 // 顶层 agents 只下发对话类(chat / sts-chat);翻译类 agent(translate / ast-translate) 复用同一结构, // 但走另一条链路——它是通话翻译规则的服务编排载体,在 call_translate.agents 里下发。 // 故四类的服务槽位都在这个结构里,按 type 取用其中若干,用不到的为空串。 message UserGetAgentsV3Req{ } //agent 变量项:提示词/开场白里的占位符,客户端替换后再用 message AgentVariableItem{ string key = 1; //@go_tags(`json:"key"`) 变量名;在提示词/开场白里用双大括号包住它作占位符 string label = 2; //@go_tags(`json:"label"`) 展示名 string def_value = 3; //@go_tags(`json:"def_value"`) 默认值(客户端没有对应上下文时用它) string description = 4; //@go_tags(`json:"description"`) 备注 } //agent 的 MCP 绑定项:绑了哪个 MCP 服务 + 这个 agent 允许它调用的工具。 //同一个 agent 挂多个 MCP 时工具会互相干扰(同名工具、用不上的工具挤占模型注意力), //故除服务自身的 tools 白名单外,再按 agent 收一次口。 message AgentMcpBindingItem{ string svc_id = 1; //@go_tags(`json:"svc_id"`) MCP 服务 id(详情在 getappconfig_v3 的 thirdsvcs 里) repeated string tools = 2; //@go_tags(`json:"tools"`) 允许调用的工具名;空=该服务的工具全放开(仍受服务自身 tools 白名单约束) } message AgentItemV3{ string id = 1; //@go_tags(`json:"id"`) agent id string name = 2; //@go_tags(`json:"name"`) 名称 string type = 3; //@go_tags(`json:"type"`) chat|sts-chat(call_translate.agents 里则为 translate|ast-translate) string description = 4; //@go_tags(`json:"description"`) 描述 string avatar_url = 5; //@go_tags(`json:"avatar_url"`) 头像 string stt_svc_id = 6; //@go_tags(`json:"stt_svc_id"`) 识别服务(chat) string llm_svc_id = 7; //@go_tags(`json:"llm_svc_id"`) 大模型服务(chat) string tts_svc_id = 8; //@go_tags(`json:"tts_svc_id"`) 合成服务(chat) string sts_svc_id = 9; //@go_tags(`json:"sts_svc_id"`) 端到端对话服务(sts-chat) string system_prompt = 10; //@go_tags(`json:"system_prompt"`) 系统提示词 int32 gender = 11; //@go_tags(`json:"gender"`) 0未定 1男 2女 bool greeting_enabled = 12; //@go_tags(`json:"greeting_enabled"`) 开场白开关 string greeting_text = 13; //@go_tags(`json:"greeting_text"`) 开场白 string support_langs = 14; //@go_tags(`json:"support_langs"`) 支持语言(逗号分隔 BCP-47) string default_lang = 15; //@go_tags(`json:"default_lang"`) 默认语言 repeated AgentVoiceItem voice_map = 16; //@go_tags(`json:"voice_map"`) 各语言最终音色(已按音色表补全) repeated string mcp_svc_ids = 17; //@go_tags(`json:"mcp_svc_ids"`) 绑定的 MCP 服务 id(详情在 getappconfig_v3 的 thirdsvcs 里) repeated AgentVariableItem variables = 18; //@go_tags(`json:"variables"`) 变量定义 int32 sort = 19; //@go_tags(`json:"sort"`) 排序 repeated AgentMcpBindingItem mcps = 20; //@go_tags(`json:"mcps"`) MCP 绑定(含每个服务允许的工具);mcp_svc_ids 是它的 id 平铺,保留给老客户端 string mt_svc_id = 21; //@go_tags(`json:"mt_svc_id"`) 机器翻译服务(translate 三段式翻译;对话类为空) string ast_svc_id = 22; //@go_tags(`json:"ast_svc_id"`) 端到端语音翻译服务(ast-translate;对话类为空) } message UserGetAgentsV3Resp{ repeated AgentItemV3 agents = 1; //@go_tags(`json:"agents"`) agent 列表 }