@hemia-ai/agents-models-compatibility 0.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/dist/index.d.ts +247 -0
- package/dist/index.js +592 -0
- package/dist/index.js.map +1 -0
- package/package.json +32 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
import { AiProvider, ModelCapabilities, AiModelAdapter, AiGenerateInput, AiGenerateResult, AiGenerateWithToolsInput, AiGenerateWithToolsResult, AiMessage, AiToolDefinition, ModelErrorCode, AiModelName, RegisteredModel, RegisterModelAdapterInput } from '@hemia-ai/agents-models';
|
|
2
|
+
import { JsonObject } from '@hemia-ai/agents-core';
|
|
3
|
+
|
|
4
|
+
type CompatibleProtocol = 'openai-compatible' | 'anthropic-compatible';
|
|
5
|
+
interface CompatModelAdapterOptions {
|
|
6
|
+
provider: AiProvider;
|
|
7
|
+
apiKey: string;
|
|
8
|
+
baseUrl: string;
|
|
9
|
+
defaultHeaders?: Record<string, string>;
|
|
10
|
+
capabilities?: ModelCapabilities;
|
|
11
|
+
extraBody?: JsonObject;
|
|
12
|
+
}
|
|
13
|
+
interface CompatibleProviderPreset {
|
|
14
|
+
provider: AiProvider;
|
|
15
|
+
protocol: CompatibleProtocol;
|
|
16
|
+
baseUrl: string;
|
|
17
|
+
capabilities: ModelCapabilities;
|
|
18
|
+
defaultExtraBody?: JsonObject;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
interface AnthropicCompatModelAdapterOptions extends CompatModelAdapterOptions {
|
|
22
|
+
anthropicVersion?: string;
|
|
23
|
+
}
|
|
24
|
+
interface AnthropicCompatMessage {
|
|
25
|
+
role: 'user' | 'assistant';
|
|
26
|
+
content: string;
|
|
27
|
+
}
|
|
28
|
+
interface AnthropicCompatTool {
|
|
29
|
+
name: string;
|
|
30
|
+
description: string;
|
|
31
|
+
input_schema: unknown;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
declare class AnthropicCompatModelAdapter implements AiModelAdapter {
|
|
35
|
+
private readonly options;
|
|
36
|
+
readonly protocol: CompatibleProtocol;
|
|
37
|
+
readonly provider: string;
|
|
38
|
+
private readonly mapper;
|
|
39
|
+
private readonly capabilities;
|
|
40
|
+
constructor(options: AnthropicCompatModelAdapterOptions);
|
|
41
|
+
generate(input: AiGenerateInput): Promise<AiGenerateResult>;
|
|
42
|
+
generateWithTools(input: AiGenerateWithToolsInput): Promise<AiGenerateWithToolsResult>;
|
|
43
|
+
getCapabilities(): ModelCapabilities;
|
|
44
|
+
private request;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
interface AnthropicCompatJson {
|
|
48
|
+
model?: unknown;
|
|
49
|
+
stop_reason?: unknown;
|
|
50
|
+
content?: Array<{
|
|
51
|
+
type?: unknown;
|
|
52
|
+
text?: unknown;
|
|
53
|
+
id?: unknown;
|
|
54
|
+
name?: unknown;
|
|
55
|
+
input?: unknown;
|
|
56
|
+
}>;
|
|
57
|
+
usage?: {
|
|
58
|
+
input_tokens?: unknown;
|
|
59
|
+
output_tokens?: unknown;
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
declare class AnthropicCompatMapper {
|
|
63
|
+
extractSystem(messages: AiMessage[]): string | undefined;
|
|
64
|
+
toMessages(messages: AiMessage[]): AnthropicCompatMessage[];
|
|
65
|
+
toTools(tools: AiToolDefinition[] | undefined): AnthropicCompatTool[] | undefined;
|
|
66
|
+
toResult(input: {
|
|
67
|
+
provider: string;
|
|
68
|
+
requestedModel?: string | undefined;
|
|
69
|
+
json: AnthropicCompatJson;
|
|
70
|
+
}): AiGenerateResult;
|
|
71
|
+
toToolResult(input: {
|
|
72
|
+
provider: string;
|
|
73
|
+
requestedModel?: string | undefined;
|
|
74
|
+
json: AnthropicCompatJson;
|
|
75
|
+
}): AiGenerateWithToolsResult;
|
|
76
|
+
private extractText;
|
|
77
|
+
private toToolCalls;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
interface CompatModelErrorDetails {
|
|
81
|
+
code: ModelErrorCode;
|
|
82
|
+
provider: AiProvider;
|
|
83
|
+
protocol: CompatibleProtocol;
|
|
84
|
+
model?: AiModelName;
|
|
85
|
+
status?: number;
|
|
86
|
+
response?: unknown;
|
|
87
|
+
}
|
|
88
|
+
declare class CompatModelError extends Error {
|
|
89
|
+
readonly code: ModelErrorCode;
|
|
90
|
+
readonly provider: AiProvider;
|
|
91
|
+
readonly protocol: CompatibleProtocol;
|
|
92
|
+
readonly model?: AiModelName;
|
|
93
|
+
readonly status?: number;
|
|
94
|
+
readonly response?: unknown;
|
|
95
|
+
constructor(message: string, details: CompatModelErrorDetails);
|
|
96
|
+
toJSON(): JsonObject;
|
|
97
|
+
}
|
|
98
|
+
declare class CompatibleModelErrorMapper {
|
|
99
|
+
static fromHttp(input: {
|
|
100
|
+
provider: AiProvider;
|
|
101
|
+
protocol: CompatibleProtocol;
|
|
102
|
+
model?: AiModelName | undefined;
|
|
103
|
+
status: number;
|
|
104
|
+
response: unknown;
|
|
105
|
+
}): CompatModelError;
|
|
106
|
+
static fromUnknown(input: {
|
|
107
|
+
provider: AiProvider;
|
|
108
|
+
protocol: CompatibleProtocol;
|
|
109
|
+
model?: AiModelName | undefined;
|
|
110
|
+
error: unknown;
|
|
111
|
+
}): CompatModelError;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
interface OpenAICompatModelAdapterOptions extends CompatModelAdapterOptions {
|
|
115
|
+
organization?: string;
|
|
116
|
+
project?: string;
|
|
117
|
+
}
|
|
118
|
+
interface OpenAICompatChatMessage {
|
|
119
|
+
role: 'system' | 'user' | 'assistant' | 'tool';
|
|
120
|
+
content: string | null;
|
|
121
|
+
name?: string;
|
|
122
|
+
tool_call_id?: string;
|
|
123
|
+
}
|
|
124
|
+
interface OpenAICompatTool {
|
|
125
|
+
type: 'function';
|
|
126
|
+
function: {
|
|
127
|
+
name: string;
|
|
128
|
+
description: string;
|
|
129
|
+
parameters: unknown;
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
interface OpenAICompatResponseFormat {
|
|
133
|
+
type: 'text' | 'json_object' | 'json_schema';
|
|
134
|
+
json_schema?: unknown;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
declare class OpenAICompatModelAdapter implements AiModelAdapter {
|
|
138
|
+
private readonly options;
|
|
139
|
+
readonly protocol: CompatibleProtocol;
|
|
140
|
+
readonly provider: string;
|
|
141
|
+
private readonly mapper;
|
|
142
|
+
private readonly capabilities;
|
|
143
|
+
constructor(options: OpenAICompatModelAdapterOptions);
|
|
144
|
+
generate(input: AiGenerateInput): Promise<AiGenerateResult>;
|
|
145
|
+
generateWithTools(input: AiGenerateWithToolsInput): Promise<AiGenerateWithToolsResult>;
|
|
146
|
+
getCapabilities(): ModelCapabilities;
|
|
147
|
+
private request;
|
|
148
|
+
private createHeaders;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
interface OpenAICompatJson {
|
|
152
|
+
model?: unknown;
|
|
153
|
+
choices?: Array<{
|
|
154
|
+
finish_reason?: unknown;
|
|
155
|
+
message?: {
|
|
156
|
+
content?: unknown;
|
|
157
|
+
tool_calls?: Array<{
|
|
158
|
+
id?: unknown;
|
|
159
|
+
type?: unknown;
|
|
160
|
+
function?: {
|
|
161
|
+
name?: unknown;
|
|
162
|
+
arguments?: unknown;
|
|
163
|
+
};
|
|
164
|
+
}>;
|
|
165
|
+
};
|
|
166
|
+
}>;
|
|
167
|
+
usage?: {
|
|
168
|
+
prompt_tokens?: unknown;
|
|
169
|
+
completion_tokens?: unknown;
|
|
170
|
+
total_tokens?: unknown;
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
declare class OpenAICompatMapper {
|
|
174
|
+
toMessages(messages: AiMessage[]): OpenAICompatChatMessage[];
|
|
175
|
+
toTools(tools: AiToolDefinition[] | undefined): OpenAICompatTool[] | undefined;
|
|
176
|
+
toResponseFormat(input: AiGenerateInput): OpenAICompatResponseFormat | undefined;
|
|
177
|
+
toResult(input: {
|
|
178
|
+
provider: string;
|
|
179
|
+
requestedModel?: string | undefined;
|
|
180
|
+
json: OpenAICompatJson;
|
|
181
|
+
}): AiGenerateResult;
|
|
182
|
+
toToolResult(input: {
|
|
183
|
+
provider: string;
|
|
184
|
+
requestedModel?: string | undefined;
|
|
185
|
+
json: OpenAICompatJson;
|
|
186
|
+
}): AiGenerateWithToolsResult;
|
|
187
|
+
private toToolCalls;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
declare const CompatibleProviderPresets: {
|
|
191
|
+
readonly openai: {
|
|
192
|
+
readonly provider: "openai";
|
|
193
|
+
readonly protocol: "openai-compatible";
|
|
194
|
+
readonly baseUrl: "https://api.openai.com/v1";
|
|
195
|
+
readonly capabilities: ModelCapabilities;
|
|
196
|
+
};
|
|
197
|
+
readonly deepseek: {
|
|
198
|
+
readonly provider: "deepseek";
|
|
199
|
+
readonly protocol: "openai-compatible";
|
|
200
|
+
readonly baseUrl: "https://api.deepseek.com";
|
|
201
|
+
readonly capabilities: ModelCapabilities;
|
|
202
|
+
};
|
|
203
|
+
readonly minimax: {
|
|
204
|
+
readonly provider: "minimax";
|
|
205
|
+
readonly protocol: "openai-compatible";
|
|
206
|
+
readonly baseUrl: "https://api.minimax.io/v1";
|
|
207
|
+
readonly capabilities: ModelCapabilities;
|
|
208
|
+
readonly defaultExtraBody: {
|
|
209
|
+
readonly reasoning_split: true;
|
|
210
|
+
};
|
|
211
|
+
};
|
|
212
|
+
readonly anthropic: {
|
|
213
|
+
readonly provider: "anthropic";
|
|
214
|
+
readonly protocol: "anthropic-compatible";
|
|
215
|
+
readonly baseUrl: "https://api.anthropic.com/v1";
|
|
216
|
+
readonly capabilities: ModelCapabilities;
|
|
217
|
+
};
|
|
218
|
+
readonly deepseekAnthropic: {
|
|
219
|
+
readonly provider: "deepseek-anthropic";
|
|
220
|
+
readonly protocol: "anthropic-compatible";
|
|
221
|
+
readonly baseUrl: "https://api.deepseek.com/anthropic";
|
|
222
|
+
readonly capabilities: ModelCapabilities;
|
|
223
|
+
};
|
|
224
|
+
readonly minimaxAnthropic: {
|
|
225
|
+
readonly provider: "minimax-anthropic";
|
|
226
|
+
readonly protocol: "anthropic-compatible";
|
|
227
|
+
readonly baseUrl: "https://api.minimax.io/anthropic/v1";
|
|
228
|
+
readonly capabilities: ModelCapabilities;
|
|
229
|
+
};
|
|
230
|
+
};
|
|
231
|
+
interface CreateCompatProviderInput {
|
|
232
|
+
apiKey: string;
|
|
233
|
+
models: Array<string | RegisteredModel>;
|
|
234
|
+
enabled?: boolean;
|
|
235
|
+
}
|
|
236
|
+
type CreateOpenAICompatProviderInput = CreateCompatProviderInput & Partial<Pick<OpenAICompatModelAdapterOptions, 'baseUrl' | 'defaultHeaders' | 'extraBody' | 'organization' | 'project'>>;
|
|
237
|
+
type CreateAnthropicCompatProviderInput = CreateCompatProviderInput & Partial<Pick<AnthropicCompatModelAdapterOptions, 'baseUrl' | 'defaultHeaders' | 'extraBody' | 'anthropicVersion'>>;
|
|
238
|
+
declare function createOpenAICompatProvider(input: CreateOpenAICompatProviderInput): RegisterModelAdapterInput;
|
|
239
|
+
declare function createDeepSeekOpenAICompatProvider(input: CreateOpenAICompatProviderInput): RegisterModelAdapterInput;
|
|
240
|
+
declare function createMiniMaxOpenAICompatProvider(input: CreateOpenAICompatProviderInput): RegisterModelAdapterInput;
|
|
241
|
+
declare function createAnthropicCompatProvider(input: CreateAnthropicCompatProviderInput): RegisterModelAdapterInput;
|
|
242
|
+
declare function createDeepSeekAnthropicCompatProvider(input: CreateAnthropicCompatProviderInput): RegisterModelAdapterInput;
|
|
243
|
+
declare function createMiniMaxAnthropicCompatProvider(input: CreateAnthropicCompatProviderInput): RegisterModelAdapterInput;
|
|
244
|
+
declare function createOpenAICompatAdapter(preset: CompatibleProviderPreset, input: Omit<CreateOpenAICompatProviderInput, 'models' | 'enabled'>): OpenAICompatModelAdapter;
|
|
245
|
+
declare function createAnthropicCompatAdapter(preset: CompatibleProviderPreset, input: Omit<CreateAnthropicCompatProviderInput, 'models' | 'enabled'>): AnthropicCompatModelAdapter;
|
|
246
|
+
|
|
247
|
+
export { AnthropicCompatMapper, type AnthropicCompatMessage, AnthropicCompatModelAdapter, type AnthropicCompatModelAdapterOptions, type AnthropicCompatTool, type CompatModelAdapterOptions, CompatModelError, type CompatModelErrorDetails, CompatibleModelErrorMapper, type CompatibleProtocol, type CompatibleProviderPreset, CompatibleProviderPresets, type CreateAnthropicCompatProviderInput, type CreateCompatProviderInput, type CreateOpenAICompatProviderInput, type OpenAICompatChatMessage, OpenAICompatMapper, OpenAICompatModelAdapter, type OpenAICompatModelAdapterOptions, type OpenAICompatResponseFormat, type OpenAICompatTool, createAnthropicCompatAdapter, createAnthropicCompatProvider, createDeepSeekAnthropicCompatProvider, createDeepSeekOpenAICompatProvider, createMiniMaxAnthropicCompatProvider, createMiniMaxOpenAICompatProvider, createOpenAICompatAdapter, createOpenAICompatProvider };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,592 @@
|
|
|
1
|
+
// src/anthropic/anthropic-compat-model-adapter.ts
|
|
2
|
+
import { TEXT_ONLY_MODEL_CAPABILITIES } from "@hemia-ai/agents-models";
|
|
3
|
+
|
|
4
|
+
// src/common/body-utils.ts
|
|
5
|
+
function stripTrailingSlash(value) {
|
|
6
|
+
return value.replace(/\/$/, "");
|
|
7
|
+
}
|
|
8
|
+
function removeUndefined(value) {
|
|
9
|
+
return Object.fromEntries(Object.entries(value).filter(([, entry]) => entry !== void 0));
|
|
10
|
+
}
|
|
11
|
+
function mergeJsonObjects(...values) {
|
|
12
|
+
return Object.assign({}, ...values.filter((value) => value !== void 0));
|
|
13
|
+
}
|
|
14
|
+
function readProviderOptions(metadata, key) {
|
|
15
|
+
const value = metadata?.[key];
|
|
16
|
+
if (isJsonObject(value)) return value;
|
|
17
|
+
return void 0;
|
|
18
|
+
}
|
|
19
|
+
function isJsonObject(value) {
|
|
20
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// src/common/compat-model-error.ts
|
|
24
|
+
var CompatModelError = class extends Error {
|
|
25
|
+
code;
|
|
26
|
+
provider;
|
|
27
|
+
protocol;
|
|
28
|
+
model;
|
|
29
|
+
status;
|
|
30
|
+
response;
|
|
31
|
+
constructor(message, details) {
|
|
32
|
+
super(message);
|
|
33
|
+
this.name = "CompatModelError";
|
|
34
|
+
this.code = details.code;
|
|
35
|
+
this.provider = details.provider;
|
|
36
|
+
this.protocol = details.protocol;
|
|
37
|
+
if (details.model !== void 0) this.model = details.model;
|
|
38
|
+
if (details.status !== void 0) this.status = details.status;
|
|
39
|
+
if (details.response !== void 0) this.response = details.response;
|
|
40
|
+
}
|
|
41
|
+
toJSON() {
|
|
42
|
+
const json = {
|
|
43
|
+
name: this.name,
|
|
44
|
+
message: this.message,
|
|
45
|
+
code: this.code,
|
|
46
|
+
provider: this.provider,
|
|
47
|
+
protocol: this.protocol
|
|
48
|
+
};
|
|
49
|
+
if (this.model !== void 0) json.model = this.model;
|
|
50
|
+
if (this.status !== void 0) json.status = this.status;
|
|
51
|
+
if (isJsonValue(this.response)) json.response = this.response;
|
|
52
|
+
return json;
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
var CompatibleModelErrorMapper = class {
|
|
56
|
+
static fromHttp(input) {
|
|
57
|
+
const code = mapStatusToModelErrorCode(input.status);
|
|
58
|
+
return new CompatModelError(`Model provider "${input.provider}" returned ${input.status}.`, {
|
|
59
|
+
code,
|
|
60
|
+
provider: input.provider,
|
|
61
|
+
protocol: input.protocol,
|
|
62
|
+
...input.model !== void 0 ? { model: input.model } : {},
|
|
63
|
+
status: input.status,
|
|
64
|
+
response: input.response
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
static fromUnknown(input) {
|
|
68
|
+
if (input.error instanceof CompatModelError) return input.error;
|
|
69
|
+
return new CompatModelError(input.error instanceof Error ? input.error.message : "Unknown model provider error.", {
|
|
70
|
+
code: "MODEL_UNKNOWN_ERROR",
|
|
71
|
+
provider: input.provider,
|
|
72
|
+
protocol: input.protocol,
|
|
73
|
+
...input.model !== void 0 ? { model: input.model } : {},
|
|
74
|
+
response: serializeUnknown(input.error)
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
function mapStatusToModelErrorCode(status) {
|
|
79
|
+
if (status === 401 || status === 403) return "MODEL_AUTH_ERROR";
|
|
80
|
+
if (status === 404) return "MODEL_NOT_FOUND";
|
|
81
|
+
if (status === 408 || status === 504) return "MODEL_TIMEOUT";
|
|
82
|
+
if (status === 429) return "MODEL_RATE_LIMIT";
|
|
83
|
+
if (status === 400 || status === 413) return "MODEL_CONTEXT_LIMIT_EXCEEDED";
|
|
84
|
+
return "MODEL_UNKNOWN_ERROR";
|
|
85
|
+
}
|
|
86
|
+
function serializeUnknown(value) {
|
|
87
|
+
if (value instanceof Error) {
|
|
88
|
+
return {
|
|
89
|
+
name: value.name,
|
|
90
|
+
message: value.message
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
if (typeof value === "string") return value;
|
|
94
|
+
if (isJsonObject2(value)) return value;
|
|
95
|
+
return String(value);
|
|
96
|
+
}
|
|
97
|
+
function isJsonValue(value) {
|
|
98
|
+
if (value === null) return true;
|
|
99
|
+
if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") return true;
|
|
100
|
+
if (Array.isArray(value)) return value.every(isJsonValue);
|
|
101
|
+
return isJsonObject2(value);
|
|
102
|
+
}
|
|
103
|
+
function isJsonObject2(value) {
|
|
104
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) return false;
|
|
105
|
+
return Object.values(value).every(isJsonValue);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// src/anthropic/anthropic-compat.mapper.ts
|
|
109
|
+
var AnthropicCompatMapper = class {
|
|
110
|
+
extractSystem(messages) {
|
|
111
|
+
const system = messages.filter((message) => message.role === "system").map((message) => message.content);
|
|
112
|
+
return system.length > 0 ? system.join("\n") : void 0;
|
|
113
|
+
}
|
|
114
|
+
toMessages(messages) {
|
|
115
|
+
return messages.filter((message) => message.role !== "system").map((message) => ({
|
|
116
|
+
role: message.role === "assistant" ? "assistant" : "user",
|
|
117
|
+
content: message.content
|
|
118
|
+
}));
|
|
119
|
+
}
|
|
120
|
+
toTools(tools) {
|
|
121
|
+
if (tools === void 0) return void 0;
|
|
122
|
+
return tools.map((tool) => ({
|
|
123
|
+
name: tool.name,
|
|
124
|
+
description: tool.description,
|
|
125
|
+
input_schema: tool.inputSchema
|
|
126
|
+
}));
|
|
127
|
+
}
|
|
128
|
+
toResult(input) {
|
|
129
|
+
const content = this.extractText(input.json);
|
|
130
|
+
const model = typeof input.json.model === "string" ? input.json.model : input.requestedModel;
|
|
131
|
+
const usage = createUsage(input.provider, model, input.json.usage);
|
|
132
|
+
const toolCalls = this.toToolCalls(input.json.content);
|
|
133
|
+
return {
|
|
134
|
+
content,
|
|
135
|
+
...toolCalls.length > 0 ? { toolCalls } : {},
|
|
136
|
+
...usage !== void 0 ? { usage } : {},
|
|
137
|
+
metadata: {
|
|
138
|
+
finishReason: typeof input.json.stop_reason === "string" ? input.json.stop_reason : "unknown"
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
toToolResult(input) {
|
|
143
|
+
const result = this.toResult(input);
|
|
144
|
+
return {
|
|
145
|
+
...result,
|
|
146
|
+
toolCalls: result.toolCalls ?? []
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
extractText(json) {
|
|
150
|
+
if (!Array.isArray(json.content)) return "";
|
|
151
|
+
return json.content.filter((block) => block?.type === "text" && typeof block.text === "string").map((block) => block.text).join("\n");
|
|
152
|
+
}
|
|
153
|
+
toToolCalls(content) {
|
|
154
|
+
if (!Array.isArray(content)) return [];
|
|
155
|
+
return content.filter((block) => block?.type === "tool_use").map((block, index) => ({
|
|
156
|
+
id: typeof block.id === "string" ? block.id : `tool-call-${index + 1}`,
|
|
157
|
+
name: typeof block.name === "string" ? block.name : "unknown",
|
|
158
|
+
input: block.input ?? {},
|
|
159
|
+
status: "pending"
|
|
160
|
+
}));
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
function createUsage(provider, model, usage) {
|
|
164
|
+
if (usage === void 0 || model === void 0) return void 0;
|
|
165
|
+
const inputTokens = typeof usage.input_tokens === "number" ? usage.input_tokens : void 0;
|
|
166
|
+
const outputTokens = typeof usage.output_tokens === "number" ? usage.output_tokens : void 0;
|
|
167
|
+
return {
|
|
168
|
+
provider,
|
|
169
|
+
model,
|
|
170
|
+
...inputTokens !== void 0 ? { inputTokens } : {},
|
|
171
|
+
...outputTokens !== void 0 ? { outputTokens } : {},
|
|
172
|
+
...inputTokens !== void 0 && outputTokens !== void 0 ? { totalTokens: inputTokens + outputTokens } : {}
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// src/anthropic/anthropic-compat-model-adapter.ts
|
|
177
|
+
var AnthropicCompatModelAdapter = class {
|
|
178
|
+
constructor(options) {
|
|
179
|
+
this.options = options;
|
|
180
|
+
this.provider = options.provider;
|
|
181
|
+
this.capabilities = options.capabilities ?? {
|
|
182
|
+
...TEXT_ONLY_MODEL_CAPABILITIES,
|
|
183
|
+
supportsTools: true
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
options;
|
|
187
|
+
protocol = "anthropic-compatible";
|
|
188
|
+
provider;
|
|
189
|
+
mapper = new AnthropicCompatMapper();
|
|
190
|
+
capabilities;
|
|
191
|
+
async generate(input) {
|
|
192
|
+
try {
|
|
193
|
+
const json = await this.request(input, false);
|
|
194
|
+
return this.mapper.toResult({
|
|
195
|
+
provider: this.provider,
|
|
196
|
+
requestedModel: input.model,
|
|
197
|
+
json
|
|
198
|
+
});
|
|
199
|
+
} catch (error) {
|
|
200
|
+
throw CompatibleModelErrorMapper.fromUnknown({
|
|
201
|
+
provider: this.provider,
|
|
202
|
+
protocol: this.protocol,
|
|
203
|
+
model: input.model,
|
|
204
|
+
error
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
async generateWithTools(input) {
|
|
209
|
+
try {
|
|
210
|
+
const json = await this.request(input, true);
|
|
211
|
+
return this.mapper.toToolResult({
|
|
212
|
+
provider: this.provider,
|
|
213
|
+
requestedModel: input.model,
|
|
214
|
+
json
|
|
215
|
+
});
|
|
216
|
+
} catch (error) {
|
|
217
|
+
throw CompatibleModelErrorMapper.fromUnknown({
|
|
218
|
+
provider: this.provider,
|
|
219
|
+
protocol: this.protocol,
|
|
220
|
+
model: input.model,
|
|
221
|
+
error
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
getCapabilities() {
|
|
226
|
+
return this.capabilities;
|
|
227
|
+
}
|
|
228
|
+
async request(input, includeTools) {
|
|
229
|
+
const url = `${stripTrailingSlash(this.options.baseUrl)}/messages`;
|
|
230
|
+
const providerOptions = readProviderOptions(input.metadata, "anthropicCompat");
|
|
231
|
+
const extraBody = mergeJsonObjects(this.options.extraBody, providerOptions);
|
|
232
|
+
const body = removeUndefined({
|
|
233
|
+
model: input.model,
|
|
234
|
+
system: this.mapper.extractSystem(input.messages),
|
|
235
|
+
messages: this.mapper.toMessages(input.messages),
|
|
236
|
+
max_tokens: input.maxOutputTokens ?? this.capabilities.maxOutputTokens ?? 4096,
|
|
237
|
+
temperature: input.temperature,
|
|
238
|
+
tools: includeTools ? this.mapper.toTools(input.tools) : void 0,
|
|
239
|
+
stream: false,
|
|
240
|
+
...extraBody
|
|
241
|
+
});
|
|
242
|
+
const response = await fetch(url, {
|
|
243
|
+
method: "POST",
|
|
244
|
+
headers: {
|
|
245
|
+
"x-api-key": this.options.apiKey,
|
|
246
|
+
"anthropic-version": this.options.anthropicVersion ?? "2023-06-01",
|
|
247
|
+
"Content-Type": "application/json",
|
|
248
|
+
...this.options.defaultHeaders
|
|
249
|
+
},
|
|
250
|
+
body: JSON.stringify(body)
|
|
251
|
+
});
|
|
252
|
+
const json = await response.json().catch(() => null);
|
|
253
|
+
if (!response.ok) {
|
|
254
|
+
throw CompatibleModelErrorMapper.fromHttp({
|
|
255
|
+
provider: this.provider,
|
|
256
|
+
protocol: this.protocol,
|
|
257
|
+
model: input.model,
|
|
258
|
+
status: response.status,
|
|
259
|
+
response: json
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
return json;
|
|
263
|
+
}
|
|
264
|
+
};
|
|
265
|
+
|
|
266
|
+
// src/openai/openai-compat-model-adapter.ts
|
|
267
|
+
import { TEXT_ONLY_MODEL_CAPABILITIES as TEXT_ONLY_MODEL_CAPABILITIES2 } from "@hemia-ai/agents-models";
|
|
268
|
+
|
|
269
|
+
// src/openai/openai-compat.mapper.ts
|
|
270
|
+
var OpenAICompatMapper = class {
|
|
271
|
+
toMessages(messages) {
|
|
272
|
+
return messages.map((message) => ({
|
|
273
|
+
role: message.role,
|
|
274
|
+
content: message.content,
|
|
275
|
+
...message.name !== void 0 ? { name: message.name } : {},
|
|
276
|
+
...message.toolCallId !== void 0 ? { tool_call_id: message.toolCallId } : {}
|
|
277
|
+
}));
|
|
278
|
+
}
|
|
279
|
+
toTools(tools) {
|
|
280
|
+
if (tools === void 0) return void 0;
|
|
281
|
+
return tools.map((tool) => ({
|
|
282
|
+
type: "function",
|
|
283
|
+
function: {
|
|
284
|
+
name: tool.name,
|
|
285
|
+
description: tool.description,
|
|
286
|
+
parameters: tool.inputSchema
|
|
287
|
+
}
|
|
288
|
+
}));
|
|
289
|
+
}
|
|
290
|
+
toResponseFormat(input) {
|
|
291
|
+
if (input.responseFormat === "json") return { type: "json_object" };
|
|
292
|
+
if (input.responseFormat === "schema" && input.outputSchema !== void 0) {
|
|
293
|
+
return {
|
|
294
|
+
type: "json_schema",
|
|
295
|
+
json_schema: input.outputSchema
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
if (input.responseFormat === "text") return { type: "text" };
|
|
299
|
+
return void 0;
|
|
300
|
+
}
|
|
301
|
+
toResult(input) {
|
|
302
|
+
const choice = input.json.choices?.[0];
|
|
303
|
+
const message = choice?.message;
|
|
304
|
+
const content = typeof message?.content === "string" ? message.content : "";
|
|
305
|
+
const model = typeof input.json.model === "string" ? input.json.model : input.requestedModel;
|
|
306
|
+
const usage = createUsage2(input.provider, model, input.json.usage);
|
|
307
|
+
const toolCalls = this.toToolCalls(message?.tool_calls);
|
|
308
|
+
return {
|
|
309
|
+
content,
|
|
310
|
+
...toolCalls.length > 0 ? { toolCalls } : {},
|
|
311
|
+
...usage !== void 0 ? { usage } : {},
|
|
312
|
+
metadata: {
|
|
313
|
+
finishReason: typeof choice?.finish_reason === "string" ? choice.finish_reason : "unknown"
|
|
314
|
+
}
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
toToolResult(input) {
|
|
318
|
+
const result = this.toResult(input);
|
|
319
|
+
return {
|
|
320
|
+
...result,
|
|
321
|
+
toolCalls: result.toolCalls ?? []
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
toToolCalls(toolCalls) {
|
|
325
|
+
if (!Array.isArray(toolCalls)) return [];
|
|
326
|
+
return toolCalls.filter((toolCall) => toolCall?.type === "function").map((toolCall, index) => ({
|
|
327
|
+
id: typeof toolCall.id === "string" ? toolCall.id : `tool-call-${index + 1}`,
|
|
328
|
+
name: typeof toolCall.function?.name === "string" ? toolCall.function.name : "unknown",
|
|
329
|
+
input: parseToolArguments(toolCall.function?.arguments),
|
|
330
|
+
status: "pending"
|
|
331
|
+
}));
|
|
332
|
+
}
|
|
333
|
+
};
|
|
334
|
+
function createUsage2(provider, model, usage) {
|
|
335
|
+
if (usage === void 0 || model === void 0) return void 0;
|
|
336
|
+
return {
|
|
337
|
+
provider,
|
|
338
|
+
model,
|
|
339
|
+
...typeof usage.prompt_tokens === "number" ? { inputTokens: usage.prompt_tokens } : {},
|
|
340
|
+
...typeof usage.completion_tokens === "number" ? { outputTokens: usage.completion_tokens } : {},
|
|
341
|
+
...typeof usage.total_tokens === "number" ? { totalTokens: usage.total_tokens } : {}
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
function parseToolArguments(value) {
|
|
345
|
+
if (typeof value !== "string") return value ?? {};
|
|
346
|
+
try {
|
|
347
|
+
return JSON.parse(value);
|
|
348
|
+
} catch {
|
|
349
|
+
return { raw: value };
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
// src/openai/openai-compat-model-adapter.ts
|
|
354
|
+
var OpenAICompatModelAdapter = class {
|
|
355
|
+
constructor(options) {
|
|
356
|
+
this.options = options;
|
|
357
|
+
this.provider = options.provider;
|
|
358
|
+
this.capabilities = options.capabilities ?? {
|
|
359
|
+
...TEXT_ONLY_MODEL_CAPABILITIES2,
|
|
360
|
+
supportsTools: true,
|
|
361
|
+
supportsStructuredOutput: true,
|
|
362
|
+
supportsJsonMode: true
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
options;
|
|
366
|
+
protocol = "openai-compatible";
|
|
367
|
+
provider;
|
|
368
|
+
mapper = new OpenAICompatMapper();
|
|
369
|
+
capabilities;
|
|
370
|
+
async generate(input) {
|
|
371
|
+
try {
|
|
372
|
+
const json = await this.request(input, false);
|
|
373
|
+
return this.mapper.toResult({
|
|
374
|
+
provider: this.provider,
|
|
375
|
+
requestedModel: input.model,
|
|
376
|
+
json
|
|
377
|
+
});
|
|
378
|
+
} catch (error) {
|
|
379
|
+
throw CompatibleModelErrorMapper.fromUnknown({
|
|
380
|
+
provider: this.provider,
|
|
381
|
+
protocol: this.protocol,
|
|
382
|
+
model: input.model,
|
|
383
|
+
error
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
async generateWithTools(input) {
|
|
388
|
+
try {
|
|
389
|
+
const json = await this.request(input, true);
|
|
390
|
+
return this.mapper.toToolResult({
|
|
391
|
+
provider: this.provider,
|
|
392
|
+
requestedModel: input.model,
|
|
393
|
+
json
|
|
394
|
+
});
|
|
395
|
+
} catch (error) {
|
|
396
|
+
throw CompatibleModelErrorMapper.fromUnknown({
|
|
397
|
+
provider: this.provider,
|
|
398
|
+
protocol: this.protocol,
|
|
399
|
+
model: input.model,
|
|
400
|
+
error
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
getCapabilities() {
|
|
405
|
+
return this.capabilities;
|
|
406
|
+
}
|
|
407
|
+
async request(input, includeTools) {
|
|
408
|
+
const url = `${stripTrailingSlash(this.options.baseUrl)}/chat/completions`;
|
|
409
|
+
const providerOptions = readProviderOptions(input.metadata, "openaiCompat");
|
|
410
|
+
const extraBody = mergeJsonObjects(this.options.extraBody, providerOptions);
|
|
411
|
+
const body = removeUndefined({
|
|
412
|
+
model: input.model,
|
|
413
|
+
messages: this.mapper.toMessages(input.messages),
|
|
414
|
+
temperature: input.temperature,
|
|
415
|
+
max_tokens: input.maxOutputTokens,
|
|
416
|
+
response_format: this.mapper.toResponseFormat(input),
|
|
417
|
+
tools: includeTools ? this.mapper.toTools(input.tools) : void 0,
|
|
418
|
+
stream: false,
|
|
419
|
+
...extraBody
|
|
420
|
+
});
|
|
421
|
+
const response = await fetch(url, {
|
|
422
|
+
method: "POST",
|
|
423
|
+
headers: this.createHeaders(),
|
|
424
|
+
body: JSON.stringify(body)
|
|
425
|
+
});
|
|
426
|
+
const json = await response.json().catch(() => null);
|
|
427
|
+
if (!response.ok) {
|
|
428
|
+
throw CompatibleModelErrorMapper.fromHttp({
|
|
429
|
+
provider: this.provider,
|
|
430
|
+
protocol: this.protocol,
|
|
431
|
+
model: input.model,
|
|
432
|
+
status: response.status,
|
|
433
|
+
response: json
|
|
434
|
+
});
|
|
435
|
+
}
|
|
436
|
+
return json;
|
|
437
|
+
}
|
|
438
|
+
createHeaders() {
|
|
439
|
+
return removeUndefined({
|
|
440
|
+
Authorization: `Bearer ${this.options.apiKey}`,
|
|
441
|
+
"Content-Type": "application/json",
|
|
442
|
+
"OpenAI-Organization": this.options.organization,
|
|
443
|
+
"OpenAI-Project": this.options.project,
|
|
444
|
+
...this.options.defaultHeaders
|
|
445
|
+
});
|
|
446
|
+
}
|
|
447
|
+
};
|
|
448
|
+
|
|
449
|
+
// src/presets/provider-presets.ts
|
|
450
|
+
var TEXT_JSON_TOOL_CAPABILITIES = {
|
|
451
|
+
supportsText: true,
|
|
452
|
+
supportsVision: false,
|
|
453
|
+
supportsTools: true,
|
|
454
|
+
supportsStructuredOutput: true,
|
|
455
|
+
supportsJsonMode: true,
|
|
456
|
+
supportsStreaming: false
|
|
457
|
+
};
|
|
458
|
+
var TEXT_TOOL_CAPABILITIES = {
|
|
459
|
+
supportsText: true,
|
|
460
|
+
supportsVision: false,
|
|
461
|
+
supportsTools: true,
|
|
462
|
+
supportsStructuredOutput: false,
|
|
463
|
+
supportsJsonMode: false,
|
|
464
|
+
supportsStreaming: false
|
|
465
|
+
};
|
|
466
|
+
var CompatibleProviderPresets = {
|
|
467
|
+
openai: {
|
|
468
|
+
provider: "openai",
|
|
469
|
+
protocol: "openai-compatible",
|
|
470
|
+
baseUrl: "https://api.openai.com/v1",
|
|
471
|
+
capabilities: TEXT_JSON_TOOL_CAPABILITIES
|
|
472
|
+
},
|
|
473
|
+
deepseek: {
|
|
474
|
+
provider: "deepseek",
|
|
475
|
+
protocol: "openai-compatible",
|
|
476
|
+
baseUrl: "https://api.deepseek.com",
|
|
477
|
+
capabilities: TEXT_JSON_TOOL_CAPABILITIES
|
|
478
|
+
},
|
|
479
|
+
minimax: {
|
|
480
|
+
provider: "minimax",
|
|
481
|
+
protocol: "openai-compatible",
|
|
482
|
+
baseUrl: "https://api.minimax.io/v1",
|
|
483
|
+
capabilities: TEXT_TOOL_CAPABILITIES,
|
|
484
|
+
defaultExtraBody: {
|
|
485
|
+
reasoning_split: true
|
|
486
|
+
}
|
|
487
|
+
},
|
|
488
|
+
anthropic: {
|
|
489
|
+
provider: "anthropic",
|
|
490
|
+
protocol: "anthropic-compatible",
|
|
491
|
+
baseUrl: "https://api.anthropic.com/v1",
|
|
492
|
+
capabilities: TEXT_TOOL_CAPABILITIES
|
|
493
|
+
},
|
|
494
|
+
deepseekAnthropic: {
|
|
495
|
+
provider: "deepseek-anthropic",
|
|
496
|
+
protocol: "anthropic-compatible",
|
|
497
|
+
baseUrl: "https://api.deepseek.com/anthropic",
|
|
498
|
+
capabilities: TEXT_TOOL_CAPABILITIES
|
|
499
|
+
},
|
|
500
|
+
minimaxAnthropic: {
|
|
501
|
+
provider: "minimax-anthropic",
|
|
502
|
+
protocol: "anthropic-compatible",
|
|
503
|
+
baseUrl: "https://api.minimax.io/anthropic/v1",
|
|
504
|
+
capabilities: TEXT_TOOL_CAPABILITIES
|
|
505
|
+
}
|
|
506
|
+
};
|
|
507
|
+
function createOpenAICompatProvider(input) {
|
|
508
|
+
const preset = CompatibleProviderPresets.openai;
|
|
509
|
+
const adapter = createOpenAICompatAdapter(preset, input);
|
|
510
|
+
return createProviderRegistration(preset, adapter, input);
|
|
511
|
+
}
|
|
512
|
+
function createDeepSeekOpenAICompatProvider(input) {
|
|
513
|
+
const preset = CompatibleProviderPresets.deepseek;
|
|
514
|
+
const adapter = createOpenAICompatAdapter(preset, input);
|
|
515
|
+
return createProviderRegistration(preset, adapter, input);
|
|
516
|
+
}
|
|
517
|
+
function createMiniMaxOpenAICompatProvider(input) {
|
|
518
|
+
const preset = CompatibleProviderPresets.minimax;
|
|
519
|
+
const adapter = createOpenAICompatAdapter(preset, input);
|
|
520
|
+
return createProviderRegistration(preset, adapter, input);
|
|
521
|
+
}
|
|
522
|
+
function createAnthropicCompatProvider(input) {
|
|
523
|
+
const preset = CompatibleProviderPresets.anthropic;
|
|
524
|
+
const adapter = createAnthropicCompatAdapter(preset, input);
|
|
525
|
+
return createProviderRegistration(preset, adapter, input);
|
|
526
|
+
}
|
|
527
|
+
function createDeepSeekAnthropicCompatProvider(input) {
|
|
528
|
+
const preset = CompatibleProviderPresets.deepseekAnthropic;
|
|
529
|
+
const adapter = createAnthropicCompatAdapter(preset, input);
|
|
530
|
+
return createProviderRegistration(preset, adapter, input);
|
|
531
|
+
}
|
|
532
|
+
function createMiniMaxAnthropicCompatProvider(input) {
|
|
533
|
+
const preset = CompatibleProviderPresets.minimaxAnthropic;
|
|
534
|
+
const adapter = createAnthropicCompatAdapter(preset, input);
|
|
535
|
+
return createProviderRegistration(preset, adapter, input);
|
|
536
|
+
}
|
|
537
|
+
function createOpenAICompatAdapter(preset, input) {
|
|
538
|
+
return new OpenAICompatModelAdapter({
|
|
539
|
+
provider: preset.provider,
|
|
540
|
+
apiKey: input.apiKey,
|
|
541
|
+
baseUrl: input.baseUrl ?? preset.baseUrl,
|
|
542
|
+
capabilities: preset.capabilities,
|
|
543
|
+
...input.defaultHeaders !== void 0 ? { defaultHeaders: input.defaultHeaders } : {},
|
|
544
|
+
...input.extraBody !== void 0 || preset.defaultExtraBody !== void 0 ? { extraBody: { ...preset.defaultExtraBody ?? {}, ...input.extraBody ?? {} } } : {},
|
|
545
|
+
...input.organization !== void 0 ? { organization: input.organization } : {},
|
|
546
|
+
...input.project !== void 0 ? { project: input.project } : {}
|
|
547
|
+
});
|
|
548
|
+
}
|
|
549
|
+
function createAnthropicCompatAdapter(preset, input) {
|
|
550
|
+
return new AnthropicCompatModelAdapter({
|
|
551
|
+
provider: preset.provider,
|
|
552
|
+
apiKey: input.apiKey,
|
|
553
|
+
baseUrl: input.baseUrl ?? preset.baseUrl,
|
|
554
|
+
capabilities: preset.capabilities,
|
|
555
|
+
...input.defaultHeaders !== void 0 ? { defaultHeaders: input.defaultHeaders } : {},
|
|
556
|
+
...input.extraBody !== void 0 || preset.defaultExtraBody !== void 0 ? { extraBody: { ...preset.defaultExtraBody ?? {}, ...input.extraBody ?? {} } } : {},
|
|
557
|
+
...input.anthropicVersion !== void 0 ? { anthropicVersion: input.anthropicVersion } : {}
|
|
558
|
+
});
|
|
559
|
+
}
|
|
560
|
+
function createProviderRegistration(preset, adapter, input) {
|
|
561
|
+
return {
|
|
562
|
+
provider: preset.provider,
|
|
563
|
+
adapter,
|
|
564
|
+
models: input.models.map((model) => normalizeRegisteredModel(model, preset.capabilities)),
|
|
565
|
+
...input.enabled !== void 0 ? { enabled: input.enabled } : {}
|
|
566
|
+
};
|
|
567
|
+
}
|
|
568
|
+
function normalizeRegisteredModel(model, capabilities) {
|
|
569
|
+
if (typeof model !== "string") return model;
|
|
570
|
+
return {
|
|
571
|
+
id: model,
|
|
572
|
+
capabilities
|
|
573
|
+
};
|
|
574
|
+
}
|
|
575
|
+
export {
|
|
576
|
+
AnthropicCompatMapper,
|
|
577
|
+
AnthropicCompatModelAdapter,
|
|
578
|
+
CompatModelError,
|
|
579
|
+
CompatibleModelErrorMapper,
|
|
580
|
+
CompatibleProviderPresets,
|
|
581
|
+
OpenAICompatMapper,
|
|
582
|
+
OpenAICompatModelAdapter,
|
|
583
|
+
createAnthropicCompatAdapter,
|
|
584
|
+
createAnthropicCompatProvider,
|
|
585
|
+
createDeepSeekAnthropicCompatProvider,
|
|
586
|
+
createDeepSeekOpenAICompatProvider,
|
|
587
|
+
createMiniMaxAnthropicCompatProvider,
|
|
588
|
+
createMiniMaxOpenAICompatProvider,
|
|
589
|
+
createOpenAICompatAdapter,
|
|
590
|
+
createOpenAICompatProvider
|
|
591
|
+
};
|
|
592
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/anthropic/anthropic-compat-model-adapter.ts","../src/common/body-utils.ts","../src/common/compat-model-error.ts","../src/anthropic/anthropic-compat.mapper.ts","../src/openai/openai-compat-model-adapter.ts","../src/openai/openai-compat.mapper.ts","../src/presets/provider-presets.ts"],"sourcesContent":["import type {\n AiGenerateInput,\n AiGenerateResult,\n AiGenerateWithToolsInput,\n AiGenerateWithToolsResult,\n AiModelAdapter,\n ModelCapabilities,\n} from '@hemia-ai/agents-models';\nimport { TEXT_ONLY_MODEL_CAPABILITIES } from '@hemia-ai/agents-models';\nimport { mergeJsonObjects, readProviderOptions, removeUndefined, stripTrailingSlash } from '../common/body-utils';\nimport { CompatibleModelErrorMapper } from '../common/compat-model-error';\nimport type { CompatibleProtocol } from '../common/compat-types';\nimport { AnthropicCompatMapper } from './anthropic-compat.mapper';\nimport type { AnthropicCompatModelAdapterOptions } from './anthropic-compat.types';\n\nexport class AnthropicCompatModelAdapter implements AiModelAdapter {\n readonly protocol: CompatibleProtocol = 'anthropic-compatible';\n readonly provider: string;\n\n private readonly mapper = new AnthropicCompatMapper();\n private readonly capabilities: ModelCapabilities;\n\n constructor(private readonly options: AnthropicCompatModelAdapterOptions) {\n this.provider = options.provider;\n this.capabilities = options.capabilities ?? {\n ...TEXT_ONLY_MODEL_CAPABILITIES,\n supportsTools: true,\n };\n }\n\n async generate(input: AiGenerateInput): Promise<AiGenerateResult> {\n try {\n const json = await this.request(input, false);\n\n return this.mapper.toResult({\n provider: this.provider,\n requestedModel: input.model,\n json,\n });\n } catch (error) {\n throw CompatibleModelErrorMapper.fromUnknown({\n provider: this.provider,\n protocol: this.protocol,\n model: input.model,\n error,\n });\n }\n }\n\n async generateWithTools(input: AiGenerateWithToolsInput): Promise<AiGenerateWithToolsResult> {\n try {\n const json = await this.request(input, true);\n\n return this.mapper.toToolResult({\n provider: this.provider,\n requestedModel: input.model,\n json,\n });\n } catch (error) {\n throw CompatibleModelErrorMapper.fromUnknown({\n provider: this.provider,\n protocol: this.protocol,\n model: input.model,\n error,\n });\n }\n }\n\n getCapabilities(): ModelCapabilities {\n return this.capabilities;\n }\n\n private async request(input: AiGenerateInput, includeTools: boolean): Promise<Parameters<AnthropicCompatMapper['toResult']>[0]['json']> {\n const url = `${stripTrailingSlash(this.options.baseUrl)}/messages`;\n const providerOptions = readProviderOptions(input.metadata, 'anthropicCompat');\n const extraBody = mergeJsonObjects(this.options.extraBody, providerOptions);\n const body = removeUndefined({\n model: input.model,\n system: this.mapper.extractSystem(input.messages),\n messages: this.mapper.toMessages(input.messages),\n max_tokens: input.maxOutputTokens ?? this.capabilities.maxOutputTokens ?? 4096,\n temperature: input.temperature,\n tools: includeTools ? this.mapper.toTools(input.tools) : undefined,\n stream: false,\n ...extraBody,\n });\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'x-api-key': this.options.apiKey,\n 'anthropic-version': this.options.anthropicVersion ?? '2023-06-01',\n 'Content-Type': 'application/json',\n ...this.options.defaultHeaders,\n },\n body: JSON.stringify(body),\n });\n\n const json = (await response.json().catch(() => null)) as Parameters<AnthropicCompatMapper['toResult']>[0]['json'];\n\n if (!response.ok) {\n throw CompatibleModelErrorMapper.fromHttp({\n provider: this.provider,\n protocol: this.protocol,\n model: input.model,\n status: response.status,\n response: json,\n });\n }\n\n return json;\n }\n}\n","import type { JsonObject } from '@hemia-ai/agents-core';\n\nexport function stripTrailingSlash(value: string): string {\n return value.replace(/\\/$/, '');\n}\n\nexport function removeUndefined<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(Object.entries(value).filter(([, entry]) => entry !== undefined)) as T;\n}\n\nexport function mergeJsonObjects(...values: Array<JsonObject | undefined>): JsonObject {\n return Object.assign({}, ...values.filter((value): value is JsonObject => value !== undefined));\n}\n\nexport function readProviderOptions(metadata: JsonObject | undefined, key: string): JsonObject | undefined {\n const value = metadata?.[key];\n if (isJsonObject(value)) return value;\n return undefined;\n}\n\nfunction isJsonObject(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n","import type { JsonObject } from '@hemia-ai/agents-core';\nimport type { AiModelName, AiProvider, ModelErrorCode } from '@hemia-ai/agents-models';\nimport type { CompatibleProtocol } from './compat-types';\n\nexport interface CompatModelErrorDetails {\n code: ModelErrorCode;\n provider: AiProvider;\n protocol: CompatibleProtocol;\n model?: AiModelName;\n status?: number;\n response?: unknown;\n}\n\nexport class CompatModelError extends Error {\n readonly code: ModelErrorCode;\n readonly provider: AiProvider;\n readonly protocol: CompatibleProtocol;\n readonly model?: AiModelName;\n readonly status?: number;\n readonly response?: unknown;\n\n constructor(message: string, details: CompatModelErrorDetails) {\n super(message);\n this.name = 'CompatModelError';\n this.code = details.code;\n this.provider = details.provider;\n this.protocol = details.protocol;\n if (details.model !== undefined) this.model = details.model;\n if (details.status !== undefined) this.status = details.status;\n if (details.response !== undefined) this.response = details.response;\n }\n\n toJSON(): JsonObject {\n const json: JsonObject = {\n name: this.name,\n message: this.message,\n code: this.code,\n provider: this.provider,\n protocol: this.protocol,\n };\n\n if (this.model !== undefined) json.model = this.model;\n if (this.status !== undefined) json.status = this.status;\n if (isJsonValue(this.response)) json.response = this.response;\n\n return json;\n }\n}\n\nexport class CompatibleModelErrorMapper {\n static fromHttp(input: {\n provider: AiProvider;\n protocol: CompatibleProtocol;\n model?: AiModelName | undefined;\n status: number;\n response: unknown;\n }): CompatModelError {\n const code = mapStatusToModelErrorCode(input.status);\n\n return new CompatModelError(`Model provider \"${input.provider}\" returned ${input.status}.`, {\n code,\n provider: input.provider,\n protocol: input.protocol,\n ...(input.model !== undefined ? { model: input.model } : {}),\n status: input.status,\n response: input.response,\n });\n }\n\n static fromUnknown(input: {\n provider: AiProvider;\n protocol: CompatibleProtocol;\n model?: AiModelName | undefined;\n error: unknown;\n }): CompatModelError {\n if (input.error instanceof CompatModelError) return input.error;\n\n return new CompatModelError(input.error instanceof Error ? input.error.message : 'Unknown model provider error.', {\n code: 'MODEL_UNKNOWN_ERROR',\n provider: input.provider,\n protocol: input.protocol,\n ...(input.model !== undefined ? { model: input.model } : {}),\n response: serializeUnknown(input.error),\n });\n }\n}\n\nfunction mapStatusToModelErrorCode(status: number): ModelErrorCode {\n if (status === 401 || status === 403) return 'MODEL_AUTH_ERROR';\n if (status === 404) return 'MODEL_NOT_FOUND';\n if (status === 408 || status === 504) return 'MODEL_TIMEOUT';\n if (status === 429) return 'MODEL_RATE_LIMIT';\n if (status === 400 || status === 413) return 'MODEL_CONTEXT_LIMIT_EXCEEDED';\n return 'MODEL_UNKNOWN_ERROR';\n}\n\nfunction serializeUnknown(value: unknown): string | JsonObject {\n if (value instanceof Error) {\n return {\n name: value.name,\n message: value.message,\n };\n }\n\n if (typeof value === 'string') return value;\n if (isJsonObject(value)) return value;\n return String(value);\n}\n\nfunction isJsonValue(value: unknown): value is JsonObject[keyof JsonObject] {\n if (value === null) return true;\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') return true;\n if (Array.isArray(value)) return value.every(isJsonValue);\n return isJsonObject(value);\n}\n\nfunction isJsonObject(value: unknown): value is JsonObject {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false;\n return Object.values(value).every(isJsonValue);\n}\n","import type {\n AiGenerateInput,\n AiGenerateResult,\n AiGenerateWithToolsResult,\n AiMessage,\n AiToolCall,\n AiToolDefinition,\n} from '@hemia-ai/agents-models';\nimport type { AnthropicCompatMessage, AnthropicCompatTool } from './anthropic-compat.types';\n\ninterface AnthropicCompatJson {\n model?: unknown;\n stop_reason?: unknown;\n content?: Array<{\n type?: unknown;\n text?: unknown;\n id?: unknown;\n name?: unknown;\n input?: unknown;\n }>;\n usage?: {\n input_tokens?: unknown;\n output_tokens?: unknown;\n };\n}\n\nexport class AnthropicCompatMapper {\n extractSystem(messages: AiMessage[]): string | undefined {\n const system = messages.filter((message) => message.role === 'system').map((message) => message.content);\n return system.length > 0 ? system.join('\\n') : undefined;\n }\n\n toMessages(messages: AiMessage[]): AnthropicCompatMessage[] {\n return messages\n .filter((message) => message.role !== 'system')\n .map((message) => ({\n role: message.role === 'assistant' ? 'assistant' : 'user',\n content: message.content,\n }));\n }\n\n toTools(tools: AiToolDefinition[] | undefined): AnthropicCompatTool[] | undefined {\n if (tools === undefined) return undefined;\n\n return tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: tool.inputSchema,\n }));\n }\n\n toResult(input: {\n provider: string;\n requestedModel?: string | undefined;\n json: AnthropicCompatJson;\n }): AiGenerateResult {\n const content = this.extractText(input.json);\n const model = typeof input.json.model === 'string' ? input.json.model : input.requestedModel;\n const usage = createUsage(input.provider, model, input.json.usage);\n const toolCalls = this.toToolCalls(input.json.content);\n\n return {\n content,\n ...(toolCalls.length > 0 ? { toolCalls } : {}),\n ...(usage !== undefined ? { usage } : {}),\n metadata: {\n finishReason: typeof input.json.stop_reason === 'string' ? input.json.stop_reason : 'unknown',\n },\n };\n }\n\n toToolResult(input: {\n provider: string;\n requestedModel?: string | undefined;\n json: AnthropicCompatJson;\n }): AiGenerateWithToolsResult {\n const result = this.toResult(input);\n\n return {\n ...result,\n toolCalls: result.toolCalls ?? [],\n };\n }\n\n private extractText(json: AnthropicCompatJson): string {\n if (!Array.isArray(json.content)) return '';\n\n return json.content\n .filter((block) => block?.type === 'text' && typeof block.text === 'string')\n .map((block) => block.text)\n .join('\\n');\n }\n\n private toToolCalls(content: AnthropicCompatJson['content']): AiToolCall[] {\n if (!Array.isArray(content)) return [];\n\n return content\n .filter((block) => block?.type === 'tool_use')\n .map((block, index) => ({\n id: typeof block.id === 'string' ? block.id : `tool-call-${index + 1}`,\n name: typeof block.name === 'string' ? block.name : 'unknown',\n input: block.input ?? {},\n status: 'pending',\n }));\n }\n}\n\nfunction createUsage(provider: string, model: string | undefined, usage: AnthropicCompatJson['usage']): AiGenerateResult['usage'] {\n if (usage === undefined || model === undefined) return undefined;\n\n const inputTokens = typeof usage.input_tokens === 'number' ? usage.input_tokens : undefined;\n const outputTokens = typeof usage.output_tokens === 'number' ? usage.output_tokens : undefined;\n\n return {\n provider,\n model,\n ...(inputTokens !== undefined ? { inputTokens } : {}),\n ...(outputTokens !== undefined ? { outputTokens } : {}),\n ...(inputTokens !== undefined && outputTokens !== undefined ? { totalTokens: inputTokens + outputTokens } : {}),\n };\n}\n","import type {\n AiGenerateInput,\n AiGenerateResult,\n AiGenerateWithToolsInput,\n AiGenerateWithToolsResult,\n AiModelAdapter,\n ModelCapabilities,\n} from '@hemia-ai/agents-models';\nimport { TEXT_ONLY_MODEL_CAPABILITIES } from '@hemia-ai/agents-models';\nimport { mergeJsonObjects, readProviderOptions, removeUndefined, stripTrailingSlash } from '../common/body-utils';\nimport { CompatibleModelErrorMapper } from '../common/compat-model-error';\nimport type { CompatibleProtocol } from '../common/compat-types';\nimport { OpenAICompatMapper } from './openai-compat.mapper';\nimport type { OpenAICompatModelAdapterOptions } from './openai-compat.types';\n\nexport class OpenAICompatModelAdapter implements AiModelAdapter {\n readonly protocol: CompatibleProtocol = 'openai-compatible';\n readonly provider: string;\n\n private readonly mapper = new OpenAICompatMapper();\n private readonly capabilities: ModelCapabilities;\n\n constructor(private readonly options: OpenAICompatModelAdapterOptions) {\n this.provider = options.provider;\n this.capabilities = options.capabilities ?? {\n ...TEXT_ONLY_MODEL_CAPABILITIES,\n supportsTools: true,\n supportsStructuredOutput: true,\n supportsJsonMode: true,\n };\n }\n\n async generate(input: AiGenerateInput): Promise<AiGenerateResult> {\n try {\n const json = await this.request(input, false);\n\n return this.mapper.toResult({\n provider: this.provider,\n requestedModel: input.model,\n json,\n });\n } catch (error) {\n throw CompatibleModelErrorMapper.fromUnknown({\n provider: this.provider,\n protocol: this.protocol,\n model: input.model,\n error,\n });\n }\n }\n\n async generateWithTools(input: AiGenerateWithToolsInput): Promise<AiGenerateWithToolsResult> {\n try {\n const json = await this.request(input, true);\n\n return this.mapper.toToolResult({\n provider: this.provider,\n requestedModel: input.model,\n json,\n });\n } catch (error) {\n throw CompatibleModelErrorMapper.fromUnknown({\n provider: this.provider,\n protocol: this.protocol,\n model: input.model,\n error,\n });\n }\n }\n\n getCapabilities(): ModelCapabilities {\n return this.capabilities;\n }\n\n private async request(input: AiGenerateInput, includeTools: boolean): Promise<Parameters<OpenAICompatMapper['toResult']>[0]['json']> {\n const url = `${stripTrailingSlash(this.options.baseUrl)}/chat/completions`;\n const providerOptions = readProviderOptions(input.metadata, 'openaiCompat');\n const extraBody = mergeJsonObjects(this.options.extraBody, providerOptions);\n const body = removeUndefined({\n model: input.model,\n messages: this.mapper.toMessages(input.messages),\n temperature: input.temperature,\n max_tokens: input.maxOutputTokens,\n response_format: this.mapper.toResponseFormat(input),\n tools: includeTools ? this.mapper.toTools(input.tools) : undefined,\n stream: false,\n ...extraBody,\n });\n\n const response = await fetch(url, {\n method: 'POST',\n headers: this.createHeaders(),\n body: JSON.stringify(body),\n });\n\n const json = (await response.json().catch(() => null)) as Parameters<OpenAICompatMapper['toResult']>[0]['json'];\n\n if (!response.ok) {\n throw CompatibleModelErrorMapper.fromHttp({\n provider: this.provider,\n protocol: this.protocol,\n model: input.model,\n status: response.status,\n response: json,\n });\n }\n\n return json;\n }\n\n private createHeaders(): Record<string, string> {\n return removeUndefined({\n Authorization: `Bearer ${this.options.apiKey}`,\n 'Content-Type': 'application/json',\n 'OpenAI-Organization': this.options.organization,\n 'OpenAI-Project': this.options.project,\n ...this.options.defaultHeaders,\n }) as Record<string, string>;\n }\n}\n","import type {\n AiGenerateInput,\n AiGenerateResult,\n AiGenerateWithToolsResult,\n AiMessage,\n AiToolCall,\n AiToolDefinition,\n} from '@hemia-ai/agents-models';\nimport type { OpenAICompatChatMessage, OpenAICompatResponseFormat, OpenAICompatTool } from './openai-compat.types';\n\ninterface OpenAICompatJson {\n model?: unknown;\n choices?: Array<{\n finish_reason?: unknown;\n message?: {\n content?: unknown;\n tool_calls?: Array<{\n id?: unknown;\n type?: unknown;\n function?: {\n name?: unknown;\n arguments?: unknown;\n };\n }>;\n };\n }>;\n usage?: {\n prompt_tokens?: unknown;\n completion_tokens?: unknown;\n total_tokens?: unknown;\n };\n}\n\ntype OpenAICompatToolCall = NonNullable<NonNullable<OpenAICompatJson['choices']>[number]['message']>['tool_calls'];\n\nexport class OpenAICompatMapper {\n toMessages(messages: AiMessage[]): OpenAICompatChatMessage[] {\n return messages.map((message) => ({\n role: message.role,\n content: message.content,\n ...(message.name !== undefined ? { name: message.name } : {}),\n ...(message.toolCallId !== undefined ? { tool_call_id: message.toolCallId } : {}),\n }));\n }\n\n toTools(tools: AiToolDefinition[] | undefined): OpenAICompatTool[] | undefined {\n if (tools === undefined) return undefined;\n\n return tools.map((tool) => ({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n },\n }));\n }\n\n toResponseFormat(input: AiGenerateInput): OpenAICompatResponseFormat | undefined {\n if (input.responseFormat === 'json') return { type: 'json_object' };\n if (input.responseFormat === 'schema' && input.outputSchema !== undefined) {\n return {\n type: 'json_schema',\n json_schema: input.outputSchema,\n };\n }\n\n if (input.responseFormat === 'text') return { type: 'text' };\n return undefined;\n }\n\n toResult(input: {\n provider: string;\n requestedModel?: string | undefined;\n json: OpenAICompatJson;\n }): AiGenerateResult {\n const choice = input.json.choices?.[0];\n const message = choice?.message;\n const content = typeof message?.content === 'string' ? message.content : '';\n const model = typeof input.json.model === 'string' ? input.json.model : input.requestedModel;\n const usage = createUsage(input.provider, model, input.json.usage);\n const toolCalls = this.toToolCalls(message?.tool_calls);\n\n return {\n content,\n ...(toolCalls.length > 0 ? { toolCalls } : {}),\n ...(usage !== undefined ? { usage } : {}),\n metadata: {\n finishReason: typeof choice?.finish_reason === 'string' ? choice.finish_reason : 'unknown',\n },\n };\n }\n\n toToolResult(input: {\n provider: string;\n requestedModel?: string | undefined;\n json: OpenAICompatJson;\n }): AiGenerateWithToolsResult {\n const result = this.toResult(input);\n\n return {\n ...result,\n toolCalls: result.toolCalls ?? [],\n };\n }\n\n private toToolCalls(toolCalls: OpenAICompatToolCall): AiToolCall[] {\n if (!Array.isArray(toolCalls)) return [];\n\n return toolCalls\n .filter((toolCall) => toolCall?.type === 'function')\n .map((toolCall, index) => ({\n id: typeof toolCall.id === 'string' ? toolCall.id : `tool-call-${index + 1}`,\n name: typeof toolCall.function?.name === 'string' ? toolCall.function.name : 'unknown',\n input: parseToolArguments(toolCall.function?.arguments),\n status: 'pending',\n }));\n }\n}\n\nfunction createUsage(provider: string, model: string | undefined, usage: OpenAICompatJson['usage']): AiGenerateResult['usage'] {\n if (usage === undefined || model === undefined) return undefined;\n\n return {\n provider,\n model,\n ...(typeof usage.prompt_tokens === 'number' ? { inputTokens: usage.prompt_tokens } : {}),\n ...(typeof usage.completion_tokens === 'number' ? { outputTokens: usage.completion_tokens } : {}),\n ...(typeof usage.total_tokens === 'number' ? { totalTokens: usage.total_tokens } : {}),\n };\n}\n\nfunction parseToolArguments(value: unknown): unknown {\n if (typeof value !== 'string') return value ?? {};\n\n try {\n return JSON.parse(value) as unknown;\n } catch {\n return { raw: value };\n }\n}\n","import type { AiProvider, ModelCapabilities, RegisteredModel, RegisterModelAdapterInput } from '@hemia-ai/agents-models';\nimport { AnthropicCompatModelAdapter } from '../anthropic/anthropic-compat-model-adapter';\nimport type { CompatibleProviderPreset } from '../common/compat-types';\nimport { OpenAICompatModelAdapter } from '../openai/openai-compat-model-adapter';\nimport type { AnthropicCompatModelAdapterOptions } from '../anthropic/anthropic-compat.types';\nimport type { OpenAICompatModelAdapterOptions } from '../openai/openai-compat.types';\n\nconst TEXT_JSON_TOOL_CAPABILITIES: ModelCapabilities = {\n supportsText: true,\n supportsVision: false,\n supportsTools: true,\n supportsStructuredOutput: true,\n supportsJsonMode: true,\n supportsStreaming: false,\n};\n\nconst TEXT_TOOL_CAPABILITIES: ModelCapabilities = {\n supportsText: true,\n supportsVision: false,\n supportsTools: true,\n supportsStructuredOutput: false,\n supportsJsonMode: false,\n supportsStreaming: false,\n};\n\nexport const CompatibleProviderPresets = {\n openai: {\n provider: 'openai',\n protocol: 'openai-compatible',\n baseUrl: 'https://api.openai.com/v1',\n capabilities: TEXT_JSON_TOOL_CAPABILITIES,\n },\n deepseek: {\n provider: 'deepseek',\n protocol: 'openai-compatible',\n baseUrl: 'https://api.deepseek.com',\n capabilities: TEXT_JSON_TOOL_CAPABILITIES,\n },\n minimax: {\n provider: 'minimax',\n protocol: 'openai-compatible',\n baseUrl: 'https://api.minimax.io/v1',\n capabilities: TEXT_TOOL_CAPABILITIES,\n defaultExtraBody: {\n reasoning_split: true,\n },\n },\n anthropic: {\n provider: 'anthropic',\n protocol: 'anthropic-compatible',\n baseUrl: 'https://api.anthropic.com/v1',\n capabilities: TEXT_TOOL_CAPABILITIES,\n },\n deepseekAnthropic: {\n provider: 'deepseek-anthropic',\n protocol: 'anthropic-compatible',\n baseUrl: 'https://api.deepseek.com/anthropic',\n capabilities: TEXT_TOOL_CAPABILITIES,\n },\n minimaxAnthropic: {\n provider: 'minimax-anthropic',\n protocol: 'anthropic-compatible',\n baseUrl: 'https://api.minimax.io/anthropic/v1',\n capabilities: TEXT_TOOL_CAPABILITIES,\n },\n} as const satisfies Record<string, CompatibleProviderPreset>;\n\nexport interface CreateCompatProviderInput {\n apiKey: string;\n models: Array<string | RegisteredModel>;\n enabled?: boolean;\n}\n\nexport type CreateOpenAICompatProviderInput = CreateCompatProviderInput &\n Partial<Pick<OpenAICompatModelAdapterOptions, 'baseUrl' | 'defaultHeaders' | 'extraBody' | 'organization' | 'project'>>;\n\nexport type CreateAnthropicCompatProviderInput = CreateCompatProviderInput &\n Partial<Pick<AnthropicCompatModelAdapterOptions, 'baseUrl' | 'defaultHeaders' | 'extraBody' | 'anthropicVersion'>>;\n\nexport function createOpenAICompatProvider(input: CreateOpenAICompatProviderInput): RegisterModelAdapterInput {\n const preset = CompatibleProviderPresets.openai;\n const adapter = createOpenAICompatAdapter(preset, input);\n\n return createProviderRegistration(preset, adapter, input);\n}\n\nexport function createDeepSeekOpenAICompatProvider(input: CreateOpenAICompatProviderInput): RegisterModelAdapterInput {\n const preset = CompatibleProviderPresets.deepseek;\n const adapter = createOpenAICompatAdapter(preset, input);\n\n return createProviderRegistration(preset, adapter, input);\n}\n\nexport function createMiniMaxOpenAICompatProvider(input: CreateOpenAICompatProviderInput): RegisterModelAdapterInput {\n const preset = CompatibleProviderPresets.minimax;\n const adapter = createOpenAICompatAdapter(preset, input);\n\n return createProviderRegistration(preset, adapter, input);\n}\n\nexport function createAnthropicCompatProvider(input: CreateAnthropicCompatProviderInput): RegisterModelAdapterInput {\n const preset = CompatibleProviderPresets.anthropic;\n const adapter = createAnthropicCompatAdapter(preset, input);\n\n return createProviderRegistration(preset, adapter, input);\n}\n\nexport function createDeepSeekAnthropicCompatProvider(input: CreateAnthropicCompatProviderInput): RegisterModelAdapterInput {\n const preset = CompatibleProviderPresets.deepseekAnthropic;\n const adapter = createAnthropicCompatAdapter(preset, input);\n\n return createProviderRegistration(preset, adapter, input);\n}\n\nexport function createMiniMaxAnthropicCompatProvider(input: CreateAnthropicCompatProviderInput): RegisterModelAdapterInput {\n const preset = CompatibleProviderPresets.minimaxAnthropic;\n const adapter = createAnthropicCompatAdapter(preset, input);\n\n return createProviderRegistration(preset, adapter, input);\n}\n\nexport function createOpenAICompatAdapter(\n preset: CompatibleProviderPreset,\n input: Omit<CreateOpenAICompatProviderInput, 'models' | 'enabled'>,\n): OpenAICompatModelAdapter {\n return new OpenAICompatModelAdapter({\n provider: preset.provider as AiProvider,\n apiKey: input.apiKey,\n baseUrl: input.baseUrl ?? preset.baseUrl,\n capabilities: preset.capabilities,\n ...(input.defaultHeaders !== undefined ? { defaultHeaders: input.defaultHeaders } : {}),\n ...(input.extraBody !== undefined || preset.defaultExtraBody !== undefined\n ? { extraBody: { ...(preset.defaultExtraBody ?? {}), ...(input.extraBody ?? {}) } }\n : {}),\n ...(input.organization !== undefined ? { organization: input.organization } : {}),\n ...(input.project !== undefined ? { project: input.project } : {}),\n });\n}\n\nexport function createAnthropicCompatAdapter(\n preset: CompatibleProviderPreset,\n input: Omit<CreateAnthropicCompatProviderInput, 'models' | 'enabled'>,\n): AnthropicCompatModelAdapter {\n return new AnthropicCompatModelAdapter({\n provider: preset.provider as AiProvider,\n apiKey: input.apiKey,\n baseUrl: input.baseUrl ?? preset.baseUrl,\n capabilities: preset.capabilities,\n ...(input.defaultHeaders !== undefined ? { defaultHeaders: input.defaultHeaders } : {}),\n ...(input.extraBody !== undefined || preset.defaultExtraBody !== undefined\n ? { extraBody: { ...(preset.defaultExtraBody ?? {}), ...(input.extraBody ?? {}) } }\n : {}),\n ...(input.anthropicVersion !== undefined ? { anthropicVersion: input.anthropicVersion } : {}),\n });\n}\n\nfunction createProviderRegistration(\n preset: CompatibleProviderPreset,\n adapter: OpenAICompatModelAdapter | AnthropicCompatModelAdapter,\n input: CreateCompatProviderInput,\n): RegisterModelAdapterInput {\n return {\n provider: preset.provider as AiProvider,\n adapter,\n models: input.models.map((model) => normalizeRegisteredModel(model, preset.capabilities)),\n ...(input.enabled !== undefined ? { enabled: input.enabled } : {}),\n };\n}\n\nfunction normalizeRegisteredModel(model: string | RegisteredModel, capabilities: ModelCapabilities): RegisteredModel {\n if (typeof model !== 'string') return model;\n\n return {\n id: model,\n capabilities,\n };\n}\n"],"mappings":"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","names":["isJsonObject","TEXT_ONLY_MODEL_CAPABILITIES","createUsage","TEXT_ONLY_MODEL_CAPABILITIES"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@hemia-ai/agents-models-compatibility",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Protocol-compatible model adapters for Hemia AI agents.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"sideEffects": false,
|
|
7
|
+
"files": [
|
|
8
|
+
"dist"
|
|
9
|
+
],
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"import": "./dist/index.js"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"publishConfig": {
|
|
17
|
+
"access": "public"
|
|
18
|
+
},
|
|
19
|
+
"scripts": {
|
|
20
|
+
"build": "tsup src/index.ts --format esm --dts --sourcemap --clean",
|
|
21
|
+
"clean": "rm -rf dist *.tsbuildinfo",
|
|
22
|
+
"dev": "tsup src/index.ts --format esm --dts --watch",
|
|
23
|
+
"lint": "tsc --noEmit",
|
|
24
|
+
"test": "vitest run --passWithNoTests",
|
|
25
|
+
"typecheck": "tsc --noEmit",
|
|
26
|
+
"prepack": "npm run build"
|
|
27
|
+
},
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"@hemia-ai/agents-core": "^0.0.2",
|
|
30
|
+
"@hemia-ai/agents-models": "^0.0.2"
|
|
31
|
+
}
|
|
32
|
+
}
|