@chatman-media/conversation-engine 1.10.0 → 1.12.0
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/dist/dal/conversations.integration.test.d.ts +2 -0
- package/dist/dal/conversations.integration.test.d.ts.map +1 -0
- package/dist/dal/kb-store.integration.test.d.ts +2 -0
- package/dist/dal/kb-store.integration.test.d.ts.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +119 -6
- package/dist/lead-advance.integration.test.d.ts +2 -0
- package/dist/lead-advance.integration.test.d.ts.map +1 -0
- package/dist/reply-strategy/exchange-reply-guard.d.ts +13 -0
- package/dist/reply-strategy/exchange-reply-guard.d.ts.map +1 -0
- package/dist/reply-strategy/exchange-reply-guard.test.d.ts +2 -0
- package/dist/reply-strategy/exchange-reply-guard.test.d.ts.map +1 -0
- package/dist/reply-strategy/index.d.ts +1 -0
- package/dist/reply-strategy/index.d.ts.map +1 -1
- package/dist/reply-strategy/llm-reply.d.ts +1 -0
- package/dist/reply-strategy/llm-reply.d.ts.map +1 -1
- package/dist/reply-strategy/rag-reply.d.ts +1 -0
- package/dist/reply-strategy/rag-reply.d.ts.map +1 -1
- package/dist/reply-strategy/rag-reply.test.d.ts +2 -0
- package/dist/reply-strategy/rag-reply.test.d.ts.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversations.integration.test.d.ts","sourceRoot":"","sources":["../../src/dal/conversations.integration.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kb-store.integration.test.d.ts","sourceRoot":"","sources":["../../src/dal/kb-store.integration.test.ts"],"names":[],"mappings":""}
|
package/dist/index.d.ts
CHANGED
|
@@ -16,7 +16,7 @@ export { generateReplyAndEnqueue, type GenerateReplyAndEnqueueDeps, type Generat
|
|
|
16
16
|
export { dispatchOutbound } from "./outbound-dispatch.ts";
|
|
17
17
|
export { processInbound, type ProcessInboundDeps, type ReplyStrategy, } from "./process-inbound.ts";
|
|
18
18
|
export type { ITranscriber } from "./transcriber.ts";
|
|
19
|
-
export { LlmReplyStrategy, type LlmReplyStrategyOpts, parseStyleConfig, RagReplyStrategy, type RagReplyStrategyOpts, } from "./reply-strategy/index.ts";
|
|
19
|
+
export { EXCHANGE_SAFE_FALLBACK, guardExchangeReply, type ExchangeReplyGuardInput, type ExchangeReplyGuardResult, LlmReplyStrategy, type LlmReplyStrategyOpts, parseStyleConfig, RagReplyStrategy, type RagReplyStrategyOpts, } from "./reply-strategy/index.ts";
|
|
20
20
|
export { type ChannelContext, type Clock, type PipelineEvent, type PipelineSink, type ProcessInboundResult, systemClock, type TenantContext, } from "./types.ts";
|
|
21
21
|
export { withTenant } from "./with-tenant.ts";
|
|
22
22
|
export { checkRlsEnforcement, type RlsRoleCheck } from "./rls-guard.ts";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1970,6 +1970,87 @@ ${transcript}` }
|
|
|
1970
1970
|
return raw.trim() || null;
|
|
1971
1971
|
}
|
|
1972
1972
|
|
|
1973
|
+
// src/reply-strategy/exchange-reply-guard.ts
|
|
1974
|
+
var EXCHANGE_SAFE_FALLBACK = "Сейчас уточню у оператора и вернусь с точной суммой/реквизитами.";
|
|
1975
|
+
var QUOTE_TOOLS = new Set(["compute_exchange_quote", "create_exchange_order"]);
|
|
1976
|
+
var REQUISITES_TOOLS = new Set(["fetch_exchange_requisites"]);
|
|
1977
|
+
var PAYOUT_TOOLS = new Set(["issue_exchange_payout"]);
|
|
1978
|
+
var NUMBER_RE = /(?<![A-Za-zА-Яа-я0-9])(?:\d{1,3}(?:[ .,]\d{3})+|\d+)(?:[.,]\d+)?(?![A-Za-zА-Яа-я0-9])/u;
|
|
1979
|
+
var QUOTE_RE = /(?:курс|rate|отда[её]те|получа(?:ете|ешь)|итог(?:овая)?\s+сумм|thb|бат|bhat|rub|руб|usdt|btc|eth|usd|eur)/iu;
|
|
1980
|
+
var REQUISITES_RE = /(?:реквизит|кошел[её]к|wallet|адрес\s+(?:кошелька|для\s+оплаты)|оплат\w*|перев(?:од|ести)|sbp|сбп|qr|карта|card|binance\s*id|trc20|erc20|bep20)/iu;
|
|
1981
|
+
var PAYOUT_RE = /(?:код\s+(?:выдачи|снятия|получения)|payout\s*code|cardless|без\s+карты|банкомат|atm)/iu;
|
|
1982
|
+
var RATE_NEGOTIATION_RE = /(?:договор(?:имся|иться)|скидк|лучше\s+курс|курс\s+лучше|сдела(?:ю|ем)\s+курс|подвин(?:у|ем)\s+курс)/iu;
|
|
1983
|
+
var CRYPTO_ADDRESS_RE = /\b(?:T[A-Za-z0-9]{25,}|0x[a-fA-F0-9]{32,}|bc1[a-z0-9]{20,})\b/u;
|
|
1984
|
+
var CARDISH_RE = /\b(?:\d[ -]?){12,19}\b/u;
|
|
1985
|
+
var URL_PAYMENT_RE = /\bhttps?:\/\/\S+/iu;
|
|
1986
|
+
var CODE_RE = /\b\d{4,8}\b/u;
|
|
1987
|
+
function successfulToolNames(telemetry) {
|
|
1988
|
+
const names = new Set;
|
|
1989
|
+
const calls = telemetry?.toolCalls ?? (telemetry?.toolCall ? [{ ...telemetry.toolCall }] : []);
|
|
1990
|
+
for (const call of calls) {
|
|
1991
|
+
if (!call || "error" in call && call.error)
|
|
1992
|
+
continue;
|
|
1993
|
+
const result = call.result;
|
|
1994
|
+
if (isBlockingToolResult(result))
|
|
1995
|
+
continue;
|
|
1996
|
+
names.add(call.name);
|
|
1997
|
+
}
|
|
1998
|
+
return names;
|
|
1999
|
+
}
|
|
2000
|
+
function isBlockingToolResult(result) {
|
|
2001
|
+
if (typeof result !== "object" || result === null)
|
|
2002
|
+
return false;
|
|
2003
|
+
const obj = result;
|
|
2004
|
+
if (typeof obj.error === "string" && obj.error.trim())
|
|
2005
|
+
return true;
|
|
2006
|
+
if (obj.needsOperator === true)
|
|
2007
|
+
return true;
|
|
2008
|
+
if (obj.needsVerification === true)
|
|
2009
|
+
return true;
|
|
2010
|
+
if (obj.ok === false)
|
|
2011
|
+
return true;
|
|
2012
|
+
return false;
|
|
2013
|
+
}
|
|
2014
|
+
function hasAny(names, allowed) {
|
|
2015
|
+
for (const name of allowed) {
|
|
2016
|
+
if (names.has(name))
|
|
2017
|
+
return true;
|
|
2018
|
+
}
|
|
2019
|
+
return false;
|
|
2020
|
+
}
|
|
2021
|
+
function hasConcreteQuoteClaim(text) {
|
|
2022
|
+
return NUMBER_RE.test(text) && QUOTE_RE.test(text);
|
|
2023
|
+
}
|
|
2024
|
+
function hasConcreteRequisitesClaim(text) {
|
|
2025
|
+
if (CRYPTO_ADDRESS_RE.test(text) || CARDISH_RE.test(text))
|
|
2026
|
+
return true;
|
|
2027
|
+
if (!REQUISITES_RE.test(text))
|
|
2028
|
+
return false;
|
|
2029
|
+
return URL_PAYMENT_RE.test(text) || NUMBER_RE.test(text) || /(?:перев(?:едите|ести)|оплат(?:ите|ить)|адрес|ссылка)/iu.test(text);
|
|
2030
|
+
}
|
|
2031
|
+
function hasConcretePayoutClaim(text) {
|
|
2032
|
+
return PAYOUT_RE.test(text) && CODE_RE.test(text);
|
|
2033
|
+
}
|
|
2034
|
+
function guardExchangeReply(input) {
|
|
2035
|
+
const text = input.text.trim();
|
|
2036
|
+
if (!text)
|
|
2037
|
+
return { ok: true, text };
|
|
2038
|
+
if (RATE_NEGOTIATION_RE.test(text)) {
|
|
2039
|
+
return { ok: false, text: EXCHANGE_SAFE_FALLBACK, reason: "rate_negotiation" };
|
|
2040
|
+
}
|
|
2041
|
+
const tools = successfulToolNames(input.telemetry);
|
|
2042
|
+
if (hasConcreteQuoteClaim(text) && !hasAny(tools, QUOTE_TOOLS)) {
|
|
2043
|
+
return { ok: false, text: EXCHANGE_SAFE_FALLBACK, reason: "unbacked_quote" };
|
|
2044
|
+
}
|
|
2045
|
+
if (hasConcreteRequisitesClaim(text) && !hasAny(tools, REQUISITES_TOOLS)) {
|
|
2046
|
+
return { ok: false, text: EXCHANGE_SAFE_FALLBACK, reason: "unbacked_requisites" };
|
|
2047
|
+
}
|
|
2048
|
+
if (hasConcretePayoutClaim(text) && !hasAny(tools, PAYOUT_TOOLS)) {
|
|
2049
|
+
return { ok: false, text: EXCHANGE_SAFE_FALLBACK, reason: "unbacked_payout_code" };
|
|
2050
|
+
}
|
|
2051
|
+
return { ok: true, text };
|
|
2052
|
+
}
|
|
2053
|
+
|
|
1973
2054
|
// src/reply-strategy/rag-reply.ts
|
|
1974
2055
|
function messagesToChatHistory(history) {
|
|
1975
2056
|
const out = [];
|
|
@@ -2049,12 +2130,17 @@ class RagReplyStrategy {
|
|
|
2049
2130
|
const [skills, directorHooks, tools, reranker, stageGuidance, requestContext, awaitingOperator] = await Promise.all([
|
|
2050
2131
|
this.opts.resolveSkills ? this.opts.resolveSkills({ tenantId }) : Promise.resolve([]),
|
|
2051
2132
|
this.opts.resolveDirectorHooks ? this.opts.resolveDirectorHooks({ tenantId }) : Promise.resolve([]),
|
|
2052
|
-
this.opts.resolveTools ? this.opts.resolveTools({
|
|
2133
|
+
this.opts.resolveTools ? this.opts.resolveTools({
|
|
2134
|
+
tenantId,
|
|
2135
|
+
conversationId: input.conversationId,
|
|
2136
|
+
contactId: input.contactId
|
|
2137
|
+
}) : Promise.resolve([]),
|
|
2053
2138
|
this.opts.resolveReranker ? this.opts.resolveReranker({ tenantId }) : Promise.resolve(null),
|
|
2054
2139
|
this.opts.resolveStageGuidance ? this.opts.resolveStageGuidance({ tenantId, contactId: input.contactId }) : Promise.resolve(null),
|
|
2055
2140
|
this.opts.resolveRequestContext ? this.opts.resolveRequestContext({ tenantId, contactId: input.contactId }) : Promise.resolve(null),
|
|
2056
2141
|
this.opts.resolveAwaitingOperator ? this.opts.resolveAwaitingOperator({ tenantId, contactId: input.contactId }) : Promise.resolve(false)
|
|
2057
2142
|
]);
|
|
2143
|
+
const isExchange = this.opts.template?.slug === "exchange_v1";
|
|
2058
2144
|
const result = await answerWithRag({
|
|
2059
2145
|
question: input.userMessageText,
|
|
2060
2146
|
kb,
|
|
@@ -2064,7 +2150,7 @@ class RagReplyStrategy {
|
|
|
2064
2150
|
topK: this.opts.topK ?? 5,
|
|
2065
2151
|
hybridSearch: this.opts.hybridSearch ?? true,
|
|
2066
2152
|
rewriteQueryBeforeRetrieval: this.opts.rewriteQueryBeforeRetrieval ?? true,
|
|
2067
|
-
reflect: this.opts.reflect ??
|
|
2153
|
+
reflect: this.opts.reflect ?? isExchange,
|
|
2068
2154
|
numPredict: this.opts.maxOutputTokens ?? 600,
|
|
2069
2155
|
...style ? { style } : {},
|
|
2070
2156
|
...skills.length > 0 ? { skills } : {},
|
|
@@ -2088,6 +2174,16 @@ class RagReplyStrategy {
|
|
|
2088
2174
|
console.warn("[rag-reply] failed to log kb_suggestion:", err);
|
|
2089
2175
|
});
|
|
2090
2176
|
}
|
|
2177
|
+
if (isExchange) {
|
|
2178
|
+
console.warn(`[exchange-reflect-guard] tenant=${tenantId} conversation=${input.conversationId} path=${result.telemetry.path}`);
|
|
2179
|
+
return [
|
|
2180
|
+
{
|
|
2181
|
+
channelId: String(input.channel.channelId),
|
|
2182
|
+
externalUserId: input.inbound.externalUserId,
|
|
2183
|
+
parts: [{ kind: "text", text: EXCHANGE_SAFE_FALLBACK }]
|
|
2184
|
+
}
|
|
2185
|
+
];
|
|
2186
|
+
}
|
|
2091
2187
|
if (!this.opts.softFallback)
|
|
2092
2188
|
return null;
|
|
2093
2189
|
const persona = style ? {
|
|
@@ -2111,11 +2207,15 @@ class RagReplyStrategy {
|
|
|
2111
2207
|
}
|
|
2112
2208
|
];
|
|
2113
2209
|
}
|
|
2210
|
+
const guarded = isExchange ? guardExchangeReply({ text: result.text, telemetry: result.telemetry }) : { ok: true, text: result.text };
|
|
2211
|
+
if (!guarded.ok) {
|
|
2212
|
+
console.warn(`[exchange-reply-guard] tenant=${tenantId} conversation=${input.conversationId} reason=${guarded.reason ?? "unknown"}`);
|
|
2213
|
+
}
|
|
2114
2214
|
return [
|
|
2115
2215
|
{
|
|
2116
2216
|
channelId: String(input.channel.channelId),
|
|
2117
2217
|
externalUserId: input.inbound.externalUserId,
|
|
2118
|
-
parts: [{ kind: "text", text:
|
|
2218
|
+
parts: [{ kind: "text", text: guarded.text }]
|
|
2119
2219
|
}
|
|
2120
2220
|
];
|
|
2121
2221
|
}
|
|
@@ -2721,7 +2821,11 @@ async function processInbound(inbound, deps) {
|
|
|
2721
2821
|
};
|
|
2722
2822
|
}
|
|
2723
2823
|
// src/reply-strategy/llm-reply.ts
|
|
2724
|
-
import {
|
|
2824
|
+
import {
|
|
2825
|
+
buildToolTelemetry,
|
|
2826
|
+
DEFAULT_MAX_TOOL_CYCLES,
|
|
2827
|
+
runToolLoop
|
|
2828
|
+
} from "@chatman-media/kb";
|
|
2725
2829
|
var BASE_SYSTEM_PROMPT = "Ты — операционный бот платформы lead-engine. Отвечай кратко, " + "уважительно, по делу. Никогда не выдумывай факты которых нет в " + "контексте — лучше скажи «уточню у партнёра» и поставь сообщение в очередь оператора.";
|
|
2726
2830
|
function messagesToChatHistory2(history) {
|
|
2727
2831
|
const out = [];
|
|
@@ -2765,7 +2869,8 @@ class LlmReplyStrategy {
|
|
|
2765
2869
|
try {
|
|
2766
2870
|
tools = await this.opts.resolveTools({
|
|
2767
2871
|
tenantId: input.tenant.tenantId,
|
|
2768
|
-
conversationId: input.conversationId
|
|
2872
|
+
conversationId: input.conversationId,
|
|
2873
|
+
contactId: input.contactId
|
|
2769
2874
|
});
|
|
2770
2875
|
} catch {
|
|
2771
2876
|
tools = [];
|
|
@@ -2784,6 +2889,7 @@ class LlmReplyStrategy {
|
|
|
2784
2889
|
...historyMessages
|
|
2785
2890
|
];
|
|
2786
2891
|
let reply;
|
|
2892
|
+
let toolCalls = [];
|
|
2787
2893
|
if (toolsActive) {
|
|
2788
2894
|
const loop = await runToolLoop({
|
|
2789
2895
|
chat,
|
|
@@ -2792,17 +2898,22 @@ class LlmReplyStrategy {
|
|
|
2792
2898
|
llmOpts,
|
|
2793
2899
|
maxCycles: DEFAULT_MAX_TOOL_CYCLES
|
|
2794
2900
|
});
|
|
2901
|
+
toolCalls = loop.toolCalls;
|
|
2795
2902
|
reply = loop.content ?? await chat.complete(msgs, llmOpts);
|
|
2796
2903
|
} else {
|
|
2797
2904
|
reply = await chat.complete(msgs, llmOpts);
|
|
2798
2905
|
}
|
|
2799
2906
|
if (reply.trim().length === 0)
|
|
2800
2907
|
return null;
|
|
2908
|
+
const guarded = this.opts.template.slug === "exchange_v1" ? guardExchangeReply({ text: reply, telemetry: buildToolTelemetry(toolCalls) }) : { ok: true, text: reply };
|
|
2909
|
+
if (!guarded.ok) {
|
|
2910
|
+
console.warn(`[exchange-reply-guard] tenant=${input.tenant.tenantId} conversation=${input.conversationId} reason=${guarded.reason ?? "unknown"}`);
|
|
2911
|
+
}
|
|
2801
2912
|
return [
|
|
2802
2913
|
{
|
|
2803
2914
|
channelId: String(input.channel.channelId),
|
|
2804
2915
|
externalUserId: input.inbound.externalUserId,
|
|
2805
|
-
parts: [{ kind: "text", text:
|
|
2916
|
+
parts: [{ kind: "text", text: guarded.text }]
|
|
2806
2917
|
}
|
|
2807
2918
|
];
|
|
2808
2919
|
}
|
|
@@ -2854,6 +2965,7 @@ export {
|
|
|
2854
2965
|
loadExperimentVariants,
|
|
2855
2966
|
isTerminal,
|
|
2856
2967
|
isMuted,
|
|
2968
|
+
guardExchangeReply,
|
|
2857
2969
|
getInitialStage,
|
|
2858
2970
|
getDecryptedSecret,
|
|
2859
2971
|
generateReplyAndEnqueue,
|
|
@@ -2883,6 +2995,7 @@ export {
|
|
|
2883
2995
|
INFORMER_TOPICS,
|
|
2884
2996
|
FunnelTransitionError,
|
|
2885
2997
|
ExperimentsRepo,
|
|
2998
|
+
EXCHANGE_SAFE_FALLBACK,
|
|
2886
2999
|
DrizzleKbStore,
|
|
2887
3000
|
ConversationsRepo,
|
|
2888
3001
|
ContactsRepo,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lead-advance.integration.test.d.ts","sourceRoot":"","sources":["../src/lead-advance.integration.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { AnswerTelemetry } from "@chatman-media/kb";
|
|
2
|
+
export declare const EXCHANGE_SAFE_FALLBACK = "\u0421\u0435\u0439\u0447\u0430\u0441 \u0443\u0442\u043E\u0447\u043D\u044E \u0443 \u043E\u043F\u0435\u0440\u0430\u0442\u043E\u0440\u0430 \u0438 \u0432\u0435\u0440\u043D\u0443\u0441\u044C \u0441 \u0442\u043E\u0447\u043D\u043E\u0439 \u0441\u0443\u043C\u043C\u043E\u0439/\u0440\u0435\u043A\u0432\u0438\u0437\u0438\u0442\u0430\u043C\u0438.";
|
|
3
|
+
export interface ExchangeReplyGuardInput {
|
|
4
|
+
text: string;
|
|
5
|
+
telemetry?: Pick<AnswerTelemetry, "toolCall" | "toolCalls">;
|
|
6
|
+
}
|
|
7
|
+
export interface ExchangeReplyGuardResult {
|
|
8
|
+
ok: boolean;
|
|
9
|
+
text: string;
|
|
10
|
+
reason?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function guardExchangeReply(input: ExchangeReplyGuardInput): ExchangeReplyGuardResult;
|
|
13
|
+
//# sourceMappingURL=exchange-reply-guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exchange-reply-guard.d.ts","sourceRoot":"","sources":["../../src/reply-strategy/exchange-reply-guard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,eAAO,MAAM,sBAAsB,mVACiC,CAAC;AAErE,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,UAAU,GAAG,WAAW,CAAC,CAAC;CAC7D;AAED,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAiED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,GAAG,wBAAwB,CAuB3F"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exchange-reply-guard.test.d.ts","sourceRoot":"","sources":["../../src/reply-strategy/exchange-reply-guard.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export { LlmReplyStrategy, type LlmReplyStrategyOpts } from "./llm-reply.ts";
|
|
2
2
|
export { parseStyleConfig, RagReplyStrategy, type RagReplyStrategyOpts } from "./rag-reply.ts";
|
|
3
|
+
export { EXCHANGE_SAFE_FALLBACK, guardExchangeReply, type ExchangeReplyGuardInput, type ExchangeReplyGuardResult, } from "./exchange-reply-guard.ts";
|
|
3
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/reply-strategy/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/reply-strategy/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC/F,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,GAC9B,MAAM,2BAA2B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llm-reply.d.ts","sourceRoot":"","sources":["../../src/reply-strategy/llm-reply.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,
|
|
1
|
+
{"version":3,"file":"llm-reply.d.ts","sourceRoot":"","sources":["../../src/reply-strategy/llm-reply.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EACL,KAAK,UAAU,EAKhB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,UAAU,EAAe,MAAM,2BAA2B,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,EAAc,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAG3D;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yCAAyC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qCAAqC;IACrC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;;OAMG;IACH,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,UAAU,CAAC;IAC9C,2EAA2E;IAC3E,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACxF;;;;;OAKG;IACH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,cAAc,EAAE,MAAM,CAAC;QACvB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,KAAK,OAAO,CAAC,UAAU,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC;CAC5C;AAkBD,qBAAa,gBAAiB,YAAW,aAAa;IAElD,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,eAAe;gBADf,IAAI,EAAE,oBAAoB,EAC1B,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,YAAY;IAGhE,QAAQ,CAAC,KAAK,EAAE;QACpB,MAAM,EAAE;YAAE,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAC;QAC7B,OAAO,EAAE;YAAE,SAAS,EAAE,MAAM,CAAA;SAAE,CAAC;QAC/B,cAAc,EAAE,MAAM,CAAC;QACvB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE;YAAE,cAAc,EAAE,MAAM,CAAA;SAAE,CAAC;QACpC,eAAe,EAAE,MAAM,CAAC;KACzB,GAAG,OAAO,CAAC,gBAAgB,EAAE,GAAG,IAAI,CAAC;CAyFvC"}
|
|
@@ -134,6 +134,7 @@ export interface RagReplyStrategyOpts {
|
|
|
134
134
|
resolveTools?: (input: {
|
|
135
135
|
tenantId: number;
|
|
136
136
|
conversationId: number;
|
|
137
|
+
contactId?: number;
|
|
137
138
|
}) => Promise<AnyRagTool[]> | AnyRagTool[];
|
|
138
139
|
/**
|
|
139
140
|
* Если true — когда RAG не находит контекста (NO_CONTEXT_MARKER) бот всё
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rag-reply.d.ts","sourceRoot":"","sources":["../../src/reply-strategy/rag-reply.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,KAAK,EACV,UAAU,EAEV,eAAe,IAAI,kBAAkB,EACtC,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAEL,KAAK,UAAU,EAEf,KAAK,qBAAqB,EAE1B,KAAK,QAAQ,EAGb,KAAK,QAAQ,EACb,KAAK,cAAc,EACnB,KAAK,KAAK,EAEX,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAc,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"rag-reply.d.ts","sourceRoot":"","sources":["../../src/reply-strategy/rag-reply.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rag-reply.test.d.ts","sourceRoot":"","sources":["../../src/reply-strategy/rag-reply.test.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chatman-media/conversation-engine",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.12.0",
|
|
4
4
|
"description": "Channel-agnostic pipeline обработки inbound сообщений: contact-resolve → conversation lookup → mode routing → AI-reply / queued / human → outbound. Сердце data plane.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"@chatman-media/channel-telegram": "1.1.0",
|
|
39
39
|
"@chatman-media/llm-router": "1.1.1",
|
|
40
40
|
"@chatman-media/kb": "1.5.0",
|
|
41
|
-
"@chatman-media/storage": "1.
|
|
41
|
+
"@chatman-media/storage": "1.10.1",
|
|
42
42
|
"@chatman-media/verticals": "1.2.0"
|
|
43
43
|
},
|
|
44
44
|
"peerDependencies": {
|