@xiaozhiclaw/provider-core 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/adapters/aliyun-oss-file-upload-adapter.d.ts +44 -0
- package/dist/adapters/aliyun-oss-file-upload-adapter.js +96 -0
- package/dist/adapters/gemini-file-upload-adapter.d.ts +26 -0
- package/dist/adapters/gemini-file-upload-adapter.js +92 -0
- package/dist/adapters/hub-oss-file-upload-adapter.d.ts +29 -0
- package/dist/adapters/hub-oss-file-upload-adapter.js +53 -0
- package/dist/adapters/index.d.ts +10 -0
- package/dist/adapters/index.js +10 -0
- package/dist/adapters/openai-file-upload-adapter.d.ts +38 -0
- package/dist/adapters/openai-file-upload-adapter.js +56 -0
- package/dist/adapters/volcengine-file-upload-adapter.d.ts +24 -0
- package/dist/adapters/volcengine-file-upload-adapter.js +45 -0
- package/dist/builtin-providers.d.ts +8 -0
- package/dist/builtin-providers.js +2237 -0
- package/dist/constants.d.ts +1 -0
- package/dist/constants.js +1 -0
- package/dist/credentials.d.ts +1 -0
- package/dist/credentials.js +8 -0
- package/dist/debug-transport.d.ts +12 -0
- package/dist/debug-transport.js +99 -0
- package/dist/errors.d.ts +11 -0
- package/dist/errors.js +12 -0
- package/dist/events.d.ts +48 -0
- package/dist/events.js +1 -0
- package/dist/file-upload-service.d.ts +68 -0
- package/dist/file-upload-service.js +110 -0
- package/dist/gemini-schema-utils.d.ts +17 -0
- package/dist/gemini-schema-utils.js +76 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.js +33 -0
- package/dist/llm-client.d.ts +43 -0
- package/dist/llm-client.js +217 -0
- package/dist/media-client.d.ts +42 -0
- package/dist/media-client.js +174 -0
- package/dist/media-transport.d.ts +176 -0
- package/dist/media-transport.js +16 -0
- package/dist/media.d.ts +2 -0
- package/dist/media.js +1 -0
- package/dist/model-detection.d.ts +22 -0
- package/dist/model-detection.js +28 -0
- package/dist/paths.d.ts +2 -0
- package/dist/paths.js +11 -0
- package/dist/provider-def.d.ts +220 -0
- package/dist/provider-def.js +9 -0
- package/dist/provider-registry.d.ts +51 -0
- package/dist/provider-registry.js +130 -0
- package/dist/provider-tool-api.d.ts +44 -0
- package/dist/provider-tool-api.js +9 -0
- package/dist/provider-variant-resolver.d.ts +35 -0
- package/dist/provider-variant-resolver.js +174 -0
- package/dist/retry.d.ts +37 -0
- package/dist/retry.js +71 -0
- package/dist/transport.d.ts +281 -0
- package/dist/transport.js +27 -0
- package/dist/transports/anthropic-messages.d.ts +65 -0
- package/dist/transports/anthropic-messages.js +1004 -0
- package/dist/transports/gemini-cache-api.d.ts +86 -0
- package/dist/transports/gemini-cache-api.js +141 -0
- package/dist/transports/gemini-file-api.d.ts +90 -0
- package/dist/transports/gemini-file-api.js +164 -0
- package/dist/transports/gemini-generatecontent.d.ts +56 -0
- package/dist/transports/gemini-generatecontent.js +688 -0
- package/dist/transports/gemini-lyria-realtime.d.ts +117 -0
- package/dist/transports/gemini-lyria-realtime.js +295 -0
- package/dist/transports/gemini-media.d.ts +53 -0
- package/dist/transports/gemini-media.js +383 -0
- package/dist/transports/media-resolve.d.ts +50 -0
- package/dist/transports/media-resolve.js +91 -0
- package/dist/transports/minimax-media.d.ts +56 -0
- package/dist/transports/minimax-media.js +433 -0
- package/dist/transports/openai-chat.d.ts +81 -0
- package/dist/transports/openai-chat.js +782 -0
- package/dist/transports/openai-media.d.ts +24 -0
- package/dist/transports/openai-media.js +118 -0
- package/dist/transports/openai-responses.d.ts +63 -0
- package/dist/transports/openai-responses.js +778 -0
- package/dist/transports/qwen-media.d.ts +59 -0
- package/dist/transports/qwen-media.js +411 -0
- package/dist/transports/realtime-transport.d.ts +183 -0
- package/dist/transports/realtime-transport.js +332 -0
- package/dist/transports/volcengine-grounding.d.ts +58 -0
- package/dist/transports/volcengine-grounding.js +69 -0
- package/dist/transports/volcengine-media.d.ts +94 -0
- package/dist/transports/volcengine-media.js +801 -0
- package/dist/transports/volcengine-responses.d.ts +64 -0
- package/dist/transports/volcengine-responses.js +797 -0
- package/dist/transports/zhipu-media.d.ts +82 -0
- package/dist/transports/zhipu-media.js +522 -0
- package/dist/transports/zhipu-tool-api.d.ts +35 -0
- package/dist/transports/zhipu-tool-api.js +126 -0
- package/dist/wire-types.d.ts +51 -0
- package/dist/wire-types.js +1 -0
- package/package.json +33 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI Media Transport 鈥?Images API (gpt-image-2) + Audio Speech API (tts-1).
|
|
3
|
+
*
|
|
4
|
+
* Image: POST /v1/images/generations (sync response, returns URLs)
|
|
5
|
+
* TTS: POST /v1/audio/speech (sync response, returns raw audio bytes)
|
|
6
|
+
* Auth: Authorization: Bearer $OPENAI_API_KEY
|
|
7
|
+
* Docs: https://platform.openai.com/docs/api-reference/images/create
|
|
8
|
+
* https://platform.openai.com/docs/api-reference/audio/createSpeech
|
|
9
|
+
*/
|
|
10
|
+
import type { MediaTransport, MediaRequest, MediaResult, MediaType } from "../media-transport.js";
|
|
11
|
+
export interface OpenAIMediaConfig {
|
|
12
|
+
/** Base URL, e.g. "https://api.openai.com" */
|
|
13
|
+
baseUrl: string;
|
|
14
|
+
timeoutMs?: number;
|
|
15
|
+
}
|
|
16
|
+
export declare class OpenAIMediaTransport implements MediaTransport {
|
|
17
|
+
readonly supportedTypes: readonly MediaType[];
|
|
18
|
+
private baseUrl;
|
|
19
|
+
private timeoutMs;
|
|
20
|
+
constructor(config: OpenAIMediaConfig);
|
|
21
|
+
generate(request: MediaRequest, apiKey: string, signal?: AbortSignal): Promise<MediaResult>;
|
|
22
|
+
private generateImage;
|
|
23
|
+
private generateTTS;
|
|
24
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI Media Transport 鈥?Images API (gpt-image-2) + Audio Speech API (tts-1).
|
|
3
|
+
*
|
|
4
|
+
* Image: POST /v1/images/generations (sync response, returns URLs)
|
|
5
|
+
* TTS: POST /v1/audio/speech (sync response, returns raw audio bytes)
|
|
6
|
+
* Auth: Authorization: Bearer $OPENAI_API_KEY
|
|
7
|
+
* Docs: https://platform.openai.com/docs/api-reference/images/create
|
|
8
|
+
* https://platform.openai.com/docs/api-reference/audio/createSpeech
|
|
9
|
+
*/
|
|
10
|
+
import { writeFileSync, mkdirSync } from "node:fs";
|
|
11
|
+
import { join } from "node:path";
|
|
12
|
+
import { randomUUID } from "node:crypto";
|
|
13
|
+
import { getUserCacheDir } from "../paths.js";
|
|
14
|
+
const DEFAULT_TIMEOUT_MS = 180_000;
|
|
15
|
+
export class OpenAIMediaTransport {
|
|
16
|
+
supportedTypes = ["image", "tts"];
|
|
17
|
+
baseUrl;
|
|
18
|
+
timeoutMs;
|
|
19
|
+
constructor(config) {
|
|
20
|
+
this.baseUrl = config.baseUrl.replace(/\/+$/, "");
|
|
21
|
+
this.timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
22
|
+
}
|
|
23
|
+
async generate(request, apiKey, signal) {
|
|
24
|
+
switch (request.mediaType) {
|
|
25
|
+
case "image":
|
|
26
|
+
return this.generateImage(request, apiKey, signal);
|
|
27
|
+
case "tts":
|
|
28
|
+
return this.generateTTS(request, apiKey, signal);
|
|
29
|
+
default:
|
|
30
|
+
throw new Error(`OpenAIMediaTransport: unsupported mediaType "${request.mediaType}"`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
// 鈹€鈹€ Image (gpt-image-2) 鈥?sync 鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€
|
|
34
|
+
async generateImage(request, apiKey, signal) {
|
|
35
|
+
const start = Date.now();
|
|
36
|
+
const url = `${this.baseUrl}/v1/images/generations`;
|
|
37
|
+
const body = {
|
|
38
|
+
model: request.model,
|
|
39
|
+
prompt: request.prompt,
|
|
40
|
+
n: request.n ?? 1,
|
|
41
|
+
size: request.size ?? "1024x1024",
|
|
42
|
+
response_format: "url",
|
|
43
|
+
};
|
|
44
|
+
if (request.quality)
|
|
45
|
+
body.quality = request.quality;
|
|
46
|
+
if (request.style)
|
|
47
|
+
body.style = request.style;
|
|
48
|
+
if (request.background)
|
|
49
|
+
body.background = request.background;
|
|
50
|
+
const res = await fetch(url, {
|
|
51
|
+
method: "POST",
|
|
52
|
+
headers: {
|
|
53
|
+
"Content-Type": "application/json",
|
|
54
|
+
Authorization: `Bearer ${apiKey}`,
|
|
55
|
+
},
|
|
56
|
+
body: JSON.stringify(body),
|
|
57
|
+
signal: signal ?? AbortSignal.timeout(this.timeoutMs),
|
|
58
|
+
});
|
|
59
|
+
if (!res.ok) {
|
|
60
|
+
const text = await res.text().catch(() => "");
|
|
61
|
+
throw new Error(`OpenAI images API error ${res.status}: ${text}`);
|
|
62
|
+
}
|
|
63
|
+
const data = await res.json();
|
|
64
|
+
const mediaUrls = (data.data ?? [])
|
|
65
|
+
.map(d => d.url)
|
|
66
|
+
.filter((u) => !!u);
|
|
67
|
+
return {
|
|
68
|
+
mediaUrls,
|
|
69
|
+
model: request.model,
|
|
70
|
+
size: request.size ?? "1024x1024",
|
|
71
|
+
durationMs: Date.now() - start,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
// 鈹€鈹€ TTS (tts-1 / tts-1-hd) 鈥?sync 鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€
|
|
75
|
+
async generateTTS(request, apiKey, signal) {
|
|
76
|
+
const start = Date.now();
|
|
77
|
+
const text = request.text || request.prompt;
|
|
78
|
+
if (!text) {
|
|
79
|
+
throw new Error("OpenAIMediaTransport: text or prompt is required for TTS");
|
|
80
|
+
}
|
|
81
|
+
const url = `${this.baseUrl}/v1/audio/speech`;
|
|
82
|
+
const body = {
|
|
83
|
+
model: request.model || "tts-1",
|
|
84
|
+
input: text,
|
|
85
|
+
voice: request.voice ?? "alloy",
|
|
86
|
+
response_format: request.audioFormat ?? "mp3",
|
|
87
|
+
};
|
|
88
|
+
if (request.speed !== undefined)
|
|
89
|
+
body.speed = request.speed;
|
|
90
|
+
const res = await fetch(url, {
|
|
91
|
+
method: "POST",
|
|
92
|
+
headers: {
|
|
93
|
+
"Content-Type": "application/json",
|
|
94
|
+
Authorization: `Bearer ${apiKey}`,
|
|
95
|
+
},
|
|
96
|
+
body: JSON.stringify(body),
|
|
97
|
+
signal: signal ?? AbortSignal.timeout(this.timeoutMs),
|
|
98
|
+
});
|
|
99
|
+
if (!res.ok) {
|
|
100
|
+
const errText = await res.text().catch(() => "");
|
|
101
|
+
throw new Error(`OpenAI TTS API error ${res.status}: ${errText}`);
|
|
102
|
+
}
|
|
103
|
+
// Response is raw audio bytes 鈥?save to temp file
|
|
104
|
+
const audioBuffer = Buffer.from(await res.arrayBuffer());
|
|
105
|
+
const cacheDir = join(getUserCacheDir(), "tts");
|
|
106
|
+
mkdirSync(cacheDir, { recursive: true });
|
|
107
|
+
const filename = `openai-tts-${randomUUID()}.mp3`;
|
|
108
|
+
const filePath = join(cacheDir, filename);
|
|
109
|
+
writeFileSync(filePath, audioBuffer);
|
|
110
|
+
return {
|
|
111
|
+
mediaUrls: [`file://${filePath}`],
|
|
112
|
+
model: request.model || "tts-1",
|
|
113
|
+
durationMs: Date.now() - start,
|
|
114
|
+
billingUnit: "per_character",
|
|
115
|
+
billingQuantity: text.length,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI Responses API TransportSSE streaming implementation.
|
|
3
|
+
*
|
|
4
|
+
* Implements the OpenAI Responses API (`POST /v1/responses`),
|
|
5
|
+
* the officially recommended path for GPT-5.x text generation.
|
|
6
|
+
*
|
|
7
|
+
* Key differences from OpenAI Chat Completions:
|
|
8
|
+
* - Endpoint: POST {baseUrl}/v1/responses
|
|
9
|
+
* - Request body uses `input` (not `messages`), `instructions`, `reasoning`
|
|
10
|
+
* - SSE events: response.output_text.delta, response.function_call_arguments.delta,
|
|
11
|
+
* response.completed, etc.
|
|
12
|
+
* - Tool defs: { type: "function", name, parameters } (not nested under `function:`)
|
|
13
|
+
* - Tool results: { type: "function_call_output", call_id, output }
|
|
14
|
+
* - Context persistence: previous_response_id for server-side session continuation
|
|
15
|
+
* - Structured output: `text: { format: { type: "json_schema", ... } }`
|
|
16
|
+
* - Reasoning: `reasoning: { effort, summary }` for GPT-5.x models
|
|
17
|
+
*
|
|
18
|
+
* Wire format reference:
|
|
19
|
+
* https://developers.openai.com/api/docs/api-reference/responses/create
|
|
20
|
+
* https://developers.openai.com/api/docs/api-reference/responses/streaming-events
|
|
21
|
+
*
|
|
22
|
+
* Design: Closely mirrors volcengine-responses.ts patterns while adapting to
|
|
23
|
+
* OpenAI-specific wire format. Shared LLMChunk output makes upper layers
|
|
24
|
+
* transport-agnostic.
|
|
25
|
+
*/
|
|
26
|
+
import type { LLMChunk, LLMRequest, LLMTransport } from "../transport.js";
|
|
27
|
+
import type { ProviderQuirks } from "../provider-def.js";
|
|
28
|
+
import type { FileUploadAdapter } from "../file-upload-service.js";
|
|
29
|
+
export interface OpenAIResponsesTransportConfig {
|
|
30
|
+
baseUrl: string;
|
|
31
|
+
extraHeaders?: Record<string, string>;
|
|
32
|
+
timeoutMs?: number;
|
|
33
|
+
quirks?: ProviderQuirks;
|
|
34
|
+
fileUploadAdapter?: FileUploadAdapter;
|
|
35
|
+
}
|
|
36
|
+
export declare class OpenAIResponsesTransport implements LLMTransport {
|
|
37
|
+
private baseUrl;
|
|
38
|
+
private extraHeaders;
|
|
39
|
+
private timeoutMs;
|
|
40
|
+
private quirks;
|
|
41
|
+
private fileUploadAdapter?;
|
|
42
|
+
constructor(config: OpenAIResponsesTransportConfig);
|
|
43
|
+
stream(request: LLMRequest, apiKey: string, signal?: AbortSignal): AsyncGenerator<LLMChunk>;
|
|
44
|
+
private buildRequestBody;
|
|
45
|
+
private fetchAndStream;
|
|
46
|
+
private handleNonStreamingResponse;
|
|
47
|
+
/**
|
|
48
|
+
* Parse OpenAI Responses API SSE stream.
|
|
49
|
+
*
|
|
50
|
+
* Event format: "event: <type>\ndata: <json>\n\n"
|
|
51
|
+
* Key events:
|
|
52
|
+
* - response.output_text.delta 閳?text content delta
|
|
53
|
+
* - response.reasoning_summary_text.delta 閳?reasoning summary text
|
|
54
|
+
* - response.function_call_arguments.delta 閳?tool call arguments streaming
|
|
55
|
+
* - response.output_item.added 閳?new output item started
|
|
56
|
+
* - response.output_item.done 閳?output item completed
|
|
57
|
+
* - response.content_part.done 閳?content part completed (annotations)
|
|
58
|
+
* - response.completed 閳?full response complete with usage
|
|
59
|
+
* - response.failed 閳?error
|
|
60
|
+
*/
|
|
61
|
+
private parseSSEStream;
|
|
62
|
+
private processEvent;
|
|
63
|
+
}
|