@graphysdk/agents-sdk 1.3.0-beta.1776247596231 → 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 +1 -1
- package/dist/index.d.ts +104 -15
- package/dist/index.mjs +1 -1
- package/package.json +2 -2
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 o=t=>"progress"===t.type,i=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 o(t)}static isCompleteEvent(t){return i(t)}static isErrorEvent(t){return n(t)}stream(e,r,o){return t.__awaiter(this,void 0,void 0,function*(){const t=yield this.makeRequest(e,r,o);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(o(t)&&a&&a(t),i(t))return t.data;if(n(t)){const o=Date.now()-u;throw this.logger.error(`${this.tag} Server error: ${e} ${o}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 o=Date.now()-u;if(this.logger.error(`${this.tag} Fetch failed: ${e} ${o}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 o=e.body.getReader(),i=new TextDecoder;let n="",s="",a="";try{for(;;){const{done:e,value:r}=yield t.__await(o.read());if(e)break;n+=i.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{o.releaseLock()}})}makeRequest(e,o,i){return t.__awaiter(this,arguments,void 0,function*(t,e,o,i=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 ${i}/${this.retryConfig.attempts}: ${s}`);const a=new AbortController,l=setTimeout(()=>a.abort(),this.timeout),c=()=>a.abort();o&&o.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&&i<this.retryConfig.attempts&&!(null==o?void 0:o.aborted)){const r=this.retryConfig.delay*Math.pow(this.retryConfig.backoff,i-1);return this.logger.warn(`${this.tag} Retrying ${t} in ${r}ms (attempt ${i+1})`),yield this.sleep(r),this.makeRequest(t,e,o,i+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(i<this.retryConfig.attempts&&!(null==o?void 0:o.aborted)){const r=this.retryConfig.delay*Math.pow(this.retryConfig.backoff,i-1);return this.logger.warn(`${this.tag} Network error, retrying ${t} in ${r}ms`),yield this.sleep(r),this.makeRequest(t,e,o,i+1,n)}throw this.logger.error(`${this.tag} Network error: ${t}`,s),new r("Network error",{retryable:!0})}finally{clearTimeout(l),o&&o.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=d.extend({maxSuggestionCount:e.z.number().int().min(1).max(4).optional()}),u=e.z.enum(["line","bar","groupedBar","stackedBar","100StackedBar","column","groupedColumn","stackedColumn","100StackedColumn","combo","pie","donut","funnel","heatmap","scatter","bubble","waterfall","table"]),y=e.z.object({dataPrepPrompt:e.z.string(),chartType:u,summary:e.z.string()}),m=e.z.object({response:e.z.object({message:e.z.string()}),config:l}),f=e.z.object({suggestions:e.z.array(y)}),b=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.")}),w=e.z.object({response:e.z.object({message:e.z.string(),steps:e.z.array(e.z.string())}),findings:e.z.array(b)}),v=e.z.object({response:e.z.object({message:e.z.string(),steps:e.z.array(e.z.string())}),config:l}),_=e.z.object({config:l,response:e.z.object({message:e.z.string(),steps:e.z.array(e.z.string())})}),S="/api/v0";exports.AiChartTypeEnum=u,exports.ExploreFindingSchema=b,exports.GenerateAnnotationsResponseSchema=v,exports.GenerateExplorationResponseSchema=w,exports.GenerateGraphResponseSchema=_,exports.GenerateNarrativeResponseSchema=m,exports.GenerateSuggestionsParamsSchema=p,exports.GenerateSuggestionsResponseSchema=f,exports.GraphGenerationRequestSchema=d,exports.GraphyAiSdk=class{constructor(t){this.client=new s(t)}generateGraph(e,r,o){return t.__awaiter(this,void 0,void 0,function*(){const{storytellingOptions:i}=e,n=t.__rest(e,["storytellingOptions"]),s=yield this.client.fetch(`${S}/generate`,n,r,o),a=_.parse(s);return this.stripStorytelling(a,i)})}generateGraphStream(e,r){return t.__awaiter(this,void 0,void 0,function*(){const{storytellingOptions:o}=e,i=t.__rest(e,["storytellingOptions"]),n=yield this.client.stream(`${S}/generate`,i,r);return this.wrapStreamWithStorytellingStripping(n,o)})}generateNarrative(e,r,o){return t.__awaiter(this,void 0,void 0,function*(){const t=yield this.client.fetch(`${S}/narrate`,e,r,o);return m.parse(t)})}generateNarrativeStream(e,r){return t.__awaiter(this,void 0,void 0,function*(){return this.client.stream(`${S}/narrate`,e,r)})}generateSuggestions(e,r,o){return t.__awaiter(this,void 0,void 0,function*(){const t=yield this.client.fetch(`${S}/suggestions`,e,r,o);return f.parse(t)})}generateSuggestionsStream(e,r){return t.__awaiter(this,void 0,void 0,function*(){return this.client.stream(`${S}/suggestions`,e,r)})}generateExploration(e,r,o){return t.__awaiter(this,void 0,void 0,function*(){const t=yield this.client.fetch(`${S}/explore`,e,r,o);return w.parse(t)})}generateExplorationStream(e,r){return t.__awaiter(this,void 0,void 0,function*(){return this.client.stream(`${S}/explore`,e,r)})}generateAnnotations(e,r,o){return t.__awaiter(this,void 0,void 0,function*(){const t=yield this.client.fetch(`${S}/annotate`,e,r,o);return v.parse(t)})}generateAnnotationsStream(e,r){return t.__awaiter(this,void 0,void 0,function*(){return this.client.stream(`${S}/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 o,n,s,a;try{for(var l,c=!0,g=t.__asyncValues(e);!(o=(l=yield t.__await(g.next())).done);c=!0){a=l.value,c=!1;const e=a;if(i(e)){const o=this.stripStorytelling(e.data,r);yield yield t.__await(Object.assign(Object.assign({},e),{data:o}))}else yield yield t.__await(e)}}catch(t){n={error:t}}finally{try{c||o||!(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=y,exports.isCompleteEvent=i,exports.isErrorEvent=n,exports.isGraphyApiError=t=>t instanceof r,exports.isProgressEvent=o;
|
|
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
|
@@ -387,20 +387,51 @@ type GenerateSuggestionsResponse = z.infer<typeof GenerateSuggestionsResponseSch
|
|
|
387
387
|
type GenerateExplorationParams = GraphGenerationRequest;
|
|
388
388
|
/** A single structured finding produced by the explore agent. */
|
|
389
389
|
declare const ExploreFindingSchema: z.ZodObject<{
|
|
390
|
-
|
|
390
|
+
finding: z.ZodString;
|
|
391
391
|
confidence: z.ZodNumber;
|
|
392
|
+
relevance: z.ZodNumber;
|
|
393
|
+
topic: z.ZodString;
|
|
394
|
+
chartHint: z.ZodString;
|
|
392
395
|
evidenceSummary: z.ZodString;
|
|
393
396
|
}, z.core.$strip>;
|
|
394
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>;
|
|
395
418
|
declare const GenerateExplorationResponseSchema: z.ZodObject<{
|
|
396
419
|
response: z.ZodObject<{
|
|
397
420
|
message: z.ZodString;
|
|
398
421
|
steps: z.ZodArray<z.ZodString>;
|
|
399
422
|
}, z.core.$strip>;
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
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>>;
|
|
404
435
|
}, z.core.$strip>>;
|
|
405
436
|
}, z.core.$strip>;
|
|
406
437
|
type GenerateExplorationResponse = z.infer<typeof GenerateExplorationResponseSchema>;
|
|
@@ -413,6 +444,15 @@ declare const GenerateAnnotationsResponseSchema: z.ZodObject<{
|
|
|
413
444
|
config: z.ZodType<GraphConfig, unknown, z.core.$ZodTypeInternals<GraphConfig, unknown>>;
|
|
414
445
|
}, z.core.$strip>;
|
|
415
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>;
|
|
416
456
|
interface StorytellingOptions {
|
|
417
457
|
excludeTitle?: boolean;
|
|
418
458
|
excludeSubtitle?: boolean;
|
|
@@ -564,10 +604,18 @@ declare class GraphyAiSdk {
|
|
|
564
604
|
message: string;
|
|
565
605
|
steps: string[];
|
|
566
606
|
};
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
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
|
+
}[];
|
|
571
619
|
}[];
|
|
572
620
|
}>;
|
|
573
621
|
/**
|
|
@@ -583,10 +631,18 @@ declare class GraphyAiSdk {
|
|
|
583
631
|
message: string;
|
|
584
632
|
steps: string[];
|
|
585
633
|
};
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
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
|
+
}[];
|
|
590
646
|
}[];
|
|
591
647
|
}>>>;
|
|
592
648
|
/**
|
|
@@ -620,9 +676,42 @@ declare class GraphyAiSdk {
|
|
|
620
676
|
};
|
|
621
677
|
config: _graphysdk_core_node.GraphConfig;
|
|
622
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
|
+
}>>>;
|
|
623
712
|
private stripStorytelling;
|
|
624
713
|
private wrapStreamWithStorytellingStripping;
|
|
625
714
|
}
|
|
626
715
|
|
|
627
|
-
export { AiChartTypeEnum, ExploreFindingSchema, GenerateAnnotationsResponseSchema, GenerateExplorationResponseSchema, GenerateGraphResponseSchema, GenerateNarrativeResponseSchema, GenerateSuggestionsParamsSchema, GenerateSuggestionsResponseSchema, GraphGenerationRequestSchema, GraphyAiSdk, GraphyApiError, InvocationBudgetSchema, MAX_USER_PROMPT_LENGTH, MetadataSchema, StorytellingEffortSchema, SuggestionSchema, isCompleteEvent, isErrorEvent, isGraphyApiError, isProgressEvent };
|
|
628
|
-
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,u,h;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){u=y.value,f=!1;const t=u;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!==(h=t.retryable)&&void 0!==h&&h})}}}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 u=n.enum(["EN_GB","EN_US"]),h=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:u.optional(),storytellingEffort:p.optional().default("low"),budget:y.optional()}),m=1e4,b=n.object({config:h,userPrompt:n.string().max(1e4).optional().default(""),metadata:f.optional()}),v=b.extend({maxSuggestionCount:n.number().int().min(1).max(4).optional()}),w=n.enum(["line","bar","groupedBar","stackedBar","100StackedBar","column","groupedColumn","stackedColumn","100StackedColumn","combo","pie","donut","funnel","heatmap","scatter","bubble","waterfall","table"]),$=n.object({dataPrepPrompt:n.string(),chartType:w,summary:n.string()}),S=n.object({response:n.object({message:n.string()}),config:h}),j=n.object({suggestions:n.array($)}),x=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.")}),C=n.object({response:n.object({message:n.string(),steps:n.array(n.string())}),findings:n.array(x)}),O=n.object({response:n.object({message:n.string(),steps:n.array(n.string())}),config:h}),k=n.object({config:h,response:n.object({message:n.string(),steps:n.array(n.string())})}),E="/api/v0";class R{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=k.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 S.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 j.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 C.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 O.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{w as AiChartTypeEnum,x as ExploreFindingSchema,O as GenerateAnnotationsResponseSchema,C as GenerateExplorationResponseSchema,k as GenerateGraphResponseSchema,S as GenerateNarrativeResponseSchema,v as GenerateSuggestionsParamsSchema,j as GenerateSuggestionsResponseSchema,b as GraphGenerationRequestSchema,R as GraphyAiSdk,s as GraphyApiError,y as InvocationBudgetSchema,m as MAX_USER_PROMPT_LENGTH,f as MetadataSchema,p as StorytellingEffortSchema,$ 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.
|
|
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.
|
|
21
|
+
"@graphysdk/core": "1.3.0-beta.1776260762546"
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|
|
24
24
|
"@rollup/plugin-commonjs": "^28.0.6",
|