@code-yeongyu/senpi-ai 2026.9.9-2 → 2026.9.9

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/senpi-ai",
3
- "version": "2026.9.9-2",
3
+ "version": "2026.9.9",
4
4
  "description": "Unified LLM API with automatic model discovery and provider configuration",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -76,7 +76,7 @@
76
76
  "dependencies": {
77
77
  "@anthropic-ai/sdk": "0.123.0",
78
78
  "@aws-sdk/client-bedrock-runtime": "3.1116.0",
79
- "@earendil-works/pi-telemetry": "npm:@code-yeongyu/senpi-telemetry@2026.9.9-2",
79
+ "@earendil-works/pi-telemetry": "npm:@code-yeongyu/senpi-telemetry@2026.9.9",
80
80
  "@google/genai": "2.18.0",
81
81
  "@smithy/node-http-handler": "4.11.3",
82
82
  "http-proxy-agent": "9.1.0",
@@ -1,4 +0,0 @@
1
- import type { ImageContent } from "../types.ts";
2
- import type { OpenAIImageParams } from "./openai-images-params.ts";
3
- export declare function buildEditParams(params: OpenAIImageParams, images: ImageContent[]): Promise<OpenAIImageParams>;
4
- //# sourceMappingURL=openai-images-edit.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openai-images-edit.d.ts","sourceRoot":"","sources":["../../src/api/openai-images-edit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAEnE,wBAAsB,eAAe,CAAC,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CASnH"}
@@ -1,11 +0,0 @@
1
- import { toFile } from "openai";
2
- export async function buildEditParams(params, images) {
3
- if (images.length > 16)
4
- throw new Error("OpenAI image edits accept at most 16 reference images");
5
- const image = await Promise.all(images.map(({ data, mimeType }, i) => {
6
- const ext = mimeType.split("/")[1];
7
- return toFile(Buffer.from(data, "base64"), `reference-${i}.${ext}`, { type: mimeType });
8
- }));
9
- return { ...params, image };
10
- }
11
- //# sourceMappingURL=openai-images-edit.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openai-images-edit.js","sourceRoot":"","sources":["../../src/api/openai-images-edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIhC,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAyB,EAAE,MAAsB;IACtF,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IACjG,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAC9B,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE;QACpC,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,aAAa,CAAC,IAAI,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IACzF,CAAC,CAAC,CACF,CAAC;IACF,OAAO,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC;AAC7B,CAAC","sourcesContent":["import { toFile } from \"openai\";\nimport type { ImageContent } from \"../types.ts\";\nimport type { OpenAIImageParams } from \"./openai-images-params.ts\";\n\nexport async function buildEditParams(params: OpenAIImageParams, images: ImageContent[]): Promise<OpenAIImageParams> {\n\tif (images.length > 16) throw new Error(\"OpenAI image edits accept at most 16 reference images\");\n\tconst image = await Promise.all(\n\t\timages.map(({ data, mimeType }, i) => {\n\t\t\tconst ext = mimeType.split(\"/\")[1];\n\t\t\treturn toFile(Buffer.from(data, \"base64\"), `reference-${i}.${ext}`, { type: mimeType });\n\t\t}),\n\t);\n\treturn { ...params, image };\n}\n"]}
@@ -1,25 +0,0 @@
1
- import type { Uploadable } from "openai";
2
- import type { ImageGenerateParamsNonStreaming } from "openai/resources/images.js";
3
- import type { ImagesContext, ImagesModel, ImagesOptions } from "../types.ts";
4
- export type OpenAIImageQuality = "auto" | "low" | "medium" | "high" | "xhigh" | "max";
5
- export type OpenAIImageSize = "auto" | "1024x1024" | "1536x1024" | "1024x1536" | `${number}x${number}`;
6
- export interface OpenAIImagesOptions extends ImagesOptions {
7
- size?: OpenAIImageSize;
8
- quality?: OpenAIImageQuality;
9
- n?: number;
10
- }
11
- export type OpenAIImageParams = Omit<ImageGenerateParamsNonStreaming, "size" | "quality"> & {
12
- size?: OpenAIImageSize;
13
- quality?: OpenAIImageQuality;
14
- image?: Uploadable[];
15
- };
16
- export declare function parseOpenAIImageSize(size: string): {
17
- ok: true;
18
- size: string;
19
- } | {
20
- ok: false;
21
- error: string;
22
- };
23
- export declare function buildParams(model: ImagesModel<"openai-images">, context: ImagesContext, options?: OpenAIImagesOptions): OpenAIImageParams;
24
- export declare function isImageParams(value: unknown): value is OpenAIImageParams;
25
- //# sourceMappingURL=openai-images-params.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openai-images-params.d.ts","sourceRoot":"","sources":["../../src/api/openai-images-params.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,4BAA4B,CAAC;AAClF,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAK7E,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;AACtF,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,GAAG,GAAG,MAAM,IAAI,MAAM,EAAE,CAAC;AAEvG,MAAM,WAAW,mBAAoB,SAAQ,aAAa;IACzD,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,CAAC,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,+BAA+B,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG;IAC3F,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;CACrB,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAqB5G;AAED,wBAAgB,WAAW,CAC1B,KAAK,EAAE,WAAW,CAAC,eAAe,CAAC,EACnC,OAAO,EAAE,aAAa,EACtB,OAAO,CAAC,EAAE,mBAAmB,GAC3B,iBAAiB,CAwBnB;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,iBAAiB,CAExE"}
@@ -1,58 +0,0 @@
1
- import { sanitizeSurrogates } from "../utils/sanitize-unicode.js";
2
- const MAX_PROMPT_CHARS = 32_000;
3
- export function parseOpenAIImageSize(size) {
4
- if (["auto", "1024x1024", "1536x1024", "1024x1536"].includes(size))
5
- return { ok: true, size };
6
- const match = /^\d+x\d+$/.exec(size);
7
- if (!match || match[0] !== size) {
8
- return { ok: false, error: "OpenAI image size must be auto or WIDTHxHEIGHT with integer dimensions" };
9
- }
10
- const [width, height] = size.split("x").map(Number);
11
- if (width > 3840 || height > 3840) {
12
- return { ok: false, error: "OpenAI image size edges must be at most 3840 pixels" };
13
- }
14
- if (width % 16 !== 0 || height % 16 !== 0) {
15
- return { ok: false, error: "OpenAI image size width and height must be divisible by 16" };
16
- }
17
- if (width > height * 3 || height > width * 3) {
18
- return { ok: false, error: "OpenAI image size aspect ratio must be between 1:3 and 3:1 inclusive" };
19
- }
20
- const pixels = width * height;
21
- if (pixels < 655360 || pixels > 8294400) {
22
- return { ok: false, error: "OpenAI image size must contain between 655360 and 8294400 pixels inclusive" };
23
- }
24
- return { ok: true, size };
25
- }
26
- export function buildParams(model, context, options) {
27
- const promptParts = [];
28
- for (const item of context.input) {
29
- if (item.type !== "text")
30
- continue;
31
- const text = sanitizeSurrogates(item.text);
32
- if (text.trim())
33
- promptParts.push(text);
34
- }
35
- const prompt = promptParts.join("\n\n");
36
- if (!prompt.trim())
37
- throw new Error("Image generation requires a non-empty text prompt");
38
- if (prompt.length > MAX_PROMPT_CHARS) {
39
- throw new Error(`Image generation prompt exceeds ${MAX_PROMPT_CHARS} characters`);
40
- }
41
- const size = options?.size ?? "auto";
42
- const parsedSize = parseOpenAIImageSize(size);
43
- if (!parsedSize.ok)
44
- throw new Error(parsedSize.error);
45
- return {
46
- model: model.id,
47
- prompt,
48
- size,
49
- quality: options?.quality ?? "auto",
50
- n: options?.n ?? 1,
51
- output_format: "png",
52
- stream: false,
53
- };
54
- }
55
- export function isImageParams(value) {
56
- return typeof value === "object" && value !== null && "prompt" in value && typeof value.prompt === "string";
57
- }
58
- //# sourceMappingURL=openai-images-params.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openai-images-params.js","sourceRoot":"","sources":["../../src/api/openai-images-params.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Uploadable } from \"openai\";\nimport type { ImageGenerateParamsNonStreaming } from \"openai/resources/images.js\";\nimport type { ImagesContext, ImagesModel, ImagesOptions } from \"../types.ts\";\nimport { sanitizeSurrogates } from \"../utils/sanitize-unicode.ts\";\n\nconst MAX_PROMPT_CHARS = 32_000;\n\nexport type OpenAIImageQuality = \"auto\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | \"max\";\nexport type OpenAIImageSize = \"auto\" | \"1024x1024\" | \"1536x1024\" | \"1024x1536\" | `${number}x${number}`;\n\nexport interface OpenAIImagesOptions extends ImagesOptions {\n\tsize?: OpenAIImageSize;\n\tquality?: OpenAIImageQuality;\n\tn?: number;\n}\n\nexport type OpenAIImageParams = Omit<ImageGenerateParamsNonStreaming, \"size\" | \"quality\"> & {\n\tsize?: OpenAIImageSize;\n\tquality?: OpenAIImageQuality;\n\timage?: Uploadable[];\n};\n\nexport function parseOpenAIImageSize(size: string): { ok: true; size: string } | { ok: false; error: string } {\n\tif ([\"auto\", \"1024x1024\", \"1536x1024\", \"1024x1536\"].includes(size)) return { ok: true, size };\n\tconst match = /^\\d+x\\d+$/.exec(size);\n\tif (!match || match[0] !== size) {\n\t\treturn { ok: false, error: \"OpenAI image size must be auto or WIDTHxHEIGHT with integer dimensions\" };\n\t}\n\tconst [width, height] = size.split(\"x\").map(Number);\n\tif (width > 3840 || height > 3840) {\n\t\treturn { ok: false, error: \"OpenAI image size edges must be at most 3840 pixels\" };\n\t}\n\tif (width % 16 !== 0 || height % 16 !== 0) {\n\t\treturn { ok: false, error: \"OpenAI image size width and height must be divisible by 16\" };\n\t}\n\tif (width > height * 3 || height > width * 3) {\n\t\treturn { ok: false, error: \"OpenAI image size aspect ratio must be between 1:3 and 3:1 inclusive\" };\n\t}\n\tconst pixels = width * height;\n\tif (pixels < 655360 || pixels > 8294400) {\n\t\treturn { ok: false, error: \"OpenAI image size must contain between 655360 and 8294400 pixels inclusive\" };\n\t}\n\treturn { ok: true, size };\n}\n\nexport function buildParams(\n\tmodel: ImagesModel<\"openai-images\">,\n\tcontext: ImagesContext,\n\toptions?: OpenAIImagesOptions,\n): OpenAIImageParams {\n\tconst promptParts: string[] = [];\n\tfor (const item of context.input) {\n\t\tif (item.type !== \"text\") continue;\n\t\tconst text = sanitizeSurrogates(item.text);\n\t\tif (text.trim()) promptParts.push(text);\n\t}\n\tconst prompt = promptParts.join(\"\\n\\n\");\n\tif (!prompt.trim()) throw new Error(\"Image generation requires a non-empty text prompt\");\n\tif (prompt.length > MAX_PROMPT_CHARS) {\n\t\tthrow new Error(`Image generation prompt exceeds ${MAX_PROMPT_CHARS} characters`);\n\t}\n\tconst size = options?.size ?? \"auto\";\n\tconst parsedSize = parseOpenAIImageSize(size);\n\tif (!parsedSize.ok) throw new Error(parsedSize.error);\n\treturn {\n\t\tmodel: model.id,\n\t\tprompt,\n\t\tsize,\n\t\tquality: options?.quality ?? \"auto\",\n\t\tn: options?.n ?? 1,\n\t\toutput_format: \"png\",\n\t\tstream: false,\n\t};\n}\n\nexport function isImageParams(value: unknown): value is OpenAIImageParams {\n\treturn typeof value === \"object\" && value !== null && \"prompt\" in value && typeof value.prompt === \"string\";\n}\n"]}