@cachly-dev/mcp-server 0.10.134 → 0.10.136
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/src/abstention.js +2 -0
- package/dist/src/embeddings.js +4 -4
- package/dist/src/handlers/brain.js +59 -58
- package/dist/src/handlers/team.js +42 -42
- package/dist/src/rangfolge-stellschrauben.js +1 -1
- package/dist/src/search.js +1 -1
- package/dist/src/zeit-normalisieren.js +1 -0
- package/glama.json +1 -1
- package/package.json +1 -1
- package/server.json +2 -2
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{CKG_BELEG_SCHWELLE as b,SINN_BELEG_SCHWELLE as g,WORT_BELEG_SCHWELLE as l}from"./rangfolge-stellschrauben.js";const h=e=>typeof e=="number"&&Number.isFinite(e)?e:0;function S(e,t={}){const n=t.woerter??l,r=t.naehe??g,f=t.kante??b;let s=0,i=0,d=!1;for(const o of e){const c=h(o.wortBelege),a=h(o.semScore),u=h(o.ckgScore);c>s&&(s=c),a>i&&(i=a),(c>=n||a>=r||u>=f)&&(d=!0)}return{schweigen:e.length===0||!d,besteWortBelege:s,besteNaehe:i,geprueft:e.length}}function E(e,t={}){if(e.geprueft===0)return"\u{1F50D} **Nichts Passendes im Bestand** \u2014 zu dieser Frage gibt es noch keine Lektion.";const n=t.woerter??l,r=t.naehe??g;return["\u{1F50D} **Nichts Passendes im Bestand.**","",`Von ${e.geprueft} gepr\xFCften Treffern enthielt der beste ${e.besteWortBelege} der gesuchten W\xF6rter (n\xF6tig: ${n}), und die h\xF6chste Bedeutungsn\xE4he lag bei ${e.besteNaehe.toFixed(2)} (n\xF6tig: ${r.toFixed(2)}).`,"Sie werden bewusst NICHT gezeigt: ein schwacher Treffer sieht wie ein starker aus, und der Unterschied entscheidet.","",'_Wenn die Antwort trotzdem im Bestand liegen sollte, hilft eine Frage mit anderen Worten \u2014 oder `recall_best_solution(topic="\u2026")`, wenn das Thema bekannt ist._'].join(`
|
|
2
|
+
`)}export{E as abstentionSatz,S as beurteileTreffer};
|
package/dist/src/embeddings.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
const
|
|
1
|
+
const s={apiUrl:process.env.CACHLY_API_URL??"https://api.cachly.dev",jwt:process.env.CACHLY_JWT??"",model:process.env.CACHLY_EMBED_MODEL??""};function f(n){s.jwt=n}const a=Number(process.env.CACHLY_EMBED_TIMEOUT_MS??8e3);function E(){return process.env.CACHLY_JWT?"cachly":process.env.OLLAMA_BASE_URL?"ollama":"none"}const d=(process.env.CACHLY_EMBED_PROVIDER??E()).toLowerCase();async function u(n){switch(d){case"cachly":{if(!s.jwt)throw new Error(`CACHLY_JWT not set.
|
|
2
2
|
|
|
3
3
|
The "cachly" provider uses server-side embeddings via the Cachly API.
|
|
4
4
|
Set CACHLY_JWT, or use another provider via CACHLY_EMBED_PROVIDER:
|
|
5
5
|
openai \u2192 OPENAI_API_KEY
|
|
6
6
|
gemini \u2192 GEMINI_API_KEY
|
|
7
|
-
ollama \u2192 OLLAMA_BASE_URL (local, no key needed)`);const
|
|
7
|
+
ollama \u2192 OLLAMA_BASE_URL (local, no key needed)`);const e=`${s.apiUrl}/api/v1/embed`,r={text:n};s.model&&(r.model=s.model);const t=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${s.jwt}`},body:JSON.stringify(r),signal:AbortSignal.timeout(a)});if(!t.ok){const i=await t.text();let c=null;const l=Number(t.headers.get("retry-after"));if(Number.isFinite(l)&&l>=0)c=l;else try{const m=JSON.parse(i);typeof m.retry_after=="number"&&m.retry_after>=0&&(c=m.retry_after)}catch{}throw Object.assign(new Error(`Cachly embed API error ${t.status}: ${i.slice(0,200)}`),{status:t.status,retryAfterSek:c})}return(await t.json()).embedding}case"mistral":{const e=process.env.MISTRAL_API_KEY;if(!e)throw new Error("MISTRAL_API_KEY not set");const r=s.model!=="text-embedding-3-small"?s.model:"mistral-embed",t=await fetch("https://api.mistral.ai/v1/embeddings",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify({model:r,input:[n]}),signal:AbortSignal.timeout(a)});if(!t.ok)throw new Error(`Mistral embedding error: ${t.statusText}`);const o=await t.json();if(!o.data?.[0]?.embedding)throw new Error("Mistral returned empty embedding response");return o.data[0].embedding}case"cohere":{const e=process.env.COHERE_API_KEY;if(!e)throw new Error("COHERE_API_KEY not set");const r=s.model!=="text-embedding-3-small"?s.model:"embed-english-v3.0",t=await fetch("https://api.cohere.com/v2/embed",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify({model:r,texts:[n],input_type:"search_query",embedding_types:["float"]}),signal:AbortSignal.timeout(a)});if(!t.ok)throw new Error(`Cohere embedding error: ${t.statusText}`);return(await t.json()).embeddings.float[0]}case"ollama":{const e=process.env.OLLAMA_BASE_URL??"http://localhost:11434",r=s.model!=="text-embedding-3-small"?s.model:"nomic-embed-text",t=await fetch(`${e}/api/embeddings`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:r,prompt:n}),signal:AbortSignal.timeout(a)});if(!t.ok)throw new Error(`Ollama embedding error: ${t.statusText}`);return(await t.json()).embedding}case"gemini":{const e=process.env.GEMINI_API_KEY;if(!e)throw new Error("GEMINI_API_KEY not set");const r=s.model!=="text-embedding-3-small"?s.model:"text-embedding-004",t=await fetch(`https://generativelanguage.googleapis.com/v1beta/models/${r}:embedContent?key=${e}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:`models/${r}`,content:{parts:[{text:n}]}}),signal:AbortSignal.timeout(a)});if(!t.ok)throw new Error(`Gemini embedding error: ${t.statusText}`);return(await t.json()).embedding.values}case"openai":{const e=process.env.OPENAI_API_KEY;if(!e)throw new Error(`OPENAI_API_KEY not set.
|
|
8
8
|
|
|
9
9
|
Set OPENAI_API_KEY in your .env, or switch provider:
|
|
10
10
|
CACHLY_EMBED_PROVIDER=gemini (+ GEMINI_API_KEY)
|
|
11
11
|
CACHLY_EMBED_PROVIDER=ollama (local, free)
|
|
12
|
-
CACHLY_EMBED_PROVIDER=cachly (server-side, no key needed)`);const
|
|
13
|
-
Supported: cachly (default), openai, mistral, cohere, ollama, gemini`)}}function
|
|
12
|
+
CACHLY_EMBED_PROVIDER=cachly (server-side, no key needed)`);const r=s.model||"text-embedding-3-small",t=await fetch("https://api.openai.com/v1/embeddings",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify({model:r,input:n}),signal:AbortSignal.timeout(a)});if(!t.ok)throw new Error(`OpenAI embedding error: ${t.statusText}`);const o=await t.json();if(!o.data?.[0]?.embedding)throw new Error("OpenAI returned empty embedding response");return o.data[0].embedding}default:throw new Error(`Unknown CACHLY_EMBED_PROVIDER="${d}".
|
|
13
|
+
Supported: cachly (default), openai, mistral, cohere, ollama, gemini`)}}const _=3,p=4;function A(n){const e=n;if(typeof e?.status=="number")return e.status===429||e.status>=500;if(e?.name==="TimeoutError"||e?.name==="AbortError")return!1;if(/fetch failed/i.test(String(e?.message??"")))return!0;const r=e?.cause?.code??"";return["ECONNRESET","ECONNREFUSED","ETIMEDOUT","EAI_AGAIN","EPIPE","UND_ERR_SOCKET"].includes(r)}function h(n,e,r){if(e>=(r==="lang"?p:_)||!A(n))return null;const o=n?.retryAfterSek;if(typeof o=="number"&&Number.isFinite(o)&&o>=0){const i=o*1e3;return r==="kurz"?i<=2e3?i:null:Math.min(i,61e3)}return r==="lang"?Math.min(1e3*2**(e-1),8e3):250*2**(e-1)}async function g(n,e){const r=e?.geduld??"kurz";let t=0;for(;;){t++;try{return await u(n)}catch(o){const i=h(o,t,r);if(i===null)throw o;await new Promise(c=>setTimeout(c,i))}}}function b(){switch(d){case"cachly":return!!s.jwt;case"mistral":return!!process.env.MISTRAL_API_KEY;case"cohere":return!!process.env.COHERE_API_KEY;case"ollama":return!0;case"gemini":return!!process.env.GEMINI_API_KEY;case"openai":return!!process.env.OPENAI_API_KEY;case"none":return!1;default:return!1}}function I(){const n={cachly:"CACHLY_JWT (server-side, no extra key needed)",openai:"OPENAI_API_KEY",mistral:"MISTRAL_API_KEY",cohere:"COHERE_API_KEY",ollama:"OLLAMA_BASE_URL (optional, default: http://localhost:11434)",gemini:"GEMINI_API_KEY"};if(d==="none")return"No embedding provider configured. Set OPENAI_API_KEY, GEMINI_API_KEY, or another provider key in .env. Brain works without embedding.";const e=n[d]??"CACHLY_JWT";return`CACHLY_EMBED_PROVIDER=${d} \u2192 requires ${e}`}export{d as EMBED_PROVIDER,g as computeEmbedding,s as embedConfig,I as embedProviderHint,b as hasEmbedProvider,A as istVoruebergehend,f as setEmbedJwt,h as wiederholungMs};
|