@ozaiya/openclaw-channel 0.10.7 → 0.10.9

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.
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Yuanbao (元宝) API client for summarizing WeChat articles.
3
+ *
4
+ * WeChat article URLs (mp.weixin.qq.com) are blocked for external crawlers.
5
+ * Tencent Yuanbao has privileged access to WeChat content and can summarize articles.
6
+ * This module calls Yuanbao's internal HTTP API using login cookies (~60 day validity).
7
+ */
8
+ import fs from "node:fs/promises";
9
+ const YUANBAO_BASE = "https://yuanbao.tencent.com";
10
+ const DEFAULT_AGENT_ID = "naQivTmsDa";
11
+ const DEFAULT_CHAT_MODEL_ID = "deep_seek_v3";
12
+ async function loadCookies(config, log) {
13
+ if (config.cookies)
14
+ return config.cookies;
15
+ const cookiePath = config.cookieFile;
16
+ if (!cookiePath)
17
+ return null;
18
+ try {
19
+ const raw = await fs.readFile(cookiePath, "utf-8");
20
+ return raw.trim();
21
+ }
22
+ catch (err) {
23
+ log?.warn?.(`yuanbao: failed to read cookie file ${cookiePath}: ${err}`);
24
+ return null;
25
+ }
26
+ }
27
+ async function createConversation(agentId, cookies, log) {
28
+ const resp = await fetch(`${YUANBAO_BASE}/api/user/agent/conversation/create`, {
29
+ method: "POST",
30
+ headers: {
31
+ "Content-Type": "application/json",
32
+ Cookie: cookies,
33
+ },
34
+ body: JSON.stringify({ agentId }),
35
+ });
36
+ if (!resp.ok) {
37
+ log?.warn?.(`yuanbao: conversation create failed: ${resp.status} ${resp.statusText}`);
38
+ return null;
39
+ }
40
+ const data = (await resp.json());
41
+ if (data.requireLogin) {
42
+ log?.warn?.(`yuanbao: cookies expired (requireLogin=true), cannot summarize`);
43
+ return null;
44
+ }
45
+ return data.id ?? data.conversationId ?? null;
46
+ }
47
+ async function chatStream(conversationId, url, chatModelId, cookies, log) {
48
+ const prompt = `请总结这篇微信文章的内容:${url}`;
49
+ const bodyStr = JSON.stringify({
50
+ model: "gpt_175B_0404",
51
+ prompt,
52
+ plugin: "Adaptive",
53
+ displayPrompt: prompt,
54
+ displayPromptType: 1,
55
+ agentId: "naQivTmsDa",
56
+ chatModelId,
57
+ supportFunctions: ["openAutoSearchSwitch", "autoInternetSearch"],
58
+ multimedia: [],
59
+ supportHint: 1,
60
+ version: "v2",
61
+ });
62
+ // Use Buffer body — Node.js undici mishandles string bodies with text/plain Content-Type,
63
+ // causing Yuanbao's tRPC gateway to reject with 401.
64
+ const resp = await fetch(`${YUANBAO_BASE}/api/chat/${conversationId}`, {
65
+ method: "POST",
66
+ headers: {
67
+ "Content-Type": "text/plain;charset=UTF-8",
68
+ "X-Requested-With": "XMLHttpRequest",
69
+ Cookie: cookies,
70
+ Accept: "text/event-stream",
71
+ },
72
+ body: Buffer.from(bodyStr),
73
+ });
74
+ if (!resp.ok) {
75
+ log?.warn?.(`yuanbao: chat request failed: ${resp.status} ${resp.statusText}`);
76
+ return null;
77
+ }
78
+ const body = resp.body;
79
+ if (!body) {
80
+ log?.warn?.(`yuanbao: no response body`);
81
+ return null;
82
+ }
83
+ // Read SSE stream and collect text chunks
84
+ const chunks = [];
85
+ const reader = body.getReader();
86
+ const decoder = new TextDecoder();
87
+ let buffer = "";
88
+ try {
89
+ while (true) {
90
+ const { done, value } = await reader.read();
91
+ if (done)
92
+ break;
93
+ buffer += decoder.decode(value, { stream: true });
94
+ // Process complete SSE lines
95
+ const lines = buffer.split("\n");
96
+ buffer = lines.pop() ?? "";
97
+ for (const line of lines) {
98
+ if (!line.startsWith("data:"))
99
+ continue;
100
+ const jsonStr = line.slice(5).trim();
101
+ if (!jsonStr || jsonStr === "[DONE]")
102
+ continue;
103
+ try {
104
+ const evt = JSON.parse(jsonStr);
105
+ if (evt.requireLogin) {
106
+ log?.warn?.(`yuanbao: cookies expired during streaming (requireLogin=true)`);
107
+ return null;
108
+ }
109
+ // Text content comes in type "text" events
110
+ if (evt.type === "text" && typeof evt.msg === "string") {
111
+ chunks.push(evt.msg);
112
+ }
113
+ }
114
+ catch {
115
+ // Non-JSON SSE line, skip
116
+ }
117
+ }
118
+ }
119
+ }
120
+ finally {
121
+ reader.releaseLock();
122
+ }
123
+ const result = chunks.join("");
124
+ return result || null;
125
+ }
126
+ /**
127
+ * Summarize a WeChat article URL using Yuanbao.
128
+ * Returns the summary text, or null if the operation fails (expired cookies, network error, etc.).
129
+ */
130
+ export async function summarizeWithYuanbao(url, config, log) {
131
+ const cookies = await loadCookies(config, log);
132
+ if (!cookies) {
133
+ log?.warn?.(`yuanbao: no cookies available, skipping summarization`);
134
+ return null;
135
+ }
136
+ const agentId = config.agentId ?? DEFAULT_AGENT_ID;
137
+ const chatModelId = config.chatModelId ?? DEFAULT_CHAT_MODEL_ID;
138
+ // Step 1: Create conversation
139
+ const conversationId = await createConversation(agentId, cookies, log);
140
+ if (!conversationId) {
141
+ log?.warn?.(`yuanbao: failed to create conversation`);
142
+ return null;
143
+ }
144
+ log?.info?.(`yuanbao: created conversation ${conversationId}, fetching summary for ${url}`);
145
+ // Step 2: Chat with SSE streaming to get summary
146
+ const summary = await chatStream(conversationId, url, chatModelId, cookies, log);
147
+ if (!summary) {
148
+ log?.warn?.(`yuanbao: no summary content returned`);
149
+ return null;
150
+ }
151
+ log?.info?.(`yuanbao: got summary (${summary.length} chars)`);
152
+ return summary;
153
+ }
154
+ //# sourceMappingURL=yuanbao.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yuanbao.js","sourceRoot":"","sources":["../../src/yuanbao.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ozaiya/openclaw-channel",
3
- "version": "0.10.7",
3
+ "version": "0.10.9",
4
4
  "description": "OpenClaw channel plugin for Ozaiya Chat",
5
5
  "license": "MIT",
6
6
  "type": "module",