cencori 1.3.1 → 1.4.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.
@@ -0,0 +1,94 @@
1
+ import { C as CencoriConfig } from '../types-kh1whvNH.mjs';
2
+
3
+ /**
4
+ * Documents API — extract text from PDFs and images, summarize, and query.
5
+ *
6
+ * @example
7
+ * const { text, pageCount } = await cencori.documents.extract({
8
+ * document: { url: 'https://example.com/contract.pdf' },
9
+ * });
10
+ *
11
+ * @example
12
+ * const { summary } = await cencori.documents.summarize({
13
+ * document: { base64, mimeType: 'application/pdf' },
14
+ * });
15
+ *
16
+ * @example
17
+ * const { answer } = await cencori.documents.query({
18
+ * document: { url: 'https://example.com/report.pdf' },
19
+ * question: 'What is the total revenue for Q3?',
20
+ * });
21
+ */
22
+
23
+ type DocumentExtractMethod = 'pdf_text' | 'vision_ocr';
24
+ type DocumentKind = 'pdf' | 'image';
25
+ interface DocumentInput {
26
+ url?: string;
27
+ base64?: string;
28
+ mimeType?: string;
29
+ filename?: string;
30
+ }
31
+ interface DocumentRequest {
32
+ document: DocumentInput;
33
+ prompt?: string;
34
+ model?: string;
35
+ maxTokens?: number;
36
+ temperature?: number;
37
+ }
38
+ interface DocumentQueryRequest extends DocumentRequest {
39
+ question: string;
40
+ }
41
+ interface DocumentUsage {
42
+ promptTokens: number;
43
+ completionTokens: number;
44
+ totalTokens: number;
45
+ }
46
+ interface DocumentCost {
47
+ providerCostUsd: number;
48
+ cencoriChargeUsd: number;
49
+ markupPercentage: number;
50
+ }
51
+ interface DocumentExtractResult {
52
+ text: string;
53
+ pageCount: number;
54
+ kind: DocumentKind;
55
+ method: DocumentExtractMethod;
56
+ model?: string;
57
+ provider?: string;
58
+ metadata?: Record<string, unknown>;
59
+ usage?: DocumentUsage;
60
+ cost?: DocumentCost;
61
+ }
62
+ interface DocumentSummarizeResult {
63
+ summary: string;
64
+ text: string;
65
+ pageCount: number;
66
+ model: string;
67
+ provider: string;
68
+ extractMethod: DocumentExtractMethod;
69
+ usage: DocumentUsage;
70
+ cost: DocumentCost;
71
+ }
72
+ interface DocumentQueryResult {
73
+ answer: string;
74
+ question: string;
75
+ pageCount: number;
76
+ model: string;
77
+ provider: string;
78
+ extractMethod: DocumentExtractMethod;
79
+ usage: DocumentUsage;
80
+ cost: DocumentCost;
81
+ }
82
+ declare class DocumentsNamespace {
83
+ private config;
84
+ constructor(config: Required<CencoriConfig>);
85
+ /** Extract text from a PDF (native, no LLM) or image (via Vision OCR). */
86
+ extract(request: DocumentRequest): Promise<DocumentExtractResult>;
87
+ /** Extract then summarize the document with a chat model. */
88
+ summarize(request: DocumentRequest): Promise<DocumentSummarizeResult>;
89
+ /** Extract then answer a question about the document. */
90
+ query(request: DocumentQueryRequest): Promise<DocumentQueryResult>;
91
+ private post;
92
+ }
93
+
94
+ export { type DocumentCost, type DocumentExtractMethod, type DocumentExtractResult, type DocumentInput, type DocumentKind, type DocumentQueryRequest, type DocumentQueryResult, type DocumentRequest, type DocumentSummarizeResult, type DocumentUsage, DocumentsNamespace };
@@ -0,0 +1,94 @@
1
+ import { C as CencoriConfig } from '../types-kh1whvNH.js';
2
+
3
+ /**
4
+ * Documents API — extract text from PDFs and images, summarize, and query.
5
+ *
6
+ * @example
7
+ * const { text, pageCount } = await cencori.documents.extract({
8
+ * document: { url: 'https://example.com/contract.pdf' },
9
+ * });
10
+ *
11
+ * @example
12
+ * const { summary } = await cencori.documents.summarize({
13
+ * document: { base64, mimeType: 'application/pdf' },
14
+ * });
15
+ *
16
+ * @example
17
+ * const { answer } = await cencori.documents.query({
18
+ * document: { url: 'https://example.com/report.pdf' },
19
+ * question: 'What is the total revenue for Q3?',
20
+ * });
21
+ */
22
+
23
+ type DocumentExtractMethod = 'pdf_text' | 'vision_ocr';
24
+ type DocumentKind = 'pdf' | 'image';
25
+ interface DocumentInput {
26
+ url?: string;
27
+ base64?: string;
28
+ mimeType?: string;
29
+ filename?: string;
30
+ }
31
+ interface DocumentRequest {
32
+ document: DocumentInput;
33
+ prompt?: string;
34
+ model?: string;
35
+ maxTokens?: number;
36
+ temperature?: number;
37
+ }
38
+ interface DocumentQueryRequest extends DocumentRequest {
39
+ question: string;
40
+ }
41
+ interface DocumentUsage {
42
+ promptTokens: number;
43
+ completionTokens: number;
44
+ totalTokens: number;
45
+ }
46
+ interface DocumentCost {
47
+ providerCostUsd: number;
48
+ cencoriChargeUsd: number;
49
+ markupPercentage: number;
50
+ }
51
+ interface DocumentExtractResult {
52
+ text: string;
53
+ pageCount: number;
54
+ kind: DocumentKind;
55
+ method: DocumentExtractMethod;
56
+ model?: string;
57
+ provider?: string;
58
+ metadata?: Record<string, unknown>;
59
+ usage?: DocumentUsage;
60
+ cost?: DocumentCost;
61
+ }
62
+ interface DocumentSummarizeResult {
63
+ summary: string;
64
+ text: string;
65
+ pageCount: number;
66
+ model: string;
67
+ provider: string;
68
+ extractMethod: DocumentExtractMethod;
69
+ usage: DocumentUsage;
70
+ cost: DocumentCost;
71
+ }
72
+ interface DocumentQueryResult {
73
+ answer: string;
74
+ question: string;
75
+ pageCount: number;
76
+ model: string;
77
+ provider: string;
78
+ extractMethod: DocumentExtractMethod;
79
+ usage: DocumentUsage;
80
+ cost: DocumentCost;
81
+ }
82
+ declare class DocumentsNamespace {
83
+ private config;
84
+ constructor(config: Required<CencoriConfig>);
85
+ /** Extract text from a PDF (native, no LLM) or image (via Vision OCR). */
86
+ extract(request: DocumentRequest): Promise<DocumentExtractResult>;
87
+ /** Extract then summarize the document with a chat model. */
88
+ summarize(request: DocumentRequest): Promise<DocumentSummarizeResult>;
89
+ /** Extract then answer a question about the document. */
90
+ query(request: DocumentQueryRequest): Promise<DocumentQueryResult>;
91
+ private post;
92
+ }
93
+
94
+ export { type DocumentCost, type DocumentExtractMethod, type DocumentExtractResult, type DocumentInput, type DocumentKind, type DocumentQueryRequest, type DocumentQueryResult, type DocumentRequest, type DocumentSummarizeResult, type DocumentUsage, DocumentsNamespace };
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/documents/index.ts
21
+ var documents_exports = {};
22
+ __export(documents_exports, {
23
+ DocumentsNamespace: () => DocumentsNamespace
24
+ });
25
+ module.exports = __toCommonJS(documents_exports);
26
+ function toBody(request, extra = {}) {
27
+ const body = {
28
+ prompt: request.prompt,
29
+ model: request.model,
30
+ max_tokens: request.maxTokens,
31
+ temperature: request.temperature,
32
+ ...extra
33
+ };
34
+ if (request.document.url) {
35
+ body.document_url = request.document.url;
36
+ } else if (request.document.base64) {
37
+ body.document_base64 = request.document.base64;
38
+ body.mime_type = request.document.mimeType;
39
+ body.filename = request.document.filename;
40
+ } else {
41
+ throw new Error("documents request requires document.url or document.base64");
42
+ }
43
+ return body;
44
+ }
45
+ var DocumentsNamespace = class {
46
+ constructor(config) {
47
+ this.config = config;
48
+ }
49
+ /** Extract text from a PDF (native, no LLM) or image (via Vision OCR). */
50
+ async extract(request) {
51
+ return this.post("/api/ai/documents/extract", toBody(request));
52
+ }
53
+ /** Extract then summarize the document with a chat model. */
54
+ async summarize(request) {
55
+ return this.post("/api/ai/documents/summarize", toBody(request));
56
+ }
57
+ /** Extract then answer a question about the document. */
58
+ async query(request) {
59
+ if (!request.question) throw new Error("documents.query requires a `question`");
60
+ return this.post("/api/ai/documents/query", toBody(request, { question: request.question }));
61
+ }
62
+ async post(path, body) {
63
+ const response = await fetch(`${this.config.baseUrl}${path}`, {
64
+ method: "POST",
65
+ headers: {
66
+ "CENCORI_API_KEY": this.config.apiKey,
67
+ "Content-Type": "application/json",
68
+ ...this.config.headers
69
+ },
70
+ body: JSON.stringify(body)
71
+ });
72
+ const data = await response.json();
73
+ if (!response.ok) {
74
+ const message = data && typeof data === "object" && "message" in data && typeof data.message === "string" ? data.message : `Documents request failed with status ${response.status}`;
75
+ const code = data && typeof data === "object" && "error" in data && typeof data.error === "string" ? data.error : "request_failed";
76
+ const err = new Error(message);
77
+ err.code = code;
78
+ err.details = data;
79
+ throw err;
80
+ }
81
+ return data;
82
+ }
83
+ };
84
+ // Annotate the CommonJS export names for ESM import in node:
85
+ 0 && (module.exports = {
86
+ DocumentsNamespace
87
+ });
88
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/documents/index.ts"],"sourcesContent":["/**\n * Documents API — extract text from PDFs and images, summarize, and query.\n *\n * @example\n * const { text, pageCount } = await cencori.documents.extract({\n * document: { url: 'https://example.com/contract.pdf' },\n * });\n *\n * @example\n * const { summary } = await cencori.documents.summarize({\n * document: { base64, mimeType: 'application/pdf' },\n * });\n *\n * @example\n * const { answer } = await cencori.documents.query({\n * document: { url: 'https://example.com/report.pdf' },\n * question: 'What is the total revenue for Q3?',\n * });\n */\n\nimport type { CencoriConfig } from '../types';\n\nexport type DocumentExtractMethod = 'pdf_text' | 'vision_ocr';\nexport type DocumentKind = 'pdf' | 'image';\n\nexport interface DocumentInput {\n url?: string;\n base64?: string;\n mimeType?: string;\n filename?: string;\n}\n\nexport interface DocumentRequest {\n document: DocumentInput;\n prompt?: string;\n model?: string;\n maxTokens?: number;\n temperature?: number;\n}\n\nexport interface DocumentQueryRequest extends DocumentRequest {\n question: string;\n}\n\nexport interface DocumentUsage {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n}\n\nexport interface DocumentCost {\n providerCostUsd: number;\n cencoriChargeUsd: number;\n markupPercentage: number;\n}\n\nexport interface DocumentExtractResult {\n text: string;\n pageCount: number;\n kind: DocumentKind;\n method: DocumentExtractMethod;\n model?: string;\n provider?: string;\n metadata?: Record<string, unknown>;\n usage?: DocumentUsage;\n cost?: DocumentCost;\n}\n\nexport interface DocumentSummarizeResult {\n summary: string;\n text: string;\n pageCount: number;\n model: string;\n provider: string;\n extractMethod: DocumentExtractMethod;\n usage: DocumentUsage;\n cost: DocumentCost;\n}\n\nexport interface DocumentQueryResult {\n answer: string;\n question: string;\n pageCount: number;\n model: string;\n provider: string;\n extractMethod: DocumentExtractMethod;\n usage: DocumentUsage;\n cost: DocumentCost;\n}\n\ninterface JsonBody {\n document_url?: string;\n document_base64?: string;\n mime_type?: string;\n filename?: string;\n prompt?: string;\n model?: string;\n max_tokens?: number;\n temperature?: number;\n question?: string;\n}\n\nfunction toBody(request: DocumentRequest, extra: Partial<JsonBody> = {}): JsonBody {\n const body: JsonBody = {\n prompt: request.prompt,\n model: request.model,\n max_tokens: request.maxTokens,\n temperature: request.temperature,\n ...extra,\n };\n if (request.document.url) {\n body.document_url = request.document.url;\n } else if (request.document.base64) {\n body.document_base64 = request.document.base64;\n body.mime_type = request.document.mimeType;\n body.filename = request.document.filename;\n } else {\n throw new Error('documents request requires document.url or document.base64');\n }\n return body;\n}\n\nexport class DocumentsNamespace {\n private config: Required<CencoriConfig>;\n\n constructor(config: Required<CencoriConfig>) {\n this.config = config;\n }\n\n /** Extract text from a PDF (native, no LLM) or image (via Vision OCR). */\n async extract(request: DocumentRequest): Promise<DocumentExtractResult> {\n return this.post<DocumentExtractResult>('/api/ai/documents/extract', toBody(request));\n }\n\n /** Extract then summarize the document with a chat model. */\n async summarize(request: DocumentRequest): Promise<DocumentSummarizeResult> {\n return this.post<DocumentSummarizeResult>('/api/ai/documents/summarize', toBody(request));\n }\n\n /** Extract then answer a question about the document. */\n async query(request: DocumentQueryRequest): Promise<DocumentQueryResult> {\n if (!request.question) throw new Error('documents.query requires a `question`');\n return this.post<DocumentQueryResult>('/api/ai/documents/query', toBody(request, { question: request.question }));\n }\n\n private async post<T>(path: string, body: JsonBody): Promise<T> {\n const response = await fetch(`${this.config.baseUrl}${path}`, {\n method: 'POST',\n headers: {\n 'CENCORI_API_KEY': this.config.apiKey,\n 'Content-Type': 'application/json',\n ...this.config.headers,\n },\n body: JSON.stringify(body),\n });\n const data = await response.json();\n if (!response.ok) {\n const message =\n (data && typeof data === 'object' && 'message' in data && typeof data.message === 'string')\n ? data.message\n : `Documents request failed with status ${response.status}`;\n const code =\n (data && typeof data === 'object' && 'error' in data && typeof data.error === 'string')\n ? data.error\n : 'request_failed';\n const err = new Error(message) as Error & { code?: string; details?: unknown };\n err.code = code;\n err.details = data;\n throw err;\n }\n return data as T;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAsGA,SAAS,OAAO,SAA0B,QAA2B,CAAC,GAAa;AAC/E,QAAM,OAAiB;AAAA,IACnB,QAAQ,QAAQ;AAAA,IAChB,OAAO,QAAQ;AAAA,IACf,YAAY,QAAQ;AAAA,IACpB,aAAa,QAAQ;AAAA,IACrB,GAAG;AAAA,EACP;AACA,MAAI,QAAQ,SAAS,KAAK;AACtB,SAAK,eAAe,QAAQ,SAAS;AAAA,EACzC,WAAW,QAAQ,SAAS,QAAQ;AAChC,SAAK,kBAAkB,QAAQ,SAAS;AACxC,SAAK,YAAY,QAAQ,SAAS;AAClC,SAAK,WAAW,QAAQ,SAAS;AAAA,EACrC,OAAO;AACH,UAAM,IAAI,MAAM,4DAA4D;AAAA,EAChF;AACA,SAAO;AACX;AAEO,IAAM,qBAAN,MAAyB;AAAA,EAG5B,YAAY,QAAiC;AACzC,SAAK,SAAS;AAAA,EAClB;AAAA;AAAA,EAGA,MAAM,QAAQ,SAA0D;AACpE,WAAO,KAAK,KAA4B,6BAA6B,OAAO,OAAO,CAAC;AAAA,EACxF;AAAA;AAAA,EAGA,MAAM,UAAU,SAA4D;AACxE,WAAO,KAAK,KAA8B,+BAA+B,OAAO,OAAO,CAAC;AAAA,EAC5F;AAAA;AAAA,EAGA,MAAM,MAAM,SAA6D;AACrE,QAAI,CAAC,QAAQ,SAAU,OAAM,IAAI,MAAM,uCAAuC;AAC9E,WAAO,KAAK,KAA0B,2BAA2B,OAAO,SAAS,EAAE,UAAU,QAAQ,SAAS,CAAC,CAAC;AAAA,EACpH;AAAA,EAEA,MAAc,KAAQ,MAAc,MAA4B;AAC5D,UAAM,WAAW,MAAM,MAAM,GAAG,KAAK,OAAO,OAAO,GAAG,IAAI,IAAI;AAAA,MAC1D,QAAQ;AAAA,MACR,SAAS;AAAA,QACL,mBAAmB,KAAK,OAAO;AAAA,QAC/B,gBAAgB;AAAA,QAChB,GAAG,KAAK,OAAO;AAAA,MACnB;AAAA,MACA,MAAM,KAAK,UAAU,IAAI;AAAA,IAC7B,CAAC;AACD,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,UACD,QAAQ,OAAO,SAAS,YAAY,aAAa,QAAQ,OAAO,KAAK,YAAY,WAC5E,KAAK,UACL,wCAAwC,SAAS,MAAM;AACjE,YAAM,OACD,QAAQ,OAAO,SAAS,YAAY,WAAW,QAAQ,OAAO,KAAK,UAAU,WACxE,KAAK,QACL;AACV,YAAM,MAAM,IAAI,MAAM,OAAO;AAC7B,UAAI,OAAO;AACX,UAAI,UAAU;AACd,YAAM;AAAA,IACV;AACA,WAAO;AAAA,EACX;AACJ;","names":[]}
@@ -0,0 +1,63 @@
1
+ // src/documents/index.ts
2
+ function toBody(request, extra = {}) {
3
+ const body = {
4
+ prompt: request.prompt,
5
+ model: request.model,
6
+ max_tokens: request.maxTokens,
7
+ temperature: request.temperature,
8
+ ...extra
9
+ };
10
+ if (request.document.url) {
11
+ body.document_url = request.document.url;
12
+ } else if (request.document.base64) {
13
+ body.document_base64 = request.document.base64;
14
+ body.mime_type = request.document.mimeType;
15
+ body.filename = request.document.filename;
16
+ } else {
17
+ throw new Error("documents request requires document.url or document.base64");
18
+ }
19
+ return body;
20
+ }
21
+ var DocumentsNamespace = class {
22
+ constructor(config) {
23
+ this.config = config;
24
+ }
25
+ /** Extract text from a PDF (native, no LLM) or image (via Vision OCR). */
26
+ async extract(request) {
27
+ return this.post("/api/ai/documents/extract", toBody(request));
28
+ }
29
+ /** Extract then summarize the document with a chat model. */
30
+ async summarize(request) {
31
+ return this.post("/api/ai/documents/summarize", toBody(request));
32
+ }
33
+ /** Extract then answer a question about the document. */
34
+ async query(request) {
35
+ if (!request.question) throw new Error("documents.query requires a `question`");
36
+ return this.post("/api/ai/documents/query", toBody(request, { question: request.question }));
37
+ }
38
+ async post(path, body) {
39
+ const response = await fetch(`${this.config.baseUrl}${path}`, {
40
+ method: "POST",
41
+ headers: {
42
+ "CENCORI_API_KEY": this.config.apiKey,
43
+ "Content-Type": "application/json",
44
+ ...this.config.headers
45
+ },
46
+ body: JSON.stringify(body)
47
+ });
48
+ const data = await response.json();
49
+ if (!response.ok) {
50
+ const message = data && typeof data === "object" && "message" in data && typeof data.message === "string" ? data.message : `Documents request failed with status ${response.status}`;
51
+ const code = data && typeof data === "object" && "error" in data && typeof data.error === "string" ? data.error : "request_failed";
52
+ const err = new Error(message);
53
+ err.code = code;
54
+ err.details = data;
55
+ throw err;
56
+ }
57
+ return data;
58
+ }
59
+ };
60
+ export {
61
+ DocumentsNamespace
62
+ };
63
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/documents/index.ts"],"sourcesContent":["/**\n * Documents API — extract text from PDFs and images, summarize, and query.\n *\n * @example\n * const { text, pageCount } = await cencori.documents.extract({\n * document: { url: 'https://example.com/contract.pdf' },\n * });\n *\n * @example\n * const { summary } = await cencori.documents.summarize({\n * document: { base64, mimeType: 'application/pdf' },\n * });\n *\n * @example\n * const { answer } = await cencori.documents.query({\n * document: { url: 'https://example.com/report.pdf' },\n * question: 'What is the total revenue for Q3?',\n * });\n */\n\nimport type { CencoriConfig } from '../types';\n\nexport type DocumentExtractMethod = 'pdf_text' | 'vision_ocr';\nexport type DocumentKind = 'pdf' | 'image';\n\nexport interface DocumentInput {\n url?: string;\n base64?: string;\n mimeType?: string;\n filename?: string;\n}\n\nexport interface DocumentRequest {\n document: DocumentInput;\n prompt?: string;\n model?: string;\n maxTokens?: number;\n temperature?: number;\n}\n\nexport interface DocumentQueryRequest extends DocumentRequest {\n question: string;\n}\n\nexport interface DocumentUsage {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n}\n\nexport interface DocumentCost {\n providerCostUsd: number;\n cencoriChargeUsd: number;\n markupPercentage: number;\n}\n\nexport interface DocumentExtractResult {\n text: string;\n pageCount: number;\n kind: DocumentKind;\n method: DocumentExtractMethod;\n model?: string;\n provider?: string;\n metadata?: Record<string, unknown>;\n usage?: DocumentUsage;\n cost?: DocumentCost;\n}\n\nexport interface DocumentSummarizeResult {\n summary: string;\n text: string;\n pageCount: number;\n model: string;\n provider: string;\n extractMethod: DocumentExtractMethod;\n usage: DocumentUsage;\n cost: DocumentCost;\n}\n\nexport interface DocumentQueryResult {\n answer: string;\n question: string;\n pageCount: number;\n model: string;\n provider: string;\n extractMethod: DocumentExtractMethod;\n usage: DocumentUsage;\n cost: DocumentCost;\n}\n\ninterface JsonBody {\n document_url?: string;\n document_base64?: string;\n mime_type?: string;\n filename?: string;\n prompt?: string;\n model?: string;\n max_tokens?: number;\n temperature?: number;\n question?: string;\n}\n\nfunction toBody(request: DocumentRequest, extra: Partial<JsonBody> = {}): JsonBody {\n const body: JsonBody = {\n prompt: request.prompt,\n model: request.model,\n max_tokens: request.maxTokens,\n temperature: request.temperature,\n ...extra,\n };\n if (request.document.url) {\n body.document_url = request.document.url;\n } else if (request.document.base64) {\n body.document_base64 = request.document.base64;\n body.mime_type = request.document.mimeType;\n body.filename = request.document.filename;\n } else {\n throw new Error('documents request requires document.url or document.base64');\n }\n return body;\n}\n\nexport class DocumentsNamespace {\n private config: Required<CencoriConfig>;\n\n constructor(config: Required<CencoriConfig>) {\n this.config = config;\n }\n\n /** Extract text from a PDF (native, no LLM) or image (via Vision OCR). */\n async extract(request: DocumentRequest): Promise<DocumentExtractResult> {\n return this.post<DocumentExtractResult>('/api/ai/documents/extract', toBody(request));\n }\n\n /** Extract then summarize the document with a chat model. */\n async summarize(request: DocumentRequest): Promise<DocumentSummarizeResult> {\n return this.post<DocumentSummarizeResult>('/api/ai/documents/summarize', toBody(request));\n }\n\n /** Extract then answer a question about the document. */\n async query(request: DocumentQueryRequest): Promise<DocumentQueryResult> {\n if (!request.question) throw new Error('documents.query requires a `question`');\n return this.post<DocumentQueryResult>('/api/ai/documents/query', toBody(request, { question: request.question }));\n }\n\n private async post<T>(path: string, body: JsonBody): Promise<T> {\n const response = await fetch(`${this.config.baseUrl}${path}`, {\n method: 'POST',\n headers: {\n 'CENCORI_API_KEY': this.config.apiKey,\n 'Content-Type': 'application/json',\n ...this.config.headers,\n },\n body: JSON.stringify(body),\n });\n const data = await response.json();\n if (!response.ok) {\n const message =\n (data && typeof data === 'object' && 'message' in data && typeof data.message === 'string')\n ? data.message\n : `Documents request failed with status ${response.status}`;\n const code =\n (data && typeof data === 'object' && 'error' in data && typeof data.error === 'string')\n ? data.error\n : 'request_failed';\n const err = new Error(message) as Error & { code?: string; details?: unknown };\n err.code = code;\n err.details = data;\n throw err;\n }\n return data as T;\n }\n}\n"],"mappings":";AAsGA,SAAS,OAAO,SAA0B,QAA2B,CAAC,GAAa;AAC/E,QAAM,OAAiB;AAAA,IACnB,QAAQ,QAAQ;AAAA,IAChB,OAAO,QAAQ;AAAA,IACf,YAAY,QAAQ;AAAA,IACpB,aAAa,QAAQ;AAAA,IACrB,GAAG;AAAA,EACP;AACA,MAAI,QAAQ,SAAS,KAAK;AACtB,SAAK,eAAe,QAAQ,SAAS;AAAA,EACzC,WAAW,QAAQ,SAAS,QAAQ;AAChC,SAAK,kBAAkB,QAAQ,SAAS;AACxC,SAAK,YAAY,QAAQ,SAAS;AAClC,SAAK,WAAW,QAAQ,SAAS;AAAA,EACrC,OAAO;AACH,UAAM,IAAI,MAAM,4DAA4D;AAAA,EAChF;AACA,SAAO;AACX;AAEO,IAAM,qBAAN,MAAyB;AAAA,EAG5B,YAAY,QAAiC;AACzC,SAAK,SAAS;AAAA,EAClB;AAAA;AAAA,EAGA,MAAM,QAAQ,SAA0D;AACpE,WAAO,KAAK,KAA4B,6BAA6B,OAAO,OAAO,CAAC;AAAA,EACxF;AAAA;AAAA,EAGA,MAAM,UAAU,SAA4D;AACxE,WAAO,KAAK,KAA8B,+BAA+B,OAAO,OAAO,CAAC;AAAA,EAC5F;AAAA;AAAA,EAGA,MAAM,MAAM,SAA6D;AACrE,QAAI,CAAC,QAAQ,SAAU,OAAM,IAAI,MAAM,uCAAuC;AAC9E,WAAO,KAAK,KAA0B,2BAA2B,OAAO,SAAS,EAAE,UAAU,QAAQ,SAAS,CAAC,CAAC;AAAA,EACpH;AAAA,EAEA,MAAc,KAAQ,MAAc,MAA4B;AAC5D,UAAM,WAAW,MAAM,MAAM,GAAG,KAAK,OAAO,OAAO,GAAG,IAAI,IAAI;AAAA,MAC1D,QAAQ;AAAA,MACR,SAAS;AAAA,QACL,mBAAmB,KAAK,OAAO;AAAA,QAC/B,gBAAgB;AAAA,QAChB,GAAG,KAAK,OAAO;AAAA,MACnB;AAAA,MACA,MAAM,KAAK,UAAU,IAAI;AAAA,IAC7B,CAAC;AACD,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,UACD,QAAQ,OAAO,SAAS,YAAY,aAAa,QAAQ,OAAO,KAAK,YAAY,WAC5E,KAAK,UACL,wCAAwC,SAAS,MAAM;AACjE,YAAM,OACD,QAAQ,OAAO,SAAS,YAAY,WAAW,QAAQ,OAAO,KAAK,UAAU,WACxE,KAAK,QACL;AACV,YAAM,MAAM,IAAI,MAAM,OAAO;AAC7B,UAAI,OAAO;AACX,UAAI,UAAU;AACd,YAAM;AAAA,IACV;AACA,WAAO;AAAA,EACX;AACJ;","names":[]}
package/dist/index.d.mts CHANGED
@@ -4,6 +4,8 @@ import { AINamespace } from './ai/index.mjs';
4
4
  export { StreamChunk } from './ai/index.mjs';
5
5
  import { VisionNamespace } from './vision/index.mjs';
6
6
  export { VisionClassification, VisionClassifyResult, VisionCost, VisionDescribeResult, VisionImage, VisionOcrResult, VisionProvider, VisionRequest, VisionResult, VisionStreamChunk, VisionTask, VisionUsage } from './vision/index.mjs';
7
+ import { DocumentsNamespace } from './documents/index.mjs';
8
+ export { DocumentCost, DocumentExtractMethod, DocumentExtractResult, DocumentInput, DocumentKind, DocumentQueryRequest, DocumentQueryResult, DocumentRequest, DocumentSummarizeResult, DocumentUsage } from './documents/index.mjs';
7
9
  import { ComputeNamespace } from './compute/index.mjs';
8
10
  import { WorkflowNamespace } from './workflow/index.mjs';
9
11
  import { StorageNamespace } from './storage/index.mjs';
@@ -229,6 +231,26 @@ declare class Cencori {
229
231
  * });
230
232
  */
231
233
  readonly vision: VisionNamespace;
234
+ /**
235
+ * Documents - Extract text from PDFs and images, summarize, and query
236
+ *
237
+ * @example
238
+ * const { text } = await cencori.documents.extract({
239
+ * document: { url: 'https://example.com/contract.pdf' }
240
+ * });
241
+ *
242
+ * @example
243
+ * const { summary } = await cencori.documents.summarize({
244
+ * document: { url: 'https://example.com/report.pdf' }
245
+ * });
246
+ *
247
+ * @example
248
+ * const { answer } = await cencori.documents.query({
249
+ * document: { url },
250
+ * question: 'What is the total revenue for Q3?',
251
+ * });
252
+ */
253
+ readonly documents: DocumentsNamespace;
232
254
  /**
233
255
  * Agents - Create and manage AI agents programmatically.
234
256
  *
@@ -369,4 +391,4 @@ declare class SafetyError extends CencoriError {
369
391
  */
370
392
  declare function fetchWithRetry(url: string, options: RequestInit, maxRetries?: number): Promise<Response>;
371
393
 
372
- export { AINamespace, type Agent, type AgentConfig, type AgentKey, type AgentListItem, AgentsNamespace, AuthenticationError, Cencori, CencoriConfig, CencoriError, ComputeNamespace, type CreateAgentKeyParams, type CreateAgentParams, type CreateSessionParams, MemoryClient, type PaginatedResponse, RateLimitError, RequestOptions, SafetyError, type Session, type SessionEvent, type SessionListParams, SessionsNamespace, StorageNamespace, TelemetryClient, type TurnParams, type UpdateAgentParams, VisionNamespace, WorkflowNamespace, Cencori as default, fetchWithRetry };
394
+ export { AINamespace, type Agent, type AgentConfig, type AgentKey, type AgentListItem, AgentsNamespace, AuthenticationError, Cencori, CencoriConfig, CencoriError, ComputeNamespace, type CreateAgentKeyParams, type CreateAgentParams, type CreateSessionParams, DocumentsNamespace, MemoryClient, type PaginatedResponse, RateLimitError, RequestOptions, SafetyError, type Session, type SessionEvent, type SessionListParams, SessionsNamespace, StorageNamespace, TelemetryClient, type TurnParams, type UpdateAgentParams, VisionNamespace, WorkflowNamespace, Cencori as default, fetchWithRetry };
package/dist/index.d.ts CHANGED
@@ -4,6 +4,8 @@ import { AINamespace } from './ai/index.js';
4
4
  export { StreamChunk } from './ai/index.js';
5
5
  import { VisionNamespace } from './vision/index.js';
6
6
  export { VisionClassification, VisionClassifyResult, VisionCost, VisionDescribeResult, VisionImage, VisionOcrResult, VisionProvider, VisionRequest, VisionResult, VisionStreamChunk, VisionTask, VisionUsage } from './vision/index.js';
7
+ import { DocumentsNamespace } from './documents/index.js';
8
+ export { DocumentCost, DocumentExtractMethod, DocumentExtractResult, DocumentInput, DocumentKind, DocumentQueryRequest, DocumentQueryResult, DocumentRequest, DocumentSummarizeResult, DocumentUsage } from './documents/index.js';
7
9
  import { ComputeNamespace } from './compute/index.js';
8
10
  import { WorkflowNamespace } from './workflow/index.js';
9
11
  import { StorageNamespace } from './storage/index.js';
@@ -229,6 +231,26 @@ declare class Cencori {
229
231
  * });
230
232
  */
231
233
  readonly vision: VisionNamespace;
234
+ /**
235
+ * Documents - Extract text from PDFs and images, summarize, and query
236
+ *
237
+ * @example
238
+ * const { text } = await cencori.documents.extract({
239
+ * document: { url: 'https://example.com/contract.pdf' }
240
+ * });
241
+ *
242
+ * @example
243
+ * const { summary } = await cencori.documents.summarize({
244
+ * document: { url: 'https://example.com/report.pdf' }
245
+ * });
246
+ *
247
+ * @example
248
+ * const { answer } = await cencori.documents.query({
249
+ * document: { url },
250
+ * question: 'What is the total revenue for Q3?',
251
+ * });
252
+ */
253
+ readonly documents: DocumentsNamespace;
232
254
  /**
233
255
  * Agents - Create and manage AI agents programmatically.
234
256
  *
@@ -369,4 +391,4 @@ declare class SafetyError extends CencoriError {
369
391
  */
370
392
  declare function fetchWithRetry(url: string, options: RequestInit, maxRetries?: number): Promise<Response>;
371
393
 
372
- export { AINamespace, type Agent, type AgentConfig, type AgentKey, type AgentListItem, AgentsNamespace, AuthenticationError, Cencori, CencoriConfig, CencoriError, ComputeNamespace, type CreateAgentKeyParams, type CreateAgentParams, type CreateSessionParams, MemoryClient, type PaginatedResponse, RateLimitError, RequestOptions, SafetyError, type Session, type SessionEvent, type SessionListParams, SessionsNamespace, StorageNamespace, TelemetryClient, type TurnParams, type UpdateAgentParams, VisionNamespace, WorkflowNamespace, Cencori as default, fetchWithRetry };
394
+ export { AINamespace, type Agent, type AgentConfig, type AgentKey, type AgentListItem, AgentsNamespace, AuthenticationError, Cencori, CencoriConfig, CencoriError, ComputeNamespace, type CreateAgentKeyParams, type CreateAgentParams, type CreateSessionParams, DocumentsNamespace, MemoryClient, type PaginatedResponse, RateLimitError, RequestOptions, SafetyError, type Session, type SessionEvent, type SessionListParams, SessionsNamespace, StorageNamespace, TelemetryClient, type TurnParams, type UpdateAgentParams, VisionNamespace, WorkflowNamespace, Cencori as default, fetchWithRetry };
package/dist/index.js CHANGED
@@ -26,6 +26,7 @@ __export(src_exports, {
26
26
  Cencori: () => Cencori,
27
27
  CencoriError: () => CencoriError,
28
28
  ComputeNamespace: () => ComputeNamespace,
29
+ DocumentsNamespace: () => DocumentsNamespace,
29
30
  MemoryClient: () => MemoryClient,
30
31
  RateLimitError: () => RateLimitError,
31
32
  SafetyError: () => SafetyError,
@@ -643,6 +644,17 @@ function toBody(request) {
643
644
  temperature: request.temperature,
644
645
  response_format: request.responseFormat
645
646
  };
647
+ if (request.images && request.images.length > 0) {
648
+ body.images = request.images.map((img) => {
649
+ if (img.url) return { url: img.url };
650
+ if (img.base64) return { base64: img.base64, mime_type: img.mimeType };
651
+ throw new Error("Each entry in images requires url or base64");
652
+ });
653
+ return body;
654
+ }
655
+ if (!request.image) {
656
+ throw new Error("vision request requires `image` or `images[]`");
657
+ }
646
658
  if (request.image.url) {
647
659
  body.image_url = request.image.url;
648
660
  } else if (request.image.base64) {
@@ -750,6 +762,66 @@ var VisionNamespace = class {
750
762
  }
751
763
  };
752
764
 
765
+ // src/documents/index.ts
766
+ function toBody2(request, extra = {}) {
767
+ const body = {
768
+ prompt: request.prompt,
769
+ model: request.model,
770
+ max_tokens: request.maxTokens,
771
+ temperature: request.temperature,
772
+ ...extra
773
+ };
774
+ if (request.document.url) {
775
+ body.document_url = request.document.url;
776
+ } else if (request.document.base64) {
777
+ body.document_base64 = request.document.base64;
778
+ body.mime_type = request.document.mimeType;
779
+ body.filename = request.document.filename;
780
+ } else {
781
+ throw new Error("documents request requires document.url or document.base64");
782
+ }
783
+ return body;
784
+ }
785
+ var DocumentsNamespace = class {
786
+ constructor(config) {
787
+ this.config = config;
788
+ }
789
+ /** Extract text from a PDF (native, no LLM) or image (via Vision OCR). */
790
+ async extract(request) {
791
+ return this.post("/api/ai/documents/extract", toBody2(request));
792
+ }
793
+ /** Extract then summarize the document with a chat model. */
794
+ async summarize(request) {
795
+ return this.post("/api/ai/documents/summarize", toBody2(request));
796
+ }
797
+ /** Extract then answer a question about the document. */
798
+ async query(request) {
799
+ if (!request.question) throw new Error("documents.query requires a `question`");
800
+ return this.post("/api/ai/documents/query", toBody2(request, { question: request.question }));
801
+ }
802
+ async post(path, body) {
803
+ const response = await fetch(`${this.config.baseUrl}${path}`, {
804
+ method: "POST",
805
+ headers: {
806
+ "CENCORI_API_KEY": this.config.apiKey,
807
+ "Content-Type": "application/json",
808
+ ...this.config.headers
809
+ },
810
+ body: JSON.stringify(body)
811
+ });
812
+ const data = await response.json();
813
+ if (!response.ok) {
814
+ const message = data && typeof data === "object" && "message" in data && typeof data.message === "string" ? data.message : `Documents request failed with status ${response.status}`;
815
+ const code = data && typeof data === "object" && "error" in data && typeof data.error === "string" ? data.error : "request_failed";
816
+ const err = new Error(message);
817
+ err.code = code;
818
+ err.details = data;
819
+ throw err;
820
+ }
821
+ return data;
822
+ }
823
+ };
824
+
753
825
  // src/sessions/index.ts
754
826
  var SessionsNamespace = class {
755
827
  constructor(config) {
@@ -1274,6 +1346,7 @@ var Cencori = class {
1274
1346
  };
1275
1347
  this.ai = new AINamespace(this.config);
1276
1348
  this.vision = new VisionNamespace(this.config);
1349
+ this.documents = new DocumentsNamespace(this.config);
1277
1350
  this.agents = new AgentsNamespace(this.config);
1278
1351
  this.compute = new ComputeNamespace();
1279
1352
  this.workflow = new WorkflowNamespace();
@@ -1701,6 +1774,7 @@ cencori.chat = cencori;
1701
1774
  Cencori,
1702
1775
  CencoriError,
1703
1776
  ComputeNamespace,
1777
+ DocumentsNamespace,
1704
1778
  MemoryClient,
1705
1779
  RateLimitError,
1706
1780
  SafetyError,