@opentiny/tiny-robot-kit 0.3.1-alpha.8 → 0.3.1-alpha.9

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.d.mts CHANGED
@@ -370,6 +370,11 @@ interface UseMessageReturn {
370
370
  */
371
371
  declare function useMessage(options: UseMessageOptions): UseMessageReturn;
372
372
 
373
+ /**
374
+ * useConversation composable
375
+ * 提供会话管理和持久化功能
376
+ */
377
+
373
378
  /**
374
379
  * 会话接口
375
380
  */
@@ -387,18 +392,6 @@ interface Conversation {
387
392
  /** 会话消息 */
388
393
  messages: ChatMessage[];
389
394
  }
390
- /**
391
- * 会话状态接口
392
- */
393
- interface ConversationState {
394
- /** 会话列表 */
395
- conversations: Conversation[];
396
- /** 当前会话ID */
397
- currentId: string | null;
398
- /** 是否正在加载 */
399
- loading: boolean;
400
- }
401
-
402
395
  /**
403
396
  * 存储策略接口
404
397
  */
@@ -407,10 +400,7 @@ interface ConversationStorageStrategy {
407
400
  saveConversations: (conversations: Conversation[]) => Promise<void> | void;
408
401
  /** 加载会话列表 */
409
402
  loadConversations: () => Promise<Conversation[]> | Conversation[];
410
- /** 清空所有会话(可选) */
411
- clear?: () => Promise<void> | void;
412
403
  }
413
-
414
404
  /**
415
405
  * 本地存储策略
416
406
  */
@@ -419,50 +409,18 @@ declare class LocalStorageStrategy implements ConversationStorageStrategy {
419
409
  constructor(storageKey?: string);
420
410
  saveConversations(conversations: Conversation[]): void;
421
411
  loadConversations(): Conversation[];
422
- clear(): void;
423
412
  }
424
-
425
413
  /**
426
- * IndexedDB 存储策略
414
+ * 会话状态接口
427
415
  */
428
- declare class IndexedDBStrategy implements ConversationStorageStrategy {
429
- private dbName;
430
- private dbVersion;
431
- private db;
432
- constructor(dbName?: string, dbVersion?: number);
433
- /**
434
- * 获取或初始化数据库连接
435
- */
436
- private getDB;
437
- saveConversations(conversations: Conversation[]): Promise<void>;
438
- loadConversations(): Promise<Conversation[]>;
439
- clear(): Promise<void>;
440
- }
441
-
442
- interface LocalStorageConfig {
443
- /** 存储键名 (default: 'tiny-robot-ai-conversations') */
444
- key?: string;
445
- }
446
- interface IndexedDBConfig {
447
- /** 数据库名称 (default: 'tiny-robot-ai-db') */
448
- dbName?: string;
449
- /** 数据库版本 (default: 1) */
450
- dbVersion?: number;
416
+ interface ConversationState {
417
+ /** 会话列表 */
418
+ conversations: Conversation[];
419
+ /** 当前会话ID */
420
+ currentId: string | null;
421
+ /** 是否正在加载 */
422
+ loading: boolean;
451
423
  }
452
- /**
453
- * LocalStorage 策略工厂函数
454
- */
455
- declare function localStorageStrategyFactory(config?: LocalStorageConfig): ConversationStorageStrategy;
456
- /**
457
- * IndexedDB 策略工厂函数
458
- */
459
- declare function indexedDBStorageStrategyFactory(config?: IndexedDBConfig): ConversationStorageStrategy;
460
-
461
- /**
462
- * useConversation composable
463
- * 提供会话管理和持久化功能
464
- */
465
-
466
424
  type UseConversationEvents = UseMessageOptions['events'] & {
467
425
  onLoaded?: (conversations: Conversation[]) => void;
468
426
  };
@@ -521,4 +479,4 @@ interface UseConversationReturn {
521
479
  */
522
480
  declare function useConversation(options: UseConversationOptions): UseConversationReturn;
523
481
 
524
- export { type AIAdapterError, AIClient, type AIModelConfig, type AIProvider, BaseModelProvider, type ChatCompletionOptions, type ChatCompletionRequest, type ChatCompletionResponse, type ChatCompletionResponseChoice, type ChatCompletionResponseMessage, type ChatCompletionResponseUsage, type ChatCompletionStreamResponse, type ChatCompletionStreamResponseChoice, type ChatCompletionStreamResponseDelta, type ChatHistory, type ChatMessage, type Conversation, type ConversationState, type ConversationStorageStrategy, ErrorType, FinalStatus, GeneratingStatus, type IndexedDBConfig, IndexedDBStrategy, type LocalStorageConfig, LocalStorageStrategy, type MessageRole, type MessageState, OpenAIProvider, STATUS, StreamEventType, type StreamHandler, type UseConversationEvents, type UseConversationOptions, type UseConversationReturn, type UseMessageOptions, type UseMessageReturn, extractTextFromResponse, formatMessages, handleSSEStream, indexedDBStorageStrategyFactory, localStorageStrategyFactory, useConversation, useMessage };
482
+ export { type AIAdapterError, AIClient, type AIModelConfig, type AIProvider, BaseModelProvider, type ChatCompletionOptions, type ChatCompletionRequest, type ChatCompletionResponse, type ChatCompletionResponseChoice, type ChatCompletionResponseMessage, type ChatCompletionResponseUsage, type ChatCompletionStreamResponse, type ChatCompletionStreamResponseChoice, type ChatCompletionStreamResponseDelta, type ChatHistory, type ChatMessage, type Conversation, type ConversationState, type ConversationStorageStrategy, ErrorType, FinalStatus, GeneratingStatus, LocalStorageStrategy, type MessageRole, type MessageState, OpenAIProvider, STATUS, StreamEventType, type StreamHandler, type UseConversationEvents, type UseConversationOptions, type UseConversationReturn, type UseMessageOptions, type UseMessageReturn, extractTextFromResponse, formatMessages, handleSSEStream, useConversation, useMessage };
package/dist/index.d.ts CHANGED
@@ -370,6 +370,11 @@ interface UseMessageReturn {
370
370
  */
371
371
  declare function useMessage(options: UseMessageOptions): UseMessageReturn;
372
372
 
373
+ /**
374
+ * useConversation composable
375
+ * 提供会话管理和持久化功能
376
+ */
377
+
373
378
  /**
374
379
  * 会话接口
375
380
  */
@@ -387,18 +392,6 @@ interface Conversation {
387
392
  /** 会话消息 */
388
393
  messages: ChatMessage[];
389
394
  }
390
- /**
391
- * 会话状态接口
392
- */
393
- interface ConversationState {
394
- /** 会话列表 */
395
- conversations: Conversation[];
396
- /** 当前会话ID */
397
- currentId: string | null;
398
- /** 是否正在加载 */
399
- loading: boolean;
400
- }
401
-
402
395
  /**
403
396
  * 存储策略接口
404
397
  */
@@ -407,10 +400,7 @@ interface ConversationStorageStrategy {
407
400
  saveConversations: (conversations: Conversation[]) => Promise<void> | void;
408
401
  /** 加载会话列表 */
409
402
  loadConversations: () => Promise<Conversation[]> | Conversation[];
410
- /** 清空所有会话(可选) */
411
- clear?: () => Promise<void> | void;
412
403
  }
413
-
414
404
  /**
415
405
  * 本地存储策略
416
406
  */
@@ -419,50 +409,18 @@ declare class LocalStorageStrategy implements ConversationStorageStrategy {
419
409
  constructor(storageKey?: string);
420
410
  saveConversations(conversations: Conversation[]): void;
421
411
  loadConversations(): Conversation[];
422
- clear(): void;
423
412
  }
424
-
425
413
  /**
426
- * IndexedDB 存储策略
414
+ * 会话状态接口
427
415
  */
428
- declare class IndexedDBStrategy implements ConversationStorageStrategy {
429
- private dbName;
430
- private dbVersion;
431
- private db;
432
- constructor(dbName?: string, dbVersion?: number);
433
- /**
434
- * 获取或初始化数据库连接
435
- */
436
- private getDB;
437
- saveConversations(conversations: Conversation[]): Promise<void>;
438
- loadConversations(): Promise<Conversation[]>;
439
- clear(): Promise<void>;
440
- }
441
-
442
- interface LocalStorageConfig {
443
- /** 存储键名 (default: 'tiny-robot-ai-conversations') */
444
- key?: string;
445
- }
446
- interface IndexedDBConfig {
447
- /** 数据库名称 (default: 'tiny-robot-ai-db') */
448
- dbName?: string;
449
- /** 数据库版本 (default: 1) */
450
- dbVersion?: number;
416
+ interface ConversationState {
417
+ /** 会话列表 */
418
+ conversations: Conversation[];
419
+ /** 当前会话ID */
420
+ currentId: string | null;
421
+ /** 是否正在加载 */
422
+ loading: boolean;
451
423
  }
452
- /**
453
- * LocalStorage 策略工厂函数
454
- */
455
- declare function localStorageStrategyFactory(config?: LocalStorageConfig): ConversationStorageStrategy;
456
- /**
457
- * IndexedDB 策略工厂函数
458
- */
459
- declare function indexedDBStorageStrategyFactory(config?: IndexedDBConfig): ConversationStorageStrategy;
460
-
461
- /**
462
- * useConversation composable
463
- * 提供会话管理和持久化功能
464
- */
465
-
466
424
  type UseConversationEvents = UseMessageOptions['events'] & {
467
425
  onLoaded?: (conversations: Conversation[]) => void;
468
426
  };
@@ -521,4 +479,4 @@ interface UseConversationReturn {
521
479
  */
522
480
  declare function useConversation(options: UseConversationOptions): UseConversationReturn;
523
481
 
524
- export { type AIAdapterError, AIClient, type AIModelConfig, type AIProvider, BaseModelProvider, type ChatCompletionOptions, type ChatCompletionRequest, type ChatCompletionResponse, type ChatCompletionResponseChoice, type ChatCompletionResponseMessage, type ChatCompletionResponseUsage, type ChatCompletionStreamResponse, type ChatCompletionStreamResponseChoice, type ChatCompletionStreamResponseDelta, type ChatHistory, type ChatMessage, type Conversation, type ConversationState, type ConversationStorageStrategy, ErrorType, FinalStatus, GeneratingStatus, type IndexedDBConfig, IndexedDBStrategy, type LocalStorageConfig, LocalStorageStrategy, type MessageRole, type MessageState, OpenAIProvider, STATUS, StreamEventType, type StreamHandler, type UseConversationEvents, type UseConversationOptions, type UseConversationReturn, type UseMessageOptions, type UseMessageReturn, extractTextFromResponse, formatMessages, handleSSEStream, indexedDBStorageStrategyFactory, localStorageStrategyFactory, useConversation, useMessage };
482
+ export { type AIAdapterError, AIClient, type AIModelConfig, type AIProvider, BaseModelProvider, type ChatCompletionOptions, type ChatCompletionRequest, type ChatCompletionResponse, type ChatCompletionResponseChoice, type ChatCompletionResponseMessage, type ChatCompletionResponseUsage, type ChatCompletionStreamResponse, type ChatCompletionStreamResponseChoice, type ChatCompletionStreamResponseDelta, type ChatHistory, type ChatMessage, type Conversation, type ConversationState, type ConversationStorageStrategy, ErrorType, FinalStatus, GeneratingStatus, LocalStorageStrategy, type MessageRole, type MessageState, OpenAIProvider, STATUS, StreamEventType, type StreamHandler, type UseConversationEvents, type UseConversationOptions, type UseConversationReturn, type UseMessageOptions, type UseMessageReturn, extractTextFromResponse, formatMessages, handleSSEStream, useConversation, useMessage };
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- "use strict";var P=Object.defineProperty;var J=Object.getOwnPropertyDescriptor;var W=Object.getOwnPropertyNames;var z=Object.prototype.hasOwnProperty;var Q=(r,e)=>{for(var t in e)P(r,t,{get:e[t],enumerable:!0})},X=(r,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let g of W(e))!z.call(r,g)&&g!==t&&P(r,g,{get:()=>e[g],enumerable:!(i=J(e,g))||i.enumerable});return r};var Y=r=>X(P({},"__esModule",{value:!0}),r);var oe={};Q(oe,{AIClient:()=>w,BaseModelProvider:()=>I,ErrorType:()=>L,FinalStatus:()=>Z,GeneratingStatus:()=>B,IndexedDBStrategy:()=>b,LocalStorageStrategy:()=>M,OpenAIProvider:()=>S,STATUS:()=>V,StreamEventType:()=>H,extractTextFromResponse:()=>$,formatMessages:()=>j,handleSSEStream:()=>E,indexedDBStorageStrategyFactory:()=>_,localStorageStrategyFactory:()=>A,useConversation:()=>te,useMessage:()=>U});module.exports=Y(oe);var I=class{constructor(e){this.config=e}updateConfig(e){this.config={...this.config,...e}}getConfig(){return{...this.config}}validateRequest(e){if(!e.messages||!Array.isArray(e.messages)||e.messages.length===0)throw new Error("\u8BF7\u6C42\u5FC5\u987B\u5305\u542B\u81F3\u5C11\u4E00\u6761\u6D88\u606F");for(let t of e.messages)if(!t.role||!t.content)throw new Error("\u6BCF\u6761\u6D88\u606F\u5FC5\u987B\u5305\u542B\u89D2\u8272\u548C\u5185\u5BB9")}};var L=(d=>(d.NETWORK_ERROR="network_error",d.AUTHENTICATION_ERROR="authentication_error",d.RATE_LIMIT_ERROR="rate_limit_error",d.SERVER_ERROR="server_error",d.MODEL_ERROR="model_error",d.TIMEOUT_ERROR="timeout_error",d.UNKNOWN_ERROR="unknown_error",d))(L||{}),H=(i=>(i.DATA="data",i.ERROR="error",i.DONE="done",i))(H||{});function y(r){return{type:r.type||"unknown_error",message:r.message||"\u672A\u77E5\u9519\u8BEF",statusCode:r.statusCode,originalError:r.originalError}}function N(r){if(!r.response)return y({type:"network_error",message:"\u7F51\u7EDC\u8FDE\u63A5\u9519\u8BEF\uFF0C\u8BF7\u68C0\u67E5\u60A8\u7684\u7F51\u7EDC\u8FDE\u63A5",originalError:r});if(r.response){let{status:e,data:t}=r.response;return e===401||e===403?y({type:"authentication_error",message:"\u8EAB\u4EFD\u9A8C\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u60A8\u7684API\u5BC6\u94A5",statusCode:e,originalError:r}):e===429?y({type:"rate_limit_error",message:"\u8D85\u51FAAPI\u8C03\u7528\u9650\u5236\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5",statusCode:e,originalError:r}):e>=500?y({type:"server_error",message:"\u670D\u52A1\u5668\u9519\u8BEF\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5",statusCode:e,originalError:r}):y({type:"unknown_error",message:t?.error?.message||`\u8BF7\u6C42\u5931\u8D25\uFF0C\u72B6\u6001\u7801: ${e}`,statusCode:e,originalError:r})}return r.code==="ECONNABORTED"?y({type:"timeout_error",message:"\u8BF7\u6C42\u8D85\u65F6\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5",originalError:r}):y({type:"unknown_error",message:r.message||"\u53D1\u751F\u672A\u77E5\u9519\u8BEF",originalError:r})}async function E(r,e,t){let i=r.body?.getReader();if(!i)throw new Error("Response body is null");let g=new TextDecoder,c="",l,d;t&&t.addEventListener("abort",()=>{i.cancel().catch(p=>console.error("Error cancelling reader:",p))},{once:!0});try{for(;;){if(t?.aborted){await i.cancel();break}let{done:p,value:s}=await i.read();if(p)break;let x=g.decode(s,{stream:!0});c+=x;let m=c.split(`
1
+ "use strict";var T=Object.defineProperty;var L=Object.getOwnPropertyDescriptor;var $=Object.getOwnPropertyNames;var G=Object.prototype.hasOwnProperty;var W=(r,e)=>{for(var t in e)T(r,t,{get:e[t],enumerable:!0})},J=(r,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let u of $(e))!G.call(r,u)&&u!==t&&T(r,u,{get:()=>e[u],enumerable:!(i=L(e,u))||i.enumerable});return r};var z=r=>J(T({},"__esModule",{value:!0}),r);var Y={};W(Y,{AIClient:()=>b,BaseModelProvider:()=>E,ErrorType:()=>q,FinalStatus:()=>V,GeneratingStatus:()=>P,LocalStorageStrategy:()=>x,OpenAIProvider:()=>S,STATUS:()=>F,StreamEventType:()=>B,extractTextFromResponse:()=>j,formatMessages:()=>H,handleSSEStream:()=>I,useConversation:()=>X,useMessage:()=>U});module.exports=z(Y);var E=class{constructor(e){this.config=e}updateConfig(e){this.config={...this.config,...e}}getConfig(){return{...this.config}}validateRequest(e){if(!e.messages||!Array.isArray(e.messages)||e.messages.length===0)throw new Error("\u8BF7\u6C42\u5FC5\u987B\u5305\u542B\u81F3\u5C11\u4E00\u6761\u6D88\u606F");for(let t of e.messages)if(!t.role||!t.content)throw new Error("\u6BCF\u6761\u6D88\u606F\u5FC5\u987B\u5305\u542B\u89D2\u8272\u548C\u5185\u5BB9")}};var q=(d=>(d.NETWORK_ERROR="network_error",d.AUTHENTICATION_ERROR="authentication_error",d.RATE_LIMIT_ERROR="rate_limit_error",d.SERVER_ERROR="server_error",d.MODEL_ERROR="model_error",d.TIMEOUT_ERROR="timeout_error",d.UNKNOWN_ERROR="unknown_error",d))(q||{}),B=(i=>(i.DATA="data",i.ERROR="error",i.DONE="done",i))(B||{});function y(r){return{type:r.type||"unknown_error",message:r.message||"\u672A\u77E5\u9519\u8BEF",statusCode:r.statusCode,originalError:r.originalError}}function D(r){if(!r.response)return y({type:"network_error",message:"\u7F51\u7EDC\u8FDE\u63A5\u9519\u8BEF\uFF0C\u8BF7\u68C0\u67E5\u60A8\u7684\u7F51\u7EDC\u8FDE\u63A5",originalError:r});if(r.response){let{status:e,data:t}=r.response;return e===401||e===403?y({type:"authentication_error",message:"\u8EAB\u4EFD\u9A8C\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u60A8\u7684API\u5BC6\u94A5",statusCode:e,originalError:r}):e===429?y({type:"rate_limit_error",message:"\u8D85\u51FAAPI\u8C03\u7528\u9650\u5236\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5",statusCode:e,originalError:r}):e>=500?y({type:"server_error",message:"\u670D\u52A1\u5668\u9519\u8BEF\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5",statusCode:e,originalError:r}):y({type:"unknown_error",message:t?.error?.message||`\u8BF7\u6C42\u5931\u8D25\uFF0C\u72B6\u6001\u7801: ${e}`,statusCode:e,originalError:r})}return r.code==="ECONNABORTED"?y({type:"timeout_error",message:"\u8BF7\u6C42\u8D85\u65F6\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5",originalError:r}):y({type:"unknown_error",message:r.message||"\u53D1\u751F\u672A\u77E5\u9519\u8BEF",originalError:r})}async function I(r,e,t){let i=r.body?.getReader();if(!i)throw new Error("Response body is null");let u=new TextDecoder,a="",c,d;t&&t.addEventListener("abort",()=>{i.cancel().catch(o=>console.error("Error cancelling reader:",o))},{once:!0});try{for(;;){if(t?.aborted){await i.cancel();break}let{done:o,value:p}=await i.read();if(o)break;let m=u.decode(p,{stream:!0});a+=m;let A=a.split(`
2
2
 
3
- `);c=m.pop()||"";for(let C of m)if(C.trim()!==""){if(C.trim()==="data: [DONE]"){d&&(l=d),e.onDone(l);continue}try{let f=C.match(/^data: (.+)$/m);if(!f)continue;let h=JSON.parse(f[1]);e.onData(h),d=h.choices?.[0]?.finish_reason||void 0}catch(f){console.error("Error parsing SSE message:",f)}}}(c.trim()==="data: [DONE]"||t?.aborted)&&(t?.aborted&&(l="aborted"),e.onDone(l))}catch(p){if(t?.aborted)return;throw p}}function j(r){return r.map(e=>typeof e=="object"&&"role"in e&&"content"in e?{role:e.role,content:String(e.content),...e.name?{name:e.name}:{}}:typeof e=="string"?{role:"user",content:e}:{role:"user",content:String(e)})}function $(r){return!r.choices||!r.choices.length?"":r.choices[0].message?.content||""}var S=class extends I{constructor(t){super(t);this.defaultModel="gpt-3.5-turbo";this.baseURL=t.apiUrl||"https://api.openai.com/v1",this.apiKey=t.apiKey||"",t.defaultModel&&(this.defaultModel=t.defaultModel),this.apiKey||console.warn("API key is not provided. Authentication will likely fail.")}async chat(t){try{this.validateRequest(t);let i={model:t.options?.model||this.config.defaultModel||this.defaultModel,messages:t.messages,...t.options,stream:!1},g={method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)};this.apiKey&&Object.assign(g.headers,{Authorization:`Bearer ${this.apiKey}`});let c=await fetch(`${this.baseURL}/chat/completions`,g);if(!c.ok){let l=await c.text();throw new Error(`HTTP error! status: ${c.status}, details: ${l}`)}return await c.json()}catch(i){throw N(i)}}async chatStream(t,i){let{signal:g,...c}=t.options||{};try{this.validateRequest(t);let l={model:t.options?.model||this.config.defaultModel||this.defaultModel,messages:t.messages,...c,stream:!0},d={method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`,Accept:"text/event-stream"},body:JSON.stringify(l),signal:g};this.apiKey&&Object.assign(d.headers,{Authorization:`Bearer ${this.apiKey}`});let p=await fetch(`${this.baseURL}/chat/completions`,d);if(!p.ok){let s=await p.text();throw new Error(`HTTP error! status: ${p.status}, details: ${s}`)}await E(p,i,g)}catch(l){if(g?.aborted)return;i.onError(N(l))}}updateConfig(t){super.updateConfig(t),t.apiUrl&&(this.baseURL=t.apiUrl),t.apiKey&&(this.apiKey=t.apiKey),t.defaultModel&&(this.defaultModel=t.defaultModel)}};var w=class{constructor(e){this.config=e,this.provider=this.createProvider(e)}createProvider(e){if(e.provider==="custom"&&"providerImplementation"in e)return e.providerImplementation;if(e.provider==="deepseek"){let t={defaultModel:"deepseek-chat",apiUrl:"https://api.deepseek.com/v1"};return new S({...t,...e})}else return new S(e)}async chat(e){return this.provider.chat(e)}async chatStream(e,t){let i={...e,options:{...e.options,stream:!0}};return this.provider.chatStream(i,t)}getConfig(){return{...this.config}}updateConfig(e){this.config={...this.config,...e},e.provider&&e.provider!==this.config.provider?this.provider=this.createProvider(this.config):this.provider.updateConfig(this.config)}};var v=require("vue"),V=(l=>(l.INIT="init",l.PROCESSING="processing",l.STREAMING="streaming",l.FINISHED="finished",l.ABORTED="aborted",l.ERROR="error",l))(V||{}),B=["processing","streaming"],Z=["finished","aborted","error"];function U(r){let{client:e,useStreamByDefault:t=!0,errorMessage:i="\u8BF7\u6C42\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5",initialMessages:g=[]}=r,c=(0,v.ref)([...g]),l=(0,v.ref)(""),d=(0,v.ref)(t),p=null,s=(0,v.reactive)({status:"init",errorMsg:null}),x=o=>{let n=r.events?.onReceiveData,a=!1;if(n&&n(o,c,()=>{a=!0}),!a){let u={role:"assistant",content:o.choices[0].message.content};c.value.push(u)}},m=async o=>{let n=await e.chat({messages:(0,v.toRaw)(c.value),options:{stream:!1,signal:o.signal}});x(n)},C=o=>{let n=r.events?.onReceiveData,a=!1;if(n&&n(o,c,()=>{a=!0}),!a){c.value[c.value.length-1].role==="user"&&c.value.push({role:"assistant",content:""});let u=o.choices?.[0];u&&u.delta.content&&(c.value[c.value.length-1].content+=u.delta.content)}},f=async o=>{await e.chatStream({messages:(0,v.toRaw)(c.value),options:{stream:!0,signal:o.signal}},{onData:n=>{s.status="streaming",C(n)},onError:n=>{s.status="error",s.errorMsg=i,console.error("Stream request error:",n)},onDone:n=>{let a=r.events?.onFinish,u=!1;if(a&&a(n,{messages:c,messageState:s},()=>{u=!0}),!u){if(n==="aborted"||s.status==="aborted")return;s.status="finished"}}})},h=async()=>{s.status="processing",s.errorMsg=null,p=new AbortController;try{d.value?await f(p):await m(p)}catch(o){s.errorMsg=i,s.status="error",console.error("Send message error:",o)}finally{p=null}};return{messages:c,messageState:s,inputMessage:l,useStream:d,sendMessage:async(o=l.value,n=!0)=>{if(B.includes(s.status)||!o||typeof o=="string"&&!o.trim()||Array.isArray(o)&&o.length===0)return;let a={role:"user",content:o};c.value.push(a),n&&(l.value=""),await h()},send:async()=>{B.includes(s.status)||await h()},clearMessages:()=>{c.value=[],s.errorMsg=null},addMessage:o=>{Array.isArray(o)?c.value.push(...o):c.value.push(o)},abortRequest:()=>{p&&(p.abort(),p=null,s.status="aborted")},retryRequest:async o=>{o===0||!c.value[o]||c.value[o].role==="user"||(c.value.splice(o),await h())}}}var D=require("vue");var M=class{constructor(e="tiny-robot-ai-conversations"){this.storageKey=e}saveConversations(e){try{localStorage.setItem(this.storageKey,JSON.stringify(e))}catch(t){console.error("\u4FDD\u5B58\u4F1A\u8BDD\u5931\u8D25:",t)}}loadConversations(){try{let e=localStorage.getItem(this.storageKey);return e?JSON.parse(e):[]}catch(e){return console.error("\u52A0\u8F7D\u4F1A\u8BDD\u5931\u8D25:",e),[]}}clear(){try{localStorage.removeItem(this.storageKey)}catch(e){console.error("\u6E05\u7A7A\u4F1A\u8BDD\u5931\u8D25:",e)}}};var G=require("idb"),b=class{constructor(e="tiny-robot-ai-db",t=1){this.db=null;this.dbName=e,this.dbVersion=t}async getDB(){return this.db||(this.db=await(0,G.openDB)(this.dbName,this.dbVersion,{upgrade(e){e.objectStoreNames.contains("conversations")||e.createObjectStore("conversations",{keyPath:"id"}).createIndex("by-updated","updatedAt")}})),this.db}async saveConversations(e){try{let i=(await this.getDB()).transaction("conversations","readwrite");await i.store.clear(),await Promise.all(e.map(g=>i.store.put(g))),await i.done}catch(t){throw console.error("\u4FDD\u5B58\u4F1A\u8BDD\u5931\u8D25:",t),t}}async loadConversations(){try{return(await(await this.getDB()).getAllFromIndex("conversations","by-updated")).reverse()}catch(e){return console.error("\u52A0\u8F7D\u4F1A\u8BDD\u5931\u8D25:",e),[]}}async clear(){try{await(await this.getDB()).clear("conversations")}catch(e){throw console.error("\u6E05\u7A7A\u4F1A\u8BDD\u5931\u8D25:",e),e}}};function A(r={}){return new M(r.key||"tiny-robot-ai-conversations")}function _(r={}){return new b(r.dbName||"tiny-robot-ai-db",r.dbVersion||1)}function ee(){return Date.now().toString(36)+Math.random().toString(36).substring(2,9)}function te(r){let{client:e,storage:t,autoSave:i=!0,allowEmpty:g=!1,useStreamByDefault:c=!0,errorMessage:l="\u8BF7\u6C42\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5",events:d}=r,p=t||A(),s=(0,D.reactive)({conversations:[],currentId:null,loading:!1}),x=!1,m=U({client:e,useStreamByDefault:c,errorMessage:l,initialMessages:[],events:{onReceiveData:d?.onReceiveData,onFinish:d?.onFinish}});(0,D.watch)(()=>m.messages.value,o=>{if(s.currentId&&o.length>0){let n=s.conversations.findIndex(a=>a.id===s.currentId);n!==-1&&(s.conversations[n].messages=[...o],s.conversations[n].updatedAt=Date.now(),i&&R())}},{deep:!0});let C=(o="\u65B0\u4F1A\u8BDD",n={})=>{if(!g&&m.messages.value.length===0&&s.currentId)return s.currentId;let a=ee(),u={id:a,title:o,createdAt:Date.now(),updatedAt:Date.now(),messages:[],metadata:n};return s.conversations.unshift(u),f(a),i&&R(),a},f=o=>{let n=s.conversations.find(a=>a.id===o);n&&(s.currentId=o,m.clearMessages(),n.messages.length>0&&n.messages.forEach(a=>m.addMessage(a)))},h=o=>{let n=s.conversations.findIndex(a=>a.id===o);n!==-1&&(s.conversations.splice(n,1),s.currentId===o&&(s.conversations.length>0?f(s.conversations[0].id):(s.currentId=null,m.clearMessages())),i&&R())},O=(o,n)=>{let a=s.conversations.find(u=>u.id===o);a&&(a.title=n,a.updatedAt=Date.now(),i&&R())},k=(o,n)=>{let a=s.conversations.find(u=>u.id===o);a&&(a.metadata={...a.metadata,...n},a.updatedAt=Date.now(),i&&R())},R=async()=>{try{let o=JSON.parse(JSON.stringify(s.conversations));await p.saveConversations(o)}catch(o){console.error("\u4FDD\u5B58\u4F1A\u8BDD\u5931\u8D25:",o)}},T=async()=>{s.loading=!0;try{let o=await p.loadConversations();s.conversations=o,o.length>0&&!s.currentId&&f(o[0].id),!x&&d?.onLoaded&&(x=!0,d.onLoaded(o))}catch(o){console.error("\u52A0\u8F7D\u4F1A\u8BDD\u5931\u8D25:",o)}finally{s.loading=!1}},K=async o=>{let n=s.conversations.find(a=>a.id===o);if(!n||n.messages.length<2)return n?.title||"\u65B0\u4F1A\u8BDD";try{let a={role:"system",content:"\u8BF7\u6839\u636E\u4EE5\u4E0B\u5BF9\u8BDD\u5185\u5BB9\uFF0C\u751F\u6210\u4E00\u4E2A\u7B80\u77ED\u7684\u6807\u9898\uFF08\u4E0D\u8D85\u8FC720\u4E2A\u5B57\u7B26\uFF09\u3002\u53EA\u9700\u8981\u8FD4\u56DE\u6807\u9898\u6587\u672C\uFF0C\u4E0D\u9700\u8981\u4EFB\u4F55\u89E3\u91CA\u6216\u989D\u5916\u5185\u5BB9\u3002"},u=n.messages.slice(0,Math.min(4,n.messages.length)),F=(await e.chat({messages:[a,...u],options:{stream:!1,max_tokens:30}})).choices[0].message.content.trim();return O(o,F),F}catch(a){return console.error("\u751F\u6210\u6807\u9898\u5931\u8D25:",a),n.title}},q=()=>s.currentId&&s.conversations.find(o=>o.id===s.currentId)||null;return T(),{state:s,messageManager:m,createConversation:C,switchConversation:f,deleteConversation:h,updateTitle:O,updateMetadata:k,saveConversations:R,loadConversations:T,generateTitle:K,getCurrentConversation:q}}0&&(module.exports={AIClient,BaseModelProvider,ErrorType,FinalStatus,GeneratingStatus,IndexedDBStrategy,LocalStorageStrategy,OpenAIProvider,STATUS,StreamEventType,extractTextFromResponse,formatMessages,handleSSEStream,indexedDBStorageStrategyFactory,localStorageStrategyFactory,useConversation,useMessage});
3
+ `);a=A.pop()||"";for(let f of A)if(f.trim()!==""){if(f.trim()==="data: [DONE]"){d&&(c=d),e.onDone(c);continue}try{let R=f.match(/^data: (.+)$/m);if(!R)continue;let h=JSON.parse(R[1]);e.onData(h),d=h.choices?.[0]?.finish_reason||void 0}catch(R){console.error("Error parsing SSE message:",R)}}}(a.trim()==="data: [DONE]"||t?.aborted)&&(t?.aborted&&(c="aborted"),e.onDone(c))}catch(o){if(t?.aborted)return;throw o}}function H(r){return r.map(e=>typeof e=="object"&&"role"in e&&"content"in e?{role:e.role,content:String(e.content),...e.name?{name:e.name}:{}}:typeof e=="string"?{role:"user",content:e}:{role:"user",content:String(e)})}function j(r){return!r.choices||!r.choices.length?"":r.choices[0].message?.content||""}var S=class extends E{constructor(t){super(t);this.defaultModel="gpt-3.5-turbo";this.baseURL=t.apiUrl||"https://api.openai.com/v1",this.apiKey=t.apiKey||"",t.defaultModel&&(this.defaultModel=t.defaultModel),this.apiKey||console.warn("API key is not provided. Authentication will likely fail.")}async chat(t){try{this.validateRequest(t);let i={model:t.options?.model||this.config.defaultModel||this.defaultModel,messages:t.messages,...t.options,stream:!1},u={method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)};this.apiKey&&Object.assign(u.headers,{Authorization:`Bearer ${this.apiKey}`});let a=await fetch(`${this.baseURL}/chat/completions`,u);if(!a.ok){let c=await a.text();throw new Error(`HTTP error! status: ${a.status}, details: ${c}`)}return await a.json()}catch(i){throw D(i)}}async chatStream(t,i){let{signal:u,...a}=t.options||{};try{this.validateRequest(t);let c={model:t.options?.model||this.config.defaultModel||this.defaultModel,messages:t.messages,...a,stream:!0},d={method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`,Accept:"text/event-stream"},body:JSON.stringify(c),signal:u};this.apiKey&&Object.assign(d.headers,{Authorization:`Bearer ${this.apiKey}`});let o=await fetch(`${this.baseURL}/chat/completions`,d);if(!o.ok){let p=await o.text();throw new Error(`HTTP error! status: ${o.status}, details: ${p}`)}await I(o,i,u)}catch(c){if(u?.aborted)return;i.onError(D(c))}}updateConfig(t){super.updateConfig(t),t.apiUrl&&(this.baseURL=t.apiUrl),t.apiKey&&(this.apiKey=t.apiKey),t.defaultModel&&(this.defaultModel=t.defaultModel)}};var b=class{constructor(e){this.config=e,this.provider=this.createProvider(e)}createProvider(e){if(e.provider==="custom"&&"providerImplementation"in e)return e.providerImplementation;if(e.provider==="deepseek"){let t={defaultModel:"deepseek-chat",apiUrl:"https://api.deepseek.com/v1"};return new S({...t,...e})}else return new S(e)}async chat(e){return this.provider.chat(e)}async chatStream(e,t){let i={...e,options:{...e.options,stream:!0}};return this.provider.chatStream(i,t)}getConfig(){return{...this.config}}updateConfig(e){this.config={...this.config,...e},e.provider&&e.provider!==this.config.provider?this.provider=this.createProvider(this.config):this.provider.updateConfig(this.config)}};var v=require("vue"),F=(c=>(c.INIT="init",c.PROCESSING="processing",c.STREAMING="streaming",c.FINISHED="finished",c.ABORTED="aborted",c.ERROR="error",c))(F||{}),P=["processing","streaming"],V=["finished","aborted","error"];function U(r){let{client:e,useStreamByDefault:t=!0,errorMessage:i="\u8BF7\u6C42\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5",initialMessages:u=[]}=r,a=(0,v.ref)([...u]),c=(0,v.ref)(""),d=(0,v.ref)(t),o=null,p=(0,v.reactive)({status:"init",errorMsg:null}),m=s=>{let n=r.events?.onReceiveData,g=!1;if(n&&n(s,a,()=>{g=!0}),!g){let C={role:"assistant",content:s.choices[0].message.content};a.value.push(C)}},A=async s=>{let n=await e.chat({messages:(0,v.toRaw)(a.value),options:{stream:!1,signal:s.signal}});m(n)},f=s=>{let n=r.events?.onReceiveData,g=!1;if(n&&n(s,a,()=>{g=!0}),!g){a.value[a.value.length-1].role==="user"&&a.value.push({role:"assistant",content:""});let C=s.choices?.[0];C&&C.delta.content&&(a.value[a.value.length-1].content+=C.delta.content)}},R=async s=>{await e.chatStream({messages:(0,v.toRaw)(a.value),options:{stream:!0,signal:s.signal}},{onData:n=>{p.status="streaming",f(n)},onError:n=>{p.status="error",p.errorMsg=i,console.error("Stream request error:",n)},onDone:n=>{let g=r.events?.onFinish,C=!1;if(g&&g(n,{messages:a,messageState:p},()=>{C=!0}),!C){if(n==="aborted"||p.status==="aborted")return;p.status="finished"}}})},h=async()=>{p.status="processing",p.errorMsg=null,o=new AbortController;try{d.value?await R(o):await A(o)}catch(s){p.errorMsg=i,p.status="error",console.error("Send message error:",s)}finally{o=null}};return{messages:a,messageState:p,inputMessage:c,useStream:d,sendMessage:async(s=c.value,n=!0)=>{if(P.includes(p.status)||!s||typeof s=="string"&&!s.trim()||Array.isArray(s)&&s.length===0)return;let g={role:"user",content:s};a.value.push(g),n&&(c.value=""),await h()},send:async()=>{P.includes(p.status)||await h()},clearMessages:()=>{a.value=[],p.errorMsg=null},addMessage:s=>{Array.isArray(s)?a.value.push(...s):a.value.push(s)},abortRequest:()=>{o&&(o.abort(),o=null,p.status="aborted")},retryRequest:async s=>{s===0||!a.value[s]||a.value[s].role==="user"||(a.value.splice(s),await h())}}}var O=require("vue");var x=class{constructor(e="tiny-robot-ai-conversations"){this.storageKey=e}saveConversations(e){try{localStorage.setItem(this.storageKey,JSON.stringify(e))}catch(t){console.error("\u4FDD\u5B58\u4F1A\u8BDD\u5931\u8D25:",t)}}loadConversations(){try{let e=localStorage.getItem(this.storageKey);return e?JSON.parse(e):[]}catch(e){return console.error("\u52A0\u8F7D\u4F1A\u8BDD\u5931\u8D25:",e),[]}}};function Q(){return Date.now().toString(36)+Math.random().toString(36).substring(2,9)}function X(r){let{client:e,storage:t=new x,autoSave:i=!0,allowEmpty:u=!1,useStreamByDefault:a=!0,errorMessage:c="\u8BF7\u6C42\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5",events:d}=r,o=(0,O.reactive)({conversations:[],currentId:null,loading:!1}),p=!1,m=U({client:e,useStreamByDefault:a,errorMessage:c,initialMessages:[],events:{onReceiveData:d?.onReceiveData,onFinish:d?.onFinish}});(0,O.watch)(()=>m.messages.value,l=>{if(o.currentId&&l.length>0){let s=o.conversations.findIndex(n=>n.id===o.currentId);s!==-1&&(o.conversations[s].messages=[...l],o.conversations[s].updatedAt=Date.now(),i&&M())}},{deep:!0});let A=(l="\u65B0\u4F1A\u8BDD",s={})=>{if(!u&&m.messages.value.length===0&&o.currentId)return o.currentId;let n=Q(),g={id:n,title:l,createdAt:Date.now(),updatedAt:Date.now(),messages:[],metadata:s};return o.conversations.unshift(g),f(n),i&&M(),n},f=l=>{let s=o.conversations.find(n=>n.id===l);s&&(o.currentId=l,m.clearMessages(),s.messages.length>0&&s.messages.forEach(n=>m.addMessage(n)))},R=l=>{let s=o.conversations.findIndex(n=>n.id===l);s!==-1&&(o.conversations.splice(s,1),o.currentId===l&&(o.conversations.length>0?f(o.conversations[0].id):(o.currentId=null,m.clearMessages())),i&&M())},h=(l,s)=>{let n=o.conversations.find(g=>g.id===l);n&&(n.title=s,n.updatedAt=Date.now(),i&&M())},N=(l,s)=>{let n=o.conversations.find(g=>g.id===l);n&&(n.metadata={...n.metadata,...s},n.updatedAt=Date.now(),i&&M())},M=async()=>{try{await t.saveConversations(o.conversations)}catch(l){console.error("\u4FDD\u5B58\u4F1A\u8BDD\u5931\u8D25:",l)}},w=async()=>{o.loading=!0;try{let l=await t.loadConversations();o.conversations=l,l.length>0&&!o.currentId&&f(l[0].id),!p&&d?.onLoaded&&(p=!0,d.onLoaded(l))}catch(l){console.error("\u52A0\u8F7D\u4F1A\u8BDD\u5931\u8D25:",l)}finally{o.loading=!1}},_=async l=>{let s=o.conversations.find(n=>n.id===l);if(!s||s.messages.length<2)return s?.title||"\u65B0\u4F1A\u8BDD";try{let n={role:"system",content:"\u8BF7\u6839\u636E\u4EE5\u4E0B\u5BF9\u8BDD\u5185\u5BB9\uFF0C\u751F\u6210\u4E00\u4E2A\u7B80\u77ED\u7684\u6807\u9898\uFF08\u4E0D\u8D85\u8FC720\u4E2A\u5B57\u7B26\uFF09\u3002\u53EA\u9700\u8981\u8FD4\u56DE\u6807\u9898\u6587\u672C\uFF0C\u4E0D\u9700\u8981\u4EFB\u4F55\u89E3\u91CA\u6216\u989D\u5916\u5185\u5BB9\u3002"},g=s.messages.slice(0,Math.min(4,s.messages.length)),K=(await e.chat({messages:[n,...g],options:{stream:!1,max_tokens:30}})).choices[0].message.content.trim();return h(l,K),K}catch(n){return console.error("\u751F\u6210\u6807\u9898\u5931\u8D25:",n),s.title}},k=()=>o.currentId&&o.conversations.find(l=>l.id===o.currentId)||null;return w(),{state:o,messageManager:m,createConversation:A,switchConversation:f,deleteConversation:R,updateTitle:h,updateMetadata:N,saveConversations:M,loadConversations:w,generateTitle:_,getCurrentConversation:k}}0&&(module.exports={AIClient,BaseModelProvider,ErrorType,FinalStatus,GeneratingStatus,LocalStorageStrategy,OpenAIProvider,STATUS,StreamEventType,extractTextFromResponse,formatMessages,handleSSEStream,useConversation,useMessage});
package/dist/index.mjs CHANGED
@@ -1,3 +1,3 @@
1
- var x=class{constructor(e){this.config=e}updateConfig(e){this.config={...this.config,...e}}getConfig(){return{...this.config}}validateRequest(e){if(!e.messages||!Array.isArray(e.messages)||e.messages.length===0)throw new Error("\u8BF7\u6C42\u5FC5\u987B\u5305\u542B\u81F3\u5C11\u4E00\u6761\u6D88\u606F");for(let o of e.messages)if(!o.role||!o.content)throw new Error("\u6BCF\u6761\u6D88\u606F\u5FC5\u987B\u5305\u542B\u89D2\u8272\u548C\u5185\u5BB9")}};var F=(d=>(d.NETWORK_ERROR="network_error",d.AUTHENTICATION_ERROR="authentication_error",d.RATE_LIMIT_ERROR="rate_limit_error",d.SERVER_ERROR="server_error",d.MODEL_ERROR="model_error",d.TIMEOUT_ERROR="timeout_error",d.UNKNOWN_ERROR="unknown_error",d))(F||{}),L=(c=>(c.DATA="data",c.ERROR="error",c.DONE="done",c))(L||{});function R(s){return{type:s.type||"unknown_error",message:s.message||"\u672A\u77E5\u9519\u8BEF",statusCode:s.statusCode,originalError:s.originalError}}function w(s){if(!s.response)return R({type:"network_error",message:"\u7F51\u7EDC\u8FDE\u63A5\u9519\u8BEF\uFF0C\u8BF7\u68C0\u67E5\u60A8\u7684\u7F51\u7EDC\u8FDE\u63A5",originalError:s});if(s.response){let{status:e,data:o}=s.response;return e===401||e===403?R({type:"authentication_error",message:"\u8EAB\u4EFD\u9A8C\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u60A8\u7684API\u5BC6\u94A5",statusCode:e,originalError:s}):e===429?R({type:"rate_limit_error",message:"\u8D85\u51FAAPI\u8C03\u7528\u9650\u5236\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5",statusCode:e,originalError:s}):e>=500?R({type:"server_error",message:"\u670D\u52A1\u5668\u9519\u8BEF\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5",statusCode:e,originalError:s}):R({type:"unknown_error",message:o?.error?.message||`\u8BF7\u6C42\u5931\u8D25\uFF0C\u72B6\u6001\u7801: ${e}`,statusCode:e,originalError:s})}return s.code==="ECONNABORTED"?R({type:"timeout_error",message:"\u8BF7\u6C42\u8D85\u65F6\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5",originalError:s}):R({type:"unknown_error",message:s.message||"\u53D1\u751F\u672A\u77E5\u9519\u8BEF",originalError:s})}async function D(s,e,o){let c=s.body?.getReader();if(!c)throw new Error("Response body is null");let u=new TextDecoder,i="",l,d;o&&o.addEventListener("abort",()=>{c.cancel().catch(p=>console.error("Error cancelling reader:",p))},{once:!0});try{for(;;){if(o?.aborted){await c.cancel();break}let{done:p,value:r}=await c.read();if(p)break;let y=u.decode(r,{stream:!0});i+=y;let m=i.split(`
1
+ var A=class{constructor(e){this.config=e}updateConfig(e){this.config={...this.config,...e}}getConfig(){return{...this.config}}validateRequest(e){if(!e.messages||!Array.isArray(e.messages)||e.messages.length===0)throw new Error("\u8BF7\u6C42\u5FC5\u987B\u5305\u542B\u81F3\u5C11\u4E00\u6761\u6D88\u606F");for(let o of e.messages)if(!o.role||!o.content)throw new Error("\u6BCF\u6761\u6D88\u606F\u5FC5\u987B\u5305\u542B\u89D2\u8272\u548C\u5185\u5BB9")}};var K=(d=>(d.NETWORK_ERROR="network_error",d.AUTHENTICATION_ERROR="authentication_error",d.RATE_LIMIT_ERROR="rate_limit_error",d.SERVER_ERROR="server_error",d.MODEL_ERROR="model_error",d.TIMEOUT_ERROR="timeout_error",d.UNKNOWN_ERROR="unknown_error",d))(K||{}),q=(l=>(l.DATA="data",l.ERROR="error",l.DONE="done",l))(q||{});function M(n){return{type:n.type||"unknown_error",message:n.message||"\u672A\u77E5\u9519\u8BEF",statusCode:n.statusCode,originalError:n.originalError}}function I(n){if(!n.response)return M({type:"network_error",message:"\u7F51\u7EDC\u8FDE\u63A5\u9519\u8BEF\uFF0C\u8BF7\u68C0\u67E5\u60A8\u7684\u7F51\u7EDC\u8FDE\u63A5",originalError:n});if(n.response){let{status:e,data:o}=n.response;return e===401||e===403?M({type:"authentication_error",message:"\u8EAB\u4EFD\u9A8C\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u60A8\u7684API\u5BC6\u94A5",statusCode:e,originalError:n}):e===429?M({type:"rate_limit_error",message:"\u8D85\u51FAAPI\u8C03\u7528\u9650\u5236\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5",statusCode:e,originalError:n}):e>=500?M({type:"server_error",message:"\u670D\u52A1\u5668\u9519\u8BEF\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5",statusCode:e,originalError:n}):M({type:"unknown_error",message:o?.error?.message||`\u8BF7\u6C42\u5931\u8D25\uFF0C\u72B6\u6001\u7801: ${e}`,statusCode:e,originalError:n})}return n.code==="ECONNABORTED"?M({type:"timeout_error",message:"\u8BF7\u6C42\u8D85\u65F6\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5",originalError:n}):M({type:"unknown_error",message:n.message||"\u53D1\u751F\u672A\u77E5\u9519\u8BEF",originalError:n})}async function b(n,e,o){let l=n.body?.getReader();if(!l)throw new Error("Response body is null");let g=new TextDecoder,a="",c,d;o&&o.addEventListener("abort",()=>{l.cancel().catch(s=>console.error("Error cancelling reader:",s))},{once:!0});try{for(;;){if(o?.aborted){await l.cancel();break}let{done:s,value:p}=await l.read();if(s)break;let m=g.decode(p,{stream:!0});a+=m;let y=a.split(`
2
2
 
3
- `);i=m.pop()||"";for(let h of m)if(h.trim()!==""){if(h.trim()==="data: [DONE]"){d&&(l=d),e.onDone(l);continue}try{let f=h.match(/^data: (.+)$/m);if(!f)continue;let v=JSON.parse(f[1]);e.onData(v),d=v.choices?.[0]?.finish_reason||void 0}catch(f){console.error("Error parsing SSE message:",f)}}}(i.trim()==="data: [DONE]"||o?.aborted)&&(o?.aborted&&(l="aborted"),e.onDone(l))}catch(p){if(o?.aborted)return;throw p}}function H(s){return s.map(e=>typeof e=="object"&&"role"in e&&"content"in e?{role:e.role,content:String(e.content),...e.name?{name:e.name}:{}}:typeof e=="string"?{role:"user",content:e}:{role:"user",content:String(e)})}function j(s){return!s.choices||!s.choices.length?"":s.choices[0].message?.content||""}var S=class extends x{constructor(o){super(o);this.defaultModel="gpt-3.5-turbo";this.baseURL=o.apiUrl||"https://api.openai.com/v1",this.apiKey=o.apiKey||"",o.defaultModel&&(this.defaultModel=o.defaultModel),this.apiKey||console.warn("API key is not provided. Authentication will likely fail.")}async chat(o){try{this.validateRequest(o);let c={model:o.options?.model||this.config.defaultModel||this.defaultModel,messages:o.messages,...o.options,stream:!1},u={method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(c)};this.apiKey&&Object.assign(u.headers,{Authorization:`Bearer ${this.apiKey}`});let i=await fetch(`${this.baseURL}/chat/completions`,u);if(!i.ok){let l=await i.text();throw new Error(`HTTP error! status: ${i.status}, details: ${l}`)}return await i.json()}catch(c){throw w(c)}}async chatStream(o,c){let{signal:u,...i}=o.options||{};try{this.validateRequest(o);let l={model:o.options?.model||this.config.defaultModel||this.defaultModel,messages:o.messages,...i,stream:!0},d={method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`,Accept:"text/event-stream"},body:JSON.stringify(l),signal:u};this.apiKey&&Object.assign(d.headers,{Authorization:`Bearer ${this.apiKey}`});let p=await fetch(`${this.baseURL}/chat/completions`,d);if(!p.ok){let r=await p.text();throw new Error(`HTTP error! status: ${p.status}, details: ${r}`)}await D(p,c,u)}catch(l){if(u?.aborted)return;c.onError(w(l))}}updateConfig(o){super.updateConfig(o),o.apiUrl&&(this.baseURL=o.apiUrl),o.apiKey&&(this.apiKey=o.apiKey),o.defaultModel&&(this.defaultModel=o.defaultModel)}};var O=class{constructor(e){this.config=e,this.provider=this.createProvider(e)}createProvider(e){if(e.provider==="custom"&&"providerImplementation"in e)return e.providerImplementation;if(e.provider==="deepseek"){let o={defaultModel:"deepseek-chat",apiUrl:"https://api.deepseek.com/v1"};return new S({...o,...e})}else return new S(e)}async chat(e){return this.provider.chat(e)}async chatStream(e,o){let c={...e,options:{...e.options,stream:!0}};return this.provider.chatStream(c,o)}getConfig(){return{...this.config}}updateConfig(e){this.config={...this.config,...e},e.provider&&e.provider!==this.config.provider?this.provider=this.createProvider(this.config):this.provider.updateConfig(this.config)}};import{reactive as $,ref as T,toRaw as _}from"vue";var V=(l=>(l.INIT="init",l.PROCESSING="processing",l.STREAMING="streaming",l.FINISHED="finished",l.ABORTED="aborted",l.ERROR="error",l))(V||{}),k=["processing","streaming"],le=["finished","aborted","error"];function K(s){let{client:e,useStreamByDefault:o=!0,errorMessage:c="\u8BF7\u6C42\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5",initialMessages:u=[]}=s,i=T([...u]),l=T(""),d=T(o),p=null,r=$({status:"init",errorMsg:null}),y=t=>{let n=s.events?.onReceiveData,a=!1;if(n&&n(t,i,()=>{a=!0}),!a){let g={role:"assistant",content:t.choices[0].message.content};i.value.push(g)}},m=async t=>{let n=await e.chat({messages:_(i.value),options:{stream:!1,signal:t.signal}});y(n)},h=t=>{let n=s.events?.onReceiveData,a=!1;if(n&&n(t,i,()=>{a=!0}),!a){i.value[i.value.length-1].role==="user"&&i.value.push({role:"assistant",content:""});let g=t.choices?.[0];g&&g.delta.content&&(i.value[i.value.length-1].content+=g.delta.content)}},f=async t=>{await e.chatStream({messages:_(i.value),options:{stream:!0,signal:t.signal}},{onData:n=>{r.status="streaming",h(n)},onError:n=>{r.status="error",r.errorMsg=c,console.error("Stream request error:",n)},onDone:n=>{let a=s.events?.onFinish,g=!1;if(a&&a(n,{messages:i,messageState:r},()=>{g=!0}),!g){if(n==="aborted"||r.status==="aborted")return;r.status="finished"}}})},v=async()=>{r.status="processing",r.errorMsg=null,p=new AbortController;try{d.value?await f(p):await m(p)}catch(t){r.errorMsg=c,r.status="error",console.error("Send message error:",t)}finally{p=null}};return{messages:i,messageState:r,inputMessage:l,useStream:d,sendMessage:async(t=l.value,n=!0)=>{if(k.includes(r.status)||!t||typeof t=="string"&&!t.trim()||Array.isArray(t)&&t.length===0)return;let a={role:"user",content:t};i.value.push(a),n&&(l.value=""),await v()},send:async()=>{k.includes(r.status)||await v()},clearMessages:()=>{i.value=[],r.errorMsg=null},addMessage:t=>{Array.isArray(t)?i.value.push(...t):i.value.push(t)},abortRequest:()=>{p&&(p.abort(),p=null,r.status="aborted")},retryRequest:async t=>{t===0||!i.value[t]||i.value[t].role==="user"||(i.value.splice(t),await v())}}}import{reactive as J,watch as W}from"vue";var M=class{constructor(e="tiny-robot-ai-conversations"){this.storageKey=e}saveConversations(e){try{localStorage.setItem(this.storageKey,JSON.stringify(e))}catch(o){console.error("\u4FDD\u5B58\u4F1A\u8BDD\u5931\u8D25:",o)}}loadConversations(){try{let e=localStorage.getItem(this.storageKey);return e?JSON.parse(e):[]}catch(e){return console.error("\u52A0\u8F7D\u4F1A\u8BDD\u5931\u8D25:",e),[]}}clear(){try{localStorage.removeItem(this.storageKey)}catch(e){console.error("\u6E05\u7A7A\u4F1A\u8BDD\u5931\u8D25:",e)}}};import{openDB as G}from"idb";var b=class{constructor(e="tiny-robot-ai-db",o=1){this.db=null;this.dbName=e,this.dbVersion=o}async getDB(){return this.db||(this.db=await G(this.dbName,this.dbVersion,{upgrade(e){e.objectStoreNames.contains("conversations")||e.createObjectStore("conversations",{keyPath:"id"}).createIndex("by-updated","updatedAt")}})),this.db}async saveConversations(e){try{let c=(await this.getDB()).transaction("conversations","readwrite");await c.store.clear(),await Promise.all(e.map(u=>c.store.put(u))),await c.done}catch(o){throw console.error("\u4FDD\u5B58\u4F1A\u8BDD\u5931\u8D25:",o),o}}async loadConversations(){try{return(await(await this.getDB()).getAllFromIndex("conversations","by-updated")).reverse()}catch(e){return console.error("\u52A0\u8F7D\u4F1A\u8BDD\u5931\u8D25:",e),[]}}async clear(){try{await(await this.getDB()).clear("conversations")}catch(e){throw console.error("\u6E05\u7A7A\u4F1A\u8BDD\u5931\u8D25:",e),e}}};function I(s={}){return new M(s.key||"tiny-robot-ai-conversations")}function q(s={}){return new b(s.dbName||"tiny-robot-ai-db",s.dbVersion||1)}function z(){return Date.now().toString(36)+Math.random().toString(36).substring(2,9)}function xe(s){let{client:e,storage:o,autoSave:c=!0,allowEmpty:u=!1,useStreamByDefault:i=!0,errorMessage:l="\u8BF7\u6C42\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5",events:d}=s,p=o||I(),r=J({conversations:[],currentId:null,loading:!1}),y=!1,m=K({client:e,useStreamByDefault:i,errorMessage:l,initialMessages:[],events:{onReceiveData:d?.onReceiveData,onFinish:d?.onFinish}});W(()=>m.messages.value,t=>{if(r.currentId&&t.length>0){let n=r.conversations.findIndex(a=>a.id===r.currentId);n!==-1&&(r.conversations[n].messages=[...t],r.conversations[n].updatedAt=Date.now(),c&&C())}},{deep:!0});let h=(t="\u65B0\u4F1A\u8BDD",n={})=>{if(!u&&m.messages.value.length===0&&r.currentId)return r.currentId;let a=z(),g={id:a,title:t,createdAt:Date.now(),updatedAt:Date.now(),messages:[],metadata:n};return r.conversations.unshift(g),f(a),c&&C(),a},f=t=>{let n=r.conversations.find(a=>a.id===t);n&&(r.currentId=t,m.clearMessages(),n.messages.length>0&&n.messages.forEach(a=>m.addMessage(a)))},v=t=>{let n=r.conversations.findIndex(a=>a.id===t);n!==-1&&(r.conversations.splice(n,1),r.currentId===t&&(r.conversations.length>0?f(r.conversations[0].id):(r.currentId=null,m.clearMessages())),c&&C())},A=(t,n)=>{let a=r.conversations.find(g=>g.id===t);a&&(a.title=n,a.updatedAt=Date.now(),c&&C())},P=(t,n)=>{let a=r.conversations.find(g=>g.id===t);a&&(a.metadata={...a.metadata,...n},a.updatedAt=Date.now(),c&&C())},C=async()=>{try{let t=JSON.parse(JSON.stringify(r.conversations));await p.saveConversations(t)}catch(t){console.error("\u4FDD\u5B58\u4F1A\u8BDD\u5931\u8D25:",t)}},E=async()=>{r.loading=!0;try{let t=await p.loadConversations();r.conversations=t,t.length>0&&!r.currentId&&f(t[0].id),!y&&d?.onLoaded&&(y=!0,d.onLoaded(t))}catch(t){console.error("\u52A0\u8F7D\u4F1A\u8BDD\u5931\u8D25:",t)}finally{r.loading=!1}},N=async t=>{let n=r.conversations.find(a=>a.id===t);if(!n||n.messages.length<2)return n?.title||"\u65B0\u4F1A\u8BDD";try{let a={role:"system",content:"\u8BF7\u6839\u636E\u4EE5\u4E0B\u5BF9\u8BDD\u5185\u5BB9\uFF0C\u751F\u6210\u4E00\u4E2A\u7B80\u77ED\u7684\u6807\u9898\uFF08\u4E0D\u8D85\u8FC720\u4E2A\u5B57\u7B26\uFF09\u3002\u53EA\u9700\u8981\u8FD4\u56DE\u6807\u9898\u6587\u672C\uFF0C\u4E0D\u9700\u8981\u4EFB\u4F55\u89E3\u91CA\u6216\u989D\u5916\u5185\u5BB9\u3002"},g=n.messages.slice(0,Math.min(4,n.messages.length)),U=(await e.chat({messages:[a,...g],options:{stream:!1,max_tokens:30}})).choices[0].message.content.trim();return A(t,U),U}catch(a){return console.error("\u751F\u6210\u6807\u9898\u5931\u8D25:",a),n.title}},B=()=>r.currentId&&r.conversations.find(t=>t.id===r.currentId)||null;return E(),{state:r,messageManager:m,createConversation:h,switchConversation:f,deleteConversation:v,updateTitle:A,updateMetadata:P,saveConversations:C,loadConversations:E,generateTitle:N,getCurrentConversation:B}}export{O as AIClient,x as BaseModelProvider,F as ErrorType,le as FinalStatus,k as GeneratingStatus,b as IndexedDBStrategy,M as LocalStorageStrategy,S as OpenAIProvider,V as STATUS,L as StreamEventType,j as extractTextFromResponse,H as formatMessages,D as handleSSEStream,q as indexedDBStorageStrategyFactory,I as localStorageStrategyFactory,xe as useConversation,K as useMessage};
3
+ `);a=y.pop()||"";for(let f of y)if(f.trim()!==""){if(f.trim()==="data: [DONE]"){d&&(c=d),e.onDone(c);continue}try{let v=f.match(/^data: (.+)$/m);if(!v)continue;let h=JSON.parse(v[1]);e.onData(h),d=h.choices?.[0]?.finish_reason||void 0}catch(v){console.error("Error parsing SSE message:",v)}}}(a.trim()==="data: [DONE]"||o?.aborted)&&(o?.aborted&&(c="aborted"),e.onDone(c))}catch(s){if(o?.aborted)return;throw s}}function B(n){return n.map(e=>typeof e=="object"&&"role"in e&&"content"in e?{role:e.role,content:String(e.content),...e.name?{name:e.name}:{}}:typeof e=="string"?{role:"user",content:e}:{role:"user",content:String(e)})}function H(n){return!n.choices||!n.choices.length?"":n.choices[0].message?.content||""}var S=class extends A{constructor(o){super(o);this.defaultModel="gpt-3.5-turbo";this.baseURL=o.apiUrl||"https://api.openai.com/v1",this.apiKey=o.apiKey||"",o.defaultModel&&(this.defaultModel=o.defaultModel),this.apiKey||console.warn("API key is not provided. Authentication will likely fail.")}async chat(o){try{this.validateRequest(o);let l={model:o.options?.model||this.config.defaultModel||this.defaultModel,messages:o.messages,...o.options,stream:!1},g={method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(l)};this.apiKey&&Object.assign(g.headers,{Authorization:`Bearer ${this.apiKey}`});let a=await fetch(`${this.baseURL}/chat/completions`,g);if(!a.ok){let c=await a.text();throw new Error(`HTTP error! status: ${a.status}, details: ${c}`)}return await a.json()}catch(l){throw I(l)}}async chatStream(o,l){let{signal:g,...a}=o.options||{};try{this.validateRequest(o);let c={model:o.options?.model||this.config.defaultModel||this.defaultModel,messages:o.messages,...a,stream:!0},d={method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`,Accept:"text/event-stream"},body:JSON.stringify(c),signal:g};this.apiKey&&Object.assign(d.headers,{Authorization:`Bearer ${this.apiKey}`});let s=await fetch(`${this.baseURL}/chat/completions`,d);if(!s.ok){let p=await s.text();throw new Error(`HTTP error! status: ${s.status}, details: ${p}`)}await b(s,l,g)}catch(c){if(g?.aborted)return;l.onError(I(c))}}updateConfig(o){super.updateConfig(o),o.apiUrl&&(this.baseURL=o.apiUrl),o.apiKey&&(this.apiKey=o.apiKey),o.defaultModel&&(this.defaultModel=o.defaultModel)}};var x=class{constructor(e){this.config=e,this.provider=this.createProvider(e)}createProvider(e){if(e.provider==="custom"&&"providerImplementation"in e)return e.providerImplementation;if(e.provider==="deepseek"){let o={defaultModel:"deepseek-chat",apiUrl:"https://api.deepseek.com/v1"};return new S({...o,...e})}else return new S(e)}async chat(e){return this.provider.chat(e)}async chatStream(e,o){let l={...e,options:{...e.options,stream:!0}};return this.provider.chatStream(l,o)}getConfig(){return{...this.config}}updateConfig(e){this.config={...this.config,...e},e.provider&&e.provider!==this.config.provider?this.provider=this.createProvider(this.config):this.provider.updateConfig(this.config)}};import{reactive as j,ref as O,toRaw as N}from"vue";var F=(c=>(c.INIT="init",c.PROCESSING="processing",c.STREAMING="streaming",c.FINISHED="finished",c.ABORTED="aborted",c.ERROR="error",c))(F||{}),_=["processing","streaming"],re=["finished","aborted","error"];function k(n){let{client:e,useStreamByDefault:o=!0,errorMessage:l="\u8BF7\u6C42\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5",initialMessages:g=[]}=n,a=O([...g]),c=O(""),d=O(o),s=null,p=j({status:"init",errorMsg:null}),m=t=>{let r=n.events?.onReceiveData,u=!1;if(r&&r(t,a,()=>{u=!0}),!u){let C={role:"assistant",content:t.choices[0].message.content};a.value.push(C)}},y=async t=>{let r=await e.chat({messages:N(a.value),options:{stream:!1,signal:t.signal}});m(r)},f=t=>{let r=n.events?.onReceiveData,u=!1;if(r&&r(t,a,()=>{u=!0}),!u){a.value[a.value.length-1].role==="user"&&a.value.push({role:"assistant",content:""});let C=t.choices?.[0];C&&C.delta.content&&(a.value[a.value.length-1].content+=C.delta.content)}},v=async t=>{await e.chatStream({messages:N(a.value),options:{stream:!0,signal:t.signal}},{onData:r=>{p.status="streaming",f(r)},onError:r=>{p.status="error",p.errorMsg=l,console.error("Stream request error:",r)},onDone:r=>{let u=n.events?.onFinish,C=!1;if(u&&u(r,{messages:a,messageState:p},()=>{C=!0}),!C){if(r==="aborted"||p.status==="aborted")return;p.status="finished"}}})},h=async()=>{p.status="processing",p.errorMsg=null,s=new AbortController;try{d.value?await v(s):await y(s)}catch(t){p.errorMsg=l,p.status="error",console.error("Send message error:",t)}finally{s=null}};return{messages:a,messageState:p,inputMessage:c,useStream:d,sendMessage:async(t=c.value,r=!0)=>{if(_.includes(p.status)||!t||typeof t=="string"&&!t.trim()||Array.isArray(t)&&t.length===0)return;let u={role:"user",content:t};a.value.push(u),r&&(c.value=""),await h()},send:async()=>{_.includes(p.status)||await h()},clearMessages:()=>{a.value=[],p.errorMsg=null},addMessage:t=>{Array.isArray(t)?a.value.push(...t):a.value.push(t)},abortRequest:()=>{s&&(s.abort(),s=null,p.status="aborted")},retryRequest:async t=>{t===0||!a.value[t]||a.value[t].role==="user"||(a.value.splice(t),await h())}}}import{reactive as L,watch as $}from"vue";var w=class{constructor(e="tiny-robot-ai-conversations"){this.storageKey=e}saveConversations(e){try{localStorage.setItem(this.storageKey,JSON.stringify(e))}catch(o){console.error("\u4FDD\u5B58\u4F1A\u8BDD\u5931\u8D25:",o)}}loadConversations(){try{let e=localStorage.getItem(this.storageKey);return e?JSON.parse(e):[]}catch(e){return console.error("\u52A0\u8F7D\u4F1A\u8BDD\u5931\u8D25:",e),[]}}};function G(){return Date.now().toString(36)+Math.random().toString(36).substring(2,9)}function le(n){let{client:e,storage:o=new w,autoSave:l=!0,allowEmpty:g=!1,useStreamByDefault:a=!0,errorMessage:c="\u8BF7\u6C42\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5",events:d}=n,s=L({conversations:[],currentId:null,loading:!1}),p=!1,m=k({client:e,useStreamByDefault:a,errorMessage:c,initialMessages:[],events:{onReceiveData:d?.onReceiveData,onFinish:d?.onFinish}});$(()=>m.messages.value,i=>{if(s.currentId&&i.length>0){let t=s.conversations.findIndex(r=>r.id===s.currentId);t!==-1&&(s.conversations[t].messages=[...i],s.conversations[t].updatedAt=Date.now(),l&&R())}},{deep:!0});let y=(i="\u65B0\u4F1A\u8BDD",t={})=>{if(!g&&m.messages.value.length===0&&s.currentId)return s.currentId;let r=G(),u={id:r,title:i,createdAt:Date.now(),updatedAt:Date.now(),messages:[],metadata:t};return s.conversations.unshift(u),f(r),l&&R(),r},f=i=>{let t=s.conversations.find(r=>r.id===i);t&&(s.currentId=i,m.clearMessages(),t.messages.length>0&&t.messages.forEach(r=>m.addMessage(r)))},v=i=>{let t=s.conversations.findIndex(r=>r.id===i);t!==-1&&(s.conversations.splice(t,1),s.currentId===i&&(s.conversations.length>0?f(s.conversations[0].id):(s.currentId=null,m.clearMessages())),l&&R())},h=(i,t)=>{let r=s.conversations.find(u=>u.id===i);r&&(r.title=t,r.updatedAt=Date.now(),l&&R())},T=(i,t)=>{let r=s.conversations.find(u=>u.id===i);r&&(r.metadata={...r.metadata,...t},r.updatedAt=Date.now(),l&&R())},R=async()=>{try{await o.saveConversations(s.conversations)}catch(i){console.error("\u4FDD\u5B58\u4F1A\u8BDD\u5931\u8D25:",i)}},E=async()=>{s.loading=!0;try{let i=await o.loadConversations();s.conversations=i,i.length>0&&!s.currentId&&f(i[0].id),!p&&d?.onLoaded&&(p=!0,d.onLoaded(i))}catch(i){console.error("\u52A0\u8F7D\u4F1A\u8BDD\u5931\u8D25:",i)}finally{s.loading=!1}},D=async i=>{let t=s.conversations.find(r=>r.id===i);if(!t||t.messages.length<2)return t?.title||"\u65B0\u4F1A\u8BDD";try{let r={role:"system",content:"\u8BF7\u6839\u636E\u4EE5\u4E0B\u5BF9\u8BDD\u5185\u5BB9\uFF0C\u751F\u6210\u4E00\u4E2A\u7B80\u77ED\u7684\u6807\u9898\uFF08\u4E0D\u8D85\u8FC720\u4E2A\u5B57\u7B26\uFF09\u3002\u53EA\u9700\u8981\u8FD4\u56DE\u6807\u9898\u6587\u672C\uFF0C\u4E0D\u9700\u8981\u4EFB\u4F55\u89E3\u91CA\u6216\u989D\u5916\u5185\u5BB9\u3002"},u=t.messages.slice(0,Math.min(4,t.messages.length)),U=(await e.chat({messages:[r,...u],options:{stream:!1,max_tokens:30}})).choices[0].message.content.trim();return h(i,U),U}catch(r){return console.error("\u751F\u6210\u6807\u9898\u5931\u8D25:",r),t.title}},P=()=>s.currentId&&s.conversations.find(i=>i.id===s.currentId)||null;return E(),{state:s,messageManager:m,createConversation:y,switchConversation:f,deleteConversation:v,updateTitle:h,updateMetadata:T,saveConversations:R,loadConversations:E,generateTitle:D,getCurrentConversation:P}}export{x as AIClient,A as BaseModelProvider,K as ErrorType,re as FinalStatus,_ as GeneratingStatus,w as LocalStorageStrategy,S as OpenAIProvider,F as STATUS,q as StreamEventType,H as extractTextFromResponse,B as formatMessages,b as handleSSEStream,le as useConversation,k as useMessage};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opentiny/tiny-robot-kit",
3
- "version": "0.3.1-alpha.8",
3
+ "version": "0.3.1-alpha.9",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -26,8 +26,5 @@
26
26
  "peerDependencies": {
27
27
  "vue": ">=3.0.0"
28
28
  },
29
- "dependencies": {
30
- "idb": "^8.0.3"
31
- },
32
- "gitHead": "556326790b2bb237959d259f4a38d9e4fb797713"
29
+ "gitHead": "d8a1d7cdf69e4c3078570634d9ddaeb6601de0e4"
33
30
  }