@dxos/assistant 0.8.4-main.67995b8 → 0.8.4-main.72ec0f3
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/lib/browser/chunk-J5LGTIGS.mjs +10 -0
- package/dist/lib/browser/extraction/index.mjs +121 -165
- package/dist/lib/browser/extraction/index.mjs.map +4 -4
- package/dist/lib/browser/index.mjs +1110 -1034
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
- package/dist/lib/node-esm/extraction/index.mjs +121 -165
- package/dist/lib/node-esm/extraction/index.mjs.map +4 -4
- package/dist/lib/node-esm/index.mjs +1110 -1034
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/types/src/{context/binding.d.ts → conversation/context.d.ts} +54 -5
- package/dist/types/src/conversation/context.d.ts.map +1 -0
- package/dist/types/src/conversation/conversation.d.ts +29 -26
- package/dist/types/src/conversation/conversation.d.ts.map +1 -1
- package/dist/types/src/conversation/index.d.ts +1 -0
- package/dist/types/src/conversation/index.d.ts.map +1 -1
- package/dist/types/src/diff.d.ts +15 -0
- package/dist/types/src/diff.d.ts.map +1 -0
- package/dist/types/src/diff.test.d.ts +2 -0
- package/dist/types/src/diff.test.d.ts.map +1 -0
- package/dist/types/src/errors.d.ts +46 -13
- package/dist/types/src/errors.d.ts.map +1 -1
- package/dist/types/src/execution-graph.d.ts +85 -0
- package/dist/types/src/execution-graph.d.ts.map +1 -0
- package/dist/types/src/execution-graph.test.d.ts +2 -0
- package/dist/types/src/execution-graph.test.d.ts.map +1 -0
- package/dist/types/src/extraction/extraction-llm-function/extraction-llm-function.d.ts +1 -1
- package/dist/types/src/extraction/extraction-llm-function/extraction-llm-function.d.ts.map +1 -1
- package/dist/types/src/extraction/extraction-ner-function/extraction-ner-function.d.ts +100 -57
- package/dist/types/src/extraction/extraction-ner-function/extraction-ner-function.d.ts.map +1 -1
- package/dist/types/src/extraction/extraction-ner-function/named-entity-recognition.d.ts.map +1 -1
- package/dist/types/src/extraction/extraction.d.ts +262 -221
- package/dist/types/src/extraction/extraction.d.ts.map +1 -1
- package/dist/types/src/extraction/quotes.d.ts +1 -1
- package/dist/types/src/extraction/quotes.d.ts.map +1 -1
- package/dist/types/src/functions/services.d.ts +18 -4
- package/dist/types/src/functions/services.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +3 -2
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/session/GenericToolkit.d.ts +84 -0
- package/dist/types/src/session/GenericToolkit.d.ts.map +1 -0
- package/dist/types/src/session/artifact-diff.d.ts +27 -0
- package/dist/types/src/session/artifact-diff.d.ts.map +1 -0
- package/dist/types/src/session/error-handling.d.ts +4 -0
- package/dist/types/src/session/error-handling.d.ts.map +1 -0
- package/dist/types/src/session/format.d.ts +12 -0
- package/dist/types/src/session/format.d.ts.map +1 -0
- package/dist/types/src/session/format.test.d.ts +2 -0
- package/dist/types/src/session/format.test.d.ts.map +1 -0
- package/dist/types/src/session/index.d.ts +4 -0
- package/dist/types/src/session/index.d.ts.map +1 -1
- package/dist/types/src/session/observer.d.ts +22 -0
- package/dist/types/src/session/observer.d.ts.map +1 -0
- package/dist/types/src/session/session.d.ts +28 -237
- package/dist/types/src/session/session.d.ts.map +1 -1
- package/dist/types/src/session/toolkit.d.ts +15 -0
- package/dist/types/src/session/toolkit.d.ts.map +1 -0
- package/dist/types/src/session/version-pin.d.ts +4 -4
- package/dist/types/src/session/version-pin.d.ts.map +1 -1
- package/dist/types/src/templates/index.d.ts +1 -1
- package/dist/types/src/templates/system.d.ts +18 -0
- package/dist/types/src/templates/system.d.ts.map +1 -0
- package/dist/types/src/types/artifact.d.ts +20 -0
- package/dist/types/src/types/artifact.d.ts.map +1 -0
- package/dist/types/src/types/index.d.ts +2 -0
- package/dist/types/src/types/index.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +33 -36
- package/src/conversation/context.ts +186 -0
- package/src/conversation/conversation.ts +93 -61
- package/src/conversation/index.ts +1 -0
- package/src/diff.test.ts +43 -0
- package/src/diff.ts +84 -0
- package/src/errors.ts +6 -1
- package/src/execution-graph.test.ts +740 -0
- package/src/execution-graph.ts +509 -0
- package/src/extraction/extraction-llm-function/extraction-llm-function.test.ts +10 -9
- package/src/extraction/extraction-llm-function/extraction-llm-function.ts +48 -56
- package/src/extraction/extraction-ner-function/extraction-ner-function.test.ts +18 -17
- package/src/extraction/extraction-ner-function/extraction-ner-function.ts +42 -43
- package/src/extraction/extraction-ner-function/named-entity-recognition.test.ts +12 -6
- package/src/extraction/extraction-ner-function/named-entity-recognition.ts +2 -0
- package/src/extraction/extraction.ts +7 -6
- package/src/extraction/quotes.test.ts +3 -3
- package/src/extraction/quotes.ts +4 -4
- package/src/functions/services.ts +108 -45
- package/src/index.ts +3 -2
- package/src/session/GenericToolkit.ts +130 -0
- package/src/session/artifact-diff.ts +41 -0
- package/src/session/error-handling.ts +41 -0
- package/src/session/format.test.ts +61 -0
- package/src/session/format.ts +144 -0
- package/src/session/index.ts +5 -0
- package/src/session/observer.ts +59 -0
- package/src/session/session.conversations.json +1 -0
- package/src/session/session.test.ts +38 -199
- package/src/session/session.ts +128 -251
- package/src/session/toolkit.ts +48 -0
- package/src/session/version-pin.ts +7 -8
- package/src/templates/index.ts +1 -1
- package/src/templates/instructions/format.tpl +61 -0
- package/src/templates/instructions/system.tpl +48 -0
- package/src/templates/system.ts +41 -0
- package/src/{types.ts → types/artifact.ts} +31 -7
- package/src/types/index.ts +5 -0
- package/src/typings.d.ts +5 -0
- package/dist/lib/browser/chunk-6WRGDEMH.mjs +0 -89
- package/dist/lib/browser/chunk-6WRGDEMH.mjs.map +0 -7
- package/dist/lib/browser/chunk-SIXTNSGV.mjs +0 -250
- package/dist/lib/browser/chunk-SIXTNSGV.mjs.map +0 -7
- package/dist/lib/browser/named-entity-recognition-O46UTCLR.mjs +0 -13
- package/dist/lib/node-esm/chunk-3UU5V4FS.mjs +0 -91
- package/dist/lib/node-esm/chunk-3UU5V4FS.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-FD5NXKDP.mjs +0 -252
- package/dist/lib/node-esm/chunk-FD5NXKDP.mjs.map +0 -7
- package/dist/lib/node-esm/named-entity-recognition-W4VMRCH6.mjs +0 -14
- package/dist/types/bin/chat.d.ts +0 -2
- package/dist/types/bin/chat.d.ts.map +0 -1
- package/dist/types/src/context/binder.d.ts +0 -34
- package/dist/types/src/context/binder.d.ts.map +0 -1
- package/dist/types/src/context/binding.d.ts.map +0 -1
- package/dist/types/src/context/index.d.ts +0 -3
- package/dist/types/src/context/index.d.ts.map +0 -1
- package/dist/types/src/research/exa.d.ts +0 -12
- package/dist/types/src/research/exa.d.ts.map +0 -1
- package/dist/types/src/research/graph.d.ts +0 -51
- package/dist/types/src/research/graph.d.ts.map +0 -1
- package/dist/types/src/research/graph.test.d.ts +0 -2
- package/dist/types/src/research/graph.test.d.ts.map +0 -1
- package/dist/types/src/research/index.d.ts +0 -4
- package/dist/types/src/research/index.d.ts.map +0 -1
- package/dist/types/src/research/research.d.ts +0 -10
- package/dist/types/src/research/research.d.ts.map +0 -1
- package/dist/types/src/research/research.test.d.ts +0 -2
- package/dist/types/src/research/research.test.d.ts.map +0 -1
- package/dist/types/src/session/version-pin.test.d.ts +0 -2
- package/dist/types/src/session/version-pin.test.d.ts.map +0 -1
- package/dist/types/src/summarization/summarization.test.d.ts +0 -2
- package/dist/types/src/summarization/summarization.test.d.ts.map +0 -1
- package/dist/types/src/templates/prompt.d.ts +0 -30
- package/dist/types/src/templates/prompt.d.ts.map +0 -1
- package/dist/types/src/testing/exa-search-1748337321991.d.ts +0 -38
- package/dist/types/src/testing/exa-search-1748337321991.d.ts.map +0 -1
- package/dist/types/src/testing/exa-search-1748337331526.d.ts +0 -37
- package/dist/types/src/testing/exa-search-1748337331526.d.ts.map +0 -1
- package/dist/types/src/testing/exa-search-1748337344119.d.ts +0 -58
- package/dist/types/src/testing/exa-search-1748337344119.d.ts.map +0 -1
- package/dist/types/src/testing/index.d.ts +0 -3
- package/dist/types/src/testing/index.d.ts.map +0 -1
- package/dist/types/src/types.d.ts +0 -13
- package/dist/types/src/types.d.ts.map +0 -1
- package/src/context/binder.ts +0 -103
- package/src/context/binding.ts +0 -32
- package/src/context/index.ts +0 -6
- package/src/research/exa.ts +0 -97
- package/src/research/graph.test.ts +0 -64
- package/src/research/graph.ts +0 -369
- package/src/research/index.ts +0 -7
- package/src/research/instructions-research.tpl +0 -98
- package/src/research/research.test.ts +0 -190
- package/src/research/research.ts +0 -87
- package/src/session/__snapshots__/session.test.ts.snap +0 -32
- package/src/session/version-pin.test.ts +0 -7
- package/src/summarization/summarization.test.ts +0 -199
- package/src/templates/assistant.tpl +0 -111
- package/src/templates/prompt.ts +0 -45
- package/src/testing/exa-search-1748337321991.ts +0 -131
- package/src/testing/exa-search-1748337331526.ts +0 -144
- package/src/testing/exa-search-1748337344119.ts +0 -133
- package/src/testing/index.ts +0 -11
- package/src/typedefs.d.ts +0 -8
- /package/dist/lib/browser/{named-entity-recognition-O46UTCLR.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
- /package/dist/lib/node-esm/{named-entity-recognition-W4VMRCH6.mjs.map → chunk-HSLMI22Q.mjs.map} +0 -0
- /package/src/extraction/extraction-llm-function/{instructions.tpl → transcription-instructions.tpl} +0 -0
package/src/research/research.ts
DELETED
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2025 DXOS.org
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
// TODO(burdon): Fix.
|
|
6
|
-
// @ts-nocheck
|
|
7
|
-
|
|
8
|
-
import { AiToolkit } from '@effect/ai';
|
|
9
|
-
import { Effect, Layer, Schema } from 'effect';
|
|
10
|
-
|
|
11
|
-
import { AiService, ConsolePrinter } from '@dxos/ai';
|
|
12
|
-
import { defineFunction, TracingService } from '@dxos/functions';
|
|
13
|
-
import { log } from '@dxos/log';
|
|
14
|
-
import { DataTypes } from '@dxos/schema';
|
|
15
|
-
|
|
16
|
-
import { ExaToolkit, LiveExaHandler, MockExaHandler } from './exa';
|
|
17
|
-
import { LocalSearchHandler, LocalSearchToolkit, makeGraphWriterHandler, makeGraphWriterToolkit } from './graph';
|
|
18
|
-
// TODO(dmaretskyi): Vite build bug with instruction files with the same filename getting mixed-up
|
|
19
|
-
import PROMPT from './instructions-research.tpl?raw';
|
|
20
|
-
import { AiSession } from '../session';
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Exec external service and return the results as a Subgraph.
|
|
24
|
-
*/
|
|
25
|
-
// TODO(burdon): Rename.
|
|
26
|
-
export const researchFn = defineFunction({
|
|
27
|
-
description: 'Research the web for information',
|
|
28
|
-
inputSchema: Schema.Struct({
|
|
29
|
-
query: Schema.String.annotations({
|
|
30
|
-
description: 'The query to search for.',
|
|
31
|
-
}),
|
|
32
|
-
|
|
33
|
-
// TOOD(burdon): Move to context.
|
|
34
|
-
mockSearch: Schema.optional(Schema.Boolean).annotations({
|
|
35
|
-
description: 'Whether to use the mock search tool.',
|
|
36
|
-
default: false,
|
|
37
|
-
}),
|
|
38
|
-
}),
|
|
39
|
-
outputSchema: Schema.Struct({
|
|
40
|
-
result: Schema.Unknown,
|
|
41
|
-
}),
|
|
42
|
-
handler: Effect.fnUntraced(
|
|
43
|
-
function* ({ data: { query, mockSearch } }) {
|
|
44
|
-
yield* TracingService.emitStatus({ message: 'Researching...' });
|
|
45
|
-
|
|
46
|
-
const graphWriteToolkit = makeGraphWriterToolkit({ schema: DataTypes });
|
|
47
|
-
const toolkit = yield* AiToolkit.merge(ExaToolkit, LocalSearchToolkit, graphWriteToolkit).pipe(
|
|
48
|
-
Effect.provide(
|
|
49
|
-
Layer.mergeAll(
|
|
50
|
-
mockSearch ? MockExaHandler : LiveExaHandler,
|
|
51
|
-
LocalSearchHandler,
|
|
52
|
-
makeGraphWriterHandler(graphWriteToolkit),
|
|
53
|
-
),
|
|
54
|
-
),
|
|
55
|
-
);
|
|
56
|
-
|
|
57
|
-
const printer = new ConsolePrinter();
|
|
58
|
-
const session = new AiSession();
|
|
59
|
-
session.message.on((message) => printer.printMessage(message));
|
|
60
|
-
session.userMessage.on((message) => printer.printMessage(message));
|
|
61
|
-
session.block.on((block) => printer.printContentBlock(block));
|
|
62
|
-
session.streamEvent.on((event) => log('stream', { event }));
|
|
63
|
-
|
|
64
|
-
// TODO(dmaretskyi): Consider adding this pattern as the "Graph" output mode for the session.
|
|
65
|
-
const result = yield* session.run({
|
|
66
|
-
prompt: query,
|
|
67
|
-
history: [],
|
|
68
|
-
systemPrompt: PROMPT,
|
|
69
|
-
toolkit,
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
return {
|
|
73
|
-
result,
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
// queues.contextQueue!.append(data);
|
|
77
|
-
|
|
78
|
-
// return {
|
|
79
|
-
// result: `
|
|
80
|
-
// The research results are placed in the following objects:
|
|
81
|
-
// ${data.map((object, id) => `[obj_${id}][dxn:echo:@:${object.id}]`).join('\n')}
|
|
82
|
-
// `,
|
|
83
|
-
// };
|
|
84
|
-
},
|
|
85
|
-
Effect.provide(AiService.model('@anthropic/claude-3-5-sonnet-20241022')),
|
|
86
|
-
),
|
|
87
|
-
});
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
|
2
|
-
|
|
3
|
-
exports[`AiSession > no tools 1`] = `
|
|
4
|
-
[
|
|
5
|
-
{
|
|
6
|
-
"blocks": ReactiveArray [
|
|
7
|
-
{
|
|
8
|
-
"_tag": "text",
|
|
9
|
-
"text": "Hello world!",
|
|
10
|
-
},
|
|
11
|
-
],
|
|
12
|
-
"created": "Sun, 20 Jul 2025 10:54:08 GMT",
|
|
13
|
-
"id": "01K0KQGFTFV3GBKGEWZW67K8HK",
|
|
14
|
-
"sender": {
|
|
15
|
-
"role": "user",
|
|
16
|
-
},
|
|
17
|
-
},
|
|
18
|
-
{
|
|
19
|
-
"blocks": ReactiveArray [
|
|
20
|
-
{
|
|
21
|
-
"_tag": "text",
|
|
22
|
-
"text": "Hi there! How can I help you today?",
|
|
23
|
-
},
|
|
24
|
-
],
|
|
25
|
-
"created": "2025-07-20T10:54:10.801Z",
|
|
26
|
-
"id": "01K0KQGHVHJ37D4YG45WG090WV",
|
|
27
|
-
"sender": {
|
|
28
|
-
"role": "assistant",
|
|
29
|
-
},
|
|
30
|
-
},
|
|
31
|
-
]
|
|
32
|
-
`;
|
|
@@ -1,199 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2025 DXOS.org
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
// TODO(burdon): Fix.
|
|
6
|
-
// @ts-nocheck
|
|
7
|
-
|
|
8
|
-
import { pipe, Schema } from 'effect';
|
|
9
|
-
import { beforeAll, describe, test } from 'vitest';
|
|
10
|
-
|
|
11
|
-
import { AiService, MixedStreamParser } from '@dxos/ai';
|
|
12
|
-
import { Obj } from '@dxos/echo';
|
|
13
|
-
import { type EchoDatabase } from '@dxos/echo-db';
|
|
14
|
-
import { EchoTestBuilder } from '@dxos/echo-db/testing';
|
|
15
|
-
import { defineFunction, FunctionExecutor, ServiceContainer } from '@dxos/functions';
|
|
16
|
-
import { type ContentBlock, DataType } from '@dxos/schema';
|
|
17
|
-
import { createTestData } from '@dxos/schema/testing';
|
|
18
|
-
import { trim } from '@dxos/util';
|
|
19
|
-
|
|
20
|
-
const REMOTE_AI = true;
|
|
21
|
-
|
|
22
|
-
const summarizationFn = defineFunction({
|
|
23
|
-
description: 'Summarize a document',
|
|
24
|
-
inputSchema: Schema.Struct({
|
|
25
|
-
document: Schema.optional(DataType.Text),
|
|
26
|
-
transcript: Schema.Array(DataType.Message),
|
|
27
|
-
}),
|
|
28
|
-
outputSchema: DataType.Text,
|
|
29
|
-
handler: async ({ data: { document, transcript }, context }) => {
|
|
30
|
-
const ai = context.getService(AiService);
|
|
31
|
-
const result = await new MixedStreamParser().parse(
|
|
32
|
-
await ai.client.execStream({
|
|
33
|
-
model: '@anthropic/claude-3-5-haiku-20241022',
|
|
34
|
-
// TODO(burdon): Factor out and test prompts.
|
|
35
|
-
systemPrompt: trim`
|
|
36
|
-
Your job is to summarize a meeting transcript.
|
|
37
|
-
Transcript Summarizer updates an existing summary within <summary> tags with a new transcript that is placed in <transcript> tags.
|
|
38
|
-
Transcript Summarizer updates only the relevant parts of the summary.
|
|
39
|
-
If there's no summary, create a new one.
|
|
40
|
-
Transcript Summarizer outputs only the summary texts and nothing else.
|
|
41
|
-
Transcript Summarizer keeps the original summary structure.
|
|
42
|
-
Transcript Summarizer keeps the unrelated parts of the summary untouched.
|
|
43
|
-
The Transcript Summarizer errs on the side of being too verbose.
|
|
44
|
-
The Transcript Summarizer outputs the entire update summary.
|
|
45
|
-
The summary is formatted as hierarchical markdown bullet points with no headings.
|
|
46
|
-
The hierarchical structure is deeply nested.
|
|
47
|
-
The Transcript Summarizer formats the bullets with "-" symbol as prefix and two spaces indentation.
|
|
48
|
-
The Transcript Summarizer knows that the content of transcript will be updated solely by its output.
|
|
49
|
-
The Transcript Summarizer outputs only the summary text.
|
|
50
|
-
`,
|
|
51
|
-
history: [
|
|
52
|
-
Obj.make(DataType.Message, {
|
|
53
|
-
created: new Date().toISOString(),
|
|
54
|
-
sender: { role: 'user' },
|
|
55
|
-
blocks: [
|
|
56
|
-
{
|
|
57
|
-
_tag: 'text',
|
|
58
|
-
text: trim`
|
|
59
|
-
<transcript>
|
|
60
|
-
${JSON.stringify(transcript, null, 2)}
|
|
61
|
-
</transcript>
|
|
62
|
-
`,
|
|
63
|
-
},
|
|
64
|
-
...(document != null && document.content.length > 0
|
|
65
|
-
? [
|
|
66
|
-
{
|
|
67
|
-
_tag: 'text',
|
|
68
|
-
text: trim`
|
|
69
|
-
<summary>
|
|
70
|
-
${document.content}
|
|
71
|
-
</summary>
|
|
72
|
-
`,
|
|
73
|
-
} satisfies ContentBlock.Text,
|
|
74
|
-
]
|
|
75
|
-
: []),
|
|
76
|
-
],
|
|
77
|
-
}),
|
|
78
|
-
],
|
|
79
|
-
}),
|
|
80
|
-
);
|
|
81
|
-
|
|
82
|
-
return DataType.makeText(pipe(result[0]?.blocks[0], (c) => (c?._tag === 'text' ? c.text : '')));
|
|
83
|
-
},
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
const refinementFn = defineFunction({
|
|
87
|
-
description: 'Refine a summary',
|
|
88
|
-
inputSchema: Schema.Struct({
|
|
89
|
-
summaries: Schema.Array(DataType.Text),
|
|
90
|
-
}),
|
|
91
|
-
outputSchema: Schema.Struct({
|
|
92
|
-
summary: DataType.Text,
|
|
93
|
-
}),
|
|
94
|
-
handler: async ({ data: { summaries }, context }) => {
|
|
95
|
-
const ai = context.getService(AiService);
|
|
96
|
-
const result = await new MixedStreamParser().parse(
|
|
97
|
-
await ai.client.execStream({
|
|
98
|
-
model: '@anthropic/claude-3-5-haiku-20241022',
|
|
99
|
-
// TODO(burdon): Factor out and test prompts.
|
|
100
|
-
systemPrompt: trim`
|
|
101
|
-
You are a Transcript Summary Refiner.
|
|
102
|
-
Transcript Summary Refiner works on a history of evolving summaries that were generated based on the transcript.
|
|
103
|
-
The summaries are presented starting from the oldest to the newest.
|
|
104
|
-
Each iteration of the summary contains a new part of the transcript.
|
|
105
|
-
The Transcript Summary Refiner refines the summary based on the history of summaries.
|
|
106
|
-
The Transcript Summary Refiner identifies any potential data lost between the iterations and adds its back to the output.
|
|
107
|
-
The Transcript Summary Refiner updates the summary to be more structured.
|
|
108
|
-
The Transcript Summary Refiner errs on the side of being too verbose.
|
|
109
|
-
The Transcript Summary Refiner errs on keeping the original summary structure.
|
|
110
|
-
The Transcript Summary Refiner outputs the entire update summary.
|
|
111
|
-
The Transcript Summary is formatted as hierarchical markdown bullet points with no headings.
|
|
112
|
-
The hierarchical structure is deeply nested.
|
|
113
|
-
The Transcript Summary Refiner formats the bullets with "-" symbol as prefix and two spaces indentation.
|
|
114
|
-
The Transcript Summary Refiner knows that the content of transcript will be updated solely by its output.
|
|
115
|
-
The Transcript Summary Refiner outputs only the summary text.
|
|
116
|
-
`,
|
|
117
|
-
history: [
|
|
118
|
-
Obj.make(DataType.Message, {
|
|
119
|
-
created: new Date().toISOString(),
|
|
120
|
-
sender: { role: 'user' },
|
|
121
|
-
blocks: summaries.map(
|
|
122
|
-
(summary) =>
|
|
123
|
-
({
|
|
124
|
-
_tag: 'text',
|
|
125
|
-
text: trim`
|
|
126
|
-
<summary>
|
|
127
|
-
${summary.content}
|
|
128
|
-
</summary>
|
|
129
|
-
`,
|
|
130
|
-
}) satisfies ContentBlock.Text,
|
|
131
|
-
),
|
|
132
|
-
}),
|
|
133
|
-
],
|
|
134
|
-
}),
|
|
135
|
-
);
|
|
136
|
-
return {
|
|
137
|
-
summary: DataType.makeText(pipe(result[0]?.blocks[0], (c) => (c?._tag === 'text' ? c.text : ''))),
|
|
138
|
-
};
|
|
139
|
-
},
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
describe.skip('Summarization', () => {
|
|
143
|
-
let builder: EchoTestBuilder;
|
|
144
|
-
let db: EchoDatabase;
|
|
145
|
-
let executor: FunctionExecutor;
|
|
146
|
-
|
|
147
|
-
// TODO(burdon): Rewrite test.
|
|
148
|
-
beforeAll(async () => {
|
|
149
|
-
// TODO(dmaretskyi): Helper to scaffold this from a config.
|
|
150
|
-
builder = await new EchoTestBuilder().open();
|
|
151
|
-
const { db: db1 } = await builder.createDatabase({ indexing: { vector: true } });
|
|
152
|
-
db = db1;
|
|
153
|
-
executor = new FunctionExecutor(
|
|
154
|
-
new ServiceContainer().setServices({
|
|
155
|
-
ai: todo(),
|
|
156
|
-
database: {
|
|
157
|
-
db,
|
|
158
|
-
},
|
|
159
|
-
}),
|
|
160
|
-
);
|
|
161
|
-
});
|
|
162
|
-
|
|
163
|
-
test('keeps transcript outline', { timeout: 1000_000 }, async () => {
|
|
164
|
-
const { transcriptMessages } = createTestData();
|
|
165
|
-
|
|
166
|
-
const summary = DataType.makeText();
|
|
167
|
-
|
|
168
|
-
const summaries = [];
|
|
169
|
-
|
|
170
|
-
for (let i = 0; i < transcriptMessages.length; i++) {
|
|
171
|
-
const blocks = transcriptMessages.slice(Math.max(0, i - 2), i + 1);
|
|
172
|
-
const result = await executor.invoke(summarizationFn, {
|
|
173
|
-
document: summary,
|
|
174
|
-
transcript: blocks,
|
|
175
|
-
});
|
|
176
|
-
summary.content = result.content;
|
|
177
|
-
summaries.push(DataType.makeText(result.content));
|
|
178
|
-
|
|
179
|
-
console.log(blocks.at(-1));
|
|
180
|
-
console.log();
|
|
181
|
-
console.log(summary.content);
|
|
182
|
-
console.log();
|
|
183
|
-
|
|
184
|
-
if (i % 3 === 0 && i > 0) {
|
|
185
|
-
const history: any = summaries.slice(-5);
|
|
186
|
-
const result = await executor.invoke(refinementFn, {
|
|
187
|
-
summaries: history,
|
|
188
|
-
});
|
|
189
|
-
summary.content = result.summary.content;
|
|
190
|
-
summaries.push(DataType.makeText(result.summary.content));
|
|
191
|
-
|
|
192
|
-
console.log('REFINED');
|
|
193
|
-
console.log();
|
|
194
|
-
console.log(summary.content);
|
|
195
|
-
console.log();
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
});
|
|
199
|
-
});
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
{{! System Prompt }}
|
|
2
|
-
|
|
3
|
-
You are a friendly, advanced AI assistant capable of creating and managing artifacts from available data and tools.
|
|
4
|
-
Your task is to process user commands and questions and decide how best to respond.
|
|
5
|
-
In some cases, you will need to create or reference data objects called artifacts.
|
|
6
|
-
|
|
7
|
-
Follow these guidelines carefully:
|
|
8
|
-
|
|
9
|
-
{{section}}. Decision-making:
|
|
10
|
-
|
|
11
|
-
{{#if cot}}
|
|
12
|
-
Before responding, explain your reasoning and include your detailed chain-of-thought in a <cot> tag.
|
|
13
|
-
{{/if}}
|
|
14
|
-
|
|
15
|
-
Include the following steps:
|
|
16
|
-
|
|
17
|
-
- Analyze the structure and type of the content in the user's message.
|
|
18
|
-
- Can you complete the task using the available artifact definitions?
|
|
19
|
-
- If you can't complete the task using the available artifact definitions, query the list of available artifact definitions using the appropriate tool.
|
|
20
|
-
- Identify which artifact definitions are relevant to the user's request.
|
|
21
|
-
- Evaluate the potential benefits of creating an artifact vs. normal processing for each identified element.
|
|
22
|
-
- Make a final decision on whether to create an artifact and explain your reasoning.
|
|
23
|
-
- Are the required artifact definitions already available?
|
|
24
|
-
- If not, select which artifact definition(s) will be the most relevant and require them using the require_artifact_definitions tool.
|
|
25
|
-
- The require'd artifact tools will be available for use after require.
|
|
26
|
-
- If creating an artifact, outline how you will structure it within the response.
|
|
27
|
-
- Decide if the artifact needs to be shown to the user.
|
|
28
|
-
- Call the show tool to show the artifact to the user.
|
|
29
|
-
- If you ask the user a multiple choice question, then present each of the possible answers as concise text inside <option> tags inside a well formed <select> tag.
|
|
30
|
-
- If you have suggestions for follow-up actions then present each action as text within a <suggest> tag.
|
|
31
|
-
- Your reasoning must include: whether to use artifacts or not, to create one or query, whether to show the artifact to the user, and how to structure the response.
|
|
32
|
-
|
|
33
|
-
If the user asks for a list of tools, then just emit a single self-closing <tool-list/> tag instead of listing the tools.The tag will be replaced with the list of tools when the response is rendered.
|
|
34
|
-
Do not list the tools or artifacts in your response, only emit the tag.
|
|
35
|
-
Do not mention the tag anywhere else in your response unless you are rendering a tool list.
|
|
36
|
-
|
|
37
|
-
{{section}}. Artifacts:
|
|
38
|
-
|
|
39
|
-
- Determine if the interaction involves an artifact. Prefer artifacts for tables, lists, spreadsheets, kanbans, games, images, and other structured data.
|
|
40
|
-
- Determine if the user is explicitly talking about creating a new artifact, or wants to use an existing artifact.
|
|
41
|
-
- If it is ambiguous, query for existing artifacts first and then decide.
|
|
42
|
-
- If you decide to create an artifact, call the associated tool to create the artifact.
|
|
43
|
-
- Artifacts are stored in the database. Tools are used to create and query artifacts.
|
|
44
|
-
- If you are unsure about creating an artifact ask the user for clarification.
|
|
45
|
-
|
|
46
|
-
{{#if artifacts}}
|
|
47
|
-
{{section}}. Artifact Rules:
|
|
48
|
-
|
|
49
|
-
- Artifacts are mutable objects that can change over the course of the conversation.
|
|
50
|
-
- Always re-query the artifact using the tool (like query or inspect) to get the latest state of the artifact before answering the user.
|
|
51
|
-
- You must never generate the id of the artifact; only recall the ids that are already in the history.
|
|
52
|
-
- Artifacts are created by requiring the specific artifact using the require_artifact tool and creating it by calling the associated tool.
|
|
53
|
-
|
|
54
|
-
{{section}}. Artifact Providers:
|
|
55
|
-
|
|
56
|
-
{{#each artifacts}}
|
|
57
|
-
- {{this}}
|
|
58
|
-
{{/each}}
|
|
59
|
-
{{/if}}
|
|
60
|
-
|
|
61
|
-
{{#if associatedArtifact}}
|
|
62
|
-
{{section}}. Associated artifact:
|
|
63
|
-
|
|
64
|
-
The following ID and typename identify the artifact associated with this conversation.
|
|
65
|
-
This conversation appears alongside the associated artifact as a peer, and the user is likely to make reference to and requests about it.
|
|
66
|
-
You can interact with this artifact using tools.
|
|
67
|
-
|
|
68
|
-
ID: {{associatedArtifact.id}}
|
|
69
|
-
Typename: {{associatedArtifact.typename}}
|
|
70
|
-
{{/if}}
|
|
71
|
-
|
|
72
|
-
{{#if suggestions}}
|
|
73
|
-
{{section}}. Suggested actions:
|
|
74
|
-
|
|
75
|
-
- You can add suggested actions at the end of your response.
|
|
76
|
-
- Suggested actions should be very concise and start with a verb and be phrased as a command to an agent -- not a question to the user.
|
|
77
|
-
- Suggested actions must be in the form of a user instruction that you can follow.
|
|
78
|
-
- Suggested actions could include actions that create artifacts.
|
|
79
|
-
- Suggested actions must be enclosed in a <suggest> tag and on a separate line.
|
|
80
|
-
Examples:
|
|
81
|
-
<suggest>Show the data on a map.</suggest>
|
|
82
|
-
<suggest>Create a kanban from the table.</suggest>
|
|
83
|
-
|
|
84
|
-
- If you have asked a multiple choice question, then present each of the possible answers as concise text inside <option> tags inside a well formed <select> tag.
|
|
85
|
-
Example:
|
|
86
|
-
<select><option>Yes</option><option>No</option></select>
|
|
87
|
-
{{/if}}
|
|
88
|
-
|
|
89
|
-
{{section}}. Content proposals:
|
|
90
|
-
|
|
91
|
-
You can propose content to add to associated artifacts. Enclose the content you are proposing to add in a <proposal> tag on a separate line.
|
|
92
|
-
For example:
|
|
93
|
-
<proposal>Apples add a delightful crunch and natural sweetness to salads</proposal>
|
|
94
|
-
|
|
95
|
-
{{section}}. Output Formats:
|
|
96
|
-
|
|
97
|
-
It is very important to respond in the correct format.
|
|
98
|
-
|
|
99
|
-
{{#if cot}}
|
|
100
|
-
- Your detailed chain-of-thought must be in the form of a markdown list enclosed in <cot> tags.
|
|
101
|
-
- The <cot> tag should be the first thing in your response.
|
|
102
|
-
{{/if}}
|
|
103
|
-
- Suggested actions must be enclosed in a <suggest> tag and on a separate line.
|
|
104
|
-
- Content proposals must be enclosed in a <proposal> tag and on a separate line.
|
|
105
|
-
|
|
106
|
-
References:
|
|
107
|
-
|
|
108
|
-
- Both user and you can reference external data in the markdown format: [label][URI].
|
|
109
|
-
- If you get references back from a tool call, you can render them as is by preserving the ID literally.
|
|
110
|
-
|
|
111
|
-
{{instructions}}
|
package/src/templates/prompt.ts
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2025 DXOS.org
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
import { type AssociatedArtifact, Template } from '@dxos/blueprints';
|
|
6
|
-
|
|
7
|
-
import ASSISTANT from './assistant.tpl?raw';
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Type for assistant prompt variables.
|
|
11
|
-
*/
|
|
12
|
-
// TODO(burdon): Replace with builder?
|
|
13
|
-
export type AssistantPromptOptions = {
|
|
14
|
-
/**
|
|
15
|
-
* Instructions for each artifact.
|
|
16
|
-
*/
|
|
17
|
-
// TODO(burdon): Change to blueprint.
|
|
18
|
-
artifacts?: string[];
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Associated artifact to include in the prompt.
|
|
22
|
-
* @deprecated
|
|
23
|
-
*/
|
|
24
|
-
artifact?: AssociatedArtifact;
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Whether to include suggestions in the prompt.
|
|
28
|
-
*/
|
|
29
|
-
suggestions?: boolean;
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Additional instructions to include in the prompt.
|
|
33
|
-
*/
|
|
34
|
-
instructions?: string;
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Emit chain-of-thought inside <cot> tag.
|
|
38
|
-
* Should be `false` for models with built-in reasoning: Claude, deepseek, o1.
|
|
39
|
-
*/
|
|
40
|
-
cot?: boolean;
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
export const createSystemPrompt = (options: AssistantPromptOptions) => {
|
|
44
|
-
return Template.createPrompt(ASSISTANT, options);
|
|
45
|
-
};
|
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2025 DXOS.org
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
export default {
|
|
6
|
-
requestId: '324936368a74f4db978982172bc18a6c',
|
|
7
|
-
autopromptString: 'AI personal knowledge management tools projects 2024',
|
|
8
|
-
autoDate: '2024-01-01T00:00:00.000Z',
|
|
9
|
-
resolvedSearchType: 'neural',
|
|
10
|
-
results: [
|
|
11
|
-
{
|
|
12
|
-
id: 'https://www.open-notebook.ai/',
|
|
13
|
-
title: 'What is Open Notebook? | Open Notebook',
|
|
14
|
-
url: 'https://www.open-notebook.ai/',
|
|
15
|
-
publishedDate: '2024-01-01T00:00:00.000Z',
|
|
16
|
-
author: '',
|
|
17
|
-
score: 0.3995794951915741,
|
|
18
|
-
text: "Take Control of Your Learning. Privately. A powerful open-source, AI-powered note-taking/research platform that respects your privacy 🎙️ Podcast Generator Transform your notes into engaging podcasts with customizable voices, speakers, and episodes 🤖 AI-Powered Notes Leverage AI to summarize, generate insights, and manage your notes 🔒 Privacy Control Full control over what information AI can access 🔄 Content Integration Support for links, PDFs, TXT, PPT, YouTube, and more What is Open Notebook? Open Notebook is the cognitive partner you always wanted and could never explain why. It combines the power of AI with unwavering privacy controls. It's designed for researchers, students, and professionals who want to enhance their learning and abilities while maintaining complete control over workflows, models, and how their data gets used and exposed. Is this right for me? 📚 Learning Enthusiast You're constantly seeking knowledge and want to go beyond surface-level understanding. Learning for you is about building deep, lasting comprehension. 🤝 You want a learning partner You believe your learning process can improve by partnering with a tailor made AI. You want to be provoked to think more clearly. 🤯 Your learning backlog is way too big You have hundreds of links you would love to read, but there is no time for it all. You want to make sure those are catalogued for when you need them. ✍️ Independent Thinker You value both taking notes and forming your own ideas. You understand different viewpoints but believe in developing your own perspective. 🔒 You are privacy aware You don't want all your context, thoughts and plans to be all over Big Tech, if not necessary. 💁 You like things your way You want to decide how your content is handled, which AI models you want to interact with and help specifically it should help/challenge you. What is the plan for the future? There is much more that can be done to augment human knowledge. Open Notebook's first release is just a first step in that direction. The end goal is to build a Cognitive Partner for every person. A customized assistant that can help you develop your skills, knowledge, and opinions in a way that makes sense to you. Learn more about our long-term vision and roadmap in our Vision page.",
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
id: 'https://www.reorproject.org/',
|
|
22
|
-
title: 'Reor',
|
|
23
|
-
url: 'https://www.reorproject.org/',
|
|
24
|
-
publishedDate: '2024-01-01T00:00:00.000Z',
|
|
25
|
-
author: 'Reor',
|
|
26
|
-
score: 0.39665618538856506,
|
|
27
|
-
text: "Private & local AI personal knowledge management app for high entropy thinkers. Q&A Chat with an LLM that has full context of your notes. Automatically connected ideas Never manually link your notes again. Semantic Search Search without having to remember exact phrasing. WYSIWYG Markdown Markdown is the language of thought. Local First LLMs, Embedding Models, Vector database. Everything runs and stores locally. Writing Assistant Write with the world's first local writing assistant. Trusted by individuals who may have heard of these companies",
|
|
28
|
-
image: 'https://reorhomepage-2-cwy0zagzg-reor-team.vercel.app/opengraph-image.jpg?a25ca70e900445ed',
|
|
29
|
-
favicon: 'https://www.reorproject.org/favicon-16x16.png',
|
|
30
|
-
},
|
|
31
|
-
{
|
|
32
|
-
id: 'https://mymemo.ai/blog/best-ai-personal-knowledge-management-tools-in-2024/detail',
|
|
33
|
-
title: 'Best AI Personal Knowledge Management (PKM) tools in 2024 - My Framer Site',
|
|
34
|
-
url: 'https://mymemo.ai/blog/best-ai-personal-knowledge-management-tools-in-2024/detail',
|
|
35
|
-
publishedDate: '2025-05-21T17:17:02.000Z',
|
|
36
|
-
author: '',
|
|
37
|
-
score: 0.3811739385128021,
|
|
38
|
-
text: "In today's fast-paced world, managing and organizing knowledge has become increasingly challenging. With the rise of digital information and the need for efficient knowledge sharing, traditional methods of knowledge management are no longer sufficient. AI-powered tools have emerged as a game-changer in this domain, offering a more efficient and effective way to manage and organize knowledge. Efficiency Amplified: AI streamlines the organization and analysis of vast data sets, saving time and reducing manual effort. Insights Unearthed: Uncover hidden patterns, trends, and valuable insights within your data, providing a deeper understanding of your information. Personalized Experience: Tailor your knowledge management approach with AI, creating a personalized digital assistant that adapts to your unique needs. Stay Ahead in the Digital Era: Embrace the transformative power of AI to navigate the information overload and stay ahead in our rapidly evolving digital landscape. Here are 10 AI-powered tools for personal knowledge management with their product links: 1. MyMemo AI: - Introduction: MyMemo transforms personal data into wisdom using AI, offering features like targeted search, smart advice, and creative writing prompts. - Product Link: [MyMemo Website](https://www.mymemo.ai) - Features: - Collects digital knowledge from various sources into a single platform. - Processes collected information with AI to extract key insights. - Allows users to query MyMemoAI for specific info or insights from their knowledge base. - Offers targeted search, smart advice, and creative writing prompts for enhanced knowledge management. 2. Notion AI: - Introduction: Notion AI offers a customizable workspace for efficient knowledge sharing and management. - Product Link: [Notion AI Website](https://www.notion.so) - Features: - Customizable workspace for knowledge sharing. - Integration with various tools like Slack, Google Drive, and Microsoft Teams. - Robust search capabilities powered by AI and AI-based analytics. 3. ClickUp: - Introduction: ClickUp provides dedicated spaces for knowledge base organization and seamless integration with various tools. - Product Link: [ClickUp Website](https://clickup.com) - Features: - Dedicated spaces for Knowledge Base organization. - Integration with third-party software like Microsoft Teams, Jira, Slack, Zoho, and more. - AI-based analytics to track productivity and identify patterns. 4. MyMind: - Introduction: MyMind offers a private space to save notes, images, quotes, and highlights enhanced by AI to aid in memory recall without the need for manual categorization. - Product Link: [MyMind Website](https://www.mymind.com) - Features: - Private space for saving notes, images, quotes, and highlights. - Enhanced by AI for efficient memory recall without manual organization. - Tailored for designers, writers, researchers, developers, and visual minds of all kinds. Adding Mem.ai to the top 10 list of AI-powered tools for personal kn",
|
|
39
|
-
image: 'https://framerusercontent.com/images/xtRTZ9zRVH3uL1fvH2vqA6G60W8.png',
|
|
40
|
-
favicon: 'https://framerusercontent.com/images/XEQTxAwueP1wc7BpbB1zrouiuoA.png',
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
id: 'https://mymemo.ai/',
|
|
44
|
-
title: 'MyMemo-Empower Your Mind with AI',
|
|
45
|
-
url: 'https://mymemo.ai/',
|
|
46
|
-
publishedDate: '2025-05-21T17:17:02.000Z',
|
|
47
|
-
author: '',
|
|
48
|
-
score: 0.3810442090034485,
|
|
49
|
-
text: 'End Digital Chaos with All In One Digital Space Effortlessly Access Information with AI Chat What have I uploaded about the marketing strategy? How to raise fund as a founder for startup? Write an article about the impact of AI in our society. Compliance with Global Standards MyMemo AI adheres to international data protection regulations, ensuring your data is handled with the utmost care. Secure Storage Your data is encrypted and stored on our high-security servers, ensuring that only you have access. We maintain strict privacy protocols, and even our team cannot view your information. Private Links for Your Memos MyMemo AI ensures that all links generated for your uploaded content are private and exclusively visible to you. 100 AI chat per month 100 content uploads per month 5 memo collections Powered by GPT-4o mini Up to 5 Related Memo in AI chat Single PDF file size under 5MB 10 AI writing for notes in total AI chat unlimited 1000 content uploads per month 100 Memo Collections Supports multiple AI models Up to 5 Related Memo in AI chat Single PDF file size under 30MB 100 AI writing for notes per month Custom AI summary prompt(coming soon) AI chat unlimited Unlimited content uploads Unlimited memo collections Supports multiple AI models Up to 8 Related Memo in AI chat Single PDF file size under 50MB Unlimited AI writing for notes Custom AI summary prompt(coming soon) Free access to @GPT-4o in Chat We’re excited to partner with Inkwise to bring MyMemo users an exclusive deal! Inkwise.ai is an AI-powered platform that helps users craft professional documents by extracting and integrating key information from uploaded files. It offers industry-specific templates, intelligent content extraction, and a referencing system that ensures factual accuracy. Exclusive for MyMemo Users: Get 2 months of Inkwise Pro for free with the code INKWISE2025 at checkout! MyMemo © MyMemo 2025. All rights reserved',
|
|
50
|
-
image: 'https://framerusercontent.com/images/xtRTZ9zRVH3uL1fvH2vqA6G60W8.png',
|
|
51
|
-
favicon: 'https://framerusercontent.com/images/XEQTxAwueP1wc7BpbB1zrouiuoA.png',
|
|
52
|
-
},
|
|
53
|
-
{
|
|
54
|
-
id: 'https://www.personal.ai/memory',
|
|
55
|
-
title: 'Make Your Own AI with Your Unique Memory',
|
|
56
|
-
url: 'https://www.personal.ai/memory',
|
|
57
|
-
publishedDate: '2024-01-01T00:00:00.000Z',
|
|
58
|
-
author: '',
|
|
59
|
-
score: 0.3991696536540985,
|
|
60
|
-
text: "In Personal AI, version control for memory and model is managed through a systematic approach that allows users to track, manage, and revert changes made to the AI's memory and model. Memory Stack: When you store a memory in Personal AI, it goes into the memory stack for training the AI. Data Uploads: Users can add, edit, or reinforce memories by uploading authored data directly into their personal language model. The personal language model has unlimited memory and is not bound by token or context limitations. The AI's performance is as good as the memory provided to it. If it makes false statements, the memory needs to be fixed and reinforced for future learning. There will be mechanisms to download the memory and model in the future. The output of the personal AI model is entirely controlled by the user's input and training. Yes, you can automate conversations using stacked memories in your Personal AI. By leveraging the memory stacking feature, you can train your AI to recall and utilize specific information during interactions Practices for Automating Conversations: Memory Anchors: When stacking new memories, consider adding memory anchors to organize the information effectively. This practice helps structure and categorize the data within your Personal AI account. Variety of Sources: Utilize all available tools such as the chat box, document editor, file uploader, and URL uploader to stack data from various sources. This diverse input enables your AI to learn from a wide range of inputs for a more personalized experience. Application of Practices: To automate conversations effectively, ensure that you consistently add relevant information into your memory stack using different tools provided by Personal AI. By doing so, you enable your AI to access and utilize this knowledge when engaging in digital interactions on your behalf. Yes, you can absolutely use hashtags to label and recall specific memories later on with your Personal AI. When adding memories to your AI, it's beneficial to include detailed and descriptive information about the topic or subject, along with context such as people, location, and absolute time for the AI to reference. Using hashtags allows you to categorize and organize these memories effectively. By using proper placement of hashtags without spaces and maintaining uniform capitalization, you can enhance the selection of memories for generating answers. Additionally, when stacking content using the chat box or file/document uploader in Personal AI, you can utilize #hashtags for single words or :colons followed by keywords for multiple words or complete titles. This practice helps in refining the selection of memories for generating answers while ensuring effective organization and retrieval of data. Personal AI is built with a strong emphasis on data privacy and security. It operates under the principle that the data you provide is yours alone. Measures such as encryption, secure data storage, and the optio",
|
|
61
|
-
image: 'https://cdn.prod.website-files.com/5ff65c460ce39f5ec5681c6a/663d12aab1b425e1ad40d3a6_Memory-min.jpg',
|
|
62
|
-
favicon:
|
|
63
|
-
'https://cdn.prod.website-files.com/5ff65c460ce39f5ec5681c6a/5ffcbe4a31309a2dcf7d1f18_Human%20AI%20Icon%2032x32-bolder.png',
|
|
64
|
-
},
|
|
65
|
-
{
|
|
66
|
-
id: 'https://iki.ai/',
|
|
67
|
-
title: 'IKI AI – Intelligent Knowledge Interface',
|
|
68
|
-
url: 'https://iki.ai/',
|
|
69
|
-
publishedDate: '2025-04-10T16:28:59.000Z',
|
|
70
|
-
author: '',
|
|
71
|
-
score: 0.38676750659942627,
|
|
72
|
-
text: 'Think faster. Organize deeper. All in one place. An AI-native workspace for research, strategy, and creative work An AI-native workspace for research, strategy, and creative work Backed by 500 Global Backed by 500 Global Backed by 500 Global Capture anything. Build your thinking library. Capture anything. Build your thinking library. Capture anything. Build your thinking library. AI assistant Turn long reads into clear insights. IKI summarizes, highlights, and connects the dots. AI assistant Turn long reads into clear insights. IKI summarizes, highlights, and connects the dots. AI assistant Turn long reads into clear insights. IKI summarizes, highlights, and connects the dots. AI editor AI writing with real context. Grounded in your content, not the internet. AI editor AI writing with real context. Grounded in your content, not the internet. AI editor AI writing with real context. Grounded in your content, not the internet. Team spaces Your team’s shared brain. One space for knowledge, context, and decisions. Team spaces Your team’s shared brain. One space for knowledge, context, and decisions. Team spaces Your team’s shared brain. One space for knowledge, context, and decisions. Everything you need for smarter knowledge work AI Editor Ask IKI AI Heading 1 B U I Browser extension Download extension to save webpages in one click along with notes Author Spotify Design Youtube · 3 min read Designing Data Science Tools at Spotify: Part 2 AI Summury Methods based on the relational path have shown strong, interpretable, and transferable reasoning ability. However, paths are naturally limited in capturing local evidence in graphs...Methods based on the relational path have shown strong, interpretable LLMs powered by top-tier models you trust Multi-source insights with agent context AI Digest Everything you need for smarter knowledge work AI Editor Ask IKI AI Heading 1 B U I Browser extension Download extension to save webpages in one click along with notes Author Spotify Design Youtube · 3 min read Designing Data Science Tools at Spotify: Part 2 AI Summury Methods based on the relational path have shown strong, interpretable, and transferable reasoning ability. However, paths are naturally limited in capturing local evidence in graphs...Methods based on the relational path have shown strong, interpretable LLMs powered by top-tier models you trust Multi-source insights with agent context AI Digest Everything you need for smarter knowledge work AI Editor Ask IKI AI Heading 1 B U I Browser extension Download extension to save webpages in one click along with notes Author Spotify Design Youtube · 3 min read Designing Data Science Tools at Spotify: Part 2 AI Summury Methods based on the relational path have shown strong, interpretable, and transferable reasoning ability. However, paths are naturally limited in capturing local evidence in graphs...Methods based on the relational path have shown strong, interpretable LLMs powered by',
|
|
73
|
-
image: 'https://framerusercontent.com/assets/cI6Uo7x4q0W3uxzOt2preXjv6aE.jpg',
|
|
74
|
-
favicon: 'https://framerusercontent.com/images/5NLFiJq5bLl5FXOTcVQX8vhkU.png',
|
|
75
|
-
},
|
|
76
|
-
{
|
|
77
|
-
id: 'https://supermemory.ai/',
|
|
78
|
-
title: 'supermemory™',
|
|
79
|
-
url: 'https://supermemory.ai/',
|
|
80
|
-
publishedDate: '2025-01-01T00:00:00.000Z',
|
|
81
|
-
author: '',
|
|
82
|
-
score: 0.393942266702652,
|
|
83
|
-
text: "The universal memory API for the AI era Stop building retrieval from scratch. Personalise LLMs for your users. Built for developers who ship. Start building DOCS Context is everything Without it, even the smartest AI is just an expensive chatbot $ init vector_database Way too expensive. Time to switch. Painfully slow. Let's try another. Won't scale. Back to square one. Maintenance nightmare. Need alternatives. $ choose embedding_model Which model fits your use case? Confusing performance tradeoffs Can't keep up with new releases $ handle format_parsing Markdown: Tables break everything HTML: Scripts and styles interfere PDF: Layout ruins extraction Word docs: Unpredictable formatting $ calculate scaling_costs Costs explode at production scale Performance degrades as data grows Engineering hours pile up fast $ setup connection_sync Sync failures between data sources API rate limits during large syncs Images: Need vision models now? Audio/Video: Transcription costs soar $ init multimodal_support Websites: JS & rate limits are messy PDFs: OCR fails, extraction inconsistent Authentication tokens expire constantly $ init vector_database Way too expensive. Time to switch. Painfully slow. Let's try another. Won't scale. Back to square one. Maintenance nightmare. Need alternatives. $ choose embedding_model Which model fits your use case? Confusing performance tradeoffs Can't keep up with new releases $ handle format_parsing Markdown: Tables break everything HTML: Scripts and styles interfere PDF: Layout ruins extraction Word docs: Unpredictable formatting $ calculate scaling_costs Costs explode at production scale Performance degrades as data grows Engineering hours pile up fast $ setup connection_sync Sync failures between data sources API rate limits during large syncs Images: Need vision models now? Audio/Video: Transcription costs soar $ init multimodal_support Websites: JS & rate limits are messy PDFs: OCR fails, extraction inconsistent Authentication tokens expire constantly FEATURES • FEATURES • FEATURES Unlock the Full Potential of Your Data const response = await fetch( 'https://api.supermemory.ai/v3/memories', {\n method: 'POST',\n headers: {\n 'Authorization': 'Bearer sm_ywdhjSbiDLkLIjjVotSegR_rsq3ZZKNRJmVr12p4ItTcf' \n },\n body: JSON.stringify({\n content: 'My name is Shreyans.',\n // or https://example.com \n // or https://example.com/page.pdf \n metadata: {\n user_id: '123' \n }\n }),\n})\n const data = await response.json() const response = await fetch( 'https://api.supermemory.ai/v3/memories', {\n method: 'GET',\n headers: {\n 'Authorization': 'Bearer sm_ywdhjSbiDLkLIjjVotSegR_rsq3ZZKNRJmVr12p4ItTcf',\n },\n body: JSON.stringify({\n q: \"What's my name?\" \n })\n})\n const data = await response.json() const response = await fetch( 'https://api.supermemory.ai/v3/connections/onedrive', {\n method: 'POST',\n headers: {\n 'Authorization': 'Bearer sm_ywdhjSbiDLkLIjjVotSegR_rsq3ZZKNRJmVr12p4ItTcf',\n }\n});\n const data = await response.json(); solution • sol",
|
|
84
|
-
image: 'https://cdn.prod.website-files.com/6826235ef861ed9464b064c8/6826251d65991babe21a9a9a_Frame%2031.png',
|
|
85
|
-
favicon: 'https://cdn.prod.website-files.com/6826235ef861ed9464b064c8/682639813def380d7694f590_favicon.png',
|
|
86
|
-
},
|
|
87
|
-
{
|
|
88
|
-
id: 'https://mykin.ai/',
|
|
89
|
-
title: 'Kin - Private, and Emotionally Intelligent, Personal AI',
|
|
90
|
-
url: 'https://mykin.ai/',
|
|
91
|
-
publishedDate: '2025-05-26T00:00:00.000Z',
|
|
92
|
-
author: '',
|
|
93
|
-
score: 0.38142070174217224,
|
|
94
|
-
text: "Clarity and confidence. Always on hand. Kin is a new kind of personal AI companion, more emotionally intelligent and private than ever. For whatever life throws at you. Available on iPhone and Android Anytime. Anywhere. Life at work is becoming increasingly challenging to navigate Think with Kin Personalized coaching can be inaccessible and expensive Talk with Kin How can Kin help? Inspiration “Whenever I need fresh ideas or just a soundboard, I know I can quickly turn to Kin.” Inspiration “Whenever I need fresh ideas or just a soundboard, I know I can quickly turn to Kin.” Planning “I use Kin to think things through, set goals, and organize my time.” Planning “I use Kin to think things through, set goals, and organize my time.” Learning “I can learn about almost any topic, with structured lessons created in seconds.” Learning “I can learn about almost any topic, with structured lessons created in seconds.” Support “Kin helps me with everything from small tasks to processing ideas and emotions.” Support “Kin helps me with everything from small tasks to processing ideas and emotions.” Guidance “I’m more aware of my strengths and I feel better prepared for tricky conversations.” Guidance “I’m more aware of my strengths and I feel better prepared for tricky conversations.” Kin remembers, so you don’t have to. The more you interact with Kin, the more Kin learns about you and your life. Because Kin understands both the big picture and its complexities, it can provide genuinely meaningful support in your day-to-day. Learn more Private & Secure Kin encrypts and stores your data securely on you device. No one else can see or access it. Powerful features. Scandinavian design. Smart journaling Share your thoughts and notes to reflect and build a better Kin. Coming soon Powered by open source models Coming soon Semantic and Episodic memory Coming soon Private, encrypted local-first storage Coming soon Intelligent reminders Stay on top of what matters with timely reminders. Coming soon Conversational voice chat Coming soon Third party integration Connect your Kin to the apps you love like Google calendar. Coming soon Proudly made in Copenhagen, Denmark Get started with simple tutorials and big ideas Frequently asked questions Product How does Kin's memory work? Kin’s memory pulls information from your messages into a database on your device so it can always reference it. Kin’s memory is automatic, so in practice, it works just by you talking with Kin. General More than anyone else. Every word you share and every reply is stored locally on your device - unless you change your settings to allow otherwise. You have full control over deleting it at any time. General Do I need a subscription to use Kin? No - Kin is currently free and without message limits for our beta users. However, we’re expecting to transition to a subscription model once we hit full release - we’ll make sure to talk a lot about that before it happens, though. Product Can I use Kin on a d",
|
|
95
|
-
image: 'https://cdn.prod.website-files.com/67b8fb50931278cabb866969/67d2a6c56ee313becd0f482d_img-opengraph.jpg',
|
|
96
|
-
favicon: 'https://cdn.prod.website-files.com/67b8fb50931278cabb866969/67c0cfc2c45ca5db9ca5c9e4_favicon.png',
|
|
97
|
-
},
|
|
98
|
-
{
|
|
99
|
-
id: 'https://try.rememberizer.ai/blog/introducing-rememberizer-connect-knowledge-to-your-ai',
|
|
100
|
-
title: 'Introducing Rememberizer - Connect Knowledge To Your AI',
|
|
101
|
-
url: 'https://try.rememberizer.ai/blog/introducing-rememberizer-connect-knowledge-to-your-ai',
|
|
102
|
-
publishedDate: '2024-01-28T00:00:00.000Z',
|
|
103
|
-
author: '',
|
|
104
|
-
score: 0.38043755292892456,
|
|
105
|
-
text: "Introduction In the rapidly evolving world of artificial intelligence (AI), Rememberizer emerges as a revolutionary platform that profoundly changes how both developers and personal consumers interact with AI, especially Generative Pre-trained Transformers (GPT). This platform is not just another tool; it's a transformative solution, making AI interactions deeply personal, intuitive, and efficient. Let’s dive into how Rememberizer is redefining AI personalization and integration, offering unique experiences for a diverse range of users, free. Part 1: Rememberizer for Personal Consumers Why Rememberizer Matters for Personal Users Generative AI apps work better when they have access to background information. They need to know what you know. A great way to achieve that is to give them access to relevant content from the documents, data and discussions you create and use. This is what Rememberizer does. Rememberizer helps by seamlessly integrating personal data with AI applications. For OpenAI GPTs users, this means transforming your interactions with AI into something deeply personal and relevant. By indexing your data just once, Rememberizer avoids wasting time performing the same process over and over again. Empowering Personal AI Experiences Whether you’re engaging in creative projects, professional tasks, or simply exploring AI for personal curiosity, Rememberizer brings a unique value proposition. It transforms your data into a powerful AI collaborator, ensuring your interactions are tailored to your specific circumstances. Imagine an AI that feels intuitively designed for you, understanding your projects, circumstances and recent discussions. That’s the personalized AI experience Rememberizer delivers. Part 2: Rememberizer for Developers Revolutionizing AI Integration in App Development For developers, Rememberizer is a game-changer. It simplifies the integration of user data into AI applications, enhancing app functionality and user experience. Rememberizer connects directly to various data sources including Slack and Google Drive, embedding their contents semantic meaning into a vector database. This process not only elevates the AI capabilities of your app but also saves vast amounts GPU processing costs and engineering resources in backend development: it’s free! The Developer's Advantage with Rememberizer Streamlined Data Integration: Rememberizer takes care of the complex process of integrating data sources into a vector database, allowing developers to focus more on creative aspects of app development. Enhanced AI Capabilities: By leveraging Rememberizer, apps gain access to rich, personalized data, leading to more intuitive and context-aware AI interactions. Personalization and Continuous Adaptation: Apps powered by Rememberizer can offer unparalleled personalization, learning, and adapting based on the user's data, thereby improving over time. Part 3: Pricing and Accessibility for All Rememberizer is committed to democratizing ",
|
|
106
|
-
image:
|
|
107
|
-
'https://cdn.prod.website-files.com/656fc35f7b92e991c863ce0a/65b7523200497f3ac6391238_Rememberizer%20banner.png',
|
|
108
|
-
favicon: 'https://cdn.prod.website-files.com/656fc35f7b92e991c863cdc4/657acdfb9a0ba55d8f622765_Favicon.png',
|
|
109
|
-
},
|
|
110
|
-
{
|
|
111
|
-
id: 'https://twinmind.com/',
|
|
112
|
-
title: 'TwinMind',
|
|
113
|
-
url: 'https://twinmind.com/',
|
|
114
|
-
publishedDate: '2025-05-23T09:12:49.000Z',
|
|
115
|
-
author: '',
|
|
116
|
-
score: 0.38130462169647217,
|
|
117
|
-
text: '\n Never Forget Anything with Your Never Forget Anything with Your Never Forget Anything with Your Second Brain Memory Vault Life Copilot AI Notetaker Second Brain Second Brain Memory Vault Life Copilot AI Notetaker Second Brain Second Brain Memory Vault Life Copilot AI Notetaker Second Brain Get perfect notes, to-dos, and proactive answers during meetings, lectures, interviews, and conversations. Get perfect notes, to-dos, and proactive answers during meetings, lectures, interviews, and conversations. Watch Demo Watch Demo Watch Demo Featured in Featured in Trusted by users at Trusted by users at Capture any moment, even inside your pocket Capture any moment, even inside your pocket Transcribe everything. Forget nothing. Ask anything. Transcribe everything. Forget nothing. Ask anything. Transcribe everything. Forget nothing. Ask anything. Seamlessly switch from mobile to desktop Seamlessly switch from mobile to desktop With TwinMind for Chrome, transcribe video calls or chat with tabs, PDFs, Youtube videos, and automate your work. With the TwinMind Chrome sidebar, transcribe video calls or chat with websites, PDFs, Youtube videos, and all your memories. Works with all the products you love Works with all the products you love Ask anything with context from all your favorite websites and insert answers directly into them on Chrome. Ask anything with context from all your favorite websites and insert answers directly into them on Chrome. Transcribe video calls or capture context from all your favorite websites, and insert answers into them on Chrome browser. Get Proactive Answers Get Proactive Answers Get personalized suggestions, prepare for meetings or exams based on all your notes synced with your calendar. Get personalized suggestions, prepare for meetings or exams based on all your notes synced with your calendar. Unlock Perfect Memory Unlock Perfect Memory Your brain forgets 90% of memories in 7 days but TwinMind doesn’t. Ask TwinMind anything with Deep Memory Search. Your brain forgets 90% of memories in 7 days but TwinMind doesn’t. Ask TwinMind anything with Deep Memory Search. Summarize all my meetings Ask TwinMind Summarize all my meetings Ask TwinMind Summarize all my meetings Ask TwinMind Insert Insert Insert Automate Your Work Automate Your Work Generate follow-up emails, reports, assignments based on memories. Insert anywhere on your browser in one click. Generate follow-up emails, reports, assignments based on memories. Insert anywhere on your browser in one click. 100% privacy with offline mode 100% privacy with offline mode 100% privacy with offline mode Transcribes without recording TwinMind processes your audio on-the-fly in real-time and saves only the transcripts on-device, ensuring that your audio is never stored anywhere. Transcribes without recording TwinMind processes your audio on-the-fly in real-time and saves only the transcripts on-device, ensuring that your audio is never stored anywhere. Transcribes without recording ',
|
|
118
|
-
image: 'https://framerusercontent.com/assets/9u5tx2lerz0ndBVcB14sg4tNoKs.png',
|
|
119
|
-
favicon: 'https://framerusercontent.com/images/zDX0zsHZ6Z2PvwK2vmkOsISWBiY.svg',
|
|
120
|
-
},
|
|
121
|
-
],
|
|
122
|
-
costDollars: {
|
|
123
|
-
total: 0.015,
|
|
124
|
-
search: {
|
|
125
|
-
neural: 0.005,
|
|
126
|
-
},
|
|
127
|
-
contents: {
|
|
128
|
-
text: 0.01,
|
|
129
|
-
},
|
|
130
|
-
},
|
|
131
|
-
};
|