content-moderation-sdk 0.0.1 → 0.1.1

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 (54) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +275 -0
  3. package/content-moderation-sdk.jpg +0 -0
  4. package/dist/azure.d.ts +38 -0
  5. package/dist/azure.d.ts.map +1 -0
  6. package/dist/azure.js +114 -0
  7. package/dist/azure.js.map +1 -0
  8. package/dist/core.d.ts +3 -0
  9. package/dist/core.d.ts.map +1 -0
  10. package/dist/core.js +313 -0
  11. package/dist/core.js.map +1 -0
  12. package/dist/errors.d.ts +41 -0
  13. package/dist/errors.d.ts.map +1 -0
  14. package/dist/errors.js +77 -0
  15. package/dist/errors.js.map +1 -0
  16. package/dist/http.d.ts +9 -0
  17. package/dist/http.d.ts.map +1 -0
  18. package/dist/http.js +87 -0
  19. package/dist/http.js.map +1 -0
  20. package/dist/index.d.ts +4 -0
  21. package/dist/index.d.ts.map +1 -0
  22. package/dist/index.js +3 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/mistral.d.ts +23 -0
  25. package/dist/mistral.d.ts.map +1 -0
  26. package/dist/mistral.js +81 -0
  27. package/dist/mistral.js.map +1 -0
  28. package/dist/openai.d.ts +28 -0
  29. package/dist/openai.d.ts.map +1 -0
  30. package/dist/openai.js +105 -0
  31. package/dist/openai.js.map +1 -0
  32. package/dist/testing.d.ts +18 -0
  33. package/dist/testing.d.ts.map +1 -0
  34. package/dist/testing.js +44 -0
  35. package/dist/testing.js.map +1 -0
  36. package/dist/types.d.ts +164 -0
  37. package/dist/types.d.ts.map +1 -0
  38. package/dist/types.js +2 -0
  39. package/dist/types.js.map +1 -0
  40. package/dist/utils.d.ts +26 -0
  41. package/dist/utils.d.ts.map +1 -0
  42. package/dist/utils.js +229 -0
  43. package/dist/utils.js.map +1 -0
  44. package/package.json +76 -1
  45. package/src/azure.ts +191 -0
  46. package/src/core.ts +440 -0
  47. package/src/errors.ts +109 -0
  48. package/src/http.ts +94 -0
  49. package/src/index.ts +43 -0
  50. package/src/mistral.ts +124 -0
  51. package/src/openai.ts +162 -0
  52. package/src/testing.ts +85 -0
  53. package/src/types.ts +241 -0
  54. package/src/utils.ts +281 -0
@@ -0,0 +1,81 @@
1
+ import { ModerationAdapterError, ModerationValidationError } from "./errors.js";
2
+ import { requestJson } from "./http.js";
3
+ import { normalizeHttpEndpoint } from "./utils.js";
4
+ export function mistral(options) {
5
+ if (typeof options.apiKey !== "string" || options.apiKey.trim().length === 0) {
6
+ throw new ModerationValidationError("Mistral apiKey is required.");
7
+ }
8
+ const model = options.model ?? "mistral-moderation-latest";
9
+ if (typeof model !== "string" || model.trim().length === 0) {
10
+ throw new ModerationValidationError("Mistral model must be a non-empty string.");
11
+ }
12
+ const baseUrl = normalizeHttpEndpoint(options.baseUrl ?? "https://api.mistral.ai/v1", "Mistral baseUrl");
13
+ const fetcher = options.fetch ?? fetch;
14
+ return {
15
+ name: "mistral",
16
+ capabilities: {
17
+ text: true,
18
+ image: false,
19
+ conversation: "native",
20
+ },
21
+ raw: { baseUrl, model },
22
+ async moderate(input, context) {
23
+ if (input.type === "image") {
24
+ throw new ModerationValidationError("Mistral moderation does not support image input.");
25
+ }
26
+ const conversation = input.type === "conversation";
27
+ const body = await requestJson({
28
+ adapter: "mistral",
29
+ provider: "Mistral",
30
+ fetcher,
31
+ url: `${baseUrl}/${conversation ? "chat/moderations" : "moderations"}`,
32
+ init: {
33
+ method: "POST",
34
+ signal: context.signal,
35
+ headers: {
36
+ Authorization: `Bearer ${options.apiKey}`,
37
+ "Content-Type": "application/json",
38
+ ...options.headers,
39
+ },
40
+ body: JSON.stringify({
41
+ model,
42
+ input: conversation ? input.messages : input.text,
43
+ }),
44
+ },
45
+ });
46
+ const result = body.results?.[0];
47
+ if (!result || !result.categories || !result.category_scores) {
48
+ throw new ModerationAdapterError("Mistral returned an invalid moderation response.", {
49
+ adapter: "mistral",
50
+ code: "invalid_response",
51
+ details: body,
52
+ });
53
+ }
54
+ const categories = toCategoryAssessments(result);
55
+ return {
56
+ adapter: "mistral",
57
+ id: body.id,
58
+ model: body.model,
59
+ flagged: Object.values(result.categories).some(Boolean),
60
+ categories,
61
+ raw: body,
62
+ };
63
+ },
64
+ };
65
+ }
66
+ function toCategoryAssessments(result) {
67
+ const names = new Set([
68
+ ...Object.keys(result.categories ?? {}),
69
+ ...Object.keys(result.category_scores ?? {}),
70
+ ]);
71
+ return Object.fromEntries([...names].map((name) => [
72
+ name,
73
+ {
74
+ flagged: result.categories?.[name] ?? null,
75
+ ...(typeof result.category_scores?.[name] === "number"
76
+ ? { score: result.category_scores[name] }
77
+ : {}),
78
+ },
79
+ ]));
80
+ }
81
+ //# sourceMappingURL=mistral.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mistral.js","sourceRoot":"","sources":["../src/mistral.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { ModerationAdapter } from "./types.js";
2
+ export type OpenAIModerationModel = "omni-moderation-latest" | "omni-moderation-2024-09-26" | "text-moderation-latest" | "text-moderation-stable" | (string & {});
3
+ export type OpenAIModeration = {
4
+ flagged: boolean;
5
+ categories: Record<string, boolean | null>;
6
+ category_scores: Record<string, number>;
7
+ category_applied_input_types?: Record<string, ("text" | "image")[]>;
8
+ };
9
+ export type OpenAIModerationResponse = {
10
+ id: string;
11
+ model: string;
12
+ results: OpenAIModeration[];
13
+ };
14
+ export type OpenAIOptions = {
15
+ apiKey: string;
16
+ model?: OpenAIModerationModel;
17
+ baseUrl?: string;
18
+ organization?: string;
19
+ project?: string;
20
+ headers?: Readonly<Record<string, string>>;
21
+ fetch?: typeof fetch;
22
+ };
23
+ export type OpenAIAdapter = ModerationAdapter<"openai", {
24
+ baseUrl: string;
25
+ model: OpenAIModerationModel;
26
+ }, OpenAIModerationResponse>;
27
+ export declare function openai(options: OpenAIOptions): OpenAIAdapter;
28
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../src/openai.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,iBAAiB,EAIlB,MAAM,YAAY,CAAC;AAGpB,MAAM,MAAM,qBAAqB,GAC7B,wBAAwB,GACxB,4BAA4B,GAC5B,wBAAwB,GACxB,wBAAwB,GACxB,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAElB,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC,CAAC;IAC3C,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,4BAA4B,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;CACrE,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,gBAAgB,EAAE,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,qBAAqB,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3C,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,iBAAiB,CAC3C,QAAQ,EACR;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,qBAAqB,CAAA;CAAE,EACjD,wBAAwB,CACzB,CAAC;AAEF,wBAAgB,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,aAAa,CA+D5D"}
package/dist/openai.js ADDED
@@ -0,0 +1,105 @@
1
+ import { ModerationAdapterError, ModerationValidationError } from "./errors.js";
2
+ import { requestJson } from "./http.js";
3
+ import { imageSourceToDataUrl, normalizeHttpEndpoint } from "./utils.js";
4
+ export function openai(options) {
5
+ assertCredential(options.apiKey);
6
+ const model = options.model ?? "omni-moderation-latest";
7
+ if (typeof model !== "string" || model.trim().length === 0) {
8
+ throw new ModerationValidationError("OpenAI model must be a non-empty string.");
9
+ }
10
+ const baseUrl = normalizeHttpEndpoint(options.baseUrl ?? "https://api.openai.com/v1", "OpenAI baseUrl");
11
+ const fetcher = options.fetch ?? fetch;
12
+ const supportsImages = model !== "text-moderation-latest" && model !== "text-moderation-stable";
13
+ return {
14
+ name: "openai",
15
+ capabilities: {
16
+ text: true,
17
+ image: supportsImages,
18
+ conversation: "flattened",
19
+ },
20
+ raw: { baseUrl, model },
21
+ async moderate(input, context) {
22
+ const body = await requestJson({
23
+ adapter: "openai",
24
+ provider: "OpenAI",
25
+ fetcher,
26
+ url: `${baseUrl}/moderations`,
27
+ init: {
28
+ method: "POST",
29
+ signal: context.signal,
30
+ headers: {
31
+ Authorization: `Bearer ${options.apiKey}`,
32
+ "Content-Type": "application/json",
33
+ ...(options.organization ? { "OpenAI-Organization": options.organization } : {}),
34
+ ...(options.project ? { "OpenAI-Project": options.project } : {}),
35
+ ...options.headers,
36
+ },
37
+ body: JSON.stringify({
38
+ model,
39
+ input: await toOpenAIInput(input),
40
+ }),
41
+ },
42
+ });
43
+ const result = body.results?.[0];
44
+ if (!result || typeof result.flagged !== "boolean") {
45
+ throw new ModerationAdapterError("OpenAI returned an invalid moderation response.", {
46
+ adapter: "openai",
47
+ code: "invalid_response",
48
+ details: body,
49
+ });
50
+ }
51
+ return {
52
+ adapter: "openai",
53
+ id: body.id,
54
+ model: body.model,
55
+ flagged: result.flagged,
56
+ categories: toCategoryAssessments(result),
57
+ raw: body,
58
+ };
59
+ },
60
+ };
61
+ }
62
+ async function toOpenAIInput(input) {
63
+ if (input.type === "text")
64
+ return input.text;
65
+ if (input.type === "conversation") {
66
+ throw new ModerationValidationError("OpenAI receives conversations through the client's flattened text path.");
67
+ }
68
+ return [
69
+ {
70
+ type: "image_url",
71
+ image_url: {
72
+ url: await toImageUrl(input.source),
73
+ },
74
+ },
75
+ ];
76
+ }
77
+ async function toImageUrl(source) {
78
+ if (source.type === "url")
79
+ return source.url;
80
+ return imageSourceToDataUrl(source);
81
+ }
82
+ function toCategoryAssessments(result) {
83
+ const names = new Set([
84
+ ...Object.keys(result.categories ?? {}),
85
+ ...Object.keys(result.category_scores ?? {}),
86
+ ]);
87
+ return Object.fromEntries([...names].map((name) => [
88
+ name,
89
+ {
90
+ flagged: result.categories?.[name] ?? null,
91
+ ...(typeof result.category_scores?.[name] === "number"
92
+ ? { score: result.category_scores[name] }
93
+ : {}),
94
+ ...(result.category_applied_input_types?.[name]
95
+ ? { inputTypes: result.category_applied_input_types[name] }
96
+ : {}),
97
+ },
98
+ ]));
99
+ }
100
+ function assertCredential(apiKey) {
101
+ if (typeof apiKey !== "string" || apiKey.trim().length === 0) {
102
+ throw new ModerationValidationError("OpenAI apiKey is required.");
103
+ }
104
+ }
105
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../src/openai.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAOxC,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAsCzE,MAAM,UAAU,MAAM,CAAC,OAAsB;IAC3C,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,wBAAwB,CAAC;IACxD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,yBAAyB,CAAC,0CAA0C,CAAC,CAAC;IAClF,CAAC;IACD,MAAM,OAAO,GAAG,qBAAqB,CACnC,OAAO,CAAC,OAAO,IAAI,2BAA2B,EAC9C,gBAAgB,CACjB,CAAC;IACF,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC;IACvC,MAAM,cAAc,GAAG,KAAK,KAAK,wBAAwB,IAAI,KAAK,KAAK,wBAAwB,CAAC;IAEhG,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,YAAY,EAAE;YACZ,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,cAAc;YACrB,YAAY,EAAE,WAAW;SAC1B;QACD,GAAG,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;QACvB,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO;YAC3B,MAAM,IAAI,GAAG,MAAM,WAAW,CAA2B;gBACvD,OAAO,EAAE,QAAQ;gBACjB,QAAQ,EAAE,QAAQ;gBAClB,OAAO;gBACP,GAAG,EAAE,GAAG,OAAO,cAAc;gBAC7B,IAAI,EAAE;oBACJ,MAAM,EAAE,MAAM;oBACd,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,OAAO,EAAE;wBACP,aAAa,EAAE,UAAU,OAAO,CAAC,MAAM,EAAE;wBACzC,cAAc,EAAE,kBAAkB;wBAClC,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,qBAAqB,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBAChF,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBACjE,GAAG,OAAO,CAAC,OAAO;qBACnB;oBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,KAAK;wBACL,KAAK,EAAE,MAAM,aAAa,CAAC,KAAK,CAAC;qBAClC,CAAC;iBACH;aACF,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;YACjC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gBACnD,MAAM,IAAI,sBAAsB,CAAC,iDAAiD,EAAE;oBAClF,OAAO,EAAE,QAAQ;oBACjB,IAAI,EAAE,kBAAkB;oBACxB,OAAO,EAAE,IAAI;iBACd,CAAC,CAAC;YACL,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,QAAQ;gBACjB,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,UAAU,EAAE,qBAAqB,CAAC,MAAM,CAAC;gBACzC,GAAG,EAAE,IAAI;aAC4D,CAAC;QAC1E,CAAC;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,KAA+C;IAC1E,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC;IAC7C,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QAClC,MAAM,IAAI,yBAAyB,CACjC,yEAAyE,CAC1E,CAAC;IACJ,CAAC;IAED,OAAO;QACL;YACE,IAAI,EAAE,WAAW;YACjB,SAAS,EAAE;gBACT,GAAG,EAAE,MAAM,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC;aACpC;SACF;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,MAA6B;IACrD,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC;IAC7C,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,qBAAqB,CAC5B,MAAwB;IAExB,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC;QACpB,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;QACvC,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,IAAI,EAAE,CAAC;KAC7C,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,WAAW,CACvB,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QACvB,IAAI;QACJ;YACE,OAAO,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI;YAC1C,GAAG,CAAC,OAAO,MAAM,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC,KAAK,QAAQ;gBACpD,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE;gBACzC,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,MAAM,CAAC,4BAA4B,EAAE,CAAC,IAAI,CAAC;gBAC7C,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,4BAA4B,CAAC,IAAI,CAAC,EAAE;gBAC3D,CAAC,CAAC,EAAE,CAAC;SACR;KACF,CAAC,CACH,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAc;IACtC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,yBAAyB,CAAC,4BAA4B,CAAC,CAAC;IACpE,CAAC;AACH,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { MaybePromise, ModerationAdapter, ModerationAdapterCapabilities, ModerationAdapterContext, ModerationAdapterResult, ModerationInput } from "./types.js";
2
+ export type MemoryModerationRequest<Raw = unknown> = {
3
+ input: ModerationInput;
4
+ context: ModerationAdapterContext;
5
+ result: ModerationAdapterResult<string, Raw>;
6
+ };
7
+ export type MemoryAdapterOptions<Name extends string, Raw = unknown> = {
8
+ name?: Name;
9
+ capabilities?: ModerationAdapterCapabilities;
10
+ handler?: (input: ModerationInput, context: ModerationAdapterContext) => MaybePromise<ModerationAdapterResult<Name, Raw>>;
11
+ };
12
+ export type MemoryAdapter<Name extends string = "memory", Raw = unknown> = ModerationAdapter<Name, {
13
+ requests: MemoryModerationRequest<Raw>[];
14
+ clear(): void;
15
+ }, Raw>;
16
+ export declare function memoryAdapter<const Name extends string = "memory", Raw = unknown>(options?: MemoryAdapterOptions<Name, Raw>): MemoryAdapter<Name, Raw>;
17
+ export declare function failingAdapter<const Name extends string>(name: Name, error?: Error, capabilities?: ModerationAdapterCapabilities): ModerationAdapter<Name>;
18
+ //# sourceMappingURL=testing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,6BAA6B,EAC7B,wBAAwB,EACxB,uBAAuB,EACvB,eAAe,EAChB,MAAM,YAAY,CAAC;AAQpB,MAAM,MAAM,uBAAuB,CAAC,GAAG,GAAG,OAAO,IAAI;IACnD,KAAK,EAAE,eAAe,CAAC;IACvB,OAAO,EAAE,wBAAwB,CAAC;IAClC,MAAM,EAAE,uBAAuB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9C,CAAC;AAEF,MAAM,MAAM,oBAAoB,CAAC,IAAI,SAAS,MAAM,EAAE,GAAG,GAAG,OAAO,IAAI;IACrE,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,YAAY,CAAC,EAAE,6BAA6B,CAAC;IAC7C,OAAO,CAAC,EAAE,CACR,KAAK,EAAE,eAAe,EACtB,OAAO,EAAE,wBAAwB,KAC9B,YAAY,CAAC,uBAAuB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;CACvD,CAAC;AAEF,MAAM,MAAM,aAAa,CAAC,IAAI,SAAS,MAAM,GAAG,QAAQ,EAAE,GAAG,GAAG,OAAO,IAAI,iBAAiB,CAC1F,IAAI,EACJ;IACE,QAAQ,EAAE,uBAAuB,CAAC,GAAG,CAAC,EAAE,CAAC;IACzC,KAAK,IAAI,IAAI,CAAC;CACf,EACD,GAAG,CACJ,CAAC;AAEF,wBAAgB,aAAa,CAAC,KAAK,CAAC,IAAI,SAAS,MAAM,GAAG,QAAQ,EAAE,GAAG,GAAG,OAAO,EAC/E,OAAO,GAAE,oBAAoB,CAAC,IAAI,EAAE,GAAG,CAAM,GAC5C,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,CA6B1B;AAED,wBAAgB,cAAc,CAAC,KAAK,CAAC,IAAI,SAAS,MAAM,EACtD,IAAI,EAAE,IAAI,EACV,KAAK,GAAE,KAA+C,EACtD,YAAY,GAAE,6BAAgD,GAC7D,iBAAiB,CAAC,IAAI,CAAC,CAQzB"}
@@ -0,0 +1,44 @@
1
+ const ALL_CAPABILITIES = {
2
+ text: true,
3
+ image: true,
4
+ conversation: "native",
5
+ };
6
+ export function memoryAdapter(options = {}) {
7
+ const name = (options.name ?? "memory");
8
+ const requests = [];
9
+ return {
10
+ name,
11
+ capabilities: options.capabilities ?? ALL_CAPABILITIES,
12
+ raw: {
13
+ requests,
14
+ clear() {
15
+ requests.length = 0;
16
+ },
17
+ },
18
+ async moderate(input, context) {
19
+ const result = options.handler
20
+ ? await options.handler(input, context)
21
+ : {
22
+ adapter: name,
23
+ flagged: false,
24
+ categories: {},
25
+ };
26
+ requests.push({
27
+ input,
28
+ context,
29
+ result: result,
30
+ });
31
+ return result;
32
+ },
33
+ };
34
+ }
35
+ export function failingAdapter(name, error = new Error("Moderation adapter failed."), capabilities = ALL_CAPABILITIES) {
36
+ return {
37
+ name,
38
+ capabilities,
39
+ moderate() {
40
+ throw error;
41
+ },
42
+ };
43
+ }
44
+ //# sourceMappingURL=testing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AASA,MAAM,gBAAgB,GAAkC;IACtD,IAAI,EAAE,IAAI;IACV,KAAK,EAAE,IAAI;IACX,YAAY,EAAE,QAAQ;CACvB,CAAC;AA0BF,MAAM,UAAU,aAAa,CAC3B,UAA2C,EAAE;IAE7C,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,QAAQ,CAAS,CAAC;IAChD,MAAM,QAAQ,GAAmC,EAAE,CAAC;IAEpD,OAAO;QACL,IAAI;QACJ,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,gBAAgB;QACtD,GAAG,EAAE;YACH,QAAQ;YACR,KAAK;gBACH,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;YACtB,CAAC;SACF;QACD,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO;YAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO;gBAC5B,CAAC,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC;gBACvC,CAAC,CAAE;oBACC,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,KAAK;oBACd,UAAU,EAAE,EAAE;iBACwB,CAAC;YAC7C,QAAQ,CAAC,IAAI,CAAC;gBACZ,KAAK;gBACL,OAAO;gBACP,MAAM,EAAE,MAA8C;aACvD,CAAC,CAAC;YACH,OAAO,MAAM,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,IAAU,EACV,QAAe,IAAI,KAAK,CAAC,4BAA4B,CAAC,EACtD,eAA8C,gBAAgB;IAE9D,OAAO;QACL,IAAI;QACJ,YAAY;QACZ,QAAQ;YACN,MAAM,KAAK,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,164 @@
1
+ import type { ModerationAdapterError, ModerationSdkError } from "./errors.js";
2
+ export type MaybePromise<T> = T | Promise<T>;
3
+ export type ModerationInputType = "text" | "image" | "conversation";
4
+ export type ModerationTextInput = {
5
+ type: "text";
6
+ text: string;
7
+ };
8
+ export type ModerationImageSource = {
9
+ type: "url";
10
+ url: string;
11
+ } | {
12
+ type: "base64";
13
+ data: string;
14
+ mediaType: string;
15
+ } | {
16
+ type: "bytes";
17
+ data: Uint8Array | ArrayBuffer | Blob;
18
+ mediaType: string;
19
+ };
20
+ export type ModerationImageInput = {
21
+ type: "image";
22
+ source: ModerationImageSource;
23
+ };
24
+ export type ModerationMessageRole = "system" | "user" | "assistant" | "tool";
25
+ export type ModerationMessage = {
26
+ role: ModerationMessageRole;
27
+ content: string;
28
+ };
29
+ export type ModerationConversationInput = {
30
+ type: "conversation";
31
+ messages: readonly ModerationMessage[];
32
+ };
33
+ export type ModerationInput = ModerationTextInput | ModerationImageInput | ModerationConversationInput;
34
+ export type ModerationProcessingMode = "native" | "flattened";
35
+ export type ModerationCategoryAssessment = {
36
+ flagged: boolean | null;
37
+ score?: number;
38
+ severity?: {
39
+ value: number;
40
+ max: number;
41
+ };
42
+ inputTypes?: readonly ("text" | "image")[];
43
+ };
44
+ export type ModerationAdapterResult<Name extends string = string, Raw = unknown> = {
45
+ adapter: Name;
46
+ flagged: boolean;
47
+ categories: Readonly<Record<string, ModerationCategoryAssessment>>;
48
+ id?: string;
49
+ model?: string;
50
+ raw?: Raw;
51
+ };
52
+ export type ModerationResult<Name extends string = string, Raw = unknown> = ModerationAdapterResult<Name, Raw> & {
53
+ inputType: ModerationInputType;
54
+ mode: ModerationProcessingMode;
55
+ };
56
+ export type ModerationAdapterCapabilities = {
57
+ text: boolean;
58
+ image: boolean;
59
+ conversation: "native" | "flattened" | "unsupported";
60
+ };
61
+ export type ModerationAdapterValidationContext = {
62
+ adapter: string;
63
+ inputType: ModerationInputType;
64
+ mode: ModerationProcessingMode;
65
+ };
66
+ export type ModerationAdapterContext = ModerationAdapterValidationContext & {
67
+ attempt: number;
68
+ signal?: AbortSignal;
69
+ metadata?: Readonly<Record<string, unknown>>;
70
+ };
71
+ export type ModerationAdapter<Name extends string = string, RawClient = unknown, RawResult = unknown> = {
72
+ readonly name: Name;
73
+ readonly capabilities: ModerationAdapterCapabilities;
74
+ readonly raw?: RawClient;
75
+ validate?(input: ModerationInput, context: ModerationAdapterValidationContext): MaybePromise<void>;
76
+ moderate(input: ModerationInput, context: ModerationAdapterContext): MaybePromise<ModerationAdapterResult<Name, RawResult>>;
77
+ };
78
+ export type ModerationRetryConfig = {
79
+ maxAttempts?: number;
80
+ delay?: (attempt: number, error: ModerationAdapterError) => number;
81
+ shouldRetry?: (error: ModerationAdapterError, attempt: number) => boolean;
82
+ };
83
+ export type ModerationFallbackConfig<Name extends string = string> = {
84
+ adapters: readonly Name[];
85
+ shouldFallback?: (error: ModerationAdapterError, nextAdapter: Name) => MaybePromise<boolean>;
86
+ };
87
+ export type ModerationOptions<Name extends string = string> = {
88
+ adapter?: Name;
89
+ fallback?: ModerationFallbackConfig<Name>;
90
+ retry?: ModerationRetryConfig;
91
+ signal?: AbortSignal;
92
+ metadata?: Readonly<Record<string, unknown>>;
93
+ };
94
+ export type ModerationHookEvent = {
95
+ adapter: string;
96
+ input: ModerationInput;
97
+ inputType: ModerationInputType;
98
+ mode: ModerationProcessingMode;
99
+ attempt: number;
100
+ metadata?: Readonly<Record<string, unknown>>;
101
+ };
102
+ export type ModerationAfterEvent = ModerationHookEvent & {
103
+ result: ModerationResult;
104
+ };
105
+ export type ModerationErrorEvent = ModerationHookEvent & {
106
+ error: ModerationAdapterError;
107
+ };
108
+ export type ModerationHooks = {
109
+ beforeModerate?: (event: ModerationHookEvent) => MaybePromise<void>;
110
+ afterModerate?: (event: ModerationAfterEvent) => MaybePromise<void>;
111
+ onError?: (event: ModerationErrorEvent) => MaybePromise<void>;
112
+ onRetry?: (event: ModerationErrorEvent & {
113
+ nextAttempt: number;
114
+ delayMs: number;
115
+ }) => MaybePromise<void>;
116
+ };
117
+ export type ModerationClientOptions<TAdapters extends readonly ModerationAdapter[] = readonly ModerationAdapter[]> = {
118
+ adapters: TAdapters;
119
+ defaultAdapter?: TAdapters[number]["name"];
120
+ fallback?: ModerationFallbackConfig<TAdapters[number]["name"]>;
121
+ retry?: ModerationRetryConfig;
122
+ hooks?: ModerationHooks;
123
+ };
124
+ export type ModerationRouteName<Routes extends readonly ModerationAdapter[]> = Routes[number]["name"];
125
+ export type ModerationAdapterForName<Routes extends readonly ModerationAdapter[], Name extends ModerationRouteName<Routes>> = Extract<Routes[number], {
126
+ name: Name;
127
+ }>;
128
+ export type ModerationResultForAdapter<TAdapter extends ModerationAdapter> = TAdapter extends ModerationAdapter<infer Name, unknown, infer Raw> ? ModerationResult<Name, Raw> : never;
129
+ export type ModerationValidationRoute<Name extends string = string> = {
130
+ adapter: Name;
131
+ mode: ModerationProcessingMode;
132
+ };
133
+ export type ModerationValidationResult<Name extends string = string> = {
134
+ adapter: Name;
135
+ routes: readonly ModerationValidationRoute<Name>[];
136
+ };
137
+ export type ModerationItem<Name extends string = string> = {
138
+ input: ModerationInput;
139
+ options?: ModerationOptions<Name>;
140
+ };
141
+ export type ModerationSettledResult<Result extends ModerationResult = ModerationResult> = {
142
+ ok: true;
143
+ index: number;
144
+ result: Result;
145
+ } | {
146
+ ok: false;
147
+ index: number;
148
+ error: ModerationSdkError;
149
+ };
150
+ export type BoundModerationClient<TAdapter extends ModerationAdapter> = {
151
+ validate(input: ModerationInput, options?: Omit<ModerationOptions<TAdapter["name"]>, "adapter">): Promise<ModerationValidationResult<TAdapter["name"]>>;
152
+ moderate(input: ModerationInput, options?: Omit<ModerationOptions<TAdapter["name"]>, "adapter">): Promise<ModerationResultForAdapter<TAdapter>>;
153
+ moderateMany(items: readonly ModerationItem<TAdapter["name"]>[], options?: Omit<ModerationOptions<TAdapter["name"]>, "adapter">): Promise<readonly ModerationSettledResult<ModerationResultForAdapter<TAdapter>>[]>;
154
+ };
155
+ export type ModerationClient<Routes extends readonly ModerationAdapter[]> = {
156
+ readonly adapters: ReadonlyMap<ModerationRouteName<Routes>, Routes[number]>;
157
+ readonly defaultAdapter: ModerationRouteName<Routes>;
158
+ validate(input: ModerationInput, options?: ModerationOptions<ModerationRouteName<Routes>>): Promise<ModerationValidationResult<ModerationRouteName<Routes>>>;
159
+ moderate(input: ModerationInput, options?: ModerationOptions<ModerationRouteName<Routes>>): Promise<ModerationResultForAdapter<Routes[number]>>;
160
+ moderateMany(items: readonly ModerationItem<ModerationRouteName<Routes>>[], options?: ModerationOptions<ModerationRouteName<Routes>>): Promise<readonly ModerationSettledResult<ModerationResultForAdapter<Routes[number]>>[]>;
161
+ adapter<Name extends ModerationRouteName<Routes>>(name: Name): ModerationAdapterForName<Routes, Name>;
162
+ withAdapter<Name extends ModerationRouteName<Routes>>(name: Name): BoundModerationClient<ModerationAdapterForName<Routes, Name>>;
163
+ };
164
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,26 @@
1
+ import { ModerationAdapterError, ModerationSdkError } from "./errors.js";
2
+ import type { ModerationAdapterResult, ModerationImageSource, ModerationInput } from "./types.js";
3
+ export declare function assertModerationInput(input: ModerationInput): void;
4
+ export declare function assertImageSource(source: ModerationImageSource): void;
5
+ export declare function flattenConversation(input: Extract<ModerationInput, {
6
+ type: "conversation";
7
+ }>): string;
8
+ export declare function normalizeHttpEndpoint(value: string, label: string): string;
9
+ export declare function normalizeBase64(value: string): string;
10
+ export declare function base64ByteLength(value: string): number;
11
+ export declare function binaryByteLength(value: Uint8Array | ArrayBuffer | Blob): number;
12
+ export declare function imageSourceByteLength(source: ModerationImageSource): number | undefined;
13
+ export declare function imageSourceToBase64(source: Exclude<ModerationImageSource, {
14
+ type: "url";
15
+ }>): Promise<string>;
16
+ export declare function imageSourceToDataUrl(source: Exclude<ModerationImageSource, {
17
+ type: "url";
18
+ }>): Promise<string>;
19
+ export declare function normalizeAdapterResult<Name extends string, Raw>(adapter: Name, value: ModerationAdapterResult<Name, Raw>): ModerationAdapterResult<Name, Raw>;
20
+ export declare function toAdapterError(adapter: string, error: unknown): ModerationAdapterError;
21
+ export declare function normalizeSdkError(error: unknown): ModerationSdkError;
22
+ export declare function throwIfAborted(signal?: AbortSignal): void;
23
+ export declare function isAbortLike(error: unknown): boolean;
24
+ export declare function raceWithAbort<T>(promise: Promise<T>, signal?: AbortSignal): Promise<T>;
25
+ export declare function sleepWithAbort(ms: number, signal?: AbortSignal): Promise<void>;
26
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,sBAAsB,EACtB,kBAAkB,EAEnB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EACV,uBAAuB,EACvB,qBAAqB,EACrB,eAAe,EAEhB,MAAM,YAAY,CAAC;AAKpB,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAsClE;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,qBAAqB,GAAG,IAAI,CAyCrE;AAYD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,eAAe,EAAE;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,CAAC,UAE5F;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAW1E;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKtD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,GAAG,IAAI,GAAG,MAAM,CAG/E;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,qBAAqB,GAAG,MAAM,GAAG,SAAS,CAIvF;AAED,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,qBAAqB,EAAE;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,CAAC,mBAUhG;AAUD,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,OAAO,CAAC,qBAAqB,EAAE;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,CAAC,mBAGxD;AAED,wBAAgB,sBAAsB,CAAC,IAAI,SAAS,MAAM,EAAE,GAAG,EAC7D,OAAO,EAAE,IAAI,EACb,KAAK,EAAE,uBAAuB,CAAC,IAAI,EAAE,GAAG,CAAC,GACxC,uBAAuB,CAAC,IAAI,EAAE,GAAG,CAAC,CAqBpC;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,sBAAsB,CA4BtF;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB,CAMpE;AAED,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,CAEzD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAMnD;AAED,wBAAsB,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAS5F;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB9E"}