@graphysdk/agents-sdk 1.3.0-beta.1778059383500 → 1.3.0-beta.1778504701741
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 +19 -0
- package/dist/README.md +19 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +29 -4
- package/dist/index.mjs +1 -1
- package/package.json +2 -2
package/README.md
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# @graphysdk/agents-sdk
|
|
2
|
+
|
|
3
|
+
TypeScript client types and helpers for Graphy agent HTTP APIs.
|
|
4
|
+
|
|
5
|
+
## Extract (`POST /api/v0/extract`)
|
|
6
|
+
|
|
7
|
+
`ExtractFromProseParams` mirrors `ExtractFromProseRequestSchema` in **agents-api**. Prefer **`attachments[]`** over deprecated **`images[]`** (do not send both).
|
|
8
|
+
|
|
9
|
+
Each attachment uses **`kind`**:
|
|
10
|
+
|
|
11
|
+
| `kind` | Purpose | Helper |
|
|
12
|
+
| --------------- | ------------------------------------- | ---------------------------- |
|
|
13
|
+
| `"image"` | PNG / JPEG / WebP / GIF | `buildImageAttachment` |
|
|
14
|
+
| `"document"` | PDF (`application/pdf`) | `buildPdfAttachment` |
|
|
15
|
+
| `"spreadsheet"` | Excel `.xlsx` (OOXML ZIP on the wire) | `buildSpreadsheetAttachment` |
|
|
16
|
+
|
|
17
|
+
Spreadsheet rows must use MIME **`application/vnd.openxmlformats-officedocument.spreadsheetml.sheet`**, RFC 4648 **base64** payload (no `data:` prefix), and optional **`filename`**. Client-side caps (`MAX_EXTRACT_SPREADSHEETS`, per-file and combined totals) align with **agents-api**; the server re-validates decoded size and that the payload starts with a ZIP local-file header (`PK\x03\x04`).
|
|
18
|
+
|
|
19
|
+
See **`apps/agents-api/README.md`** (`POST /api/v0/extract`) for route limits and runtime behavior (e.g. spreadsheet tools enabled when `.xlsx` attachments are present).
|
package/dist/README.md
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# @graphysdk/agents-sdk
|
|
2
|
+
|
|
3
|
+
TypeScript client types and helpers for Graphy agent HTTP APIs.
|
|
4
|
+
|
|
5
|
+
## Extract (`POST /api/v0/extract`)
|
|
6
|
+
|
|
7
|
+
`ExtractFromProseParams` mirrors `ExtractFromProseRequestSchema` in **agents-api**. Prefer **`attachments[]`** over deprecated **`images[]`** (do not send both).
|
|
8
|
+
|
|
9
|
+
Each attachment uses **`kind`**:
|
|
10
|
+
|
|
11
|
+
| `kind` | Purpose | Helper |
|
|
12
|
+
| --------------- | ------------------------------------- | ---------------------------- |
|
|
13
|
+
| `"image"` | PNG / JPEG / WebP / GIF | `buildImageAttachment` |
|
|
14
|
+
| `"document"` | PDF (`application/pdf`) | `buildPdfAttachment` |
|
|
15
|
+
| `"spreadsheet"` | Excel `.xlsx` (OOXML ZIP on the wire) | `buildSpreadsheetAttachment` |
|
|
16
|
+
|
|
17
|
+
Spreadsheet rows must use MIME **`application/vnd.openxmlformats-officedocument.spreadsheetml.sheet`**, RFC 4648 **base64** payload (no `data:` prefix), and optional **`filename`**. Client-side caps (`MAX_EXTRACT_SPREADSHEETS`, per-file and combined totals) align with **agents-api**; the server re-validates decoded size and that the payload starts with a ZIP local-file header (`PK\x03\x04`).
|
|
18
|
+
|
|
19
|
+
See **`apps/agents-api/README.md`** (`POST /api/v0/extract`) for route limits and runtime behavior (e.g. spreadsheet tools enabled when `.xlsx` attachments are present).
|
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var e=require("tslib"),t=require("zod");class r extends Error{constructor(e,t){var r;super(e),Object.setPrototypeOf(this,new.target.prototype),this.name="GraphyApiError",this.status=null==t?void 0:t.status,this.code=null==t?void 0:t.code,this.retryable=null!==(r=null==t?void 0:t.retryable)&&void 0!==r&&r}}const i=e=>"progress"===e.type,a=e=>"complete"===e.type,n=e=>"error"===e.type;class s{constructor(e){if(this.tag="[GRAPHY]",!e.apiKey||0===e.apiKey.trim().length)throw new Error("apiKey is required and must not be empty");const t=new URL(e.baseUrl);if(!["http:","https:"].includes(t.protocol))throw new Error(`Invalid baseUrl protocol: ${t.protocol}. Only http(s) is allowed.`);this.apiKey=e.apiKey,this.baseUrl=t.origin+t.pathname.replace(/\/$/,""),this.timeout=e.timeout||6e4,this.retryConfig=e.retryConfig||{attempts:3,delay:1e3,backoff:2},this.logger=e.logger||{log:console.log,warn:console.warn,error:console.error,debug:console.debug}}static isProgressEvent(e){return i(e)}static isCompleteEvent(e){return a(e)}static isErrorEvent(e){return n(e)}stream(t,r,i){return e.__awaiter(this,void 0,void 0,function*(){const e=yield this.makeRequest(t,r,i);return this.parseSSE(e)})}fetch(t,s,o,c){return e.__awaiter(this,void 0,void 0,function*(){var l,m,d,g,u;const h=Date.now();this.logger.debug(`${this.tag} Fetch: ${t}`);try{const b=yield this.makeRequest(t,s,c),x=b.headers.get("content-type");if(null==x?void 0:x.includes("text/event-stream")){try{for(var p,f=!0,y=e.__asyncValues(this.parseSSE(b));!(l=(p=yield y.next()).done);f=!0){g=p.value,f=!1;const e=g;if(i(e)&&o&&o(e),a(e))return e.data;if(n(e)){const i=Date.now()-h;throw this.logger.error(`${this.tag} Server error: ${t} ${i}ms`,e.error),new r(e.error,{code:e.code,retryable:null!==(u=e.retryable)&&void 0!==u&&u})}}}catch(e){m={error:e}}finally{try{f||l||!(d=y.return)||(yield d.call(y))}finally{if(m)throw m.error}}const s=Date.now()-h;throw this.logger.error(`${this.tag} Stream incomplete: ${t} ${s}ms`),new r("Stream ended without completion")}return yield b.json()}catch(e){const i=Date.now()-h;if(this.logger.error(`${this.tag} Fetch failed: ${t} ${i}ms`,e),e instanceof r)throw e;throw e}finally{const e=Date.now()-h;this.logger.debug(`${this.tag} Fetch completed: ${t} ${e}ms`)}})}ping(){return e.__awaiter(this,void 0,void 0,function*(){const e=Date.now();try{return yield this.makeRequest("/health",void 0,void 0,this.retryConfig.attempts,"GET"),{ok:!0,latency:Date.now()-e}}catch(t){return{ok:!1,latency:Date.now()-e}}})}sleep(t){return e.__awaiter(this,void 0,void 0,function*(){return new Promise(e=>setTimeout(e,t))})}parseSSE(t){return e.__asyncGenerator(this,arguments,function*(){if(!t.body)throw new r("Response body is null");const i=t.body.getReader(),a=new TextDecoder;let n="",s="",o="";try{for(;;){const{done:t,value:r}=yield e.__await(i.read());if(t)break;n+=a.decode(r,{stream:!0});const c=n.split(/\r?\n/);n=c.pop()||"";for(const t of c)if(t.startsWith("event: "))s=t.slice(7).trim();else if(t.startsWith("data: "))o+=(o?"\n":"")+t.slice(6);else if(""===t.trim()&&o){try{const t=JSON.parse(o);let r;if("progress"===s){const e=t;r=Object.assign({type:"progress"},e)}else if("complete"===s)r={type:"complete",data:t};else if("error"===s){const e=t;r=Object.assign({type:"error"},e)}else if("preview"===s){const e=t;r=Object.assign(Object.assign({},e),{type:"preview"})}else{if("reasoning"!==s){s="",o="";continue}{const e=t;r=Object.assign(Object.assign({},e),{type:"reasoning"})}}if(yield yield e.__await(r),"complete"===s||"error"===s)return yield e.__await(void 0)}catch(e){this.logger.warn("Invalid SSE data format",o)}s="",o=""}}}finally{i.releaseLock()}})}makeRequest(t,i,a){return e.__awaiter(this,arguments,void 0,function*(e,t,i,a=1,n="POST"){if(!e.startsWith("/"))throw new r("Invalid endpoint: must start with /");const s=new URL(e,this.baseUrl);if(s.origin!==new URL(this.baseUrl).origin)throw new r("Endpoint resolved to unexpected origin");this.logger.debug(`${this.tag} Request ${a}/${this.retryConfig.attempts}: ${s}`);const o=new AbortController,c=setTimeout(()=>o.abort(),this.timeout),l=()=>o.abort();i&&i.addEventListener("abort",l);try{const c=yield fetch(s,Object.assign({method:n,headers:{"Content-Type":"application/json",Accept:"application/json, text/event-stream","Cache-Control":"no-cache",Authorization:`Bearer ${this.apiKey}`,"User-Agent":"Graphy-SDK/1.0"},signal:o.signal},"POST"===n&&{body:JSON.stringify(t)}));if(!c.ok){const s=c.status>=500||429===c.status;let o,l=`HTTP ${c.status}`;try{const e=yield c.json();if("object"==typeof e&&null!==e){const t=e;"string"==typeof t.message?l=t.message:"string"==typeof t.error&&(l=t.error),"string"==typeof t.code&&(o=t.code)}}catch(e){}const m=new r(l,{status:c.status,code:o,retryable:s});if(s&&a<this.retryConfig.attempts&&!(null==i?void 0:i.aborted)){const r=this.retryConfig.delay*Math.pow(this.retryConfig.backoff,a-1);return this.logger.warn(`${this.tag} Retrying ${e} in ${r}ms (attempt ${a+1})`),yield this.sleep(r),this.makeRequest(e,t,i,a+1,n)}throw this.logger.error(`${this.tag} Request failed: ${e} (${c.status}) - ${l}`),m}return this.logger.debug(`${this.tag} Connected: ${e}`),c}catch(s){if(s instanceof r)throw s;if(s instanceof Error&&"AbortError"===s.name)throw this.logger.debug(`${this.tag} Aborted: ${e}`),s;if(a<this.retryConfig.attempts&&!(null==i?void 0:i.aborted)){const r=this.retryConfig.delay*Math.pow(this.retryConfig.backoff,a-1);return this.logger.warn(`${this.tag} Network error, retrying ${e} in ${r}ms`),yield this.sleep(r),this.makeRequest(e,t,i,a+1,n)}throw this.logger.error(`${this.tag} Network error: ${e}`,s),new r("Network error",{retryable:!0})}finally{clearTimeout(c),i&&i.removeEventListener("abort",l)}})}}const o=t.z.enum(["EN_GB","EN_US"]),c=t.z.custom(e=>null!=e&&"object"==typeof e),l=t.z.enum(["low","medium","high"]),m=t.z.enum(["none","low","medium","high"]),d=t.z.enum(["agentic","fast"]),g=t.z.object({maxWallClockMs:t.z.number().positive().optional(),maxTotalTokens:t.z.number().int().positive().optional(),maxCostUsd:t.z.number().positive().optional()}),u=t.z.object({callId:t.z.string().max(256),locale:o.optional(),effort:l.optional(),storytellingEffort:m.optional().default("low"),budget:g.optional(),executionMode:d.optional()}),h=t.z.object({config:c,userPrompt:t.z.string().max(1e4).optional().default(""),metadata:u.optional()}),p=h.extend({maxSuggestionCount:t.z.number().int().min(1).max(4).optional()}),f=t.z.enum(["line","bar","groupedBar","stackedBar","100StackedBar","column","groupedColumn","stackedColumn","100StackedColumn","combo","pie","donut","funnel","heatmap","scatter","bubble","waterfall","table"]),y=t.z.object({dataPrepPrompt:t.z.string(),chartType:f,summary:t.z.string()}),b=t.z.object({response:t.z.object({message:t.z.string()}),config:c}),x=t.z.object({suggestions:t.z.array(y)}),v=t.z.enum(["comparison","relationship","distribution","composition"]),w=t.z.object({finding:t.z.string().describe("Plain-English summary of the finding (no stats jargon)."),confidence:t.z.number().min(0).max(1).describe("Statistical strength of the finding (0..1). Independent of topicality."),relevance:t.z.number().min(0).max(1).describe("Topical fit with the user prompt and chart narrative (0..1). Independent of statistical strength."),topic:t.z.string().min(1).describe("Kebab-case label grouping this finding with related ones; consumers can render findings as threads."),chartHint:t.z.string().min(1).max(240).describe('Natural-language data-prep recipe for a downstream mutate agent: filter → group → aggregate → sort, naming real dataset columns. No chart type or "render as" clause — that is set via chartFamily.'),chartFamily:v.describe("Abela family (comparison | relationship | distribution | composition). Downstream chart-generator picks the concrete chart type from this family + the data shape."),evidenceSummary:t.z.string().max(300).describe("Rigorous statistical back-up with exact numbers.")}),_=t.z.object({topic:t.z.string().min(1).describe("Kebab-case story headline shared by all child findings."),score:t.z.number().min(0).max(1).describe("Max quadrant score (relevance × confidence) across child findings."),count:t.z.number().int().min(1).describe("Number of findings in this story."),findings:t.z.array(w).describe("Child findings, sorted by quadrant score desc.")}),z=t.z.object({response:t.z.object({message:t.z.string(),steps:t.z.array(t.z.string())}),stories:t.z.array(_)}),S=t.z.object({response:t.z.object({message:t.z.string(),steps:t.z.array(t.z.string())}),config:c}),E=t.z.object({response:t.z.object({message:t.z.string(),steps:t.z.array(t.z.string())}),config:c}),T=t.z.enum(["high","medium","low"]),$=t.z.object({confidence:T,needsUserInput:t.z.boolean(),warnings:t.z.array(t.z.string()),cellConfidence:t.z.array(t.z.object({rowIndex:t.z.number().int().nonnegative(),columnKey:t.z.string(),confidence:T,quote:t.z.string().optional()})).optional()}),j=t.z.object({score:t.z.number().min(0).max(1),issues:t.z.array(t.z.string()),sufficient:t.z.boolean(),summary:t.z.string()}),C=5e5,A=2097152,O=7340032,R=6291456,M=8388608,k=12582912,D=4*Math.ceil(699050.6666666666),G=4*Math.ceil(2446677.3333333335),I=4*Math.ceil(2097152),P=4*Math.ceil(2796202.6666666665),B=4*Math.ceil(4194304);function N(e){return e.replace(/\s+/g,"")}function U(e){const t=N(e);return 0!==t.length&&t.length%4==0&&/^[A-Za-z0-9+/]+={0,2}$/.test(t)}const X=/^image\/(png|jpeg|jpg|webp|gif)$/i,q=t.z.object({mimeType:t.z.string().min(1).refine(e=>X.test(e.trim()),{message:"mimeType must be image/png, image/jpeg, image/jpg, image/webp, or image/gif"}),dataBase64:t.z.string().min(1).max(D).refine(U,{message:"dataBase64 must be standard base64 (RFC 4648)"})}),F=t.z.enum(["image","document"]),K=q.extend({kind:t.z.literal("image")}),L=t.z.object({kind:t.z.literal("document"),mimeType:t.z.string().min(1).refine(e=>/^application\/pdf$/i.test(e.trim()),{message:"document mimeType must be application/pdf"}),dataBase64:t.z.string().min(1).max(I).refine(U,{message:"dataBase64 must be standard base64 (RFC 4648)"})}),H=t.z.discriminatedUnion("kind",[K,L]),W=t.z.object({sourceText:t.z.string().max(C).default(""),images:t.z.array(q).max(8).optional().describe('@deprecated Use attachments[] with kind: "image" instead. Will be removed in a future major release.'),attachments:t.z.array(H).max(10).optional(),metadata:u.optional()}).superRefine((e,t)=>{var r,i;const a=e.sourceText.trim(),n=null!==(r=e.images)&&void 0!==r?r:[],s=null!==(i=e.attachments)&&void 0!==i?i:[];if(n.length>0&&s.length>0)return void t.addIssue({code:"custom",message:'Use either `images` (deprecated) or `attachments`, not both. Migrate to `attachments` with `kind: "image"`.',path:["attachments"]});if(0===a.length&&0===n.length&&0===s.length)return void t.addIssue({code:"custom",message:"Provide non-empty sourceText and/or at least one attachment",path:["sourceText"]});if(n.length>0){n.reduce((e,t)=>e+N(t.dataBase64).length,0)>G&&t.addIssue({code:"custom",message:"Combined image base64 exceeds maximum length for this API (must fit server decode limits)",path:["images"]})}const o=s.filter(e=>"image"===e.kind).length,c=s.length-o;if(o>8&&t.addIssue({code:"custom",message:"Too many images (max 8)",path:["attachments"]}),c>2&&t.addIssue({code:"custom",message:"Too many documents (max 2)",path:["attachments"]}),s.length>0&&o<=8&&c<=2){let e=0,r=0,i=0;for(const t of s){const a=N(t.dataBase64).length;i+=a,"image"===t.kind?e+=a:r+=a}e>G&&t.addIssue({code:"custom",message:"Combined image base64 exceeds maximum length for this API (must fit server decode limits)",path:["attachments"]}),r>P&&t.addIssue({code:"custom",message:"Combined document base64 exceeds maximum length for this API (must fit server decode limits)",path:["attachments"]}),i>B&&t.addIssue({code:"custom",message:"Combined attachment base64 exceeds maximum length for this API (must fit server decode limits)",path:["attachments"]})}});const Y=t.z.object({response:t.z.object({message:t.z.string()}),config:c,extractMeta:$.nullable(),lastAccuracyEvaluation:j.optional()}),J=t.z.object({config:c,response:t.z.object({message:t.z.string(),steps:t.z.array(t.z.string())})}),V=x,Z="/api/v0";exports.AiChartTypeEnum=f,exports.ChartFamilySchema=v,exports.ExecutionModeSchema=d,exports.ExploreFindingSchema=w,exports.ExploreStorySchema=_,exports.ExtractAccuracyEvaluationSchema=j,exports.ExtractAttachmentInputSchema=H,exports.ExtractAttachmentKindSchema=F,exports.ExtractConfidenceSchema=T,exports.ExtractFromProseParamsSchema=W,exports.ExtractFromProseResponseSchema=Y,exports.ExtractMetaSchema=$,exports.GenerateAnnotationsResponseSchema=S,exports.GenerateExplorationResponseSchema=z,exports.GenerateGraphResponseSchema=J,exports.GenerateGraphSuggestionsResponseSchema=V,exports.GenerateMutationResponseSchema=E,exports.GenerateNarrativeResponseSchema=b,exports.GenerateSuggestionsParamsSchema=p,exports.GenerateSuggestionsResponseSchema=x,exports.GraphGenerationRequestSchema=h,exports.GraphyAiSdk=class{constructor(e){this.client=new s(e)}generateGraph(t,r,i){return e.__awaiter(this,void 0,void 0,function*(){const{storytellingOptions:a}=t,n=e.__rest(t,["storytellingOptions"]),s=yield this.client.fetch(`${Z}/generate`,n,r,i),o=J.parse(s);return this.stripStorytelling(o,a)})}generateGraphStream(t,r){return e.__awaiter(this,void 0,void 0,function*(){const{storytellingOptions:i}=t,a=e.__rest(t,["storytellingOptions"]),n=yield this.client.stream(`${Z}/generate`,a,r);return this.wrapStreamWithStorytellingStripping(n,i)})}generateNarrative(t,r,i){return e.__awaiter(this,void 0,void 0,function*(){const e=yield this.client.fetch(`${Z}/narrate`,t,r,i);return b.parse(e)})}generateNarrativeStream(t,r){return e.__awaiter(this,void 0,void 0,function*(){return this.client.stream(`${Z}/narrate`,t,r)})}generateSuggestions(t,r,i){return e.__awaiter(this,void 0,void 0,function*(){const e=yield this.client.fetch(`${Z}/suggestions`,t,r,i);return x.parse(e)})}generateSuggestionsStream(t,r){return e.__awaiter(this,void 0,void 0,function*(){return this.client.stream(`${Z}/suggestions`,t,r)})}generateExploration(t,r,i){return e.__awaiter(this,void 0,void 0,function*(){const e=yield this.client.fetch(`${Z}/explore`,t,r,i);return z.parse(e)})}generateExplorationStream(t,r){return e.__awaiter(this,void 0,void 0,function*(){return this.client.stream(`${Z}/explore`,t,r)})}generateAnnotations(t,r,i){return e.__awaiter(this,void 0,void 0,function*(){const e=yield this.client.fetch(`${Z}/annotate`,t,r,i);return S.parse(e)})}generateAnnotationsStream(t,r){return e.__awaiter(this,void 0,void 0,function*(){return this.client.stream(`${Z}/annotate`,t,r)})}generateMutation(t,r,i){return e.__awaiter(this,void 0,void 0,function*(){const e=yield this.client.fetch(`${Z}/mutate`,t,r,i);return E.parse(e)})}generateMutationStream(t,r){return e.__awaiter(this,void 0,void 0,function*(){return this.client.stream(`${Z}/mutate`,t,r)})}extractFromProse(t,r,i){return e.__awaiter(this,void 0,void 0,function*(){const e=yield this.client.fetch(`${Z}/extract`,t,r,i);return Y.parse(e)})}extractFromProseStream(t,r){return e.__awaiter(this,void 0,void 0,function*(){return this.client.stream(`${Z}/extract`,t,r)})}stripStorytelling(e,t){return t&&e.config.content?Object.assign(Object.assign({},e),{config:Object.assign(Object.assign({},e.config),{content:Object.assign(Object.assign(Object.assign(Object.assign({},e.config.content),t.excludeTitle&&{title:void 0}),t.excludeSubtitle&&{subtitle:void 0}),t.excludeCaption&&{caption:void 0})})}):e}wrapStreamWithStorytellingStripping(t,r){return e.__asyncGenerator(this,arguments,function*(){var i,n,s,o;try{for(var c,l=!0,m=e.__asyncValues(t);!(i=(c=yield e.__await(m.next())).done);l=!0){o=c.value,l=!1;const t=o;if(a(t)){const i=this.stripStorytelling(t.data,r);yield yield e.__await(Object.assign(Object.assign({},t),{data:i}))}else yield yield e.__await(t)}}catch(e){n={error:e}}finally{try{l||i||!(s=m.return)||(yield e.__await(s.call(m)))}finally{if(n)throw n.error}}})}},exports.GraphyApiError=r,exports.InvocationBudgetSchema=g,exports.InvocationEffortSchema=l,exports.MAX_EXTRACT_ATTACHMENTS=10,exports.MAX_EXTRACT_ATTACHMENTS_COMBINED_DECODED_BYTES=k,exports.MAX_EXTRACT_DOCUMENTS=2,exports.MAX_EXTRACT_DOCUMENTS_TOTAL_DECODED_BYTES=M,exports.MAX_EXTRACT_DOCUMENT_DECODED_BYTES=R,exports.MAX_EXTRACT_IMAGES=8,exports.MAX_EXTRACT_IMAGES_TOTAL_DECODED_BYTES=O,exports.MAX_EXTRACT_IMAGE_DECODED_BYTES=A,exports.MAX_SOURCE_TEXT_LENGTH=C,exports.MAX_USER_PROMPT_LENGTH=1e4,exports.MetadataSchema=u,exports.StorytellingEffortSchema=m,exports.SuggestionSchema=y,exports.buildImageAttachment=function(e){return{kind:"image",mimeType:e.mimeType.trim(),dataBase64:N(e.dataBase64)}},exports.buildPdfAttachment=function(e){return{kind:"document",mimeType:"application/pdf",dataBase64:N(e.dataBase64)}},exports.isCompleteEvent=a,exports.isErrorEvent=n,exports.isGraphyApiError=e=>e instanceof r,exports.isPreviewEvent=e=>"preview"===e.type,exports.isProgressEvent=i,exports.isReasoningEvent=e=>"reasoning"===e.type;
|
|
1
|
+
"use strict";var e=require("tslib"),t=require("zod");class r extends Error{constructor(e,t){var r;super(e),Object.setPrototypeOf(this,new.target.prototype),this.name="GraphyApiError",this.status=null==t?void 0:t.status,this.code=null==t?void 0:t.code,this.retryable=null!==(r=null==t?void 0:t.retryable)&&void 0!==r&&r}}const s=e=>"progress"===e.type,i=e=>"complete"===e.type,a=e=>"error"===e.type;class n{constructor(e){if(this.tag="[GRAPHY]",!e.apiKey||0===e.apiKey.trim().length)throw new Error("apiKey is required and must not be empty");const t=new URL(e.baseUrl);if(!["http:","https:"].includes(t.protocol))throw new Error(`Invalid baseUrl protocol: ${t.protocol}. Only http(s) is allowed.`);this.apiKey=e.apiKey,this.baseUrl=t.origin+t.pathname.replace(/\/$/,""),this.timeout=e.timeout||6e4,this.retryConfig=e.retryConfig||{attempts:3,delay:1e3,backoff:2},this.logger=e.logger||{log:console.log,warn:console.warn,error:console.error,debug:console.debug}}static isProgressEvent(e){return s(e)}static isCompleteEvent(e){return i(e)}static isErrorEvent(e){return a(e)}stream(t,r,s){return e.__awaiter(this,void 0,void 0,function*(){const e=yield this.makeRequest(t,r,s);return this.parseSSE(e)})}fetch(t,n,o,c){return e.__awaiter(this,void 0,void 0,function*(){var m,l,d,p,g;const h=Date.now();this.logger.debug(`${this.tag} Fetch: ${t}`);try{const b=yield this.makeRequest(t,n,c),x=b.headers.get("content-type");if(null==x?void 0:x.includes("text/event-stream")){try{for(var u,f=!0,y=e.__asyncValues(this.parseSSE(b));!(m=(u=yield y.next()).done);f=!0){p=u.value,f=!1;const e=p;if(s(e)&&o&&o(e),i(e))return e.data;if(a(e)){const s=Date.now()-h;throw this.logger.error(`${this.tag} Server error: ${t} ${s}ms`,e.error),new r(e.error,{code:e.code,retryable:null!==(g=e.retryable)&&void 0!==g&&g})}}}catch(e){l={error:e}}finally{try{f||m||!(d=y.return)||(yield d.call(y))}finally{if(l)throw l.error}}const n=Date.now()-h;throw this.logger.error(`${this.tag} Stream incomplete: ${t} ${n}ms`),new r("Stream ended without completion")}return yield b.json()}catch(e){const s=Date.now()-h;if(this.logger.error(`${this.tag} Fetch failed: ${t} ${s}ms`,e),e instanceof r)throw e;throw e}finally{const e=Date.now()-h;this.logger.debug(`${this.tag} Fetch completed: ${t} ${e}ms`)}})}ping(){return e.__awaiter(this,void 0,void 0,function*(){const e=Date.now();try{return yield this.makeRequest("/health",void 0,void 0,this.retryConfig.attempts,"GET"),{ok:!0,latency:Date.now()-e}}catch(t){return{ok:!1,latency:Date.now()-e}}})}sleep(t){return e.__awaiter(this,void 0,void 0,function*(){return new Promise(e=>setTimeout(e,t))})}parseSSE(t){return e.__asyncGenerator(this,arguments,function*(){if(!t.body)throw new r("Response body is null");const s=t.body.getReader(),i=new TextDecoder;let a="",n="",o="";try{for(;;){const{done:t,value:r}=yield e.__await(s.read());if(t)break;a+=i.decode(r,{stream:!0});const c=a.split(/\r?\n/);a=c.pop()||"";for(const t of c)if(t.startsWith("event: "))n=t.slice(7).trim();else if(t.startsWith("data: "))o+=(o?"\n":"")+t.slice(6);else if(""===t.trim()&&o){try{const t=JSON.parse(o);let r;if("progress"===n){const e=t;r=Object.assign({type:"progress"},e)}else if("complete"===n)r={type:"complete",data:t};else if("error"===n){const e=t;r=Object.assign({type:"error"},e)}else if("preview"===n){const e=t;r=Object.assign(Object.assign({},e),{type:"preview"})}else{if("reasoning"!==n){n="",o="";continue}{const e=t;r=Object.assign(Object.assign({},e),{type:"reasoning"})}}if(yield yield e.__await(r),"complete"===n||"error"===n)return yield e.__await(void 0)}catch(e){this.logger.warn("Invalid SSE data format",o)}n="",o=""}}}finally{s.releaseLock()}})}makeRequest(t,s,i){return e.__awaiter(this,arguments,void 0,function*(e,t,s,i=1,a="POST"){if(!e.startsWith("/"))throw new r("Invalid endpoint: must start with /");const n=new URL(e,this.baseUrl);if(n.origin!==new URL(this.baseUrl).origin)throw new r("Endpoint resolved to unexpected origin");this.logger.debug(`${this.tag} Request ${i}/${this.retryConfig.attempts}: ${n}`);const o=new AbortController,c=setTimeout(()=>o.abort(),this.timeout),m=()=>o.abort();s&&s.addEventListener("abort",m);try{const c=yield fetch(n,Object.assign({method:a,headers:{"Content-Type":"application/json",Accept:"application/json, text/event-stream","Cache-Control":"no-cache",Authorization:`Bearer ${this.apiKey}`,"User-Agent":"Graphy-SDK/1.0"},signal:o.signal},"POST"===a&&{body:JSON.stringify(t)}));if(!c.ok){const n=c.status>=500||429===c.status;let o,m=`HTTP ${c.status}`;try{const e=yield c.json();if("object"==typeof e&&null!==e){const t=e;"string"==typeof t.message?m=t.message:"string"==typeof t.error&&(m=t.error),"string"==typeof t.code&&(o=t.code)}}catch(e){}const l=new r(m,{status:c.status,code:o,retryable:n});if(n&&i<this.retryConfig.attempts&&!(null==s?void 0:s.aborted)){const r=this.retryConfig.delay*Math.pow(this.retryConfig.backoff,i-1);return this.logger.warn(`${this.tag} Retrying ${e} in ${r}ms (attempt ${i+1})`),yield this.sleep(r),this.makeRequest(e,t,s,i+1,a)}throw this.logger.error(`${this.tag} Request failed: ${e} (${c.status}) - ${m}`),l}return this.logger.debug(`${this.tag} Connected: ${e}`),c}catch(n){if(n instanceof r)throw n;if(n instanceof Error&&"AbortError"===n.name)throw this.logger.debug(`${this.tag} Aborted: ${e}`),n;if(i<this.retryConfig.attempts&&!(null==s?void 0:s.aborted)){const r=this.retryConfig.delay*Math.pow(this.retryConfig.backoff,i-1);return this.logger.warn(`${this.tag} Network error, retrying ${e} in ${r}ms`),yield this.sleep(r),this.makeRequest(e,t,s,i+1,a)}throw this.logger.error(`${this.tag} Network error: ${e}`,n),new r("Network error",{retryable:!0})}finally{clearTimeout(c),s&&s.removeEventListener("abort",m)}})}}const o=t.z.enum(["EN_GB","EN_US"]),c=t.z.custom(e=>null!=e&&"object"==typeof e),m=t.z.enum(["low","medium","high"]),l=t.z.enum(["none","low","medium","high"]),d=t.z.enum(["agentic","fast"]),p=t.z.object({maxWallClockMs:t.z.number().positive().optional(),maxTotalTokens:t.z.number().int().positive().optional(),maxCostUsd:t.z.number().positive().optional()}),g=t.z.object({callId:t.z.string().max(256),locale:o.optional(),effort:m.optional(),storytellingEffort:l.optional().default("low"),budget:p.optional(),executionMode:d.optional()}),h=t.z.object({config:c,userPrompt:t.z.string().max(1e4).optional().default(""),metadata:g.optional()}),u=h.extend({maxSuggestionCount:t.z.number().int().min(1).max(4).optional()}),f=t.z.enum(["line","bar","groupedBar","stackedBar","100StackedBar","column","groupedColumn","stackedColumn","100StackedColumn","combo","pie","donut","funnel","heatmap","scatter","bubble","waterfall","table"]),y=t.z.object({dataPrepPrompt:t.z.string(),chartType:f,summary:t.z.string()}),b=t.z.object({response:t.z.object({message:t.z.string()}),config:c}),x=t.z.object({suggestions:t.z.array(y)}),v=t.z.enum(["comparison","relationship","distribution","composition"]),_=t.z.object({finding:t.z.string().describe("Plain-English summary of the finding (no stats jargon)."),confidence:t.z.number().min(0).max(1).describe("Statistical strength of the finding (0..1). Independent of topicality."),relevance:t.z.number().min(0).max(1).describe("Topical fit with the user prompt and chart narrative (0..1). Independent of statistical strength."),topic:t.z.string().min(1).describe("Kebab-case label grouping this finding with related ones; consumers can render findings as threads."),chartHint:t.z.string().min(1).max(240).describe('Natural-language data-prep recipe for a downstream mutate agent: filter → group → aggregate → sort, naming real dataset columns. No chart type or "render as" clause — that is set via chartFamily.'),chartFamily:v.describe("Abela family (comparison | relationship | distribution | composition). Downstream chart-generator picks the concrete chart type from this family + the data shape."),evidenceSummary:t.z.string().max(300).describe("Rigorous statistical back-up with exact numbers.")}),w=t.z.object({topic:t.z.string().min(1).describe("Kebab-case story headline shared by all child findings."),score:t.z.number().min(0).max(1).describe("Max quadrant score (relevance × confidence) across child findings."),count:t.z.number().int().min(1).describe("Number of findings in this story."),findings:t.z.array(_).describe("Child findings, sorted by quadrant score desc.")}),E=t.z.object({response:t.z.object({message:t.z.string(),steps:t.z.array(t.z.string())}),stories:t.z.array(w)}),z=t.z.object({response:t.z.object({message:t.z.string(),steps:t.z.array(t.z.string())}),config:c}),S=t.z.object({response:t.z.object({message:t.z.string(),steps:t.z.array(t.z.string())}),config:c}),T=t.z.enum(["high","medium","low"]),A=t.z.object({confidence:T,needsUserInput:t.z.boolean(),warnings:t.z.array(t.z.string()),cellConfidence:t.z.array(t.z.object({rowIndex:t.z.number().int().nonnegative(),columnKey:t.z.string(),confidence:T,quote:t.z.string().optional()})).optional()}),C=t.z.object({score:t.z.number().min(0).max(1),issues:t.z.array(t.z.string()),sufficient:t.z.boolean(),summary:t.z.string()}),j=5e5,$=2097152,R=7340032,O=6291456,D=8388608,k=O,M=D,I=12582912;function P(e){return 4*Math.ceil(e/3)}const G=P($),B=P(R),X=P(O),N=P(D),U=P(k),q=P(M),F=P(I);function K(e){return e.replace(/\s+/g,"")}function L(e){const t=K(e);return 0!==t.length&&t.length%4==0&&/^[A-Za-z0-9+/]+={0,2}$/.test(t)}const H=/^image\/(png|jpeg|jpg|webp|gif)$/i,Y=t.z.object({mimeType:t.z.string().min(1).refine(e=>H.test(e.trim()),{message:"mimeType must be image/png, image/jpeg, image/jpg, image/webp, or image/gif"}),dataBase64:t.z.string().min(1).max(G).refine(L,{message:"dataBase64 must be standard base64 (RFC 4648)"})}),W=t.z.enum(["image","document","spreadsheet"]),J=Y.extend({kind:t.z.literal("image")}),V=t.z.object({kind:t.z.literal("document"),mimeType:t.z.string().min(1).refine(e=>/^application\/pdf$/i.test(e.trim()),{message:"document mimeType must be application/pdf"}),dataBase64:t.z.string().min(1).max(X).refine(L,{message:"dataBase64 must be standard base64 (RFC 4648)"})}),Z=t.z.object({kind:t.z.literal("spreadsheet"),mimeType:t.z.string().min(1).refine(e=>/^application\/vnd\.openxmlformats-officedocument\.spreadsheetml\.sheet$/i.test(e.trim()),{message:"spreadsheet mimeType must be application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}),dataBase64:t.z.string().min(1).max(U).refine(L,{message:"dataBase64 must be standard base64 (RFC 4648)"}),filename:t.z.string().max(512).optional()}).refine(e=>void 0===e.filename||e.filename.trim().length>0,{message:"spreadsheet filename must not be empty or whitespace-only",path:["filename"]}),Q=t.z.discriminatedUnion("kind",[J,V,Z]),ee=t.z.object({sourceText:t.z.string().max(j).default(""),images:t.z.array(Y).max(8).optional().describe('@deprecated Use attachments[] with kind: "image" instead. Will be removed in a future major release.'),attachments:t.z.array(Q).max(12).optional(),metadata:g.optional()}).superRefine((e,t)=>{var r,s;const i=e.sourceText.trim(),a=null!==(r=e.images)&&void 0!==r?r:[],n=null!==(s=e.attachments)&&void 0!==s?s:[];if(a.length>0&&n.length>0)return void t.addIssue({code:"custom",message:'Use either `images` (deprecated) or `attachments`, not both. Migrate to `attachments` with `kind: "image"`.',path:["attachments"]});if(0===i.length&&0===a.length&&0===n.length)return void t.addIssue({code:"custom",message:"Provide non-empty sourceText and/or at least one attachment",path:["sourceText"]});if(a.length>0){a.reduce((e,t)=>e+K(t.dataBase64).length,0)>B&&t.addIssue({code:"custom",message:"Combined image base64 exceeds maximum length for this API (must fit server decode limits)",path:["images"]})}let o=0,c=0,m=0,l=0,d=0,p=0,g=0;for(const e of n){const t=K(e.dataBase64).length;switch(g+=t,e.kind){case"image":o+=1,l+=t;break;case"document":c+=1,d+=t;break;case"spreadsheet":m+=1,p+=t}}o>8&&t.addIssue({code:"custom",message:"Too many images (max 8)",path:["attachments"]}),c>2&&t.addIssue({code:"custom",message:"Too many documents (max 2)",path:["attachments"]}),m>2&&t.addIssue({code:"custom",message:"Too many spreadsheets (max 2)",path:["attachments"]});const h=o<=8&&c<=2&&m<=2;n.length>0&&h&&(l>B&&t.addIssue({code:"custom",message:"Combined image base64 exceeds maximum length for this API (must fit server decode limits)",path:["attachments"]}),d>N&&t.addIssue({code:"custom",message:"Combined document base64 exceeds maximum length for this API (must fit server decode limits)",path:["attachments"]}),p>q&&t.addIssue({code:"custom",message:"Combined spreadsheet base64 exceeds maximum length for this API (must fit server decode limits)",path:["attachments"]}),g>F&&t.addIssue({code:"custom",message:"Combined attachment base64 exceeds maximum length for this API (must fit server decode limits)",path:["attachments"]}))});const te=t.z.object({response:t.z.object({message:t.z.string()}),config:c,extractMeta:A.nullable(),lastAccuracyEvaluation:C.optional()}),re=t.z.object({config:c,response:t.z.object({message:t.z.string(),steps:t.z.array(t.z.string())})}),se=x,ie="/api/v0";exports.AiChartTypeEnum=f,exports.ChartFamilySchema=v,exports.ExecutionModeSchema=d,exports.ExploreFindingSchema=_,exports.ExploreStorySchema=w,exports.ExtractAccuracyEvaluationSchema=C,exports.ExtractAttachmentInputSchema=Q,exports.ExtractAttachmentKindSchema=W,exports.ExtractConfidenceSchema=T,exports.ExtractFromProseParamsSchema=ee,exports.ExtractFromProseResponseSchema=te,exports.ExtractMetaSchema=A,exports.GenerateAnnotationsResponseSchema=z,exports.GenerateExplorationResponseSchema=E,exports.GenerateGraphResponseSchema=re,exports.GenerateGraphSuggestionsResponseSchema=se,exports.GenerateMutationResponseSchema=S,exports.GenerateNarrativeResponseSchema=b,exports.GenerateSuggestionsParamsSchema=u,exports.GenerateSuggestionsResponseSchema=x,exports.GraphGenerationRequestSchema=h,exports.GraphyAiSdk=class{constructor(e){this.client=new n(e)}generateGraph(t,r,s){return e.__awaiter(this,void 0,void 0,function*(){const{storytellingOptions:i}=t,a=e.__rest(t,["storytellingOptions"]),n=yield this.client.fetch(`${ie}/generate`,a,r,s),o=re.parse(n);return this.stripStorytelling(o,i)})}generateGraphStream(t,r){return e.__awaiter(this,void 0,void 0,function*(){const{storytellingOptions:s}=t,i=e.__rest(t,["storytellingOptions"]),a=yield this.client.stream(`${ie}/generate`,i,r);return this.wrapStreamWithStorytellingStripping(a,s)})}generateNarrative(t,r,s){return e.__awaiter(this,void 0,void 0,function*(){const e=yield this.client.fetch(`${ie}/narrate`,t,r,s);return b.parse(e)})}generateNarrativeStream(t,r){return e.__awaiter(this,void 0,void 0,function*(){return this.client.stream(`${ie}/narrate`,t,r)})}generateSuggestions(t,r,s){return e.__awaiter(this,void 0,void 0,function*(){const e=yield this.client.fetch(`${ie}/suggestions`,t,r,s);return x.parse(e)})}generateSuggestionsStream(t,r){return e.__awaiter(this,void 0,void 0,function*(){return this.client.stream(`${ie}/suggestions`,t,r)})}generateExploration(t,r,s){return e.__awaiter(this,void 0,void 0,function*(){const e=yield this.client.fetch(`${ie}/explore`,t,r,s);return E.parse(e)})}generateExplorationStream(t,r){return e.__awaiter(this,void 0,void 0,function*(){return this.client.stream(`${ie}/explore`,t,r)})}generateAnnotations(t,r,s){return e.__awaiter(this,void 0,void 0,function*(){const e=yield this.client.fetch(`${ie}/annotate`,t,r,s);return z.parse(e)})}generateAnnotationsStream(t,r){return e.__awaiter(this,void 0,void 0,function*(){return this.client.stream(`${ie}/annotate`,t,r)})}generateMutation(t,r,s){return e.__awaiter(this,void 0,void 0,function*(){const e=yield this.client.fetch(`${ie}/mutate`,t,r,s);return S.parse(e)})}generateMutationStream(t,r){return e.__awaiter(this,void 0,void 0,function*(){return this.client.stream(`${ie}/mutate`,t,r)})}extractFromProse(t,r,s){return e.__awaiter(this,void 0,void 0,function*(){const e=yield this.client.fetch(`${ie}/extract`,t,r,s);return te.parse(e)})}extractFromProseStream(t,r){return e.__awaiter(this,void 0,void 0,function*(){return this.client.stream(`${ie}/extract`,t,r)})}stripStorytelling(e,t){return t&&e.config.content?Object.assign(Object.assign({},e),{config:Object.assign(Object.assign({},e.config),{content:Object.assign(Object.assign(Object.assign(Object.assign({},e.config.content),t.excludeTitle&&{title:void 0}),t.excludeSubtitle&&{subtitle:void 0}),t.excludeCaption&&{caption:void 0})})}):e}wrapStreamWithStorytellingStripping(t,r){return e.__asyncGenerator(this,arguments,function*(){var s,a,n,o;try{for(var c,m=!0,l=e.__asyncValues(t);!(s=(c=yield e.__await(l.next())).done);m=!0){o=c.value,m=!1;const t=o;if(i(t)){const s=this.stripStorytelling(t.data,r);yield yield e.__await(Object.assign(Object.assign({},t),{data:s}))}else yield yield e.__await(t)}}catch(e){a={error:e}}finally{try{m||s||!(n=l.return)||(yield e.__await(n.call(l)))}finally{if(a)throw a.error}}})}},exports.GraphyApiError=r,exports.InvocationBudgetSchema=p,exports.InvocationEffortSchema=m,exports.MAX_EXTRACT_ATTACHMENTS=12,exports.MAX_EXTRACT_ATTACHMENTS_COMBINED_DECODED_BYTES=I,exports.MAX_EXTRACT_DOCUMENTS=2,exports.MAX_EXTRACT_DOCUMENTS_TOTAL_DECODED_BYTES=D,exports.MAX_EXTRACT_DOCUMENT_DECODED_BYTES=O,exports.MAX_EXTRACT_IMAGES=8,exports.MAX_EXTRACT_IMAGES_TOTAL_DECODED_BYTES=R,exports.MAX_EXTRACT_IMAGE_DECODED_BYTES=$,exports.MAX_EXTRACT_SPREADSHEETS=2,exports.MAX_EXTRACT_SPREADSHEETS_TOTAL_DECODED_BYTES=M,exports.MAX_EXTRACT_SPREADSHEET_DECODED_BYTES=k,exports.MAX_SOURCE_TEXT_LENGTH=j,exports.MAX_USER_PROMPT_LENGTH=1e4,exports.MetadataSchema=g,exports.StorytellingEffortSchema=l,exports.SuggestionSchema=y,exports.buildImageAttachment=function(e){return{kind:"image",mimeType:e.mimeType.trim(),dataBase64:K(e.dataBase64)}},exports.buildPdfAttachment=function(e){return{kind:"document",mimeType:"application/pdf",dataBase64:K(e.dataBase64)}},exports.buildSpreadsheetAttachment=function(e){return Object.assign({kind:"spreadsheet",mimeType:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",dataBase64:K(e.dataBase64)},void 0!==e.filename?{filename:e.filename.trim()}:{})},exports.isCompleteEvent=i,exports.isErrorEvent=a,exports.isGraphyApiError=e=>e instanceof r,exports.isPreviewEvent=e=>"preview"===e.type,exports.isProgressEvent=s,exports.isReasoningEvent=e=>"reasoning"===e.type;
|
package/dist/index.d.ts
CHANGED
|
@@ -634,18 +634,23 @@ declare const MAX_EXTRACT_IMAGES_TOTAL_DECODED_BYTES: number;
|
|
|
634
634
|
declare const MAX_EXTRACT_DOCUMENTS = 2;
|
|
635
635
|
declare const MAX_EXTRACT_DOCUMENT_DECODED_BYTES: number;
|
|
636
636
|
declare const MAX_EXTRACT_DOCUMENTS_TOTAL_DECODED_BYTES: number;
|
|
637
|
-
/**
|
|
637
|
+
/** Mirrors apps/agents-api `.xlsx` spreadsheet attachment limits. */
|
|
638
|
+
declare const MAX_EXTRACT_SPREADSHEETS = 2;
|
|
639
|
+
declare const MAX_EXTRACT_SPREADSHEET_DECODED_BYTES: number;
|
|
640
|
+
declare const MAX_EXTRACT_SPREADSHEETS_TOTAL_DECODED_BYTES: number;
|
|
641
|
+
/** Combined cap across images, PDFs, and spreadsheets in one request. Mirrors agents-api. */
|
|
638
642
|
declare const MAX_EXTRACT_ATTACHMENTS_COMBINED_DECODED_BYTES: number;
|
|
639
|
-
/**
|
|
643
|
+
/** Max entries in `attachments[]` (images + PDFs + spreadsheets). Mirrors agents-api. */
|
|
640
644
|
declare const MAX_EXTRACT_ATTACHMENTS: number;
|
|
641
645
|
declare const extractImagePartSchema: z.ZodObject<{
|
|
642
646
|
mimeType: z.ZodString;
|
|
643
647
|
dataBase64: z.ZodString;
|
|
644
648
|
}, z.core.$strip>;
|
|
645
|
-
/** Discriminator for entries in `attachments[]`. */
|
|
649
|
+
/** Discriminator for entries in `attachments[]`. Mirrors agents-api `extractAttachmentKindSchema`. */
|
|
646
650
|
declare const ExtractAttachmentKindSchema: z.ZodEnum<{
|
|
647
651
|
image: "image";
|
|
648
652
|
document: "document";
|
|
653
|
+
spreadsheet: "spreadsheet";
|
|
649
654
|
}>;
|
|
650
655
|
type ExtractAttachmentKind = z.infer<typeof ExtractAttachmentKindSchema>;
|
|
651
656
|
declare const ExtractAttachmentInputSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
@@ -656,6 +661,11 @@ declare const ExtractAttachmentInputSchema: z.ZodDiscriminatedUnion<[z.ZodObject
|
|
|
656
661
|
kind: z.ZodLiteral<"document">;
|
|
657
662
|
mimeType: z.ZodString;
|
|
658
663
|
dataBase64: z.ZodString;
|
|
664
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
665
|
+
kind: z.ZodLiteral<"spreadsheet">;
|
|
666
|
+
mimeType: z.ZodString;
|
|
667
|
+
dataBase64: z.ZodString;
|
|
668
|
+
filename: z.ZodOptional<z.ZodString>;
|
|
659
669
|
}, z.core.$strip>], "kind">;
|
|
660
670
|
type ExtractAttachmentInput = z.infer<typeof ExtractAttachmentInputSchema>;
|
|
661
671
|
/**
|
|
@@ -678,6 +688,11 @@ declare const ExtractFromProseParamsSchema: z.ZodObject<{
|
|
|
678
688
|
kind: z.ZodLiteral<"document">;
|
|
679
689
|
mimeType: z.ZodString;
|
|
680
690
|
dataBase64: z.ZodString;
|
|
691
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
692
|
+
kind: z.ZodLiteral<"spreadsheet">;
|
|
693
|
+
mimeType: z.ZodString;
|
|
694
|
+
dataBase64: z.ZodString;
|
|
695
|
+
filename: z.ZodOptional<z.ZodString>;
|
|
681
696
|
}, z.core.$strip>], "kind">>>;
|
|
682
697
|
metadata: z.ZodOptional<z.ZodObject<{
|
|
683
698
|
callId: z.ZodString;
|
|
@@ -727,6 +742,16 @@ declare function buildPdfAttachment(input: {
|
|
|
727
742
|
}): Extract<ExtractAttachmentInput, {
|
|
728
743
|
kind: 'document';
|
|
729
744
|
}>;
|
|
745
|
+
/**
|
|
746
|
+
* Builds an `attachments[]` entry for an `.xlsx` workbook (OOXML / ZIP on the wire).
|
|
747
|
+
* Forces the spreadsheet MIME type; the server re-validates ZIP magic bytes and decoded size.
|
|
748
|
+
*/
|
|
749
|
+
declare function buildSpreadsheetAttachment(input: {
|
|
750
|
+
dataBase64: string;
|
|
751
|
+
filename?: string;
|
|
752
|
+
}): Extract<ExtractAttachmentInput, {
|
|
753
|
+
kind: 'spreadsheet';
|
|
754
|
+
}>;
|
|
730
755
|
declare const ExtractFromProseResponseSchema: z.ZodObject<{
|
|
731
756
|
response: z.ZodObject<{
|
|
732
757
|
message: z.ZodString;
|
|
@@ -1124,5 +1149,5 @@ declare class GraphyAiSdk {
|
|
|
1124
1149
|
private wrapStreamWithStorytellingStripping;
|
|
1125
1150
|
}
|
|
1126
1151
|
|
|
1127
|
-
export { AiChartTypeEnum, ChartFamilySchema, ExecutionModeSchema, ExploreFindingSchema, ExploreStorySchema, ExtractAccuracyEvaluationSchema, ExtractAttachmentInputSchema, ExtractAttachmentKindSchema, ExtractConfidenceSchema, ExtractFromProseParamsSchema, ExtractFromProseResponseSchema, ExtractMetaSchema, GenerateAnnotationsResponseSchema, GenerateExplorationResponseSchema, GenerateGraphResponseSchema, GenerateGraphSuggestionsResponseSchema, GenerateMutationResponseSchema, GenerateNarrativeResponseSchema, GenerateSuggestionsParamsSchema, GenerateSuggestionsResponseSchema, GraphGenerationRequestSchema, GraphyAiSdk, GraphyApiError, InvocationBudgetSchema, InvocationEffortSchema, MAX_EXTRACT_ATTACHMENTS, MAX_EXTRACT_ATTACHMENTS_COMBINED_DECODED_BYTES, MAX_EXTRACT_DOCUMENTS, MAX_EXTRACT_DOCUMENTS_TOTAL_DECODED_BYTES, MAX_EXTRACT_DOCUMENT_DECODED_BYTES, MAX_EXTRACT_IMAGES, MAX_EXTRACT_IMAGES_TOTAL_DECODED_BYTES, MAX_EXTRACT_IMAGE_DECODED_BYTES, MAX_SOURCE_TEXT_LENGTH, MAX_USER_PROMPT_LENGTH, MetadataSchema, StorytellingEffortSchema, SuggestionSchema, buildImageAttachment, buildPdfAttachment, isCompleteEvent, isErrorEvent, isGraphyApiError, isPreviewEvent, isProgressEvent, isReasoningEvent };
|
|
1152
|
+
export { AiChartTypeEnum, ChartFamilySchema, ExecutionModeSchema, ExploreFindingSchema, ExploreStorySchema, ExtractAccuracyEvaluationSchema, ExtractAttachmentInputSchema, ExtractAttachmentKindSchema, ExtractConfidenceSchema, ExtractFromProseParamsSchema, ExtractFromProseResponseSchema, ExtractMetaSchema, GenerateAnnotationsResponseSchema, GenerateExplorationResponseSchema, GenerateGraphResponseSchema, GenerateGraphSuggestionsResponseSchema, GenerateMutationResponseSchema, GenerateNarrativeResponseSchema, GenerateSuggestionsParamsSchema, GenerateSuggestionsResponseSchema, GraphGenerationRequestSchema, GraphyAiSdk, GraphyApiError, InvocationBudgetSchema, InvocationEffortSchema, MAX_EXTRACT_ATTACHMENTS, MAX_EXTRACT_ATTACHMENTS_COMBINED_DECODED_BYTES, MAX_EXTRACT_DOCUMENTS, MAX_EXTRACT_DOCUMENTS_TOTAL_DECODED_BYTES, MAX_EXTRACT_DOCUMENT_DECODED_BYTES, MAX_EXTRACT_IMAGES, MAX_EXTRACT_IMAGES_TOTAL_DECODED_BYTES, MAX_EXTRACT_IMAGE_DECODED_BYTES, MAX_EXTRACT_SPREADSHEETS, MAX_EXTRACT_SPREADSHEETS_TOTAL_DECODED_BYTES, MAX_EXTRACT_SPREADSHEET_DECODED_BYTES, MAX_SOURCE_TEXT_LENGTH, MAX_USER_PROMPT_LENGTH, MetadataSchema, StorytellingEffortSchema, SuggestionSchema, buildImageAttachment, buildPdfAttachment, buildSpreadsheetAttachment, isCompleteEvent, isErrorEvent, isGraphyApiError, isPreviewEvent, isProgressEvent, isReasoningEvent };
|
|
1128
1153
|
export type { AiChartType, ChartFamily, ClientConfig, CompleteEvent, ErrorEvent, ExecutionMode, ExploreFinding, ExploreStory, ExtractAccuracyEvaluation, ExtractAttachmentInput, ExtractAttachmentKind, ExtractConfidence, ExtractFromProseParams, ExtractFromProseResponse, ExtractImageInput, ExtractMeta, GenerateAnnotationsParams, GenerateAnnotationsResponse, GenerateExplorationParams, GenerateExplorationResponse, GenerateGraphParams, GenerateGraphResponse, GenerateGraphSuggestionsParams, GenerateGraphSuggestionsResponse, GenerateMutationParams, GenerateMutationResponse, GenerateNarrativeParams, GenerateNarrativeResponse, GenerateSuggestionsParams, GenerateSuggestionsResponse, GraphGenerationRequest, GraphyApiErrorOptions, InvocationBudget, InvocationEffort, Logger, Metadata, PreviewEvent, ProgressEvent, ProgressHandler, ReasoningEvent, RetryConfig, SSEEvent, StorytellingEffort, StorytellingOptions, Suggestion };
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{__awaiter as e,__asyncValues as t,__asyncGenerator as i,__await as r,__rest as n}from"tslib";import{z as s}from"zod";class o extends Error{constructor(e,t){var i;super(e),Object.setPrototypeOf(this,new.target.prototype),this.name="GraphyApiError",this.status=null==t?void 0:t.status,this.code=null==t?void 0:t.code,this.retryable=null!==(i=null==t?void 0:t.retryable)&&void 0!==i&&i}}const a=e=>e instanceof o,c=e=>"progress"===e.type,l=e=>"complete"===e.type,d=e=>"error"===e.type,m=e=>"preview"===e.type,g=e=>"reasoning"===e.type;class u{constructor(e){if(this.tag="[GRAPHY]",!e.apiKey||0===e.apiKey.trim().length)throw new Error("apiKey is required and must not be empty");const t=new URL(e.baseUrl);if(!["http:","https:"].includes(t.protocol))throw new Error(`Invalid baseUrl protocol: ${t.protocol}. Only http(s) is allowed.`);this.apiKey=e.apiKey,this.baseUrl=t.origin+t.pathname.replace(/\/$/,""),this.timeout=e.timeout||6e4,this.retryConfig=e.retryConfig||{attempts:3,delay:1e3,backoff:2},this.logger=e.logger||{log:console.log,warn:console.warn,error:console.error,debug:console.debug}}static isProgressEvent(e){return c(e)}static isCompleteEvent(e){return l(e)}static isErrorEvent(e){return d(e)}stream(t,i,r){return e(this,void 0,void 0,function*(){const e=yield this.makeRequest(t,i,r);return this.parseSSE(e)})}fetch(i,r,n,s){return e(this,void 0,void 0,function*(){var e,a,m,g,u;const h=Date.now();this.logger.debug(`${this.tag} Fetch: ${i}`);try{const b=yield this.makeRequest(i,r,s),v=b.headers.get("content-type");if(null==v?void 0:v.includes("text/event-stream")){try{for(var p,f=!0,y=t(this.parseSSE(b));!(e=(p=yield y.next()).done);f=!0){g=p.value,f=!1;const e=g;if(c(e)&&n&&n(e),l(e))return e.data;if(d(e)){const t=Date.now()-h;throw this.logger.error(`${this.tag} Server error: ${i} ${t}ms`,e.error),new o(e.error,{code:e.code,retryable:null!==(u=e.retryable)&&void 0!==u&&u})}}}catch(e){a={error:e}}finally{try{f||e||!(m=y.return)||(yield m.call(y))}finally{if(a)throw a.error}}const r=Date.now()-h;throw this.logger.error(`${this.tag} Stream incomplete: ${i} ${r}ms`),new o("Stream ended without completion")}return yield b.json()}catch(e){const t=Date.now()-h;if(this.logger.error(`${this.tag} Fetch failed: ${i} ${t}ms`,e),e instanceof o)throw e;throw e}finally{const e=Date.now()-h;this.logger.debug(`${this.tag} Fetch completed: ${i} ${e}ms`)}})}ping(){return e(this,void 0,void 0,function*(){const e=Date.now();try{return yield this.makeRequest("/health",void 0,void 0,this.retryConfig.attempts,"GET"),{ok:!0,latency:Date.now()-e}}catch(t){return{ok:!1,latency:Date.now()-e}}})}sleep(t){return e(this,void 0,void 0,function*(){return new Promise(e=>setTimeout(e,t))})}parseSSE(e){return i(this,arguments,function*(){if(!e.body)throw new o("Response body is null");const t=e.body.getReader(),i=new TextDecoder;let n="",s="",a="";try{for(;;){const{done:e,value:o}=yield r(t.read());if(e)break;n+=i.decode(o,{stream:!0});const c=n.split(/\r?\n/);n=c.pop()||"";for(const e of c)if(e.startsWith("event: "))s=e.slice(7).trim();else if(e.startsWith("data: "))a+=(a?"\n":"")+e.slice(6);else if(""===e.trim()&&a){try{const e=JSON.parse(a);let t;if("progress"===s){const i=e;t=Object.assign({type:"progress"},i)}else if("complete"===s)t={type:"complete",data:e};else if("error"===s){const i=e;t=Object.assign({type:"error"},i)}else if("preview"===s){const i=e;t=Object.assign(Object.assign({},i),{type:"preview"})}else{if("reasoning"!==s){s="",a="";continue}{const i=e;t=Object.assign(Object.assign({},i),{type:"reasoning"})}}if(yield yield r(t),"complete"===s||"error"===s)return yield r(void 0)}catch(e){this.logger.warn("Invalid SSE data format",a)}s="",a=""}}}finally{t.releaseLock()}})}makeRequest(t,i,r){return e(this,arguments,void 0,function*(e,t,i,r=1,n="POST"){if(!e.startsWith("/"))throw new o("Invalid endpoint: must start with /");const s=new URL(e,this.baseUrl);if(s.origin!==new URL(this.baseUrl).origin)throw new o("Endpoint resolved to unexpected origin");this.logger.debug(`${this.tag} Request ${r}/${this.retryConfig.attempts}: ${s}`);const a=new AbortController,c=setTimeout(()=>a.abort(),this.timeout),l=()=>a.abort();i&&i.addEventListener("abort",l);try{const c=yield fetch(s,Object.assign({method:n,headers:{"Content-Type":"application/json",Accept:"application/json, text/event-stream","Cache-Control":"no-cache",Authorization:`Bearer ${this.apiKey}`,"User-Agent":"Graphy-SDK/1.0"},signal:a.signal},"POST"===n&&{body:JSON.stringify(t)}));if(!c.ok){const s=c.status>=500||429===c.status;let a,l=`HTTP ${c.status}`;try{const e=yield c.json();if("object"==typeof e&&null!==e){const t=e;"string"==typeof t.message?l=t.message:"string"==typeof t.error&&(l=t.error),"string"==typeof t.code&&(a=t.code)}}catch(e){}const d=new o(l,{status:c.status,code:a,retryable:s});if(s&&r<this.retryConfig.attempts&&!(null==i?void 0:i.aborted)){const s=this.retryConfig.delay*Math.pow(this.retryConfig.backoff,r-1);return this.logger.warn(`${this.tag} Retrying ${e} in ${s}ms (attempt ${r+1})`),yield this.sleep(s),this.makeRequest(e,t,i,r+1,n)}throw this.logger.error(`${this.tag} Request failed: ${e} (${c.status}) - ${l}`),d}return this.logger.debug(`${this.tag} Connected: ${e}`),c}catch(s){if(s instanceof o)throw s;if(s instanceof Error&&"AbortError"===s.name)throw this.logger.debug(`${this.tag} Aborted: ${e}`),s;if(r<this.retryConfig.attempts&&!(null==i?void 0:i.aborted)){const s=this.retryConfig.delay*Math.pow(this.retryConfig.backoff,r-1);return this.logger.warn(`${this.tag} Network error, retrying ${e} in ${s}ms`),yield this.sleep(s),this.makeRequest(e,t,i,r+1,n)}throw this.logger.error(`${this.tag} Network error: ${e}`,s),new o("Network error",{retryable:!0})}finally{clearTimeout(c),i&&i.removeEventListener("abort",l)}})}}const h=s.enum(["EN_GB","EN_US"]),p=s.custom(e=>null!=e&&"object"==typeof e),f=s.enum(["low","medium","high"]),y=s.enum(["none","low","medium","high"]),b=s.enum(["agentic","fast"]),v=s.object({maxWallClockMs:s.number().positive().optional(),maxTotalTokens:s.number().int().positive().optional(),maxCostUsd:s.number().positive().optional()}),w=s.object({callId:s.string().max(256),locale:h.optional(),effort:f.optional(),storytellingEffort:y.optional().default("low"),budget:v.optional(),executionMode:b.optional()}),x=1e4,$=s.object({config:p,userPrompt:s.string().max(1e4).optional().default(""),metadata:w.optional()}),j=$.extend({maxSuggestionCount:s.number().int().min(1).max(4).optional()}),S=s.enum(["line","bar","groupedBar","stackedBar","100StackedBar","column","groupedColumn","stackedColumn","100StackedColumn","combo","pie","donut","funnel","heatmap","scatter","bubble","waterfall","table"]),k=s.object({dataPrepPrompt:s.string(),chartType:S,summary:s.string()}),C=s.object({response:s.object({message:s.string()}),config:p}),O=s.object({suggestions:s.array(k)}),T=s.enum(["comparison","relationship","distribution","composition"]),E=s.object({finding:s.string().describe("Plain-English summary of the finding (no stats jargon)."),confidence:s.number().min(0).max(1).describe("Statistical strength of the finding (0..1). Independent of topicality."),relevance:s.number().min(0).max(1).describe("Topical fit with the user prompt and chart narrative (0..1). Independent of statistical strength."),topic:s.string().min(1).describe("Kebab-case label grouping this finding with related ones; consumers can render findings as threads."),chartHint:s.string().min(1).max(240).describe('Natural-language data-prep recipe for a downstream mutate agent: filter → group → aggregate → sort, naming real dataset columns. No chart type or "render as" clause — that is set via chartFamily.'),chartFamily:T.describe("Abela family (comparison | relationship | distribution | composition). Downstream chart-generator picks the concrete chart type from this family + the data shape."),evidenceSummary:s.string().max(300).describe("Rigorous statistical back-up with exact numbers.")}),I=s.object({topic:s.string().min(1).describe("Kebab-case story headline shared by all child findings."),score:s.number().min(0).max(1).describe("Max quadrant score (relevance × confidence) across child findings."),count:s.number().int().min(1).describe("Number of findings in this story."),findings:s.array(E).describe("Child findings, sorted by quadrant score desc.")}),R=s.object({response:s.object({message:s.string(),steps:s.array(s.string())}),stories:s.array(I)}),P=s.object({response:s.object({message:s.string(),steps:s.array(s.string())}),config:p}),A=s.object({response:s.object({message:s.string(),steps:s.array(s.string())}),config:p}),B=s.enum(["high","medium","low"]),U=s.object({confidence:B,needsUserInput:s.boolean(),warnings:s.array(s.string()),cellConfidence:s.array(s.object({rowIndex:s.number().int().nonnegative(),columnKey:s.string(),confidence:B,quote:s.string().optional()})).optional()}),M=s.object({score:s.number().min(0).max(1),issues:s.array(s.string()),sufficient:s.boolean(),summary:s.string()}),q=5e5,N=8,D=2097152,K=7340032,F=2,G=6291456,W=8388608,L=12582912,z=10,H=4*Math.ceil(699050.6666666666),J=4*Math.ceil(2446677.3333333335),_=4*Math.ceil(2097152),Y=4*Math.ceil(2796202.6666666665),Z=4*Math.ceil(4194304);function Q(e){return e.replace(/\s+/g,"")}function V(e){const t=Q(e);return 0!==t.length&&t.length%4==0&&/^[A-Za-z0-9+/]+={0,2}$/.test(t)}const X=/^image\/(png|jpeg|jpg|webp|gif)$/i,ee=s.object({mimeType:s.string().min(1).refine(e=>X.test(e.trim()),{message:"mimeType must be image/png, image/jpeg, image/jpg, image/webp, or image/gif"}),dataBase64:s.string().min(1).max(H).refine(V,{message:"dataBase64 must be standard base64 (RFC 4648)"})}),te=s.enum(["image","document"]),ie=ee.extend({kind:s.literal("image")}),re=s.object({kind:s.literal("document"),mimeType:s.string().min(1).refine(e=>/^application\/pdf$/i.test(e.trim()),{message:"document mimeType must be application/pdf"}),dataBase64:s.string().min(1).max(_).refine(V,{message:"dataBase64 must be standard base64 (RFC 4648)"})}),ne=s.discriminatedUnion("kind",[ie,re]),se=s.object({sourceText:s.string().max(q).default(""),images:s.array(ee).max(8).optional().describe('@deprecated Use attachments[] with kind: "image" instead. Will be removed in a future major release.'),attachments:s.array(ne).max(10).optional(),metadata:w.optional()}).superRefine((e,t)=>{var i,r;const n=e.sourceText.trim(),s=null!==(i=e.images)&&void 0!==i?i:[],o=null!==(r=e.attachments)&&void 0!==r?r:[];if(s.length>0&&o.length>0)return void t.addIssue({code:"custom",message:'Use either `images` (deprecated) or `attachments`, not both. Migrate to `attachments` with `kind: "image"`.',path:["attachments"]});if(0===n.length&&0===s.length&&0===o.length)return void t.addIssue({code:"custom",message:"Provide non-empty sourceText and/or at least one attachment",path:["sourceText"]});if(s.length>0){s.reduce((e,t)=>e+Q(t.dataBase64).length,0)>J&&t.addIssue({code:"custom",message:"Combined image base64 exceeds maximum length for this API (must fit server decode limits)",path:["images"]})}const a=o.filter(e=>"image"===e.kind).length,c=o.length-a;if(a>8&&t.addIssue({code:"custom",message:"Too many images (max 8)",path:["attachments"]}),c>2&&t.addIssue({code:"custom",message:"Too many documents (max 2)",path:["attachments"]}),o.length>0&&a<=8&&c<=2){let e=0,i=0,r=0;for(const t of o){const n=Q(t.dataBase64).length;r+=n,"image"===t.kind?e+=n:i+=n}e>J&&t.addIssue({code:"custom",message:"Combined image base64 exceeds maximum length for this API (must fit server decode limits)",path:["attachments"]}),i>Y&&t.addIssue({code:"custom",message:"Combined document base64 exceeds maximum length for this API (must fit server decode limits)",path:["attachments"]}),r>Z&&t.addIssue({code:"custom",message:"Combined attachment base64 exceeds maximum length for this API (must fit server decode limits)",path:["attachments"]})}});function oe(e){return{kind:"image",mimeType:e.mimeType.trim(),dataBase64:Q(e.dataBase64)}}function ae(e){return{kind:"document",mimeType:"application/pdf",dataBase64:Q(e.dataBase64)}}const ce=s.object({response:s.object({message:s.string()}),config:p,extractMeta:U.nullable(),lastAccuracyEvaluation:M.optional()}),le=s.object({config:p,response:s.object({message:s.string(),steps:s.array(s.string())})}),de=O,me="/api/v0";class ge{constructor(e){this.client=new u(e)}generateGraph(t,i,r){return e(this,void 0,void 0,function*(){const{storytellingOptions:e}=t,s=n(t,["storytellingOptions"]),o=yield this.client.fetch(`${me}/generate`,s,i,r),a=le.parse(o);return this.stripStorytelling(a,e)})}generateGraphStream(t,i){return e(this,void 0,void 0,function*(){const{storytellingOptions:e}=t,r=n(t,["storytellingOptions"]),s=yield this.client.stream(`${me}/generate`,r,i);return this.wrapStreamWithStorytellingStripping(s,e)})}generateNarrative(t,i,r){return e(this,void 0,void 0,function*(){const e=yield this.client.fetch(`${me}/narrate`,t,i,r);return C.parse(e)})}generateNarrativeStream(t,i){return e(this,void 0,void 0,function*(){return this.client.stream(`${me}/narrate`,t,i)})}generateSuggestions(t,i,r){return e(this,void 0,void 0,function*(){const e=yield this.client.fetch(`${me}/suggestions`,t,i,r);return O.parse(e)})}generateSuggestionsStream(t,i){return e(this,void 0,void 0,function*(){return this.client.stream(`${me}/suggestions`,t,i)})}generateExploration(t,i,r){return e(this,void 0,void 0,function*(){const e=yield this.client.fetch(`${me}/explore`,t,i,r);return R.parse(e)})}generateExplorationStream(t,i){return e(this,void 0,void 0,function*(){return this.client.stream(`${me}/explore`,t,i)})}generateAnnotations(t,i,r){return e(this,void 0,void 0,function*(){const e=yield this.client.fetch(`${me}/annotate`,t,i,r);return P.parse(e)})}generateAnnotationsStream(t,i){return e(this,void 0,void 0,function*(){return this.client.stream(`${me}/annotate`,t,i)})}generateMutation(t,i,r){return e(this,void 0,void 0,function*(){const e=yield this.client.fetch(`${me}/mutate`,t,i,r);return A.parse(e)})}generateMutationStream(t,i){return e(this,void 0,void 0,function*(){return this.client.stream(`${me}/mutate`,t,i)})}extractFromProse(t,i,r){return e(this,void 0,void 0,function*(){const e=yield this.client.fetch(`${me}/extract`,t,i,r);return ce.parse(e)})}extractFromProseStream(t,i){return e(this,void 0,void 0,function*(){return this.client.stream(`${me}/extract`,t,i)})}stripStorytelling(e,t){return t&&e.config.content?Object.assign(Object.assign({},e),{config:Object.assign(Object.assign({},e.config),{content:Object.assign(Object.assign(Object.assign(Object.assign({},e.config.content),t.excludeTitle&&{title:void 0}),t.excludeSubtitle&&{subtitle:void 0}),t.excludeCaption&&{caption:void 0})})}):e}wrapStreamWithStorytellingStripping(e,n){return i(this,arguments,function*(){var i,s,o,a;try{for(var c,d=!0,m=t(e);!(i=(c=yield r(m.next())).done);d=!0){a=c.value,d=!1;const e=a;if(l(e)){const t=this.stripStorytelling(e.data,n);yield yield r(Object.assign(Object.assign({},e),{data:t}))}else yield yield r(e)}}catch(e){s={error:e}}finally{try{d||i||!(o=m.return)||(yield r(o.call(m)))}finally{if(s)throw s.error}}})}}export{S as AiChartTypeEnum,T as ChartFamilySchema,b as ExecutionModeSchema,E as ExploreFindingSchema,I as ExploreStorySchema,M as ExtractAccuracyEvaluationSchema,ne as ExtractAttachmentInputSchema,te as ExtractAttachmentKindSchema,B as ExtractConfidenceSchema,se as ExtractFromProseParamsSchema,ce as ExtractFromProseResponseSchema,U as ExtractMetaSchema,P as GenerateAnnotationsResponseSchema,R as GenerateExplorationResponseSchema,le as GenerateGraphResponseSchema,de as GenerateGraphSuggestionsResponseSchema,A as GenerateMutationResponseSchema,C as GenerateNarrativeResponseSchema,j as GenerateSuggestionsParamsSchema,O as GenerateSuggestionsResponseSchema,$ as GraphGenerationRequestSchema,ge as GraphyAiSdk,o as GraphyApiError,v as InvocationBudgetSchema,f as InvocationEffortSchema,z as MAX_EXTRACT_ATTACHMENTS,L as MAX_EXTRACT_ATTACHMENTS_COMBINED_DECODED_BYTES,F as MAX_EXTRACT_DOCUMENTS,W as MAX_EXTRACT_DOCUMENTS_TOTAL_DECODED_BYTES,G as MAX_EXTRACT_DOCUMENT_DECODED_BYTES,N as MAX_EXTRACT_IMAGES,K as MAX_EXTRACT_IMAGES_TOTAL_DECODED_BYTES,D as MAX_EXTRACT_IMAGE_DECODED_BYTES,q as MAX_SOURCE_TEXT_LENGTH,x as MAX_USER_PROMPT_LENGTH,w as MetadataSchema,y as StorytellingEffortSchema,k as SuggestionSchema,oe as buildImageAttachment,ae as buildPdfAttachment,l as isCompleteEvent,d as isErrorEvent,a as isGraphyApiError,m as isPreviewEvent,c as isProgressEvent,g as isReasoningEvent};
|
|
1
|
+
import{__awaiter as e,__asyncValues as t,__asyncGenerator as i,__await as n,__rest as r}from"tslib";import{z as s}from"zod";class a extends Error{constructor(e,t){var i;super(e),Object.setPrototypeOf(this,new.target.prototype),this.name="GraphyApiError",this.status=null==t?void 0:t.status,this.code=null==t?void 0:t.code,this.retryable=null!==(i=null==t?void 0:t.retryable)&&void 0!==i&&i}}const o=e=>e instanceof a,c=e=>"progress"===e.type,l=e=>"complete"===e.type,d=e=>"error"===e.type,m=e=>"preview"===e.type,g=e=>"reasoning"===e.type;class u{constructor(e){if(this.tag="[GRAPHY]",!e.apiKey||0===e.apiKey.trim().length)throw new Error("apiKey is required and must not be empty");const t=new URL(e.baseUrl);if(!["http:","https:"].includes(t.protocol))throw new Error(`Invalid baseUrl protocol: ${t.protocol}. Only http(s) is allowed.`);this.apiKey=e.apiKey,this.baseUrl=t.origin+t.pathname.replace(/\/$/,""),this.timeout=e.timeout||6e4,this.retryConfig=e.retryConfig||{attempts:3,delay:1e3,backoff:2},this.logger=e.logger||{log:console.log,warn:console.warn,error:console.error,debug:console.debug}}static isProgressEvent(e){return c(e)}static isCompleteEvent(e){return l(e)}static isErrorEvent(e){return d(e)}stream(t,i,n){return e(this,void 0,void 0,function*(){const e=yield this.makeRequest(t,i,n);return this.parseSSE(e)})}fetch(i,n,r,s){return e(this,void 0,void 0,function*(){var e,o,m,g,u;const h=Date.now();this.logger.debug(`${this.tag} Fetch: ${i}`);try{const b=yield this.makeRequest(i,n,s),v=b.headers.get("content-type");if(null==v?void 0:v.includes("text/event-stream")){try{for(var p,f=!0,y=t(this.parseSSE(b));!(e=(p=yield y.next()).done);f=!0){g=p.value,f=!1;const e=g;if(c(e)&&r&&r(e),l(e))return e.data;if(d(e)){const t=Date.now()-h;throw this.logger.error(`${this.tag} Server error: ${i} ${t}ms`,e.error),new a(e.error,{code:e.code,retryable:null!==(u=e.retryable)&&void 0!==u&&u})}}}catch(e){o={error:e}}finally{try{f||e||!(m=y.return)||(yield m.call(y))}finally{if(o)throw o.error}}const n=Date.now()-h;throw this.logger.error(`${this.tag} Stream incomplete: ${i} ${n}ms`),new a("Stream ended without completion")}return yield b.json()}catch(e){const t=Date.now()-h;if(this.logger.error(`${this.tag} Fetch failed: ${i} ${t}ms`,e),e instanceof a)throw e;throw e}finally{const e=Date.now()-h;this.logger.debug(`${this.tag} Fetch completed: ${i} ${e}ms`)}})}ping(){return e(this,void 0,void 0,function*(){const e=Date.now();try{return yield this.makeRequest("/health",void 0,void 0,this.retryConfig.attempts,"GET"),{ok:!0,latency:Date.now()-e}}catch(t){return{ok:!1,latency:Date.now()-e}}})}sleep(t){return e(this,void 0,void 0,function*(){return new Promise(e=>setTimeout(e,t))})}parseSSE(e){return i(this,arguments,function*(){if(!e.body)throw new a("Response body is null");const t=e.body.getReader(),i=new TextDecoder;let r="",s="",o="";try{for(;;){const{done:e,value:a}=yield n(t.read());if(e)break;r+=i.decode(a,{stream:!0});const c=r.split(/\r?\n/);r=c.pop()||"";for(const e of c)if(e.startsWith("event: "))s=e.slice(7).trim();else if(e.startsWith("data: "))o+=(o?"\n":"")+e.slice(6);else if(""===e.trim()&&o){try{const e=JSON.parse(o);let t;if("progress"===s){const i=e;t=Object.assign({type:"progress"},i)}else if("complete"===s)t={type:"complete",data:e};else if("error"===s){const i=e;t=Object.assign({type:"error"},i)}else if("preview"===s){const i=e;t=Object.assign(Object.assign({},i),{type:"preview"})}else{if("reasoning"!==s){s="",o="";continue}{const i=e;t=Object.assign(Object.assign({},i),{type:"reasoning"})}}if(yield yield n(t),"complete"===s||"error"===s)return yield n(void 0)}catch(e){this.logger.warn("Invalid SSE data format",o)}s="",o=""}}}finally{t.releaseLock()}})}makeRequest(t,i,n){return e(this,arguments,void 0,function*(e,t,i,n=1,r="POST"){if(!e.startsWith("/"))throw new a("Invalid endpoint: must start with /");const s=new URL(e,this.baseUrl);if(s.origin!==new URL(this.baseUrl).origin)throw new a("Endpoint resolved to unexpected origin");this.logger.debug(`${this.tag} Request ${n}/${this.retryConfig.attempts}: ${s}`);const o=new AbortController,c=setTimeout(()=>o.abort(),this.timeout),l=()=>o.abort();i&&i.addEventListener("abort",l);try{const c=yield fetch(s,Object.assign({method:r,headers:{"Content-Type":"application/json",Accept:"application/json, text/event-stream","Cache-Control":"no-cache",Authorization:`Bearer ${this.apiKey}`,"User-Agent":"Graphy-SDK/1.0"},signal:o.signal},"POST"===r&&{body:JSON.stringify(t)}));if(!c.ok){const s=c.status>=500||429===c.status;let o,l=`HTTP ${c.status}`;try{const e=yield c.json();if("object"==typeof e&&null!==e){const t=e;"string"==typeof t.message?l=t.message:"string"==typeof t.error&&(l=t.error),"string"==typeof t.code&&(o=t.code)}}catch(e){}const d=new a(l,{status:c.status,code:o,retryable:s});if(s&&n<this.retryConfig.attempts&&!(null==i?void 0:i.aborted)){const s=this.retryConfig.delay*Math.pow(this.retryConfig.backoff,n-1);return this.logger.warn(`${this.tag} Retrying ${e} in ${s}ms (attempt ${n+1})`),yield this.sleep(s),this.makeRequest(e,t,i,n+1,r)}throw this.logger.error(`${this.tag} Request failed: ${e} (${c.status}) - ${l}`),d}return this.logger.debug(`${this.tag} Connected: ${e}`),c}catch(s){if(s instanceof a)throw s;if(s instanceof Error&&"AbortError"===s.name)throw this.logger.debug(`${this.tag} Aborted: ${e}`),s;if(n<this.retryConfig.attempts&&!(null==i?void 0:i.aborted)){const s=this.retryConfig.delay*Math.pow(this.retryConfig.backoff,n-1);return this.logger.warn(`${this.tag} Network error, retrying ${e} in ${s}ms`),yield this.sleep(s),this.makeRequest(e,t,i,n+1,r)}throw this.logger.error(`${this.tag} Network error: ${e}`,s),new a("Network error",{retryable:!0})}finally{clearTimeout(c),i&&i.removeEventListener("abort",l)}})}}const h=s.enum(["EN_GB","EN_US"]),p=s.custom(e=>null!=e&&"object"==typeof e),f=s.enum(["low","medium","high"]),y=s.enum(["none","low","medium","high"]),b=s.enum(["agentic","fast"]),v=s.object({maxWallClockMs:s.number().positive().optional(),maxTotalTokens:s.number().int().positive().optional(),maxCostUsd:s.number().positive().optional()}),w=s.object({callId:s.string().max(256),locale:h.optional(),effort:f.optional(),storytellingEffort:y.optional().default("low"),budget:v.optional(),executionMode:b.optional()}),x=1e4,j=s.object({config:p,userPrompt:s.string().max(1e4).optional().default(""),metadata:w.optional()}),$=j.extend({maxSuggestionCount:s.number().int().min(1).max(4).optional()}),S=s.enum(["line","bar","groupedBar","stackedBar","100StackedBar","column","groupedColumn","stackedColumn","100StackedColumn","combo","pie","donut","funnel","heatmap","scatter","bubble","waterfall","table"]),k=s.object({dataPrepPrompt:s.string(),chartType:S,summary:s.string()}),C=s.object({response:s.object({message:s.string()}),config:p}),T=s.object({suggestions:s.array(k)}),O=s.enum(["comparison","relationship","distribution","composition"]),E=s.object({finding:s.string().describe("Plain-English summary of the finding (no stats jargon)."),confidence:s.number().min(0).max(1).describe("Statistical strength of the finding (0..1). Independent of topicality."),relevance:s.number().min(0).max(1).describe("Topical fit with the user prompt and chart narrative (0..1). Independent of statistical strength."),topic:s.string().min(1).describe("Kebab-case label grouping this finding with related ones; consumers can render findings as threads."),chartHint:s.string().min(1).max(240).describe('Natural-language data-prep recipe for a downstream mutate agent: filter → group → aggregate → sort, naming real dataset columns. No chart type or "render as" clause — that is set via chartFamily.'),chartFamily:O.describe("Abela family (comparison | relationship | distribution | composition). Downstream chart-generator picks the concrete chart type from this family + the data shape."),evidenceSummary:s.string().max(300).describe("Rigorous statistical back-up with exact numbers.")}),I=s.object({topic:s.string().min(1).describe("Kebab-case story headline shared by all child findings."),score:s.number().min(0).max(1).describe("Max quadrant score (relevance × confidence) across child findings."),count:s.number().int().min(1).describe("Number of findings in this story."),findings:s.array(E).describe("Child findings, sorted by quadrant score desc.")}),R=s.object({response:s.object({message:s.string(),steps:s.array(s.string())}),stories:s.array(I)}),B=s.object({response:s.object({message:s.string(),steps:s.array(s.string())}),config:p}),P=s.object({response:s.object({message:s.string(),steps:s.array(s.string())}),config:p}),A=s.enum(["high","medium","low"]),U=s.object({confidence:A,needsUserInput:s.boolean(),warnings:s.array(s.string()),cellConfidence:s.array(s.object({rowIndex:s.number().int().nonnegative(),columnKey:s.string(),confidence:A,quote:s.string().optional()})).optional()}),q=s.object({score:s.number().min(0).max(1),issues:s.array(s.string()),sufficient:s.boolean(),summary:s.string()}),N=5e5,D=8,F=2097152,K=7340032,M=2,G=6291456,W=8388608,L=2,z=G,H=W,J=12582912,_=12;function Y(e){return 4*Math.ceil(e/3)}const Z=Y(F),Q=Y(K),V=Y(G),X=Y(W),ee=Y(z),te=Y(H),ie=Y(J);function ne(e){return e.replace(/\s+/g,"")}function re(e){const t=ne(e);return 0!==t.length&&t.length%4==0&&/^[A-Za-z0-9+/]+={0,2}$/.test(t)}const se=/^image\/(png|jpeg|jpg|webp|gif)$/i,ae=s.object({mimeType:s.string().min(1).refine(e=>se.test(e.trim()),{message:"mimeType must be image/png, image/jpeg, image/jpg, image/webp, or image/gif"}),dataBase64:s.string().min(1).max(Z).refine(re,{message:"dataBase64 must be standard base64 (RFC 4648)"})}),oe=s.enum(["image","document","spreadsheet"]),ce=ae.extend({kind:s.literal("image")}),le=s.object({kind:s.literal("document"),mimeType:s.string().min(1).refine(e=>/^application\/pdf$/i.test(e.trim()),{message:"document mimeType must be application/pdf"}),dataBase64:s.string().min(1).max(V).refine(re,{message:"dataBase64 must be standard base64 (RFC 4648)"})}),de=s.object({kind:s.literal("spreadsheet"),mimeType:s.string().min(1).refine(e=>/^application\/vnd\.openxmlformats-officedocument\.spreadsheetml\.sheet$/i.test(e.trim()),{message:"spreadsheet mimeType must be application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}),dataBase64:s.string().min(1).max(ee).refine(re,{message:"dataBase64 must be standard base64 (RFC 4648)"}),filename:s.string().max(512).optional()}).refine(e=>void 0===e.filename||e.filename.trim().length>0,{message:"spreadsheet filename must not be empty or whitespace-only",path:["filename"]}),me=s.discriminatedUnion("kind",[ce,le,de]),ge=s.object({sourceText:s.string().max(N).default(""),images:s.array(ae).max(8).optional().describe('@deprecated Use attachments[] with kind: "image" instead. Will be removed in a future major release.'),attachments:s.array(me).max(12).optional(),metadata:w.optional()}).superRefine((e,t)=>{var i,n;const r=e.sourceText.trim(),s=null!==(i=e.images)&&void 0!==i?i:[],a=null!==(n=e.attachments)&&void 0!==n?n:[];if(s.length>0&&a.length>0)return void t.addIssue({code:"custom",message:'Use either `images` (deprecated) or `attachments`, not both. Migrate to `attachments` with `kind: "image"`.',path:["attachments"]});if(0===r.length&&0===s.length&&0===a.length)return void t.addIssue({code:"custom",message:"Provide non-empty sourceText and/or at least one attachment",path:["sourceText"]});if(s.length>0){s.reduce((e,t)=>e+ne(t.dataBase64).length,0)>Q&&t.addIssue({code:"custom",message:"Combined image base64 exceeds maximum length for this API (must fit server decode limits)",path:["images"]})}let o=0,c=0,l=0,d=0,m=0,g=0,u=0;for(const e of a){const t=ne(e.dataBase64).length;switch(u+=t,e.kind){case"image":o+=1,d+=t;break;case"document":c+=1,m+=t;break;case"spreadsheet":l+=1,g+=t}}o>8&&t.addIssue({code:"custom",message:"Too many images (max 8)",path:["attachments"]}),c>2&&t.addIssue({code:"custom",message:"Too many documents (max 2)",path:["attachments"]}),l>2&&t.addIssue({code:"custom",message:"Too many spreadsheets (max 2)",path:["attachments"]});const h=o<=8&&c<=2&&l<=2;a.length>0&&h&&(d>Q&&t.addIssue({code:"custom",message:"Combined image base64 exceeds maximum length for this API (must fit server decode limits)",path:["attachments"]}),m>X&&t.addIssue({code:"custom",message:"Combined document base64 exceeds maximum length for this API (must fit server decode limits)",path:["attachments"]}),g>te&&t.addIssue({code:"custom",message:"Combined spreadsheet base64 exceeds maximum length for this API (must fit server decode limits)",path:["attachments"]}),u>ie&&t.addIssue({code:"custom",message:"Combined attachment base64 exceeds maximum length for this API (must fit server decode limits)",path:["attachments"]}))});function ue(e){return{kind:"image",mimeType:e.mimeType.trim(),dataBase64:ne(e.dataBase64)}}function he(e){return{kind:"document",mimeType:"application/pdf",dataBase64:ne(e.dataBase64)}}function pe(e){return Object.assign({kind:"spreadsheet",mimeType:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",dataBase64:ne(e.dataBase64)},void 0!==e.filename?{filename:e.filename.trim()}:{})}const fe=s.object({response:s.object({message:s.string()}),config:p,extractMeta:U.nullable(),lastAccuracyEvaluation:q.optional()}),ye=s.object({config:p,response:s.object({message:s.string(),steps:s.array(s.string())})}),be=T,ve="/api/v0";class we{constructor(e){this.client=new u(e)}generateGraph(t,i,n){return e(this,void 0,void 0,function*(){const{storytellingOptions:e}=t,s=r(t,["storytellingOptions"]),a=yield this.client.fetch(`${ve}/generate`,s,i,n),o=ye.parse(a);return this.stripStorytelling(o,e)})}generateGraphStream(t,i){return e(this,void 0,void 0,function*(){const{storytellingOptions:e}=t,n=r(t,["storytellingOptions"]),s=yield this.client.stream(`${ve}/generate`,n,i);return this.wrapStreamWithStorytellingStripping(s,e)})}generateNarrative(t,i,n){return e(this,void 0,void 0,function*(){const e=yield this.client.fetch(`${ve}/narrate`,t,i,n);return C.parse(e)})}generateNarrativeStream(t,i){return e(this,void 0,void 0,function*(){return this.client.stream(`${ve}/narrate`,t,i)})}generateSuggestions(t,i,n){return e(this,void 0,void 0,function*(){const e=yield this.client.fetch(`${ve}/suggestions`,t,i,n);return T.parse(e)})}generateSuggestionsStream(t,i){return e(this,void 0,void 0,function*(){return this.client.stream(`${ve}/suggestions`,t,i)})}generateExploration(t,i,n){return e(this,void 0,void 0,function*(){const e=yield this.client.fetch(`${ve}/explore`,t,i,n);return R.parse(e)})}generateExplorationStream(t,i){return e(this,void 0,void 0,function*(){return this.client.stream(`${ve}/explore`,t,i)})}generateAnnotations(t,i,n){return e(this,void 0,void 0,function*(){const e=yield this.client.fetch(`${ve}/annotate`,t,i,n);return B.parse(e)})}generateAnnotationsStream(t,i){return e(this,void 0,void 0,function*(){return this.client.stream(`${ve}/annotate`,t,i)})}generateMutation(t,i,n){return e(this,void 0,void 0,function*(){const e=yield this.client.fetch(`${ve}/mutate`,t,i,n);return P.parse(e)})}generateMutationStream(t,i){return e(this,void 0,void 0,function*(){return this.client.stream(`${ve}/mutate`,t,i)})}extractFromProse(t,i,n){return e(this,void 0,void 0,function*(){const e=yield this.client.fetch(`${ve}/extract`,t,i,n);return fe.parse(e)})}extractFromProseStream(t,i){return e(this,void 0,void 0,function*(){return this.client.stream(`${ve}/extract`,t,i)})}stripStorytelling(e,t){return t&&e.config.content?Object.assign(Object.assign({},e),{config:Object.assign(Object.assign({},e.config),{content:Object.assign(Object.assign(Object.assign(Object.assign({},e.config.content),t.excludeTitle&&{title:void 0}),t.excludeSubtitle&&{subtitle:void 0}),t.excludeCaption&&{caption:void 0})})}):e}wrapStreamWithStorytellingStripping(e,r){return i(this,arguments,function*(){var i,s,a,o;try{for(var c,d=!0,m=t(e);!(i=(c=yield n(m.next())).done);d=!0){o=c.value,d=!1;const e=o;if(l(e)){const t=this.stripStorytelling(e.data,r);yield yield n(Object.assign(Object.assign({},e),{data:t}))}else yield yield n(e)}}catch(e){s={error:e}}finally{try{d||i||!(a=m.return)||(yield n(a.call(m)))}finally{if(s)throw s.error}}})}}export{S as AiChartTypeEnum,O as ChartFamilySchema,b as ExecutionModeSchema,E as ExploreFindingSchema,I as ExploreStorySchema,q as ExtractAccuracyEvaluationSchema,me as ExtractAttachmentInputSchema,oe as ExtractAttachmentKindSchema,A as ExtractConfidenceSchema,ge as ExtractFromProseParamsSchema,fe as ExtractFromProseResponseSchema,U as ExtractMetaSchema,B as GenerateAnnotationsResponseSchema,R as GenerateExplorationResponseSchema,ye as GenerateGraphResponseSchema,be as GenerateGraphSuggestionsResponseSchema,P as GenerateMutationResponseSchema,C as GenerateNarrativeResponseSchema,$ as GenerateSuggestionsParamsSchema,T as GenerateSuggestionsResponseSchema,j as GraphGenerationRequestSchema,we as GraphyAiSdk,a as GraphyApiError,v as InvocationBudgetSchema,f as InvocationEffortSchema,_ as MAX_EXTRACT_ATTACHMENTS,J as MAX_EXTRACT_ATTACHMENTS_COMBINED_DECODED_BYTES,M as MAX_EXTRACT_DOCUMENTS,W as MAX_EXTRACT_DOCUMENTS_TOTAL_DECODED_BYTES,G as MAX_EXTRACT_DOCUMENT_DECODED_BYTES,D as MAX_EXTRACT_IMAGES,K as MAX_EXTRACT_IMAGES_TOTAL_DECODED_BYTES,F as MAX_EXTRACT_IMAGE_DECODED_BYTES,L as MAX_EXTRACT_SPREADSHEETS,H as MAX_EXTRACT_SPREADSHEETS_TOTAL_DECODED_BYTES,z as MAX_EXTRACT_SPREADSHEET_DECODED_BYTES,N as MAX_SOURCE_TEXT_LENGTH,x as MAX_USER_PROMPT_LENGTH,w as MetadataSchema,y as StorytellingEffortSchema,k as SuggestionSchema,ue as buildImageAttachment,he as buildPdfAttachment,pe as buildSpreadsheetAttachment,l as isCompleteEvent,d as isErrorEvent,o as isGraphyApiError,m as isPreviewEvent,c as isProgressEvent,g as isReasoningEvent};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@graphysdk/agents-sdk",
|
|
3
3
|
"author": "Graphy",
|
|
4
|
-
"version": "1.3.0-beta.
|
|
4
|
+
"version": "1.3.0-beta.1778504701741",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
7
7
|
"files": [
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
20
20
|
"zod": "^4.3.6",
|
|
21
|
-
"@graphysdk/core": "1.3.0-beta.
|
|
21
|
+
"@graphysdk/core": "1.3.0-beta.1778504701741"
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|
|
24
24
|
"@rollup/plugin-commonjs": "^28.0.6",
|