rax-flow-providers 0.1.0
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/claude-adapter.d.ts +41 -0
- package/dist/claude-adapter.d.ts.map +1 -0
- package/dist/claude-adapter.js +236 -0
- package/dist/claude-adapter.js.map +1 -0
- package/dist/cohere-adapter.d.ts +37 -0
- package/dist/cohere-adapter.d.ts.map +1 -0
- package/dist/cohere-adapter.js +160 -0
- package/dist/cohere-adapter.js.map +1 -0
- package/dist/error-mapper.d.ts +51 -0
- package/dist/error-mapper.d.ts.map +1 -0
- package/dist/error-mapper.js +132 -0
- package/dist/error-mapper.js.map +1 -0
- package/dist/gemini-adapter.d.ts +37 -0
- package/dist/gemini-adapter.d.ts.map +1 -0
- package/dist/gemini-adapter.js +150 -0
- package/dist/gemini-adapter.js.map +1 -0
- package/dist/groq-adapter.d.ts +35 -0
- package/dist/groq-adapter.d.ts.map +1 -0
- package/dist/groq-adapter.js +152 -0
- package/dist/groq-adapter.js.map +1 -0
- package/dist/host-bridge-adapter.d.ts +20 -0
- package/dist/host-bridge-adapter.d.ts.map +1 -0
- package/dist/host-bridge-adapter.js +145 -0
- package/dist/host-bridge-adapter.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/mistral-adapter.d.ts +39 -0
- package/dist/mistral-adapter.d.ts.map +1 -0
- package/dist/mistral-adapter.js +172 -0
- package/dist/mistral-adapter.js.map +1 -0
- package/dist/openai-adapter.d.ts +30 -0
- package/dist/openai-adapter.d.ts.map +1 -0
- package/dist/openai-adapter.js +171 -0
- package/dist/openai-adapter.js.map +1 -0
- package/dist/pricing.d.ts +15 -0
- package/dist/pricing.d.ts.map +1 -0
- package/dist/pricing.js +61 -0
- package/dist/pricing.js.map +1 -0
- package/dist/rest-adapter.d.ts +32 -0
- package/dist/rest-adapter.d.ts.map +1 -0
- package/dist/rest-adapter.js +124 -0
- package/dist/rest-adapter.js.map +1 -0
- package/dist/strategy.d.ts +38 -0
- package/dist/strategy.d.ts.map +1 -0
- package/dist/strategy.js +117 -0
- package/dist/strategy.js.map +1 -0
- package/dist/utils.d.ts +3 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +22 -0
- package/dist/utils.js.map +1 -0
- package/package.json +18 -0
- package/src/claude-adapter.ts +350 -0
- package/src/cohere-adapter.ts +262 -0
- package/src/error-mapper.ts +187 -0
- package/src/gemini-adapter.ts +246 -0
- package/src/groq-adapter.ts +234 -0
- package/src/host-bridge-adapter.ts +189 -0
- package/src/index.ts +11 -0
- package/src/mistral-adapter.ts +262 -0
- package/src/openai-adapter.ts +240 -0
- package/src/pricing.ts +77 -0
- package/src/rest-adapter.ts +181 -0
- package/src/strategy.ts +166 -0
- package/src/utils.ts +18 -0
- package/tsconfig.json +18 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file claude-adapter.ts
|
|
3
|
+
* Anthropic Claude bridge adapter.
|
|
4
|
+
*
|
|
5
|
+
* API reference: https://docs.anthropic.com/en/api/messages
|
|
6
|
+
*
|
|
7
|
+
* • callModel → POST /v1/messages (plain text, streaming=false)
|
|
8
|
+
* • callStructured → same endpoint using Claude's tool_use mechanism
|
|
9
|
+
* (the structured extraction tool), which is the most
|
|
10
|
+
* reliable way to get valid JSON from Claude without
|
|
11
|
+
* prompt-hacking. Falls back to prompt-only for
|
|
12
|
+
* claude-3-haiku which may not have tool_use.
|
|
13
|
+
*
|
|
14
|
+
* Supported models: claude-opus-4-5, claude-sonnet-4-5,
|
|
15
|
+
* claude-3-7-sonnet-latest, claude-3-5-sonnet-latest,
|
|
16
|
+
* claude-3-5-haiku-latest, claude-3-haiku-20240307
|
|
17
|
+
*/
|
|
18
|
+
import { IModelProvider, ModelResponse, ProviderCallOptions } from "@rax-flow/core";
|
|
19
|
+
export interface ClaudeAdapterOptions {
|
|
20
|
+
apiKey: string;
|
|
21
|
+
baseUrl?: string;
|
|
22
|
+
defaultModel?: string;
|
|
23
|
+
timeoutMs?: number;
|
|
24
|
+
}
|
|
25
|
+
export declare class ClaudeAdapter implements IModelProvider {
|
|
26
|
+
private readonly apiKey;
|
|
27
|
+
private readonly baseUrl;
|
|
28
|
+
private readonly defaultModel;
|
|
29
|
+
private readonly timeoutMs;
|
|
30
|
+
constructor(options: ClaudeAdapterOptions);
|
|
31
|
+
/** @deprecated Pass an options object instead. */
|
|
32
|
+
constructor(apiKey: string, baseUrl?: string);
|
|
33
|
+
private supportsToolUse;
|
|
34
|
+
private post;
|
|
35
|
+
private extractText;
|
|
36
|
+
private extractToolInput;
|
|
37
|
+
callModel(prompt: string, options?: ProviderCallOptions): Promise<ModelResponse<string>>;
|
|
38
|
+
callStructured<T>(prompt: string, schema: object, options?: ProviderCallOptions): Promise<ModelResponse<T>>;
|
|
39
|
+
healthCheck(): Promise<boolean>;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=claude-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-adapter.d.ts","sourceRoot":"","sources":["../src/claude-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAoEpF,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,aAAc,YAAW,cAAc;IAClD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,OAAO,EAAE,oBAAoB;IACzC,kDAAkD;gBACtC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;IAoB5C,OAAO,CAAC,eAAe;YAST,IAAI;IAkDlB,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,gBAAgB;IAUlB,SAAS,CACb,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAiC3B,cAAc,CAAC,CAAC,EACpB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IA2GtB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAGtC"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file claude-adapter.ts
|
|
3
|
+
* Anthropic Claude bridge adapter.
|
|
4
|
+
*
|
|
5
|
+
* API reference: https://docs.anthropic.com/en/api/messages
|
|
6
|
+
*
|
|
7
|
+
* • callModel → POST /v1/messages (plain text, streaming=false)
|
|
8
|
+
* • callStructured → same endpoint using Claude's tool_use mechanism
|
|
9
|
+
* (the structured extraction tool), which is the most
|
|
10
|
+
* reliable way to get valid JSON from Claude without
|
|
11
|
+
* prompt-hacking. Falls back to prompt-only for
|
|
12
|
+
* claude-3-haiku which may not have tool_use.
|
|
13
|
+
*
|
|
14
|
+
* Supported models: claude-opus-4-5, claude-sonnet-4-5,
|
|
15
|
+
* claude-3-7-sonnet-latest, claude-3-5-sonnet-latest,
|
|
16
|
+
* claude-3-5-haiku-latest, claude-3-haiku-20240307
|
|
17
|
+
*/
|
|
18
|
+
import { asString, parseJsonObjectFromText } from "./utils.js";
|
|
19
|
+
import { RaxProviderError, mapHttpError, mapNetworkError, mapParseError, } from "./error-mapper.js";
|
|
20
|
+
import { calculateCost } from "./pricing.js";
|
|
21
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
22
|
+
// Adapter
|
|
23
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
24
|
+
const VENDOR = "claude";
|
|
25
|
+
const DEFAULT_MODEL = "claude-3-5-sonnet-latest";
|
|
26
|
+
const DEFAULT_BASE_URL = "https://api.anthropic.com";
|
|
27
|
+
const ANTHROPIC_VERSION = "2023-06-01";
|
|
28
|
+
/** Models that reliably support tool_use for structured output extraction. */
|
|
29
|
+
const TOOL_USE_MODELS = new Set([
|
|
30
|
+
"claude-opus-4-5",
|
|
31
|
+
"claude-sonnet-4-5",
|
|
32
|
+
"claude-3-7-sonnet-latest",
|
|
33
|
+
"claude-3-5-sonnet-latest",
|
|
34
|
+
"claude-3-5-haiku-latest",
|
|
35
|
+
"claude-3-opus-20240229",
|
|
36
|
+
"claude-3-sonnet-20240229",
|
|
37
|
+
]);
|
|
38
|
+
export class ClaudeAdapter {
|
|
39
|
+
apiKey;
|
|
40
|
+
baseUrl;
|
|
41
|
+
defaultModel;
|
|
42
|
+
timeoutMs;
|
|
43
|
+
constructor(optionsOrApiKey, legacyBaseUrl) {
|
|
44
|
+
if (typeof optionsOrApiKey === "string") {
|
|
45
|
+
this.apiKey = optionsOrApiKey;
|
|
46
|
+
this.baseUrl = legacyBaseUrl ?? DEFAULT_BASE_URL;
|
|
47
|
+
this.defaultModel = DEFAULT_MODEL;
|
|
48
|
+
this.timeoutMs = 30_000;
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
this.apiKey = optionsOrApiKey.apiKey;
|
|
52
|
+
this.baseUrl = optionsOrApiKey.baseUrl ?? DEFAULT_BASE_URL;
|
|
53
|
+
this.defaultModel = optionsOrApiKey.defaultModel ?? DEFAULT_MODEL;
|
|
54
|
+
this.timeoutMs = optionsOrApiKey.timeoutMs ?? 30_000;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// ── private helpers ────────────────────────────────────────────────────────
|
|
58
|
+
supportsToolUse(model) {
|
|
59
|
+
for (const known of TOOL_USE_MODELS) {
|
|
60
|
+
if (model === known || model.startsWith(`${known}-`) || model.startsWith("claude-3-5") || model.startsWith("claude-3-7") || model.startsWith("claude-opus") || model.startsWith("claude-sonnet")) {
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
async post(body, context) {
|
|
67
|
+
const controller = new AbortController();
|
|
68
|
+
const timer = setTimeout(() => controller.abort(), this.timeoutMs);
|
|
69
|
+
let res;
|
|
70
|
+
try {
|
|
71
|
+
res = await fetch(`${this.baseUrl}/v1/messages`, {
|
|
72
|
+
method: "POST",
|
|
73
|
+
headers: {
|
|
74
|
+
"x-api-key": this.apiKey,
|
|
75
|
+
"anthropic-version": ANTHROPIC_VERSION,
|
|
76
|
+
"content-type": "application/json",
|
|
77
|
+
},
|
|
78
|
+
body: JSON.stringify(body),
|
|
79
|
+
signal: controller.signal,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
clearTimeout(timer);
|
|
84
|
+
throw mapNetworkError(VENDOR, err);
|
|
85
|
+
}
|
|
86
|
+
finally {
|
|
87
|
+
clearTimeout(timer);
|
|
88
|
+
}
|
|
89
|
+
const raw = await res.json().catch(() => ({}));
|
|
90
|
+
if (!res.ok) {
|
|
91
|
+
throw mapHttpError(VENDOR, res.status, raw, context);
|
|
92
|
+
}
|
|
93
|
+
const payload = raw;
|
|
94
|
+
// Anthropic embeds errors inside 200 (type: "error")
|
|
95
|
+
if (payload.type === "error" && payload.error) {
|
|
96
|
+
const errType = payload.error.type ?? "";
|
|
97
|
+
const errMsg = payload.error.message ?? "unknown claude error";
|
|
98
|
+
const code = errType === "overloaded_error" ? "server_error" :
|
|
99
|
+
errType === "rate_limit_error" ? "auth_quota_exceeded" :
|
|
100
|
+
errType === "authentication_error" ? "auth_invalid" :
|
|
101
|
+
(errType.includes("content") || errType.includes("safety")) ? "content_filtered" :
|
|
102
|
+
"unknown";
|
|
103
|
+
throw new RaxProviderError(VENDOR, code, errMsg, { raw: payload });
|
|
104
|
+
}
|
|
105
|
+
return payload;
|
|
106
|
+
}
|
|
107
|
+
extractText(payload) {
|
|
108
|
+
return (payload.content
|
|
109
|
+
?.filter((c) => c.type === "text")
|
|
110
|
+
.map((c) => c.text)
|
|
111
|
+
.join("\n") ?? "");
|
|
112
|
+
}
|
|
113
|
+
extractToolInput(payload) {
|
|
114
|
+
const toolBlock = payload.content?.find((c) => c.type === "tool_use");
|
|
115
|
+
return toolBlock?.input ?? null;
|
|
116
|
+
}
|
|
117
|
+
// ── IModelProvider ─────────────────────────────────────────────────────────
|
|
118
|
+
async callModel(prompt, options) {
|
|
119
|
+
const started = Date.now();
|
|
120
|
+
const model = options?.model ?? this.defaultModel;
|
|
121
|
+
const payload = await this.post({
|
|
122
|
+
model,
|
|
123
|
+
max_tokens: options?.maxTokens ?? 1200,
|
|
124
|
+
temperature: options?.temperature ?? 0.2,
|
|
125
|
+
messages: [{ role: "user", content: prompt }],
|
|
126
|
+
}, "callModel");
|
|
127
|
+
const usage = payload.usage
|
|
128
|
+
? {
|
|
129
|
+
promptTokens: payload.usage.input_tokens ?? 0,
|
|
130
|
+
completionTokens: payload.usage.output_tokens ?? 0,
|
|
131
|
+
totalTokens: (payload.usage.input_tokens ?? 0) + (payload.usage.output_tokens ?? 0),
|
|
132
|
+
}
|
|
133
|
+
: undefined;
|
|
134
|
+
return {
|
|
135
|
+
provider: VENDOR,
|
|
136
|
+
model,
|
|
137
|
+
latencyMs: Date.now() - started,
|
|
138
|
+
costUsd: calculateCost(model, usage),
|
|
139
|
+
usage,
|
|
140
|
+
output: this.extractText(payload),
|
|
141
|
+
raw: payload,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
async callStructured(prompt, schema, options) {
|
|
145
|
+
const started = Date.now();
|
|
146
|
+
const model = options?.model ?? this.defaultModel;
|
|
147
|
+
if (this.supportsToolUse(model)) {
|
|
148
|
+
// ── Tool-use path (most reliable for structured output) ────────────────
|
|
149
|
+
const extractionTool = {
|
|
150
|
+
name: "structured_output",
|
|
151
|
+
description: "Extract the required structured data and return it as JSON.",
|
|
152
|
+
input_schema: schema,
|
|
153
|
+
};
|
|
154
|
+
const payload = await this.post({
|
|
155
|
+
model,
|
|
156
|
+
max_tokens: options?.maxTokens ?? 1400,
|
|
157
|
+
temperature: options?.temperature ?? 0,
|
|
158
|
+
messages: [{ role: "user", content: prompt }],
|
|
159
|
+
tools: [extractionTool],
|
|
160
|
+
tool_choice: { type: "tool", name: "structured_output" },
|
|
161
|
+
}, "callStructured");
|
|
162
|
+
const usage = payload.usage
|
|
163
|
+
? {
|
|
164
|
+
promptTokens: payload.usage.input_tokens ?? 0,
|
|
165
|
+
completionTokens: payload.usage.output_tokens ?? 0,
|
|
166
|
+
totalTokens: (payload.usage.input_tokens ?? 0) + (payload.usage.output_tokens ?? 0),
|
|
167
|
+
}
|
|
168
|
+
: undefined;
|
|
169
|
+
const toolInput = this.extractToolInput(payload);
|
|
170
|
+
if (toolInput && typeof toolInput === "object") {
|
|
171
|
+
return {
|
|
172
|
+
provider: VENDOR,
|
|
173
|
+
model,
|
|
174
|
+
latencyMs: Date.now() - started,
|
|
175
|
+
costUsd: calculateCost(model, usage),
|
|
176
|
+
usage,
|
|
177
|
+
output: toolInput,
|
|
178
|
+
raw: payload,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
// If tool_use block missing, fall through to text parsing
|
|
182
|
+
const textFallback = this.extractText(payload);
|
|
183
|
+
const parsed = parseJsonObjectFromText(textFallback);
|
|
184
|
+
if (parsed) {
|
|
185
|
+
return {
|
|
186
|
+
provider: VENDOR,
|
|
187
|
+
model,
|
|
188
|
+
latencyMs: Date.now() - started,
|
|
189
|
+
costUsd: calculateCost(model, usage),
|
|
190
|
+
usage,
|
|
191
|
+
output: parsed,
|
|
192
|
+
raw: payload,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
throw mapParseError(VENDOR, "callStructured", textFallback);
|
|
196
|
+
}
|
|
197
|
+
// ── Prompt-only path (claude-3-haiku and legacy models) ─────────────────
|
|
198
|
+
const strictPrompt = [
|
|
199
|
+
prompt,
|
|
200
|
+
"",
|
|
201
|
+
"Return ONLY valid JSON matching this schema (no other text):",
|
|
202
|
+
JSON.stringify(schema, null, 2),
|
|
203
|
+
].join("\n");
|
|
204
|
+
const payload = await this.post({
|
|
205
|
+
model,
|
|
206
|
+
max_tokens: options?.maxTokens ?? 1400,
|
|
207
|
+
temperature: 0,
|
|
208
|
+
messages: [{ role: "user", content: strictPrompt }],
|
|
209
|
+
}, "callStructured");
|
|
210
|
+
const usage = payload.usage
|
|
211
|
+
? {
|
|
212
|
+
promptTokens: payload.usage.input_tokens ?? 0,
|
|
213
|
+
completionTokens: payload.usage.output_tokens ?? 0,
|
|
214
|
+
totalTokens: (payload.usage.input_tokens ?? 0) + (payload.usage.output_tokens ?? 0),
|
|
215
|
+
}
|
|
216
|
+
: undefined;
|
|
217
|
+
const text = this.extractText(payload);
|
|
218
|
+
const parsed = parseJsonObjectFromText(asString(text));
|
|
219
|
+
if (!parsed) {
|
|
220
|
+
throw mapParseError(VENDOR, "callStructured", text);
|
|
221
|
+
}
|
|
222
|
+
return {
|
|
223
|
+
provider: VENDOR,
|
|
224
|
+
model,
|
|
225
|
+
latencyMs: Date.now() - started,
|
|
226
|
+
costUsd: calculateCost(model, usage),
|
|
227
|
+
usage,
|
|
228
|
+
output: parsed,
|
|
229
|
+
raw: payload,
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
async healthCheck() {
|
|
233
|
+
return Boolean(this.apiKey && this.baseUrl);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=claude-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-adapter.js","sourceRoot":"","sources":["../src/claude-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file cohere-adapter.ts
|
|
3
|
+
* Cohere bridge adapter (Command R / Command R+).
|
|
4
|
+
*
|
|
5
|
+
* API reference: https://docs.cohere.com/reference/chat
|
|
6
|
+
*
|
|
7
|
+
* • callModel → POST /v2/chat (v2 chat API — streaming=false)
|
|
8
|
+
* • callStructured → same endpoint with response_format="json_object"
|
|
9
|
+
* and a JSON schema injected via system_prompt
|
|
10
|
+
*
|
|
11
|
+
* Supported models: command-r-plus-08-2024, command-r-08-2024,
|
|
12
|
+
* command-r7b-12-2024, command-a-03-2025, etc.
|
|
13
|
+
*
|
|
14
|
+
* Notes:
|
|
15
|
+
* - Cohere v2 uses "message" field not "messages" for single-turn.
|
|
16
|
+
* - Structured JSON is supported via response_format + preamble (system).
|
|
17
|
+
*/
|
|
18
|
+
import { IModelProvider, ModelResponse, ProviderCallOptions } from "@rax-flow/core";
|
|
19
|
+
export interface CohereAdapterOptions {
|
|
20
|
+
apiKey: string;
|
|
21
|
+
baseUrl?: string;
|
|
22
|
+
defaultModel?: string;
|
|
23
|
+
timeoutMs?: number;
|
|
24
|
+
}
|
|
25
|
+
export declare class CohereAdapter implements IModelProvider {
|
|
26
|
+
private readonly apiKey;
|
|
27
|
+
private readonly baseUrl;
|
|
28
|
+
private readonly defaultModel;
|
|
29
|
+
private readonly timeoutMs;
|
|
30
|
+
constructor(options: CohereAdapterOptions);
|
|
31
|
+
private post;
|
|
32
|
+
private extractText;
|
|
33
|
+
callModel(prompt: string, options?: ProviderCallOptions): Promise<ModelResponse<string>>;
|
|
34
|
+
callStructured<T>(prompt: string, schema: object, options?: ProviderCallOptions): Promise<ModelResponse<T>>;
|
|
35
|
+
healthCheck(): Promise<boolean>;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=cohere-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cohere-adapter.d.ts","sourceRoot":"","sources":["../src/cohere-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AA0DpF,MAAM,WAAW,oBAAoB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,aAAc,YAAW,cAAc;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,OAAO,EAAE,oBAAoB;YAS3B,IAAI;IAkDlB,OAAO,CAAC,WAAW;IAWb,SAAS,CACX,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,mBAAmB,GAC9B,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAmC3B,cAAc,CAAC,CAAC,EAClB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,mBAAmB,GAC9B,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAyDtB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAGxC"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file cohere-adapter.ts
|
|
3
|
+
* Cohere bridge adapter (Command R / Command R+).
|
|
4
|
+
*
|
|
5
|
+
* API reference: https://docs.cohere.com/reference/chat
|
|
6
|
+
*
|
|
7
|
+
* • callModel → POST /v2/chat (v2 chat API — streaming=false)
|
|
8
|
+
* • callStructured → same endpoint with response_format="json_object"
|
|
9
|
+
* and a JSON schema injected via system_prompt
|
|
10
|
+
*
|
|
11
|
+
* Supported models: command-r-plus-08-2024, command-r-08-2024,
|
|
12
|
+
* command-r7b-12-2024, command-a-03-2025, etc.
|
|
13
|
+
*
|
|
14
|
+
* Notes:
|
|
15
|
+
* - Cohere v2 uses "message" field not "messages" for single-turn.
|
|
16
|
+
* - Structured JSON is supported via response_format + preamble (system).
|
|
17
|
+
*/
|
|
18
|
+
import { parseJsonObjectFromText } from "./utils.js";
|
|
19
|
+
import { RaxProviderError, mapHttpError, mapNetworkError, mapParseError, } from "./error-mapper.js";
|
|
20
|
+
import { calculateCost } from "./pricing.js";
|
|
21
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
22
|
+
// Adapter
|
|
23
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
24
|
+
const VENDOR = "cohere";
|
|
25
|
+
const DEFAULT_MODEL = "command-r-plus-08-2024";
|
|
26
|
+
const BASE_URL = "https://api.cohere.com";
|
|
27
|
+
export class CohereAdapter {
|
|
28
|
+
apiKey;
|
|
29
|
+
baseUrl;
|
|
30
|
+
defaultModel;
|
|
31
|
+
timeoutMs;
|
|
32
|
+
constructor(options) {
|
|
33
|
+
this.apiKey = options.apiKey;
|
|
34
|
+
this.baseUrl = options.baseUrl ?? BASE_URL;
|
|
35
|
+
this.defaultModel = options.defaultModel ?? DEFAULT_MODEL;
|
|
36
|
+
this.timeoutMs = options.timeoutMs ?? 30_000;
|
|
37
|
+
}
|
|
38
|
+
// ── private helpers ────────────────────────────────────────────────────────
|
|
39
|
+
async post(body, context) {
|
|
40
|
+
const controller = new AbortController();
|
|
41
|
+
const timer = setTimeout(() => controller.abort(), this.timeoutMs);
|
|
42
|
+
let res;
|
|
43
|
+
try {
|
|
44
|
+
res = await fetch(`${this.baseUrl}/v2/chat`, {
|
|
45
|
+
method: "POST",
|
|
46
|
+
headers: {
|
|
47
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
48
|
+
"Content-Type": "application/json",
|
|
49
|
+
Accept: "application/json",
|
|
50
|
+
},
|
|
51
|
+
body: JSON.stringify(body),
|
|
52
|
+
signal: controller.signal,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
clearTimeout(timer);
|
|
57
|
+
throw mapNetworkError(VENDOR, err);
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
clearTimeout(timer);
|
|
61
|
+
}
|
|
62
|
+
const raw = await res.json().catch(() => ({}));
|
|
63
|
+
if (!res.ok) {
|
|
64
|
+
throw mapHttpError(VENDOR, res.status, raw, context);
|
|
65
|
+
}
|
|
66
|
+
const payload = raw;
|
|
67
|
+
// Cohere finish reasons that signal a safety block
|
|
68
|
+
if (payload.finish_reason === "MAX_TOKENS" &&
|
|
69
|
+
!payload.message?.content?.length) {
|
|
70
|
+
throw new RaxProviderError(VENDOR, "content_filtered", "Cohere response truncated without content — possible safety block", { raw: payload });
|
|
71
|
+
}
|
|
72
|
+
return payload;
|
|
73
|
+
}
|
|
74
|
+
extractText(payload) {
|
|
75
|
+
return (payload.message?.content
|
|
76
|
+
?.filter((c) => c.type === "text")
|
|
77
|
+
.map((c) => c.text ?? "")
|
|
78
|
+
.join("\n") ?? "");
|
|
79
|
+
}
|
|
80
|
+
// ── IModelProvider ─────────────────────────────────────────────────────────
|
|
81
|
+
async callModel(prompt, options) {
|
|
82
|
+
const started = Date.now();
|
|
83
|
+
const model = options?.model ?? this.defaultModel;
|
|
84
|
+
const payload = await this.post({
|
|
85
|
+
model,
|
|
86
|
+
temperature: options?.temperature ?? 0.2,
|
|
87
|
+
max_tokens: options?.maxTokens ?? 1200,
|
|
88
|
+
messages: [{ role: "user", content: prompt }],
|
|
89
|
+
}, "callModel");
|
|
90
|
+
const inputTokens = payload.usage?.billed_units?.input_tokens ?? 0;
|
|
91
|
+
const outputTokens = payload.usage?.billed_units?.output_tokens ?? 0;
|
|
92
|
+
const usage = payload.usage?.billed_units
|
|
93
|
+
? {
|
|
94
|
+
promptTokens: inputTokens,
|
|
95
|
+
completionTokens: outputTokens,
|
|
96
|
+
totalTokens: inputTokens + outputTokens,
|
|
97
|
+
}
|
|
98
|
+
: undefined;
|
|
99
|
+
return {
|
|
100
|
+
provider: VENDOR,
|
|
101
|
+
model,
|
|
102
|
+
latencyMs: Date.now() - started,
|
|
103
|
+
costUsd: calculateCost(model, usage),
|
|
104
|
+
usage,
|
|
105
|
+
output: this.extractText(payload),
|
|
106
|
+
raw: payload,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
async callStructured(prompt, schema, options) {
|
|
110
|
+
const started = Date.now();
|
|
111
|
+
const model = options?.model ?? this.defaultModel;
|
|
112
|
+
// Cohere json_object mode with schema embedded in system message
|
|
113
|
+
const systemContent = [
|
|
114
|
+
"You are a JSON generation assistant.",
|
|
115
|
+
"ALWAYS respond with ONLY a valid JSON object.",
|
|
116
|
+
"The JSON must strictly follow this schema:",
|
|
117
|
+
JSON.stringify(schema, null, 2),
|
|
118
|
+
].join("\n");
|
|
119
|
+
const payload = await this.post({
|
|
120
|
+
model,
|
|
121
|
+
temperature: options?.temperature ?? 0,
|
|
122
|
+
max_tokens: options?.maxTokens ?? 1400,
|
|
123
|
+
response_format: {
|
|
124
|
+
type: "json_object",
|
|
125
|
+
json_schema: schema,
|
|
126
|
+
},
|
|
127
|
+
messages: [
|
|
128
|
+
{ role: "system", content: systemContent },
|
|
129
|
+
{ role: "user", content: prompt },
|
|
130
|
+
],
|
|
131
|
+
}, "callStructured");
|
|
132
|
+
const text = this.extractText(payload);
|
|
133
|
+
const parsed = parseJsonObjectFromText(text);
|
|
134
|
+
if (!parsed) {
|
|
135
|
+
throw mapParseError(VENDOR, "callStructured", text);
|
|
136
|
+
}
|
|
137
|
+
const inputTokens = payload.usage?.billed_units?.input_tokens ?? 0;
|
|
138
|
+
const outputTokens = payload.usage?.billed_units?.output_tokens ?? 0;
|
|
139
|
+
const usage = payload.usage?.billed_units
|
|
140
|
+
? {
|
|
141
|
+
promptTokens: inputTokens,
|
|
142
|
+
completionTokens: outputTokens,
|
|
143
|
+
totalTokens: inputTokens + outputTokens,
|
|
144
|
+
}
|
|
145
|
+
: undefined;
|
|
146
|
+
return {
|
|
147
|
+
provider: VENDOR,
|
|
148
|
+
model,
|
|
149
|
+
latencyMs: Date.now() - started,
|
|
150
|
+
costUsd: calculateCost(model, usage),
|
|
151
|
+
usage,
|
|
152
|
+
output: parsed,
|
|
153
|
+
raw: payload,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
async healthCheck() {
|
|
157
|
+
return Boolean(this.apiKey && this.baseUrl);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=cohere-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cohere-adapter.js","sourceRoot":"","sources":["../src/cohere-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file error-mapper.ts
|
|
3
|
+
* Standardized error taxonomy for all vendor bridge adapters.
|
|
4
|
+
*
|
|
5
|
+
* Every adapter MUST throw a `RaxProviderError` (or a subclass) so that the
|
|
6
|
+
* orchestrator / recovery engine can make uniform decisions on retry,
|
|
7
|
+
* fallback, and escalation without inspecting vendor-specific strings.
|
|
8
|
+
*/
|
|
9
|
+
export type RaxErrorCode = "auth_invalid" | "auth_quota_exceeded" | "model_not_found" | "context_length_exceeded" | "content_filtered" | "invalid_request" | "server_error" | "network_error" | "timeout" | "parse_failed" | "structured_schema_mismatch" | "bridge_unavailable" | "unknown";
|
|
10
|
+
/** True when the caller should retry the *same* provider. */
|
|
11
|
+
export declare const RETRYABLE_CODES: ReadonlySet<RaxErrorCode>;
|
|
12
|
+
/** True when the orchestrator should fall back to a *different* provider. */
|
|
13
|
+
export declare const FALLBACK_CODES: ReadonlySet<RaxErrorCode>;
|
|
14
|
+
export declare class RaxProviderError extends Error {
|
|
15
|
+
/** Machine-readable code driving orchestrator decisions. */
|
|
16
|
+
readonly code: RaxErrorCode;
|
|
17
|
+
/** HTTP status code if the error originated from an HTTP response. */
|
|
18
|
+
readonly httpStatus?: number;
|
|
19
|
+
/** Originating vendor name (e.g. "openai", "gemini"). */
|
|
20
|
+
readonly vendor: string;
|
|
21
|
+
/** Whether the same provider should be retried. */
|
|
22
|
+
readonly isRetryable: boolean;
|
|
23
|
+
/** Whether the orchestrator should fall back to another provider. */
|
|
24
|
+
readonly shouldFallback: boolean;
|
|
25
|
+
/** Raw vendor error payload for observability. */
|
|
26
|
+
readonly raw?: unknown;
|
|
27
|
+
constructor(vendor: string, code: RaxErrorCode, message: string, options?: {
|
|
28
|
+
httpStatus?: number;
|
|
29
|
+
raw?: unknown;
|
|
30
|
+
cause?: Error;
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Maps a non-2xx HTTP response to a `RaxProviderError`.
|
|
35
|
+
* Each adapter calls this after detecting `!res.ok`.
|
|
36
|
+
*
|
|
37
|
+
* @param vendor - The adapter name string (e.g. "gemini")
|
|
38
|
+
* @param status - HTTP status code
|
|
39
|
+
* @param body - Pre-parsed response body (may be any shape)
|
|
40
|
+
* @param context - "callModel" | "callStructured" for message clarity
|
|
41
|
+
*/
|
|
42
|
+
export declare function mapHttpError(vendor: string, status: number, body: unknown, context: "callModel" | "callStructured"): RaxProviderError;
|
|
43
|
+
/**
|
|
44
|
+
* Wraps a network-level exception (fetch threw) in a `RaxProviderError`.
|
|
45
|
+
*/
|
|
46
|
+
export declare function mapNetworkError(vendor: string, cause: unknown): RaxProviderError;
|
|
47
|
+
/**
|
|
48
|
+
* Creates a structured-output parse failure error.
|
|
49
|
+
*/
|
|
50
|
+
export declare function mapParseError(vendor: string, context: "callStructured", raw: string): RaxProviderError;
|
|
51
|
+
//# sourceMappingURL=error-mapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-mapper.d.ts","sourceRoot":"","sources":["../src/error-mapper.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,MAAM,MAAM,YAAY,GAClB,cAAc,GACd,qBAAqB,GACrB,iBAAiB,GACjB,yBAAyB,GACzB,kBAAkB,GAClB,iBAAiB,GACjB,cAAc,GACd,eAAe,GACf,SAAS,GACT,cAAc,GACd,4BAA4B,GAC5B,oBAAoB,GACpB,SAAS,CAAC;AAEhB,6DAA6D;AAC7D,eAAO,MAAM,eAAe,EAAE,WAAW,CAAC,YAAY,CAKpD,CAAC;AAEH,6EAA6E;AAC7E,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,YAAY,CAOnD,CAAC;AAMH,qBAAa,gBAAiB,SAAQ,KAAK;IACvC,4DAA4D;IAC5D,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,sEAAsE;IACtE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,yDAAyD;IACzD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,mDAAmD;IACnD,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,qEAAqE;IACrE,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,kDAAkD;IAClD,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;gBAGnB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,KAAK,CAAA;KAAE;CActE;AAMD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CACxB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,WAAW,GAAG,gBAAgB,GACxC,gBAAgB,CAgClB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAWhF;AAED;;GAEG;AACH,wBAAgB,aAAa,CACzB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,gBAAgB,EACzB,GAAG,EAAE,MAAM,GACZ,gBAAgB,CAOlB"}
|