@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.
Files changed (93) hide show
  1. package/dist/adapters/aliyun-oss-file-upload-adapter.d.ts +44 -0
  2. package/dist/adapters/aliyun-oss-file-upload-adapter.js +96 -0
  3. package/dist/adapters/gemini-file-upload-adapter.d.ts +26 -0
  4. package/dist/adapters/gemini-file-upload-adapter.js +92 -0
  5. package/dist/adapters/hub-oss-file-upload-adapter.d.ts +29 -0
  6. package/dist/adapters/hub-oss-file-upload-adapter.js +53 -0
  7. package/dist/adapters/index.d.ts +10 -0
  8. package/dist/adapters/index.js +10 -0
  9. package/dist/adapters/openai-file-upload-adapter.d.ts +38 -0
  10. package/dist/adapters/openai-file-upload-adapter.js +56 -0
  11. package/dist/adapters/volcengine-file-upload-adapter.d.ts +24 -0
  12. package/dist/adapters/volcengine-file-upload-adapter.js +45 -0
  13. package/dist/builtin-providers.d.ts +8 -0
  14. package/dist/builtin-providers.js +2237 -0
  15. package/dist/constants.d.ts +1 -0
  16. package/dist/constants.js +1 -0
  17. package/dist/credentials.d.ts +1 -0
  18. package/dist/credentials.js +8 -0
  19. package/dist/debug-transport.d.ts +12 -0
  20. package/dist/debug-transport.js +99 -0
  21. package/dist/errors.d.ts +11 -0
  22. package/dist/errors.js +12 -0
  23. package/dist/events.d.ts +48 -0
  24. package/dist/events.js +1 -0
  25. package/dist/file-upload-service.d.ts +68 -0
  26. package/dist/file-upload-service.js +110 -0
  27. package/dist/gemini-schema-utils.d.ts +17 -0
  28. package/dist/gemini-schema-utils.js +76 -0
  29. package/dist/index.d.ts +37 -0
  30. package/dist/index.js +33 -0
  31. package/dist/llm-client.d.ts +43 -0
  32. package/dist/llm-client.js +217 -0
  33. package/dist/media-client.d.ts +42 -0
  34. package/dist/media-client.js +174 -0
  35. package/dist/media-transport.d.ts +176 -0
  36. package/dist/media-transport.js +16 -0
  37. package/dist/media.d.ts +2 -0
  38. package/dist/media.js +1 -0
  39. package/dist/model-detection.d.ts +22 -0
  40. package/dist/model-detection.js +28 -0
  41. package/dist/paths.d.ts +2 -0
  42. package/dist/paths.js +11 -0
  43. package/dist/provider-def.d.ts +220 -0
  44. package/dist/provider-def.js +9 -0
  45. package/dist/provider-registry.d.ts +51 -0
  46. package/dist/provider-registry.js +130 -0
  47. package/dist/provider-tool-api.d.ts +44 -0
  48. package/dist/provider-tool-api.js +9 -0
  49. package/dist/provider-variant-resolver.d.ts +35 -0
  50. package/dist/provider-variant-resolver.js +174 -0
  51. package/dist/retry.d.ts +37 -0
  52. package/dist/retry.js +71 -0
  53. package/dist/transport.d.ts +281 -0
  54. package/dist/transport.js +27 -0
  55. package/dist/transports/anthropic-messages.d.ts +65 -0
  56. package/dist/transports/anthropic-messages.js +1004 -0
  57. package/dist/transports/gemini-cache-api.d.ts +86 -0
  58. package/dist/transports/gemini-cache-api.js +141 -0
  59. package/dist/transports/gemini-file-api.d.ts +90 -0
  60. package/dist/transports/gemini-file-api.js +164 -0
  61. package/dist/transports/gemini-generatecontent.d.ts +56 -0
  62. package/dist/transports/gemini-generatecontent.js +688 -0
  63. package/dist/transports/gemini-lyria-realtime.d.ts +117 -0
  64. package/dist/transports/gemini-lyria-realtime.js +295 -0
  65. package/dist/transports/gemini-media.d.ts +53 -0
  66. package/dist/transports/gemini-media.js +383 -0
  67. package/dist/transports/media-resolve.d.ts +50 -0
  68. package/dist/transports/media-resolve.js +91 -0
  69. package/dist/transports/minimax-media.d.ts +56 -0
  70. package/dist/transports/minimax-media.js +433 -0
  71. package/dist/transports/openai-chat.d.ts +81 -0
  72. package/dist/transports/openai-chat.js +782 -0
  73. package/dist/transports/openai-media.d.ts +24 -0
  74. package/dist/transports/openai-media.js +118 -0
  75. package/dist/transports/openai-responses.d.ts +63 -0
  76. package/dist/transports/openai-responses.js +778 -0
  77. package/dist/transports/qwen-media.d.ts +59 -0
  78. package/dist/transports/qwen-media.js +411 -0
  79. package/dist/transports/realtime-transport.d.ts +183 -0
  80. package/dist/transports/realtime-transport.js +332 -0
  81. package/dist/transports/volcengine-grounding.d.ts +58 -0
  82. package/dist/transports/volcengine-grounding.js +69 -0
  83. package/dist/transports/volcengine-media.d.ts +94 -0
  84. package/dist/transports/volcengine-media.js +801 -0
  85. package/dist/transports/volcengine-responses.d.ts +64 -0
  86. package/dist/transports/volcengine-responses.js +797 -0
  87. package/dist/transports/zhipu-media.d.ts +82 -0
  88. package/dist/transports/zhipu-media.js +522 -0
  89. package/dist/transports/zhipu-tool-api.d.ts +35 -0
  90. package/dist/transports/zhipu-tool-api.js +126 -0
  91. package/dist/wire-types.d.ts +51 -0
  92. package/dist/wire-types.js +1 -0
  93. 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
+ }