@musnows/scriverse 0.5.3 → 0.5.5

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/README.md CHANGED
@@ -41,7 +41,7 @@
41
41
  - 大纲与伏笔:维护章节目标、冲突、转折和伏笔的埋设、提醒与回收。
42
42
  - AI 创作助手:支持 Markdown 和流式输出,可引用章节行、附加角色与设定上下文。
43
43
  - AI 任务:结构分析、章节分析、角色抽取、时间线分析、关系分析和一致性检查。
44
- - 供应商管理:兼容 OpenAI Chat Completions 协议,可配置模型、最大输出 Token、并发数和 RPM。
44
+ - 供应商管理:兼容 OpenAI Chat Completions 与 Anthropic Messages 协议,可配置模型、最大输出 Token、并发数和 RPM。
45
45
  - 安全导出:支持 JSON、TXT 和 Markdown,导出内容不包含 AI 密钥。
46
46
 
47
47
  ## 技术栈
@@ -141,7 +141,7 @@ npm start
141
141
  配置前请先阅读 [AI 供应商兼容性与配置指南](docs/AI-PROVIDER-COMPATIBILITY.md),其中列出了已验证的服务商、基础地址、模型标识符和已知差异。
142
142
 
143
143
  1. 启动项目后,点击顶部“AI 管理”进入平台级配置。
144
- 2. 新建兼容 OpenAI Chat Completions 的供应商,填写基础地址、API 密钥、并发数、RPM 与最大输出 Token。
144
+ 2. 新建兼容 OpenAI Chat Completions 或 Anthropic Messages 的供应商,选择协议并填写基础地址、API 密钥、并发数、RPM 与最大输出 Token。
145
145
  3. 为模型填写其支持的上下文总量(Token),再添加模型。
146
146
  4. 在平台页设置全局系统提示词;它会追加在内置提示词之后。
147
147
  5. 打开一本作品,在“更多 → AI 设置”中设置该书的追加系统提示词和任务默认模型;书籍提示词会追加在全局提示词之后。
@@ -216,7 +216,8 @@ curl http://127.0.0.1:13210/api/health
216
216
  "data": {
217
217
  "status": "ok",
218
218
  "version": "0.3.3",
219
- "protocol": "openai-chat-completions"
219
+ "protocol": "openai-chat-completions",
220
+ "protocols": ["openai-chat-completions", "anthropic-messages"]
220
221
  }
221
222
  }
222
223
  ```
@@ -0,0 +1,216 @@
1
+ import { normalizeBaseUrl } from "./utils.js";
2
+ export const AI_PROVIDER_PROTOCOLS = ["openai-chat-completions", "anthropic-messages"];
3
+ export function normalizeProviderBaseUrl(value) {
4
+ return normalizeBaseUrl(value).replace(/\/messages$/u, "");
5
+ }
6
+ function appendVersionedResource(baseUrl, resource) {
7
+ const normalized = normalizeProviderBaseUrl(baseUrl);
8
+ return /\/v1$/u.test(normalized) ? `${normalized}/${resource}` : `${normalized}/v1/${resource}`;
9
+ }
10
+ export function providerCompletionEndpoint(baseUrl, protocol) {
11
+ const normalized = normalizeProviderBaseUrl(baseUrl);
12
+ return protocol === "anthropic-messages"
13
+ ? appendVersionedResource(normalized, "messages")
14
+ : `${normalized}/chat/completions`;
15
+ }
16
+ export function providerModelEndpoints(baseUrl, protocol) {
17
+ const normalized = normalizeProviderBaseUrl(baseUrl);
18
+ if (protocol === "openai-chat-completions")
19
+ return [`${normalized}/models`];
20
+ const primary = appendVersionedResource(normalized, "models");
21
+ const root = new URL("/v1/models", normalized).toString();
22
+ return primary === root ? [primary] : [primary, root];
23
+ }
24
+ export function providerRequestHeaders(protocol, apiKey, accept) {
25
+ return {
26
+ Authorization: `Bearer ${apiKey}`,
27
+ ...(protocol === "anthropic-messages" ? { "x-api-key": apiKey, "anthropic-version": "2023-06-01" } : {}),
28
+ "Content-Type": "application/json",
29
+ Accept: accept
30
+ };
31
+ }
32
+ function textContent(value) {
33
+ return typeof value === "string" && value.length > 0 ? [{ type: "text", text: value }] : [];
34
+ }
35
+ function parsedToolInput(value) {
36
+ if (value && typeof value === "object" && !Array.isArray(value))
37
+ return value;
38
+ if (typeof value !== "string")
39
+ return {};
40
+ try {
41
+ const parsed = JSON.parse(value);
42
+ return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : {};
43
+ }
44
+ catch {
45
+ return {};
46
+ }
47
+ }
48
+ function anthropicAssistantContent(message) {
49
+ if (Array.isArray(message.anthropic_content) && message.anthropic_content.length > 0) {
50
+ return structuredClone(message.anthropic_content);
51
+ }
52
+ return [
53
+ ...textContent(message.content),
54
+ ...message.tool_calls.map((toolCall) => ({
55
+ type: "tool_use",
56
+ id: toolCall.id,
57
+ name: toolCall.function.name,
58
+ input: parsedToolInput(toolCall.function.arguments)
59
+ }))
60
+ ];
61
+ }
62
+ function anthropicToolResult(message) {
63
+ let isError = false;
64
+ try {
65
+ const result = JSON.parse(message.content);
66
+ isError = result.ok === false;
67
+ }
68
+ catch {
69
+ isError = false;
70
+ }
71
+ return {
72
+ type: "tool_result",
73
+ tool_use_id: message.tool_call_id,
74
+ content: message.content,
75
+ ...(isError ? { is_error: true } : {})
76
+ };
77
+ }
78
+ function anthropicMessages(messages) {
79
+ const system = messages
80
+ .filter((message) => message.role === "system")
81
+ .map((message) => message.content)
82
+ .filter(Boolean)
83
+ .join("\n\n");
84
+ const output = [];
85
+ const append = (role, content) => {
86
+ if (content.length === 0)
87
+ return;
88
+ const previous = output.at(-1);
89
+ if (previous?.role === role)
90
+ previous.content.push(...content);
91
+ else
92
+ output.push({ role, content });
93
+ };
94
+ for (const message of messages) {
95
+ if (message.role === "system")
96
+ continue;
97
+ if (message.role === "tool") {
98
+ append("user", [anthropicToolResult(message)]);
99
+ continue;
100
+ }
101
+ if (message.role === "assistant" && "tool_calls" in message) {
102
+ append("assistant", anthropicAssistantContent(message));
103
+ continue;
104
+ }
105
+ append(message.role, textContent(message.content));
106
+ }
107
+ return { ...(system ? { system } : {}), messages: output };
108
+ }
109
+ function anthropicTools(tools) {
110
+ return tools.flatMap((tool) => {
111
+ const fn = tool.function && typeof tool.function === "object" && !Array.isArray(tool.function)
112
+ ? tool.function
113
+ : null;
114
+ if (!fn || typeof fn.name !== "string")
115
+ return [];
116
+ return [{
117
+ name: fn.name,
118
+ ...(typeof fn.description === "string" ? { description: fn.description } : {}),
119
+ input_schema: fn.parameters && typeof fn.parameters === "object" && !Array.isArray(fn.parameters)
120
+ ? fn.parameters
121
+ : { type: "object", properties: {} }
122
+ }];
123
+ });
124
+ }
125
+ export function buildCompletionRequestBody(input) {
126
+ const tools = input.toolChoice === "auto" ? input.tools ?? [] : [];
127
+ if (input.protocol === "openai-chat-completions") {
128
+ return {
129
+ model: input.model,
130
+ messages: input.messages,
131
+ ...input.parameters,
132
+ ...(tools.length > 0 ? { tools, tool_choice: "auto" } : {}),
133
+ ...(input.stream ? { stream: true, stream_options: { include_usage: true } } : {})
134
+ };
135
+ }
136
+ const translated = anthropicMessages(input.messages);
137
+ const parameters = Object.fromEntries(Object.entries(input.parameters)
138
+ .filter(([key]) => ["temperature", "top_p", "max_tokens", "thinking"].includes(key)));
139
+ return {
140
+ model: input.model,
141
+ ...translated,
142
+ ...parameters,
143
+ ...(tools.length > 0 ? { tools: anthropicTools(tools), tool_choice: { type: "auto" } } : {}),
144
+ ...(input.stream ? { stream: true } : {})
145
+ };
146
+ }
147
+ function replayableAnthropicBlock(value) {
148
+ if (!value || typeof value !== "object" || Array.isArray(value))
149
+ return null;
150
+ const block = value;
151
+ if (block.type === "text" && typeof block.text === "string")
152
+ return { type: "text", text: block.text };
153
+ if (block.type === "thinking" && typeof block.thinking === "string" && typeof block.signature === "string") {
154
+ return { type: "thinking", thinking: block.thinking, signature: block.signature };
155
+ }
156
+ if (block.type === "redacted_thinking" && typeof block.data === "string") {
157
+ return { type: "redacted_thinking", data: block.data };
158
+ }
159
+ if (block.type === "tool_use" && typeof block.id === "string" && typeof block.name === "string") {
160
+ return { type: "tool_use", id: block.id, name: block.name, input: parsedToolInput(block.input) };
161
+ }
162
+ return null;
163
+ }
164
+ function anthropicFinishReason(value) {
165
+ if (value === "max_tokens")
166
+ return "length";
167
+ return typeof value === "string" ? value : null;
168
+ }
169
+ export function parseCompletionPayload(protocol, value) {
170
+ if (protocol === "openai-chat-completions") {
171
+ return value && typeof value === "object" && !Array.isArray(value) ? value : {};
172
+ }
173
+ const response = value && typeof value === "object" && !Array.isArray(value) ? value : {};
174
+ const content = Array.isArray(response.content) ? response.content : [];
175
+ const replay = content.map(replayableAnthropicBlock).filter((block) => block !== null);
176
+ const text = content.flatMap((value) => {
177
+ const block = value && typeof value === "object" && !Array.isArray(value) ? value : {};
178
+ return block.type === "text" && typeof block.text === "string" ? [block.text] : [];
179
+ }).join("");
180
+ const reasoning = content.flatMap((value) => {
181
+ const block = value && typeof value === "object" && !Array.isArray(value) ? value : {};
182
+ if (block.type === "thinking" && typeof block.thinking === "string")
183
+ return [block.thinking];
184
+ if (block.type === "text" && typeof block.thinking === "string")
185
+ return [block.thinking];
186
+ return [];
187
+ }).join("");
188
+ const toolCalls = content.flatMap((value) => {
189
+ const block = value && typeof value === "object" && !Array.isArray(value) ? value : {};
190
+ if (block.type !== "tool_use" || typeof block.id !== "string" || typeof block.name !== "string")
191
+ return [];
192
+ return [{
193
+ id: block.id,
194
+ type: "function",
195
+ function: {
196
+ name: block.name,
197
+ arguments: parsedToolInput(block.input)
198
+ }
199
+ }];
200
+ });
201
+ return {
202
+ ...(response.usage && typeof response.usage === "object" && !Array.isArray(response.usage)
203
+ ? { usage: response.usage }
204
+ : {}),
205
+ choices: [{
206
+ finish_reason: anthropicFinishReason(response.stop_reason),
207
+ message: {
208
+ content: text || null,
209
+ reasoning_content: reasoning || null,
210
+ tool_calls: toolCalls,
211
+ anthropic_content: replay
212
+ }
213
+ }]
214
+ };
215
+ }
216
+ //# sourceMappingURL=ai-protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-protocol.js","sourceRoot":"","sources":["../src/ai-protocol.ts"],"names":[],"mappings":"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"}