@easbot/ollama-sdk 0.3.0 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,6 +1,6 @@
1
- 'use strict';var utils=require('@easbot/utils');require('path');var H=Object.defineProperty;var X=(s,t,e)=>t in s?H(s,t,{enumerable:true,configurable:true,writable:true,value:e}):s[t]=e;var r=(s,t,e)=>X(s,typeof t!="symbol"?t+"":t,e);var D=class{constructor(t="http://localhost:11434"){r(this,"baseURL",t);}async*streamChat(t){let e=await fetch(`${this.baseURL}/api/chat`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...t,stream:true})});if(!e.ok)throw new Error(`Ollama API error: ${e.status} ${e.statusText}`);if(!e.body)throw new Error("Response body is null");let o=e.body.getReader(),a=new TextDecoder,n="";try{for(;;){let{done:l,value:c}=await o.read();if(l){if(n.trim())try{yield JSON.parse(n);}catch{}break}n+=a.decode(c,{stream:!0});let u=n.split(`
2
- `);n=u.pop()||"";for(let b of u){let O=b.trim();if(O)try{yield JSON.parse(O);}catch{}}}}finally{o.releaseLock();}}async chat(t){let e=await fetch(`${this.baseURL}/api/chat`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...t,stream:false})});if(!e.ok)throw new Error(`Ollama API error: ${e.status} ${e.statusText}`);return e.json()}};var w={numCtx:262144,temperature:.7,topK:40,topP:.9,repeatPenalty:1.1,numPredict:32e3},ee=["numCtx","repeatPenalty","numPredict"];var _=class extends Error{constructor(e,o){super(e);r(this,"cause",o);this.name="OllamaError",Object.setPrototypeOf(this,new.target.prototype);}},J=class extends _{constructor(e,o,a){super(e,a);r(this,"url",o);this.name="ConnectionError";}},G=class extends _{constructor(e,o){super(`Model not found: ${e}`,o);r(this,"modelId",e);this.name="ModelNotFoundError";}},z=class extends _{constructor(e,o,a,n){super(e,n);r(this,"field",o);r(this,"value",a);this.name="ValidationError";}},B=class extends _{constructor(e,o,a){super(e,a);r(this,"timeoutMs",o);this.name="TimeoutError";}},T=class extends _{constructor(e,o,a){super(`Invalid tool definition for "${e}": missing ${o}`,a);r(this,"toolName",e);r(this,"missingField",o);this.name="InvalidToolDefinitionError";}};function Q(s,t,e){let o;return t?o="tool-calls":s?o="stop":o="other",{unified:o,raw:e}}var x=utils.Log.create({service:"ollama-sdk",module:"native-language-model"});function V(){return `${Date.now()}-${Math.random().toString(36).substring(2,9)}`}function U(s){if(!s||s.trim().length===0)return false;try{return JSON.parse(s),!0}catch{return false}}function K(s){return typeof s=="string"?s:JSON.stringify(s)}function Y(s){return !s.tools||s.tools.length===0?{}:{tools:s.tools.map(t=>{if(!t.name)throw new T(t.name||"unknown","name");let e=t.inputSchema||t.parameters;if(!e)throw new T(t.name,"inputSchema");return {type:"function",function:{name:t.name,description:t.description,parameters:e}}})}}function Z(s){let t=[];for(let e of s)try{switch(e.role){case "system":t.push({role:"system",content:e.content});break;case "user":{let o=e.content.filter(a=>a.type==="text").map(a=>a.text).join(`
3
- `);o&&t.push({role:"user",content:o});break}case "assistant":{let o="",a=[];for(let n of e.content)if(n.type==="text")o+=n.text;else if(n.type==="tool-call"){let l=n;a.push({id:l.toolCallId,type:"function",function:{name:l.toolName,arguments:JSON.stringify(l.input)}});}t.push({role:"assistant",content:o||null,tool_calls:a.length>0?a:void 0});break}case "tool":for(let o of e.content){let a=o.output,n;switch(a.type){case "text":case "error-text":n=a.value;break;case "content":case "json":case "error-json":n=JSON.stringify(a.value);break;default:n=String(a.value);break}t.push({role:"tool",tool_call_id:o.toolCallId,content:n});}break}}catch(o){x.warn("Failed to convert message",{messageRole:e.role,error:o instanceof Error?o.message:String(o)});}return t}var F=class{constructor(t,e={}){r(this,"specificationVersion","v3");r(this,"provider","ollama");r(this,"modelId");r(this,"defaultObjectGenerationMode","json");r(this,"supportedUrls",{});r(this,"client");this.modelId=t,this.client=new D(e.baseURL);}async generate(t){return this.doGenerate(t)}async stream(t){return this.doStream(t)}async doStream(t){let e=V();x.debug("Stream request started",{traceId:e,modelId:this.modelId,hasTools:!!t.tools&&t.tools.length>0,toolCount:t.tools?.length||0,messageCount:t.prompt.length});let o=Z(t.prompt),a=Y({tools:t.tools}),n=JSON.stringify({model:this.modelId,messages:o,options:w,...a}),l=null,c=null,u=m=>{l&&l.enqueue(m),c&&c.enqueue(m);},b=async()=>{try{let m=!0,M=!1,L=!1,E="",p="",N=!1,P=[],d=[],j=()=>{if(d.length>0){for(let v of d)u(v);d.length=0;}},y=null;for await(let v of this.client.streamChat({model:this.modelId,messages:o,options:w,...a})){if(y&&y.chunkCount++,m){m=!1;let k={type:"response-metadata",id:V(),modelId:this.modelId,timestamp:new Date(v.created_at)};u(k),y&&y.eventCount++;}if(v.message?.tool_calls){L&&(d.push({type:"reasoning-end",id:"reasoning-0"}),L=!1),M&&(d.push({type:"text-end",id:"txt-0"}),M=!1);for(let k of v.message.tool_calls){if(!k.id||!k.function?.name){let $=k.id?"function.name":"id";x.error("Invalid tool call: missing field",{traceId:e,missingField:$,toolCall:void 0}),d.push({type:"error",error:`Invalid tool call: missing ${$}`});continue}let f=k.id,C=k.function.name,h=K(k.function.arguments),S=P.find($=>$.id===f);S?(S.function.arguments+=h,x.debug("Tool call arguments accumulated",{traceId:e,toolCallId:f,toolName:C,deltaLength:h.length,totalLength:S.function.arguments.length,isComplete:U(S.function.arguments)}),h&&d.push({type:"tool-input-delta",id:f,delta:h})):(S={id:f,type:"function",function:{name:C,arguments:h},hasFinished:!1},P.push(S),y&&y.toolCallCount++,x.debug("Tool call received",{traceId:e,toolCallId:f,toolName:C,argumentsLength:h.length,isComplete:U(h)}),d.push({type:"tool-input-start",id:f,toolName:C}),h&&d.push({type:"tool-input-delta",id:f,delta:h}));let W=U(S.function.arguments);!S.hasFinished&&W&&(x.debug("Tool call arguments complete",{traceId:e,toolCallId:f,toolName:C,isComplete:W,argumentsLength:S.function.arguments.length}),d.push({type:"tool-input-end",id:f}),d.push({type:"tool-call",toolCallId:f,toolName:C,input:S.function.arguments}),S.hasFinished=!0);}j(),y&&(y.eventCount+=d.length);}if(v.message?.content){let k=v.message.content;for(p+=k;p.length>0;)if(N){let f=p.indexOf("</think>");if(f===-1){p.length>0&&d.push({type:"reasoning-delta",id:"reasoning-0",delta:p}),p="";break}else {if(f>0){let C=p.substring(0,f);d.push({type:"reasoning-delta",id:"reasoning-0",delta:C});}d.push({type:"reasoning-end",id:"reasoning-0"}),L=!1,N=!1,p=p.substring(f+8);}}else {let f=p.indexOf("<think>");if(f===-1){p.length>0&&(M||(M=!0,d.push({type:"text-start",id:"txt-0"})),d.push({type:"text-delta",id:"txt-0",delta:p}),E+=p),p="";break}else {if(f>0){let C=p.substring(0,f);M||(M=!0,d.push({type:"text-start",id:"txt-0"})),d.push({type:"text-delta",id:"txt-0",delta:C}),E+=C,d.push({type:"text-end",id:"txt-0"}),M=!1;}N=!0,p=p.substring(f+7),L||(L=!0,d.push({type:"reasoning-start",id:"reasoning-0"}));}}}if(j(),y&&(y.eventCount+=d.length),v.done){let k=P.filter(h=>!h.hasFinished);for(let h of k)d.push({type:"tool-input-end",id:h.id}),d.push({type:"tool-call",toolCallId:h.id,toolName:h.function.name,input:h.function.arguments});p.length>0&&(N?(d.push({type:"reasoning-delta",id:"reasoning-0",delta:p}),d.push({type:"reasoning-end",id:"reasoning-0"})):(M||(M=!0,d.push({type:"text-start",id:"txt-0"})),d.push({type:"text-delta",id:"txt-0",delta:p}),E+=p)),M&&d.push({type:"text-end",id:"txt-0"});let C=P.length>0?"tool-calls":"stop";if(d.push({type:"finish",finishReason:C,usage:{inputTokens:{total:v.prompt_eval_count||0,noCache:void 0,cacheRead:void 0,cacheWrite:void 0},outputTokens:{total:v.eval_count||0,text:void 0,reasoning:void 0}},providerMetadata:{ollama:{totalDuration:v.total_duration||0,loadDuration:v.load_duration||0,promptEvalDuration:v.prompt_eval_duration||0,evalDuration:v.eval_duration||0}}}),j(),y&&(y.eventCount+=d.length),y);P.length=0;}}}catch(m){x.error("Stream processing error",{traceId:e,error:m instanceof Error?m.message:String(m),stack:void 0}),u({type:"error",error:m instanceof Error?m.message:String(m)}),u({type:"finish",finishReason:"error",usage:{inputTokens:{total:0,noCache:void 0,cacheRead:void 0,cacheWrite:void 0},outputTokens:{total:0,text:void 0,reasoning:void 0}}});}finally{l&&l.close(),c&&c.close();}},O=new ReadableStream({start(m){l=m;}}),i=new ReadableStream({start(m){c=m;}});b();async function*g(m){let M=m.getReader();try{for(;;){let{done:L,value:E}=await M.read();if(L)break;yield E;}}finally{M.releaseLock();}}return {stream:O,fullStream:g(i),request:{body:n},response:{}}}async doGenerate(t){let e=V();x.debug("Generate request started",{traceId:e,modelId:this.modelId,hasTools:!!t.tools&&t.tools.length>0,toolCount:t.tools?.length||0,messageCount:t.prompt.length});let o=Z(t.prompt),a=Y({tools:t.tools}),n=await this.client.chat({model:this.modelId,messages:o,options:w,...a}),l=[];if(n.message?.content&&l.push({type:"text",text:n.message.content}),n.message?.tool_calls){x.debug("Tool calls received in generate",{traceId:e,toolCallCount:n.message.tool_calls.length});for(let b of n.message.tool_calls){let O=b.id||V(),i=b.function.name,g=K(b.function.arguments);x.debug("Processing tool call in generate",{traceId:e,toolCallId:O,toolName:i,argumentsLength:g.length,isComplete:U(g)}),l.push({type:"tool-call",toolCallId:O,toolName:i,input:g});}}let c=!!(n.message?.tool_calls&&n.message.tool_calls.length>0),u=Q(n.done??false,c,"stop");return x.debug("Generate request completed",{traceId:e,finishReason:u,contentParts:l.length,hasToolCalls:c,inputTokens:n.prompt_eval_count||0,outputTokens:n.eval_count||0}),{content:l,finishReason:u,usage:{inputTokens:{total:n.prompt_eval_count||0,noCache:void 0,cacheRead:void 0,cacheWrite:void 0},outputTokens:{total:n.eval_count||0,text:void 0,reasoning:void 0}},providerMetadata:{ollama:{totalDuration:n.total_duration||0,loadDuration:n.load_duration||0,promptEvalDuration:n.prompt_eval_duration||0,evalDuration:n.eval_duration||0}},request:{body:JSON.stringify({model:this.modelId,messages:o,options:w,...a})},response:{}}}};var I=class{constructor(t,e={}){r(this,"specificationVersion","v3");r(this,"provider","ollama");r(this,"modelId");r(this,"defaultObjectGenerationMode","json");r(this,"supportedUrls",{});r(this,"nativeModel");this.modelId=t,this.nativeModel=new F(t,{baseURL:e.baseURL||"http://localhost:11434"});}doGenerate(t){return this.nativeModel.doGenerate(t)}doStream(t){return this.nativeModel.doStream(t)}async generate(t){return this.nativeModel.generate(t)}async stream(t){return this.nativeModel.stream(t)}};var A=class{constructor(t,e={}){r(this,"specificationVersion","v3");r(this,"provider","ollama");r(this,"modelId");r(this,"maxEmbeddingsPerCall");r(this,"supportsParallelCalls",true);r(this,"baseURL");this.modelId=t,this.baseURL=e.baseURL||"http://localhost:11434";}async doEmbed(t){let{values:e,abortSignal:o}=t,a=utils.Log.create({service:"ollama-embedding"});if(!e||e.length===0)return a.warn("Empty values array provided",{modelId:this.modelId}),{embeddings:[],usage:{tokens:0},warnings:[]};a.debug("Generating text embeddings",{modelId:this.modelId,valuesCount:e.length,baseURL:this.baseURL});try{let n=await Promise.all(e.map(c=>this.generateSingleEmbedding(c,o))),l=e.reduce((c,u)=>c+this.estimateTokens(u),0);return a.debug("Text embeddings generated successfully",{modelId:this.modelId,embeddingsCount:n.length,totalTokens:l}),{embeddings:n,usage:{tokens:l},warnings:[]}}catch(n){throw a.error("Text embedding generation failed",{modelId:this.modelId,error:n instanceof Error?n.message:String(n),stack:void 0}),n}}async generateSingleEmbedding(t,e){let o=`${this.baseURL}/api/embeddings`;try{let a=await fetch(o,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:this.modelId,prompt:t}),signal:e});if(!a.ok){let l=await a.text();throw new Error(`Ollama embedding API error (${a.status}): ${l}`)}let n=await a.json();if(!n.embedding||!Array.isArray(n.embedding))throw new Error("Invalid response format from Ollama embedding API");return n.embedding}catch(a){throw a instanceof TypeError&&a.message.includes("fetch")?new Error(`Failed to connect to Ollama server at ${this.baseURL}: ${a.message}`):a}}estimateTokens(t){let e=t.match(/[a-zA-Z]/g)?.length||0,o=t.match(/[\u4e00-\u9fa5]/g)?.length||0,a=t.length-e-o;return Math.ceil(e/4)+o+Math.ceil(a*.5)}};var q=class{constructor(t,e,o={}){r(this,"specificationVersion","v3");r(this,"provider","ollama");r(this,"modelId");r(this,"languageModel");r(this,"options");r(this,"log",utils.Log.create({service:"ollama-sdk",module:"reranking-model"}));this.modelId=t,this.languageModel=new I(t,e),this.options={totalScore:o.totalScore??1,useEnhancedPrompt:o.useEnhancedPrompt??true,promptLanguage:o.promptLanguage??"en"},this.log.debug("OllamaRerankingModel created",{modelId:t,totalScore:this.options.totalScore,useEnhancedPrompt:this.options.useEnhancedPrompt,promptLanguage:this.options.promptLanguage});}async doRerank(t){let{query:e,documents:o,topN:a}=t,n;Array.isArray(o)?n=o:o.type==="text"?n=o.values.map((u,b)=>({content:u,id:`doc_${b+1}`})):n=o.values;let l=a??n.length;if(n.length===0)return {ranking:[],warnings:[]};try{let u=this.buildRerankPrompt(e,n),O=(await this.languageModel.doGenerate({prompt:[{role:"user",content:[{type:"text",text:u}]}],maxOutputTokens:500,temperature:.1})).content.find(g=>g.type==="text")?.text||"",i=this.parseRerankResult(O,n,l);return {ranking:i.results.map(g=>({index:g.index,relevanceScore:g.score,document:g.document})),warnings:i.warnings.map(g=>({type:"other",message:g}))}}catch(u){return this.log.error("Reranking failed",{error:u.message}),{ranking:n.map((O,i)=>({index:i,relevanceScore:this.options.totalScore*(1-i/n.length),document:O})),warnings:[{type:"other",message:`Reranking failed, using original order: ${u.message}`}]}}}buildRerankPrompt(t,e){let o=e.map((a,n)=>{let l=a.id||`doc_${n+1}`,c=a.content.slice(0,300);return `${n+1}. [ID: ${l}] ${c}`}).join(`
1
+ 'use strict';var utils=require('@easbot/utils');var H=Object.defineProperty;var X=(s,t,e)=>t in s?H(s,t,{enumerable:true,configurable:true,writable:true,value:e}):s[t]=e;var r=(s,t,e)=>X(s,typeof t!="symbol"?t+"":t,e);var D=class{constructor(t="http://localhost:11434"){r(this,"baseURL",t);}async*streamChat(t){let e=await fetch(`${this.baseURL}/api/chat`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...t,stream:true})});if(!e.ok)throw new Error(`Ollama API error: ${e.status} ${e.statusText}`);if(!e.body)throw new Error("Response body is null");let o=e.body.getReader(),a=new TextDecoder,n="";try{for(;;){let{done:l,value:c}=await o.read();if(l){if(n.trim())try{yield JSON.parse(n);}catch{}break}n+=a.decode(c,{stream:!0});let u=n.split(`
2
+ `);n=u.pop()||"";for(let b of u){let O=b.trim();if(O)try{yield JSON.parse(O);}catch{}}}}finally{o.releaseLock();}}async chat(t){let e=await fetch(`${this.baseURL}/api/chat`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...t,stream:false})});if(!e.ok)throw new Error(`Ollama API error: ${e.status} ${e.statusText}`);return e.json()}};var w={numCtx:262144,temperature:.7,topK:40,topP:.9,repeatPenalty:1.1,numPredict:32e3},ee=["numCtx","repeatPenalty","numPredict"];var I=class extends Error{constructor(e,o){super(e);r(this,"cause",o);this.name="OllamaError",Object.setPrototypeOf(this,new.target.prototype);}},J=class extends I{constructor(e,o,a){super(e,a);r(this,"url",o);this.name="ConnectionError";}},G=class extends I{constructor(e,o){super(`Model not found: ${e}`,o);r(this,"modelId",e);this.name="ModelNotFoundError";}},z=class extends I{constructor(e,o,a,n){super(e,n);r(this,"field",o);r(this,"value",a);this.name="ValidationError";}},B=class extends I{constructor(e,o,a){super(e,a);r(this,"timeoutMs",o);this.name="TimeoutError";}},T=class extends I{constructor(e,o,a){super(`Invalid tool definition for "${e}": missing ${o}`,a);r(this,"toolName",e);r(this,"missingField",o);this.name="InvalidToolDefinitionError";}};function Q(s,t,e){let o;return t?o="tool-calls":s?o="stop":o="other",{unified:o,raw:e}}var x=utils.Log.create({service:"ollama-sdk",module:"native-language-model"});function V(){return `${Date.now()}-${Math.random().toString(36).substring(2,9)}`}function U(s){if(!s||s.trim().length===0)return false;try{return JSON.parse(s),!0}catch{return false}}function K(s){return typeof s=="string"?s:JSON.stringify(s)}function Y(s){return !s.tools||s.tools.length===0?{}:{tools:s.tools.map(t=>{if(!t.name)throw new T(t.name||"unknown","name");let e=t.inputSchema||t.parameters;if(!e)throw new T(t.name,"inputSchema");return {type:"function",function:{name:t.name,description:t.description,parameters:e}}})}}function Z(s){let t=[];for(let e of s)try{switch(e.role){case "system":t.push({role:"system",content:e.content});break;case "user":{let o=e.content.filter(a=>a.type==="text").map(a=>a.text).join(`
3
+ `);o&&t.push({role:"user",content:o});break}case "assistant":{let o="",a=[];for(let n of e.content)if(n.type==="text")o+=n.text;else if(n.type==="tool-call"){let l=n;a.push({id:l.toolCallId,type:"function",function:{name:l.toolName,arguments:JSON.stringify(l.input)}});}t.push({role:"assistant",content:o||null,tool_calls:a.length>0?a:void 0});break}case "tool":for(let o of e.content){let a=o.output,n;switch(a.type){case "text":case "error-text":n=a.value;break;case "content":case "json":case "error-json":n=JSON.stringify(a.value);break;default:n=String(a.value);break}t.push({role:"tool",tool_call_id:o.toolCallId,content:n});}break}}catch(o){x.warn("Failed to convert message",{messageRole:e.role,error:o instanceof Error?o.message:String(o)});}return t}var q=class{constructor(t,e={}){r(this,"specificationVersion","v3");r(this,"provider","ollama");r(this,"modelId");r(this,"defaultObjectGenerationMode","json");r(this,"supportedUrls",{});r(this,"client");this.modelId=t,this.client=new D(e.baseURL);}async generate(t){return this.doGenerate(t)}async stream(t){return this.doStream(t)}async doStream(t){let e=V();x.debug("Stream request started",{traceId:e,modelId:this.modelId,hasTools:!!t.tools&&t.tools.length>0,toolCount:t.tools?.length||0,messageCount:t.prompt.length});let o=Z(t.prompt),a=Y({tools:t.tools}),n=JSON.stringify({model:this.modelId,messages:o,options:w,...a}),l=null,c=null,u=m=>{l&&l.enqueue(m),c&&c.enqueue(m);},b=async()=>{try{let m=!0,M=!1,L=!1,E="",p="",N=!1,P=[],d=[],j=()=>{if(d.length>0){for(let v of d)u(v);d.length=0;}},y=null;for await(let v of this.client.streamChat({model:this.modelId,messages:o,options:w,...a})){if(y&&y.chunkCount++,m){m=!1;let k={type:"response-metadata",id:V(),modelId:this.modelId,timestamp:new Date(v.created_at)};u(k),y&&y.eventCount++;}if(v.message?.tool_calls){L&&(d.push({type:"reasoning-end",id:"reasoning-0"}),L=!1),M&&(d.push({type:"text-end",id:"txt-0"}),M=!1);for(let k of v.message.tool_calls){if(!k.id||!k.function?.name){let $=k.id?"function.name":"id";x.error("Invalid tool call: missing field",{traceId:e,missingField:$,toolCall:void 0}),d.push({type:"error",error:`Invalid tool call: missing ${$}`});continue}let f=k.id,C=k.function.name,h=K(k.function.arguments),S=P.find($=>$.id===f);S?(S.function.arguments+=h,x.debug("Tool call arguments accumulated",{traceId:e,toolCallId:f,toolName:C,deltaLength:h.length,totalLength:S.function.arguments.length,isComplete:U(S.function.arguments)}),h&&d.push({type:"tool-input-delta",id:f,delta:h})):(S={id:f,type:"function",function:{name:C,arguments:h},hasFinished:!1},P.push(S),y&&y.toolCallCount++,x.debug("Tool call received",{traceId:e,toolCallId:f,toolName:C,argumentsLength:h.length,isComplete:U(h)}),d.push({type:"tool-input-start",id:f,toolName:C}),h&&d.push({type:"tool-input-delta",id:f,delta:h}));let W=U(S.function.arguments);!S.hasFinished&&W&&(x.debug("Tool call arguments complete",{traceId:e,toolCallId:f,toolName:C,isComplete:W,argumentsLength:S.function.arguments.length}),d.push({type:"tool-input-end",id:f}),d.push({type:"tool-call",toolCallId:f,toolName:C,input:S.function.arguments}),S.hasFinished=!0);}j(),y&&(y.eventCount+=d.length);}if(v.message?.content){let k=v.message.content;for(p+=k;p.length>0;)if(N){let f=p.indexOf("</think>");if(f===-1){p.length>0&&d.push({type:"reasoning-delta",id:"reasoning-0",delta:p}),p="";break}else {if(f>0){let C=p.substring(0,f);d.push({type:"reasoning-delta",id:"reasoning-0",delta:C});}d.push({type:"reasoning-end",id:"reasoning-0"}),L=!1,N=!1,p=p.substring(f+8);}}else {let f=p.indexOf("<think>");if(f===-1){p.length>0&&(M||(M=!0,d.push({type:"text-start",id:"txt-0"})),d.push({type:"text-delta",id:"txt-0",delta:p}),E+=p),p="";break}else {if(f>0){let C=p.substring(0,f);M||(M=!0,d.push({type:"text-start",id:"txt-0"})),d.push({type:"text-delta",id:"txt-0",delta:C}),E+=C,d.push({type:"text-end",id:"txt-0"}),M=!1;}N=!0,p=p.substring(f+7),L||(L=!0,d.push({type:"reasoning-start",id:"reasoning-0"}));}}}if(j(),y&&(y.eventCount+=d.length),v.done){let k=P.filter(h=>!h.hasFinished);for(let h of k)d.push({type:"tool-input-end",id:h.id}),d.push({type:"tool-call",toolCallId:h.id,toolName:h.function.name,input:h.function.arguments});p.length>0&&(N?(d.push({type:"reasoning-delta",id:"reasoning-0",delta:p}),d.push({type:"reasoning-end",id:"reasoning-0"})):(M||(M=!0,d.push({type:"text-start",id:"txt-0"})),d.push({type:"text-delta",id:"txt-0",delta:p}),E+=p)),M&&d.push({type:"text-end",id:"txt-0"});let C=P.length>0?"tool-calls":"stop";if(d.push({type:"finish",finishReason:C,usage:{inputTokens:{total:v.prompt_eval_count||0,noCache:void 0,cacheRead:void 0,cacheWrite:void 0},outputTokens:{total:v.eval_count||0,text:void 0,reasoning:void 0}},providerMetadata:{ollama:{totalDuration:v.total_duration||0,loadDuration:v.load_duration||0,promptEvalDuration:v.prompt_eval_duration||0,evalDuration:v.eval_duration||0}}}),j(),y&&(y.eventCount+=d.length),y);P.length=0;}}}catch(m){x.error("Stream processing error",{traceId:e,error:m instanceof Error?m.message:String(m),stack:void 0}),u({type:"error",error:m instanceof Error?m.message:String(m)}),u({type:"finish",finishReason:"error",usage:{inputTokens:{total:0,noCache:void 0,cacheRead:void 0,cacheWrite:void 0},outputTokens:{total:0,text:void 0,reasoning:void 0}}});}finally{l&&l.close(),c&&c.close();}},O=new ReadableStream({start(m){l=m;}}),i=new ReadableStream({start(m){c=m;}});b();async function*g(m){let M=m.getReader();try{for(;;){let{done:L,value:E}=await M.read();if(L)break;yield E;}}finally{M.releaseLock();}}return {stream:O,fullStream:g(i),request:{body:n},response:{}}}async doGenerate(t){let e=V();x.debug("Generate request started",{traceId:e,modelId:this.modelId,hasTools:!!t.tools&&t.tools.length>0,toolCount:t.tools?.length||0,messageCount:t.prompt.length});let o=Z(t.prompt),a=Y({tools:t.tools}),n=await this.client.chat({model:this.modelId,messages:o,options:w,...a}),l=[];if(n.message?.content&&l.push({type:"text",text:n.message.content}),n.message?.tool_calls){x.debug("Tool calls received in generate",{traceId:e,toolCallCount:n.message.tool_calls.length});for(let b of n.message.tool_calls){let O=b.id||V(),i=b.function.name,g=K(b.function.arguments);x.debug("Processing tool call in generate",{traceId:e,toolCallId:O,toolName:i,argumentsLength:g.length,isComplete:U(g)}),l.push({type:"tool-call",toolCallId:O,toolName:i,input:g});}}let c=!!(n.message?.tool_calls&&n.message.tool_calls.length>0),u=Q(n.done??false,c,"stop");return x.debug("Generate request completed",{traceId:e,finishReason:u,contentParts:l.length,hasToolCalls:c,inputTokens:n.prompt_eval_count||0,outputTokens:n.eval_count||0}),{content:l,finishReason:u,usage:{inputTokens:{total:n.prompt_eval_count||0,noCache:void 0,cacheRead:void 0,cacheWrite:void 0},outputTokens:{total:n.eval_count||0,text:void 0,reasoning:void 0}},providerMetadata:{ollama:{totalDuration:n.total_duration||0,loadDuration:n.load_duration||0,promptEvalDuration:n.prompt_eval_duration||0,evalDuration:n.eval_duration||0}},request:{body:JSON.stringify({model:this.modelId,messages:o,options:w,...a})},response:{}}}};var _=class{constructor(t,e={}){r(this,"specificationVersion","v3");r(this,"provider","ollama");r(this,"modelId");r(this,"defaultObjectGenerationMode","json");r(this,"supportedUrls",{});r(this,"nativeModel");this.modelId=t,this.nativeModel=new q(t,{baseURL:e.baseURL||"http://localhost:11434"});}doGenerate(t){return this.nativeModel.doGenerate(t)}doStream(t){return this.nativeModel.doStream(t)}async generate(t){return this.nativeModel.generate(t)}async stream(t){return this.nativeModel.stream(t)}};var A=class{constructor(t,e={}){r(this,"specificationVersion","v3");r(this,"provider","ollama");r(this,"modelId");r(this,"maxEmbeddingsPerCall");r(this,"supportsParallelCalls",true);r(this,"baseURL");this.modelId=t,this.baseURL=e.baseURL||"http://localhost:11434";}async doEmbed(t){let{values:e,abortSignal:o}=t,a=utils.Log.create({service:"ollama-embedding"});if(!e||e.length===0)return a.warn("Empty values array provided",{modelId:this.modelId}),{embeddings:[],usage:{tokens:0},warnings:[]};a.debug("Generating text embeddings",{modelId:this.modelId,valuesCount:e.length,baseURL:this.baseURL});try{let n=await Promise.all(e.map(c=>this.generateSingleEmbedding(c,o))),l=e.reduce((c,u)=>c+this.estimateTokens(u),0);return a.debug("Text embeddings generated successfully",{modelId:this.modelId,embeddingsCount:n.length,totalTokens:l}),{embeddings:n,usage:{tokens:l},warnings:[]}}catch(n){throw a.error("Text embedding generation failed",{modelId:this.modelId,error:n instanceof Error?n.message:String(n),stack:void 0}),n}}async generateSingleEmbedding(t,e){let o=`${this.baseURL}/api/embeddings`;try{let a=await fetch(o,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:this.modelId,prompt:t}),signal:e});if(!a.ok){let l=await a.text();throw new Error(`Ollama embedding API error (${a.status}): ${l}`)}let n=await a.json();if(!n.embedding||!Array.isArray(n.embedding))throw new Error("Invalid response format from Ollama embedding API");return n.embedding}catch(a){throw a instanceof TypeError&&a.message.includes("fetch")?new Error(`Failed to connect to Ollama server at ${this.baseURL}: ${a.message}`):a}}estimateTokens(t){let e=t.match(/[a-zA-Z]/g)?.length||0,o=t.match(/[\u4e00-\u9fa5]/g)?.length||0,a=t.length-e-o;return Math.ceil(e/4)+o+Math.ceil(a*.5)}};var F=class{constructor(t,e,o={}){r(this,"specificationVersion","v3");r(this,"provider","ollama");r(this,"modelId");r(this,"languageModel");r(this,"options");r(this,"log",utils.Log.create({service:"ollama-sdk",module:"reranking-model"}));this.modelId=t,this.languageModel=new _(t,e),this.options={totalScore:o.totalScore??1,useEnhancedPrompt:o.useEnhancedPrompt??true,promptLanguage:o.promptLanguage??"en"},this.log.debug("OllamaRerankingModel created",{modelId:t,totalScore:this.options.totalScore,useEnhancedPrompt:this.options.useEnhancedPrompt,promptLanguage:this.options.promptLanguage});}async doRerank(t){let{query:e,documents:o,topN:a}=t,n;Array.isArray(o)?n=o:o.type==="text"?n=o.values.map((u,b)=>({content:u,id:`doc_${b+1}`})):n=o.values;let l=a??n.length;if(n.length===0)return {ranking:[],warnings:[]};try{let u=this.buildRerankPrompt(e,n),O=(await this.languageModel.doGenerate({prompt:[{role:"user",content:[{type:"text",text:u}]}],maxOutputTokens:500,temperature:.1})).content.find(g=>g.type==="text")?.text||"",i=this.parseRerankResult(O,n,l);return {ranking:i.results.map(g=>({index:g.index,relevanceScore:g.score,document:g.document})),warnings:i.warnings.map(g=>({type:"other",message:g}))}}catch(u){return this.log.error("Reranking failed",{error:u.message}),{ranking:n.map((O,i)=>({index:i,relevanceScore:this.options.totalScore*(1-i/n.length),document:O})),warnings:[{type:"other",message:`Reranking failed, using original order: ${u.message}`}]}}}buildRerankPrompt(t,e){let o=e.map((a,n)=>{let l=a.id||`doc_${n+1}`,c=a.content.slice(0,300);return `${n+1}. [ID: ${l}] ${c}`}).join(`
4
4
 
5
5
  `);if(this.options.promptLanguage==="en")return `You are a professional information retrieval reranking expert. Please rank the following documents according to the query.
6
6
 
@@ -41,4 +41,4 @@ ${o}
41
41
 
42
42
  \u793A\u4F8B\u8F93\u51FA\u683C\u5F0F\uFF1A2,5,1,4,3
43
43
 
44
- \u8BF7\u53EA\u8F93\u51FA\u6392\u5E8F\u540E\u7684\u7F16\u53F7\uFF0C\u4E0D\u8981\u5305\u542B\u5176\u4ED6\u89E3\u91CA\u3002`}}parseRerankResult(t,e,o){let a=[];try{let n=t.match(/\d+/g)?.map(i=>parseInt(i,10)-1).filter(i=>i>=0&&i<e.length)||[],l=[],c=new Set;for(let i of n)c.has(i)||(c.add(i),l.push(i));let u=[];for(let i=0;i<l.length;i++){let g=l[i];if(g!==void 0&&g>=0&&g<e.length){let m=e[g];m&&u.push({index:g,score:this.options.totalScore*(1-i/l.length),document:m});}}let b=new Set(l);for(let i=0;i<e.length;i++)if(!b.has(i)){let g=this.options.totalScore*.1*(1-i/e.length);u.push({index:i,score:g,document:e[i]});}let O=o?u.slice(0,o):u;return this.log.debug("Parsed rerank results",{extractedNumbers:n,uniqueIndices:l,resultCount:O.length,topK:o}),{results:O,warnings:a}}catch(n){return this.log.error("Failed to parse rerank result",{error:n.message,text:t}),{results:e.map((c,u)=>({index:u,score:this.options.totalScore*(1-u/e.length),document:c})),warnings:[`Failed to parse rerank result: ${n.message}`]}}}};function ae(s={}){return Object.assign(e=>new I(e,s),{languageModel:e=>new I(e,s),chat:e=>new I(e,s),embeddingModel:e=>new A(e,s),rerankingModel:(e,o)=>new q(e,s,o)})}var re="0.1.0";exports.ConnectionError=J;exports.ModelNotFoundError=G;exports.OLLAMA_DEFAULT_OPTIONS=w;exports.OLLAMA_SPECIFIC_PARAMS=ee;exports.OllamaEmbeddingModel=A;exports.OllamaError=_;exports.OllamaLanguageModel=I;exports.TimeoutError=B;exports.VERSION=re;exports.ValidationError=z;exports.createOllama=ae;
44
+ \u8BF7\u53EA\u8F93\u51FA\u6392\u5E8F\u540E\u7684\u7F16\u53F7\uFF0C\u4E0D\u8981\u5305\u542B\u5176\u4ED6\u89E3\u91CA\u3002`}}parseRerankResult(t,e,o){let a=[];try{let n=t.match(/\d+/g)?.map(i=>parseInt(i,10)-1).filter(i=>i>=0&&i<e.length)||[],l=[],c=new Set;for(let i of n)c.has(i)||(c.add(i),l.push(i));let u=[];for(let i=0;i<l.length;i++){let g=l[i];if(g!==void 0&&g>=0&&g<e.length){let m=e[g];m&&u.push({index:g,score:this.options.totalScore*(1-i/l.length),document:m});}}let b=new Set(l);for(let i=0;i<e.length;i++)if(!b.has(i)){let g=this.options.totalScore*.1*(1-i/e.length);u.push({index:i,score:g,document:e[i]});}let O=o?u.slice(0,o):u;return this.log.debug("Parsed rerank results",{extractedNumbers:n,uniqueIndices:l,resultCount:O.length,topK:o}),{results:O,warnings:a}}catch(n){return this.log.error("Failed to parse rerank result",{error:n.message,text:t}),{results:e.map((c,u)=>({index:u,score:this.options.totalScore*(1-u/e.length),document:c})),warnings:[`Failed to parse rerank result: ${n.message}`]}}}};function ae(s={}){return Object.assign(e=>new _(e,s),{languageModel:e=>new _(e,s),chat:e=>new _(e,s),embeddingModel:e=>new A(e,s),rerankingModel:(e,o)=>new F(e,s,o)})}var re="0.1.0";exports.ConnectionError=J;exports.ModelNotFoundError=G;exports.OLLAMA_DEFAULT_OPTIONS=w;exports.OLLAMA_SPECIFIC_PARAMS=ee;exports.OllamaEmbeddingModel=A;exports.OllamaError=I;exports.OllamaLanguageModel=_;exports.TimeoutError=B;exports.VERSION=re;exports.ValidationError=z;exports.createOllama=ae;
package/dist/index.d.cts CHANGED
@@ -5,8 +5,6 @@ interface OllamaConfig {
5
5
  baseURL?: string;
6
6
  fetch?: typeof fetch;
7
7
  headers?: Record<string, string>;
8
- logDir?: string;
9
- logLevel?: 'DEBUG' | 'INFO' | 'WARN' | 'ERROR';
10
8
  }
11
9
  interface OllamaProviderOptions {
12
10
  temperature?: number;
package/dist/index.d.ts CHANGED
@@ -5,8 +5,6 @@ interface OllamaConfig {
5
5
  baseURL?: string;
6
6
  fetch?: typeof fetch;
7
7
  headers?: Record<string, string>;
8
- logDir?: string;
9
- logLevel?: 'DEBUG' | 'INFO' | 'WARN' | 'ERROR';
10
8
  }
11
9
  interface OllamaProviderOptions {
12
10
  temperature?: number;
package/dist/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
- import {Log}from'@easbot/utils';import'path';var X=Object.defineProperty;var ee=(s,t,e)=>t in s?X(s,t,{enumerable:true,configurable:true,writable:true,value:e}):s[t]=e;var r=(s,t,e)=>ee(s,typeof t!="symbol"?t+"":t,e);var V=class{constructor(t="http://localhost:11434"){r(this,"baseURL",t);}async*streamChat(t){let e=await fetch(`${this.baseURL}/api/chat`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...t,stream:true})});if(!e.ok)throw new Error(`Ollama API error: ${e.status} ${e.statusText}`);if(!e.body)throw new Error("Response body is null");let o=e.body.getReader(),a=new TextDecoder,n="";try{for(;;){let{done:l,value:c}=await o.read();if(l){if(n.trim())try{yield JSON.parse(n);}catch{}break}n+=a.decode(c,{stream:!0});let u=n.split(`
2
- `);n=u.pop()||"";for(let b of u){let O=b.trim();if(O)try{yield JSON.parse(O);}catch{}}}}finally{o.releaseLock();}}async chat(t){let e=await fetch(`${this.baseURL}/api/chat`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...t,stream:false})});if(!e.ok)throw new Error(`Ollama API error: ${e.status} ${e.statusText}`);return e.json()}};var E={numCtx:262144,temperature:.7,topK:40,topP:.9,repeatPenalty:1.1,numPredict:32e3},te=["numCtx","repeatPenalty","numPredict"];var L=class extends Error{constructor(e,o){super(e);r(this,"cause",o);this.name="OllamaError",Object.setPrototypeOf(this,new.target.prototype);}},G=class extends L{constructor(e,o,a){super(e,a);r(this,"url",o);this.name="ConnectionError";}},z=class extends L{constructor(e,o){super(`Model not found: ${e}`,o);r(this,"modelId",e);this.name="ModelNotFoundError";}},B=class extends L{constructor(e,o,a,n){super(e,n);r(this,"field",o);r(this,"value",a);this.name="ValidationError";}},W=class extends L{constructor(e,o,a){super(e,a);r(this,"timeoutMs",o);this.name="TimeoutError";}},A=class extends L{constructor(e,o,a){super(`Invalid tool definition for "${e}": missing ${o}`,a);r(this,"toolName",e);r(this,"missingField",o);this.name="InvalidToolDefinitionError";}};function K(s,t,e){let o;return t?o="tool-calls":s?o="stop":o="other",{unified:o,raw:e}}var x=Log.create({service:"ollama-sdk",module:"native-language-model"});function U(){return `${Date.now()}-${Math.random().toString(36).substring(2,9)}`}function F(s){if(!s||s.trim().length===0)return false;try{return JSON.parse(s),!0}catch{return false}}function Y(s){return typeof s=="string"?s:JSON.stringify(s)}function Z(s){return !s.tools||s.tools.length===0?{}:{tools:s.tools.map(t=>{if(!t.name)throw new A(t.name||"unknown","name");let e=t.inputSchema||t.parameters;if(!e)throw new A(t.name,"inputSchema");return {type:"function",function:{name:t.name,description:t.description,parameters:e}}})}}function H(s){let t=[];for(let e of s)try{switch(e.role){case "system":t.push({role:"system",content:e.content});break;case "user":{let o=e.content.filter(a=>a.type==="text").map(a=>a.text).join(`
3
- `);o&&t.push({role:"user",content:o});break}case "assistant":{let o="",a=[];for(let n of e.content)if(n.type==="text")o+=n.text;else if(n.type==="tool-call"){let l=n;a.push({id:l.toolCallId,type:"function",function:{name:l.toolName,arguments:JSON.stringify(l.input)}});}t.push({role:"assistant",content:o||null,tool_calls:a.length>0?a:void 0});break}case "tool":for(let o of e.content){let a=o.output,n;switch(a.type){case "text":case "error-text":n=a.value;break;case "content":case "json":case "error-json":n=JSON.stringify(a.value);break;default:n=String(a.value);break}t.push({role:"tool",tool_call_id:o.toolCallId,content:n});}break}}catch(o){x.warn("Failed to convert message",{messageRole:e.role,error:o instanceof Error?o.message:String(o)});}return t}var q=class{constructor(t,e={}){r(this,"specificationVersion","v3");r(this,"provider","ollama");r(this,"modelId");r(this,"defaultObjectGenerationMode","json");r(this,"supportedUrls",{});r(this,"client");this.modelId=t,this.client=new V(e.baseURL);}async generate(t){return this.doGenerate(t)}async stream(t){return this.doStream(t)}async doStream(t){let e=U();x.debug("Stream request started",{traceId:e,modelId:this.modelId,hasTools:!!t.tools&&t.tools.length>0,toolCount:t.tools?.length||0,messageCount:t.prompt.length});let o=H(t.prompt),a=Z({tools:t.tools}),n=JSON.stringify({model:this.modelId,messages:o,options:E,...a}),l=null,c=null,u=m=>{l&&l.enqueue(m),c&&c.enqueue(m);},b=async()=>{try{let m=!0,M=!1,w=!1,P="",p="",$=!1,T=[],d=[],J=()=>{if(d.length>0){for(let v of d)u(v);d.length=0;}},y=null;for await(let v of this.client.streamChat({model:this.modelId,messages:o,options:E,...a})){if(y&&y.chunkCount++,m){m=!1;let k={type:"response-metadata",id:U(),modelId:this.modelId,timestamp:new Date(v.created_at)};u(k),y&&y.eventCount++;}if(v.message?.tool_calls){w&&(d.push({type:"reasoning-end",id:"reasoning-0"}),w=!1),M&&(d.push({type:"text-end",id:"txt-0"}),M=!1);for(let k of v.message.tool_calls){if(!k.id||!k.function?.name){let D=k.id?"function.name":"id";x.error("Invalid tool call: missing field",{traceId:e,missingField:D,toolCall:void 0}),d.push({type:"error",error:`Invalid tool call: missing ${D}`});continue}let f=k.id,C=k.function.name,h=Y(k.function.arguments),S=T.find(D=>D.id===f);S?(S.function.arguments+=h,x.debug("Tool call arguments accumulated",{traceId:e,toolCallId:f,toolName:C,deltaLength:h.length,totalLength:S.function.arguments.length,isComplete:F(S.function.arguments)}),h&&d.push({type:"tool-input-delta",id:f,delta:h})):(S={id:f,type:"function",function:{name:C,arguments:h},hasFinished:!1},T.push(S),y&&y.toolCallCount++,x.debug("Tool call received",{traceId:e,toolCallId:f,toolName:C,argumentsLength:h.length,isComplete:F(h)}),d.push({type:"tool-input-start",id:f,toolName:C}),h&&d.push({type:"tool-input-delta",id:f,delta:h}));let Q=F(S.function.arguments);!S.hasFinished&&Q&&(x.debug("Tool call arguments complete",{traceId:e,toolCallId:f,toolName:C,isComplete:Q,argumentsLength:S.function.arguments.length}),d.push({type:"tool-input-end",id:f}),d.push({type:"tool-call",toolCallId:f,toolName:C,input:S.function.arguments}),S.hasFinished=!0);}J(),y&&(y.eventCount+=d.length);}if(v.message?.content){let k=v.message.content;for(p+=k;p.length>0;)if($){let f=p.indexOf("</think>");if(f===-1){p.length>0&&d.push({type:"reasoning-delta",id:"reasoning-0",delta:p}),p="";break}else {if(f>0){let C=p.substring(0,f);d.push({type:"reasoning-delta",id:"reasoning-0",delta:C});}d.push({type:"reasoning-end",id:"reasoning-0"}),w=!1,$=!1,p=p.substring(f+8);}}else {let f=p.indexOf("<think>");if(f===-1){p.length>0&&(M||(M=!0,d.push({type:"text-start",id:"txt-0"})),d.push({type:"text-delta",id:"txt-0",delta:p}),P+=p),p="";break}else {if(f>0){let C=p.substring(0,f);M||(M=!0,d.push({type:"text-start",id:"txt-0"})),d.push({type:"text-delta",id:"txt-0",delta:C}),P+=C,d.push({type:"text-end",id:"txt-0"}),M=!1;}$=!0,p=p.substring(f+7),w||(w=!0,d.push({type:"reasoning-start",id:"reasoning-0"}));}}}if(J(),y&&(y.eventCount+=d.length),v.done){let k=T.filter(h=>!h.hasFinished);for(let h of k)d.push({type:"tool-input-end",id:h.id}),d.push({type:"tool-call",toolCallId:h.id,toolName:h.function.name,input:h.function.arguments});p.length>0&&($?(d.push({type:"reasoning-delta",id:"reasoning-0",delta:p}),d.push({type:"reasoning-end",id:"reasoning-0"})):(M||(M=!0,d.push({type:"text-start",id:"txt-0"})),d.push({type:"text-delta",id:"txt-0",delta:p}),P+=p)),M&&d.push({type:"text-end",id:"txt-0"});let C=T.length>0?"tool-calls":"stop";if(d.push({type:"finish",finishReason:C,usage:{inputTokens:{total:v.prompt_eval_count||0,noCache:void 0,cacheRead:void 0,cacheWrite:void 0},outputTokens:{total:v.eval_count||0,text:void 0,reasoning:void 0}},providerMetadata:{ollama:{totalDuration:v.total_duration||0,loadDuration:v.load_duration||0,promptEvalDuration:v.prompt_eval_duration||0,evalDuration:v.eval_duration||0}}}),J(),y&&(y.eventCount+=d.length),y);T.length=0;}}}catch(m){x.error("Stream processing error",{traceId:e,error:m instanceof Error?m.message:String(m),stack:void 0}),u({type:"error",error:m instanceof Error?m.message:String(m)}),u({type:"finish",finishReason:"error",usage:{inputTokens:{total:0,noCache:void 0,cacheRead:void 0,cacheWrite:void 0},outputTokens:{total:0,text:void 0,reasoning:void 0}}});}finally{l&&l.close(),c&&c.close();}},O=new ReadableStream({start(m){l=m;}}),i=new ReadableStream({start(m){c=m;}});b();async function*g(m){let M=m.getReader();try{for(;;){let{done:w,value:P}=await M.read();if(w)break;yield P;}}finally{M.releaseLock();}}return {stream:O,fullStream:g(i),request:{body:n},response:{}}}async doGenerate(t){let e=U();x.debug("Generate request started",{traceId:e,modelId:this.modelId,hasTools:!!t.tools&&t.tools.length>0,toolCount:t.tools?.length||0,messageCount:t.prompt.length});let o=H(t.prompt),a=Z({tools:t.tools}),n=await this.client.chat({model:this.modelId,messages:o,options:E,...a}),l=[];if(n.message?.content&&l.push({type:"text",text:n.message.content}),n.message?.tool_calls){x.debug("Tool calls received in generate",{traceId:e,toolCallCount:n.message.tool_calls.length});for(let b of n.message.tool_calls){let O=b.id||U(),i=b.function.name,g=Y(b.function.arguments);x.debug("Processing tool call in generate",{traceId:e,toolCallId:O,toolName:i,argumentsLength:g.length,isComplete:F(g)}),l.push({type:"tool-call",toolCallId:O,toolName:i,input:g});}}let c=!!(n.message?.tool_calls&&n.message.tool_calls.length>0),u=K(n.done??false,c,"stop");return x.debug("Generate request completed",{traceId:e,finishReason:u,contentParts:l.length,hasToolCalls:c,inputTokens:n.prompt_eval_count||0,outputTokens:n.eval_count||0}),{content:l,finishReason:u,usage:{inputTokens:{total:n.prompt_eval_count||0,noCache:void 0,cacheRead:void 0,cacheWrite:void 0},outputTokens:{total:n.eval_count||0,text:void 0,reasoning:void 0}},providerMetadata:{ollama:{totalDuration:n.total_duration||0,loadDuration:n.load_duration||0,promptEvalDuration:n.prompt_eval_duration||0,evalDuration:n.eval_duration||0}},request:{body:JSON.stringify({model:this.modelId,messages:o,options:E,...a})},response:{}}}};var _=class{constructor(t,e={}){r(this,"specificationVersion","v3");r(this,"provider","ollama");r(this,"modelId");r(this,"defaultObjectGenerationMode","json");r(this,"supportedUrls",{});r(this,"nativeModel");this.modelId=t,this.nativeModel=new q(t,{baseURL:e.baseURL||"http://localhost:11434"});}doGenerate(t){return this.nativeModel.doGenerate(t)}doStream(t){return this.nativeModel.doStream(t)}async generate(t){return this.nativeModel.generate(t)}async stream(t){return this.nativeModel.stream(t)}};var N=class{constructor(t,e={}){r(this,"specificationVersion","v3");r(this,"provider","ollama");r(this,"modelId");r(this,"maxEmbeddingsPerCall");r(this,"supportsParallelCalls",true);r(this,"baseURL");this.modelId=t,this.baseURL=e.baseURL||"http://localhost:11434";}async doEmbed(t){let{values:e,abortSignal:o}=t,a=Log.create({service:"ollama-embedding"});if(!e||e.length===0)return a.warn("Empty values array provided",{modelId:this.modelId}),{embeddings:[],usage:{tokens:0},warnings:[]};a.debug("Generating text embeddings",{modelId:this.modelId,valuesCount:e.length,baseURL:this.baseURL});try{let n=await Promise.all(e.map(c=>this.generateSingleEmbedding(c,o))),l=e.reduce((c,u)=>c+this.estimateTokens(u),0);return a.debug("Text embeddings generated successfully",{modelId:this.modelId,embeddingsCount:n.length,totalTokens:l}),{embeddings:n,usage:{tokens:l},warnings:[]}}catch(n){throw a.error("Text embedding generation failed",{modelId:this.modelId,error:n instanceof Error?n.message:String(n),stack:void 0}),n}}async generateSingleEmbedding(t,e){let o=`${this.baseURL}/api/embeddings`;try{let a=await fetch(o,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:this.modelId,prompt:t}),signal:e});if(!a.ok){let l=await a.text();throw new Error(`Ollama embedding API error (${a.status}): ${l}`)}let n=await a.json();if(!n.embedding||!Array.isArray(n.embedding))throw new Error("Invalid response format from Ollama embedding API");return n.embedding}catch(a){throw a instanceof TypeError&&a.message.includes("fetch")?new Error(`Failed to connect to Ollama server at ${this.baseURL}: ${a.message}`):a}}estimateTokens(t){let e=t.match(/[a-zA-Z]/g)?.length||0,o=t.match(/[\u4e00-\u9fa5]/g)?.length||0,a=t.length-e-o;return Math.ceil(e/4)+o+Math.ceil(a*.5)}};var j=class{constructor(t,e,o={}){r(this,"specificationVersion","v3");r(this,"provider","ollama");r(this,"modelId");r(this,"languageModel");r(this,"options");r(this,"log",Log.create({service:"ollama-sdk",module:"reranking-model"}));this.modelId=t,this.languageModel=new _(t,e),this.options={totalScore:o.totalScore??1,useEnhancedPrompt:o.useEnhancedPrompt??true,promptLanguage:o.promptLanguage??"en"},this.log.debug("OllamaRerankingModel created",{modelId:t,totalScore:this.options.totalScore,useEnhancedPrompt:this.options.useEnhancedPrompt,promptLanguage:this.options.promptLanguage});}async doRerank(t){let{query:e,documents:o,topN:a}=t,n;Array.isArray(o)?n=o:o.type==="text"?n=o.values.map((u,b)=>({content:u,id:`doc_${b+1}`})):n=o.values;let l=a??n.length;if(n.length===0)return {ranking:[],warnings:[]};try{let u=this.buildRerankPrompt(e,n),O=(await this.languageModel.doGenerate({prompt:[{role:"user",content:[{type:"text",text:u}]}],maxOutputTokens:500,temperature:.1})).content.find(g=>g.type==="text")?.text||"",i=this.parseRerankResult(O,n,l);return {ranking:i.results.map(g=>({index:g.index,relevanceScore:g.score,document:g.document})),warnings:i.warnings.map(g=>({type:"other",message:g}))}}catch(u){return this.log.error("Reranking failed",{error:u.message}),{ranking:n.map((O,i)=>({index:i,relevanceScore:this.options.totalScore*(1-i/n.length),document:O})),warnings:[{type:"other",message:`Reranking failed, using original order: ${u.message}`}]}}}buildRerankPrompt(t,e){let o=e.map((a,n)=>{let l=a.id||`doc_${n+1}`,c=a.content.slice(0,300);return `${n+1}. [ID: ${l}] ${c}`}).join(`
1
+ import {Log}from'@easbot/utils';var X=Object.defineProperty;var ee=(s,t,e)=>t in s?X(s,t,{enumerable:true,configurable:true,writable:true,value:e}):s[t]=e;var r=(s,t,e)=>ee(s,typeof t!="symbol"?t+"":t,e);var V=class{constructor(t="http://localhost:11434"){r(this,"baseURL",t);}async*streamChat(t){let e=await fetch(`${this.baseURL}/api/chat`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...t,stream:true})});if(!e.ok)throw new Error(`Ollama API error: ${e.status} ${e.statusText}`);if(!e.body)throw new Error("Response body is null");let o=e.body.getReader(),a=new TextDecoder,n="";try{for(;;){let{done:l,value:c}=await o.read();if(l){if(n.trim())try{yield JSON.parse(n);}catch{}break}n+=a.decode(c,{stream:!0});let u=n.split(`
2
+ `);n=u.pop()||"";for(let b of u){let O=b.trim();if(O)try{yield JSON.parse(O);}catch{}}}}finally{o.releaseLock();}}async chat(t){let e=await fetch(`${this.baseURL}/api/chat`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...t,stream:false})});if(!e.ok)throw new Error(`Ollama API error: ${e.status} ${e.statusText}`);return e.json()}};var E={numCtx:262144,temperature:.7,topK:40,topP:.9,repeatPenalty:1.1,numPredict:32e3},te=["numCtx","repeatPenalty","numPredict"];var L=class extends Error{constructor(e,o){super(e);r(this,"cause",o);this.name="OllamaError",Object.setPrototypeOf(this,new.target.prototype);}},G=class extends L{constructor(e,o,a){super(e,a);r(this,"url",o);this.name="ConnectionError";}},z=class extends L{constructor(e,o){super(`Model not found: ${e}`,o);r(this,"modelId",e);this.name="ModelNotFoundError";}},B=class extends L{constructor(e,o,a,n){super(e,n);r(this,"field",o);r(this,"value",a);this.name="ValidationError";}},W=class extends L{constructor(e,o,a){super(e,a);r(this,"timeoutMs",o);this.name="TimeoutError";}},A=class extends L{constructor(e,o,a){super(`Invalid tool definition for "${e}": missing ${o}`,a);r(this,"toolName",e);r(this,"missingField",o);this.name="InvalidToolDefinitionError";}};function K(s,t,e){let o;return t?o="tool-calls":s?o="stop":o="other",{unified:o,raw:e}}var x=Log.create({service:"ollama-sdk",module:"native-language-model"});function U(){return `${Date.now()}-${Math.random().toString(36).substring(2,9)}`}function q(s){if(!s||s.trim().length===0)return false;try{return JSON.parse(s),!0}catch{return false}}function Y(s){return typeof s=="string"?s:JSON.stringify(s)}function Z(s){return !s.tools||s.tools.length===0?{}:{tools:s.tools.map(t=>{if(!t.name)throw new A(t.name||"unknown","name");let e=t.inputSchema||t.parameters;if(!e)throw new A(t.name,"inputSchema");return {type:"function",function:{name:t.name,description:t.description,parameters:e}}})}}function H(s){let t=[];for(let e of s)try{switch(e.role){case "system":t.push({role:"system",content:e.content});break;case "user":{let o=e.content.filter(a=>a.type==="text").map(a=>a.text).join(`
3
+ `);o&&t.push({role:"user",content:o});break}case "assistant":{let o="",a=[];for(let n of e.content)if(n.type==="text")o+=n.text;else if(n.type==="tool-call"){let l=n;a.push({id:l.toolCallId,type:"function",function:{name:l.toolName,arguments:JSON.stringify(l.input)}});}t.push({role:"assistant",content:o||null,tool_calls:a.length>0?a:void 0});break}case "tool":for(let o of e.content){let a=o.output,n;switch(a.type){case "text":case "error-text":n=a.value;break;case "content":case "json":case "error-json":n=JSON.stringify(a.value);break;default:n=String(a.value);break}t.push({role:"tool",tool_call_id:o.toolCallId,content:n});}break}}catch(o){x.warn("Failed to convert message",{messageRole:e.role,error:o instanceof Error?o.message:String(o)});}return t}var F=class{constructor(t,e={}){r(this,"specificationVersion","v3");r(this,"provider","ollama");r(this,"modelId");r(this,"defaultObjectGenerationMode","json");r(this,"supportedUrls",{});r(this,"client");this.modelId=t,this.client=new V(e.baseURL);}async generate(t){return this.doGenerate(t)}async stream(t){return this.doStream(t)}async doStream(t){let e=U();x.debug("Stream request started",{traceId:e,modelId:this.modelId,hasTools:!!t.tools&&t.tools.length>0,toolCount:t.tools?.length||0,messageCount:t.prompt.length});let o=H(t.prompt),a=Z({tools:t.tools}),n=JSON.stringify({model:this.modelId,messages:o,options:E,...a}),l=null,c=null,u=m=>{l&&l.enqueue(m),c&&c.enqueue(m);},b=async()=>{try{let m=!0,M=!1,w=!1,P="",p="",$=!1,T=[],d=[],J=()=>{if(d.length>0){for(let v of d)u(v);d.length=0;}},y=null;for await(let v of this.client.streamChat({model:this.modelId,messages:o,options:E,...a})){if(y&&y.chunkCount++,m){m=!1;let k={type:"response-metadata",id:U(),modelId:this.modelId,timestamp:new Date(v.created_at)};u(k),y&&y.eventCount++;}if(v.message?.tool_calls){w&&(d.push({type:"reasoning-end",id:"reasoning-0"}),w=!1),M&&(d.push({type:"text-end",id:"txt-0"}),M=!1);for(let k of v.message.tool_calls){if(!k.id||!k.function?.name){let D=k.id?"function.name":"id";x.error("Invalid tool call: missing field",{traceId:e,missingField:D,toolCall:void 0}),d.push({type:"error",error:`Invalid tool call: missing ${D}`});continue}let f=k.id,C=k.function.name,h=Y(k.function.arguments),S=T.find(D=>D.id===f);S?(S.function.arguments+=h,x.debug("Tool call arguments accumulated",{traceId:e,toolCallId:f,toolName:C,deltaLength:h.length,totalLength:S.function.arguments.length,isComplete:q(S.function.arguments)}),h&&d.push({type:"tool-input-delta",id:f,delta:h})):(S={id:f,type:"function",function:{name:C,arguments:h},hasFinished:!1},T.push(S),y&&y.toolCallCount++,x.debug("Tool call received",{traceId:e,toolCallId:f,toolName:C,argumentsLength:h.length,isComplete:q(h)}),d.push({type:"tool-input-start",id:f,toolName:C}),h&&d.push({type:"tool-input-delta",id:f,delta:h}));let Q=q(S.function.arguments);!S.hasFinished&&Q&&(x.debug("Tool call arguments complete",{traceId:e,toolCallId:f,toolName:C,isComplete:Q,argumentsLength:S.function.arguments.length}),d.push({type:"tool-input-end",id:f}),d.push({type:"tool-call",toolCallId:f,toolName:C,input:S.function.arguments}),S.hasFinished=!0);}J(),y&&(y.eventCount+=d.length);}if(v.message?.content){let k=v.message.content;for(p+=k;p.length>0;)if($){let f=p.indexOf("</think>");if(f===-1){p.length>0&&d.push({type:"reasoning-delta",id:"reasoning-0",delta:p}),p="";break}else {if(f>0){let C=p.substring(0,f);d.push({type:"reasoning-delta",id:"reasoning-0",delta:C});}d.push({type:"reasoning-end",id:"reasoning-0"}),w=!1,$=!1,p=p.substring(f+8);}}else {let f=p.indexOf("<think>");if(f===-1){p.length>0&&(M||(M=!0,d.push({type:"text-start",id:"txt-0"})),d.push({type:"text-delta",id:"txt-0",delta:p}),P+=p),p="";break}else {if(f>0){let C=p.substring(0,f);M||(M=!0,d.push({type:"text-start",id:"txt-0"})),d.push({type:"text-delta",id:"txt-0",delta:C}),P+=C,d.push({type:"text-end",id:"txt-0"}),M=!1;}$=!0,p=p.substring(f+7),w||(w=!0,d.push({type:"reasoning-start",id:"reasoning-0"}));}}}if(J(),y&&(y.eventCount+=d.length),v.done){let k=T.filter(h=>!h.hasFinished);for(let h of k)d.push({type:"tool-input-end",id:h.id}),d.push({type:"tool-call",toolCallId:h.id,toolName:h.function.name,input:h.function.arguments});p.length>0&&($?(d.push({type:"reasoning-delta",id:"reasoning-0",delta:p}),d.push({type:"reasoning-end",id:"reasoning-0"})):(M||(M=!0,d.push({type:"text-start",id:"txt-0"})),d.push({type:"text-delta",id:"txt-0",delta:p}),P+=p)),M&&d.push({type:"text-end",id:"txt-0"});let C=T.length>0?"tool-calls":"stop";if(d.push({type:"finish",finishReason:C,usage:{inputTokens:{total:v.prompt_eval_count||0,noCache:void 0,cacheRead:void 0,cacheWrite:void 0},outputTokens:{total:v.eval_count||0,text:void 0,reasoning:void 0}},providerMetadata:{ollama:{totalDuration:v.total_duration||0,loadDuration:v.load_duration||0,promptEvalDuration:v.prompt_eval_duration||0,evalDuration:v.eval_duration||0}}}),J(),y&&(y.eventCount+=d.length),y);T.length=0;}}}catch(m){x.error("Stream processing error",{traceId:e,error:m instanceof Error?m.message:String(m),stack:void 0}),u({type:"error",error:m instanceof Error?m.message:String(m)}),u({type:"finish",finishReason:"error",usage:{inputTokens:{total:0,noCache:void 0,cacheRead:void 0,cacheWrite:void 0},outputTokens:{total:0,text:void 0,reasoning:void 0}}});}finally{l&&l.close(),c&&c.close();}},O=new ReadableStream({start(m){l=m;}}),i=new ReadableStream({start(m){c=m;}});b();async function*g(m){let M=m.getReader();try{for(;;){let{done:w,value:P}=await M.read();if(w)break;yield P;}}finally{M.releaseLock();}}return {stream:O,fullStream:g(i),request:{body:n},response:{}}}async doGenerate(t){let e=U();x.debug("Generate request started",{traceId:e,modelId:this.modelId,hasTools:!!t.tools&&t.tools.length>0,toolCount:t.tools?.length||0,messageCount:t.prompt.length});let o=H(t.prompt),a=Z({tools:t.tools}),n=await this.client.chat({model:this.modelId,messages:o,options:E,...a}),l=[];if(n.message?.content&&l.push({type:"text",text:n.message.content}),n.message?.tool_calls){x.debug("Tool calls received in generate",{traceId:e,toolCallCount:n.message.tool_calls.length});for(let b of n.message.tool_calls){let O=b.id||U(),i=b.function.name,g=Y(b.function.arguments);x.debug("Processing tool call in generate",{traceId:e,toolCallId:O,toolName:i,argumentsLength:g.length,isComplete:q(g)}),l.push({type:"tool-call",toolCallId:O,toolName:i,input:g});}}let c=!!(n.message?.tool_calls&&n.message.tool_calls.length>0),u=K(n.done??false,c,"stop");return x.debug("Generate request completed",{traceId:e,finishReason:u,contentParts:l.length,hasToolCalls:c,inputTokens:n.prompt_eval_count||0,outputTokens:n.eval_count||0}),{content:l,finishReason:u,usage:{inputTokens:{total:n.prompt_eval_count||0,noCache:void 0,cacheRead:void 0,cacheWrite:void 0},outputTokens:{total:n.eval_count||0,text:void 0,reasoning:void 0}},providerMetadata:{ollama:{totalDuration:n.total_duration||0,loadDuration:n.load_duration||0,promptEvalDuration:n.prompt_eval_duration||0,evalDuration:n.eval_duration||0}},request:{body:JSON.stringify({model:this.modelId,messages:o,options:E,...a})},response:{}}}};var I=class{constructor(t,e={}){r(this,"specificationVersion","v3");r(this,"provider","ollama");r(this,"modelId");r(this,"defaultObjectGenerationMode","json");r(this,"supportedUrls",{});r(this,"nativeModel");this.modelId=t,this.nativeModel=new F(t,{baseURL:e.baseURL||"http://localhost:11434"});}doGenerate(t){return this.nativeModel.doGenerate(t)}doStream(t){return this.nativeModel.doStream(t)}async generate(t){return this.nativeModel.generate(t)}async stream(t){return this.nativeModel.stream(t)}};var N=class{constructor(t,e={}){r(this,"specificationVersion","v3");r(this,"provider","ollama");r(this,"modelId");r(this,"maxEmbeddingsPerCall");r(this,"supportsParallelCalls",true);r(this,"baseURL");this.modelId=t,this.baseURL=e.baseURL||"http://localhost:11434";}async doEmbed(t){let{values:e,abortSignal:o}=t,a=Log.create({service:"ollama-embedding"});if(!e||e.length===0)return a.warn("Empty values array provided",{modelId:this.modelId}),{embeddings:[],usage:{tokens:0},warnings:[]};a.debug("Generating text embeddings",{modelId:this.modelId,valuesCount:e.length,baseURL:this.baseURL});try{let n=await Promise.all(e.map(c=>this.generateSingleEmbedding(c,o))),l=e.reduce((c,u)=>c+this.estimateTokens(u),0);return a.debug("Text embeddings generated successfully",{modelId:this.modelId,embeddingsCount:n.length,totalTokens:l}),{embeddings:n,usage:{tokens:l},warnings:[]}}catch(n){throw a.error("Text embedding generation failed",{modelId:this.modelId,error:n instanceof Error?n.message:String(n),stack:void 0}),n}}async generateSingleEmbedding(t,e){let o=`${this.baseURL}/api/embeddings`;try{let a=await fetch(o,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:this.modelId,prompt:t}),signal:e});if(!a.ok){let l=await a.text();throw new Error(`Ollama embedding API error (${a.status}): ${l}`)}let n=await a.json();if(!n.embedding||!Array.isArray(n.embedding))throw new Error("Invalid response format from Ollama embedding API");return n.embedding}catch(a){throw a instanceof TypeError&&a.message.includes("fetch")?new Error(`Failed to connect to Ollama server at ${this.baseURL}: ${a.message}`):a}}estimateTokens(t){let e=t.match(/[a-zA-Z]/g)?.length||0,o=t.match(/[\u4e00-\u9fa5]/g)?.length||0,a=t.length-e-o;return Math.ceil(e/4)+o+Math.ceil(a*.5)}};var j=class{constructor(t,e,o={}){r(this,"specificationVersion","v3");r(this,"provider","ollama");r(this,"modelId");r(this,"languageModel");r(this,"options");r(this,"log",Log.create({service:"ollama-sdk",module:"reranking-model"}));this.modelId=t,this.languageModel=new I(t,e),this.options={totalScore:o.totalScore??1,useEnhancedPrompt:o.useEnhancedPrompt??true,promptLanguage:o.promptLanguage??"en"},this.log.debug("OllamaRerankingModel created",{modelId:t,totalScore:this.options.totalScore,useEnhancedPrompt:this.options.useEnhancedPrompt,promptLanguage:this.options.promptLanguage});}async doRerank(t){let{query:e,documents:o,topN:a}=t,n;Array.isArray(o)?n=o:o.type==="text"?n=o.values.map((u,b)=>({content:u,id:`doc_${b+1}`})):n=o.values;let l=a??n.length;if(n.length===0)return {ranking:[],warnings:[]};try{let u=this.buildRerankPrompt(e,n),O=(await this.languageModel.doGenerate({prompt:[{role:"user",content:[{type:"text",text:u}]}],maxOutputTokens:500,temperature:.1})).content.find(g=>g.type==="text")?.text||"",i=this.parseRerankResult(O,n,l);return {ranking:i.results.map(g=>({index:g.index,relevanceScore:g.score,document:g.document})),warnings:i.warnings.map(g=>({type:"other",message:g}))}}catch(u){return this.log.error("Reranking failed",{error:u.message}),{ranking:n.map((O,i)=>({index:i,relevanceScore:this.options.totalScore*(1-i/n.length),document:O})),warnings:[{type:"other",message:`Reranking failed, using original order: ${u.message}`}]}}}buildRerankPrompt(t,e){let o=e.map((a,n)=>{let l=a.id||`doc_${n+1}`,c=a.content.slice(0,300);return `${n+1}. [ID: ${l}] ${c}`}).join(`
4
4
 
5
5
  `);if(this.options.promptLanguage==="en")return `You are a professional information retrieval reranking expert. Please rank the following documents according to the query.
6
6
 
@@ -41,4 +41,4 @@ ${o}
41
41
 
42
42
  \u793A\u4F8B\u8F93\u51FA\u683C\u5F0F\uFF1A2,5,1,4,3
43
43
 
44
- \u8BF7\u53EA\u8F93\u51FA\u6392\u5E8F\u540E\u7684\u7F16\u53F7\uFF0C\u4E0D\u8981\u5305\u542B\u5176\u4ED6\u89E3\u91CA\u3002`}}parseRerankResult(t,e,o){let a=[];try{let n=t.match(/\d+/g)?.map(i=>parseInt(i,10)-1).filter(i=>i>=0&&i<e.length)||[],l=[],c=new Set;for(let i of n)c.has(i)||(c.add(i),l.push(i));let u=[];for(let i=0;i<l.length;i++){let g=l[i];if(g!==void 0&&g>=0&&g<e.length){let m=e[g];m&&u.push({index:g,score:this.options.totalScore*(1-i/l.length),document:m});}}let b=new Set(l);for(let i=0;i<e.length;i++)if(!b.has(i)){let g=this.options.totalScore*.1*(1-i/e.length);u.push({index:i,score:g,document:e[i]});}let O=o?u.slice(0,o):u;return this.log.debug("Parsed rerank results",{extractedNumbers:n,uniqueIndices:l,resultCount:O.length,topK:o}),{results:O,warnings:a}}catch(n){return this.log.error("Failed to parse rerank result",{error:n.message,text:t}),{results:e.map((c,u)=>({index:u,score:this.options.totalScore*(1-u/e.length),document:c})),warnings:[`Failed to parse rerank result: ${n.message}`]}}}};function re(s={}){return Object.assign(e=>new _(e,s),{languageModel:e=>new _(e,s),chat:e=>new _(e,s),embeddingModel:e=>new N(e,s),rerankingModel:(e,o)=>new j(e,s,o)})}var se="0.1.0";export{G as ConnectionError,z as ModelNotFoundError,E as OLLAMA_DEFAULT_OPTIONS,te as OLLAMA_SPECIFIC_PARAMS,N as OllamaEmbeddingModel,L as OllamaError,_ as OllamaLanguageModel,W as TimeoutError,se as VERSION,B as ValidationError,re as createOllama};
44
+ \u8BF7\u53EA\u8F93\u51FA\u6392\u5E8F\u540E\u7684\u7F16\u53F7\uFF0C\u4E0D\u8981\u5305\u542B\u5176\u4ED6\u89E3\u91CA\u3002`}}parseRerankResult(t,e,o){let a=[];try{let n=t.match(/\d+/g)?.map(i=>parseInt(i,10)-1).filter(i=>i>=0&&i<e.length)||[],l=[],c=new Set;for(let i of n)c.has(i)||(c.add(i),l.push(i));let u=[];for(let i=0;i<l.length;i++){let g=l[i];if(g!==void 0&&g>=0&&g<e.length){let m=e[g];m&&u.push({index:g,score:this.options.totalScore*(1-i/l.length),document:m});}}let b=new Set(l);for(let i=0;i<e.length;i++)if(!b.has(i)){let g=this.options.totalScore*.1*(1-i/e.length);u.push({index:i,score:g,document:e[i]});}let O=o?u.slice(0,o):u;return this.log.debug("Parsed rerank results",{extractedNumbers:n,uniqueIndices:l,resultCount:O.length,topK:o}),{results:O,warnings:a}}catch(n){return this.log.error("Failed to parse rerank result",{error:n.message,text:t}),{results:e.map((c,u)=>({index:u,score:this.options.totalScore*(1-u/e.length),document:c})),warnings:[`Failed to parse rerank result: ${n.message}`]}}}};function re(s={}){return Object.assign(e=>new I(e,s),{languageModel:e=>new I(e,s),chat:e=>new I(e,s),embeddingModel:e=>new N(e,s),rerankingModel:(e,o)=>new j(e,s,o)})}var se="0.1.0";export{G as ConnectionError,z as ModelNotFoundError,E as OLLAMA_DEFAULT_OPTIONS,te as OLLAMA_SPECIFIC_PARAMS,N as OllamaEmbeddingModel,L as OllamaError,I as OllamaLanguageModel,W as TimeoutError,se as VERSION,B as ValidationError,re as createOllama};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@easbot/ollama-sdk",
3
- "version": "0.3.0",
3
+ "version": "0.3.3",
4
4
  "description": "Ollama provider for Vercel AI SDK - Run local LLMs with Ollama in your AI applications",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -44,8 +44,8 @@
44
44
  "ai": "^6.0.176",
45
45
  "axios": "^1.16.1",
46
46
  "zod": "^4.4.3",
47
- "@easbot/types": "0.3.0",
48
- "@easbot/utils": "0.3.0"
47
+ "@easbot/types": "0.3.3",
48
+ "@easbot/utils": "0.3.3"
49
49
  },
50
50
  "devDependencies": {
51
51
  "@biomejs/biome": "^2.4.14",