From ffc9574a45c0aed2e2641683766de9e920b8c08d Mon Sep 17 00:00:00 2001 From: wangliang Date: Fri, 23 Oct 2026 12:05:31 +0800 Subject: [PATCH] fix: sync bridge HTTP tool deps and product timeout from test deployment --- .env.example | 2 ++ .gitignore | 1 + bridge/src/server.js | 14 ++++++++++++-- bridge/src/tools.js | 13 ++++++++++++- docker-compose.yml | 1 + 5 files changed, 28 insertions(+), 3 deletions(-) diff --git a/.env.example b/.env.example index 2f30fdd..5f3fd85 100644 --- a/.env.example +++ b/.env.example @@ -63,3 +63,5 @@ EMB_DIM= EMB_TRANSLATE_MODEL= TRACE_ENABLED=false + +PRODUCT_TIMEOUT_MS=30000 diff --git a/.gitignore b/.gitignore index 3652b5f..9fabf0e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ # 密钥与运行时(不入库) .env +.env.bak-* libredesk/config/config.toml libredesk/uploads/* !libredesk/uploads/.gitkeep diff --git a/bridge/src/server.js b/bridge/src/server.js index eabcb57..992f5fd 100644 --- a/bridge/src/server.js +++ b/bridge/src/server.js @@ -7,6 +7,11 @@ const { createTools, resolveSiteProfile } = require('./tools'); const { createIdentity } = require('./identity'); const { createLibreDeskWebhook } = require('./libredesk-webhook'); const { createAgent } = require('./agent'); +const { createLLM } = require('./llm'); +const { createReranker } = require('./reranker'); +const { createVerification } = require('./verification'); +const { createLibreDeskClient } = require('./libredesk'); +const { createRetriever } = require('./rag'); const prom = require('./prom'); const { ToolError } = require('./errors'); @@ -83,9 +88,14 @@ function contextFromHeaders(headers = {}) { function createServer(options = {}) { const cfg = options.config || loadConfig(); const auther = createAuther(cfg.toolsSharedKey); - const tools = options.tools || createTools(cfg); + const verification = options.verification || createVerification(cfg); + const client = options.client || createLibreDeskClient(cfg); + const retriever = options.retriever || (cfg.ragPgUrl ? createRetriever(cfg) : null); + const llm = options.llm || createLLM(cfg); + const reranker = options.reranker || createReranker(llm); + const tools = options.tools || createTools(cfg, { verification, retriever, client, reranker }); const identity = options.identity || createIdentity(cfg); - const agent = options.agent || createAgent(cfg); + const agent = options.agent || createAgent(cfg, { verification, client, retriever, reranker, llm }); const libredeskWebhook = options.libredeskWebhook || createLibreDeskWebhook(cfg, { agent }); const byName = new Map(tools.map((t) => [t.name, t])); const startedAt = Date.now(); diff --git a/bridge/src/tools.js b/bridge/src/tools.js index 118c47a..3cb1ec3 100644 --- a/bridge/src/tools.js +++ b/bridge/src/tools.js @@ -377,8 +377,19 @@ function createTools(cfg, deps = {}) { const query = String(args.query || '').trim(); if (!query) throw new ToolError(400, 'invalid_arguments', 'query is required'); const limit = Math.min(Number(args.limit) || 5, 8); - let results = await retriever.searchKB(query, Math.max(limit, 8)); + // 有 reranker 时多取候选再重排;无 reranker 时尊重调用方 limit。 + const fetchLimit = reranker ? Math.max(limit, 8) : limit; + let results = await retriever.searchKB(query, fetchLimit); + // parent/child 可能命中同一篇文章:按 question+answer 去重 + const seen = new Set(); + results = results.filter((r) => { + const key = `${r.question || ''}\u0000${r.answer || ''}`; + if (seen.has(key)) return false; + seen.add(key); + return true; + }); if (reranker) results = await reranker.rerank(query, results, limit); + else results = results.slice(0, limit); return { results, count: results.length, diff --git a/docker-compose.yml b/docker-compose.yml index c02094a..e906979 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -187,6 +187,7 @@ services: INVENTORY_API_URL: ${INVENTORY_API_URL} MEMBER_RPC_URL: ${MEMBER_RPC_URL} RPC_TIMEOUT_MS: ${RPC_TIMEOUT_MS:-8000} + PRODUCT_TIMEOUT_MS: ${PRODUCT_TIMEOUT_MS:-15000} SITE_SEARCH_URL: ${SITE_SEARCH_URL} TWENTY_BASE_URL: http://twenty-server:3000 TWENTY_GRAPHQL_PATH: /graphql