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.
Files changed (67) hide show
  1. package/dist/claude-adapter.d.ts +41 -0
  2. package/dist/claude-adapter.d.ts.map +1 -0
  3. package/dist/claude-adapter.js +236 -0
  4. package/dist/claude-adapter.js.map +1 -0
  5. package/dist/cohere-adapter.d.ts +37 -0
  6. package/dist/cohere-adapter.d.ts.map +1 -0
  7. package/dist/cohere-adapter.js +160 -0
  8. package/dist/cohere-adapter.js.map +1 -0
  9. package/dist/error-mapper.d.ts +51 -0
  10. package/dist/error-mapper.d.ts.map +1 -0
  11. package/dist/error-mapper.js +132 -0
  12. package/dist/error-mapper.js.map +1 -0
  13. package/dist/gemini-adapter.d.ts +37 -0
  14. package/dist/gemini-adapter.d.ts.map +1 -0
  15. package/dist/gemini-adapter.js +150 -0
  16. package/dist/gemini-adapter.js.map +1 -0
  17. package/dist/groq-adapter.d.ts +35 -0
  18. package/dist/groq-adapter.d.ts.map +1 -0
  19. package/dist/groq-adapter.js +152 -0
  20. package/dist/groq-adapter.js.map +1 -0
  21. package/dist/host-bridge-adapter.d.ts +20 -0
  22. package/dist/host-bridge-adapter.d.ts.map +1 -0
  23. package/dist/host-bridge-adapter.js +145 -0
  24. package/dist/host-bridge-adapter.js.map +1 -0
  25. package/dist/index.d.ts +12 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +12 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/mistral-adapter.d.ts +39 -0
  30. package/dist/mistral-adapter.d.ts.map +1 -0
  31. package/dist/mistral-adapter.js +172 -0
  32. package/dist/mistral-adapter.js.map +1 -0
  33. package/dist/openai-adapter.d.ts +30 -0
  34. package/dist/openai-adapter.d.ts.map +1 -0
  35. package/dist/openai-adapter.js +171 -0
  36. package/dist/openai-adapter.js.map +1 -0
  37. package/dist/pricing.d.ts +15 -0
  38. package/dist/pricing.d.ts.map +1 -0
  39. package/dist/pricing.js +61 -0
  40. package/dist/pricing.js.map +1 -0
  41. package/dist/rest-adapter.d.ts +32 -0
  42. package/dist/rest-adapter.d.ts.map +1 -0
  43. package/dist/rest-adapter.js +124 -0
  44. package/dist/rest-adapter.js.map +1 -0
  45. package/dist/strategy.d.ts +38 -0
  46. package/dist/strategy.d.ts.map +1 -0
  47. package/dist/strategy.js +117 -0
  48. package/dist/strategy.js.map +1 -0
  49. package/dist/utils.d.ts +3 -0
  50. package/dist/utils.d.ts.map +1 -0
  51. package/dist/utils.js +22 -0
  52. package/dist/utils.js.map +1 -0
  53. package/package.json +18 -0
  54. package/src/claude-adapter.ts +350 -0
  55. package/src/cohere-adapter.ts +262 -0
  56. package/src/error-mapper.ts +187 -0
  57. package/src/gemini-adapter.ts +246 -0
  58. package/src/groq-adapter.ts +234 -0
  59. package/src/host-bridge-adapter.ts +189 -0
  60. package/src/index.ts +11 -0
  61. package/src/mistral-adapter.ts +262 -0
  62. package/src/openai-adapter.ts +240 -0
  63. package/src/pricing.ts +77 -0
  64. package/src/rest-adapter.ts +181 -0
  65. package/src/strategy.ts +166 -0
  66. package/src/utils.ts +18 -0
  67. package/tsconfig.json +18 -0
@@ -0,0 +1,145 @@
1
+ import { spawn } from "node:child_process";
2
+ import { parseJsonObjectFromText } from "./utils.js";
3
+ function parseShellCommand(input) {
4
+ const parts = input.match(/(?:[^\s"]+|"[^"]*")+/g) ?? [];
5
+ if (parts.length === 0) {
6
+ throw new Error("invalid_bridge_command");
7
+ }
8
+ const [command, ...rawArgs] = parts;
9
+ const args = rawArgs.map((arg) => arg.replace(/^"|"$/g, ""));
10
+ // `command` is defined here because parts.length > 0 is guaranteed above
11
+ return { command: command, args };
12
+ }
13
+ async function runBridgeCommand(commandSpec, payload, timeoutMs) {
14
+ const { command, args } = parseShellCommand(commandSpec);
15
+ return await new Promise((resolve, reject) => {
16
+ const child = spawn(command, args, { stdio: ["pipe", "pipe", "pipe"] });
17
+ let stdout = "";
18
+ let stderr = "";
19
+ const timer = setTimeout(() => {
20
+ child.kill("SIGKILL");
21
+ reject(new Error("host_bridge_timeout"));
22
+ }, timeoutMs);
23
+ child.stdout.on("data", (chunk) => {
24
+ stdout += String(chunk);
25
+ });
26
+ child.stderr.on("data", (chunk) => {
27
+ stderr += String(chunk);
28
+ });
29
+ child.on("error", (error) => {
30
+ clearTimeout(timer);
31
+ reject(error);
32
+ });
33
+ child.on("close", (code) => {
34
+ clearTimeout(timer);
35
+ if (code !== 0) {
36
+ reject(new Error(`host_bridge_command_failed:${code}:${stderr}`));
37
+ return;
38
+ }
39
+ try {
40
+ const parsed = JSON.parse(stdout);
41
+ resolve(parsed);
42
+ }
43
+ catch {
44
+ resolve({ ok: true, output: stdout.trim(), model: "host-bridge-command" });
45
+ }
46
+ });
47
+ child.stdin.write(JSON.stringify(payload));
48
+ child.stdin.end();
49
+ });
50
+ }
51
+ function getGlobalBridge() {
52
+ const candidate = globalThis.__RAX_HOST_BRIDGE__;
53
+ if (typeof candidate === "function") {
54
+ return candidate;
55
+ }
56
+ return undefined;
57
+ }
58
+ export class HostBridgeAdapter {
59
+ model;
60
+ mode;
61
+ command;
62
+ timeoutMs;
63
+ constructor(options = {}) {
64
+ this.model = options.model ?? "host-managed";
65
+ this.mode = options.mode ?? "auto";
66
+ this.command = options.command;
67
+ this.timeoutMs = options.timeoutMs ?? 20000;
68
+ }
69
+ async callBridge(payload) {
70
+ const bridgeFn = getGlobalBridge();
71
+ if (bridgeFn) {
72
+ return await bridgeFn(payload);
73
+ }
74
+ if (this.command) {
75
+ return await runBridgeCommand(this.command, payload, this.timeoutMs);
76
+ }
77
+ if (this.mode === "bridge-only") {
78
+ throw new Error("host_bridge_missing");
79
+ }
80
+ return {
81
+ ok: true,
82
+ model: this.model,
83
+ latencyMs: 1,
84
+ output: payload.action === "callStructured"
85
+ ? {
86
+ agent: "HostBridgeMock",
87
+ success: true,
88
+ confidence: 0.7,
89
+ risks: ["latency"],
90
+ logs: ["host bridge unavailable, using local mock response"],
91
+ data: {
92
+ summary: "Mock structured output from host adapter",
93
+ nextAction: "configure_host_bridge"
94
+ }
95
+ }
96
+ : `host-mock:${payload.prompt.slice(0, 240)}`
97
+ };
98
+ }
99
+ async callModel(prompt, options) {
100
+ const started = Date.now();
101
+ const res = await this.callBridge({ version: 1, action: "callModel", prompt, options });
102
+ if (!res.ok) {
103
+ throw new Error(`host_call_failed:${res.error ?? "unknown"}`);
104
+ }
105
+ return {
106
+ provider: "host",
107
+ model: res.model ?? options?.model ?? this.model,
108
+ latencyMs: res.latencyMs ?? Date.now() - started,
109
+ output: typeof res.output === "string" ? res.output : JSON.stringify(res.output ?? "")
110
+ };
111
+ }
112
+ async callStructured(prompt, schema, options) {
113
+ const started = Date.now();
114
+ const res = await this.callBridge({ version: 1, action: "callStructured", prompt, schema, options });
115
+ if (!res.ok) {
116
+ throw new Error(`host_structured_failed:${res.error ?? "unknown"}`);
117
+ }
118
+ let output = null;
119
+ if (res.output && typeof res.output === "object") {
120
+ output = res.output;
121
+ }
122
+ else if (typeof res.output === "string") {
123
+ output = parseJsonObjectFromText(res.output);
124
+ }
125
+ if (!output) {
126
+ throw new Error("host_structured_parse_failed");
127
+ }
128
+ return {
129
+ provider: "host",
130
+ model: res.model ?? options?.model ?? this.model,
131
+ latencyMs: res.latencyMs ?? Date.now() - started,
132
+ output
133
+ };
134
+ }
135
+ async healthCheck() {
136
+ if (this.mode === "mock")
137
+ return true;
138
+ if (getGlobalBridge())
139
+ return true;
140
+ if (this.command)
141
+ return true;
142
+ return this.mode === "auto";
143
+ }
144
+ }
145
+ //# sourceMappingURL=host-bridge-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-bridge-adapter.js","sourceRoot":"","sources":["../src/host-bridge-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export * from "./error-mapper.js";
2
+ export * from "./openai-adapter.js";
3
+ export * from "./claude-adapter.js";
4
+ export * from "./gemini-adapter.js";
5
+ export * from "./groq-adapter.js";
6
+ export * from "./mistral-adapter.js";
7
+ export * from "./cohere-adapter.js";
8
+ export * from "./rest-adapter.js";
9
+ export * from "./host-bridge-adapter.js";
10
+ export * from "./strategy.js";
11
+ export * from "./utils.js";
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,12 @@
1
+ export * from "./error-mapper.js";
2
+ export * from "./openai-adapter.js";
3
+ export * from "./claude-adapter.js";
4
+ export * from "./gemini-adapter.js";
5
+ export * from "./groq-adapter.js";
6
+ export * from "./mistral-adapter.js";
7
+ export * from "./cohere-adapter.js";
8
+ export * from "./rest-adapter.js";
9
+ export * from "./host-bridge-adapter.js";
10
+ export * from "./strategy.js";
11
+ export * from "./utils.js";
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * @file mistral-adapter.ts
3
+ * Mistral AI bridge adapter.
4
+ *
5
+ * API reference: https://docs.mistral.ai/api/
6
+ *
7
+ * • callModel → POST /v1/chat/completions (standard)
8
+ * • callStructured → same endpoint with `response_format: { type: "json_object" }`
9
+ * Mistral supports native JSON mode since 2024-02 on all
10
+ * large models. For smaller models we fall back to
11
+ * system-prompt enforcement.
12
+ *
13
+ * Supported models: mistral-large-latest, mistral-small-latest,
14
+ * open-mixtral-8x22b, codestral-latest, etc.
15
+ */
16
+ import { IModelProvider, ModelResponse, ProviderCallOptions } from "@rax-flow/core";
17
+ export interface MistralAdapterOptions {
18
+ apiKey: string;
19
+ baseUrl?: string;
20
+ defaultModel?: string;
21
+ timeoutMs?: number;
22
+ /** Disable Mistral safe-prompt for structured tasks (default: false). */
23
+ safePrompt?: boolean;
24
+ }
25
+ export declare class MistralAdapter implements IModelProvider {
26
+ private readonly apiKey;
27
+ private readonly baseUrl;
28
+ private readonly defaultModel;
29
+ private readonly timeoutMs;
30
+ private readonly safePrompt;
31
+ constructor(options: MistralAdapterOptions);
32
+ private supportsJsonMode;
33
+ private post;
34
+ private extractText;
35
+ callModel(prompt: string, options?: ProviderCallOptions): Promise<ModelResponse<string>>;
36
+ callStructured<T>(prompt: string, schema: object, options?: ProviderCallOptions): Promise<ModelResponse<T>>;
37
+ healthCheck(): Promise<boolean>;
38
+ }
39
+ //# sourceMappingURL=mistral-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mistral-adapter.d.ts","sourceRoot":"","sources":["../src/mistral-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAyDpF,MAAM,WAAW,qBAAqB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yEAAyE;IACzE,UAAU,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,qBAAa,cAAe,YAAW,cAAc;IACjD,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;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAU;gBAEzB,OAAO,EAAE,qBAAqB;IAU1C,OAAO,CAAC,gBAAgB;YAIV,IAAI;IAgDlB,OAAO,CAAC,WAAW;IAMb,SAAS,CACX,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,mBAAmB,GAC9B,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAkC3B,cAAc,CAAC,CAAC,EAClB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,mBAAmB,GAC9B,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IA4DtB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAGxC"}
@@ -0,0 +1,172 @@
1
+ /**
2
+ * @file mistral-adapter.ts
3
+ * Mistral AI bridge adapter.
4
+ *
5
+ * API reference: https://docs.mistral.ai/api/
6
+ *
7
+ * • callModel → POST /v1/chat/completions (standard)
8
+ * • callStructured → same endpoint with `response_format: { type: "json_object" }`
9
+ * Mistral supports native JSON mode since 2024-02 on all
10
+ * large models. For smaller models we fall back to
11
+ * system-prompt enforcement.
12
+ *
13
+ * Supported models: mistral-large-latest, mistral-small-latest,
14
+ * open-mixtral-8x22b, codestral-latest, etc.
15
+ */
16
+ import { parseJsonObjectFromText } from "./utils.js";
17
+ import { RaxProviderError, mapHttpError, mapNetworkError, mapParseError, } from "./error-mapper.js";
18
+ import { calculateCost } from "./pricing.js";
19
+ // ─────────────────────────────────────────────────────────────────────────────
20
+ // Adapter
21
+ // ─────────────────────────────────────────────────────────────────────────────
22
+ const VENDOR = "mistral";
23
+ const DEFAULT_MODEL = "mistral-large-latest";
24
+ const BASE_URL = "https://api.mistral.ai";
25
+ /** Models known to support native json_object response_format. */
26
+ const JSON_MODE_MODELS = new Set([
27
+ "mistral-large-latest",
28
+ "mistral-small-latest",
29
+ "codestral-latest",
30
+ "open-mixtral-8x22b",
31
+ "open-mistral-nemo",
32
+ ]);
33
+ export class MistralAdapter {
34
+ apiKey;
35
+ baseUrl;
36
+ defaultModel;
37
+ timeoutMs;
38
+ safePrompt;
39
+ constructor(options) {
40
+ this.apiKey = options.apiKey;
41
+ this.baseUrl = options.baseUrl ?? BASE_URL;
42
+ this.defaultModel = options.defaultModel ?? DEFAULT_MODEL;
43
+ this.timeoutMs = options.timeoutMs ?? 25_000;
44
+ this.safePrompt = options.safePrompt ?? false;
45
+ }
46
+ // ── private helpers ────────────────────────────────────────────────────────
47
+ supportsJsonMode(model) {
48
+ return JSON_MODE_MODELS.has(model);
49
+ }
50
+ async post(body, context) {
51
+ const controller = new AbortController();
52
+ const timer = setTimeout(() => controller.abort(), this.timeoutMs);
53
+ let res;
54
+ try {
55
+ res = await fetch(`${this.baseUrl}/v1/chat/completions`, {
56
+ method: "POST",
57
+ headers: {
58
+ Authorization: `Bearer ${this.apiKey}`,
59
+ "Content-Type": "application/json",
60
+ Accept: "application/json",
61
+ },
62
+ body: JSON.stringify(body),
63
+ signal: controller.signal,
64
+ });
65
+ }
66
+ catch (err) {
67
+ clearTimeout(timer);
68
+ throw mapNetworkError(VENDOR, err);
69
+ }
70
+ finally {
71
+ clearTimeout(timer);
72
+ }
73
+ const raw = await res.json().catch(() => ({}));
74
+ if (!res.ok) {
75
+ throw mapHttpError(VENDOR, res.status, raw, context);
76
+ }
77
+ const payload = raw;
78
+ // Mistral can signal content policy stop
79
+ const finishReason = payload.choices?.[0]?.finish_reason;
80
+ if (finishReason === "content_filter") {
81
+ throw new RaxProviderError(VENDOR, "content_filtered", "Mistral content policy rejection", { raw: payload });
82
+ }
83
+ return payload;
84
+ }
85
+ extractText(payload) {
86
+ return payload.choices?.[0]?.message?.content ?? "";
87
+ }
88
+ // ── IModelProvider ─────────────────────────────────────────────────────────
89
+ async callModel(prompt, options) {
90
+ const started = Date.now();
91
+ const model = options?.model ?? this.defaultModel;
92
+ const payload = await this.post({
93
+ model,
94
+ temperature: options?.temperature ?? 0.2,
95
+ max_tokens: options?.maxTokens ?? 1200,
96
+ safe_prompt: this.safePrompt,
97
+ messages: [{ role: "user", content: prompt }],
98
+ }, "callModel");
99
+ const usage = payload.usage
100
+ ? {
101
+ promptTokens: payload.usage.prompt_tokens ?? 0,
102
+ completionTokens: payload.usage.completion_tokens ?? 0,
103
+ totalTokens: payload.usage.total_tokens ?? 0,
104
+ }
105
+ : undefined;
106
+ return {
107
+ provider: VENDOR,
108
+ model,
109
+ latencyMs: Date.now() - started,
110
+ costUsd: calculateCost(model, usage),
111
+ usage,
112
+ output: this.extractText(payload),
113
+ raw: payload,
114
+ };
115
+ }
116
+ async callStructured(prompt, schema, options) {
117
+ const started = Date.now();
118
+ const model = options?.model ?? this.defaultModel;
119
+ const messages = [];
120
+ if (this.supportsJsonMode(model)) {
121
+ // Native JSON mode — schema hint via system prompt
122
+ messages.push({
123
+ role: "system",
124
+ content: `Respond with ONLY a valid JSON object that matches this schema:\n${JSON.stringify(schema, null, 2)}`,
125
+ });
126
+ messages.push({ role: "user", content: prompt });
127
+ }
128
+ else {
129
+ // Fallback for non-json-mode models: inline schema in user message
130
+ messages.push({
131
+ role: "user",
132
+ content: `${prompt}\n\nRespond ONLY with a JSON object matching this schema:\n${JSON.stringify(schema)}`,
133
+ });
134
+ }
135
+ const requestBody = {
136
+ model,
137
+ temperature: options?.temperature ?? 0,
138
+ max_tokens: options?.maxTokens ?? 1400,
139
+ safe_prompt: false, // disable safe rewrites on structured tasks
140
+ messages,
141
+ };
142
+ if (this.supportsJsonMode(model)) {
143
+ requestBody.response_format = { type: "json_object" };
144
+ }
145
+ const payload = await this.post(requestBody, "callStructured");
146
+ const text = this.extractText(payload);
147
+ const parsed = parseJsonObjectFromText(text);
148
+ if (!parsed) {
149
+ throw mapParseError(VENDOR, "callStructured", text);
150
+ }
151
+ const usage = payload.usage
152
+ ? {
153
+ promptTokens: payload.usage.prompt_tokens ?? 0,
154
+ completionTokens: payload.usage.completion_tokens ?? 0,
155
+ totalTokens: payload.usage.total_tokens ?? 0,
156
+ }
157
+ : undefined;
158
+ return {
159
+ provider: VENDOR,
160
+ model,
161
+ latencyMs: Date.now() - started,
162
+ costUsd: calculateCost(model, usage),
163
+ usage,
164
+ output: parsed,
165
+ raw: payload,
166
+ };
167
+ }
168
+ async healthCheck() {
169
+ return Boolean(this.apiKey && this.baseUrl);
170
+ }
171
+ }
172
+ //# sourceMappingURL=mistral-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mistral-adapter.js","sourceRoot":"","sources":["../src/mistral-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @file openai-adapter.ts
3
+ * OpenAI bridge adapter.
4
+ *
5
+ * API reference: https://platform.openai.com/docs/api-reference/chat
6
+ */
7
+ import { IModelProvider, IEmbeddingProvider, ModelResponse, ProviderCallOptions, EmbeddingResponse } from "@rax-flow/core";
8
+ export interface OpenAIAdapterOptions {
9
+ apiKey: string;
10
+ baseUrl?: string;
11
+ defaultModel?: string;
12
+ timeoutMs?: number;
13
+ }
14
+ export declare class OpenAIAdapter implements IModelProvider, IEmbeddingProvider {
15
+ private readonly apiKey;
16
+ private readonly baseUrl;
17
+ private readonly defaultModel;
18
+ private readonly timeoutMs;
19
+ constructor(options: OpenAIAdapterOptions);
20
+ /** @deprecated Pass an options object instead of positional args. */
21
+ constructor(apiKey: string, baseUrl?: string);
22
+ private supportsStrictJsonSchema;
23
+ private post;
24
+ private extractText;
25
+ callModel(prompt: string, options?: ProviderCallOptions): Promise<ModelResponse<string>>;
26
+ callStructured<T>(prompt: string, schema: object, options?: ProviderCallOptions): Promise<ModelResponse<T>>;
27
+ embed(texts: string[]): Promise<EmbeddingResponse>;
28
+ healthCheck(): Promise<boolean>;
29
+ }
30
+ //# sourceMappingURL=openai-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-adapter.d.ts","sourceRoot":"","sources":["../src/openai-adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAyD3H,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,EAAE,kBAAkB;IACtE,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,qEAAqE;gBACzD,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;IAkB5C,OAAO,CAAC,wBAAwB;YAOlB,IAAI;IA0ClB,OAAO,CAAC,WAAW;IAMb,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAsBxF,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAoC3G,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA0BlD,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAGtC"}
@@ -0,0 +1,171 @@
1
+ /**
2
+ * @file openai-adapter.ts
3
+ * OpenAI bridge adapter.
4
+ *
5
+ * API reference: https://platform.openai.com/docs/api-reference/chat
6
+ */
7
+ import { asString, parseJsonObjectFromText } from "./utils.js";
8
+ import { calculateCost } from "./pricing.js";
9
+ import { RaxProviderError, mapHttpError, mapNetworkError, mapParseError, } from "./error-mapper.js";
10
+ const VENDOR = "openai";
11
+ const DEFAULT_MODEL = "gpt-4.1-mini";
12
+ const DEFAULT_BASE_URL = "https://api.openai.com/v1";
13
+ const STRICT_JSON_SCHEMA_MODELS = new Set([
14
+ "gpt-4o",
15
+ "gpt-4o-mini",
16
+ "gpt-4.1",
17
+ "gpt-4.1-mini",
18
+ "gpt-4.1-nano",
19
+ "gpt-4-turbo",
20
+ "o1",
21
+ "o1-mini",
22
+ "o3-mini",
23
+ ]);
24
+ export class OpenAIAdapter {
25
+ apiKey;
26
+ baseUrl;
27
+ defaultModel;
28
+ timeoutMs;
29
+ constructor(optionsOrApiKey, legacyBaseUrl) {
30
+ if (typeof optionsOrApiKey === "string") {
31
+ this.apiKey = optionsOrApiKey;
32
+ this.baseUrl = legacyBaseUrl ?? DEFAULT_BASE_URL;
33
+ this.defaultModel = DEFAULT_MODEL;
34
+ this.timeoutMs = 30_000;
35
+ }
36
+ else {
37
+ this.apiKey = optionsOrApiKey.apiKey;
38
+ this.baseUrl = optionsOrApiKey.baseUrl ?? DEFAULT_BASE_URL;
39
+ this.defaultModel = optionsOrApiKey.defaultModel ?? DEFAULT_MODEL;
40
+ this.timeoutMs = optionsOrApiKey.timeoutMs ?? 30_000;
41
+ }
42
+ }
43
+ supportsStrictJsonSchema(model) {
44
+ for (const known of STRICT_JSON_SCHEMA_MODELS) {
45
+ if (model === known || model.startsWith(`${known}-`))
46
+ return true;
47
+ }
48
+ return false;
49
+ }
50
+ async post(body, context) {
51
+ const controller = new AbortController();
52
+ const timer = setTimeout(() => controller.abort(), this.timeoutMs);
53
+ let res;
54
+ try {
55
+ res = await fetch(`${this.baseUrl}/chat/completions`, {
56
+ method: "POST",
57
+ headers: {
58
+ Authorization: `Bearer ${this.apiKey}`,
59
+ "Content-Type": "application/json",
60
+ },
61
+ body: JSON.stringify(body),
62
+ signal: controller.signal,
63
+ });
64
+ }
65
+ catch (err) {
66
+ clearTimeout(timer);
67
+ throw mapNetworkError(VENDOR, err);
68
+ }
69
+ finally {
70
+ clearTimeout(timer);
71
+ }
72
+ const raw = await res.json().catch(() => ({}));
73
+ if (!res.ok)
74
+ throw mapHttpError(VENDOR, res.status, raw, context);
75
+ const payload = raw;
76
+ if (payload.error) {
77
+ const errMsg = payload.error.message ?? "unknown openai error";
78
+ const isRefusal = payload.error.type === "invalid_request_error" && /content_policy|moderat|filter/i.test(errMsg);
79
+ throw new RaxProviderError(VENDOR, isRefusal ? "content_filtered" : "invalid_request", errMsg, { raw: payload });
80
+ }
81
+ const finishReason = payload.choices?.[0]?.finish_reason;
82
+ if (finishReason === "content_filter") {
83
+ throw new RaxProviderError(VENDOR, "content_filtered", "OpenAI content policy rejection", { raw: payload });
84
+ }
85
+ return payload;
86
+ }
87
+ extractText(payload) {
88
+ const content = payload.choices?.[0]?.message?.content;
89
+ if (Array.isArray(content))
90
+ return content.map((c) => c.text ?? "").join("\n");
91
+ return content ?? "";
92
+ }
93
+ async callModel(prompt, options) {
94
+ const started = Date.now();
95
+ const model = options?.model ?? this.defaultModel;
96
+ const payload = await this.post({
97
+ model,
98
+ temperature: options?.temperature ?? 0.2,
99
+ max_tokens: options?.maxTokens ?? 1200,
100
+ messages: [{ role: "user", content: prompt }],
101
+ }, "callModel");
102
+ const usage = payload.usage ? {
103
+ promptTokens: payload.usage.prompt_tokens ?? 0,
104
+ completionTokens: payload.usage.completion_tokens ?? 0,
105
+ totalTokens: payload.usage.total_tokens ?? 0,
106
+ } : undefined;
107
+ return {
108
+ provider: VENDOR, model, latencyMs: Date.now() - started, costUsd: calculateCost(model, usage), usage,
109
+ output: this.extractText(payload), raw: payload,
110
+ };
111
+ }
112
+ async callStructured(prompt, schema, options) {
113
+ const started = Date.now();
114
+ const model = options?.model ?? this.defaultModel;
115
+ const body = {
116
+ model, temperature: options?.temperature ?? 0, max_tokens: options?.maxTokens ?? 1400,
117
+ messages: [{ role: "user", content: prompt }],
118
+ };
119
+ if (this.supportsStrictJsonSchema(model)) {
120
+ body.response_format = { type: "json_schema", json_schema: { name: "rax_flow_output", strict: true, schema } };
121
+ }
122
+ else {
123
+ body.response_format = { type: "json_object" };
124
+ body.messages = [
125
+ { role: "system", content: `Respond ONLY with a valid JSON object matching this schema:\n${JSON.stringify(schema, null, 2)}` },
126
+ { role: "user", content: prompt },
127
+ ];
128
+ }
129
+ const payload = await this.post(body, "callStructured");
130
+ const text = asString(this.extractText(payload) || "{}");
131
+ const parsed = parseJsonObjectFromText(text);
132
+ if (!parsed)
133
+ throw mapParseError(VENDOR, "callStructured", text);
134
+ const usage = payload.usage ? {
135
+ promptTokens: payload.usage.prompt_tokens ?? 0,
136
+ completionTokens: payload.usage.completion_tokens ?? 0,
137
+ totalTokens: payload.usage.total_tokens ?? 0,
138
+ } : undefined;
139
+ return {
140
+ provider: VENDOR, model, latencyMs: Date.now() - started, costUsd: calculateCost(model, usage), usage,
141
+ output: parsed, raw: payload,
142
+ };
143
+ }
144
+ async embed(texts) {
145
+ const res = await fetch(`${this.baseUrl}/embeddings`, {
146
+ method: "POST",
147
+ headers: {
148
+ Authorization: `Bearer ${this.apiKey}`,
149
+ "Content-Type": "application/json",
150
+ },
151
+ body: JSON.stringify({
152
+ input: texts,
153
+ model: "text-embedding-3-small",
154
+ }),
155
+ });
156
+ if (!res.ok) {
157
+ const raw = await res.json().catch(() => ({}));
158
+ throw mapHttpError(VENDOR, res.status, raw, "embed");
159
+ }
160
+ const payload = (await res.json());
161
+ return {
162
+ vectors: payload.data.map((d) => d.embedding),
163
+ model: payload.model,
164
+ usage: { totalTokens: payload.usage.total_tokens }
165
+ };
166
+ }
167
+ async healthCheck() {
168
+ return Boolean(this.apiKey && this.baseUrl);
169
+ }
170
+ }
171
+ //# sourceMappingURL=openai-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-adapter.js","sourceRoot":"","sources":["../src/openai-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * @file pricing.ts
3
+ * Token pricing catalog and cost calculation.
4
+ *
5
+ * Prices are in USD per 1M tokens unless specified.
6
+ * Updated: 2026-02 (simulated current date)
7
+ */
8
+ /**
9
+ * Calculates the estimated cost in USD for a given usage.
10
+ */
11
+ export declare function calculateCost(model: string, usage?: {
12
+ promptTokens: number;
13
+ completionTokens: number;
14
+ }): number;
15
+ //# sourceMappingURL=pricing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../src/pricing.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA0DH;;GAEG;AACH,wBAAgB,aAAa,CACzB,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,GAC3D,MAAM,CAMR"}