@huyooo/ai-chat-bridge-elysia 0.3.8 → 0.3.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.
Files changed (2) hide show
  1. package/dist/index.js +1 -1
  2. package/package.json +5 -5
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import{Elysia as e,t}from"elysia";import{ChatRuntime as n,DEFAULT_MODEL as r,buildModelOptions as i}from"@huyooo/ai-chat-core";import{createStorage as a}from"@huyooo/ai-chat-storage";import{assetManager as o,createDefaultToolExecutor as s}from"@huyooo/ai-chat-host-node";const c=t.Object({message:t.String(),sessionId:t.Optional(t.String()),images:t.Optional(t.Array(t.String())),options:t.Optional(t.Object({mode:t.Optional(t.Union([t.Literal(`agent`),t.Literal(`ask`)])),model:t.Optional(t.String()),provider:t.Optional(t.Union([t.Literal(`ark_v1`),t.Literal(`deepseek_v1`),t.Literal(`qwen_v1`),t.Literal(`glm_v1`),t.Literal(`moonshot_v1`),t.Literal(`minimax_v1`),t.Literal(`vercel_gateway_v1`),t.Literal(`anthropic_v1`),t.Literal(`gemini_v1`),t.Literal(`openai_v1`),t.Literal(`grok_v1`)])),enableWebSearch:t.Optional(t.Boolean()),thinkingMode:t.Optional(t.Union([t.Literal(`enabled`),t.Literal(`disabled`)])),thinkingBudget:t.Optional(t.Number()),history:t.Optional(t.Array(t.Object({role:t.Union([t.Literal(`user`),t.Literal(`assistant`),t.Literal(`system`),t.Literal(`tool`)]),content:t.String(),reasoning_content:t.Optional(t.String()),tool_call_id:t.Optional(t.String()),tool_calls:t.Optional(t.Array(t.Object({id:t.String(),type:t.Literal(`function`),function:t.Object({name:t.String(),arguments:t.String()}),thought_signature:t.Optional(t.String())})))})))}))}),l=t.Object({title:t.Optional(t.String()),model:t.Optional(t.String()),mode:t.Optional(t.Union([t.Literal(`agent`),t.Literal(`ask`)])),webSearchEnabled:t.Optional(t.Boolean()),thinkingEnabled:t.Optional(t.Boolean()),hidden:t.Optional(t.Boolean())}),u=t.Object({title:t.Optional(t.String()),model:t.Optional(t.String()),mode:t.Optional(t.Union([t.Literal(`agent`),t.Literal(`ask`)])),webSearchEnabled:t.Optional(t.Boolean()),thinkingEnabled:t.Optional(t.Boolean()),hidden:t.Optional(t.Boolean())}),d=t.Object({role:t.Union([t.Literal(`user`),t.Literal(`assistant`),t.Literal(`system`)]),content:t.String(),atContextItems:t.Optional(t.Array(t.Any())),images:t.Optional(t.Array(t.String())),model:t.Optional(t.String()),mode:t.Optional(t.String()),webSearchEnabled:t.Optional(t.Boolean()),thinkingEnabled:t.Optional(t.Boolean()),parts:t.Optional(t.Array(t.Object({type:t.String(),payload:t.String()}))),operationIds:t.Optional(t.String())}),f=t.Object({content:t.Optional(t.String()),atContextItems:t.Optional(t.Union([t.Array(t.Any()),t.Null()])),parts:t.Optional(t.Array(t.Object({type:t.String(),payload:t.String()}))),operationIds:t.Optional(t.String()),usage:t.Optional(t.String()),duration:t.Optional(t.Number())});function p(e){return{appId:e[`x-app-id`]||void 0,userId:e[`x-user-id`]||void 0}}async function m(m){let{llm:h,tools:g,dataDir:_,assetsDir:v,metadataStore:y,preloadTools:b,prefix:x=`/api/chat`,cwd:S,maxIterations:C,maxDurationMs:w,maxToolCalls:T,maxTotalTokens:E,sqliteFactory:D}=m,O=S??process.cwd(),k=v??(_?`${_}/assets`:void 0),A=_?`${_}/data/db.sqlite`:`./data/db.sqlite`,j=await o({tools:g,assetsDir:k,metadataStore:y,preloadTools:b}),M=new n({llmConfig:h,cwd:O,maxIterations:C,maxDurationMs:w,maxToolCalls:T,maxTotalTokens:E,tools:j.tools},s(O));await j.bind(M);let N=await a({type:`sqlite`,sqlitePath:A,sqliteFactory:D});return{app:new e({prefix:x}).get(`/models`,()=>({models:i(h)})).get(`/tools`,async()=>(await M.ensureInitialized(),{tools:M.getAllTools()})).post(`/stream`,async function*({body:e}){let t={...e.options};for await(let n of M.chat(e.message,t,e.images))yield`data: ${JSON.stringify(n)}\n\n`},{body:c}).ws(`/ws`,{body:t.Object({type:t.Union([t.Literal(`chat`),t.Literal(`abort`)]),message:t.Optional(t.String()),images:t.Optional(t.Array(t.String())),options:t.Optional(t.Object({mode:t.Optional(t.String()),model:t.Optional(t.String()),provider:t.Optional(t.String()),enableWebSearch:t.Optional(t.Boolean()),thinkingMode:t.Optional(t.String()),history:t.Optional(t.Array(t.Object({role:t.String(),content:t.String(),reasoning_content:t.Optional(t.String()),tool_call_id:t.Optional(t.String()),tool_calls:t.Optional(t.Array(t.Object({id:t.String(),type:t.Literal(`function`),function:t.Object({name:t.String(),arguments:t.String()}),thought_signature:t.Optional(t.String())})))})))}))}),async message(e,t){if(t.type===`abort`){M.abort(),e.send({type:`aborted`,data:`请求已取消`});return}if(t.type===`chat`&&t.message){let n={mode:t.options?.mode,model:t.options?.model,provider:t.options?.provider,enableWebSearch:t.options?.enableWebSearch,thinkingMode:t.options?.thinkingMode,history:t.options?.history};for await(let r of M.chat(t.message,n,t.images))e.send(r)}}}).post(`/send`,async({body:e})=>{let t=[];for await(let n of M.chat(e.message,{...e.options},e.images))t.push(n);return{success:!0,results:t}},{body:c}).post(`/abort`,()=>(M.abort(),{success:!0,message:`中断信号已发送`})).post(`/cwd`,({body:e})=>(M.setCwd(e.dir),{success:!0}),{body:t.Object({dir:t.String()})}).get(`/config`,()=>({config:M.getConfig()})).get(`/at/chats`,async({query:e,headers:t})=>{let n=p(t),r=e.limit?Number(e.limit):void 0,i=typeof e.query==`string`?e.query:``;return N.searchAtChats(i,{limit:r},n)}).get(`/sessions`,async({headers:e})=>{let t=p(e);return{sessions:await N.getSessions(t)}}).get(`/sessions/:id`,async({params:e,headers:t})=>{let n=p(t),r=await N.getSession(e.id,n);return r?{session:r}:{error:`会话不存在`}}).post(`/sessions`,async({body:e,headers:t})=>{let n=p(t),i={id:crypto.randomUUID(),title:e.title||`新对话`,model:e.model||r,mode:e.mode||`agent`,webSearchEnabled:e.webSearchEnabled??!0,thinkingEnabled:e.thinkingEnabled??!0,hidden:e.hidden??!1};return{session:await N.createSession(i,n)}},{body:l}).patch(`/sessions/:id`,async({params:e,body:t,headers:n})=>{let r=p(n);return await N.updateSession(e.id,t,r),{session:await N.getSession(e.id,r)}},{body:u}).delete(`/sessions/:id`,async({params:e,headers:t})=>{let n=p(t);return await N.deleteSession(e.id,n),{success:!0}}).get(`/sessions/:id/messages`,async({params:e,headers:t})=>{let n=p(t);return{messages:await N.getMessages(e.id,n)}}).get(`/sessions/:id/messages/page`,async({params:e,query:t,headers:n})=>{let r=p(n),i=t.limit?Number(t.limit):void 0,a=t.beforeSequence?Number(t.beforeSequence):void 0;return await N.getMessagesPage(e.id,{limit:i,beforeSequence:a},r)}).post(`/sessions/:id/messages`,async({params:e,body:t,headers:n})=>{let r=p(n),i=crypto.randomUUID(),a={id:i,clientId:i,sessionId:e.id,role:t.role,content:t.content,atContextItems:t.atContextItems||null,images:t.images||[],model:t.model||null,mode:t.mode||null,webSearchEnabled:t.webSearchEnabled??null,thinkingEnabled:t.thinkingEnabled??null,parts:t.parts||[],operationIds:t.operationIds||null};return{message:await N.saveMessage(a,r)}},{body:d}).patch(`/messages/:id`,async({params:e,body:t,headers:n})=>{let r=p(n),i={};return t.content!==void 0&&(i.content=t.content),t.atContextItems!==void 0&&(i.atContextItems=t.atContextItems),t.parts!==void 0&&(i.parts=t.parts),t.operationIds!==void 0&&(i.operationIds=t.operationIds),t.usage!==void 0&&(i.usage=t.usage),t.duration!==void 0&&(i.duration=t.duration),await N.updateMessage(e.id,i,r),{success:!0}},{body:f}).delete(`/sessions/:id/messages/after/:messageId`,async({params:e,headers:t})=>{let n=p(t);return await N.deleteMessagesAfterMessageId(e.id,e.messageId,n),{success:!0}}).get(`/sessions/:id/operations`,async({params:e,headers:t})=>{let n=p(t);return{operations:await N.getOperations(e.id,n)}}).get(`/trash`,async({headers:e})=>{let t=p(e);return{items:await N.getTrashItems?.(t)||[]}}).post(`/trash/:id/restore`,async({params:e,headers:t})=>{let n=p(t);return{item:await N.restoreFromTrash?.(e.id,n)}}).get(`/settings`,async({headers:e})=>{let t=p(e);return{settings:await N.getUserSettings(t)}}).get(`/settings/:key`,async({params:e,headers:t})=>{let n=p(t);return{value:await N.getUserSetting(e.key,n)}}).put(`/settings/:key`,async({params:e,body:t,headers:n})=>{let r=p(n);return await N.setUserSetting(e.key,t.value,r),{success:!0}},{body:t.Object({value:t.String()})}).delete(`/settings/:key`,async({params:e,headers:t})=>{let n=p(t);return await N.deleteUserSetting(e.key,n),{success:!0}}).get(`/health`,()=>({status:`ok`})),agent:M,storage:N,assetManager:j}}export{i as buildModelOptions,m as createElysiaChat};
1
+ import{Elysia as e,t}from"elysia";import{ChatRuntime as n,DEFAULT_MODEL as r,buildModelOptions as i}from"@huyooo/ai-chat-core";import{createStorage as a}from"@huyooo/ai-chat-storage";import{assetManager as o,createDefaultToolExecutor as s}from"@huyooo/ai-chat-host-node";const c=t.Object({message:t.String(),sessionId:t.Optional(t.String()),images:t.Optional(t.Array(t.String())),options:t.Optional(t.Object({mode:t.Optional(t.Union([t.Literal(`agent`),t.Literal(`ask`)])),model:t.Optional(t.String()),provider:t.Optional(t.Union([t.Literal(`ark_v1`),t.Literal(`deepseek_v1`),t.Literal(`qwen_v1`),t.Literal(`glm_v1`),t.Literal(`moonshot_v1`),t.Literal(`minimax_v1`),t.Literal(`vercel_gateway_v1`),t.Literal(`anthropic_v1`),t.Literal(`gemini_v1`),t.Literal(`openai_v1`),t.Literal(`openai_chat_v1`),t.Literal(`grok_v1`)])),enableWebSearch:t.Optional(t.Boolean()),thinkingMode:t.Optional(t.Union([t.Literal(`enabled`),t.Literal(`disabled`)])),thinkingBudget:t.Optional(t.Number()),history:t.Optional(t.Array(t.Object({role:t.Union([t.Literal(`user`),t.Literal(`assistant`),t.Literal(`system`),t.Literal(`tool`)]),content:t.String(),reasoning_content:t.Optional(t.String()),tool_call_id:t.Optional(t.String()),tool_calls:t.Optional(t.Array(t.Object({id:t.String(),type:t.Literal(`function`),function:t.Object({name:t.String(),arguments:t.String()}),thought_signature:t.Optional(t.String())})))})))}))}),l=t.Object({title:t.Optional(t.String()),model:t.Optional(t.String()),mode:t.Optional(t.Union([t.Literal(`agent`),t.Literal(`ask`)])),webSearchEnabled:t.Optional(t.Boolean()),thinkingEnabled:t.Optional(t.Boolean()),hidden:t.Optional(t.Boolean())}),u=t.Object({title:t.Optional(t.String()),model:t.Optional(t.String()),mode:t.Optional(t.Union([t.Literal(`agent`),t.Literal(`ask`)])),webSearchEnabled:t.Optional(t.Boolean()),thinkingEnabled:t.Optional(t.Boolean()),hidden:t.Optional(t.Boolean())}),d=t.Object({role:t.Union([t.Literal(`user`),t.Literal(`assistant`),t.Literal(`system`)]),content:t.String(),atContextItems:t.Optional(t.Array(t.Any())),images:t.Optional(t.Array(t.String())),model:t.Optional(t.String()),mode:t.Optional(t.String()),webSearchEnabled:t.Optional(t.Boolean()),thinkingEnabled:t.Optional(t.Boolean()),parts:t.Optional(t.Array(t.Object({type:t.String(),payload:t.String()}))),operationIds:t.Optional(t.String())}),f=t.Object({content:t.Optional(t.String()),atContextItems:t.Optional(t.Union([t.Array(t.Any()),t.Null()])),parts:t.Optional(t.Array(t.Object({type:t.String(),payload:t.String()}))),operationIds:t.Optional(t.String()),usage:t.Optional(t.String()),duration:t.Optional(t.Number())});function p(e){return{appId:e[`x-app-id`]||void 0,userId:e[`x-user-id`]||void 0}}async function m(m){let{llm:h,tools:g,dataDir:_,assetsDir:v,metadataStore:y,preloadTools:b,prefix:x=`/api/chat`,cwd:S,maxIterations:C,maxDurationMs:w,maxToolCalls:T,maxTotalTokens:E,sqliteFactory:D}=m,O=S??process.cwd(),k=v??(_?`${_}/assets`:void 0),A=_?`${_}/data/db.sqlite`:`./data/db.sqlite`,j=await o({tools:g,assetsDir:k,metadataStore:y,preloadTools:b}),M=new n({llmConfig:h,cwd:O,maxIterations:C,maxDurationMs:w,maxToolCalls:T,maxTotalTokens:E,tools:j.tools},s(O));await j.bind(M);let N=await a({type:`sqlite`,sqlitePath:A,sqliteFactory:D});return{app:new e({prefix:x}).get(`/models`,()=>({models:i(h)})).get(`/tools`,async()=>(await M.ensureInitialized(),{tools:M.getAllTools()})).post(`/stream`,async function*({body:e}){let t={...e.options};for await(let n of M.chat(e.message,t,e.images))yield`data: ${JSON.stringify(n)}\n\n`},{body:c}).ws(`/ws`,{body:t.Object({type:t.Union([t.Literal(`chat`),t.Literal(`abort`)]),message:t.Optional(t.String()),images:t.Optional(t.Array(t.String())),options:t.Optional(t.Object({mode:t.Optional(t.String()),model:t.Optional(t.String()),provider:t.Optional(t.String()),enableWebSearch:t.Optional(t.Boolean()),thinkingMode:t.Optional(t.String()),history:t.Optional(t.Array(t.Object({role:t.String(),content:t.String(),reasoning_content:t.Optional(t.String()),tool_call_id:t.Optional(t.String()),tool_calls:t.Optional(t.Array(t.Object({id:t.String(),type:t.Literal(`function`),function:t.Object({name:t.String(),arguments:t.String()}),thought_signature:t.Optional(t.String())})))})))}))}),async message(e,t){if(t.type===`abort`){M.abort(),e.send({type:`aborted`,data:`请求已取消`});return}if(t.type===`chat`&&t.message){let n={mode:t.options?.mode,model:t.options?.model,provider:t.options?.provider,enableWebSearch:t.options?.enableWebSearch,thinkingMode:t.options?.thinkingMode,history:t.options?.history};for await(let r of M.chat(t.message,n,t.images))e.send(r)}}}).post(`/send`,async({body:e})=>{let t=[];for await(let n of M.chat(e.message,{...e.options},e.images))t.push(n);return{success:!0,results:t}},{body:c}).post(`/abort`,()=>(M.abort(),{success:!0,message:`中断信号已发送`})).post(`/cwd`,({body:e})=>(M.setCwd(e.dir),{success:!0}),{body:t.Object({dir:t.String()})}).get(`/config`,()=>({config:M.getConfig()})).get(`/at/chats`,async({query:e,headers:t})=>{let n=p(t),r=e.limit?Number(e.limit):void 0,i=typeof e.query==`string`?e.query:``;return N.searchAtChats(i,{limit:r},n)}).get(`/sessions`,async({headers:e})=>{let t=p(e);return{sessions:await N.getSessions(t)}}).get(`/sessions/:id`,async({params:e,headers:t})=>{let n=p(t),r=await N.getSession(e.id,n);return r?{session:r}:{error:`会话不存在`}}).post(`/sessions`,async({body:e,headers:t})=>{let n=p(t),i={id:crypto.randomUUID(),title:e.title||`新对话`,model:e.model||r,mode:e.mode||`agent`,webSearchEnabled:e.webSearchEnabled??!0,thinkingEnabled:e.thinkingEnabled??!0,hidden:e.hidden??!1};return{session:await N.createSession(i,n)}},{body:l}).patch(`/sessions/:id`,async({params:e,body:t,headers:n})=>{let r=p(n);return await N.updateSession(e.id,t,r),{session:await N.getSession(e.id,r)}},{body:u}).delete(`/sessions/:id`,async({params:e,headers:t})=>{let n=p(t);return await N.deleteSession(e.id,n),{success:!0}}).get(`/sessions/:id/messages`,async({params:e,headers:t})=>{let n=p(t);return{messages:await N.getMessages(e.id,n)}}).get(`/sessions/:id/messages/page`,async({params:e,query:t,headers:n})=>{let r=p(n),i=t.limit?Number(t.limit):void 0,a=t.beforeSequence?Number(t.beforeSequence):void 0;return await N.getMessagesPage(e.id,{limit:i,beforeSequence:a},r)}).post(`/sessions/:id/messages`,async({params:e,body:t,headers:n})=>{let r=p(n),i=crypto.randomUUID(),a={id:i,clientId:i,sessionId:e.id,role:t.role,content:t.content,atContextItems:t.atContextItems||null,images:t.images||[],model:t.model||null,mode:t.mode||null,webSearchEnabled:t.webSearchEnabled??null,thinkingEnabled:t.thinkingEnabled??null,parts:t.parts||[],operationIds:t.operationIds||null};return{message:await N.saveMessage(a,r)}},{body:d}).patch(`/messages/:id`,async({params:e,body:t,headers:n})=>{let r=p(n),i={};return t.content!==void 0&&(i.content=t.content),t.atContextItems!==void 0&&(i.atContextItems=t.atContextItems),t.parts!==void 0&&(i.parts=t.parts),t.operationIds!==void 0&&(i.operationIds=t.operationIds),t.usage!==void 0&&(i.usage=t.usage),t.duration!==void 0&&(i.duration=t.duration),await N.updateMessage(e.id,i,r),{success:!0}},{body:f}).delete(`/sessions/:id/messages/after/:messageId`,async({params:e,headers:t})=>{let n=p(t);return await N.deleteMessagesAfterMessageId(e.id,e.messageId,n),{success:!0}}).get(`/sessions/:id/operations`,async({params:e,headers:t})=>{let n=p(t);return{operations:await N.getOperations(e.id,n)}}).get(`/trash`,async({headers:e})=>{let t=p(e);return{items:await N.getTrashItems?.(t)||[]}}).post(`/trash/:id/restore`,async({params:e,headers:t})=>{let n=p(t);return{item:await N.restoreFromTrash?.(e.id,n)}}).get(`/settings`,async({headers:e})=>{let t=p(e);return{settings:await N.getUserSettings(t)}}).get(`/settings/:key`,async({params:e,headers:t})=>{let n=p(t);return{value:await N.getUserSetting(e.key,n)}}).put(`/settings/:key`,async({params:e,body:t,headers:n})=>{let r=p(n);return await N.setUserSetting(e.key,t.value,r),{success:!0}},{body:t.Object({value:t.String()})}).delete(`/settings/:key`,async({params:e,headers:t})=>{let n=p(t);return await N.deleteUserSetting(e.key,n),{success:!0}}).get(`/health`,()=>({status:`ok`})),agent:M,storage:N,assetManager:j}}export{i as buildModelOptions,m as createElysiaChat};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@huyooo/ai-chat-bridge-elysia",
3
- "version": "0.3.8",
3
+ "version": "0.3.9",
4
4
  "description": "AI Chat Elysia Bridge - HTTP/WebSocket integration for Elysia.js",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -27,10 +27,10 @@
27
27
  "test:watch": "vitest"
28
28
  },
29
29
  "dependencies": {
30
- "@huyooo/ai-chat-core": "^0.3.8",
31
- "@huyooo/ai-chat-host-node": "^0.3.8",
32
- "@huyooo/ai-chat-storage": "^0.3.8",
33
- "@huyooo/ai-chat-tools-node": "^0.3.8"
30
+ "@huyooo/ai-chat-core": "^0.3.9",
31
+ "@huyooo/ai-chat-host-node": "^0.3.9",
32
+ "@huyooo/ai-chat-storage": "^0.3.9",
33
+ "@huyooo/ai-chat-tools-node": "^0.3.9"
34
34
  },
35
35
  "peerDependencies": {
36
36
  "better-sqlite3": ">=9.0.0",