@dsh-plus/web-search-services 0.1.1 → 0.1.2

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/lib/index.js CHANGED
@@ -126,6 +126,12 @@ function makeSource(url, title, snippet, publishedAt) {
126
126
  ...publishedAt !== void 0 ? { publishedAt } : {}
127
127
  };
128
128
  }
129
+ /** skill 各服务 request() 统一信封 {ok, service, status, data: <API 响应>};
130
+ * 取 data 为业务 payload,data 缺失/空对象时回退顶层(旧形状容差)。 */
131
+ function payloadOf(raw) {
132
+ const data = asObject(raw.data);
133
+ return Object.keys(data).length > 0 ? data : raw;
134
+ }
129
135
  function finish(content, sources) {
130
136
  const seen = /* @__PURE__ */ new Set();
131
137
  const deduped = sources.filter((source) => {
@@ -148,15 +154,16 @@ function sourcesFromResults(results, pick) {
148
154
  return out;
149
155
  }
150
156
  function normalizeTavily(raw) {
151
- const sources = sourcesFromResults(raw.results, (item) => {
157
+ const payload = payloadOf(raw);
158
+ const sources = sourcesFromResults(payload.results, (item) => {
152
159
  const url = asNonEmptyString(item.url);
153
160
  if (url === void 0) return void 0;
154
161
  return makeSource(url, asNonEmptyString(item.title), asNonEmptyString(item.content), asNonEmptyString(item.published_date));
155
162
  });
156
- return finish(asNonEmptyString(raw.answer), sources);
163
+ return finish(asNonEmptyString(payload.answer), sources);
157
164
  }
158
165
  function normalizeExa(raw) {
159
- return finish(void 0, sourcesFromResults(raw.results, (item) => {
166
+ return finish(void 0, sourcesFromResults(payloadOf(raw).results, (item) => {
160
167
  const url = asNonEmptyString(item.url) ?? asNonEmptyString(item.id);
161
168
  if (url === void 0) return void 0;
162
169
  const highlights = asArray(item.highlights).map((h) => asNonEmptyString(h)).filter((h) => h !== void 0);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dsh-plus/web-search-services",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "dsh-plus service plugin: web_search 免费后端聚合——经官方 ctx.web provider 扩展点桥接 search-services skill(Tavily/Exa/OpenAI Chat 免费额度,优先级+自动回退+key 配置),官方 web_search 工具与输出格式零修改",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
package/src/normalize.ts CHANGED
@@ -1,9 +1,10 @@
1
1
  /**
2
2
  * search.py 输出 → dsh-web 标准 WebSearchResult 归一化(纯函数)。
3
3
  *
4
- * skill 各后端 payload 形状不同:tavily/exa 是原生 API 形状(results[]),
5
- * openai-chat 是生成式回答(data.answer)。按 selectedService 归一;
6
- * 字段缺失降级而非报错(对 skill 脚本版本漂移保持容差)。
4
+ * skill 各服务 request() 统一信封 {ok, service, status, data: <API 原始响应>}:
5
+ * tavily/exa 业务字段在 data 下(results/answer),openai-chat 回答在
6
+ * data.answer。按 selectedService 归一;字段缺失降级而非报错(对 skill
7
+ * 脚本版本漂移保持容差)。
7
8
  * @module web-search-services/normalize
8
9
  */
9
10
  import type { WebSearchResult, WebSearchSource } from '@deepseek-ai/dsh-web'
@@ -38,6 +39,13 @@ function makeSource(
38
39
  }
39
40
  }
40
41
 
42
+ /** skill 各服务 request() 统一信封 {ok, service, status, data: <API 响应>};
43
+ * 取 data 为业务 payload,data 缺失/空对象时回退顶层(旧形状容差)。 */
44
+ function payloadOf(raw: JsonObject): JsonObject {
45
+ const data = asObject(raw.data)
46
+ return Object.keys(data).length > 0 ? data : raw
47
+ }
48
+
41
49
  function finish(content: string | undefined, sources: WebSearchSource[]): WebSearchResult {
42
50
  const seen = new Set<string>()
43
51
  const deduped = sources.filter((source) => {
@@ -65,7 +73,8 @@ function sourcesFromResults(
65
73
  }
66
74
 
67
75
  function normalizeTavily(raw: JsonObject): WebSearchResult {
68
- const sources = sourcesFromResults(raw.results, (item) => {
76
+ const payload = payloadOf(raw)
77
+ const sources = sourcesFromResults(payload.results, (item) => {
69
78
  const url = asNonEmptyString(item.url)
70
79
  if (url === undefined) return undefined
71
80
  return makeSource(
@@ -75,11 +84,12 @@ function normalizeTavily(raw: JsonObject): WebSearchResult {
75
84
  asNonEmptyString(item.published_date),
76
85
  )
77
86
  })
78
- return finish(asNonEmptyString(raw.answer), sources)
87
+ return finish(asNonEmptyString(payload.answer), sources)
79
88
  }
80
89
 
81
90
  function normalizeExa(raw: JsonObject): WebSearchResult {
82
- const sources = sourcesFromResults(raw.results, (item) => {
91
+ const payload = payloadOf(raw)
92
+ const sources = sourcesFromResults(payload.results, (item) => {
83
93
  const url = asNonEmptyString(item.url) ?? asNonEmptyString(item.id)
84
94
  if (url === undefined) return undefined
85
95
  const highlights = asArray(item.highlights)