@roll-agent/smart-reply-agent 1.3.1 → 1.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/SKILL.md +7 -6
- package/dist/index.js +1 -1
- package/dist/tools/generate-reply.d.ts +17 -0
- package/dist/types/reply-authority.d.ts +2 -2
- package/package.json +3 -3
package/SKILL.md
CHANGED
|
@@ -32,7 +32,7 @@ npm 包名:`@roll-agent/smart-reply-agent`
|
|
|
32
32
|
|
|
33
33
|
完整 inputSchema 可通过 `roll agent tools smart-reply-agent`(或 `--json`)查询。
|
|
34
34
|
|
|
35
|
-
- `generate_reply(candidateMessage, conversationHistory?, candidateInfo?, preferredBrand?, channelType?, defaultWechatId?, industryVoiceId?, turnIndex?, modelConfig?, target)`
|
|
35
|
+
- `generate_reply(candidateMessage, conversationHistory?, candidateInfo?, preferredBrand?, preferredBrandId?, channelType?, defaultWechatId?, industryVoiceId?, turnIndex?, modelConfig?, target)`
|
|
36
36
|
调用 Reply Authority Service 的 `POST /generate-signed-reply`,返回 `suggestedReply`、`signedEnvelope`、`envelopeExp`、`confidence`、`stage` 和可选 `diagnostics`。`target` 为必填,至少包含 `platform=zhipin`、`conversationId`、`candidateId`,以及以下两种 recruiter 绑定方式之一:
|
|
37
37
|
1. 直接传完整绑定:`tenantId + recruiterBinding`
|
|
38
38
|
2. 便利代理模式:`recruiterUsername`(smart-reply 会先调用 `POST /resolve-recruiter-binding` 解析出 `tenantId + recruiterBinding`)
|
|
@@ -54,8 +54,8 @@ npm 包名:`@roll-agent/smart-reply-agent`
|
|
|
54
54
|
|
|
55
55
|
- 调用前应先尝试从页面读取 `candidateInfo.communicationPosition`、`candidateInfo.expectedLocation`、`candidateInfo.expectedPosition`
|
|
56
56
|
- 能读到就如实透传;读不到就省略该字段
|
|
57
|
-
- `preferredBrand`
|
|
58
|
-
-
|
|
57
|
+
- `preferredBrand` / `preferredBrandId` 为可选页面信号,只能原样透传 `browser-use-agent` `zhipin_get_candidate_info` 的输出字段:沟通职位带 `[品牌ID]` 尾缀(如 `咖啡早班店员-接受小白-免费咖啡[10027]`)时工具会输出 `preferredBrandId`,只透传它;老格式 `品牌名-职位` 时工具输出 `preferredBrand`,只透传它;都读不到就都省略
|
|
58
|
+
- 不要自行从 `communicationPosition` 解析品牌(服务端会以 `candidateInfo.communicationPosition` 为权威自行提取品牌 ID 并对账);严禁把通用岗位名(如“餐饮兼职服务员”“门店服务员”)、候选人现/前雇主公司名或新格式的第一段塞进 `preferredBrand`
|
|
59
59
|
|
|
60
60
|
Minimal valid input 示例(代理模式):
|
|
61
61
|
|
|
@@ -116,6 +116,7 @@ npm 包名:`@roll-agent/smart-reply-agent`
|
|
|
116
116
|
- 实际回复生成、reply-policy、FactGate、ReplyGate、年龄校验都在云端执行
|
|
117
117
|
- `modelConfig.reasoning` 会透传给 Reply Authority Service;raw reasoning/thinking 文本不会作为业务输出返回
|
|
118
118
|
- 返回的 `signedEnvelope` 为 v2 信封,已绑定 `tenantId + recruiterBinding + conversationId + candidateId`;浏览器发送主链路应优先使用 `browser-use-agent.zhipin_generate_reply_preview(...) -> zhipin_send_prepared_reply(preparedReplyId)`
|
|
119
|
+
- 若服务端返回 `replyVariants`,`generate_reply` 只做协议透传;它不会隐藏 `signedEnvelope`,也不会执行 judge / `/reply-feedback`。需要双稿闭环时,主链路必须改用 `browser-use-agent.zhipin_generate_reply_preview(...) -> zhipin_judge_prepared_reply(...) -> zhipin_send_prepared_reply(...)`
|
|
119
120
|
- 调用失败时抛 `ReplyAuthorityRequestError`,携带 `meta: {url, timeoutMs, requestId}` 与 `Error.cause` 链。通过 `roll run` 运行时 stderr 会展开 `cause: ...` 行用于定位;透传的 `x-request-id` 可跨服务端追踪
|
|
120
121
|
- `diagnostics.brandResolutionSource="none"`、`diagnostics.resolvedBrand=""`、`diagnostics.ageGate.status="unknown"` 都是合法服务端结果,不代表 tool 调用失败。是否补问用户或转人工,是 orch 层策略,不是本 Agent 的重试条件
|
|
121
122
|
|
|
@@ -136,13 +137,13 @@ npm 包名:`@roll-agent/smart-reply-agent`
|
|
|
136
137
|
- `candidateInfo.communicationPosition`
|
|
137
138
|
- `candidateInfo.expectedLocation`
|
|
138
139
|
- `candidateInfo.expectedPosition`
|
|
139
|
-
- `preferredBrand
|
|
140
|
+
- `preferredBrand` / `preferredBrandId`:原样透传 `zhipin_get_candidate_info` 的输出字段(新命名 `…[品牌ID]` 给 `preferredBrandId`,老命名“品牌-职位”给 `preferredBrand`,互斥);否则保持缺省
|
|
140
141
|
- 如果读不到,保持缺省;不要用通用岗位名或候选人公司名冒充品牌
|
|
141
142
|
4. 调用 `smart-reply-agent.generate_reply(..., target)`:
|
|
142
143
|
- 直接模式:传 `target.tenantId + target.recruiterBinding`
|
|
143
144
|
- 代理模式:只传 `target.recruiterUsername=username`,由 smart-reply 代调用 `POST /resolve-recruiter-binding`
|
|
144
|
-
5. `smart-reply-agent.generate_reply(..., target)` 获取 `suggestedReply + signedEnvelope`
|
|
145
|
-
6. 若需要在 BOSS
|
|
145
|
+
5. `smart-reply-agent.generate_reply(..., target)` 获取 `suggestedReply + signedEnvelope`,并在服务端开启双稿时透传 `replyVariants`
|
|
146
|
+
6. 若需要在 BOSS 浏览器中展示生成过程、隐藏 `signedEnvelope`、执行默认 judge 或回传 `/reply-feedback`,优先改用 `browser-use-agent.zhipin_generate_reply_preview(...) -> zhipin_judge_prepared_reply(...) -> zhipin_send_prepared_reply(preparedReplyId, variantDecision?)`,不要把 `signedEnvelope` 作为跨 Agent 编排参数传递
|
|
146
147
|
|
|
147
148
|
## Recommended roll.config.yaml
|
|
148
149
|
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{defineAgent as e}from"@roll-agent/sdk";import{defineTool as r}from"@roll-agent/sdk";import{z as t}from"zod";import{createHash as o}from"node:crypto";import{z as n}from"zod";var i=["REPLY_AUTHORITY_URL","REPLY_AUTHORITY_BEARER_TOKEN","REPLY_AUTHORITY_TIMEOUT_MS"],a=/^[0-9a-f]{8}$/,s=n.object({present:n.boolean(),fingerprint:n.string().regex(a).optional()}),c=n.record(s);function p(e,r=process.env){return Object.fromEntries(e.map(e=>{const t=r[e];return"string"==typeof t&&t.length>0?[e,{present:!0,fingerprint:l(t)}]:[e,{present:!1}]}))}function l(e){return o("sha256").update(e).digest("hex").slice(0,8)}var g=t.object({effectiveEnvSources:c}),m=r({name:"diagnostic_status",description:"返回 smart-reply 运行态进程中已声明环境变量的存在状态与短指纹",input:t.object({}),output:g,execute:async(e,r)=>(r.logger.info("Querying smart-reply diagnostic status"),{effectiveEnvSources:p(i)})});import{defineTool as f}from"@roll-agent/sdk";import{generateSignedReply as u,ReplyAuthorityRequestError as d}from"@roll-agent/reply-authority-client";import{CandidateInfoSchema as y,CandidateLocationSignalIntentValues as E,CandidateLocationSignalSchema as R,CandidateLocationSignalSourceValues as T,FunnelStageSchema as _,FunnelStageValues as v,GenerateReplyToolInputSchema as h,GenerateSignedReplyRequestSchema as O,GenerateSignedReplyResponseSchema as S,ModelConfigSchema as U,ProviderConfigSchema as Y,ProviderConfigsSchema as b,ReasoningConfigSchema as x,RecruiterBindingSchema as A,ReplyAuthorityErrorResponseSchema as I,
|
|
1
|
+
import{defineAgent as e}from"@roll-agent/sdk";import{defineTool as r}from"@roll-agent/sdk";import{z as t}from"zod";import{createHash as o}from"node:crypto";import{z as n}from"zod";var i=["REPLY_AUTHORITY_URL","REPLY_AUTHORITY_BEARER_TOKEN","REPLY_AUTHORITY_TIMEOUT_MS"],a=/^[0-9a-f]{8}$/,s=n.object({present:n.boolean(),fingerprint:n.string().regex(a).optional()}),c=n.record(s);function p(e,r=process.env){return Object.fromEntries(e.map(e=>{const t=r[e];return"string"==typeof t&&t.length>0?[e,{present:!0,fingerprint:l(t)}]:[e,{present:!1}]}))}function l(e){return o("sha256").update(e).digest("hex").slice(0,8)}var g=t.object({effectiveEnvSources:c}),m=r({name:"diagnostic_status",description:"返回 smart-reply 运行态进程中已声明环境变量的存在状态与短指纹",input:t.object({}),output:g,execute:async(e,r)=>(r.logger.info("Querying smart-reply diagnostic status"),{effectiveEnvSources:p(i)})});import{defineTool as f}from"@roll-agent/sdk";import{generateSignedReply as u,ReplyAuthorityRequestError as d}from"@roll-agent/reply-authority-client";import{CandidateInfoSchema as y,CandidateLocationSignalIntentValues as E,CandidateLocationSignalSchema as R,CandidateLocationSignalSourceValues as T,FunnelStageSchema as _,FunnelStageValues as v,GenerateReplyToolInputSchema as h,GenerateSignedReplyRequestSchema as O,GenerateSignedReplyResponseSchema as S,ModelConfigSchema as U,ProviderConfigSchema as Y,ProviderConfigsSchema as b,ReasoningConfigSchema as x,RecruiterBindingSchema as A,ReplyAuthorityErrorResponseSchema as I,ReplyFeedbackBodySchema as j,ReplyFeedbackResponseSchema as L,ReplyFeedbackRubricResponseSchema as P,ReplyGateAdvisoryCodeSchema as $,ReplyAuthorityTargetSchema as k,ReplyVariantFindingSchema as z,ReplyVariantItemSchema as H,ReplyVariantKindSchema as M,ReplyVariantsSchema as B,ResolvedReplyAuthorityTargetSchema as w,ResolveRecruiterBindingRequestSchema as C,ResolveRecruiterBindingResponseSchema as F}from"@roll-agent/reply-authority-client";var K=f({name:"generate_reply",description:"根据候选人消息生成智能招聘回复,并向 Reply Authority Service 请求签名信封;调用方必须提供 target 以绑定会话和招聘者身份,可直接传 tenantId+recruiterBinding,或只传 recruiterUsername 交给 smart-reply 代理解析。",input:h,output:S,execute:async(e,r)=>{r.logger.info(`Processing message: ${e.candidateMessage.slice(0,50)}...`);const t=await u(e);return r.logger.info(`Signed reply generated. Stage: ${t.stage}, Confidence: ${t.confidence}`),t}}),N=e({name:"smart-reply-agent",tools:[K,m]});N.listen().catch(e=>{console.error("Fatal error:",e),process.exit(1)});
|
|
@@ -40,6 +40,7 @@ export declare const generateReply: import("@roll-agent/sdk").ToolDefinition<{
|
|
|
40
40
|
intent?: "nearby_store" | "store_address" | "expected_area" | undefined;
|
|
41
41
|
}[] | undefined;
|
|
42
42
|
preferredBrand?: string | undefined;
|
|
43
|
+
preferredBrandId?: number | undefined;
|
|
43
44
|
channelType?: "public" | "private" | undefined;
|
|
44
45
|
defaultWechatId?: string | undefined;
|
|
45
46
|
industryVoiceId?: string | undefined;
|
|
@@ -70,4 +71,20 @@ export declare const generateReply: import("@roll-agent/sdk").ToolDefinition<{
|
|
|
70
71
|
latencyMs?: number | undefined;
|
|
71
72
|
shouldExchangeWechat?: boolean | undefined;
|
|
72
73
|
diagnostics?: Record<string, unknown> | undefined;
|
|
74
|
+
replyVariants?: {
|
|
75
|
+
groupId: string;
|
|
76
|
+
recommended: "draft";
|
|
77
|
+
items: {
|
|
78
|
+
variant: "draft" | "revised";
|
|
79
|
+
suggestedReply: string;
|
|
80
|
+
signedEnvelope: string;
|
|
81
|
+
envelopeExp: number;
|
|
82
|
+
}[];
|
|
83
|
+
findings: {
|
|
84
|
+
code: "too_many_questions" | "audit_tone" | "reply_overpacked" | "off_axis_fact_disclosure";
|
|
85
|
+
description: string;
|
|
86
|
+
}[];
|
|
87
|
+
rubricVersion: string;
|
|
88
|
+
rubricHash: string;
|
|
89
|
+
} | undefined;
|
|
73
90
|
}>;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { CandidateInfoSchema, CandidateLocationSignalIntentValues, CandidateLocationSignalSchema, CandidateLocationSignalSourceValues, FunnelStageSchema, FunnelStageValues, GenerateReplyToolInputSchema, GenerateSignedReplyRequestSchema, GenerateSignedReplyResponseSchema, ModelConfigSchema, ProviderConfigSchema, ProviderConfigsSchema, ReasoningConfigSchema, RecruiterBindingSchema, ReplyAuthorityErrorResponseSchema, ReplyAuthorityTargetSchema, ResolvedReplyAuthorityTargetSchema, ResolveRecruiterBindingRequestSchema, ResolveRecruiterBindingResponseSchema, } from "@roll-agent/reply-authority-client";
|
|
2
|
-
export type { CandidateInfo, CandidateLocationSignal, FunnelStage, GenerateReplyToolInput, GenerateSignedReplyRequest, GenerateSignedReplyResponse, ModelConfig, ProviderConfig, ProviderConfigs, ReasoningConfig, RecruiterBinding, ReplyAuthorityTarget, ResolvedReplyAuthorityTarget, ResolveRecruiterBindingRequest, ResolveRecruiterBindingResponse, } from "@roll-agent/reply-authority-client";
|
|
1
|
+
export { CandidateInfoSchema, CandidateLocationSignalIntentValues, CandidateLocationSignalSchema, CandidateLocationSignalSourceValues, FunnelStageSchema, FunnelStageValues, GenerateReplyToolInputSchema, GenerateSignedReplyRequestSchema, GenerateSignedReplyResponseSchema, ModelConfigSchema, ProviderConfigSchema, ProviderConfigsSchema, ReasoningConfigSchema, RecruiterBindingSchema, ReplyAuthorityErrorResponseSchema, ReplyFeedbackBodySchema, ReplyFeedbackResponseSchema, ReplyFeedbackRubricResponseSchema, ReplyGateAdvisoryCodeSchema, ReplyAuthorityTargetSchema, ReplyVariantFindingSchema, ReplyVariantItemSchema, ReplyVariantKindSchema, ReplyVariantsSchema, ResolvedReplyAuthorityTargetSchema, ResolveRecruiterBindingRequestSchema, ResolveRecruiterBindingResponseSchema, } from "@roll-agent/reply-authority-client";
|
|
2
|
+
export type { CandidateInfo, CandidateLocationSignal, FunnelStage, GenerateReplyToolInput, GenerateSignedReplyRequest, GenerateSignedReplyResponse, ModelConfig, ProviderConfig, ProviderConfigs, ReasoningConfig, RecruiterBinding, ReplyFeedbackBody, ReplyFeedbackResponse, ReplyFeedbackRubricResponse, ReplyGateAdvisoryCode, ReplyAuthorityTarget, ReplyVariantFinding, ReplyVariantItem, ReplyVariantKind, ReplyVariants, ResolvedReplyAuthorityTarget, ResolveRecruiterBindingRequest, ResolveRecruiterBindingResponse, } from "@roll-agent/reply-authority-client";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@roll-agent/smart-reply-agent",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.3",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -41,8 +41,8 @@
|
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
43
|
"zod": "^3.25.76",
|
|
44
|
-
"@roll-agent/
|
|
45
|
-
"@roll-agent/
|
|
44
|
+
"@roll-agent/reply-authority-client": "0.5.0",
|
|
45
|
+
"@roll-agent/sdk": "0.2.0"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
48
|
"@types/node": "^22.0.0"
|