@graphysdk/agents-sdk 1.3.0-beta.1776177078818 → 1.3.0-beta.1776260762546

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/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";var t=require("tslib"),e=require("zod");class r extends Error{constructor(t,e){var r;super(t),Object.setPrototypeOf(this,new.target.prototype),this.name="GraphyApiError",this.status=null==e?void 0:e.status,this.code=null==e?void 0:e.code,this.retryable=null!==(r=null==e?void 0:e.retryable)&&void 0!==r&&r}}const i=t=>"progress"===t.type,o=t=>"complete"===t.type,n=t=>"error"===t.type;class s{constructor(t){if(this.tag="[GRAPHY]",!t.apiKey||0===t.apiKey.trim().length)throw new Error("apiKey is required and must not be empty");const e=new URL(t.baseUrl);if(!["http:","https:"].includes(e.protocol))throw new Error(`Invalid baseUrl protocol: ${e.protocol}. Only http(s) is allowed.`);this.apiKey=t.apiKey,this.baseUrl=e.origin+e.pathname.replace(/\/$/,""),this.timeout=t.timeout||6e4,this.retryConfig=t.retryConfig||{attempts:3,delay:1e3,backoff:2},this.logger=t.logger||{log:console.log,warn:console.warn,error:console.error,debug:console.debug}}static isProgressEvent(t){return i(t)}static isCompleteEvent(t){return o(t)}static isErrorEvent(t){return n(t)}stream(e,r,i){return t.__awaiter(this,void 0,void 0,function*(){const t=yield this.makeRequest(e,r,i);return this.parseSSE(t)})}fetch(e,s,a,l){return t.__awaiter(this,void 0,void 0,function*(){var c,g,h,d,p;const u=Date.now();this.logger.debug(`${this.tag} Fetch: ${e}`);try{const b=yield this.makeRequest(e,s,l),w=b.headers.get("content-type");if(null==w?void 0:w.includes("text/event-stream")){try{for(var y,m=!0,f=t.__asyncValues(this.parseSSE(b));!(c=(y=yield f.next()).done);m=!0){d=y.value,m=!1;const t=d;if(i(t)&&a&&a(t),o(t))return t.data;if(n(t)){const i=Date.now()-u;throw this.logger.error(`${this.tag} Server error: ${e} ${i}ms`,t.error),new r(t.error,{code:t.code,retryable:null!==(p=t.retryable)&&void 0!==p&&p})}}}catch(t){g={error:t}}finally{try{m||c||!(h=f.return)||(yield h.call(f))}finally{if(g)throw g.error}}const s=Date.now()-u;throw this.logger.error(`${this.tag} Stream incomplete: ${e} ${s}ms`),new r("Stream ended without completion")}return yield b.json()}catch(t){const i=Date.now()-u;if(this.logger.error(`${this.tag} Fetch failed: ${e} ${i}ms`,t),t instanceof r)throw t;throw t}finally{const t=Date.now()-u;this.logger.debug(`${this.tag} Fetch completed: ${e} ${t}ms`)}})}ping(){return t.__awaiter(this,void 0,void 0,function*(){const t=Date.now();try{return yield this.makeRequest("/health",void 0,void 0,this.retryConfig.attempts,"GET"),{ok:!0,latency:Date.now()-t}}catch(e){return{ok:!1,latency:Date.now()-t}}})}sleep(e){return t.__awaiter(this,void 0,void 0,function*(){return new Promise(t=>setTimeout(t,e))})}parseSSE(e){return t.__asyncGenerator(this,arguments,function*(){if(!e.body)throw new r("Response body is null");const i=e.body.getReader(),o=new TextDecoder;let n="",s="",a="";try{for(;;){const{done:e,value:r}=yield t.__await(i.read());if(e)break;n+=o.decode(r,{stream:!0});const l=n.split(/\r?\n/);n=l.pop()||"";for(const e of l)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 r;if("progress"===s){const t=e;r=Object.assign({type:"progress"},t)}else if("complete"===s)r={type:"complete",data:e};else{if("error"!==s){s="",a="";continue}{const t=e;r=Object.assign({type:"error"},t)}}if(yield yield t.__await(r),"complete"===s||"error"===s)return yield t.__await(void 0)}catch(t){this.logger.warn("Invalid SSE data format",a)}s="",a=""}}}finally{i.releaseLock()}})}makeRequest(e,i,o){return t.__awaiter(this,arguments,void 0,function*(t,e,i,o=1,n="POST"){if(!t.startsWith("/"))throw new r("Invalid endpoint: must start with /");const s=new URL(t,this.baseUrl);if(s.origin!==new URL(this.baseUrl).origin)throw new r("Endpoint resolved to unexpected origin");this.logger.debug(`${this.tag} Request ${o}/${this.retryConfig.attempts}: ${s}`);const a=new AbortController,l=setTimeout(()=>a.abort(),this.timeout),c=()=>a.abort();i&&i.addEventListener("abort",c);try{const l=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(e)}));if(!l.ok){const s=l.status>=500||429===l.status;let a,c=`HTTP ${l.status}`;try{const t=yield l.json();if("object"==typeof t&&null!==t){const e=t;"string"==typeof e.message?c=e.message:"string"==typeof e.error&&(c=e.error),"string"==typeof e.code&&(a=e.code)}}catch(t){}const g=new r(c,{status:l.status,code:a,retryable:s});if(s&&o<this.retryConfig.attempts&&!(null==i?void 0:i.aborted)){const r=this.retryConfig.delay*Math.pow(this.retryConfig.backoff,o-1);return this.logger.warn(`${this.tag} Retrying ${t} in ${r}ms (attempt ${o+1})`),yield this.sleep(r),this.makeRequest(t,e,i,o+1,n)}throw this.logger.error(`${this.tag} Request failed: ${t} (${l.status}) - ${c}`),g}return this.logger.debug(`${this.tag} Connected: ${t}`),l}catch(s){if(s instanceof r)throw s;if(s instanceof Error&&"AbortError"===s.name)throw this.logger.debug(`${this.tag} Aborted: ${t}`),s;if(o<this.retryConfig.attempts&&!(null==i?void 0:i.aborted)){const r=this.retryConfig.delay*Math.pow(this.retryConfig.backoff,o-1);return this.logger.warn(`${this.tag} Network error, retrying ${t} in ${r}ms`),yield this.sleep(r),this.makeRequest(t,e,i,o+1,n)}throw this.logger.error(`${this.tag} Network error: ${t}`,s),new r("Network error",{retryable:!0})}finally{clearTimeout(l),i&&i.removeEventListener("abort",c)}})}}const a=e.z.enum(["EN_GB","EN_US"]),l=e.z.custom(t=>null!=t&&"object"==typeof t),c=e.z.enum(["none","low","medium","high"]),g=e.z.object({maxWallClockMs:e.z.number().positive().optional(),maxTotalTokens:e.z.number().int().positive().optional(),maxCostUsd:e.z.number().positive().optional()}),h=e.z.object({callId:e.z.string().max(256),locale:a.optional(),storytellingEffort:c.optional().default("low"),budget:g.optional()}),d=e.z.object({config:l,userPrompt:e.z.string().max(1e4).optional().default(""),metadata:h.optional()}),p=e.z.enum(["line","bar","groupedBar","stackedBar","100StackedBar","column","groupedColumn","stackedColumn","100StackedColumn","combo","pie","donut","funnel","heatmap","scatter","bubble","waterfall","table"]),u=e.z.object({dataPrepPrompt:e.z.string(),chartType:p,summary:e.z.string()}),y=e.z.object({response:e.z.object({message:e.z.string()}),config:l}),m=e.z.object({suggestions:e.z.array(u)}),f=e.z.object({answer:e.z.string().describe("Direct answer for this finding."),confidence:e.z.number().min(0).max(1).describe("Confidence between 0 and 1."),evidenceSummary:e.z.string().max(300).describe("Short prose summary of the statistical evidence.")}),b=e.z.object({response:e.z.object({message:e.z.string(),steps:e.z.array(e.z.string())}),findings:e.z.array(f)}),w=e.z.object({response:e.z.object({message:e.z.string(),steps:e.z.array(e.z.string())}),config:l}),v=e.z.object({config:l,response:e.z.object({message:e.z.string(),steps:e.z.array(e.z.string())})}),_="/api/v0";exports.AiChartTypeEnum=p,exports.ExploreFindingSchema=f,exports.GenerateAnnotationsResponseSchema=w,exports.GenerateExplorationResponseSchema=b,exports.GenerateGraphResponseSchema=v,exports.GenerateNarrativeResponseSchema=y,exports.GenerateSuggestionsResponseSchema=m,exports.GraphGenerationRequestSchema=d,exports.GraphyAiSdk=class{constructor(t){this.client=new s(t)}generateGraph(e,r,i){return t.__awaiter(this,void 0,void 0,function*(){const{storytellingOptions:o}=e,n=t.__rest(e,["storytellingOptions"]),s=yield this.client.fetch(`${_}/generate`,n,r,i),a=v.parse(s);return this.stripStorytelling(a,o)})}generateGraphStream(e,r){return t.__awaiter(this,void 0,void 0,function*(){const{storytellingOptions:i}=e,o=t.__rest(e,["storytellingOptions"]),n=yield this.client.stream(`${_}/generate`,o,r);return this.wrapStreamWithStorytellingStripping(n,i)})}generateNarrative(e,r,i){return t.__awaiter(this,void 0,void 0,function*(){const t=yield this.client.fetch(`${_}/narrate`,e,r,i);return y.parse(t)})}generateNarrativeStream(e,r){return t.__awaiter(this,void 0,void 0,function*(){return this.client.stream(`${_}/narrate`,e,r)})}generateSuggestions(e,r,i){return t.__awaiter(this,void 0,void 0,function*(){const t=yield this.client.fetch(`${_}/suggestions`,e,r,i);return m.parse(t)})}generateSuggestionsStream(e,r){return t.__awaiter(this,void 0,void 0,function*(){return this.client.stream(`${_}/suggestions`,e,r)})}generateExploration(e,r,i){return t.__awaiter(this,void 0,void 0,function*(){const t=yield this.client.fetch(`${_}/explore`,e,r,i);return b.parse(t)})}generateExplorationStream(e,r){return t.__awaiter(this,void 0,void 0,function*(){return this.client.stream(`${_}/explore`,e,r)})}generateAnnotations(e,r,i){return t.__awaiter(this,void 0,void 0,function*(){const t=yield this.client.fetch(`${_}/annotate`,e,r,i);return w.parse(t)})}generateAnnotationsStream(e,r){return t.__awaiter(this,void 0,void 0,function*(){return this.client.stream(`${_}/annotate`,e,r)})}stripStorytelling(t,e){return e&&t.config.content?Object.assign(Object.assign({},t),{config:Object.assign(Object.assign({},t.config),{content:Object.assign(Object.assign(Object.assign(Object.assign({},t.config.content),e.excludeTitle&&{title:void 0}),e.excludeSubtitle&&{subtitle:void 0}),e.excludeCaption&&{caption:void 0})})}):t}wrapStreamWithStorytellingStripping(e,r){return t.__asyncGenerator(this,arguments,function*(){var i,n,s,a;try{for(var l,c=!0,g=t.__asyncValues(e);!(i=(l=yield t.__await(g.next())).done);c=!0){a=l.value,c=!1;const e=a;if(o(e)){const i=this.stripStorytelling(e.data,r);yield yield t.__await(Object.assign(Object.assign({},e),{data:i}))}else yield yield t.__await(e)}}catch(t){n={error:t}}finally{try{c||i||!(s=g.return)||(yield t.__await(s.call(g)))}finally{if(n)throw n.error}}})}},exports.GraphyApiError=r,exports.InvocationBudgetSchema=g,exports.MAX_USER_PROMPT_LENGTH=1e4,exports.MetadataSchema=h,exports.StorytellingEffortSchema=c,exports.SuggestionSchema=u,exports.isCompleteEvent=o,exports.isErrorEvent=n,exports.isGraphyApiError=t=>t instanceof r,exports.isProgressEvent=i;
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,n=e=>"complete"===e.type,o=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 n(e)}static isErrorEvent(e){return o(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,a,c){return e.__awaiter(this,void 0,void 0,function*(){var l,g,d,h,u;const p=Date.now();this.logger.debug(`${this.tag} Fetch: ${t}`);try{const b=yield this.makeRequest(t,s,c),v=b.headers.get("content-type");if(null==v?void 0:v.includes("text/event-stream")){try{for(var m,y=!0,f=e.__asyncValues(this.parseSSE(b));!(l=(m=yield f.next()).done);y=!0){h=m.value,y=!1;const e=h;if(i(e)&&a&&a(e),n(e))return e.data;if(o(e)){const i=Date.now()-p;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){g={error:e}}finally{try{y||l||!(d=f.return)||(yield d.call(f))}finally{if(g)throw g.error}}const s=Date.now()-p;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()-p;if(this.logger.error(`${this.tag} Fetch failed: ${t} ${i}ms`,e),e instanceof r)throw e;throw e}finally{const e=Date.now()-p;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(),n=new TextDecoder;let o="",s="",a="";try{for(;;){const{done:t,value:r}=yield e.__await(i.read());if(t)break;o+=n.decode(r,{stream:!0});const c=o.split(/\r?\n/);o=c.pop()||"";for(const t of c)if(t.startsWith("event: "))s=t.slice(7).trim();else if(t.startsWith("data: "))a+=(a?"\n":"")+t.slice(6);else if(""===t.trim()&&a){try{const t=JSON.parse(a);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){s="",a="";continue}{const e=t;r=Object.assign({type:"error"},e)}}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",a)}s="",a=""}}}finally{i.releaseLock()}})}makeRequest(t,i,n){return e.__awaiter(this,arguments,void 0,function*(e,t,i,n=1,o="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 ${n}/${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:o,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"===o&&{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 g=new r(l,{status:c.status,code:a,retryable:s});if(s&&n<this.retryConfig.attempts&&!(null==i?void 0:i.aborted)){const r=this.retryConfig.delay*Math.pow(this.retryConfig.backoff,n-1);return this.logger.warn(`${this.tag} Retrying ${e} in ${r}ms (attempt ${n+1})`),yield this.sleep(r),this.makeRequest(e,t,i,n+1,o)}throw this.logger.error(`${this.tag} Request failed: ${e} (${c.status}) - ${l}`),g}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(n<this.retryConfig.attempts&&!(null==i?void 0:i.aborted)){const r=this.retryConfig.delay*Math.pow(this.retryConfig.backoff,n-1);return this.logger.warn(`${this.tag} Network error, retrying ${e} in ${r}ms`),yield this.sleep(r),this.makeRequest(e,t,i,n+1,o)}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 a=t.z.enum(["EN_GB","EN_US"]),c=t.z.custom(e=>null!=e&&"object"==typeof e),l=t.z.enum(["none","low","medium","high"]),g=t.z.object({maxWallClockMs:t.z.number().positive().optional(),maxTotalTokens:t.z.number().int().positive().optional(),maxCostUsd:t.z.number().positive().optional()}),d=t.z.object({callId:t.z.string().max(256),locale:a.optional(),storytellingEffort:l.optional().default("low"),budget:g.optional()}),h=t.z.object({config:c,userPrompt:t.z.string().max(1e4).optional().default(""),metadata:d.optional()}),u=h.extend({maxSuggestionCount:t.z.number().int().min(1).max(4).optional()}),p=t.z.enum(["line","bar","groupedBar","stackedBar","100StackedBar","column","groupedColumn","stackedColumn","100StackedColumn","combo","pie","donut","funnel","heatmap","scatter","bubble","waterfall","table"]),m=t.z.object({dataPrepPrompt:t.z.string(),chartType:p,summary:t.z.string()}),y=t.z.object({response:t.z.object({message:t.z.string()}),config:c}),f=t.z.object({suggestions:t.z.array(m)}),b=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 prescriptive recipe for a downstream mutate+chart agent: filter → group → aggregate → sort → render → highlight, naming real dataset columns."),evidenceSummary:t.z.string().max(300).describe("Rigorous statistical back-up with exact numbers.")}),v=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(b).describe("Child findings, sorted by quadrant score desc.")}),w=t.z.object({response:t.z.object({message:t.z.string(),steps:t.z.array(t.z.string())}),stories:t.z.array(v)}),_=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}),z=t.z.object({config:c,response:t.z.object({message:t.z.string(),steps:t.z.array(t.z.string())})}),x="/api/v0";exports.AiChartTypeEnum=p,exports.ExploreFindingSchema=b,exports.ExploreStorySchema=v,exports.GenerateAnnotationsResponseSchema=_,exports.GenerateExplorationResponseSchema=w,exports.GenerateGraphResponseSchema=z,exports.GenerateMutationResponseSchema=S,exports.GenerateNarrativeResponseSchema=y,exports.GenerateSuggestionsParamsSchema=u,exports.GenerateSuggestionsResponseSchema=f,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:n}=t,o=e.__rest(t,["storytellingOptions"]),s=yield this.client.fetch(`${x}/generate`,o,r,i),a=z.parse(s);return this.stripStorytelling(a,n)})}generateGraphStream(t,r){return e.__awaiter(this,void 0,void 0,function*(){const{storytellingOptions:i}=t,n=e.__rest(t,["storytellingOptions"]),o=yield this.client.stream(`${x}/generate`,n,r);return this.wrapStreamWithStorytellingStripping(o,i)})}generateNarrative(t,r,i){return e.__awaiter(this,void 0,void 0,function*(){const e=yield this.client.fetch(`${x}/narrate`,t,r,i);return y.parse(e)})}generateNarrativeStream(t,r){return e.__awaiter(this,void 0,void 0,function*(){return this.client.stream(`${x}/narrate`,t,r)})}generateSuggestions(t,r,i){return e.__awaiter(this,void 0,void 0,function*(){const e=yield this.client.fetch(`${x}/suggestions`,t,r,i);return f.parse(e)})}generateSuggestionsStream(t,r){return e.__awaiter(this,void 0,void 0,function*(){return this.client.stream(`${x}/suggestions`,t,r)})}generateExploration(t,r,i){return e.__awaiter(this,void 0,void 0,function*(){const e=yield this.client.fetch(`${x}/explore`,t,r,i);return w.parse(e)})}generateExplorationStream(t,r){return e.__awaiter(this,void 0,void 0,function*(){return this.client.stream(`${x}/explore`,t,r)})}generateAnnotations(t,r,i){return e.__awaiter(this,void 0,void 0,function*(){const e=yield this.client.fetch(`${x}/annotate`,t,r,i);return _.parse(e)})}generateAnnotationsStream(t,r){return e.__awaiter(this,void 0,void 0,function*(){return this.client.stream(`${x}/annotate`,t,r)})}generateMutation(t,r,i){return e.__awaiter(this,void 0,void 0,function*(){const e=yield this.client.fetch(`${x}/mutate`,t,r,i);return S.parse(e)})}generateMutationStream(t,r){return e.__awaiter(this,void 0,void 0,function*(){return this.client.stream(`${x}/mutate`,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,o,s,a;try{for(var c,l=!0,g=e.__asyncValues(t);!(i=(c=yield e.__await(g.next())).done);l=!0){a=c.value,l=!1;const t=a;if(n(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){o={error:e}}finally{try{l||i||!(s=g.return)||(yield e.__await(s.call(g)))}finally{if(o)throw o.error}}})}},exports.GraphyApiError=r,exports.InvocationBudgetSchema=g,exports.MAX_USER_PROMPT_LENGTH=1e4,exports.MetadataSchema=d,exports.StorytellingEffortSchema=l,exports.SuggestionSchema=m,exports.isCompleteEvent=n,exports.isErrorEvent=o,exports.isGraphyApiError=e=>e instanceof r,exports.isProgressEvent=i;
package/dist/index.d.ts CHANGED
@@ -278,6 +278,31 @@ declare const GraphGenerationRequestSchema: z.ZodObject<{
278
278
  }, z.core.$strip>>;
279
279
  }, z.core.$strip>;
280
280
  type GraphGenerationRequest = z.input<typeof GraphGenerationRequestSchema>;
281
+ /** Request body for `POST /v0/suggestions` only. `maxSuggestionCount` max must match agents-api `PROMPT_SUGGESTIONS_UPPER_BOUND`. */
282
+ declare const GenerateSuggestionsParamsSchema: z.ZodObject<{
283
+ config: z.ZodType<GraphConfig, unknown, z.core.$ZodTypeInternals<GraphConfig, unknown>>;
284
+ userPrompt: z.ZodDefault<z.ZodOptional<z.ZodString>>;
285
+ metadata: z.ZodOptional<z.ZodObject<{
286
+ callId: z.ZodString;
287
+ locale: z.ZodOptional<z.ZodEnum<{
288
+ EN_GB: "EN_GB";
289
+ EN_US: "EN_US";
290
+ }>>;
291
+ storytellingEffort: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
292
+ none: "none";
293
+ low: "low";
294
+ medium: "medium";
295
+ high: "high";
296
+ }>>>;
297
+ budget: z.ZodOptional<z.ZodObject<{
298
+ maxWallClockMs: z.ZodOptional<z.ZodNumber>;
299
+ maxTotalTokens: z.ZodOptional<z.ZodNumber>;
300
+ maxCostUsd: z.ZodOptional<z.ZodNumber>;
301
+ }, z.core.$strip>>;
302
+ }, z.core.$strip>>;
303
+ maxSuggestionCount: z.ZodOptional<z.ZodNumber>;
304
+ }, z.core.$strip>;
305
+ type GenerateSuggestionsParams = z.input<typeof GenerateSuggestionsParamsSchema>;
281
306
  declare const AiChartTypeEnum: z.ZodEnum<{
282
307
  line: "line";
283
308
  bar: "bar";
@@ -332,7 +357,6 @@ declare const GenerateNarrativeResponseSchema: z.ZodObject<{
332
357
  config: z.ZodType<GraphConfig, unknown, z.core.$ZodTypeInternals<GraphConfig, unknown>>;
333
358
  }, z.core.$strip>;
334
359
  type GenerateNarrativeResponse = z.infer<typeof GenerateNarrativeResponseSchema>;
335
- type GenerateSuggestionsParams = GraphGenerationRequest;
336
360
  declare const GenerateSuggestionsResponseSchema: z.ZodObject<{
337
361
  suggestions: z.ZodArray<z.ZodObject<{
338
362
  dataPrepPrompt: z.ZodString;
@@ -363,20 +387,51 @@ type GenerateSuggestionsResponse = z.infer<typeof GenerateSuggestionsResponseSch
363
387
  type GenerateExplorationParams = GraphGenerationRequest;
364
388
  /** A single structured finding produced by the explore agent. */
365
389
  declare const ExploreFindingSchema: z.ZodObject<{
366
- answer: z.ZodString;
390
+ finding: z.ZodString;
367
391
  confidence: z.ZodNumber;
392
+ relevance: z.ZodNumber;
393
+ topic: z.ZodString;
394
+ chartHint: z.ZodString;
368
395
  evidenceSummary: z.ZodString;
369
396
  }, z.core.$strip>;
370
397
  type ExploreFinding = z.infer<typeof ExploreFindingSchema>;
398
+ /**
399
+ * A story is a group of {@link ExploreFinding}s that share the same `topic`. The server
400
+ * builds this view from the flat findings array; the agent itself only emits the flat
401
+ * list. Stories are sorted by `score` (max child quadrant score) desc, tiebreak on
402
+ * `count` desc. Findings inside a story are sorted by their own quadrant score desc.
403
+ */
404
+ declare const ExploreStorySchema: z.ZodObject<{
405
+ topic: z.ZodString;
406
+ score: z.ZodNumber;
407
+ count: z.ZodNumber;
408
+ findings: z.ZodArray<z.ZodObject<{
409
+ finding: z.ZodString;
410
+ confidence: z.ZodNumber;
411
+ relevance: z.ZodNumber;
412
+ topic: z.ZodString;
413
+ chartHint: z.ZodString;
414
+ evidenceSummary: z.ZodString;
415
+ }, z.core.$strip>>;
416
+ }, z.core.$strip>;
417
+ type ExploreStory = z.infer<typeof ExploreStorySchema>;
371
418
  declare const GenerateExplorationResponseSchema: z.ZodObject<{
372
419
  response: z.ZodObject<{
373
420
  message: z.ZodString;
374
421
  steps: z.ZodArray<z.ZodString>;
375
422
  }, z.core.$strip>;
376
- findings: z.ZodArray<z.ZodObject<{
377
- answer: z.ZodString;
378
- confidence: z.ZodNumber;
379
- evidenceSummary: z.ZodString;
423
+ stories: z.ZodArray<z.ZodObject<{
424
+ topic: z.ZodString;
425
+ score: z.ZodNumber;
426
+ count: z.ZodNumber;
427
+ findings: z.ZodArray<z.ZodObject<{
428
+ finding: z.ZodString;
429
+ confidence: z.ZodNumber;
430
+ relevance: z.ZodNumber;
431
+ topic: z.ZodString;
432
+ chartHint: z.ZodString;
433
+ evidenceSummary: z.ZodString;
434
+ }, z.core.$strip>>;
380
435
  }, z.core.$strip>>;
381
436
  }, z.core.$strip>;
382
437
  type GenerateExplorationResponse = z.infer<typeof GenerateExplorationResponseSchema>;
@@ -389,6 +444,15 @@ declare const GenerateAnnotationsResponseSchema: z.ZodObject<{
389
444
  config: z.ZodType<GraphConfig, unknown, z.core.$ZodTypeInternals<GraphConfig, unknown>>;
390
445
  }, z.core.$strip>;
391
446
  type GenerateAnnotationsResponse = z.infer<typeof GenerateAnnotationsResponseSchema>;
447
+ type GenerateMutationParams = GraphGenerationRequest;
448
+ declare const GenerateMutationResponseSchema: z.ZodObject<{
449
+ response: z.ZodObject<{
450
+ message: z.ZodString;
451
+ steps: z.ZodArray<z.ZodString>;
452
+ }, z.core.$strip>;
453
+ config: z.ZodType<GraphConfig, unknown, z.core.$ZodTypeInternals<GraphConfig, unknown>>;
454
+ }, z.core.$strip>;
455
+ type GenerateMutationResponse = z.infer<typeof GenerateMutationResponseSchema>;
392
456
  interface StorytellingOptions {
393
457
  excludeTitle?: boolean;
394
458
  excludeSubtitle?: boolean;
@@ -540,10 +604,18 @@ declare class GraphyAiSdk {
540
604
  message: string;
541
605
  steps: string[];
542
606
  };
543
- findings: {
544
- answer: string;
545
- confidence: number;
546
- evidenceSummary: string;
607
+ stories: {
608
+ topic: string;
609
+ score: number;
610
+ count: number;
611
+ findings: {
612
+ finding: string;
613
+ confidence: number;
614
+ relevance: number;
615
+ topic: string;
616
+ chartHint: string;
617
+ evidenceSummary: string;
618
+ }[];
547
619
  }[];
548
620
  }>;
549
621
  /**
@@ -559,10 +631,18 @@ declare class GraphyAiSdk {
559
631
  message: string;
560
632
  steps: string[];
561
633
  };
562
- findings: {
563
- answer: string;
564
- confidence: number;
565
- evidenceSummary: string;
634
+ stories: {
635
+ topic: string;
636
+ score: number;
637
+ count: number;
638
+ findings: {
639
+ finding: string;
640
+ confidence: number;
641
+ relevance: number;
642
+ topic: string;
643
+ chartHint: string;
644
+ evidenceSummary: string;
645
+ }[];
566
646
  }[];
567
647
  }>>>;
568
648
  /**
@@ -596,9 +676,42 @@ declare class GraphyAiSdk {
596
676
  };
597
677
  config: _graphysdk_core_node.GraphConfig;
598
678
  }>>>;
679
+ /**
680
+ * Runs the mutate agent to apply dataset transformations (filter, select, derive,
681
+ * group-by, rename, etc.) to the chart's dataset based on the user prompt.
682
+ *
683
+ * @param data - Parameters including the chart config and the user prompt.
684
+ * @param onProgress - Optional callback invoked with progress updates.
685
+ * @param signal - Optional `AbortSignal` to cancel the request.
686
+ * @returns The agent response message, the ordered list of applied step names,
687
+ * and the updated chart config containing the mutated dataset.
688
+ * @throws {GraphyApiError} When the API returns an error or the network request fails.
689
+ */
690
+ generateMutation(data: GenerateMutationParams, onProgress?: ProgressHandler, signal?: AbortSignal): Promise<{
691
+ response: {
692
+ message: string;
693
+ steps: string[];
694
+ };
695
+ config: _graphysdk_core_node.GraphConfig;
696
+ }>;
697
+ /**
698
+ * Streams mutate agent events via SSE.
699
+ *
700
+ * @param data - Parameters including the chart config and the user prompt.
701
+ * @param signal - Optional `AbortSignal` to cancel the request.
702
+ * @returns An async iterator yielding {@link SSEEvent} objects.
703
+ * @throws {GraphyApiError} When the API returns an error or the network request fails.
704
+ */
705
+ generateMutationStream(data: GenerateMutationParams, signal?: AbortSignal): Promise<AsyncIterableIterator<SSEEvent<{
706
+ response: {
707
+ message: string;
708
+ steps: string[];
709
+ };
710
+ config: _graphysdk_core_node.GraphConfig;
711
+ }>>>;
599
712
  private stripStorytelling;
600
713
  private wrapStreamWithStorytellingStripping;
601
714
  }
602
715
 
603
- export { AiChartTypeEnum, ExploreFindingSchema, GenerateAnnotationsResponseSchema, GenerateExplorationResponseSchema, GenerateGraphResponseSchema, GenerateNarrativeResponseSchema, GenerateSuggestionsResponseSchema, GraphGenerationRequestSchema, GraphyAiSdk, GraphyApiError, InvocationBudgetSchema, MAX_USER_PROMPT_LENGTH, MetadataSchema, StorytellingEffortSchema, SuggestionSchema, isCompleteEvent, isErrorEvent, isGraphyApiError, isProgressEvent };
604
- export type { AiChartType, ClientConfig, CompleteEvent, ErrorEvent, ExploreFinding, GenerateAnnotationsParams, GenerateAnnotationsResponse, GenerateExplorationParams, GenerateExplorationResponse, GenerateGraphParams, GenerateGraphResponse, GenerateNarrativeParams, GenerateNarrativeResponse, GenerateSuggestionsParams, GenerateSuggestionsResponse, GraphGenerationRequest, GraphyApiErrorOptions, InvocationBudget, Logger, Metadata, ProgressEvent, ProgressHandler, RetryConfig, SSEEvent, StorytellingEffort, StorytellingOptions, Suggestion };
716
+ export { AiChartTypeEnum, ExploreFindingSchema, ExploreStorySchema, GenerateAnnotationsResponseSchema, GenerateExplorationResponseSchema, GenerateGraphResponseSchema, GenerateMutationResponseSchema, GenerateNarrativeResponseSchema, GenerateSuggestionsParamsSchema, GenerateSuggestionsResponseSchema, GraphGenerationRequestSchema, GraphyAiSdk, GraphyApiError, InvocationBudgetSchema, MAX_USER_PROMPT_LENGTH, MetadataSchema, StorytellingEffortSchema, SuggestionSchema, isCompleteEvent, isErrorEvent, isGraphyApiError, isProgressEvent };
717
+ export type { AiChartType, ClientConfig, CompleteEvent, ErrorEvent, ExploreFinding, ExploreStory, GenerateAnnotationsParams, GenerateAnnotationsResponse, GenerateExplorationParams, GenerateExplorationResponse, GenerateGraphParams, GenerateGraphResponse, GenerateMutationParams, GenerateMutationResponse, GenerateNarrativeParams, GenerateNarrativeResponse, GenerateSuggestionsParams, GenerateSuggestionsResponse, GraphGenerationRequest, GraphyApiErrorOptions, InvocationBudget, Logger, Metadata, ProgressEvent, ProgressHandler, RetryConfig, SSEEvent, StorytellingEffort, StorytellingOptions, Suggestion };
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import{__awaiter as t,__asyncValues as e,__asyncGenerator as r,__await as o,__rest as i}from"tslib";import{z as n}from"zod";class s extends Error{constructor(t,e){var r;super(t),Object.setPrototypeOf(this,new.target.prototype),this.name="GraphyApiError",this.status=null==e?void 0:e.status,this.code=null==e?void 0:e.code,this.retryable=null!==(r=null==e?void 0:e.retryable)&&void 0!==r&&r}}const a=t=>t instanceof s,l=t=>"progress"===t.type,c=t=>"complete"===t.type,g=t=>"error"===t.type;class d{constructor(t){if(this.tag="[GRAPHY]",!t.apiKey||0===t.apiKey.trim().length)throw new Error("apiKey is required and must not be empty");const e=new URL(t.baseUrl);if(!["http:","https:"].includes(e.protocol))throw new Error(`Invalid baseUrl protocol: ${e.protocol}. Only http(s) is allowed.`);this.apiKey=t.apiKey,this.baseUrl=e.origin+e.pathname.replace(/\/$/,""),this.timeout=t.timeout||6e4,this.retryConfig=t.retryConfig||{attempts:3,delay:1e3,backoff:2},this.logger=t.logger||{log:console.log,warn:console.warn,error:console.error,debug:console.debug}}static isProgressEvent(t){return l(t)}static isCompleteEvent(t){return c(t)}static isErrorEvent(t){return g(t)}stream(e,r,o){return t(this,void 0,void 0,function*(){const t=yield this.makeRequest(e,r,o);return this.parseSSE(t)})}fetch(r,o,i,n){return t(this,void 0,void 0,function*(){var t,a,d,h,u;const p=Date.now();this.logger.debug(`${this.tag} Fetch: ${r}`);try{const b=yield this.makeRequest(r,o,n),v=b.headers.get("content-type");if(null==v?void 0:v.includes("text/event-stream")){try{for(var y,f=!0,m=e(this.parseSSE(b));!(t=(y=yield m.next()).done);f=!0){h=y.value,f=!1;const t=h;if(l(t)&&i&&i(t),c(t))return t.data;if(g(t)){const e=Date.now()-p;throw this.logger.error(`${this.tag} Server error: ${r} ${e}ms`,t.error),new s(t.error,{code:t.code,retryable:null!==(u=t.retryable)&&void 0!==u&&u})}}}catch(t){a={error:t}}finally{try{f||t||!(d=m.return)||(yield d.call(m))}finally{if(a)throw a.error}}const o=Date.now()-p;throw this.logger.error(`${this.tag} Stream incomplete: ${r} ${o}ms`),new s("Stream ended without completion")}return yield b.json()}catch(t){const e=Date.now()-p;if(this.logger.error(`${this.tag} Fetch failed: ${r} ${e}ms`,t),t instanceof s)throw t;throw t}finally{const t=Date.now()-p;this.logger.debug(`${this.tag} Fetch completed: ${r} ${t}ms`)}})}ping(){return t(this,void 0,void 0,function*(){const t=Date.now();try{return yield this.makeRequest("/health",void 0,void 0,this.retryConfig.attempts,"GET"),{ok:!0,latency:Date.now()-t}}catch(e){return{ok:!1,latency:Date.now()-t}}})}sleep(e){return t(this,void 0,void 0,function*(){return new Promise(t=>setTimeout(t,e))})}parseSSE(t){return r(this,arguments,function*(){if(!t.body)throw new s("Response body is null");const e=t.body.getReader(),r=new TextDecoder;let i="",n="",a="";try{for(;;){const{done:t,value:s}=yield o(e.read());if(t)break;i+=r.decode(s,{stream:!0});const l=i.split(/\r?\n/);i=l.pop()||"";for(const t of l)if(t.startsWith("event: "))n=t.slice(7).trim();else if(t.startsWith("data: "))a+=(a?"\n":"")+t.slice(6);else if(""===t.trim()&&a){try{const t=JSON.parse(a);let e;if("progress"===n){const r=t;e=Object.assign({type:"progress"},r)}else if("complete"===n)e={type:"complete",data:t};else{if("error"!==n){n="",a="";continue}{const r=t;e=Object.assign({type:"error"},r)}}if(yield yield o(e),"complete"===n||"error"===n)return yield o(void 0)}catch(t){this.logger.warn("Invalid SSE data format",a)}n="",a=""}}}finally{e.releaseLock()}})}makeRequest(e,r,o){return t(this,arguments,void 0,function*(t,e,r,o=1,i="POST"){if(!t.startsWith("/"))throw new s("Invalid endpoint: must start with /");const n=new URL(t,this.baseUrl);if(n.origin!==new URL(this.baseUrl).origin)throw new s("Endpoint resolved to unexpected origin");this.logger.debug(`${this.tag} Request ${o}/${this.retryConfig.attempts}: ${n}`);const a=new AbortController,l=setTimeout(()=>a.abort(),this.timeout),c=()=>a.abort();r&&r.addEventListener("abort",c);try{const l=yield fetch(n,Object.assign({method:i,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"===i&&{body:JSON.stringify(e)}));if(!l.ok){const n=l.status>=500||429===l.status;let a,c=`HTTP ${l.status}`;try{const t=yield l.json();if("object"==typeof t&&null!==t){const e=t;"string"==typeof e.message?c=e.message:"string"==typeof e.error&&(c=e.error),"string"==typeof e.code&&(a=e.code)}}catch(t){}const g=new s(c,{status:l.status,code:a,retryable:n});if(n&&o<this.retryConfig.attempts&&!(null==r?void 0:r.aborted)){const n=this.retryConfig.delay*Math.pow(this.retryConfig.backoff,o-1);return this.logger.warn(`${this.tag} Retrying ${t} in ${n}ms (attempt ${o+1})`),yield this.sleep(n),this.makeRequest(t,e,r,o+1,i)}throw this.logger.error(`${this.tag} Request failed: ${t} (${l.status}) - ${c}`),g}return this.logger.debug(`${this.tag} Connected: ${t}`),l}catch(n){if(n instanceof s)throw n;if(n instanceof Error&&"AbortError"===n.name)throw this.logger.debug(`${this.tag} Aborted: ${t}`),n;if(o<this.retryConfig.attempts&&!(null==r?void 0:r.aborted)){const n=this.retryConfig.delay*Math.pow(this.retryConfig.backoff,o-1);return this.logger.warn(`${this.tag} Network error, retrying ${t} in ${n}ms`),yield this.sleep(n),this.makeRequest(t,e,r,o+1,i)}throw this.logger.error(`${this.tag} Network error: ${t}`,n),new s("Network error",{retryable:!0})}finally{clearTimeout(l),r&&r.removeEventListener("abort",c)}})}}const h=n.enum(["EN_GB","EN_US"]),u=n.custom(t=>null!=t&&"object"==typeof t),p=n.enum(["none","low","medium","high"]),y=n.object({maxWallClockMs:n.number().positive().optional(),maxTotalTokens:n.number().int().positive().optional(),maxCostUsd:n.number().positive().optional()}),f=n.object({callId:n.string().max(256),locale:h.optional(),storytellingEffort:p.optional().default("low"),budget:y.optional()}),m=1e4,b=n.object({config:u,userPrompt:n.string().max(1e4).optional().default(""),metadata:f.optional()}),v=n.enum(["line","bar","groupedBar","stackedBar","100StackedBar","column","groupedColumn","stackedColumn","100StackedColumn","combo","pie","donut","funnel","heatmap","scatter","bubble","waterfall","table"]),w=n.object({dataPrepPrompt:n.string(),chartType:v,summary:n.string()}),$=n.object({response:n.object({message:n.string()}),config:u}),S=n.object({suggestions:n.array(w)}),j=n.object({answer:n.string().describe("Direct answer for this finding."),confidence:n.number().min(0).max(1).describe("Confidence between 0 and 1."),evidenceSummary:n.string().max(300).describe("Short prose summary of the statistical evidence.")}),O=n.object({response:n.object({message:n.string(),steps:n.array(n.string())}),findings:n.array(j)}),k=n.object({response:n.object({message:n.string(),steps:n.array(n.string())}),config:u}),C=n.object({config:u,response:n.object({message:n.string(),steps:n.array(n.string())})}),E="/api/v0";class x{constructor(t){this.client=new d(t)}generateGraph(e,r,o){return t(this,void 0,void 0,function*(){const{storytellingOptions:t}=e,n=i(e,["storytellingOptions"]),s=yield this.client.fetch(`${E}/generate`,n,r,o),a=C.parse(s);return this.stripStorytelling(a,t)})}generateGraphStream(e,r){return t(this,void 0,void 0,function*(){const{storytellingOptions:t}=e,o=i(e,["storytellingOptions"]),n=yield this.client.stream(`${E}/generate`,o,r);return this.wrapStreamWithStorytellingStripping(n,t)})}generateNarrative(e,r,o){return t(this,void 0,void 0,function*(){const t=yield this.client.fetch(`${E}/narrate`,e,r,o);return $.parse(t)})}generateNarrativeStream(e,r){return t(this,void 0,void 0,function*(){return this.client.stream(`${E}/narrate`,e,r)})}generateSuggestions(e,r,o){return t(this,void 0,void 0,function*(){const t=yield this.client.fetch(`${E}/suggestions`,e,r,o);return S.parse(t)})}generateSuggestionsStream(e,r){return t(this,void 0,void 0,function*(){return this.client.stream(`${E}/suggestions`,e,r)})}generateExploration(e,r,o){return t(this,void 0,void 0,function*(){const t=yield this.client.fetch(`${E}/explore`,e,r,o);return O.parse(t)})}generateExplorationStream(e,r){return t(this,void 0,void 0,function*(){return this.client.stream(`${E}/explore`,e,r)})}generateAnnotations(e,r,o){return t(this,void 0,void 0,function*(){const t=yield this.client.fetch(`${E}/annotate`,e,r,o);return k.parse(t)})}generateAnnotationsStream(e,r){return t(this,void 0,void 0,function*(){return this.client.stream(`${E}/annotate`,e,r)})}stripStorytelling(t,e){return e&&t.config.content?Object.assign(Object.assign({},t),{config:Object.assign(Object.assign({},t.config),{content:Object.assign(Object.assign(Object.assign(Object.assign({},t.config.content),e.excludeTitle&&{title:void 0}),e.excludeSubtitle&&{subtitle:void 0}),e.excludeCaption&&{caption:void 0})})}):t}wrapStreamWithStorytellingStripping(t,i){return r(this,arguments,function*(){var r,n,s,a;try{for(var l,g=!0,d=e(t);!(r=(l=yield o(d.next())).done);g=!0){a=l.value,g=!1;const t=a;if(c(t)){const e=this.stripStorytelling(t.data,i);yield yield o(Object.assign(Object.assign({},t),{data:e}))}else yield yield o(t)}}catch(t){n={error:t}}finally{try{g||r||!(s=d.return)||(yield o(s.call(d)))}finally{if(n)throw n.error}}})}}export{v as AiChartTypeEnum,j as ExploreFindingSchema,k as GenerateAnnotationsResponseSchema,O as GenerateExplorationResponseSchema,C as GenerateGraphResponseSchema,$ as GenerateNarrativeResponseSchema,S as GenerateSuggestionsResponseSchema,b as GraphGenerationRequestSchema,x as GraphyAiSdk,s as GraphyApiError,y as InvocationBudgetSchema,m as MAX_USER_PROMPT_LENGTH,f as MetadataSchema,p as StorytellingEffortSchema,w as SuggestionSchema,c as isCompleteEvent,g as isErrorEvent,a as isGraphyApiError,l as isProgressEvent};
1
+ import{__awaiter as t,__asyncValues as e,__asyncGenerator as r,__await as i,__rest as n}from"tslib";import{z as o}from"zod";class s extends Error{constructor(t,e){var r;super(t),Object.setPrototypeOf(this,new.target.prototype),this.name="GraphyApiError",this.status=null==e?void 0:e.status,this.code=null==e?void 0:e.code,this.retryable=null!==(r=null==e?void 0:e.retryable)&&void 0!==r&&r}}const a=t=>t instanceof s,c=t=>"progress"===t.type,l=t=>"complete"===t.type,g=t=>"error"===t.type;class d{constructor(t){if(this.tag="[GRAPHY]",!t.apiKey||0===t.apiKey.trim().length)throw new Error("apiKey is required and must not be empty");const e=new URL(t.baseUrl);if(!["http:","https:"].includes(e.protocol))throw new Error(`Invalid baseUrl protocol: ${e.protocol}. Only http(s) is allowed.`);this.apiKey=t.apiKey,this.baseUrl=e.origin+e.pathname.replace(/\/$/,""),this.timeout=t.timeout||6e4,this.retryConfig=t.retryConfig||{attempts:3,delay:1e3,backoff:2},this.logger=t.logger||{log:console.log,warn:console.warn,error:console.error,debug:console.debug}}static isProgressEvent(t){return c(t)}static isCompleteEvent(t){return l(t)}static isErrorEvent(t){return g(t)}stream(e,r,i){return t(this,void 0,void 0,function*(){const t=yield this.makeRequest(e,r,i);return this.parseSSE(t)})}fetch(r,i,n,o){return t(this,void 0,void 0,function*(){var t,a,d,u,h;const p=Date.now();this.logger.debug(`${this.tag} Fetch: ${r}`);try{const b=yield this.makeRequest(r,i,o),v=b.headers.get("content-type");if(null==v?void 0:v.includes("text/event-stream")){try{for(var m,f=!0,y=e(this.parseSSE(b));!(t=(m=yield y.next()).done);f=!0){u=m.value,f=!1;const t=u;if(c(t)&&n&&n(t),l(t))return t.data;if(g(t)){const e=Date.now()-p;throw this.logger.error(`${this.tag} Server error: ${r} ${e}ms`,t.error),new s(t.error,{code:t.code,retryable:null!==(h=t.retryable)&&void 0!==h&&h})}}}catch(t){a={error:t}}finally{try{f||t||!(d=y.return)||(yield d.call(y))}finally{if(a)throw a.error}}const i=Date.now()-p;throw this.logger.error(`${this.tag} Stream incomplete: ${r} ${i}ms`),new s("Stream ended without completion")}return yield b.json()}catch(t){const e=Date.now()-p;if(this.logger.error(`${this.tag} Fetch failed: ${r} ${e}ms`,t),t instanceof s)throw t;throw t}finally{const t=Date.now()-p;this.logger.debug(`${this.tag} Fetch completed: ${r} ${t}ms`)}})}ping(){return t(this,void 0,void 0,function*(){const t=Date.now();try{return yield this.makeRequest("/health",void 0,void 0,this.retryConfig.attempts,"GET"),{ok:!0,latency:Date.now()-t}}catch(e){return{ok:!1,latency:Date.now()-t}}})}sleep(e){return t(this,void 0,void 0,function*(){return new Promise(t=>setTimeout(t,e))})}parseSSE(t){return r(this,arguments,function*(){if(!t.body)throw new s("Response body is null");const e=t.body.getReader(),r=new TextDecoder;let n="",o="",a="";try{for(;;){const{done:t,value:s}=yield i(e.read());if(t)break;n+=r.decode(s,{stream:!0});const c=n.split(/\r?\n/);n=c.pop()||"";for(const t of c)if(t.startsWith("event: "))o=t.slice(7).trim();else if(t.startsWith("data: "))a+=(a?"\n":"")+t.slice(6);else if(""===t.trim()&&a){try{const t=JSON.parse(a);let e;if("progress"===o){const r=t;e=Object.assign({type:"progress"},r)}else if("complete"===o)e={type:"complete",data:t};else{if("error"!==o){o="",a="";continue}{const r=t;e=Object.assign({type:"error"},r)}}if(yield yield i(e),"complete"===o||"error"===o)return yield i(void 0)}catch(t){this.logger.warn("Invalid SSE data format",a)}o="",a=""}}}finally{e.releaseLock()}})}makeRequest(e,r,i){return t(this,arguments,void 0,function*(t,e,r,i=1,n="POST"){if(!t.startsWith("/"))throw new s("Invalid endpoint: must start with /");const o=new URL(t,this.baseUrl);if(o.origin!==new URL(this.baseUrl).origin)throw new s("Endpoint resolved to unexpected origin");this.logger.debug(`${this.tag} Request ${i}/${this.retryConfig.attempts}: ${o}`);const a=new AbortController,c=setTimeout(()=>a.abort(),this.timeout),l=()=>a.abort();r&&r.addEventListener("abort",l);try{const c=yield fetch(o,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(e)}));if(!c.ok){const o=c.status>=500||429===c.status;let a,l=`HTTP ${c.status}`;try{const t=yield c.json();if("object"==typeof t&&null!==t){const e=t;"string"==typeof e.message?l=e.message:"string"==typeof e.error&&(l=e.error),"string"==typeof e.code&&(a=e.code)}}catch(t){}const g=new s(l,{status:c.status,code:a,retryable:o});if(o&&i<this.retryConfig.attempts&&!(null==r?void 0:r.aborted)){const o=this.retryConfig.delay*Math.pow(this.retryConfig.backoff,i-1);return this.logger.warn(`${this.tag} Retrying ${t} in ${o}ms (attempt ${i+1})`),yield this.sleep(o),this.makeRequest(t,e,r,i+1,n)}throw this.logger.error(`${this.tag} Request failed: ${t} (${c.status}) - ${l}`),g}return this.logger.debug(`${this.tag} Connected: ${t}`),c}catch(o){if(o instanceof s)throw o;if(o instanceof Error&&"AbortError"===o.name)throw this.logger.debug(`${this.tag} Aborted: ${t}`),o;if(i<this.retryConfig.attempts&&!(null==r?void 0:r.aborted)){const o=this.retryConfig.delay*Math.pow(this.retryConfig.backoff,i-1);return this.logger.warn(`${this.tag} Network error, retrying ${t} in ${o}ms`),yield this.sleep(o),this.makeRequest(t,e,r,i+1,n)}throw this.logger.error(`${this.tag} Network error: ${t}`,o),new s("Network error",{retryable:!0})}finally{clearTimeout(c),r&&r.removeEventListener("abort",l)}})}}const u=o.enum(["EN_GB","EN_US"]),h=o.custom(t=>null!=t&&"object"==typeof t),p=o.enum(["none","low","medium","high"]),m=o.object({maxWallClockMs:o.number().positive().optional(),maxTotalTokens:o.number().int().positive().optional(),maxCostUsd:o.number().positive().optional()}),f=o.object({callId:o.string().max(256),locale:u.optional(),storytellingEffort:p.optional().default("low"),budget:m.optional()}),y=1e4,b=o.object({config:h,userPrompt:o.string().max(1e4).optional().default(""),metadata:f.optional()}),v=b.extend({maxSuggestionCount:o.number().int().min(1).max(4).optional()}),w=o.enum(["line","bar","groupedBar","stackedBar","100StackedBar","column","groupedColumn","stackedColumn","100StackedColumn","combo","pie","donut","funnel","heatmap","scatter","bubble","waterfall","table"]),$=o.object({dataPrepPrompt:o.string(),chartType:w,summary:o.string()}),S=o.object({response:o.object({message:o.string()}),config:h}),j=o.object({suggestions:o.array($)}),x=o.object({finding:o.string().describe("Plain-English summary of the finding (no stats jargon)."),confidence:o.number().min(0).max(1).describe("Statistical strength of the finding (0..1). Independent of topicality."),relevance:o.number().min(0).max(1).describe("Topical fit with the user prompt and chart narrative (0..1). Independent of statistical strength."),topic:o.string().min(1).describe("Kebab-case label grouping this finding with related ones; consumers can render findings as threads."),chartHint:o.string().min(1).max(240).describe("Natural-language prescriptive recipe for a downstream mutate+chart agent: filter → group → aggregate → sort → render → highlight, naming real dataset columns."),evidenceSummary:o.string().max(300).describe("Rigorous statistical back-up with exact numbers.")}),k=o.object({topic:o.string().min(1).describe("Kebab-case story headline shared by all child findings."),score:o.number().min(0).max(1).describe("Max quadrant score (relevance × confidence) across child findings."),count:o.number().int().min(1).describe("Number of findings in this story."),findings:o.array(x).describe("Child findings, sorted by quadrant score desc.")}),C=o.object({response:o.object({message:o.string(),steps:o.array(o.string())}),stories:o.array(k)}),E=o.object({response:o.object({message:o.string(),steps:o.array(o.string())}),config:h}),O=o.object({response:o.object({message:o.string(),steps:o.array(o.string())}),config:h}),R=o.object({config:h,response:o.object({message:o.string(),steps:o.array(o.string())})}),T="/api/v0";class q{constructor(t){this.client=new d(t)}generateGraph(e,r,i){return t(this,void 0,void 0,function*(){const{storytellingOptions:t}=e,o=n(e,["storytellingOptions"]),s=yield this.client.fetch(`${T}/generate`,o,r,i),a=R.parse(s);return this.stripStorytelling(a,t)})}generateGraphStream(e,r){return t(this,void 0,void 0,function*(){const{storytellingOptions:t}=e,i=n(e,["storytellingOptions"]),o=yield this.client.stream(`${T}/generate`,i,r);return this.wrapStreamWithStorytellingStripping(o,t)})}generateNarrative(e,r,i){return t(this,void 0,void 0,function*(){const t=yield this.client.fetch(`${T}/narrate`,e,r,i);return S.parse(t)})}generateNarrativeStream(e,r){return t(this,void 0,void 0,function*(){return this.client.stream(`${T}/narrate`,e,r)})}generateSuggestions(e,r,i){return t(this,void 0,void 0,function*(){const t=yield this.client.fetch(`${T}/suggestions`,e,r,i);return j.parse(t)})}generateSuggestionsStream(e,r){return t(this,void 0,void 0,function*(){return this.client.stream(`${T}/suggestions`,e,r)})}generateExploration(e,r,i){return t(this,void 0,void 0,function*(){const t=yield this.client.fetch(`${T}/explore`,e,r,i);return C.parse(t)})}generateExplorationStream(e,r){return t(this,void 0,void 0,function*(){return this.client.stream(`${T}/explore`,e,r)})}generateAnnotations(e,r,i){return t(this,void 0,void 0,function*(){const t=yield this.client.fetch(`${T}/annotate`,e,r,i);return E.parse(t)})}generateAnnotationsStream(e,r){return t(this,void 0,void 0,function*(){return this.client.stream(`${T}/annotate`,e,r)})}generateMutation(e,r,i){return t(this,void 0,void 0,function*(){const t=yield this.client.fetch(`${T}/mutate`,e,r,i);return O.parse(t)})}generateMutationStream(e,r){return t(this,void 0,void 0,function*(){return this.client.stream(`${T}/mutate`,e,r)})}stripStorytelling(t,e){return e&&t.config.content?Object.assign(Object.assign({},t),{config:Object.assign(Object.assign({},t.config),{content:Object.assign(Object.assign(Object.assign(Object.assign({},t.config.content),e.excludeTitle&&{title:void 0}),e.excludeSubtitle&&{subtitle:void 0}),e.excludeCaption&&{caption:void 0})})}):t}wrapStreamWithStorytellingStripping(t,n){return r(this,arguments,function*(){var r,o,s,a;try{for(var c,g=!0,d=e(t);!(r=(c=yield i(d.next())).done);g=!0){a=c.value,g=!1;const t=a;if(l(t)){const e=this.stripStorytelling(t.data,n);yield yield i(Object.assign(Object.assign({},t),{data:e}))}else yield yield i(t)}}catch(t){o={error:t}}finally{try{g||r||!(s=d.return)||(yield i(s.call(d)))}finally{if(o)throw o.error}}})}}export{w as AiChartTypeEnum,x as ExploreFindingSchema,k as ExploreStorySchema,E as GenerateAnnotationsResponseSchema,C as GenerateExplorationResponseSchema,R as GenerateGraphResponseSchema,O as GenerateMutationResponseSchema,S as GenerateNarrativeResponseSchema,v as GenerateSuggestionsParamsSchema,j as GenerateSuggestionsResponseSchema,b as GraphGenerationRequestSchema,q as GraphyAiSdk,s as GraphyApiError,m as InvocationBudgetSchema,y as MAX_USER_PROMPT_LENGTH,f as MetadataSchema,p as StorytellingEffortSchema,$ as SuggestionSchema,l as isCompleteEvent,g as isErrorEvent,a as isGraphyApiError,c as isProgressEvent};
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.1776177078818",
4
+ "version": "1.3.0-beta.1776260762546",
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.1776177078818"
21
+ "@graphysdk/core": "1.3.0-beta.1776260762546"
22
22
  },
23
23
  "devDependencies": {
24
24
  "@rollup/plugin-commonjs": "^28.0.6",