@operatingtag/dsh-unclesam 1.0.0 → 1.0.1
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/CHANGELOG.md +35 -0
- package/LICENSE +2 -0
- package/README.de.md +274 -0
- package/README.es.md +268 -0
- package/README.fr.md +272 -0
- package/README.hi.md +263 -0
- package/README.id.md +264 -0
- package/README.it.md +268 -0
- package/README.ja.md +263 -0
- package/README.ko.md +258 -0
- package/README.md +129 -223
- package/README.nl.md +266 -0
- package/README.pl.md +266 -0
- package/README.pt.md +265 -0
- package/README.ru.md +269 -0
- package/README.tr.md +265 -0
- package/README.uk.md +265 -0
- package/README.vi.md +263 -0
- package/README.zh.md +248 -0
- package/index.js +5 -2
- package/lib/prompt.mjs +24 -44
- package/package.json +18 -2
package/README.vi.md
ADDED
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
[English](README.md) · [Español](README.es.md) · [Français](README.fr.md) · [Deutsch](README.de.md) · [Português](README.pt.md) · [Italiano](README.it.md) · [Türkçe](README.tr.md) · [한국어](README.ko.md) · [日本語](README.ja.md) · [简体中文](README.zh.md) · [Русский](README.ru.md) · [Polski](README.pl.md) · [हिन्दी](README.hi.md) · [Nederlands](README.nl.md) · [Українська](README.uk.md) · **Tiếng Việt** · [Bahasa Indonesia](README.id.md)
|
|
2
|
+
|
|
3
|
+
# Uncle Sam
|
|
4
|
+
|
|
5
|
+
**Một nhà cung cấp cho DeepSeek Harness, trả lời qua chính trình duyệt của bạn — trên tài khoản web bạn đã có — thay vì API tính tiền.**
|
|
6
|
+
|
|
7
|
+
**☕ [Mời tôi một ly cà phê](https://revolut.me/operatingtag)** — viết bởi một người, về đêm, không có tài trợ. Không có nguồn thu nào khác. Một ngôi sao hay một báo lỗi hữu ích cũng quý như vậy.
|
|
8
|
+
|
|
9
|
+
> **Sản phẩm này đang được phát triển liên tục. Hãy chờ đợi lỗi.**
|
|
10
|
+
>
|
|
11
|
+
> Nó chạy được, nó nhanh, và nó đã được dùng hằng ngày suốt nhiều tuần — nhưng nó luôn thay đổi, và đường đi
|
|
12
|
+
> qua trình duyệt phụ thuộc vào một trang web thay đổi không báo trước. Nếu có gì hỏng, một ảnh chụp màn hình và
|
|
13
|
+
> số phiên bản có giá trị hơn một đoạn mô tả. Hãy ghim một phiên bản nếu bạn phụ thuộc vào nó.
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
nhà cung cấp deepseek-web
|
|
17
|
+
mô hình deepseek-chat · deepseek-chat-search · deepseek-reasoner · deepseek-reasoner-search
|
|
18
|
+
chi phí không đồng nào mỗi token — dùng gói đăng ký đã mở sẵn trong trình duyệt của bạn
|
|
19
|
+
trạng thái đang phát triển — hãy chờ đợi lỗi
|
|
20
|
+
đo được token đầu ~1,9 giây · chi phí phụ ~0,6 giây · một lượt hoàn chỉnh ~2,5 giây
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Câu trả lời từ đường web được ký **🔴 Uncle Sam**. Cái tên đó là một câu đùa, không phải một tuyên bố: nó đánh
|
|
24
|
+
dấu đường nào đã trả lời, còn câu trả lời của API không hề có chữ ký. Bạn luôn biết ai đã trả lời mình.
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Nó tiết kiệm cho bạn điều gì
|
|
29
|
+
|
|
30
|
+
API tính tiền theo token. Sản phẩm web thì không. Plugin này đăng ký `deepseek-web` làm nhà cung cấp mô hình và
|
|
31
|
+
trả lời mọi lệnh gọi bằng cách điều khiển `chat.deepseek.com` trong một trình duyệt thật — trang làm việc, trình
|
|
32
|
+
duyệt giữ phiên, và không có gì bị tính tiền.
|
|
33
|
+
|
|
34
|
+
| | Đường API | Đường web |
|
|
35
|
+
|---|---|---|
|
|
36
|
+
| Chi phí | theo token, mãi mãi | không gì ngoài gói đăng ký |
|
|
37
|
+
| Tốc độ | nhanh | ~2,5 giây mỗi lượt, đã đo |
|
|
38
|
+
| Gọi công cụ | gốc và đáng tin | mô phỏng, chạy được nhưng yếu hơn |
|
|
39
|
+
| Phụ thuộc vào | API | một trang web thay đổi không báo trước |
|
|
40
|
+
|
|
41
|
+
**Cả hai đường đều được cài sẵn.** Bộ chọn mô hình chính là công tắc: mặc định dùng đường rẻ, và chuyển sang API
|
|
42
|
+
khi công việc cần công cụ đáng tin.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Cài đặt
|
|
47
|
+
|
|
48
|
+
Uncle Sam là một **plugin của DeepSeek Harness**. Ngoài harness nó không làm gì, vì nó đăng ký một nhà cung cấp mô
|
|
49
|
+
hình, một tuyến trên host và hai chỗ trong giao diện.
|
|
50
|
+
|
|
51
|
+
**Yêu cầu**
|
|
52
|
+
|
|
53
|
+
| | |
|
|
54
|
+
|---|---|
|
|
55
|
+
| DeepSeek Harness | bản dựng gần đây có trình quản lý plugin |
|
|
56
|
+
| Trình duyệt | khuyến nghị Brave; Edge được dùng tự động nếu không có Brave |
|
|
57
|
+
| Node | 22 trở lên |
|
|
58
|
+
|
|
59
|
+
**Từ npm**
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
pnpm add @operatingtag/dsh-unclesam
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
**Từ kho này**
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
git clone https://github.com/operatingtag/dsh-unclesam
|
|
69
|
+
cd dsh-unclesam
|
|
70
|
+
pnpm install
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Rồi thêm dòng gói vào hồ sơ của bạn để harness nạp nó:
|
|
74
|
+
|
|
75
|
+
```yaml
|
|
76
|
+
# cordis.patch.yml
|
|
77
|
+
- insert:
|
|
78
|
+
- id: dsh-unclesam
|
|
79
|
+
name: '@operatingtag/dsh-unclesam'
|
|
80
|
+
config:
|
|
81
|
+
port: 9222
|
|
82
|
+
defaultModel: deepseek-chat-search
|
|
83
|
+
autoMinimise: true
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
**Hoặc từ một thư mục:** Cài đặt → Plugin → cài từ đường dẫn cục bộ, trỏ tới thư mục có `package.json`.
|
|
87
|
+
|
|
88
|
+
### Lần chạy đầu tiên
|
|
89
|
+
|
|
90
|
+
Bấm **Đăng nhập / mở trò chuyện**. Trình duyệt mở ra và **vẫn hiện** cho tới khi bạn đăng nhập xong trên
|
|
91
|
+
chat.deepseek.com. Sau đó nó tự thu nhỏ và bạn sẽ không thấy nó nữa. Phiên nằm trong hồ sơ trình duyệt, nên
|
|
92
|
+
**plugin không lưu mật khẩu nào** — không có gì để lộ.
|
|
93
|
+
|
|
94
|
+
Sau đó bạn sẽ thấy:
|
|
95
|
+
|
|
96
|
+
1. **Cài đặt → Uncle Sam** — một trang có các dòng trạng thái và một nút đăng nhập.
|
|
97
|
+
2. **Dưới ô nhập** — `● DeepSeek Harness` hoặc `● Uncle Sam`, bấm để chuyển.
|
|
98
|
+
3. **Danh sách mô hình** — bốn mô hình `(web)` bên cạnh các mô hình API.
|
|
99
|
+
|
|
100
|
+
### Gỡ bỏ
|
|
101
|
+
|
|
102
|
+
Cài đặt → Plugin → Uncle Sam → Gỡ cài đặt. Không ghi gì ra ngoài hồ sơ trình duyệt mà bạn đã đăng nhập.
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Công tắc API / web
|
|
107
|
+
|
|
108
|
+
**Bộ chọn mô hình chính là công tắc.** Không có điều khiển thứ hai, vì một điều khiển thứ hai mà cũng chọn mô hình
|
|
109
|
+
thì sẽ là hai nguồn sự thật cho một quyết định.
|
|
110
|
+
|
|
111
|
+
| Chọn mô hình này | Đường | DeepThink | Tìm kiếm |
|
|
112
|
+
|---|---|---|---|
|
|
113
|
+
| `DeepSeek Chat (web)` | trình duyệt | tắt | tắt |
|
|
114
|
+
| `DeepSeek Chat + Search (web)` | trình duyệt | tắt | **bật** |
|
|
115
|
+
| `DeepSeek Reasoner (web)` | trình duyệt | **bật** | tắt |
|
|
116
|
+
| `DeepSeek Reasoner + Search (web)` | trình duyệt | **bật** | **bật** |
|
|
117
|
+
| mọi mô hình không có `(web)` | API | — | — |
|
|
118
|
+
|
|
119
|
+
Cạnh tên mô hình có huy hiệu **WEB** hoặc **API**, để đường đang dùng thấy được ngay. Khi không nhận ra tên,
|
|
120
|
+
huy hiệu không hiện gì thay vì đoán — huy hiệu sai còn tệ hơn không có.
|
|
121
|
+
|
|
122
|
+
Lựa chọn của bạn được giữ qua các lần khởi động lại. **DeepThink** là lượt suy luận; **Tìm kiếm** cho phép nó đọc
|
|
123
|
+
web trực tiếp.
|
|
124
|
+
|
|
125
|
+
### Tìm kiếm hiện ra trong cuộc trò chuyện
|
|
126
|
+
|
|
127
|
+
Với một mô hình tìm kiếm, một lượt tạo ra **hai khối** — câu truy vấn nó đã dùng, các nguồn tìm được, rồi câu
|
|
128
|
+
trả lời đã dùng chúng:
|
|
129
|
+
|
|
130
|
+
```
|
|
131
|
+
Tìm kiếm web — "Hôm nay có tiêu đề công nghệ nào?"
|
|
132
|
+
Nguồn (4): yna.co.kr · fnnews.com · rthk.hk · sina.com.cn
|
|
133
|
+
Liên kết: https://k.sina.com.cn/article_... http://www.21jingji.com/article_...
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
Trang không để lộ truy vấn nó đã gõ bên trong, nên truy vấn được trích dẫn chính là tin nhắn đã kích hoạt việc tìm
|
|
137
|
+
kiếm. Nguồn và liên kết được đọc từ trang sau khi câu trả lời đã ổn định. Vì các nguồn chỉ tồn tại ở cuối, **lượt
|
|
138
|
+
có tìm kiếm được gom lại thay vì phát trực tiếp**; lượt thường vẫn phát từng token.
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## Vì sao là trình duyệt, chứ không phải HTTP API của họ
|
|
143
|
+
|
|
144
|
+
Cách hiển nhiên — gọi API riêng của `chat.deepseek.com` — đã được thử và bị bỏ. Trang web bắt mọi tin nhắn đi qua
|
|
145
|
+
hai cửa:
|
|
146
|
+
|
|
147
|
+
| Cửa | Ý nghĩa |
|
|
148
|
+
|---|---|
|
|
149
|
+
| `/api/v0/chat/create_pow_challenge` | một **bằng chứng công việc** cho mỗi tin nhắn |
|
|
150
|
+
| `challenges.cloudflare.com/turnstile` | một cổng chặn bot ở nguồn gốc |
|
|
151
|
+
|
|
152
|
+
Làm lại một trong hai là một cuộc chơi thua: chúng bị làm rối mã, chúng thay đổi, và khi chúng thay đổi thì lỗi
|
|
153
|
+
trông y hệt một sự cố mạng. **Trang đã tự giải quyết cả hai cho các yêu cầu của chính nó.**
|
|
154
|
+
|
|
155
|
+
Nên bộ chuyển không bao giờ nói HTTP với trang web. Nó điều khiển trang, và trang làm phần còn lại. Xác thực, bằng
|
|
156
|
+
chứng công việc và Turnstile không còn là vấn đề của chúng ta và không thể hỏng độc lập với chính trang web.
|
|
157
|
+
|
|
158
|
+
**Đã kiểm chứng:** một `HEAD` đơn giản tới trang trả về `403`; đường trình duyệt trả về câu trả lời.
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## Giới hạn, nói thẳng
|
|
163
|
+
|
|
164
|
+
**Việc gọi công cụ là mô phỏng.** Một cuộc trò chuyện web không có kênh công cụ có cấu trúc: công cụ được mô tả
|
|
165
|
+
trong lời nhắc, và một lệnh gọi được phục hồi bằng cách lấy ra một đối tượng JSON từ câu trả lời. Nó chạy được —
|
|
166
|
+
đã kiểm chứng — nhưng yếu hơn gọi công cụ gốc: một mô hình bỏ qua chỉ dẫn sẽ trả lời bằng văn xuôi, và harness
|
|
167
|
+
không thấy việc dùng công cụ nào trong lượt đó. **Với công việc tác tử nặng, đường API đáng tin hơn.** Đường web
|
|
168
|
+
phù hợp nhất cho trò chuyện, câu trả lời dài, tác tử con, nén ngữ cảnh, và mọi lượt mà mô hình buộc phải là mô hình
|
|
169
|
+
web.
|
|
170
|
+
|
|
171
|
+
**Nó phụ thuộc vào một trang web bạn không kiểm soát.** Khi trang đổi hình dạng, plugin phải đổi theo. Đó chính là
|
|
172
|
+
cảnh báo ở đầu trang này, không phải thủ tục.
|
|
173
|
+
|
|
174
|
+
**Nó không liên kết với DeepSeek.** Không được họ chứng thực hay hỗ trợ, và không cho bạn quyền gì với dịch vụ của
|
|
175
|
+
họ. Việc bạn dùng dịch vụ đó do điều khoản của họ quy định.
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## Cấu hình
|
|
180
|
+
|
|
181
|
+
`cordis.patch.yml` đặt:
|
|
182
|
+
|
|
183
|
+
| khóa | mặc định | ý nghĩa |
|
|
184
|
+
|---|---|---|
|
|
185
|
+
| `port` | `9222` | cổng gỡ lỗi của trình duyệt |
|
|
186
|
+
| `defaultModel` | `deepseek-chat-search` | dùng khi lệnh gọi không nêu mô hình |
|
|
187
|
+
| `showBrowser` | `true` | cửa sổ có hiện ra trong lúc làm việc không |
|
|
188
|
+
|
|
189
|
+
Trình duyệt phải có phiên `chat.deepseek.com` đã đăng nhập. Lệnh gọi đầu tiên sẽ mở Brave với hồ sơ **Default**
|
|
190
|
+
nếu cổng chưa mở. Nếu Brave đang chạy *không* có cổng gỡ lỗi, bộ chuyển không thể bám vào và nói rõ điều đó thay vì
|
|
191
|
+
hỏng trong im lặng.
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## Cấu trúc
|
|
196
|
+
|
|
197
|
+
```
|
|
198
|
+
index.js bộ chuyển: StreamChunk của harness ←→ engine
|
|
199
|
+
lib/engine.mjs trình duyệt + trang: gõ, gửi, phát, lắng xuống
|
|
200
|
+
lib/cdp.mjs client Chrome DevTools Protocol, không phụ thuộc gì
|
|
201
|
+
lib/prompt.mjs duỗi tin nhắn + công cụ thành một tin nhắn; lấy lại lệnh gọi từ câu trả lời
|
|
202
|
+
lib/savings.mjs đường web đã tiết kiệm bao nhiêu, tính theo giá API
|
|
203
|
+
lib/i18n.mjs 51 ngôn ngữ cho bảng điều khiển
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
**Không có phụ thuộc.** Node 24 có sẵn `WebSocket` và `fetch` toàn cục, CDP chỉ cần thế, nên luồng token không bao
|
|
207
|
+
giờ rời khỏi tiến trình host và không có bước nhảy IPC cho mỗi delta.
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## Ủng hộ
|
|
212
|
+
|
|
213
|
+
Uncle Sam tồn tại để bạn thôi trả tiền theo token. Nếu nó đã tiết kiệm tiền cho bạn và bạn muốn thấy bản tiếp theo
|
|
214
|
+
trên phần cứng không hết bộ nhớ giữa đường:
|
|
215
|
+
|
|
216
|
+
**[☕ revolut.me/operatingtag](https://revolut.me/operatingtag)**
|
|
217
|
+
|
|
218
|
+
Một ngôi sao trên kho hay một báo lỗi hữu ích cũng quý như vậy.
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## Giấy phép
|
|
223
|
+
|
|
224
|
+
**CC BY-NC-ND 4.0** — Creative Commons Ghi công-Phi thương mại-Không phái sinh 4.0 Quốc tế.
|
|
225
|
+
Copyright (c) 2026 Darren T. Weldon, công bố dưới tên Operating Tag.
|
|
226
|
+
|
|
227
|
+
**Toàn bộ thỏa thuận trong một dòng: cài đặt và dùng cho cá nhân, miễn phí. Không sửa, không chia sẻ, không bán và
|
|
228
|
+
không dùng trong doanh nghiệp.**
|
|
229
|
+
|
|
230
|
+
Đây không phải mã nguồn mở, và nó không giả vờ là như vậy.
|
|
231
|
+
|
|
232
|
+
```
|
|
233
|
+
được phép cài đặt và chạy · dùng cho cá nhân, phi thương mại
|
|
234
|
+
đọc mã nguồn để hiểu nó
|
|
235
|
+
|
|
236
|
+
không được sửa, chuyển thể hoặc tạo ra tác phẩm phái sinh
|
|
237
|
+
sao chép, phân phối, công bố, nhân bản hoặc
|
|
238
|
+
cung cấp cho bất kỳ ai khác
|
|
239
|
+
tải lên bất kỳ nơi lưu trữ mã, sổ đăng ký, trang web, diễn đàn hay trò chuyện nào
|
|
240
|
+
bán, bán lại, cho thuê, hoặc thu tiền cho chính nó hay cho việc truy cập nó
|
|
241
|
+
đưa vào bất cứ thứ gì bạn giao cho người khác
|
|
242
|
+
dùng cho bất kỳ mục đích thương mại nào hoặc trong hoạt động kinh doanh
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
**Chỉ có hai nguồn hợp pháp: kho này và gói npm
|
|
246
|
+
[`@operatingtag/dsh-unclesam`](https://www.npmjs.com/package/@operatingtag/dsh-unclesam).** Một bản sao từ bất
|
|
247
|
+
kỳ nơi nào khác đều không có giấy phép, dù ai đã đưa cho bạn. Nếu bạn thấy phần mềm này được bán, người bán không
|
|
248
|
+
phải tác giả.
|
|
249
|
+
|
|
250
|
+
**Dùng thương mại, và quyền sửa đổi cùng phân phối, có được theo một giấy phép bằng văn bản riêng.** Hỏi Operating
|
|
251
|
+
Tag — bạn sẽ nhận được câu trả lời rõ ràng và một mức giá rõ ràng.
|
|
252
|
+
|
|
253
|
+
Tệp [LICENSE](LICENSE) là văn bản có hiệu lực, và nó mở đầu bằng cùng bản tóm tắt đó bằng tiếng Anh đơn giản.
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
Uncle Sam là một plugin độc lập. Không liên kết với DeepSeek, không được họ chứng thực hay hỗ trợ.
|
|
258
|
+
|
|
259
|
+
```
|
|
260
|
+
@operatingtag/dsh-unclesam v1.0.1
|
|
261
|
+
Tác giả Operating Tag
|
|
262
|
+
Giấy phép CC BY-NC-ND 4.0 — miễn phí để dùng, không được sửa, chia sẻ hay bán
|
|
263
|
+
```
|
package/README.zh.md
ADDED
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
[English](README.md) · [Español](README.es.md) · [Français](README.fr.md) · [Deutsch](README.de.md) · [Português](README.pt.md) · [Italiano](README.it.md) · [Türkçe](README.tr.md) · [한국어](README.ko.md) · [日本語](README.ja.md) · **简体中文** · [Русский](README.ru.md) · [Polski](README.pl.md) · [हिन्दी](README.hi.md) · [Nederlands](README.nl.md) · [Українська](README.uk.md) · [Tiếng Việt](README.vi.md) · [Bahasa Indonesia](README.id.md)
|
|
2
|
+
|
|
3
|
+
# Uncle Sam(山姆大叔)
|
|
4
|
+
|
|
5
|
+
**一个 DeepSeek Harness 提供方:不用按量计费的 API,而是通过你自己的浏览器、用你已有的网页账号来回答。**
|
|
6
|
+
|
|
7
|
+
**☕ [请我喝杯咖啡](https://revolut.me/operatingtag)** — 一个人、在夜里、没有任何资助地写出来。没有别的收入来源。一个星标或一份有用的缺陷报告,价值是一样的。
|
|
8
|
+
|
|
9
|
+
> **这个产品仍在持续开发中。请预期有 bug。**
|
|
10
|
+
>
|
|
11
|
+
> 它能跑、很快,也已经每天用了好几周 —— 但它一直在变,而且浏览器这条路依赖一个会在毫无预告的情况下
|
|
12
|
+
> 改动的网站。如果哪里坏了,一张截图加版本号,比一段描述有用得多。如果你要依赖它,就固定一个版本。
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
提供方 deepseek-web
|
|
16
|
+
模型 deepseek-chat · deepseek-chat-search · deepseek-reasoner · deepseek-reasoner-search
|
|
17
|
+
成本 每个 token 零费用 —— 用的是你浏览器里已经开着的那个订阅
|
|
18
|
+
状态 开发中 —— 请预期有 bug
|
|
19
|
+
实测 首个 token 约 1.9 秒 · 额外开销约 0.6 秒 · 一整轮约 2.5 秒
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
网页路线的回答会带 **🔴 Uncle Sam** 署名。这个名字是个玩笑,不是声明:它标记的是哪条路线回答的,而 API
|
|
23
|
+
的回答完全没有署名。你永远知道是谁回答的。
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## 它替你省下什么
|
|
28
|
+
|
|
29
|
+
API 按 token 计费,网页版不计费。这个插件把 `deepseek-web` 注册成模型提供方,每次调用都在真实浏览器里
|
|
30
|
+
操作 `chat.deepseek.com` 来回答 —— 页面干活,浏览器保存会话,没有任何东西被计量。
|
|
31
|
+
|
|
32
|
+
| | API 路线 | 网页路线 |
|
|
33
|
+
|---|---|---|
|
|
34
|
+
| 成本 | 按 token,永远 | 订阅之外不再花钱 |
|
|
35
|
+
| 速度 | 快 | 每轮约 2.5 秒(实测) |
|
|
36
|
+
| 工具调用 | 原生、可靠 | 模拟实现,能用但更弱 |
|
|
37
|
+
| 依赖 | API | 一个会毫无预告就变动的网站 |
|
|
38
|
+
|
|
39
|
+
**两条路线都会留着。** 模型选择器就是开关:平时用便宜的那条,需要可靠工具调用的任务再切到 API。
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## 安装
|
|
44
|
+
|
|
45
|
+
Uncle Sam 是 **DeepSeek Harness 的插件**。在 Harness 之外它什么都不做,因为它注册的是一个模型提供方、一条
|
|
46
|
+
宿主路由和两处界面插槽。
|
|
47
|
+
|
|
48
|
+
**要求**
|
|
49
|
+
|
|
50
|
+
| | |
|
|
51
|
+
|---|---|
|
|
52
|
+
| DeepSeek Harness | 任意带有插件管理器的近期版本 |
|
|
53
|
+
| 浏览器 | 推荐 Brave;没有 Brave 时自动使用 Edge |
|
|
54
|
+
| Node | 22 或更新 |
|
|
55
|
+
|
|
56
|
+
**从 npm 安装**
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
pnpm add @operatingtag/dsh-unclesam
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
**从这个仓库安装**
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
git clone https://github.com/operatingtag/dsh-unclesam
|
|
66
|
+
cd dsh-unclesam
|
|
67
|
+
pnpm install
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
然后把这行加进你的配置文件,让 Harness 加载它:
|
|
71
|
+
|
|
72
|
+
```yaml
|
|
73
|
+
# cordis.patch.yml
|
|
74
|
+
- insert:
|
|
75
|
+
- id: dsh-unclesam
|
|
76
|
+
name: '@operatingtag/dsh-unclesam'
|
|
77
|
+
config:
|
|
78
|
+
port: 9222
|
|
79
|
+
defaultModel: deepseek-chat-search
|
|
80
|
+
autoMinimise: true
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
**或者从文件夹安装:** 设置 → 插件 → 从本地路径安装,指向包含 `package.json` 的那个文件夹。
|
|
84
|
+
|
|
85
|
+
### 首次运行
|
|
86
|
+
|
|
87
|
+
点 **登录 / 打开对话**。浏览器会打开并**保持可见**,直到你在 chat.deepseek.com 登录完成。之后它会自己
|
|
88
|
+
最小化,你不会再看到它。会话保存在你的浏览器配置里,所以**插件不保存任何密码** —— 没有可泄露的东西。
|
|
89
|
+
|
|
90
|
+
随后你应该看到:
|
|
91
|
+
|
|
92
|
+
1. **设置 → Uncle Sam** —— 一个带状态行和登录按钮的页面。
|
|
93
|
+
2. **输入框下方** —— `● DeepSeek Harness` 或 `● Uncle Sam`,点击切换。
|
|
94
|
+
3. **模型列表** —— API 模型旁边的四个 `(web)` 模型。
|
|
95
|
+
|
|
96
|
+
### 卸载
|
|
97
|
+
|
|
98
|
+
设置 → 插件 → Uncle Sam → 卸载。除了你登录用的那个浏览器配置之外,不写任何东西。
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## API / 网页 开关
|
|
103
|
+
|
|
104
|
+
**模型选择器就是开关。** 没有第二个控件,因为一个也要选择模型的第二控件,等于同一个决定有两个真相来源。
|
|
105
|
+
|
|
106
|
+
| 选择这个模型 | 路线 | DeepThink | 搜索 |
|
|
107
|
+
|---|---|---|---|
|
|
108
|
+
| `DeepSeek Chat (web)` | 浏览器 | 关 | 关 |
|
|
109
|
+
| `DeepSeek Chat + Search (web)` | 浏览器 | 关 | **开** |
|
|
110
|
+
| `DeepSeek Reasoner (web)` | 浏览器 | **开** | 关 |
|
|
111
|
+
| `DeepSeek Reasoner + Search (web)` | 浏览器 | **开** | **开** |
|
|
112
|
+
| 任何不带 `(web)` 的模型 | API | — | — |
|
|
113
|
+
|
|
114
|
+
模型名旁边会显示 **WEB** 或 **API** 徽标,一眼就能看出当前走哪条路线。识别不了名字时,徽标什么都不显示
|
|
115
|
+
而不是去猜 —— 错误的徽标比没有徽标更糟。
|
|
116
|
+
|
|
117
|
+
你的选择在重启后仍然保留。**DeepThink** 是推理那一遍;**搜索** 让它去读实时网络。
|
|
118
|
+
|
|
119
|
+
### 搜索在对话里看得见
|
|
120
|
+
|
|
121
|
+
用搜索模型时,一轮会产生**两个块** —— 搜索用的查询、找到的来源,然后是用了它们的回答:
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
网页搜索 — “今天有什么科技新闻标题?”
|
|
125
|
+
来源 (4): yna.co.kr · fnnews.com · rthk.hk · sina.com.cn
|
|
126
|
+
链接: https://k.sina.com.cn/article_... http://www.21jingji.com/article_...
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
页面不会公开它内部输入的查询,所以引用的查询就是触发搜索的那条消息。来源和链接是在回答稳定之后从页面上
|
|
130
|
+
读出来的。因为来源只在最后才存在,**搜索轮会把内容攒起来一次性输出,而不是流式输出**;普通轮仍然一个
|
|
131
|
+
token 一个 token 地流。
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## 为什么用浏览器,而不是它们自己的 HTTP API
|
|
136
|
+
|
|
137
|
+
最直接的办法 —— 直接调 `chat.deepseek.com` 自己的 API —— 试过,放弃了。这个网站让每条消息都要过两道闸:
|
|
138
|
+
|
|
139
|
+
| 闸 | 含义 |
|
|
140
|
+
|---|---|
|
|
141
|
+
| `/api/v0/chat/create_pow_challenge` | 每条消息一次**工作量证明** |
|
|
142
|
+
| `challenges.cloudflare.com/turnstile` | 源站上的机器人校验 |
|
|
143
|
+
|
|
144
|
+
重新实现其中任何一个都是必输的:它们是混淆的,会变,而变化之后失败的样子跟网络故障一模一样。
|
|
145
|
+
**页面本身已经为自己的请求解决了这两道闸。**
|
|
146
|
+
|
|
147
|
+
所以适配器从来不跟网站讲 HTTP。它去驱动页面,其余交给页面。认证、工作量证明和 Turnstile 不再是我们的
|
|
148
|
+
问题,也不会脱离网站本身单独坏掉。
|
|
149
|
+
|
|
150
|
+
**已核实:** 对网站发一个普通的 `HEAD` 返回 `403`;走浏览器这条路则返回真正的回答。
|
|
151
|
+
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
## 老实说明的限制
|
|
155
|
+
|
|
156
|
+
**工具调用是模拟的。** 网页对话没有结构化的工具通道,所以工具是写在提示词里描述的,一次调用是从回答里
|
|
157
|
+
解析出一个 JSON 对象恢复出来的。它管用 —— 已核实 —— 但比原生工具调用弱:一个不理会指令的模型会用散文
|
|
158
|
+
回答,那一轮 Harness 就完全看不到工具使用。**重型智能体作业,API 路线更可靠。** 网页路线最适合对话、长
|
|
159
|
+
回答、子代理、上下文压缩,以及任何"必须以网页模型作答"的轮次。
|
|
160
|
+
|
|
161
|
+
**它依赖一个你控制不了的网站。** 页面形变,插件就必须跟着变。这就是本页顶部那条开发中的警告,不是客套。
|
|
162
|
+
|
|
163
|
+
**它与 DeepSeek 无关。** 没有他们的背书也没有他们的支持,也不给你任何针对他们服务的权利。你对该服务的
|
|
164
|
+
使用由他们的条款管。
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## 配置
|
|
169
|
+
|
|
170
|
+
`cordis.patch.yml` 里设置:
|
|
171
|
+
|
|
172
|
+
| 键 | 默认值 | 含义 |
|
|
173
|
+
|---|---|---|
|
|
174
|
+
| `port` | `9222` | 浏览器的调试端口 |
|
|
175
|
+
| `defaultModel` | `deepseek-chat-search` | 调用没指定模型时使用 |
|
|
176
|
+
| `showBrowser` | `true` | 工作时窗口是否可见 |
|
|
177
|
+
|
|
178
|
+
浏览器里必须有一个已登录的 `chat.deepseek.com` 会话。第一次调用时如果端口没开,它会用 **Default** 配置
|
|
179
|
+
启动 Brave。如果 Brave 已经在运行但*没有*调试端口,适配器无法连接,会明确说明,而不是默默失败。
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## 结构
|
|
184
|
+
|
|
185
|
+
```
|
|
186
|
+
index.js 适配器:Harness 的 StreamChunk ←→ 引擎
|
|
187
|
+
lib/engine.mjs 浏览器 + 页面:输入、发送、流式读取、等待稳定
|
|
188
|
+
lib/cdp.mjs Chrome DevTools Protocol 客户端,零依赖
|
|
189
|
+
lib/prompt.mjs 把消息和工具压平为一条消息;从回答里恢复工具调用
|
|
190
|
+
lib/savings.mjs 按 API 价格折算网页路线帮你省了多少
|
|
191
|
+
lib/i18n.mjs 面板用的 51 种语言
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
**没有任何依赖。** Node 24 自带 `WebSocket` 和 `fetch`,CDP 需要的就这些,所以 token 流从不离开宿主机
|
|
195
|
+
进程,每个增量也没有一次 IPC 往返。
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
## 支持
|
|
200
|
+
|
|
201
|
+
Uncle Sam 的存在就是为了让你不再按 token 付钱。如果它替你省了钱,而你也想看到下一个版本建在不会做到一半
|
|
202
|
+
就内存不够的硬件上:
|
|
203
|
+
|
|
204
|
+
**[☕ revolut.me/operatingtag](https://revolut.me/operatingtag)**
|
|
205
|
+
|
|
206
|
+
给仓库点个星标,或者报一个有用的 bug,价值是一样的。
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
## 许可
|
|
211
|
+
|
|
212
|
+
**CC BY-NC-ND 4.0** —— 知识共享 署名-非商业性使用-禁止演绎 4.0 国际。
|
|
213
|
+
Copyright (c) 2026 Darren T. Weldon,以 Operating Tag 名义发布。
|
|
214
|
+
|
|
215
|
+
**一句话说清全部约定:个人使用,免费安装、免费使用。不要改、不要传、不要卖、不要在公司里用。**
|
|
216
|
+
|
|
217
|
+
这不是开源,它也不假装是。
|
|
218
|
+
|
|
219
|
+
```
|
|
220
|
+
可以 安装并运行 · 个人、非商业地使用
|
|
221
|
+
阅读源码以理解它
|
|
222
|
+
|
|
223
|
+
不可以 修改、改编,或创作衍生作品
|
|
224
|
+
复制、分发、发布、镜像,或以任何方式提供给他人
|
|
225
|
+
上传到任何代码托管、注册表、网站、论坛或聊天
|
|
226
|
+
出售、转售、出租,或对本体或对它的访问收费
|
|
227
|
+
打包进任何你交付给别人的东西里
|
|
228
|
+
用于任何商业目的,或在经营活动中使用
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
**唯一两个正当来源是本仓库和 npm 包
|
|
232
|
+
[`@operatingtag/dsh-unclesam`](https://www.npmjs.com/package/@operatingtag/dsh-unclesam)。** 从别处拿到的
|
|
233
|
+
副本都没有授权,不管是谁给你的。如果你看到这个软件在卖,卖的人不是作者。
|
|
234
|
+
|
|
235
|
+
**商业使用,以及修改和分发的权利,另行提供书面许可。** 问 Operating Tag,你会得到一个明确的答复和一个
|
|
236
|
+
明确的价格。
|
|
237
|
+
|
|
238
|
+
以 [LICENSE](LICENSE) 文件为准,它的开头是用浅白英文写的同样内容。
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
Uncle Sam 是一个独立插件。与 DeepSeek 无关联,未获其背书,也未获其支持。
|
|
243
|
+
|
|
244
|
+
```
|
|
245
|
+
@operatingtag/dsh-unclesam v1.0.1
|
|
246
|
+
作者 Operating Tag
|
|
247
|
+
许可 CC BY-NC-ND 4.0 —— 可免费使用,不可修改、共享或出售
|
|
248
|
+
```
|
package/index.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* @file index.js
|
|
7
7
|
* @version 3.9.11
|
|
8
8
|
* @author Operating Tag (@operatingtag)
|
|
9
|
-
* @license CC-BY-NC-ND-4.0
|
|
9
|
+
* @license CC-BY-NC-ND-4.0
|
|
10
10
|
*
|
|
11
11
|
* WHY THIS PROVIDER EXISTS
|
|
12
12
|
* A harness can only talk to a provider it has an adapter for, and an adapter is allowed to be slow
|
|
@@ -536,8 +536,11 @@ export function apply(ctx, config = {}) {
|
|
|
536
536
|
// The tool preamble on its own, so a person can see exactly what the page was told about tools
|
|
537
537
|
// without hunting for it inside the message. A prompt without a blank line has no separate
|
|
538
538
|
// preamble, so it is reported in full rather than with its last character cut off.
|
|
539
|
+
//
|
|
540
|
+
// The marker is "tools available", not the old "Tools: " - the preamble no longer names any tool,
|
|
541
|
+
// so it had to stop claiming to be a list.
|
|
539
542
|
preamble:
|
|
540
|
-
prompt.text.includes('
|
|
543
|
+
prompt.text.includes('tools available')
|
|
541
544
|
? prompt.text.slice(0, Math.max(0, prompt.text.indexOf('\n\n')))
|
|
542
545
|
: prompt.text.slice(0, 400),
|
|
543
546
|
};
|
package/lib/prompt.mjs
CHANGED
|
@@ -106,59 +106,39 @@ export function isOnlyGreeting(text) {
|
|
|
106
106
|
}
|
|
107
107
|
|
|
108
108
|
/**
|
|
109
|
-
* Describe the available tools
|
|
109
|
+
* Describe the available tools WITHOUT NAMING THEM.
|
|
110
110
|
*
|
|
111
|
-
*
|
|
112
|
-
*
|
|
113
|
-
*
|
|
114
|
-
*
|
|
111
|
+
* WHY NO NAMES
|
|
112
|
+
* Every word typed into this box is sent to a third-party website. The earlier version wrote the first
|
|
113
|
+
* twelve tool names into that box on every turn, and this session carries 283 - so a chat turn told
|
|
114
|
+
* chat.deepseek.com the name of every tool installed on the machine. Seen on screen by the person using
|
|
115
|
+
* it: `demergo_brave, demergo_click, cordis_inspect_query, +282 more` sitting above their own sentence.
|
|
116
|
+
*
|
|
117
|
+
* That is an inventory of a private machine leaving the machine. The model does not need it. It needs to
|
|
118
|
+
* know that tools EXIST and how to call one; the exact name it must call arrives in the prompt whenever
|
|
119
|
+
* a tool is genuinely being offered for that turn. Naming all 283 bought nothing and cost privacy.
|
|
120
|
+
*
|
|
121
|
+
* WHAT THIS GIVES UP, HONESTLY
|
|
122
|
+
* A model can no longer browse the catalogue and pick a tool it was not told about. On a turn where the
|
|
123
|
+
* harness attaches tools, their names still have to be sent - a model cannot call a tool it was never
|
|
124
|
+
* told exists. This function only covers the turn where no particular tool is being offered.
|
|
115
125
|
*/
|
|
116
126
|
export function toolPreamble(tools) {
|
|
117
127
|
if (!tools?.length) return '';
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
*
|
|
121
|
-
* The first version carried a "NEVER do this" list plus a schema dump per tool. The second cut that to
|
|
122
|
-
* descriptions - which was fine for three tools and produced ONE ENORMOUS LINE for this session's thirty,
|
|
123
|
-
* because every description was still there. Recorded on screen: a paragraph of tool names and blurbs
|
|
124
|
-
* sitting above the person's own message, which is exactly the "gobbly goop" complaint.
|
|
125
|
-
*
|
|
126
|
-
* So: names only. A model does not need the description to call a tool - it needs to know the tool
|
|
127
|
-
* exists and what it is called. Arguments come from understanding, and the harness validates them.
|
|
128
|
-
*/
|
|
129
|
-
const names = tools.map((t) => t.name);
|
|
128
|
+
|
|
129
|
+
const count = tools.length;
|
|
130
130
|
|
|
131
131
|
/**
|
|
132
|
-
* One
|
|
133
|
-
*
|
|
134
|
-
* The first version printed a dozen names AND a two-line call format above every single message. What
|
|
135
|
-
* the person saw in their own chat box was a wall of tool names before their own sentence - reported,
|
|
136
|
-
* correctly, as looking broken.
|
|
132
|
+
* One short clause.
|
|
137
133
|
*
|
|
138
|
-
* The
|
|
139
|
-
*
|
|
140
|
-
*
|
|
134
|
+
* The person's own sentence must stay visible and first in their mind; scaffolding above it reads as
|
|
135
|
+
* something having broken. So: a count, the call format, and nothing else. The call format has to stay,
|
|
136
|
+
* because without it the model answers in prose instead of emitting a call when one is asked for.
|
|
141
137
|
*
|
|
142
|
-
* The full text is still
|
|
143
|
-
*
|
|
138
|
+
* The full text is still shown in the panel's "last thing sent" view, which is where a person looks when
|
|
139
|
+
* something is wrong.
|
|
144
140
|
*/
|
|
145
|
-
|
|
146
|
-
const TAIL = ' · to call one reply only with {"tool":"name","arguments":{}}';
|
|
147
|
-
const MAX_VISIBLE_NAMES = 12;
|
|
148
|
-
const budget = MAX_TOOL_PREAMBLE_CHARS - HEAD.length - TAIL.length;
|
|
149
|
-
const kept = [];
|
|
150
|
-
let used = 0;
|
|
151
|
-
for (const name of names) {
|
|
152
|
-
if (kept.length >= MAX_VISIBLE_NAMES) break;
|
|
153
|
-
const add = (kept.length ? 2 : 0) + name.length;
|
|
154
|
-
if (used + add > budget) break;
|
|
155
|
-
kept.push(name);
|
|
156
|
-
used += add;
|
|
157
|
-
}
|
|
158
|
-
const omitted = names.length - kept.length;
|
|
159
|
-
const list = kept.join(', ') + (omitted > 0 ? `, +${omitted} more` : '');
|
|
160
|
-
|
|
161
|
-
return `${HEAD}${list}${TAIL}`;
|
|
141
|
+
return `[${count} tools available · to call one reply only with {"tool":"name","arguments":{}}]`;
|
|
162
142
|
}
|
|
163
143
|
|
|
164
144
|
/**
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@operatingtag/dsh-unclesam",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Uncle Sam — answers through chat.deepseek.com in a real browser tab instead of the metered API. Switch between the API and the web account from the composer; web replies are signed so you always know which route answered.",
|
|
@@ -37,7 +37,23 @@
|
|
|
37
37
|
"install.cmd",
|
|
38
38
|
"lib/savings.mjs",
|
|
39
39
|
"lib/i18n.mjs",
|
|
40
|
-
"lib/prefs.mjs"
|
|
40
|
+
"lib/prefs.mjs",
|
|
41
|
+
"README.es.md",
|
|
42
|
+
"README.fr.md",
|
|
43
|
+
"README.de.md",
|
|
44
|
+
"README.pt.md",
|
|
45
|
+
"README.ja.md",
|
|
46
|
+
"README.zh.md",
|
|
47
|
+
"README.ru.md",
|
|
48
|
+
"README.it.md",
|
|
49
|
+
"README.tr.md",
|
|
50
|
+
"README.ko.md",
|
|
51
|
+
"README.pl.md",
|
|
52
|
+
"README.hi.md",
|
|
53
|
+
"README.nl.md",
|
|
54
|
+
"README.uk.md",
|
|
55
|
+
"README.vi.md",
|
|
56
|
+
"README.id.md"
|
|
41
57
|
],
|
|
42
58
|
"engines": {
|
|
43
59
|
"node": ">=22"
|