@bty/feed_app-runtime-sdk 0.0.3 → 0.0.6
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/ai/index.js +3 -3
- package/dist/react/index.js +3 -3
- package/package.json +15 -19
package/dist/ai/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var
|
|
2
|
-
`)};return r="",s=[],c};try{for(;;){let{done:c,value:p}=await t.read();if(c){let i=o();i&&(yield i);return}for(n+=
|
|
3
|
-
export{S as AbortedError,m as AiError,g as AuthRequiredError,N as BadInputError,
|
|
1
|
+
var Y={version:"0.0.6"};var R="/v1/feed-app/runtime/ai",W=`${R}/models`,H=`${R}/chat/completions`,D=`${R}/messages`,z=`${R}/images/generations`,Z=`${R}/audio/speech`,ee=`${R}/video/generations`,te="Authorization",ne="x-bty-app",re="x-bty-extend",se=Y.version;var Be=/\r\n|\r|\n/,qe=(()=>{let e=new TextDecoder;return (t,n)=>e.decode(t,{stream:n})})();async function*oe(e){let t=e.getReader(),n="",r="",s=[],o=()=>{if(s.length===0&&!r)return null;let c={event:r||"message",data:s.join(`
|
|
2
|
+
`)};return r="",s=[],c};try{for(;;){let{done:c,value:p}=await t.read();if(c){let i=o();i&&(yield i);return}for(n+=qe(p,!0);;){let i=Be.exec(n);if(!i)break;let l=n.slice(0,i.index);if(n=n.slice(i.index+i[0].length),l===""){let f=o();f&&(yield f);continue}if(l.startsWith(":"))continue;let y=l.indexOf(":"),x=y===-1?l:l.slice(0,y),d=y===-1?"":l.slice(y+1);d.startsWith(" ")&&(d=d.slice(1)),x==="event"?r=d:x==="data"&&s.push(d);}}}finally{t.releaseLock();}}async function*ie(e){for await(let t of oe(e)){if(t.data==="[DONE]")return;t.data&&(yield JSON.parse(t.data));}}async function*ae(e){for await(let t of oe(e))t.data&&(yield JSON.parse(t.data));}var Ge="https://reactus-api.betteryeah.com",je=()=>{try{if(typeof __BTY_RUNTIME_API_BASE_URL__=="string"&&__BTY_RUNTIME_API_BASE_URL__.length>0)return __BTY_RUNTIME_API_BASE_URL__}catch{}},F={apiBaseUrl:(je()??Ge).replace(/\/+$/,""),projectId:""},Ve=e=>{F={...F,...e,...e.apiBaseUrl?{apiBaseUrl:e.apiBaseUrl.replace(/\/+$/,"")}:{}};},P=()=>F;var m=class extends Error{status;code;body;constructor(t,n,r,s=null){super(t),this.name="AiError",this.code=n,this.status=r,this.body=s;}},g=class extends m{constructor(t="Auth required",n=null){super(t,"auth_required",401,n),this.name="AuthRequiredError";}},k=class extends m{constructor(t="Rate limit exceeded",n=null){super(t,"rate_limit",429,n),this.name="RateLimitError";}},O=class extends m{constructor(t="Quota exceeded",n=null){super(t,"quota_exceeded",402,n),this.name="QuotaExceededError";}},N=class extends m{constructor(t,n=400,r=null){super(t,"bad_input",n,r),this.name="BadInputError";}},b=class extends m{constructor(t,n=500,r=null){super(t,"server",n,r),this.name="ServerError";}},A=class extends m{constructor(t="Network error",n){super(t,"network",-1,n),this.name="NetworkError";}},S=class extends m{constructor(t="Request aborted"){super(t,"aborted",-1,null),this.name="AbortedError";}},ce=e=>typeof e=="object"&&e!==null,Je=(e,t)=>{if(typeof e=="string")return e||t;if(!ce(e))return t;let n=e.message;if(typeof n=="string"&&n.length>0)return n;let r=e.error;if(typeof r=="string"&&r.length>0)return r;if(ce(r)&&typeof r.message=="string"&&r.message.length>0)return r.message;let s=e.detail;return typeof s=="string"&&s.length>0?s:t},B=(e,t)=>{let n=Je(t,`HTTP ${e}`);return e===401||e===403?new g(n,t):e===402?new O(n,t):e===429?new k(n,t):e>=400&&e<500?new N(n,e,t):e>=500?new b(n,e,t):new m(n,"unknown",e,t)};var u=()=>typeof window<"u"&&typeof document<"u";var $e="hostRuntime",q=class{listeners=new Map;on(t,n){let r=this.listeners.get(t),s=r??new Set;return r||this.listeners.set(t,s),s.add(n),()=>{s.delete(n),s.size===0&&this.listeners.delete(t);}}emit(t,n){let r=this.listeners.get(t);if(r)for(let s of r)s(n);}},a=new q,pe=0,G=e=>(pe+=1,`${e}.${pe}`),ue=false,le=()=>{if(!u()||ue)return;ue=true,Reflect.set(window,$e,{receiveMessage(t){if(!t)return;let n=t.endpoint;n&&a.emit(n,t.data??t);}});};var C=e=>typeof e=="object"&&e!==null,h=(e,t)=>{if(e)for(let n of t){let r=e[n];if(typeof r=="string"&&r.length>0)return r}},Qe=(e,t)=>{if(e)for(let n of t){let r=e[n];if(typeof r=="string"&&r.length>0||typeof r=="number"&&Number.isFinite(r))return r}},E=e=>{if(!C(e))return null;let t=C(e.credentials)?e.credentials:void 0,n=C(e.user)?e.user:void 0,r=h(e,["uid","userId","id"])??h(t,["uid","userId","id"])??h(n,["uid","userId","id"]),s=h(e,["token","authToken"])??h(t,["token","authToken"]);return !r||!s?null:{uid:r,token:s}},v=e=>{if(!C(e))return null;let t=C(e.data)?e.data:e,n=Qe(t,["userId","id","uid"]);if(n===void 0)return null;let r=h(t,["username","nickname","nickName","name"]),s=h(t,["nickname","nickName","username"]);return {...t,userId:n,...r?{username:r}:{},...s?{nickname:s}:{}}};var de="HostApp",j="hostListener";var me="processUserCredentials",fe="processUserInfo",Ee="user.getCredentials";var _="user.credentials",V="user.info",ge="user-credentials-request",he="user-credentials-response";var ye="user-info-response",Re={iOS:[1,6,7],Android:[1,1,8]},Ae=3e3,_e=500,Te=50,Se=1500;var Ke=e=>typeof e!="object"||e===null?false:typeof Reflect.get(e,"type")=="string",Ce=false,we=()=>{!u()||Ce||(Ce=true,le(),Reflect.set(window,me,e=>{E(e)&&a.emit(_,e);}),Reflect.set(window,fe,e=>{v(e)&&a.emit(V,e);}),window.addEventListener("message",e=>{let t=e.data;if(Ke(t))switch(t.type){case he:a.emit("iframe.credentials",t);break;case ye:a.emit("iframe.userinfo",t);break}}));};var Xe=new RegExp(`${de}\\/(\\d+\\.\\d+\\.\\d+)\\/(\\d+)\\/(iOS|Android)`),Ye=e=>{let t=e.split(".").map(n=>Number.parseInt(n,10));return [t[0]??0,t[1]??0,t[2]??0]},We=(e,t)=>{for(let n=0;n<3;n++){if(e[n]>t[n])return true;if(e[n]<t[n])return false}return true},ze=e=>{let t=e.match(Xe);if(!t)return null;let[,n,r,s]=t;if(!n||!r||s!=="iOS"&&s!=="Android")return null;let o=We(Ye(n),Re[s]);return {type:"native_app",platform:s,appVersion:n,buildNumber:r,meetsMinVersion:o}},Ie=()=>{if(!u())return {type:"web",meetsMinVersion:false};let e=ze(navigator.userAgent??"");return e||(window.parent!==window?{type:"iframe",meetsMinVersion:false}:{type:"web",meetsMinVersion:false})};var Ze=(e,t,n)=>new Promise(r=>{let s=false,o=i=>{s||(s=true,c(),clearTimeout(p),r(i));},c=a.on(t,i=>{let l=n(i);l&&o(l);}),p=setTimeout(()=>o(null),_e);try{window.parent.postMessage({type:e,timestamp:Date.now()},"*");}catch{o(null);}}),xe=()=>Ze(ge,"iframe.credentials",E);var Pe=e=>typeof e!="object"||e===null?false:typeof Reflect.get(e,"postMessage")=="function",J=e=>{let t=Reflect.get(window,"webkit");if(typeof t=="object"&&t!==null){let r=Reflect.get(t,"messageHandlers");if(typeof r=="object"&&r!==null){let s=Reflect.get(r,e);if(Pe(s))return s}}let n=Reflect.get(window,e);return Pe(n)?n:null},ke=(e,t={})=>{let{pollIntervalMs:n=50,timeoutMs:r=1500}=t;return new Promise(s=>{let o=Date.now(),c=()=>{let p=J(e);if(p){s(p);return}if(Date.now()-o>=r){s(null);return}setTimeout(c,n);};c();})};var et=async(e,t,n,r)=>{let s=e.platform==="Android"?await ke(j,{pollIntervalMs:Te,timeoutMs:Se}):J(j);if(!s)return null;let o=G(n);return new Promise(c=>{let p=false,i=d=>{p||(p=true,l(),y(),clearTimeout(x),c(d));},l=a.on(o,d=>{let f=r(d);f&&i(f);}),y=a.on(n,d=>{let f=r(d);f&&i(f);}),x=setTimeout(()=>i(null),Ae);try{s.postMessage({command:t,parameters:JSON.stringify({timestamp:Date.now(),endpoint:o})});}catch{i(null);}})},Oe=e=>et(e,Ee,_,E);we();var $=null,w=null,tt=e=>{switch(e.type){case "native_app":return e.meetsMinVersion?Oe(e):Promise.resolve(null);case "iframe":return xe();case "web":return Promise.resolve(null)}};var Ne=e=>{$=e;},be=()=>w||(w=tt(Ie()).then(e=>(e&&Ne(e),e)).finally(()=>{w=null;}),w);u()&&a.on(_,e=>{let t=E(e);t&&Ne(t);});var Q=async()=>u()?$?$.token:(await be())?.token??"":"",ve=async()=>u()?(await be())?.token??"":"";var nt=e=>JSON.stringify({"sdk-version":se,...e}),Me=async(e={})=>{let{projectId:t}=P(),n=await Q(),r=new Headers;if(n&&r.set(te,`Bearer ${n}`),t&&r.set(ne,t),r.set(re,nt(e.extend)),e.contentType&&r.set("Content-Type",e.contentType),e.accept&&r.set("Accept",e.accept),e.extra)for(let[s,o]of Object.entries(e.extra))r.set(s,o);return r};var rt="feed-app-runtime-sdk:auth-required",K=e=>{u()&&window.dispatchEvent(new CustomEvent(rt,{detail:e}));};var st=e=>e instanceof DOMException&&e.name==="AbortError",ot=async e=>{let t=e.headers.get("content-type")??"";try{return t.includes("application/json")?await e.json():await e.text()}catch{return null}},it=e=>typeof e=="object"&&e!==null,Le=(e,t)=>{if(!it(e)||typeof e.success!="boolean")return e;if(e.success)return e.data;let n=typeof e.code=="number"?e.code:t;throw B(n,e)},Ue=async(e,t)=>{let{apiBaseUrl:n}=P(),r=`${n}${e}`,s=await Me(t),o;try{o=await fetch(r,{method:t.method??"POST",headers:s,body:t.body,signal:t.signal});}catch(p){throw st(p)?new S:new A("Failed to reach AI backend",p)}if(o.ok)return o;let c=await ot(o);throw B(o.status,c)},M=async(e,t={})=>{try{return await Ue(e,t)}catch(n){if(n instanceof g&&!t.skipAuthRetry&&!t.signal?.aborted){if(!await ve())throw K({reason:"refresh_failed",error:n}),n;try{return await Ue(e,{...t,skipAuthRetry:!0})}catch(s){throw s instanceof g&&K({reason:"retry_rejected",error:s}),s}}throw n}},T=async(e,t,n={})=>{let r=await M(e,{...n,method:"POST",contentType:"application/json",body:JSON.stringify(t)});return Le(await r.json(),r.status)},He=async(e,t={})=>{let n=await M(e,{...t,method:"GET"});return Le(await n.json(),n.status)},U=async(e,t,n={})=>{let r=await M(e,{...n,method:"POST",contentType:"application/json",accept:"text/event-stream",body:JSON.stringify(t)});if(!r.body)throw new A("Streaming response has no body");return r.body},De=async(e,t,n={})=>await(await M(e,{...n,method:"POST",contentType:"application/json",body:JSON.stringify(t)})).blob();var L=e=>{let{signal:t,headers:n,...r}=e;return {transport:{signal:t,extra:n},payload:r}},at=(async e=>{let{transport:t,payload:n}=L(e);if(e.stream){let r=await U(H,n,t);return ie(r)}return await T(H,n,t)}),ct={create:at},pt={async generate(e){let{transport:t,payload:n}=L(e);return T(z,n,t)}},ut={speech:{async create(e){let{transport:t,payload:n}=L(e);return De(Z,n,t)}}},lt={generations:{async create(e){let{transport:t,payload:n}=L(e);return T(ee,n,t)}}},dt={chat:{completions:ct},images:pt,audio:ut,video:lt};var mt=e=>{let{signal:t,headers:n,...r}=e;return {transport:{signal:t,extra:n},payload:r}},ft=(async e=>{let{transport:t,payload:n}=mt(e);if(e.stream){let r=await U(D,n,t);return ae(r)}return await T(D,n,t)}),Et={messages:{create:ft}};var X=null,I=null,gt=async e=>(await He(W,{signal:e})).data??[],ht=async(e={})=>!e.force&&X?X:(!e.force&&I||(I=gt(e.signal).then(t=>(X=t,t)).finally(()=>{I=null;})),I),yt={list:ht};
|
|
3
|
+
export{S as AbortedError,m as AiError,g as AuthRequiredError,N as BadInputError,A as NetworkError,O as QuotaExceededError,k as RateLimitError,b as ServerError,Et as anthropic,Ve as configureRuntime,yt as models,dt as openai};
|
package/dist/react/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import {useState,useCallback,useEffect,useRef}from'react';var g=()=>typeof window<"u"&&typeof document<"u";var it="hostRuntime",q=class{listeners=new Map;on(t,n){let r=this.listeners.get(t),s=r??new Set;return r||this.listeners.set(t,s),s.add(n),()=>{s.delete(n),s.size===0&&this.listeners.delete(t);}}emit(t,n){let r=this.listeners.get(t);if(r)for(let s of r)s(n);}},m=new q,
|
|
2
|
-
`)};return r="",s=[],a};try{for(;;){let{done:a,value:p}=await t.read();if(a){let i=o();i&&(yield i);return}for(n+=St(p,!0);;){let i=
|
|
3
|
-
export{
|
|
1
|
+
import {useState,useCallback,useEffect,useRef}from'react';var g=()=>typeof window<"u"&&typeof document<"u";var it="hostRuntime",q=class{listeners=new Map;on(t,n){let r=this.listeners.get(t),s=r??new Set;return r||this.listeners.set(t,s),s.add(n),()=>{s.delete(n),s.size===0&&this.listeners.delete(t);}}emit(t,n){let r=this.listeners.get(t);if(r)for(let s of r)s(n);}},m=new q,ie=0,j=e=>(ie+=1,`${e}.${ie}`),ae=false,ce=()=>{if(!g()||ae)return;ae=true,Reflect.set(window,it,{receiveMessage(t){if(!t)return;let n=t.endpoint;n&&m.emit(n,t.data??t);}});};var P=e=>typeof e=="object"&&e!==null,A=(e,t)=>{if(e)for(let n of t){let r=e[n];if(typeof r=="string"&&r.length>0)return r}},at=(e,t)=>{if(e)for(let n of t){let r=e[n];if(typeof r=="string"&&r.length>0||typeof r=="number"&&Number.isFinite(r))return r}},y=e=>{if(!P(e))return null;let t=P(e.credentials)?e.credentials:void 0,n=P(e.user)?e.user:void 0,r=A(e,["uid","userId","id"])??A(t,["uid","userId","id"])??A(n,["uid","userId","id"]),s=A(e,["token","authToken"])??A(t,["token","authToken"]);return !r||!s?null:{uid:r,token:s}},T=e=>{if(!P(e))return null;let t=P(e.data)?e.data:e,n=at(t,["userId","id","uid"]);if(n===void 0)return null;let r=A(t,["username","nickname","nickName","name"]),s=A(t,["nickname","nickName","username"]);return {...t,userId:n,...r?{username:r}:{},...s?{nickname:s}:{}}};var ue="HostApp",G="hostListener";var pe="processUserCredentials",le="processUserInfo",de="user.getCredentials",me="user.getUserInfo",_="user.credentials",O="user.info",fe="user-credentials-request",ge="user-credentials-response",Ee="user-info-request",he="user-info-response",ye={iOS:[1,6,7],Android:[1,1,8]},Ae=3e3,Re=500,Te=50,_e=1500;var ct=e=>typeof e!="object"||e===null?false:typeof Reflect.get(e,"type")=="string",Se=false,we=()=>{!g()||Se||(Se=true,ce(),Reflect.set(window,pe,e=>{y(e)&&m.emit(_,e);}),Reflect.set(window,le,e=>{T(e)&&m.emit(O,e);}),window.addEventListener("message",e=>{let t=e.data;if(ct(t))switch(t.type){case ge:m.emit("iframe.credentials",t);break;case he:m.emit("iframe.userinfo",t);break}}));};var ut=new RegExp(`${ue}\\/(\\d+\\.\\d+\\.\\d+)\\/(\\d+)\\/(iOS|Android)`),pt=e=>{let t=e.split(".").map(n=>Number.parseInt(n,10));return [t[0]??0,t[1]??0,t[2]??0]},lt=(e,t)=>{for(let n=0;n<3;n++){if(e[n]>t[n])return true;if(e[n]<t[n])return false}return true},dt=e=>{let t=e.match(ut);if(!t)return null;let[,n,r,s]=t;if(!n||!r||s!=="iOS"&&s!=="Android")return null;let o=lt(pt(n),ye[s]);return {type:"native_app",platform:s,appVersion:n,buildNumber:r,meetsMinVersion:o}},V=()=>{if(!g())return {type:"web",meetsMinVersion:false};let e=dt(navigator.userAgent??"");return e||(window.parent!==window?{type:"iframe",meetsMinVersion:false}:{type:"web",meetsMinVersion:false})};var Ce=(e,t,n)=>new Promise(r=>{let s=false,o=i=>{s||(s=true,a(),clearTimeout(p),r(i));},a=m.on(t,i=>{let f=n(i);f&&o(f);}),p=setTimeout(()=>o(null),Re);try{window.parent.postMessage({type:e,timestamp:Date.now()},"*");}catch{o(null);}}),xe=()=>Ce(fe,"iframe.credentials",y),Ie=()=>Ce(Ee,"iframe.userinfo",T);var ke=e=>typeof e!="object"||e===null?false:typeof Reflect.get(e,"postMessage")=="function",J=e=>{let t=Reflect.get(window,"webkit");if(typeof t=="object"&&t!==null){let r=Reflect.get(t,"messageHandlers");if(typeof r=="object"&&r!==null){let s=Reflect.get(r,e);if(ke(s))return s}}let n=Reflect.get(window,e);return ke(n)?n:null},Pe=(e,t={})=>{let{pollIntervalMs:n=50,timeoutMs:r=1500}=t;return new Promise(s=>{let o=Date.now(),a=()=>{let p=J(e);if(p){s(p);return}if(Date.now()-o>=r){s(null);return}setTimeout(a,n);};a();})};var be=async(e,t,n,r)=>{let s=e.platform==="Android"?await Pe(G,{pollIntervalMs:Te,timeoutMs:_e}):J(G);if(!s)return null;let o=j(n);return new Promise(a=>{let p=false,i=c=>{p||(p=true,f(),h(),clearTimeout(R),a(c));},f=m.on(o,c=>{let l=r(c);l&&i(l);}),h=m.on(n,c=>{let l=r(c);l&&i(l);}),R=setTimeout(()=>i(null),Ae);try{s.postMessage({command:t,parameters:JSON.stringify({timestamp:Date.now(),endpoint:o})});}catch{i(null);}})},ve=e=>be(e,de,_,y),Oe=e=>be(e,me,O,T);we();var $=null,b=null,mt=e=>{switch(e.type){case "native_app":return e.meetsMinVersion?ve(e):Promise.resolve(null);case "iframe":return xe();case "web":return Promise.resolve(null)}},ft=e=>{switch(e.type){case "native_app":return e.meetsMinVersion?Oe(e):Promise.resolve(null);case "iframe":return Ie();case "web":return Promise.resolve(null)}},Ne=e=>{$=e;},Ue=()=>b||(b=mt(V()).then(e=>(e&&Ne(e),e)).finally(()=>{b=null;}),b);g()&&m.on(_,e=>{let t=y(e);t&&Ne(t);});var S=async()=>g()?$?$.token:(await Ue())?.token??"":"",Me=async()=>g()?(await Ue())?.token??"":"",N=async()=>g()?ft(V()):null;var ht=()=>{let[e,t]=useState(""),[n,r]=useState(true),s=useCallback(()=>{r(true),S().then(o=>{t(o),r(false);});},[]);return useEffect(()=>{let o=true;return S().then(a=>{o&&(t(a),r(false));}),()=>{o=false;}},[]),{token:e,loading:n,refetch:s}};var Rt=()=>{let[e,t]=useState(null),[n,r]=useState(true),s=useCallback(()=>{r(true),N().then(o=>{t(o),r(false);});},[]);return useEffect(()=>{let o=true;return N().then(a=>{o&&(t(a),r(false));}),()=>{o=false;}},[]),{user:e,loading:n,refetch:s}};var De={version:"0.0.6"};var w="/v1/feed-app/runtime/ai",Q=`${w}/chat/completions`,K=`${w}/messages`,Fe=`${w}/images/generations`,Be=`${w}/audio/speech`,qe=`${w}/video/generations`,je="Authorization",Ve="x-bty-extend",Je=De.version;var _t=/\r\n|\r|\n/,St=(()=>{let e=new TextDecoder;return (t,n)=>e.decode(t,{stream:n})})();async function*$e(e){let t=e.getReader(),n="",r="",s=[],o=()=>{if(s.length===0&&!r)return null;let a={event:r||"message",data:s.join(`
|
|
2
|
+
`)};return r="",s=[],a};try{for(;;){let{done:a,value:p}=await t.read();if(a){let i=o();i&&(yield i);return}for(n+=St(p,!0);;){let i=_t.exec(n);if(!i)break;let f=n.slice(0,i.index);if(n=n.slice(i.index+i[0].length),f===""){let l=o();l&&(yield l);continue}if(f.startsWith(":"))continue;let h=f.indexOf(":"),R=h===-1?f:f.slice(0,h),c=h===-1?"":f.slice(h+1);c.startsWith(" ")&&(c=c.slice(1)),R==="event"?r=c:R==="data"&&s.push(c);}}}finally{t.releaseLock();}}async function*Qe(e){for await(let t of $e(e)){if(t.data==="[DONE]")return;t.data&&(yield JSON.parse(t.data));}}async function*Ke(e){for await(let t of $e(e))t.data&&(yield JSON.parse(t.data));}var wt="https://reactus-api.betteryeah.com",Ct=()=>{try{if(typeof __BTY_RUNTIME_API_BASE_URL__=="string"&&__BTY_RUNTIME_API_BASE_URL__.length>0)return __BTY_RUNTIME_API_BASE_URL__}catch{}},xt={apiBaseUrl:(Ct()??wt).replace(/\/+$/,""),projectId:""};var U=()=>xt;var E=class extends Error{status;code;body;constructor(t,n,r,s=null){super(t),this.name="AiError",this.code=n,this.status=r,this.body=s;}},C=class extends E{constructor(t="Auth required",n=null){super(t,"auth_required",401,n),this.name="AuthRequiredError";}},X=class extends E{constructor(t="Rate limit exceeded",n=null){super(t,"rate_limit",429,n),this.name="RateLimitError";}},Y=class extends E{constructor(t="Quota exceeded",n=null){super(t,"quota_exceeded",402,n),this.name="QuotaExceededError";}},W=class extends E{constructor(t,n=400,r=null){super(t,"bad_input",n,r),this.name="BadInputError";}},z=class extends E{constructor(t,n=500,r=null){super(t,"server",n,r),this.name="ServerError";}},v=class extends E{constructor(t="Network error",n){super(t,"network",-1,n),this.name="NetworkError";}},x=class extends E{constructor(t="Request aborted"){super(t,"aborted",-1,null),this.name="AbortedError";}},Xe=e=>typeof e=="object"&&e!==null,It=(e,t)=>{if(typeof e=="string")return e||t;if(!Xe(e))return t;let n=e.message;if(typeof n=="string"&&n.length>0)return n;let r=e.error;if(typeof r=="string"&&r.length>0)return r;if(Xe(r)&&typeof r.message=="string"&&r.message.length>0)return r.message;let s=e.detail;return typeof s=="string"&&s.length>0?s:t},Z=(e,t)=>{let n=It(t,`HTTP ${e}`);return e===401||e===403?new C(n,t):e===402?new Y(n,t):e===429?new X(n,t):e>=400&&e<500?new W(n,e,t):e>=500?new z(n,e,t):new E(n,"unknown",e,t)};var kt=e=>JSON.stringify({"sdk-version":Je,...e}),Ye=async(e={})=>{let n=await S(),r=new Headers;if(n&&r.set(je,`Bearer ${n}`),r.set(Ve,kt(e.extend)),e.contentType&&r.set("Content-Type",e.contentType),e.accept&&r.set("Accept",e.accept),e.extra)for(let[s,o]of Object.entries(e.extra))r.set(s,o);return r};var Pt="feed-app-runtime-sdk:auth-required",ee=e=>{g()&&window.dispatchEvent(new CustomEvent(Pt,{detail:e}));};var bt=e=>e instanceof DOMException&&e.name==="AbortError",vt=async e=>{let t=e.headers.get("content-type")??"";try{return t.includes("application/json")?await e.json():await e.text()}catch{return null}},Ot=e=>typeof e=="object"&&e!==null,Nt=(e,t)=>{if(!Ot(e)||typeof e.success!="boolean")return e;if(e.success)return e.data;let n=typeof e.code=="number"?e.code:t;throw Z(n,e)},We=async(e,t)=>{let{apiBaseUrl:n}=U(),r=`${n}${e}`,s=await Ye(t),o;try{o=await fetch(r,{method:t.method??"POST",headers:s,body:t.body,signal:t.signal});}catch(p){throw bt(p)?new x:new v("Failed to reach AI backend",p)}if(o.ok)return o;let a=await vt(o);throw Z(o.status,a)},te=async(e,t={})=>{try{return await We(e,t)}catch(n){if(n instanceof C&&!t.skipAuthRetry&&!t.signal?.aborted){if(!await Me())throw ee({reason:"refresh_failed",error:n}),n;try{return await We(e,{...t,skipAuthRetry:!0})}catch(s){throw s instanceof C&&ee({reason:"retry_rejected",error:s}),s}}throw n}},I=async(e,t,n={})=>{let r=await te(e,{...n,method:"POST",contentType:"application/json",body:JSON.stringify(t)});return Nt(await r.json(),r.status)};var M=async(e,t,n={})=>{let r=await te(e,{...n,method:"POST",contentType:"application/json",accept:"text/event-stream",body:JSON.stringify(t)});if(!r.body)throw new v("Streaming response has no body");return r.body},ze=async(e,t,n={})=>await(await te(e,{...n,method:"POST",contentType:"application/json",body:JSON.stringify(t)})).blob();var Ut=e=>{let{signal:t,headers:n,...r}=e;return {transport:{signal:t,extra:n},payload:r}},Mt=(async e=>{let{transport:t,payload:n}=Ut(e);if(e.stream){let r=await M(K,n,t);return Ke(r)}return await I(K,n,t)}),Ze={messages:{create:Mt}};var H=e=>{let{signal:t,headers:n,...r}=e;return {transport:{signal:t,extra:n},payload:r}},Ht=(async e=>{let{transport:t,payload:n}=H(e);if(e.stream){let r=await M(Q,n,t);return Qe(r)}return await I(Q,n,t)}),Lt={create:Ht},Dt={async generate(e){let{transport:t,payload:n}=H(e);return I(Fe,n,t)}},Ft={speech:{async create(e){let{transport:t,payload:n}=H(e);return ze(Be,n,t)}}},Bt={generations:{async create(e){let{transport:t,payload:n}=H(e);return I(qe,n,t)}}},et={chat:{completions:Lt},images:Dt,audio:Ft,video:Bt};var jt=e=>{let{model:t,protocol:n="openai",maxTokens:r=1024,onToken:s}=e,[o,a]=useState([]),[p,i]=useState(""),[f,h]=useState(false),[R,c]=useState(null),l=useRef(null),re=useRef(s);re.current=s,useEffect(()=>()=>l.current?.abort(),[]);let nt=useCallback(()=>l.current?.abort(),[]),rt=useCallback(()=>{l.current?.abort(),a([]),i(""),c(null),h(false);},[]),st=useCallback(async se=>{if(!se)return;c(null),i(""),h(true);let D={role:"user",content:se},ot={role:"assistant",content:""};a(u=>[...u,D,ot]);let F=new AbortController;l.current?.abort(),l.current=F;let B="",oe=u=>{u&&(B+=u,i(B),a(k=>{let d=k.slice();return d[d.length-1]={role:"assistant",content:B},d}),re.current?.(u));};try{if(n==="openai"){let u=await et.chat.completions.create({model:t,messages:[...o,D],stream:!0,signal:F.signal});for await(let k of u){let d=k.choices?.[0]?.delta?.content;typeof d=="string"&&oe(d);}}else {let u=[...o,D].map(d=>({role:d.role==="assistant"?"assistant":"user",content:typeof d.content=="string"?d.content:""})),k=await Ze.messages.create({model:t,messages:u,max_tokens:r,stream:!0,signal:F.signal});for await(let d of k)d.type==="content_block_delta"&&d.delta.type==="text_delta"&&oe(d.delta.text);}}catch(u){u instanceof x||u instanceof E||u instanceof Error?c(u):c(new Error(String(u)));}finally{h(false),i("");}},[r,o,t,n]);return {messages:o,pending:p,loading:f,error:R,send:st,stop:nt,reset:rt}};
|
|
3
|
+
export{jt as useAiChat,ht as useAuthToken,Rt as useUserInfo};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bty/feed_app-runtime-sdk",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.6",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"browser": true,
|
|
6
6
|
"description": "Runtime SDK for feed-app template: auth / AI capabilities, multi-environment bridge (native App / iframe / web).",
|
|
@@ -9,27 +9,23 @@
|
|
|
9
9
|
"README.md"
|
|
10
10
|
],
|
|
11
11
|
"exports": {
|
|
12
|
-
"./user":
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
"./user": {
|
|
13
|
+
"types": "./dist/user/index.d.ts",
|
|
14
|
+
"import": "./dist/user/index.js"
|
|
15
|
+
},
|
|
16
|
+
"./ai": {
|
|
17
|
+
"types": "./dist/ai/index.d.ts",
|
|
18
|
+
"import": "./dist/ai/index.js"
|
|
19
|
+
},
|
|
20
|
+
"./react": {
|
|
21
|
+
"types": "./dist/react/index.d.ts",
|
|
22
|
+
"import": "./dist/react/index.js"
|
|
23
|
+
},
|
|
24
|
+
"./package.json": "./package.json"
|
|
15
25
|
},
|
|
16
26
|
"publishConfig": {
|
|
17
27
|
"access": "public",
|
|
18
|
-
"registry": "https://registry.npmjs.org/"
|
|
19
|
-
"exports": {
|
|
20
|
-
"./user": {
|
|
21
|
-
"types": "./dist/user/index.d.ts",
|
|
22
|
-
"import": "./dist/user/index.js"
|
|
23
|
-
},
|
|
24
|
-
"./ai": {
|
|
25
|
-
"types": "./dist/ai/index.d.ts",
|
|
26
|
-
"import": "./dist/ai/index.js"
|
|
27
|
-
},
|
|
28
|
-
"./react": {
|
|
29
|
-
"types": "./dist/react/index.d.ts",
|
|
30
|
-
"import": "./dist/react/index.js"
|
|
31
|
-
}
|
|
32
|
-
}
|
|
28
|
+
"registry": "https://registry.npmjs.org/"
|
|
33
29
|
},
|
|
34
30
|
"peerDependencies": {
|
|
35
31
|
"react": ">=17.0.0"
|