@certivu/sdk 1.4.1 → 2.0.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.
- package/README.md +18 -10
- package/dist/index.js +12 -3
- package/dist/methods/sign.d.ts.map +1 -1
- package/dist/types/options.d.ts +7 -1
- package/dist/types/options.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -24,12 +24,13 @@ const certivu = new CertivuClient({
|
|
|
24
24
|
generatorId: 'gen_xyz',
|
|
25
25
|
})
|
|
26
26
|
|
|
27
|
-
// Sign AI-generated content — returns the
|
|
28
|
-
const { token, record_id,
|
|
29
|
-
content: imageBuffer, // Buffer or Uint8Array
|
|
27
|
+
// Sign AI-generated content — returns the signed file + token
|
|
28
|
+
const { token, record_id, signedContent } = await certivu.sign({
|
|
29
|
+
content: imageBuffer, // Buffer or Uint8Array (image, audio, or text)
|
|
30
30
|
model: 'stable-diffusion-xl',
|
|
31
|
+
format: 'image', // optional — auto-detected from magic bytes if omitted
|
|
31
32
|
})
|
|
32
|
-
//
|
|
33
|
+
// signedContent is a Uint8Array — serve this, it has provenance embedded
|
|
33
34
|
|
|
34
35
|
// Verify — token optional, extracted automatically from XMP or watermark
|
|
35
36
|
const result = await certivu.verify({ content: imageBuffer })
|
|
@@ -57,17 +58,22 @@ Get your API key and generator credentials at [dashboard.certivu.ai](https://das
|
|
|
57
58
|
|
|
58
59
|
### `certivu.sign(input)`
|
|
59
60
|
|
|
60
|
-
Signs AI-generated content server-side — watermarking, hashing, and ML-DSA signing all happen in the API. Returns the signed
|
|
61
|
+
Signs AI-generated content server-side — watermarking, hashing, and ML-DSA signing all happen in the API. Accepts images (JPEG/PNG/WebP), audio (MP3/FLAC/WAV), and text (PDF/HTML/plain text). Returns the signed file with provenance embedded.
|
|
61
62
|
|
|
62
63
|
```typescript
|
|
63
|
-
const { token, record_id,
|
|
64
|
-
content:
|
|
64
|
+
const { token, record_id, signedContent, format } = await certivu.sign({
|
|
65
|
+
content: fileBuffer, // Uint8Array | Buffer
|
|
65
66
|
model: 'stable-diffusion-xl', // model identifier
|
|
66
67
|
generatorId: 'gen_xyz', // overrides config.generatorId
|
|
68
|
+
format: 'image', // optional — 'image' | 'audio' | 'text', auto-detected if omitted
|
|
67
69
|
})
|
|
68
|
-
//
|
|
70
|
+
// signedContent — Uint8Array with provenance embedded (XMP / ID3 / meta tag / ZWC)
|
|
71
|
+
// format — the detected/confirmed format string
|
|
72
|
+
// watermarkedContent — alias for signedContent, kept for backwards compatibility
|
|
69
73
|
```
|
|
70
74
|
|
|
75
|
+
Upload limit: 50 MB.
|
|
76
|
+
|
|
71
77
|
---
|
|
72
78
|
|
|
73
79
|
### `certivu.verify(input)`
|
|
@@ -88,11 +94,13 @@ const result = await certivu.verify({
|
|
|
88
94
|
authentic: boolean,
|
|
89
95
|
tampered: boolean,
|
|
90
96
|
confidence: 'high' | 'medium' | 'low' | 'none',
|
|
91
|
-
token_source: 'provided' | 'xmp' | 'watermark',
|
|
97
|
+
token_source: 'provided' | 'xmp' | 'watermark' | 'phash',
|
|
98
|
+
format?: 'image' | 'audio' | 'text',
|
|
92
99
|
signals: {
|
|
93
100
|
watermark_found: boolean,
|
|
94
101
|
record_found: boolean,
|
|
95
102
|
signature_valid: boolean,
|
|
103
|
+
phash_match?: boolean,
|
|
96
104
|
},
|
|
97
105
|
provenance: {
|
|
98
106
|
org: string,
|
|
@@ -216,7 +224,7 @@ try {
|
|
|
216
224
|
| `402` | Quota exhausted (free tier) |
|
|
217
225
|
| `403` | Generator doesn't belong to your org |
|
|
218
226
|
| `404` | Generator not found or revoked |
|
|
219
|
-
| `413` | Upload exceeds
|
|
227
|
+
| `413` | Upload exceeds 50 MB limit |
|
|
220
228
|
|
|
221
229
|
---
|
|
222
230
|
|
package/dist/index.js
CHANGED
|
@@ -21,9 +21,11 @@ function toUint8Array(content) {
|
|
|
21
21
|
async function signContent(baseUrl, apiKey, input) {
|
|
22
22
|
const bytes = toUint8Array(input.content);
|
|
23
23
|
const form = new FormData;
|
|
24
|
-
form.append("image", new Blob([bytes]), "
|
|
24
|
+
form.append("image", new Blob([bytes]), "content");
|
|
25
25
|
form.append("model", input.model);
|
|
26
26
|
form.append("generator_id", input.generatorId);
|
|
27
|
+
if (input.format)
|
|
28
|
+
form.append("format", input.format);
|
|
27
29
|
const res = await fetch(`${baseUrl}/v1/sign`, {
|
|
28
30
|
method: "POST",
|
|
29
31
|
headers: { Authorization: `Bearer ${apiKey}` },
|
|
@@ -35,8 +37,15 @@ async function signContent(baseUrl, apiKey, input) {
|
|
|
35
37
|
}
|
|
36
38
|
const token = res.headers.get("X-Certivu-Token") ?? "";
|
|
37
39
|
const record_id = res.headers.get("X-Certivu-Record-Id") ?? "";
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
+
const formatHeader = res.headers.get("X-Certivu-Format");
|
|
41
|
+
const signedContent = new Uint8Array(await res.arrayBuffer());
|
|
42
|
+
return {
|
|
43
|
+
token,
|
|
44
|
+
record_id,
|
|
45
|
+
signedContent,
|
|
46
|
+
watermarkedContent: signedContent,
|
|
47
|
+
...formatHeader ? { format: formatHeader } : {}
|
|
48
|
+
};
|
|
40
49
|
}
|
|
41
50
|
|
|
42
51
|
// src/methods/verify.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sign.d.ts","sourceRoot":"","sources":["../../src/methods/sign.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAOhE,wBAAsB,WAAW,CAC/B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,GAC1D,OAAO,CAAC,YAAY,CAAC,
|
|
1
|
+
{"version":3,"file":"sign.d.ts","sourceRoot":"","sources":["../../src/methods/sign.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAOhE,wBAAsB,WAAW,CAC/B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,GAC1D,OAAO,CAAC,YAAY,CAAC,CAiCvB"}
|
package/dist/types/options.d.ts
CHANGED
|
@@ -8,6 +8,8 @@ export interface SignInput {
|
|
|
8
8
|
content: Uint8Array | string;
|
|
9
9
|
model: string;
|
|
10
10
|
generatorId?: string;
|
|
11
|
+
/** Content format. Auto-detected from magic bytes if omitted. */
|
|
12
|
+
format?: "image" | "audio" | "text";
|
|
11
13
|
}
|
|
12
14
|
export interface VerifyInput {
|
|
13
15
|
content: Uint8Array | string;
|
|
@@ -25,8 +27,12 @@ export interface SignResponse {
|
|
|
25
27
|
token: string;
|
|
26
28
|
record_id: string;
|
|
27
29
|
deduplicated?: boolean;
|
|
28
|
-
/**
|
|
30
|
+
/** Signed content bytes with ctv_ token embedded — store and deliver this instead of the original */
|
|
31
|
+
signedContent: Uint8Array;
|
|
32
|
+
/** @deprecated Use signedContent */
|
|
29
33
|
watermarkedContent: Uint8Array;
|
|
34
|
+
/** Detected or declared content format */
|
|
35
|
+
format?: "image" | "audio" | "text";
|
|
30
36
|
}
|
|
31
37
|
export interface BatchVerifyResponse {
|
|
32
38
|
results: VerificationResult[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/types/options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAErE,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,UAAU,GAAG,MAAM,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/types/options.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@certivu/sdk",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.1",
|
|
4
4
|
"description": "Official SDK for Certivu — quantum-resistant AI content provenance",
|
|
5
5
|
"keywords": ["certivu", "ai", "provenance", "post-quantum", "ml-dsa", "watermark"],
|
|
6
6
|
"homepage": "https://certivu.ai",
|