@zimtsui/brainswitch 0.0.16 → 0.0.17

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.
Files changed (53) hide show
  1. package/README.md +32 -23
  2. package/build/adaptor.d.ts +1 -1
  3. package/build/adaptor.js +10 -6
  4. package/build/adaptor.js.map +1 -1
  5. package/build/api-types/{aliyun-stream.d.ts → aliyun.d.ts} +1 -4
  6. package/build/api-types/{aliyun-stream.js → aliyun.js} +6 -9
  7. package/build/api-types/aliyun.js.map +1 -0
  8. package/build/api-types/anthropic.d.ts +43 -0
  9. package/build/api-types/anthropic.js +288 -0
  10. package/build/api-types/anthropic.js.map +1 -0
  11. package/build/api-types/base.d.ts +3 -2
  12. package/build/api-types/base.js +8 -8
  13. package/build/api-types/base.js.map +1 -1
  14. package/build/api-types/google-base.d.ts +1 -0
  15. package/build/api-types/google-base.js +4 -1
  16. package/build/api-types/google-base.js.map +1 -1
  17. package/build/api-types/google-rest.d.ts +2 -3
  18. package/build/api-types/google-rest.js +10 -11
  19. package/build/api-types/google-rest.js.map +1 -1
  20. package/build/api-types/minimax.d.ts +34 -0
  21. package/build/api-types/minimax.js +49 -0
  22. package/build/api-types/minimax.js.map +1 -0
  23. package/build/api-types/openai-chatcompletions-base.d.ts +4 -1
  24. package/build/api-types/openai-chatcompletions-base.js +21 -2
  25. package/build/api-types/openai-chatcompletions-base.js.map +1 -1
  26. package/build/api-types/openai-chatcompletions-monolith-base.d.ts +2 -3
  27. package/build/api-types/openai-chatcompletions-monolith-base.js +19 -28
  28. package/build/api-types/openai-chatcompletions-monolith-base.js.map +1 -1
  29. package/build/api-types/openai-chatcompletions-stream-base.d.ts +4 -3
  30. package/build/api-types/openai-chatcompletions-stream-base.js +128 -52
  31. package/build/api-types/openai-chatcompletions-stream-base.js.map +1 -1
  32. package/build/api-types/openai-chatcompletions.d.ts +0 -3
  33. package/build/api-types/openai-chatcompletions.js +0 -5
  34. package/build/api-types/openai-chatcompletions.js.map +1 -1
  35. package/build/api-types/openai-responses.d.ts +4 -3
  36. package/build/api-types/openai-responses.js +27 -11
  37. package/build/api-types/openai-responses.js.map +1 -1
  38. package/build/api-types/openrouter-monolith.d.ts +8 -5
  39. package/build/api-types/openrouter-monolith.js +12 -19
  40. package/build/api-types/openrouter-monolith.js.map +1 -1
  41. package/build/api-types/openrouter-stream.d.ts +5 -6
  42. package/build/api-types/openrouter-stream.js +8 -15
  43. package/build/api-types/openrouter-stream.js.map +1 -1
  44. package/build/config.d.ts +4 -4
  45. package/build/endpoint-spec.d.ts +4 -4
  46. package/build/endpoint-spec.js +5 -4
  47. package/build/endpoint-spec.js.map +1 -1
  48. package/build/engine.d.ts +2 -1
  49. package/build/session.d.ts +2 -0
  50. package/build/session.js.map +1 -1
  51. package/build/tsconfig.tsbuildinfo +1 -1
  52. package/package.json +2 -1
  53. package/build/api-types/aliyun-stream.js.map +0 -1
package/README.md CHANGED
@@ -8,17 +8,18 @@ Brainswitch 是一个为 AI 工作流设计的 LLM 推理 API 适配器,支持
8
8
 
9
9
  ## Motivation
10
10
 
11
- 大多数 LLM 推理服务商不支持[严格函数调用](https://platform.openai.com/docs/guides/function-calling#strict-mode),在 AI 批处理工作流中难以达到生产级的可靠性。如果仅使用 OpenAI 等支持严格函数调用的服务商,那么可选的模型型号会大幅受限。
11
+ 大多数 LLM [聊天模板](https://huggingface.co/docs/transformers/en/chat_templating) ChatML 原生不支持[严格函数调用](https://platform.openai.com/docs/guides/function-calling#strict-mode),在批处理 AI 工作流中难以达到生产级可靠性。如果仅使用 OpenAI 等支持严格函数调用的服务商,那么可选的模型型号会大幅受限。
12
12
 
13
- Brainswitch 支持在一次会话中途切换模型并保持对话上下文,包括 OpenAI、Google 的深度思考模型的加密思考内容。有了 Brainswitch 就可以在会话的大量推理阶段使用最合适的模型生成自然语言结果,在最后的总结阶段切换成支持严格函数调用的模型进行结构化提交。
13
+ Brainswitch 支持在一次会话中途切换模型并保持对话上下文,包括 OpenAI、Google、Anthropic 的深度思考模型[交替思考](https://platform.claude.com/docs/en/build-with-claude/extended-thinking#interleaved-thinking)的加密思考内容。有了 Brainswitch 就可以在会话的大量推理阶段使用最合适的模型生成自然语言结果,在最后的总结阶段切换成支持严格函数调用的模型进行结构化提交。
14
14
 
15
15
  ## 支持服务商 API 类型
16
16
 
17
- - OpenAI Chat Completions
18
- - OpenAI Responses
19
- - Google
20
- - 百炼/火山引擎 OpenAI 兼容
21
- - OpenRouter
17
+ - OpenAI Chat Completions
18
+ - OpenAI Responses
19
+ - Google
20
+ - 百炼
21
+ - OpenRouter
22
+ - Anthropic
22
23
 
23
24
  ## 安装
24
25
 
@@ -33,9 +34,9 @@ npm install @zimtsui/brainswitch
33
34
  - `Session`:会话状态。
34
35
  - `InferenceContext`:工作流环境,包含 [TypeLog](https://github.com/zimtsui/typelog) Logger、`AbortSignal`、用户防止并发过载的[读写锁](https://github.com/zimtsui/coroutine-locks)。
35
36
  - `Engine`:推理引擎,从一个会话状态生成下一个会话状态。
36
- - `Endpoint`:代表一家服务商的一个个模型的 API 端点。
37
+ - `Endpoint`:代表一家服务商的一个模型的 API 端点。
37
38
  - `Adaptor`:Engine 工厂。
38
- - `RoleMessage`:三类角色消息 `Developer`、`User`、`AI`,消息由 `Text` 与 `Function.Call/Response` 片段组成。
39
+ - `RoleMessage`:三类角色消息 `Developer`、`User`、`AI`,消息由 `Text/Function.Call/Response` 片段组成。
39
40
  - `Function.Declaration.Map`:函数工具声明集合,使用 [JSON Schema](https://json-schema.org/) 描述函数参数。
40
41
 
41
42
  ## 配置
@@ -48,23 +49,31 @@ export type Config = {
48
49
  apiKey: string;
49
50
  model: string;
50
51
  name: string;
51
- apiType: 'openai-chatcompletions' | 'openai-responses' | 'google' | 'qwen' | 'openrouter-monolith' | 'openrouter-stream' | 'huggingface-cerebras-qwen3-thinking';
52
+ apiType:
53
+ | 'openai-chatcompletions'
54
+ | 'openai-responses'
55
+ | 'google'
56
+ | 'aliyun'
57
+ | 'openrouter-monolith'
58
+ | 'openrouter-stream'
59
+ | 'anthropic'
60
+ ;
52
61
  proxy?: string;
53
- inputPrice?: number; // 每百万输入 Token 人民币成本
54
- outputPrice?: number; // 每百万输出 Token 人民币成本
55
- cachedPrice?: number; // 每百万缓存命中 Token 人民币成本
56
- customOptions?: Record<string, unknown>; // 直通服务商的自定义参数
57
- rpm?: number; // 每分钟请求次数上限
58
- timeout?: number; // 单次请求超时(毫秒)
59
- tokenLimit?: number; // 单次请求 Token 上限
60
- }>;
62
+ inputPrice?: number; // CNY per MToken
63
+ outputPrice?: number; // CNY per MToken
64
+ cachePrice?: number; // CNY per MToken
65
+ rpm?: number; // Requests per minute
66
+ timeout?: number; // Time limit in milliseconds
67
+ maxTokens?: number; // Maximum number of generated tokens
68
+ additionalOptions?: Record<string, unknown>;
69
+ };
61
70
  };
62
71
  }
63
72
  ```
64
73
 
65
74
  ### 计费说明
66
75
 
67
- `inputPrice`/`outputPrice`/`cachedPrice` 的单位均为「人民币每百万 Token」。OpenRouter 的成本会自动按服务器返回的 USD 成本并使用固定汇率(源码中默认 8)换算为 CNY 记账。
76
+ OpenRouter 的成本会自动按服务器返回的美元成本并使用固定汇率(1 USD = 8 CNY)换算为人民币记账。
68
77
 
69
78
  ## 快速上手
70
79
 
@@ -77,7 +86,7 @@ import { RWLock } from '@zimtsui/coroutine-locks';
77
86
  import { Channel } from '@zimtsui/typelog';
78
87
  import * as Presets from '@zimtsui/typelog/presets';
79
88
 
80
- // 配置
89
+ // 配置推理服务商 API 接入点
81
90
  const config: Config = {
82
91
  brainswitch: {
83
92
  endpoints: {
@@ -88,7 +97,7 @@ const config: Config = {
88
97
  apiKey: process.env.OPENAI_API_KEY!,
89
98
  model: 'gpt-4o-mini',
90
99
  inputPrice: 5, outputPrice: 15, cachedPrice: 1,
91
- rpm: 3000, tpm: 1_000_000, timeout: 60_000,
100
+ rpm: 3000, timeout: 60_000,
92
101
  },
93
102
  'o4-mini': {
94
103
  name: 'o4 mini',
@@ -128,6 +137,7 @@ const fdm = {
128
137
  type fdm = typeof fdm;
129
138
  type fdu = Function.Declaration.From<fdm>;
130
139
 
140
+ // 实现函数工具
131
141
  export class Submission extends Error {
132
142
  public constructor(public weather: string, public advice: string) {
133
143
  super(undefined);
@@ -135,7 +145,6 @@ export class Submission extends Error {
135
145
  }
136
146
  const fnm: Function.Map<fdm> = {
137
147
  async get_weather({ city, unit }) {
138
- // 实际项目中此处调用真实 API,这里仅示例
139
148
  const data = { city, unit: unit ?? 'C', temperature: 26, sky: 'sunny' };
140
149
  return JSON.stringify(data);
141
150
  },
@@ -156,7 +165,7 @@ const ctx: InferenceContext = {
156
165
  // 创建会话
157
166
  const session: Session<fdu> = {
158
167
  developerMessage: RoleMessage.Developer.create([
159
- RoleMessage.Part.Text.create('你的工作是为用户查询天气,并给出穿衣建议。'),
168
+ RoleMessage.Part.Text.create('你的工作是为用户查询天气,并给出穿衣建议。调用工具提交最终结果'),
160
169
  ]),
161
170
  chatMessages: [
162
171
  RoleMessage.User.create([ RoleMessage.Part.Text.create('请查询现在北京的天气,并给穿衣建议。') ]),
@@ -8,5 +8,5 @@ export declare class Adaptor {
8
8
  protected constructor(config: Config);
9
9
  private throttles;
10
10
  getThrottle(endpointId: string): Throttle;
11
- makeEngine<fdm extends Function.Declaration.Map = {}>(endpoint: string, functionDeclarationMap: fdm, functionCallMode?: Function.ToolChoice<fdm>): Engine<Function.Declaration.From<fdm>>;
11
+ makeEngine<fdm extends Function.Declaration.Map = {}>(endpoint: string, functionDeclarationMap: fdm, toolChoice?: Function.ToolChoice<fdm>, parallelFunctionCall?: boolean): Engine<Function.Declaration.From<fdm>>;
12
12
  }
package/build/adaptor.js CHANGED
@@ -2,13 +2,14 @@ import { Config } from '#config';
2
2
  import { Function } from "./function.js";
3
3
  import {} from "./engine.js";
4
4
  import assert from 'node:assert';
5
+ import { Throttle } from "./throttle.js";
5
6
  import { OpenAIChatCompletionsEngine } from "./api-types/openai-chatcompletions.js";
6
7
  import { GoogleRestfulEngine } from "./api-types/google-rest.js";
7
8
  import { OpenRouterMonolithEngine } from "./api-types/openrouter-monolith.js";
8
9
  import { OpenRouterStreamEngine } from "./api-types/openrouter-stream.js";
9
- import { AliyunStreamEngine } from "./api-types/aliyun-stream.js";
10
+ import { AliyunEngine } from "./api-types/aliyun.js";
10
11
  import { OpenAIResponsesEngine } from "./api-types/openai-responses.js";
11
- import { Throttle } from "./throttle.js";
12
+ import { AnthropicEngine } from "./api-types/anthropic.js";
12
13
  export class Adaptor {
13
14
  config;
14
15
  static create(config) {
@@ -29,14 +30,15 @@ export class Adaptor {
29
30
  this.throttles.get(baseUrl).set(model, new Throttle(rpm));
30
31
  return this.throttles.get(baseUrl).get(model);
31
32
  }
32
- makeEngine(endpoint, functionDeclarationMap, functionCallMode) {
33
+ makeEngine(endpoint, functionDeclarationMap, toolChoice, parallelFunctionCall) {
33
34
  assert(endpoint in this.config.brainswitch.endpoints);
34
35
  const endpointSpec = this.config.brainswitch.endpoints[endpoint];
35
36
  const throttle = this.getThrottle(endpoint);
36
37
  const options = {
37
38
  ...endpointSpec,
38
39
  functionDeclarationMap,
39
- functionCallMode,
40
+ toolChoice,
41
+ parallelFunctionCall,
40
42
  throttle,
41
43
  };
42
44
  if (endpointSpec.apiType === 'openai-responses')
@@ -45,12 +47,14 @@ export class Adaptor {
45
47
  return OpenAIChatCompletionsEngine.create(options);
46
48
  else if (endpointSpec.apiType === 'google')
47
49
  return GoogleRestfulEngine.create(options);
48
- else if (endpointSpec.apiType === 'aliyun-stream')
49
- return AliyunStreamEngine.create(options);
50
+ else if (endpointSpec.apiType === 'aliyun')
51
+ return AliyunEngine.create(options);
50
52
  else if (endpointSpec.apiType === 'openrouter-monolith')
51
53
  return OpenRouterMonolithEngine.create(options);
52
54
  else if (endpointSpec.apiType === 'openrouter-stream')
53
55
  return OpenRouterStreamEngine.create(options);
56
+ else if (endpointSpec.apiType === 'anthropic')
57
+ return AnthropicEngine.create(options);
54
58
  else
55
59
  throw new Error();
56
60
  }
@@ -1 +1 @@
1
- {"version":3,"file":"adaptor.js","sourceRoot":"","sources":["../src/adaptor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"adaptor.js","sourceRoot":"","sources":["../src/adaptor.ts"],"names":[],"mappings":"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"}
@@ -2,15 +2,12 @@ import type OpenAI from 'openai';
2
2
  import { type Engine } from '../engine.ts';
3
3
  import { Function } from '../function.ts';
4
4
  import { OpenAIChatCompletionsStreamEngineBase } from './openai-chatcompletions-stream-base.ts';
5
- import { type InferenceContext } from '../inference-context.ts';
6
- import { type Session, type RoleMessage } from '../session.ts';
7
- export declare namespace AliyunStreamEngine {
5
+ export declare namespace AliyunEngine {
8
6
  interface ChatCompletionChunkChoiceDelta extends OpenAI.ChatCompletionChunk.Choice.Delta {
9
7
  reasoning_content?: string;
10
8
  }
11
9
  function create<fdm extends Function.Declaration.Map = never>(options: Engine.Options<fdm>): Engine<Function.Declaration.From<fdm>>;
12
10
  class Constructor<in out fdm extends Function.Declaration.Map = {}> extends OpenAIChatCompletionsStreamEngineBase<fdm> {
13
- stateless(ctx: InferenceContext, session: Session<Function.Declaration.From<fdm>>): Promise<RoleMessage.Ai<Function.Declaration.From<fdm>>>;
14
11
  protected getDeltaThoughts(delta: OpenAI.ChatCompletionChunk.Choice.Delta): string;
15
12
  }
16
13
  }
@@ -3,20 +3,17 @@ import { Function } from "../function.js";
3
3
  import { OpenAIChatCompletionsStreamEngineBase } from "./openai-chatcompletions-stream-base.js";
4
4
  import {} from "../inference-context.js";
5
5
  import {} from "../session.js";
6
- export var AliyunStreamEngine;
7
- (function (AliyunStreamEngine) {
6
+ export var AliyunEngine;
7
+ (function (AliyunEngine) {
8
8
  function create(options) {
9
9
  return new Constructor(options);
10
10
  }
11
- AliyunStreamEngine.create = create;
11
+ AliyunEngine.create = create;
12
12
  class Constructor extends OpenAIChatCompletionsStreamEngineBase {
13
- stateless(ctx, session) {
14
- return this.stream(ctx, session);
15
- }
16
13
  getDeltaThoughts(delta) {
17
14
  return delta.reasoning_content ?? '';
18
15
  }
19
16
  }
20
- AliyunStreamEngine.Constructor = Constructor;
21
- })(AliyunStreamEngine || (AliyunStreamEngine = {}));
22
- //# sourceMappingURL=aliyun-stream.js.map
17
+ AliyunEngine.Constructor = Constructor;
18
+ })(AliyunEngine || (AliyunEngine = {}));
19
+ //# sourceMappingURL=aliyun.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aliyun.js","sourceRoot":"","sources":["../../src/api-types/aliyun.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,qCAAqC,EAAE,MAAM,yCAAyC,CAAC;AAChG,OAAO,EAAyB,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAkC,MAAM,eAAe,CAAC;AAI/D,MAAM,KAAW,YAAY,CAc5B;AAdD,WAAiB,YAAY;IAK5B,SAAgB,MAAM,CAA+C,OAA4B;QAChG,OAAO,IAAI,WAAW,CAAM,OAAO,CAAC,CAAC;IACtC,CAAC;IAFe,mBAAM,SAErB,CAAA;IAED,MAAa,WAA8D,SAAQ,qCAA0C;QAClH,gBAAgB,CAAC,KAA8C;YACxE,OAAQ,KAAqD,CAAC,iBAAiB,IAAI,EAAE,CAAC;QACvF,CAAC;KACD;IAJY,wBAAW,cAIvB,CAAA;AACF,CAAC,EAdgB,YAAY,KAAZ,YAAY,QAc5B"}
@@ -0,0 +1,43 @@
1
+ import { EngineBase } from './base.ts';
2
+ import { Function } from '../function.ts';
3
+ import { RoleMessage, type ChatMessage, type Session } from '../session.ts';
4
+ import { type Engine } from '../engine.ts';
5
+ import { type InferenceContext } from '../inference-context.ts';
6
+ import Anthropic from '@anthropic-ai/sdk';
7
+ export declare namespace AnthropicEngine {
8
+ function create<fdm extends Function.Declaration.Map = {}>(options: Engine.Options<fdm>): Engine<Function.Declaration.From<fdm>>;
9
+ class Constructor<in out fdm extends Function.Declaration.Map = {}> extends EngineBase<fdm> {
10
+ protected anthropic: Anthropic;
11
+ protected parallel: boolean;
12
+ constructor(options: Engine.Options<fdm>);
13
+ protected convertFromFunctionCall(fc: Function.Call.Distributive<Function.Declaration.From<fdm>>): Anthropic.ToolUseBlock;
14
+ protected convertToFunctionCall(apifc: Anthropic.ToolUseBlock): Function.Call.Distributive<Function.Declaration.From<fdm>>;
15
+ protected convertFromFunctionResponse(fr: Function.Response.Distributive<Function.Declaration.From<fdm>>): Anthropic.ToolResultBlockParam;
16
+ protected convertFromUserMessage(userMessage: RoleMessage.User<Function.Declaration.From<fdm>>): Anthropic.ContentBlockParam[];
17
+ protected convertFromAiMessage(aiMessage: RoleMessage.Ai<Function.Declaration.From<fdm>>): Anthropic.ContentBlockParam[];
18
+ protected convertFromChatMessage(chatMessage: ChatMessage<Function.Declaration.From<fdm>>): Anthropic.MessageParam;
19
+ protected convertFromFunctionDeclarationEntry(fdentry: Function.Declaration.Entry.From<fdm>): Anthropic.Tool;
20
+ protected convertFromToolChoice(toolChoice: Function.ToolChoice<fdm>, parallel: boolean): Anthropic.ToolChoice;
21
+ protected makeParams(session: Session<Function.Declaration.From<fdm>>): Anthropic.MessageCreateParamsStreaming;
22
+ protected convertToAiMessage(raw: Anthropic.ContentBlock[]): AnthropicAiMessage<Function.Declaration.From<fdm>>;
23
+ protected validateFunctionCallByToolChoice(functionCalls: Function.Call.Distributive<Function.Declaration.From<fdm>>[]): void;
24
+ protected calcCost(usage: Anthropic.Usage): number;
25
+ stateless(ctx: InferenceContext, session: Session<Function.Declaration.From<fdm>>, retry?: number): Promise<RoleMessage.Ai<Function.Declaration.From<fdm>>>;
26
+ }
27
+ }
28
+ export type AnthropicAiMessage<fdu extends Function.Declaration> = AnthropicAiMessage.Constructor<fdu>;
29
+ export declare namespace AnthropicAiMessage {
30
+ function create<fdu extends Function.Declaration>(parts: RoleMessage.Ai.Part<fdu>[], raw: Anthropic.ContentBlock[]): AnthropicAiMessage<fdu>;
31
+ const NOMINAL: unique symbol;
32
+ class Constructor<out fdu extends Function.Declaration> extends RoleMessage.Ai.Constructor<fdu> {
33
+ raw: Anthropic.ContentBlock[];
34
+ readonly [NOMINAL]: void;
35
+ constructor(parts: RoleMessage.Ai.Part<fdu>[], raw: Anthropic.ContentBlock[]);
36
+ }
37
+ interface Snapshot<in out fdu extends Function.Declaration = never> {
38
+ parts: RoleMessage.Ai.Part.Snapshot<fdu>[];
39
+ raw: Anthropic.ContentBlock[];
40
+ }
41
+ function restore<fdu extends Function.Declaration>(snapshot: Snapshot<fdu>): AnthropicAiMessage<fdu>;
42
+ function capture<fdu extends Function.Declaration>(message: AnthropicAiMessage<fdu>): Snapshot<fdu>;
43
+ }
@@ -0,0 +1,288 @@
1
+ import { EngineBase } from "./base.js";
2
+ import { Function } from "../function.js";
3
+ import { RoleMessage } from "../session.js";
4
+ import {} from "../engine.js";
5
+ import {} from "../inference-context.js";
6
+ import Anthropic from '@anthropic-ai/sdk';
7
+ import assert from 'node:assert';
8
+ import { TransientError } from "./base.js";
9
+ import Ajv from 'ajv';
10
+ import {} from '@sinclair/typebox';
11
+ const ajv = new Ajv();
12
+ export var AnthropicEngine;
13
+ (function (AnthropicEngine) {
14
+ function create(options) {
15
+ return new Constructor(options);
16
+ }
17
+ AnthropicEngine.create = create;
18
+ class Constructor extends EngineBase {
19
+ anthropic = new Anthropic({
20
+ baseURL: this.baseUrl,
21
+ apiKey: this.apiKey,
22
+ fetchOptions: { dispatcher: this.proxyAgent },
23
+ });
24
+ parallel;
25
+ constructor(options) {
26
+ super(options);
27
+ this.parallel = options.parallelFunctionCall ?? false;
28
+ }
29
+ convertFromFunctionCall(fc) {
30
+ assert(fc.id);
31
+ return {
32
+ type: 'tool_use',
33
+ id: fc.id,
34
+ name: fc.name,
35
+ input: fc.args,
36
+ };
37
+ }
38
+ convertToFunctionCall(apifc) {
39
+ const fditem = this.fdm[apifc.name];
40
+ assert(fditem, new TransientError('Invalid function call', { cause: apifc }));
41
+ assert(ajv.validate(fditem.paraschema, apifc.input), new TransientError('Invalid function call', { cause: apifc }));
42
+ return Function.Call.create({
43
+ id: apifc.id,
44
+ name: apifc.name,
45
+ args: apifc.input,
46
+ });
47
+ }
48
+ convertFromFunctionResponse(fr) {
49
+ assert(fr.id);
50
+ return {
51
+ type: 'tool_result',
52
+ tool_use_id: fr.id,
53
+ content: fr.text,
54
+ };
55
+ }
56
+ convertFromUserMessage(userMessage) {
57
+ return userMessage.parts.map(part => {
58
+ if (part instanceof RoleMessage.Part.Text.Constructor)
59
+ return {
60
+ type: 'text',
61
+ text: part.text,
62
+ };
63
+ else if (part instanceof Function.Response)
64
+ return this.convertFromFunctionResponse(part);
65
+ else
66
+ throw new Error();
67
+ });
68
+ }
69
+ convertFromAiMessage(aiMessage) {
70
+ if (aiMessage instanceof AnthropicAiMessage.Constructor)
71
+ return aiMessage.raw;
72
+ else {
73
+ return aiMessage.parts.map(part => {
74
+ if (part instanceof RoleMessage.Part.Text.Constructor)
75
+ return {
76
+ type: 'text',
77
+ text: part.text,
78
+ };
79
+ else if (part instanceof Function.Call)
80
+ return this.convertFromFunctionCall(part);
81
+ else
82
+ throw new Error();
83
+ });
84
+ }
85
+ }
86
+ convertFromChatMessage(chatMessage) {
87
+ if (chatMessage instanceof RoleMessage.User.Constructor)
88
+ return { role: 'user', content: this.convertFromUserMessage(chatMessage) };
89
+ else if (chatMessage instanceof RoleMessage.Ai.Constructor)
90
+ return { role: 'assistant', content: this.convertFromAiMessage(chatMessage) };
91
+ else
92
+ throw new Error();
93
+ }
94
+ convertFromFunctionDeclarationEntry(fdentry) {
95
+ return {
96
+ name: fdentry[0],
97
+ description: fdentry[1].description,
98
+ input_schema: fdentry[1].paraschema,
99
+ };
100
+ }
101
+ convertFromToolChoice(toolChoice, parallel) {
102
+ if (toolChoice === Function.ToolChoice.NONE)
103
+ return { type: 'none' };
104
+ else if (toolChoice === Function.ToolChoice.REQUIRED)
105
+ return { type: 'any', disable_parallel_tool_use: !parallel };
106
+ else if (toolChoice === Function.ToolChoice.AUTO)
107
+ return { type: 'auto', disable_parallel_tool_use: !parallel };
108
+ else {
109
+ assert(toolChoice.length === 1);
110
+ return { type: 'tool', name: toolChoice[0], disable_parallel_tool_use: !parallel };
111
+ }
112
+ }
113
+ makeParams(session) {
114
+ return {
115
+ model: this.model,
116
+ stream: true,
117
+ messages: session.chatMessages.map(chatMessage => this.convertFromChatMessage(chatMessage)),
118
+ system: session.developerMessage?.parts.map(part => ({ type: 'text', text: part.text })),
119
+ tools: Object.keys(this.fdm).length
120
+ ? Object.entries(this.fdm).map(fdentry => this.convertFromFunctionDeclarationEntry(fdentry)) : undefined,
121
+ max_tokens: this.tokenLimit ?? 64 * 1024,
122
+ ...this.additionalOptions,
123
+ };
124
+ }
125
+ convertToAiMessage(raw) {
126
+ const parts = raw.flatMap((item) => {
127
+ if (item.type === 'text') {
128
+ return [RoleMessage.Part.Text.create(item.text)];
129
+ }
130
+ else if (item.type === 'tool_use')
131
+ return [this.convertToFunctionCall(item)];
132
+ else if (item.type === 'thinking')
133
+ return [];
134
+ else
135
+ throw new Error();
136
+ });
137
+ return AnthropicAiMessage.create(parts, raw);
138
+ }
139
+ validateFunctionCallByToolChoice(functionCalls) {
140
+ if (this.toolChoice === Function.ToolChoice.REQUIRED)
141
+ assert(functionCalls.length, new TransientError());
142
+ else if (this.toolChoice instanceof Array)
143
+ for (const fc of functionCalls)
144
+ assert(this.toolChoice.includes(fc.name), new TransientError());
145
+ else if (this.toolChoice === Function.ToolChoice.NONE)
146
+ assert(!functionCalls.length, new TransientError());
147
+ }
148
+ calcCost(usage) {
149
+ const cacheHitTokenCount = usage.cache_read_input_tokens || 0;
150
+ const cacheMissTokenCount = usage.input_tokens - cacheHitTokenCount;
151
+ return this.inputPrice * cacheMissTokenCount / 1e6 +
152
+ this.cachedPrice * cacheHitTokenCount / 1e6 +
153
+ this.outputPrice * usage.output_tokens / 1e6;
154
+ }
155
+ async stateless(ctx, session, retry = 0) {
156
+ const signalTimeout = this.timeout ? AbortSignal.timeout(this.timeout) : undefined;
157
+ const signal = ctx.signal && signalTimeout ? AbortSignal.any([
158
+ ctx.signal,
159
+ signalTimeout,
160
+ ]) : ctx.signal || signalTimeout;
161
+ try {
162
+ const params = this.makeParams(session);
163
+ ctx.logger.message?.trace(params);
164
+ await this.throttle.requests(ctx);
165
+ const stream = this.anthropic.messages.stream(params, { signal });
166
+ let response = null;
167
+ for await (const event of stream) {
168
+ if (event.type === 'message_start') {
169
+ ctx.logger.message?.trace(event);
170
+ response = structuredClone(event.message);
171
+ }
172
+ else {
173
+ assert(response);
174
+ if (event.type === 'message_delta') {
175
+ ctx.logger.message?.trace(event);
176
+ response.stop_sequence = event.delta.stop_sequence ?? response.stop_sequence;
177
+ response.stop_reason = event.delta.stop_reason ?? response.stop_reason;
178
+ }
179
+ else if (event.type === 'message_stop') {
180
+ ctx.logger.message?.trace(event);
181
+ }
182
+ else if (event.type === 'content_block_start') {
183
+ ctx.logger.message?.trace(event);
184
+ const contentBlock = structuredClone(event.content_block);
185
+ response.content.push(contentBlock);
186
+ if (contentBlock.type === 'tool_use')
187
+ contentBlock.input = '';
188
+ }
189
+ else if (event.type === 'content_block_delta') {
190
+ const contentBlock = response.content[event.index];
191
+ if (event.delta.type === 'text_delta') {
192
+ ctx.logger.inference?.debug(event.delta.text);
193
+ assert(contentBlock?.type === 'text');
194
+ contentBlock.text += event.delta.text;
195
+ }
196
+ else if (event.delta.type === 'thinking_delta') {
197
+ ctx.logger.inference?.trace(event.delta.thinking);
198
+ assert(contentBlock?.type === 'thinking');
199
+ contentBlock.thinking += event.delta.thinking;
200
+ }
201
+ else if (event.delta.type === 'signature_delta') {
202
+ assert(contentBlock?.type === 'thinking');
203
+ contentBlock.signature += event.delta.signature;
204
+ }
205
+ else if (event.delta.type === 'input_json_delta') {
206
+ ctx.logger.inference?.debug(event.delta.partial_json);
207
+ assert(contentBlock?.type === 'tool_use');
208
+ assert(typeof contentBlock.input === 'string');
209
+ contentBlock.input += event.delta.partial_json;
210
+ }
211
+ else
212
+ throw new Error('Unknown type of content block delta', { cause: event.delta });
213
+ }
214
+ else if (event.type === 'content_block_stop') {
215
+ const contentBlock = response.content[event.index];
216
+ if (contentBlock?.type === 'text')
217
+ ctx.logger.inference?.debug('\n');
218
+ else if (contentBlock?.type === 'thinking')
219
+ ctx.logger.inference?.trace('\n');
220
+ else if (contentBlock?.type === 'tool_use')
221
+ ctx.logger.inference?.debug('\n');
222
+ ctx.logger.message?.trace(event);
223
+ if (contentBlock?.type === 'tool_use') {
224
+ assert(typeof contentBlock.input === 'string');
225
+ contentBlock.input = JSON.parse(contentBlock.input);
226
+ }
227
+ }
228
+ else
229
+ throw new Error('Unknown stream event', { cause: event });
230
+ }
231
+ }
232
+ assert(response);
233
+ if (response.stop_reason === 'max_tokens')
234
+ throw new TransientError('Token limit exceeded.', { cause: response });
235
+ assert(response.stop_reason === 'end_turn' || response.stop_reason === 'tool_use', new TransientError('Abnormal stop reason', { cause: response }));
236
+ const cost = this.calcCost(response.usage);
237
+ ctx.logger.cost?.(cost);
238
+ ctx.logger.message?.debug(response.usage);
239
+ const aiMessage = this.convertToAiMessage(response.content);
240
+ this.validateFunctionCallByToolChoice(aiMessage.getFunctionCalls());
241
+ return aiMessage;
242
+ }
243
+ catch (e) {
244
+ if (ctx.signal?.aborted)
245
+ throw e;
246
+ else if (signalTimeout?.aborted) { } // 推理超时
247
+ else if (e instanceof TransientError) { } // 模型抽风
248
+ else if (e instanceof TypeError) { } // 网络故障
249
+ else
250
+ throw e;
251
+ ctx.logger.message?.warn(e);
252
+ if (retry < 3)
253
+ return await this.stateless(ctx, session, retry + 1);
254
+ else
255
+ throw e;
256
+ }
257
+ }
258
+ }
259
+ AnthropicEngine.Constructor = Constructor;
260
+ })(AnthropicEngine || (AnthropicEngine = {}));
261
+ export var AnthropicAiMessage;
262
+ (function (AnthropicAiMessage) {
263
+ function create(parts, raw) {
264
+ return new Constructor(parts, raw);
265
+ }
266
+ AnthropicAiMessage.create = create;
267
+ AnthropicAiMessage.NOMINAL = Symbol();
268
+ class Constructor extends RoleMessage.Ai.Constructor {
269
+ raw;
270
+ constructor(parts, raw) {
271
+ super(parts);
272
+ this.raw = raw;
273
+ }
274
+ }
275
+ AnthropicAiMessage.Constructor = Constructor;
276
+ function restore(snapshot) {
277
+ return new Constructor(RoleMessage.Ai.restore(snapshot.parts).parts, snapshot.raw);
278
+ }
279
+ AnthropicAiMessage.restore = restore;
280
+ function capture(message) {
281
+ return {
282
+ parts: RoleMessage.Ai.capture(message),
283
+ raw: message.raw,
284
+ };
285
+ }
286
+ AnthropicAiMessage.capture = capture;
287
+ })(AnthropicAiMessage || (AnthropicAiMessage = {}));
288
+ //# sourceMappingURL=anthropic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/api-types/anthropic.ts"],"names":[],"mappings":"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"}
@@ -12,9 +12,10 @@ export declare abstract class EngineBase<in out fdm extends Function.Declaration
12
12
  protected inputPrice: number;
13
13
  protected outputPrice: number;
14
14
  protected cachedPrice: number;
15
- protected functionDeclarationMap: fdm;
15
+ protected fdm: fdm;
16
16
  protected toolChoice: Function.ToolChoice<fdm>;
17
- protected customOptions?: Record<string, unknown>;
17
+ protected abstract parallel: boolean;
18
+ protected additionalOptions?: Record<string, unknown>;
18
19
  protected throttle: Throttle;
19
20
  protected timeout?: number;
20
21
  protected tokenLimit?: number;