@molroo-io/sdk 0.5.2
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/LICENSE +21 -0
- package/README.md +251 -0
- package/dist/cjs/api-client.d.ts +23 -0
- package/dist/cjs/api-client.d.ts.map +1 -0
- package/dist/cjs/api-client.js +55 -0
- package/dist/cjs/defaults/index.d.ts +8 -0
- package/dist/cjs/defaults/index.d.ts.map +1 -0
- package/dist/cjs/defaults/index.js +30 -0
- package/dist/cjs/defaults/persona.json +17 -0
- package/dist/cjs/embedding/cloudflare.d.ts +15 -0
- package/dist/cjs/embedding/cloudflare.d.ts.map +1 -0
- package/dist/cjs/embedding/cloudflare.js +16 -0
- package/dist/cjs/embedding/cohere.d.ts +8 -0
- package/dist/cjs/embedding/cohere.d.ts.map +1 -0
- package/dist/cjs/embedding/cohere.js +31 -0
- package/dist/cjs/embedding/index.d.ts +9 -0
- package/dist/cjs/embedding/index.d.ts.map +1 -0
- package/dist/cjs/embedding/index.js +11 -0
- package/dist/cjs/embedding/local.d.ts +6 -0
- package/dist/cjs/embedding/local.d.ts.map +1 -0
- package/dist/cjs/embedding/local.js +28 -0
- package/dist/cjs/embedding/openai.d.ts +9 -0
- package/dist/cjs/embedding/openai.d.ts.map +1 -0
- package/dist/cjs/embedding/openai.js +26 -0
- package/dist/cjs/errors.d.ts +17 -0
- package/dist/cjs/errors.d.ts.map +1 -0
- package/dist/cjs/errors.js +21 -0
- package/dist/cjs/events/console.d.ts +25 -0
- package/dist/cjs/events/console.d.ts.map +1 -0
- package/dist/cjs/events/console.js +41 -0
- package/dist/cjs/events/types.d.ts +28 -0
- package/dist/cjs/events/types.d.ts.map +1 -0
- package/dist/cjs/events/types.js +13 -0
- package/dist/cjs/events/webhook.d.ts +30 -0
- package/dist/cjs/events/webhook.d.ts.map +1 -0
- package/dist/cjs/events/webhook.js +79 -0
- package/dist/cjs/generate/persona.d.ts +16 -0
- package/dist/cjs/generate/persona.d.ts.map +1 -0
- package/dist/cjs/generate/persona.js +42 -0
- package/dist/cjs/generate/prompt.d.ts +7 -0
- package/dist/cjs/generate/prompt.d.ts.map +1 -0
- package/dist/cjs/generate/prompt.js +41 -0
- package/dist/cjs/generate/schema.d.ts +32 -0
- package/dist/cjs/generate/schema.d.ts.map +1 -0
- package/dist/cjs/generate/schema.js +54 -0
- package/dist/cjs/generated/index.d.ts +2 -0
- package/dist/cjs/generated/index.d.ts.map +1 -0
- package/dist/cjs/generated/index.js +2 -0
- package/dist/cjs/index.d.ts +66 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +69 -0
- package/dist/cjs/llm/adapter.d.ts +61 -0
- package/dist/cjs/llm/adapter.d.ts.map +1 -0
- package/dist/cjs/llm/adapter.js +2 -0
- package/dist/cjs/llm/resolve.d.ts +28 -0
- package/dist/cjs/llm/resolve.d.ts.map +1 -0
- package/dist/cjs/llm/resolve.js +20 -0
- package/dist/cjs/llm/schema.d.ts +60 -0
- package/dist/cjs/llm/schema.d.ts.map +1 -0
- package/dist/cjs/llm/schema.js +72 -0
- package/dist/cjs/llm/types.d.ts +24 -0
- package/dist/cjs/llm/types.d.ts.map +1 -0
- package/dist/cjs/llm/types.js +2 -0
- package/dist/cjs/llm/vercel-ai/adapter.d.ts +29 -0
- package/dist/cjs/llm/vercel-ai/adapter.d.ts.map +1 -0
- package/dist/cjs/llm/vercel-ai/adapter.js +234 -0
- package/dist/cjs/llm/vercel-ai/config.d.ts +9 -0
- package/dist/cjs/llm/vercel-ai/config.d.ts.map +1 -0
- package/dist/cjs/llm/vercel-ai/config.js +2 -0
- package/dist/cjs/llm/vercel-ai/index.d.ts +9 -0
- package/dist/cjs/llm/vercel-ai/index.d.ts.map +1 -0
- package/dist/cjs/llm/vercel-ai/index.js +13 -0
- package/dist/cjs/memory/cloudflare/index.d.ts +3 -0
- package/dist/cjs/memory/cloudflare/index.d.ts.map +1 -0
- package/dist/cjs/memory/cloudflare/index.js +5 -0
- package/dist/cjs/memory/cloudflare/vectorize.d.ts +62 -0
- package/dist/cjs/memory/cloudflare/vectorize.d.ts.map +1 -0
- package/dist/cjs/memory/cloudflare/vectorize.js +55 -0
- package/dist/cjs/memory/in-memory-semantic.d.ts +16 -0
- package/dist/cjs/memory/in-memory-semantic.d.ts.map +1 -0
- package/dist/cjs/memory/in-memory-semantic.js +57 -0
- package/dist/cjs/memory/in-memory.d.ts +46 -0
- package/dist/cjs/memory/in-memory.d.ts.map +1 -0
- package/dist/cjs/memory/in-memory.js +115 -0
- package/dist/cjs/memory/pinecone/index.d.ts +7 -0
- package/dist/cjs/memory/pinecone/index.d.ts.map +1 -0
- package/dist/cjs/memory/pinecone/index.js +8 -0
- package/dist/cjs/memory/pinecone/memory-adapter.d.ts +62 -0
- package/dist/cjs/memory/pinecone/memory-adapter.d.ts.map +1 -0
- package/dist/cjs/memory/pinecone/memory-adapter.js +220 -0
- package/dist/cjs/memory/pinecone/semantic.d.ts +44 -0
- package/dist/cjs/memory/pinecone/semantic.d.ts.map +1 -0
- package/dist/cjs/memory/pinecone/semantic.js +90 -0
- package/dist/cjs/memory/recall.d.ts +58 -0
- package/dist/cjs/memory/recall.d.ts.map +1 -0
- package/dist/cjs/memory/recall.js +220 -0
- package/dist/cjs/memory/semantic.d.ts +24 -0
- package/dist/cjs/memory/semantic.d.ts.map +1 -0
- package/dist/cjs/memory/semantic.js +2 -0
- package/dist/cjs/memory/sqlite/index.d.ts +3 -0
- package/dist/cjs/memory/sqlite/index.d.ts.map +1 -0
- package/dist/cjs/memory/sqlite/index.js +5 -0
- package/dist/cjs/memory/sqlite/memory-adapter.d.ts +58 -0
- package/dist/cjs/memory/sqlite/memory-adapter.d.ts.map +1 -0
- package/dist/cjs/memory/sqlite/memory-adapter.js +336 -0
- package/dist/cjs/memory/sqlite/schema.d.ts +4 -0
- package/dist/cjs/memory/sqlite/schema.d.ts.map +1 -0
- package/dist/cjs/memory/sqlite/schema.js +91 -0
- package/dist/cjs/memory/supabase/index.d.ts +7 -0
- package/dist/cjs/memory/supabase/index.d.ts.map +1 -0
- package/dist/cjs/memory/supabase/index.js +8 -0
- package/dist/cjs/memory/supabase/memory-adapter.d.ts +67 -0
- package/dist/cjs/memory/supabase/memory-adapter.d.ts.map +1 -0
- package/dist/cjs/memory/supabase/memory-adapter.js +335 -0
- package/dist/cjs/memory/supabase/semantic.d.ts +44 -0
- package/dist/cjs/memory/supabase/semantic.d.ts.map +1 -0
- package/dist/cjs/memory/supabase/semantic.js +72 -0
- package/dist/cjs/memory/types.d.ts +231 -0
- package/dist/cjs/memory/types.d.ts.map +1 -0
- package/dist/cjs/memory/types.js +12 -0
- package/dist/cjs/persona.d.ts +326 -0
- package/dist/cjs/persona.d.ts.map +1 -0
- package/dist/cjs/persona.js +824 -0
- package/dist/cjs/types.d.ts +263 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js +15 -0
- package/dist/cjs/world/client.d.ts +36 -0
- package/dist/cjs/world/client.d.ts.map +1 -0
- package/dist/cjs/world/client.js +59 -0
- package/dist/cjs/world/errors.d.ts +9 -0
- package/dist/cjs/world/errors.d.ts.map +1 -0
- package/dist/cjs/world/errors.js +15 -0
- package/dist/cjs/world/index.d.ts +10 -0
- package/dist/cjs/world/index.d.ts.map +1 -0
- package/dist/cjs/world/index.js +16 -0
- package/dist/cjs/world/types.d.ts +101 -0
- package/dist/cjs/world/types.d.ts.map +1 -0
- package/dist/cjs/world/types.js +8 -0
- package/dist/cjs/world/village.d.ts +75 -0
- package/dist/cjs/world/village.d.ts.map +1 -0
- package/dist/cjs/world/village.js +278 -0
- package/dist/cjs/world/world-persona.d.ts +182 -0
- package/dist/cjs/world/world-persona.d.ts.map +1 -0
- package/dist/cjs/world/world-persona.js +192 -0
- package/dist/cjs/world/world.d.ts +41 -0
- package/dist/cjs/world/world.d.ts.map +1 -0
- package/dist/cjs/world/world.js +91 -0
- package/dist/esm/api-client.d.ts +23 -0
- package/dist/esm/api-client.d.ts.map +1 -0
- package/dist/esm/api-client.js +48 -0
- package/dist/esm/defaults/index.d.ts +8 -0
- package/dist/esm/defaults/index.d.ts.map +1 -0
- package/dist/esm/defaults/index.js +23 -0
- package/dist/esm/defaults/persona.json +17 -0
- package/dist/esm/embedding/cloudflare.d.ts +15 -0
- package/dist/esm/embedding/cloudflare.d.ts.map +1 -0
- package/dist/esm/embedding/cloudflare.js +13 -0
- package/dist/esm/embedding/cohere.d.ts +8 -0
- package/dist/esm/embedding/cohere.d.ts.map +1 -0
- package/dist/esm/embedding/cohere.js +28 -0
- package/dist/esm/embedding/index.d.ts +9 -0
- package/dist/esm/embedding/index.d.ts.map +1 -0
- package/dist/esm/embedding/index.js +4 -0
- package/dist/esm/embedding/local.d.ts +6 -0
- package/dist/esm/embedding/local.d.ts.map +1 -0
- package/dist/esm/embedding/local.js +25 -0
- package/dist/esm/embedding/openai.d.ts +9 -0
- package/dist/esm/embedding/openai.d.ts.map +1 -0
- package/dist/esm/embedding/openai.js +23 -0
- package/dist/esm/errors.d.ts +17 -0
- package/dist/esm/errors.d.ts.map +1 -0
- package/dist/esm/errors.js +17 -0
- package/dist/esm/events/console.d.ts +25 -0
- package/dist/esm/events/console.d.ts.map +1 -0
- package/dist/esm/events/console.js +37 -0
- package/dist/esm/events/types.d.ts +28 -0
- package/dist/esm/events/types.d.ts.map +1 -0
- package/dist/esm/events/types.js +12 -0
- package/dist/esm/events/webhook.d.ts +30 -0
- package/dist/esm/events/webhook.d.ts.map +1 -0
- package/dist/esm/events/webhook.js +75 -0
- package/dist/esm/generate/persona.d.ts +16 -0
- package/dist/esm/generate/persona.d.ts.map +1 -0
- package/dist/esm/generate/persona.js +39 -0
- package/dist/esm/generate/prompt.d.ts +7 -0
- package/dist/esm/generate/prompt.d.ts.map +1 -0
- package/dist/esm/generate/prompt.js +38 -0
- package/dist/esm/generate/schema.d.ts +32 -0
- package/dist/esm/generate/schema.d.ts.map +1 -0
- package/dist/esm/generate/schema.js +51 -0
- package/dist/esm/generated/index.d.ts +2 -0
- package/dist/esm/generated/index.d.ts.map +1 -0
- package/dist/esm/generated/index.js +1 -0
- package/dist/esm/index.d.ts +66 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +49 -0
- package/dist/esm/llm/adapter.d.ts +61 -0
- package/dist/esm/llm/adapter.d.ts.map +1 -0
- package/dist/esm/llm/adapter.js +1 -0
- package/dist/esm/llm/resolve.d.ts +28 -0
- package/dist/esm/llm/resolve.d.ts.map +1 -0
- package/dist/esm/llm/resolve.js +17 -0
- package/dist/esm/llm/schema.d.ts +60 -0
- package/dist/esm/llm/schema.d.ts.map +1 -0
- package/dist/esm/llm/schema.js +69 -0
- package/dist/esm/llm/types.d.ts +24 -0
- package/dist/esm/llm/types.d.ts.map +1 -0
- package/dist/esm/llm/types.js +1 -0
- package/dist/esm/llm/vercel-ai/adapter.d.ts +29 -0
- package/dist/esm/llm/vercel-ai/adapter.d.ts.map +1 -0
- package/dist/esm/llm/vercel-ai/adapter.js +196 -0
- package/dist/esm/llm/vercel-ai/config.d.ts +9 -0
- package/dist/esm/llm/vercel-ai/config.d.ts.map +1 -0
- package/dist/esm/llm/vercel-ai/config.js +1 -0
- package/dist/esm/llm/vercel-ai/index.d.ts +9 -0
- package/dist/esm/llm/vercel-ai/index.d.ts.map +1 -0
- package/dist/esm/llm/vercel-ai/index.js +8 -0
- package/dist/esm/memory/cloudflare/index.d.ts +3 -0
- package/dist/esm/memory/cloudflare/index.d.ts.map +1 -0
- package/dist/esm/memory/cloudflare/index.js +1 -0
- package/dist/esm/memory/cloudflare/vectorize.d.ts +62 -0
- package/dist/esm/memory/cloudflare/vectorize.d.ts.map +1 -0
- package/dist/esm/memory/cloudflare/vectorize.js +51 -0
- package/dist/esm/memory/in-memory-semantic.d.ts +16 -0
- package/dist/esm/memory/in-memory-semantic.d.ts.map +1 -0
- package/dist/esm/memory/in-memory-semantic.js +53 -0
- package/dist/esm/memory/in-memory.d.ts +46 -0
- package/dist/esm/memory/in-memory.d.ts.map +1 -0
- package/dist/esm/memory/in-memory.js +111 -0
- package/dist/esm/memory/pinecone/index.d.ts +7 -0
- package/dist/esm/memory/pinecone/index.d.ts.map +1 -0
- package/dist/esm/memory/pinecone/index.js +3 -0
- package/dist/esm/memory/pinecone/memory-adapter.d.ts +62 -0
- package/dist/esm/memory/pinecone/memory-adapter.d.ts.map +1 -0
- package/dist/esm/memory/pinecone/memory-adapter.js +216 -0
- package/dist/esm/memory/pinecone/semantic.d.ts +44 -0
- package/dist/esm/memory/pinecone/semantic.d.ts.map +1 -0
- package/dist/esm/memory/pinecone/semantic.js +86 -0
- package/dist/esm/memory/recall.d.ts +58 -0
- package/dist/esm/memory/recall.d.ts.map +1 -0
- package/dist/esm/memory/recall.js +215 -0
- package/dist/esm/memory/semantic.d.ts +24 -0
- package/dist/esm/memory/semantic.d.ts.map +1 -0
- package/dist/esm/memory/semantic.js +1 -0
- package/dist/esm/memory/sqlite/index.d.ts +3 -0
- package/dist/esm/memory/sqlite/index.d.ts.map +1 -0
- package/dist/esm/memory/sqlite/index.js +1 -0
- package/dist/esm/memory/sqlite/memory-adapter.d.ts +58 -0
- package/dist/esm/memory/sqlite/memory-adapter.d.ts.map +1 -0
- package/dist/esm/memory/sqlite/memory-adapter.js +296 -0
- package/dist/esm/memory/sqlite/schema.d.ts +4 -0
- package/dist/esm/memory/sqlite/schema.d.ts.map +1 -0
- package/dist/esm/memory/sqlite/schema.js +86 -0
- package/dist/esm/memory/supabase/index.d.ts +7 -0
- package/dist/esm/memory/supabase/index.d.ts.map +1 -0
- package/dist/esm/memory/supabase/index.js +3 -0
- package/dist/esm/memory/supabase/memory-adapter.d.ts +67 -0
- package/dist/esm/memory/supabase/memory-adapter.d.ts.map +1 -0
- package/dist/esm/memory/supabase/memory-adapter.js +331 -0
- package/dist/esm/memory/supabase/semantic.d.ts +44 -0
- package/dist/esm/memory/supabase/semantic.d.ts.map +1 -0
- package/dist/esm/memory/supabase/semantic.js +68 -0
- package/dist/esm/memory/types.d.ts +231 -0
- package/dist/esm/memory/types.d.ts.map +1 -0
- package/dist/esm/memory/types.js +9 -0
- package/dist/esm/persona.d.ts +326 -0
- package/dist/esm/persona.d.ts.map +1 -0
- package/dist/esm/persona.js +787 -0
- package/dist/esm/types.d.ts +263 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +11 -0
- package/dist/esm/world/client.d.ts +36 -0
- package/dist/esm/world/client.d.ts.map +1 -0
- package/dist/esm/world/client.js +52 -0
- package/dist/esm/world/errors.d.ts +9 -0
- package/dist/esm/world/errors.d.ts.map +1 -0
- package/dist/esm/world/errors.js +11 -0
- package/dist/esm/world/index.d.ts +10 -0
- package/dist/esm/world/index.d.ts.map +1 -0
- package/dist/esm/world/index.js +8 -0
- package/dist/esm/world/types.d.ts +101 -0
- package/dist/esm/world/types.d.ts.map +1 -0
- package/dist/esm/world/types.js +7 -0
- package/dist/esm/world/village.d.ts +75 -0
- package/dist/esm/world/village.d.ts.map +1 -0
- package/dist/esm/world/village.js +274 -0
- package/dist/esm/world/world-persona.d.ts +182 -0
- package/dist/esm/world/world-persona.d.ts.map +1 -0
- package/dist/esm/world/world-persona.js +188 -0
- package/dist/esm/world/world.d.ts +41 -0
- package/dist/esm/world/world.d.ts.map +1 -0
- package/dist/esm/world/world.js +87 -0
- package/package.json +207 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025-present molroo-io
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<picture>
|
|
3
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/molroo-io/sdk/main/assets/logo-dark.png">
|
|
4
|
+
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/molroo-io/sdk/main/assets/logo-light.png">
|
|
5
|
+
<img alt="molroo" src="https://raw.githubusercontent.com/molroo-io/sdk/main/assets/logo-light.png" width="180" />
|
|
6
|
+
</picture>
|
|
7
|
+
</p>
|
|
8
|
+
|
|
9
|
+
# @molroo-io/sdk
|
|
10
|
+
|
|
11
|
+
[](package.json)
|
|
12
|
+
[](LICENSE)
|
|
13
|
+
[](tsconfig.json)
|
|
14
|
+
[](src/__tests__)
|
|
15
|
+
|
|
16
|
+
Thin client SDK for the [molroo](https://molroo.io) emotion engine API. Handles prompt assembly, LLM orchestration, and memory recall — so your app just calls `chat()`.
|
|
17
|
+
|
|
18
|
+
## Install
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npm install @molroo-io/sdk
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Quick Start
|
|
25
|
+
|
|
26
|
+
```ts
|
|
27
|
+
import { MolrooPersona } from '@molroo-io/sdk';
|
|
28
|
+
import { createVercelAIAdapter } from '@molroo-io/sdk';
|
|
29
|
+
|
|
30
|
+
const llm = createVercelAIAdapter({
|
|
31
|
+
provider: 'openai',
|
|
32
|
+
apiKey: process.env.OPENAI_API_KEY!,
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
const persona = await MolrooPersona.create({
|
|
36
|
+
baseUrl: 'https://api.molroo.io',
|
|
37
|
+
apiKey: 'mol_sk_your_api_key',
|
|
38
|
+
llm,
|
|
39
|
+
}, {
|
|
40
|
+
identity: { name: 'Sera', coreValues: ['honesty', 'warmth'] },
|
|
41
|
+
personality: { O: 0.7, C: 0.6, E: 0.8, A: 0.5, N: 0.3, H: 0.6 },
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
const result = await persona.chat('Hello!');
|
|
45
|
+
console.log(result.text); // "Hey! It's great to meet you..."
|
|
46
|
+
console.log(result.response.emotion); // { V: 0.4, A: 0.5, D: 0.2 }
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## How It Works
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
Your App SDK API (PersonaDO)
|
|
53
|
+
| | |
|
|
54
|
+
| persona.chat(msg) | |
|
|
55
|
+
|------------------------>| |
|
|
56
|
+
| | POST /personas/:id/prompt-context
|
|
57
|
+
| |------------------------------>|
|
|
58
|
+
| | { systemPrompt, tools } |
|
|
59
|
+
| |<------------------------------|
|
|
60
|
+
| | |
|
|
61
|
+
| | LLM call (your API key) |
|
|
62
|
+
| | system: systemPrompt |
|
|
63
|
+
| | -> { response, appraisal } |
|
|
64
|
+
| | |
|
|
65
|
+
| | POST /personas/:id/perceive |
|
|
66
|
+
| | { appraisal } |
|
|
67
|
+
| |------------------------------>|
|
|
68
|
+
| | { emotion, state } |
|
|
69
|
+
| |<------------------------------|
|
|
70
|
+
| | |
|
|
71
|
+
| { text, response } | |
|
|
72
|
+
|<------------------------| |
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
1. **Get prompt context** — API builds system prompt from live emotional state (identity + personality + mood + somatic + narrative + memory)
|
|
76
|
+
2. **LLM call** — SDK calls your LLM with assembled prompt. Returns response text + appraisal vector.
|
|
77
|
+
3. **Perceive** — SDK sends appraisal to API. Engine processes emotion pipeline -> new VAD state.
|
|
78
|
+
4. **Post-chat** — Episode saved, reflection triggered if needed, events emitted.
|
|
79
|
+
|
|
80
|
+
The API does all emotion computation. The SDK just connects it to your LLM.
|
|
81
|
+
|
|
82
|
+
## Two LLM Modes
|
|
83
|
+
|
|
84
|
+
### Combined Mode (default)
|
|
85
|
+
|
|
86
|
+
Single LLM call returns both response text and appraisal in one `generateObject()` call:
|
|
87
|
+
|
|
88
|
+
```ts
|
|
89
|
+
const persona = await MolrooPersona.create({
|
|
90
|
+
baseUrl, apiKey,
|
|
91
|
+
llm, // one LLM handles everything
|
|
92
|
+
}, personaConfig);
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### Split Mode
|
|
96
|
+
|
|
97
|
+
Separate LLM for appraisal (cheap/fast model) and response (quality model). Appraisal runs first -> engine updates emotion -> response generated with updated emotional state:
|
|
98
|
+
|
|
99
|
+
```ts
|
|
100
|
+
const persona = await MolrooPersona.create({
|
|
101
|
+
baseUrl, apiKey,
|
|
102
|
+
llm: responseModel, // quality model for response text
|
|
103
|
+
engineLlm: appraisalModel, // cheap model for appraisal vector
|
|
104
|
+
}, personaConfig);
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## MolrooPersona API
|
|
108
|
+
|
|
109
|
+
### Static Methods
|
|
110
|
+
|
|
111
|
+
| Method | Description |
|
|
112
|
+
|--------|-------------|
|
|
113
|
+
| `MolrooPersona.create(config, personaConfig)` | Create a new persona |
|
|
114
|
+
| `MolrooPersona.connect(config, personaId)` | Connect to an existing persona |
|
|
115
|
+
| `MolrooPersona.listPersonas(config)` | List all personas |
|
|
116
|
+
|
|
117
|
+
### Instance Methods
|
|
118
|
+
|
|
119
|
+
| Method | Description |
|
|
120
|
+
|--------|-------------|
|
|
121
|
+
| `chat(message, options?)` | Full LLM orchestration: prompt -> LLM -> perceive -> result |
|
|
122
|
+
| `perceive(message, options?)` | Send event to emotion engine (no LLM call) |
|
|
123
|
+
| `tick(seconds)` | Advance time (mood decay, body recovery) |
|
|
124
|
+
| `getState()` | Get current emotional state |
|
|
125
|
+
| `setEmotion(vad)` | Direct VAD override |
|
|
126
|
+
| `getPromptContext(suffix?, source?)` | Get server-assembled system prompt |
|
|
127
|
+
| `searchMemory(query, options?)` | Search episodic memory |
|
|
128
|
+
| `getSnapshot()` | Get full persona snapshot |
|
|
129
|
+
| `putSnapshot(snapshot)` | Load persona snapshot |
|
|
130
|
+
| `patch(config)` | Update persona config |
|
|
131
|
+
| `destroy()` | Soft-delete the persona |
|
|
132
|
+
| `restore()` | Restore a soft-deleted persona |
|
|
133
|
+
|
|
134
|
+
### Config
|
|
135
|
+
|
|
136
|
+
```ts
|
|
137
|
+
interface MolrooPersonaConfig {
|
|
138
|
+
baseUrl: string; // API URL (e.g. 'https://api.molroo.io')
|
|
139
|
+
apiKey: string; // API key
|
|
140
|
+
llm?: LLMAdapter; // LLM for chat (optional - emotion-only without)
|
|
141
|
+
engineLlm?: LLMAdapter; // Separate LLM for appraisal (split mode)
|
|
142
|
+
memory?: MemoryAdapter | MemoryConfig; // Single adapter or split config (optional)
|
|
143
|
+
recall?: RecallLimits; // Recall limits for single adapter mode
|
|
144
|
+
events?: EventAdapter; // Event emission (optional)
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## Adapters
|
|
149
|
+
|
|
150
|
+
### LLM Adapter
|
|
151
|
+
|
|
152
|
+
Required for `chat()`. Built into `@molroo-io/sdk`:
|
|
153
|
+
|
|
154
|
+
```ts
|
|
155
|
+
import { createVercelAIAdapter } from '@molroo-io/sdk';
|
|
156
|
+
|
|
157
|
+
const llm = createVercelAIAdapter({
|
|
158
|
+
provider: 'openai', // or 'anthropic', 'google'
|
|
159
|
+
apiKey: process.env.OPENAI_API_KEY!,
|
|
160
|
+
model: 'gpt-4o-mini', // optional
|
|
161
|
+
});
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### Memory
|
|
165
|
+
|
|
166
|
+
Client-side memory for episodic recall and semantic search. Optional — when not provided, memory recall is skipped.
|
|
167
|
+
|
|
168
|
+
**Single adapter (recommended)** — pass one `MemoryAdapter` that handles everything:
|
|
169
|
+
|
|
170
|
+
```ts
|
|
171
|
+
import { SqliteMemoryAdapter } from '@molroo-io/sdk/memory/sqlite';
|
|
172
|
+
|
|
173
|
+
const persona = await MolrooPersona.create({
|
|
174
|
+
baseUrl, apiKey, llm,
|
|
175
|
+
memory: new SqliteMemoryAdapter({ dbPath: './memory.db' }),
|
|
176
|
+
recall: { episodicLimit: 5, semanticLimit: 3 }, // optional limits
|
|
177
|
+
}, personaConfig);
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
Built-in `InMemoryEpisodeAdapter` also works as a single adapter (for demos/testing):
|
|
181
|
+
|
|
182
|
+
```ts
|
|
183
|
+
import { InMemoryEpisodeAdapter } from '@molroo-io/sdk';
|
|
184
|
+
|
|
185
|
+
const persona = await MolrooPersona.create({
|
|
186
|
+
baseUrl, apiKey, llm,
|
|
187
|
+
memory: new InMemoryEpisodeAdapter(),
|
|
188
|
+
}, personaConfig);
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
**Split adapters (advanced)** — assemble episode store + vector search separately:
|
|
192
|
+
|
|
193
|
+
```ts
|
|
194
|
+
const persona = await MolrooPersona.create({
|
|
195
|
+
baseUrl, apiKey, llm,
|
|
196
|
+
memory: {
|
|
197
|
+
episodes: episodeStore,
|
|
198
|
+
semantic: vectorStore,
|
|
199
|
+
embedding: embeddingProvider,
|
|
200
|
+
recall: { episodicLimit: 5, semanticLimit: 3 },
|
|
201
|
+
},
|
|
202
|
+
}, personaConfig);
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### Events
|
|
206
|
+
|
|
207
|
+
Optional event emission for logging, webhooks, or custom integrations:
|
|
208
|
+
|
|
209
|
+
```ts
|
|
210
|
+
import { ConsoleEventAdapter, WebhookEventAdapter } from '@molroo-io/sdk';
|
|
211
|
+
|
|
212
|
+
// Console logging
|
|
213
|
+
const events = new ConsoleEventAdapter();
|
|
214
|
+
|
|
215
|
+
// Webhook
|
|
216
|
+
const events = new WebhookEventAdapter({ url: 'https://...', secret: '...' });
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
## Persona Generation
|
|
220
|
+
|
|
221
|
+
Generate a complete persona config from a description using LLM:
|
|
222
|
+
|
|
223
|
+
```ts
|
|
224
|
+
import { generatePersona } from '@molroo-io/sdk';
|
|
225
|
+
|
|
226
|
+
const result = await generatePersona(llm, {
|
|
227
|
+
name: 'Sera',
|
|
228
|
+
description: 'A cheerful companion who loves music',
|
|
229
|
+
});
|
|
230
|
+
// result.config -> full PersonaConfigData
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
## Build & Test
|
|
234
|
+
|
|
235
|
+
```bash
|
|
236
|
+
npm run build # tsc -> dist/cjs + dist/esm
|
|
237
|
+
npm run test # Vitest (148 tests)
|
|
238
|
+
npm run lint # ESLint
|
|
239
|
+
npm run gen:types # openapi-typescript -> src/generated/api.d.ts
|
|
240
|
+
npm run docs # TypeDoc -> SDK API reference
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
## Links
|
|
244
|
+
|
|
245
|
+
- [Documentation](https://docs.molroo.io)
|
|
246
|
+
- [Dashboard](https://molroo.io/dashboard)
|
|
247
|
+
- [API Reference](https://api.molroo.io/docs)
|
|
248
|
+
|
|
249
|
+
## License
|
|
250
|
+
|
|
251
|
+
MIT
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { paths } from './generated/api';
|
|
2
|
+
/**
|
|
3
|
+
* Create a typed openapi-fetch client for the molroo API.
|
|
4
|
+
*
|
|
5
|
+
* @param baseUrl - API base URL (e.g., 'https://api.molroo.io').
|
|
6
|
+
* @param apiKey - API key for authentication.
|
|
7
|
+
* @returns A fully-typed openapi-fetch client instance.
|
|
8
|
+
*/
|
|
9
|
+
export declare function createApiClient(baseUrl: string, apiKey: string): import("openapi-fetch").Client<paths, `${string}/${string}`>;
|
|
10
|
+
export type ApiClient = ReturnType<typeof createApiClient>;
|
|
11
|
+
/**
|
|
12
|
+
* Unwrap the `{ result: T }` envelope from API responses.
|
|
13
|
+
*
|
|
14
|
+
* Many API endpoints return `ResultWrapper` (typed as `{ result?: unknown }`)
|
|
15
|
+
* in the OpenAPI spec. This helper extracts the `result` field and casts it
|
|
16
|
+
* to the expected type.
|
|
17
|
+
*
|
|
18
|
+
* For endpoints with properly-typed response schemas, use `data.result` directly.
|
|
19
|
+
*/
|
|
20
|
+
export declare function unwrap<T>(data: {
|
|
21
|
+
result?: unknown;
|
|
22
|
+
} | undefined): T;
|
|
23
|
+
//# sourceMappingURL=api-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/api-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAwB7C;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,gEAU9D;AAED,MAAM,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;AAE3D;;;;;;;;GAQG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,GAAG,CAAC,CAEnE"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.createApiClient = createApiClient;
|
|
7
|
+
exports.unwrap = unwrap;
|
|
8
|
+
const openapi_fetch_1 = __importDefault(require("openapi-fetch"));
|
|
9
|
+
const errors_1 = require("./errors");
|
|
10
|
+
/**
|
|
11
|
+
* Middleware: throw MolrooApiError on non-OK responses.
|
|
12
|
+
*
|
|
13
|
+
* Reads the error body `{ error: { code, message } }` and converts it
|
|
14
|
+
* into a typed MolrooApiError before openapi-fetch processes the response.
|
|
15
|
+
*/
|
|
16
|
+
const errorMiddleware = {
|
|
17
|
+
async onResponse({ response }) {
|
|
18
|
+
if (!response.ok) {
|
|
19
|
+
const body = await response.clone().json().catch(() => ({}));
|
|
20
|
+
const err = body;
|
|
21
|
+
throw new errors_1.MolrooApiError(err.error?.message ?? `API error ${response.status}`, err.error?.code ?? 'UNKNOWN', response.status);
|
|
22
|
+
}
|
|
23
|
+
// Return undefined to let openapi-fetch handle the response unchanged
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Create a typed openapi-fetch client for the molroo API.
|
|
28
|
+
*
|
|
29
|
+
* @param baseUrl - API base URL (e.g., 'https://api.molroo.io').
|
|
30
|
+
* @param apiKey - API key for authentication.
|
|
31
|
+
* @returns A fully-typed openapi-fetch client instance.
|
|
32
|
+
*/
|
|
33
|
+
function createApiClient(baseUrl, apiKey) {
|
|
34
|
+
const client = (0, openapi_fetch_1.default)({
|
|
35
|
+
baseUrl: baseUrl.replace(/\/$/, ''),
|
|
36
|
+
headers: {
|
|
37
|
+
'Content-Type': 'application/json',
|
|
38
|
+
'X-API-Key': apiKey,
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
client.use(errorMiddleware);
|
|
42
|
+
return client;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Unwrap the `{ result: T }` envelope from API responses.
|
|
46
|
+
*
|
|
47
|
+
* Many API endpoints return `ResultWrapper` (typed as `{ result?: unknown }`)
|
|
48
|
+
* in the OpenAPI spec. This helper extracts the `result` field and casts it
|
|
49
|
+
* to the expected type.
|
|
50
|
+
*
|
|
51
|
+
* For endpoints with properly-typed response schemas, use `data.result` directly.
|
|
52
|
+
*/
|
|
53
|
+
function unwrap(data) {
|
|
54
|
+
return (data?.result ?? {});
|
|
55
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { PersonaConfigData } from '../types.js';
|
|
2
|
+
export declare const DEFAULT_PERSONA: PersonaConfigData;
|
|
3
|
+
/**
|
|
4
|
+
* Merge user-provided persona config with defaults.
|
|
5
|
+
* User values take precedence; defaults fill missing fields.
|
|
6
|
+
*/
|
|
7
|
+
export declare function withDefaults(config?: Partial<PersonaConfigData>): PersonaConfigData;
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/defaults/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,eAAO,MAAM,eAAe,EAAE,iBAAkC,CAAC;AAEjE;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,iBAAiB,CAenF"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.DEFAULT_PERSONA = void 0;
|
|
7
|
+
exports.withDefaults = withDefaults;
|
|
8
|
+
const persona_json_1 = __importDefault(require("./persona.json"));
|
|
9
|
+
exports.DEFAULT_PERSONA = persona_json_1.default;
|
|
10
|
+
/**
|
|
11
|
+
* Merge user-provided persona config with defaults.
|
|
12
|
+
* User values take precedence; defaults fill missing fields.
|
|
13
|
+
*/
|
|
14
|
+
function withDefaults(config) {
|
|
15
|
+
if (!config)
|
|
16
|
+
return { ...exports.DEFAULT_PERSONA };
|
|
17
|
+
return {
|
|
18
|
+
...exports.DEFAULT_PERSONA,
|
|
19
|
+
...config,
|
|
20
|
+
personality: {
|
|
21
|
+
...exports.DEFAULT_PERSONA.personality,
|
|
22
|
+
...config.personality,
|
|
23
|
+
},
|
|
24
|
+
identity: {
|
|
25
|
+
...exports.DEFAULT_PERSONA.identity,
|
|
26
|
+
...config.identity,
|
|
27
|
+
},
|
|
28
|
+
goals: config.goals ?? exports.DEFAULT_PERSONA.goals,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"personality": {
|
|
3
|
+
"O": 0.5,
|
|
4
|
+
"C": 0.5,
|
|
5
|
+
"E": 0.5,
|
|
6
|
+
"A": 0.5,
|
|
7
|
+
"N": 0.5,
|
|
8
|
+
"H": 0.5
|
|
9
|
+
},
|
|
10
|
+
"identity": {
|
|
11
|
+
"name": "Persona",
|
|
12
|
+
"role": "A person with a neutral, balanced personality.",
|
|
13
|
+
"speakingStyle": "Natural, conversational tone.",
|
|
14
|
+
"coreValues": ["honesty", "kindness"]
|
|
15
|
+
},
|
|
16
|
+
"goals": []
|
|
17
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { EmbeddingAdapter } from '../memory/types';
|
|
2
|
+
export interface AiBinding {
|
|
3
|
+
run(model: string, input: {
|
|
4
|
+
text: string[];
|
|
5
|
+
}): Promise<{
|
|
6
|
+
data: number[][];
|
|
7
|
+
}>;
|
|
8
|
+
}
|
|
9
|
+
export interface CloudflareAIEmbeddingOptions {
|
|
10
|
+
ai: AiBinding;
|
|
11
|
+
model?: string;
|
|
12
|
+
dimension?: number;
|
|
13
|
+
}
|
|
14
|
+
export declare function cloudflareAIEmbedding(options: CloudflareAIEmbeddingOptions): EmbeddingAdapter;
|
|
15
|
+
//# sourceMappingURL=cloudflare.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloudflare.d.ts","sourceRoot":"","sources":["../../../src/embedding/cloudflare.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,MAAM,WAAW,SAAS;IACxB,GAAG,CACD,KAAK,EAAE,MAAM,EACb,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,GACxB,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAA;KAAE,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,4BAA4B;IAC3C,EAAE,EAAE,SAAS,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAKD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,4BAA4B,GACpC,gBAAgB,CAWlB"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.cloudflareAIEmbedding = cloudflareAIEmbedding;
|
|
4
|
+
const DEFAULT_MODEL = '@cf/baai/bge-base-en-v1.5';
|
|
5
|
+
const DEFAULT_DIMENSION = 768;
|
|
6
|
+
function cloudflareAIEmbedding(options) {
|
|
7
|
+
const model = options.model ?? DEFAULT_MODEL;
|
|
8
|
+
const dimension = options.dimension ?? DEFAULT_DIMENSION;
|
|
9
|
+
return {
|
|
10
|
+
dimension,
|
|
11
|
+
async embed(text) {
|
|
12
|
+
const result = await options.ai.run(model, { text: [text] });
|
|
13
|
+
return result.data[0];
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { EmbeddingAdapter } from '../memory/types';
|
|
2
|
+
export interface CohereEmbeddingOptions {
|
|
3
|
+
apiKey: string;
|
|
4
|
+
model?: string;
|
|
5
|
+
inputType?: 'search_document' | 'search_query';
|
|
6
|
+
}
|
|
7
|
+
export declare function cohereEmbedding(options: CohereEmbeddingOptions): EmbeddingAdapter;
|
|
8
|
+
//# sourceMappingURL=cohere.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cohere.d.ts","sourceRoot":"","sources":["../../../src/embedding/cohere.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,iBAAiB,GAAG,cAAc,CAAC;CAChD;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,gBAAgB,CA4BjF"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.cohereEmbedding = cohereEmbedding;
|
|
4
|
+
function cohereEmbedding(options) {
|
|
5
|
+
const model = options.model ?? 'embed-english-v3.0';
|
|
6
|
+
const inputType = options.inputType ?? 'search_document';
|
|
7
|
+
const dimension = model.includes('v3') ? 1024 : 768;
|
|
8
|
+
return {
|
|
9
|
+
dimension,
|
|
10
|
+
embed: async (text) => {
|
|
11
|
+
const res = await fetch('https://api.cohere.com/v2/embed', {
|
|
12
|
+
method: 'POST',
|
|
13
|
+
headers: {
|
|
14
|
+
'Authorization': `Bearer ${options.apiKey}`,
|
|
15
|
+
'Content-Type': 'application/json',
|
|
16
|
+
},
|
|
17
|
+
body: JSON.stringify({
|
|
18
|
+
model,
|
|
19
|
+
texts: [text],
|
|
20
|
+
input_type: inputType,
|
|
21
|
+
embedding_types: ['float'],
|
|
22
|
+
}),
|
|
23
|
+
});
|
|
24
|
+
if (!res.ok) {
|
|
25
|
+
throw new Error(`Cohere embedding failed: ${res.status} ${res.statusText}`);
|
|
26
|
+
}
|
|
27
|
+
const json = await res.json();
|
|
28
|
+
return json.embeddings.float[0];
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { openaiEmbedding } from './openai';
|
|
2
|
+
export { cohereEmbedding } from './cohere';
|
|
3
|
+
export { createLocalEmbedder } from './local';
|
|
4
|
+
export { cloudflareAIEmbedding } from './cloudflare';
|
|
5
|
+
export type { OpenAIEmbeddingOptions } from './openai';
|
|
6
|
+
export type { CohereEmbeddingOptions } from './cohere';
|
|
7
|
+
export type { LocalEmbedderOptions } from './local';
|
|
8
|
+
export type { CloudflareAIEmbeddingOptions, AiBinding } from './cloudflare';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/embedding/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,YAAY,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AACvD,YAAY,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AACvD,YAAY,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AACpD,YAAY,EAAE,4BAA4B,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.cloudflareAIEmbedding = exports.createLocalEmbedder = exports.cohereEmbedding = exports.openaiEmbedding = void 0;
|
|
4
|
+
var openai_1 = require("./openai");
|
|
5
|
+
Object.defineProperty(exports, "openaiEmbedding", { enumerable: true, get: function () { return openai_1.openaiEmbedding; } });
|
|
6
|
+
var cohere_1 = require("./cohere");
|
|
7
|
+
Object.defineProperty(exports, "cohereEmbedding", { enumerable: true, get: function () { return cohere_1.cohereEmbedding; } });
|
|
8
|
+
var local_1 = require("./local");
|
|
9
|
+
Object.defineProperty(exports, "createLocalEmbedder", { enumerable: true, get: function () { return local_1.createLocalEmbedder; } });
|
|
10
|
+
var cloudflare_1 = require("./cloudflare");
|
|
11
|
+
Object.defineProperty(exports, "cloudflareAIEmbedding", { enumerable: true, get: function () { return cloudflare_1.cloudflareAIEmbedding; } });
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../../src/embedding/local.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,mBAAmB,CACvC,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,gBAAgB,CAAC,CA4B3B"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createLocalEmbedder = createLocalEmbedder;
|
|
4
|
+
async function createLocalEmbedder(options) {
|
|
5
|
+
const modelId = options?.model ?? 'Xenova/all-MiniLM-L6-v2';
|
|
6
|
+
let pipeline;
|
|
7
|
+
try {
|
|
8
|
+
const transformers = await Function('return import("@huggingface/transformers")')();
|
|
9
|
+
pipeline = transformers.pipeline;
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
throw new Error('@huggingface/transformers is required for local embeddings. ' +
|
|
13
|
+
'Install it: npm install @huggingface/transformers');
|
|
14
|
+
}
|
|
15
|
+
const extractor = await pipeline('feature-extraction', modelId);
|
|
16
|
+
const probe = await extractor('test', { pooling: 'mean', normalize: true });
|
|
17
|
+
const dimension = probe.data.length;
|
|
18
|
+
return {
|
|
19
|
+
dimension,
|
|
20
|
+
embed: async (text) => {
|
|
21
|
+
const output = await extractor(text, {
|
|
22
|
+
pooling: 'mean',
|
|
23
|
+
normalize: true,
|
|
24
|
+
});
|
|
25
|
+
return Array.from(output.data);
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { EmbeddingAdapter } from '../memory/types';
|
|
2
|
+
export interface OpenAIEmbeddingOptions {
|
|
3
|
+
apiKey: string;
|
|
4
|
+
model?: string;
|
|
5
|
+
dimension?: number;
|
|
6
|
+
baseUrl?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function openaiEmbedding(options: OpenAIEmbeddingOptions): EmbeddingAdapter;
|
|
9
|
+
//# sourceMappingURL=openai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/embedding/openai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,gBAAgB,CAuBjF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.openaiEmbedding = openaiEmbedding;
|
|
4
|
+
function openaiEmbedding(options) {
|
|
5
|
+
const model = options.model ?? 'text-embedding-3-small';
|
|
6
|
+
const dimension = options.dimension ?? 1536;
|
|
7
|
+
const baseUrl = options.baseUrl ?? 'https://api.openai.com';
|
|
8
|
+
return {
|
|
9
|
+
dimension,
|
|
10
|
+
embed: async (text) => {
|
|
11
|
+
const res = await fetch(`${baseUrl}/v1/embeddings`, {
|
|
12
|
+
method: 'POST',
|
|
13
|
+
headers: {
|
|
14
|
+
'Authorization': `Bearer ${options.apiKey}`,
|
|
15
|
+
'Content-Type': 'application/json',
|
|
16
|
+
},
|
|
17
|
+
body: JSON.stringify({ model, input: text, dimensions: dimension }),
|
|
18
|
+
});
|
|
19
|
+
if (!res.ok) {
|
|
20
|
+
throw new Error(`OpenAI embedding failed: ${res.status} ${res.statusText}`);
|
|
21
|
+
}
|
|
22
|
+
const json = await res.json();
|
|
23
|
+
return json.data[0].embedding;
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error thrown when the molroo API returns a non-OK response.
|
|
3
|
+
*
|
|
4
|
+
* Contains the API error code and HTTP status for programmatic handling.
|
|
5
|
+
*/
|
|
6
|
+
export declare class MolrooApiError extends Error {
|
|
7
|
+
/** Machine-readable error code (e.g., 'ENTITY_NOT_FOUND', 'UNAUTHORIZED'). */
|
|
8
|
+
code: string;
|
|
9
|
+
/** HTTP status code. */
|
|
10
|
+
status: number;
|
|
11
|
+
constructor(message: string,
|
|
12
|
+
/** Machine-readable error code (e.g., 'ENTITY_NOT_FOUND', 'UNAUTHORIZED'). */
|
|
13
|
+
code: string,
|
|
14
|
+
/** HTTP status code. */
|
|
15
|
+
status: number);
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,cAAe,SAAQ,KAAK;IAGrC,8EAA8E;IACvE,IAAI,EAAE,MAAM;IACnB,wBAAwB;IACjB,MAAM,EAAE,MAAM;gBAJrB,OAAO,EAAE,MAAM;IACf,8EAA8E;IACvE,IAAI,EAAE,MAAM;IACnB,wBAAwB;IACjB,MAAM,EAAE,MAAM;CAKxB"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MolrooApiError = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Error thrown when the molroo API returns a non-OK response.
|
|
6
|
+
*
|
|
7
|
+
* Contains the API error code and HTTP status for programmatic handling.
|
|
8
|
+
*/
|
|
9
|
+
class MolrooApiError extends Error {
|
|
10
|
+
constructor(message,
|
|
11
|
+
/** Machine-readable error code (e.g., 'ENTITY_NOT_FOUND', 'UNAUTHORIZED'). */
|
|
12
|
+
code,
|
|
13
|
+
/** HTTP status code. */
|
|
14
|
+
status) {
|
|
15
|
+
super(message);
|
|
16
|
+
this.code = code;
|
|
17
|
+
this.status = status;
|
|
18
|
+
this.name = 'MolrooApiError';
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
exports.MolrooApiError = MolrooApiError;
|