@dxos/assistant 0.8.4-main.3a94e84 → 0.8.4-main.3eb6e50203
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/neutral/chunk-J5LGTIGS.mjs +10 -0
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +7 -0
- package/dist/lib/neutral/chunk-QBD6NQJK.mjs +604 -0
- package/dist/lib/neutral/chunk-QBD6NQJK.mjs.map +7 -0
- package/dist/lib/neutral/extraction/index.mjs +225 -0
- package/dist/lib/neutral/extraction/index.mjs.map +7 -0
- package/dist/lib/neutral/index.mjs +931 -0
- package/dist/lib/neutral/index.mjs.map +7 -0
- package/dist/lib/neutral/meta.json +1 -0
- package/dist/lib/neutral/testing/index.mjs +38 -0
- package/dist/lib/neutral/testing/index.mjs.map +7 -0
- package/dist/types/src/conversation/context.d.ts +138 -0
- package/dist/types/src/conversation/context.d.ts.map +1 -0
- package/dist/types/src/conversation/context.test.d.ts +2 -0
- package/dist/types/src/conversation/context.test.d.ts.map +1 -0
- package/dist/types/src/conversation/conversation.d.ts +53 -25
- package/dist/types/src/conversation/conversation.d.ts.map +1 -1
- package/dist/types/src/conversation/conversation.test.d.ts +2 -0
- package/dist/types/src/conversation/conversation.test.d.ts.map +1 -0
- 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 +17 -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 +47 -18
- 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 +258 -213
- 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 +345 -270
- package/dist/types/src/extraction/extraction.d.ts.map +1 -1
- package/dist/types/src/extraction/quotes.d.ts +3 -3
- package/dist/types/src/extraction/quotes.d.ts.map +1 -1
- package/dist/types/src/functions/services.d.ts +17 -4
- package/dist/types/src/functions/services.d.ts.map +1 -1
- package/dist/types/src/functions.test.d.ts +2 -0
- package/dist/types/src/functions.test.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +3 -3
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/session/GenericToolkit.d.ts +107 -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 +5 -0
- package/dist/types/src/session/index.d.ts.map +1 -1
- package/dist/types/src/session/observer.d.ts +23 -0
- package/dist/types/src/session/observer.d.ts.map +1 -0
- package/dist/types/src/session/session.d.ts +38 -237
- package/dist/types/src/session/session.d.ts.map +1 -1
- package/dist/types/src/session/toolkit.d.ts +14 -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/testing/index.d.ts +1 -2
- package/dist/types/src/testing/index.d.ts.map +1 -1
- package/dist/types/src/testing/layer.d.ts +22 -0
- package/dist/types/src/testing/layer.d.ts.map +1 -0
- package/dist/types/src/types/artifact.d.ts +28 -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 +56 -35
- package/src/conversation/context.test.ts +46 -0
- package/src/conversation/context.ts +330 -0
- package/src/conversation/conversation.test.ts +65 -0
- package/src/conversation/conversation.ts +179 -65
- package/src/conversation/index.ts +1 -0
- package/src/diff.test.ts +74 -0
- package/src/diff.ts +93 -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 +23 -22
- 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 +10 -9
- package/src/extraction/quotes.test.ts +3 -3
- package/src/extraction/quotes.ts +6 -7
- package/src/functions/services.ts +147 -99
- package/src/functions.conversations.json +1 -0
- package/src/functions.test.ts +74 -0
- package/src/index.ts +3 -3
- package/src/session/GenericToolkit.ts +160 -0
- package/src/session/artifact-diff.ts +41 -0
- package/src/session/error-handling.ts +41 -0
- package/src/session/format.test.ts +124 -0
- package/src/session/format.ts +143 -0
- package/src/session/index.ts +6 -0
- package/src/session/observer.ts +61 -0
- package/src/session/session.conversations.json +1 -0
- package/src/session/session.test.ts +52 -199
- package/src/session/session.ts +165 -250
- package/src/session/toolkit.ts +39 -0
- package/src/session/version-pin.ts +8 -8
- package/src/templates/index.ts +1 -1
- package/src/templates/instructions/format.tpl +57 -0
- package/src/templates/instructions/system.tpl +48 -0
- package/src/templates/system.ts +41 -0
- package/src/testing/index.ts +2 -8
- package/src/testing/layer.ts +84 -0
- package/src/types/artifact.ts +89 -0
- package/src/types/index.ts +5 -0
- package/src/typings.d.ts +5 -0
- package/dist/lib/browser/index.mjs +0 -1831
- package/dist/lib/browser/index.mjs.map +0 -7
- package/dist/lib/browser/meta.json +0 -1
- package/dist/lib/node-esm/index.mjs +0 -1833
- package/dist/lib/node-esm/index.mjs.map +0 -7
- package/dist/lib/node-esm/meta.json +0 -1
- 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 +0 -56
- 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/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 -208
- 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/typedefs.d.ts +0 -8
- package/src/types.ts +0 -47
- /package/src/extraction/extraction-llm-function/{instructions.tpl → transcription-instructions.tpl} +0 -0
|
@@ -0,0 +1,604 @@
|
|
|
1
|
+
import {
|
|
2
|
+
__export
|
|
3
|
+
} from "./chunk-J5LGTIGS.mjs";
|
|
4
|
+
|
|
5
|
+
// src/session/artifact-diff.ts
|
|
6
|
+
import * as Context from "effect/Context";
|
|
7
|
+
var ArtifactDiffResolver = class extends Context.Tag("@dxos/assistant/ArtifactDiffResolver")() {
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
// src/session/observer.ts
|
|
11
|
+
import * as Effect from "effect/Effect";
|
|
12
|
+
import * as Function from "effect/Function";
|
|
13
|
+
var GenerationObserver = Object.freeze({
|
|
14
|
+
make: ({ onBegin = Function.constant(Effect.void), onPart = Function.constant(Effect.void), onBlock = Function.constant(Effect.void), onEnd = Function.constant(Effect.void), onMessage = Function.constant(Effect.void) } = {}) => ({
|
|
15
|
+
onBegin,
|
|
16
|
+
onPart,
|
|
17
|
+
onBlock,
|
|
18
|
+
onEnd,
|
|
19
|
+
onMessage
|
|
20
|
+
}),
|
|
21
|
+
noop: () => GenerationObserver.make(),
|
|
22
|
+
/**
|
|
23
|
+
* Debug printer to be used in unit-tests and browser devtools.
|
|
24
|
+
*/
|
|
25
|
+
fromPrinter: (printer) => GenerationObserver.make({
|
|
26
|
+
onBlock: (block) => Effect.sync(() => {
|
|
27
|
+
if (block.pending) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
printer.printContentBlock(block);
|
|
31
|
+
}),
|
|
32
|
+
onMessage: (message) => Effect.sync(() => {
|
|
33
|
+
if (message.sender.role === "assistant") {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
printer.printMessage(message);
|
|
37
|
+
})
|
|
38
|
+
})
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
// src/errors.ts
|
|
42
|
+
import { BaseError } from "@dxos/errors";
|
|
43
|
+
var AiModelError = class extends BaseError.extend("AiModelError", "AI model error") {
|
|
44
|
+
};
|
|
45
|
+
var AiAssistantError = class extends BaseError.extend("AiAssistantError", "AI assistant error") {
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
// src/session/format.ts
|
|
49
|
+
import * as Effect2 from "effect/Effect";
|
|
50
|
+
import * as Function2 from "effect/Function";
|
|
51
|
+
import * as Option from "effect/Option";
|
|
52
|
+
import { Template } from "@dxos/blueprints";
|
|
53
|
+
import { Obj } from "@dxos/echo";
|
|
54
|
+
import { ObjectVersion } from "@dxos/echo-db";
|
|
55
|
+
import { log } from "@dxos/log";
|
|
56
|
+
import { Message } from "@dxos/types";
|
|
57
|
+
import { trim } from "@dxos/util";
|
|
58
|
+
var __dxlog_file = "/__w/dxos/dxos/packages/core/assistant/src/session/format.ts";
|
|
59
|
+
var formatSystemPrompt = ({ system, blueprints = [], objects = [] }) => Effect2.gen(function* () {
|
|
60
|
+
const blueprintDefs = yield* Function2.pipe(blueprints, Effect2.forEach((blueprint) => Effect2.succeed(blueprint.instructions)), Effect2.flatMap(Effect2.forEach((template) => Effect2.gen(function* () {
|
|
61
|
+
return trim`
|
|
62
|
+
<blueprint>
|
|
63
|
+
${yield* Template.processTemplate(template)}
|
|
64
|
+
</blueprint>
|
|
65
|
+
`;
|
|
66
|
+
}))), Effect2.map((blueprints2) => blueprints2.length > 0 ? [
|
|
67
|
+
"## Blueprints Definitions",
|
|
68
|
+
...blueprints2
|
|
69
|
+
].join("\n\n") : void 0));
|
|
70
|
+
const objectDefs = yield* Function2.pipe(objects, Effect2.forEach((object) => Effect2.succeed(trim`
|
|
71
|
+
<object>
|
|
72
|
+
<dxn>${Obj.getDXN(object)}</dxn>
|
|
73
|
+
<typename>${Obj.getTypename(object)}</typename>
|
|
74
|
+
</object>
|
|
75
|
+
`)), Effect2.map((objects2) => objects2.length > 0 ? [
|
|
76
|
+
"## Context Objects",
|
|
77
|
+
...objects2
|
|
78
|
+
].join("\n\n") : void 0));
|
|
79
|
+
return yield* Function2.pipe(Effect2.succeed([
|
|
80
|
+
system,
|
|
81
|
+
blueprintDefs,
|
|
82
|
+
objectDefs
|
|
83
|
+
].filter((def) => def !== void 0)), Effect2.map((parts) => parts.join("\n\n")));
|
|
84
|
+
});
|
|
85
|
+
var formatUserPrompt = ({ prompt, history = [] }) => Effect2.gen(function* () {
|
|
86
|
+
const blocks = [];
|
|
87
|
+
const artifactDiffResolver = yield* Effect2.serviceOption(ArtifactDiffResolver);
|
|
88
|
+
if (Option.isSome(artifactDiffResolver)) {
|
|
89
|
+
const versions = gatherObjectVersions(history);
|
|
90
|
+
const artifactDiff = yield* Effect2.tryPromise({
|
|
91
|
+
try: () => artifactDiffResolver.value.resolve([
|
|
92
|
+
...versions.entries()
|
|
93
|
+
].map(([id, version]) => ({
|
|
94
|
+
id,
|
|
95
|
+
lastVersion: version
|
|
96
|
+
}))),
|
|
97
|
+
catch: AiAssistantError.wrap({
|
|
98
|
+
message: "Artifact diff resolution error"
|
|
99
|
+
})
|
|
100
|
+
});
|
|
101
|
+
log("version", {
|
|
102
|
+
artifactDiff,
|
|
103
|
+
versions
|
|
104
|
+
}, {
|
|
105
|
+
F: __dxlog_file,
|
|
106
|
+
L: 94,
|
|
107
|
+
S: this,
|
|
108
|
+
C: (f, a) => f(...a)
|
|
109
|
+
});
|
|
110
|
+
for (const [id, { version }] of [
|
|
111
|
+
...artifactDiff.entries()
|
|
112
|
+
]) {
|
|
113
|
+
if (ObjectVersion.equals(version, versions.get(id))) {
|
|
114
|
+
artifactDiff.delete(id);
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
blocks.push({
|
|
118
|
+
_tag: "anchor",
|
|
119
|
+
objectId: id,
|
|
120
|
+
version
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
if (artifactDiff.size > 0) {
|
|
124
|
+
blocks.push(createArtifactUpdateBlock(artifactDiff));
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return Obj.make(Message.Message, {
|
|
128
|
+
created: (/* @__PURE__ */ new Date()).toISOString(),
|
|
129
|
+
sender: {
|
|
130
|
+
role: "user"
|
|
131
|
+
},
|
|
132
|
+
blocks: [
|
|
133
|
+
...blocks,
|
|
134
|
+
{
|
|
135
|
+
_tag: "text",
|
|
136
|
+
text: prompt
|
|
137
|
+
}
|
|
138
|
+
]
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
var gatherObjectVersions = (messages) => {
|
|
142
|
+
const artifactIds = /* @__PURE__ */ new Map();
|
|
143
|
+
for (const message of messages) {
|
|
144
|
+
for (const block of message.blocks) {
|
|
145
|
+
if (block._tag === "anchor") {
|
|
146
|
+
artifactIds.set(block.objectId, block.version);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return artifactIds;
|
|
151
|
+
};
|
|
152
|
+
var createArtifactUpdateBlock = (artifactDiff) => {
|
|
153
|
+
return {
|
|
154
|
+
_tag: "text",
|
|
155
|
+
// TODO(dmaretskyi): Does this need to be a special content-block?
|
|
156
|
+
disposition: "artifact-update",
|
|
157
|
+
text: trim`
|
|
158
|
+
The following artifacts have been updated since the last message:
|
|
159
|
+
${[
|
|
160
|
+
...artifactDiff.entries()
|
|
161
|
+
].map(([id, { diff }]) => `<changed-artifact id="${id}">${diff ? `
|
|
162
|
+
${diff}` : ""}</changed-artifact>`).join("\n")}
|
|
163
|
+
`
|
|
164
|
+
};
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
// src/session/session.ts
|
|
168
|
+
import * as LanguageModel from "@effect/ai/LanguageModel";
|
|
169
|
+
import * as Chunk from "effect/Chunk";
|
|
170
|
+
import * as Effect3 from "effect/Effect";
|
|
171
|
+
import * as Stream from "effect/Stream";
|
|
172
|
+
import { AiParser, AiPreprocessor, callTool, withoutToolCallParising } from "@dxos/ai";
|
|
173
|
+
import { todo } from "@dxos/debug";
|
|
174
|
+
import { Obj as Obj2 } from "@dxos/echo";
|
|
175
|
+
import { TracingService } from "@dxos/functions";
|
|
176
|
+
import { log as log2 } from "@dxos/log";
|
|
177
|
+
import { Message as Message2 } from "@dxos/types";
|
|
178
|
+
var __dxlog_file2 = "/__w/dxos/dxos/packages/core/assistant/src/session/session.ts";
|
|
179
|
+
var AiSession = class {
|
|
180
|
+
_options;
|
|
181
|
+
/** Prevents concurrent execution of session. */
|
|
182
|
+
_semaphore = Effect3.runSync(Effect3.makeSemaphore(1));
|
|
183
|
+
/** Message history from queue. */
|
|
184
|
+
// TODO(burdon): Evolve into supporting a git-like graph of messages.
|
|
185
|
+
_history = [];
|
|
186
|
+
/** Pending messages for this session (incl. the current prompt). */
|
|
187
|
+
_pending = [];
|
|
188
|
+
_started = 0;
|
|
189
|
+
_ended = 0;
|
|
190
|
+
_toolCalls = 0;
|
|
191
|
+
constructor(_options = {}) {
|
|
192
|
+
this._options = _options;
|
|
193
|
+
}
|
|
194
|
+
get duration() {
|
|
195
|
+
return this._ended - this._started;
|
|
196
|
+
}
|
|
197
|
+
get toolCalls() {
|
|
198
|
+
return this._toolCalls;
|
|
199
|
+
}
|
|
200
|
+
run = ({ prompt, system: systemTemplate, history = [], objects = [], blueprints = [], toolkit, observer = GenerationObserver.noop(), onOutput = () => Effect3.void }) => Effect3.gen(this, function* () {
|
|
201
|
+
this._started = Date.now();
|
|
202
|
+
this._history = [
|
|
203
|
+
...history
|
|
204
|
+
];
|
|
205
|
+
this._pending = [];
|
|
206
|
+
const pending = this._pending;
|
|
207
|
+
const submitMessage = Effect3.fnUntraced(function* (message) {
|
|
208
|
+
pending.push(message);
|
|
209
|
+
yield* observer.onMessage(message);
|
|
210
|
+
yield* TracingService.emitConverationMessage(message);
|
|
211
|
+
yield* onOutput(message);
|
|
212
|
+
return message;
|
|
213
|
+
});
|
|
214
|
+
const promptMessage = yield* submitMessage(yield* formatUserPrompt({
|
|
215
|
+
prompt,
|
|
216
|
+
history
|
|
217
|
+
}));
|
|
218
|
+
const system = yield* formatSystemPrompt({
|
|
219
|
+
system: systemTemplate,
|
|
220
|
+
blueprints,
|
|
221
|
+
objects
|
|
222
|
+
}).pipe(Effect3.orDie);
|
|
223
|
+
do {
|
|
224
|
+
log2("request", {
|
|
225
|
+
prompt: promptMessage,
|
|
226
|
+
system: {
|
|
227
|
+
snippet: createSnippet(system),
|
|
228
|
+
length: system.length
|
|
229
|
+
},
|
|
230
|
+
pending: this._pending.length,
|
|
231
|
+
history: this._history.length,
|
|
232
|
+
objects: objects?.length ?? 0
|
|
233
|
+
}, {
|
|
234
|
+
F: __dxlog_file2,
|
|
235
|
+
L: 132,
|
|
236
|
+
S: this,
|
|
237
|
+
C: (f, a) => f(...a)
|
|
238
|
+
});
|
|
239
|
+
const prompt2 = yield* AiPreprocessor.preprocessPrompt([
|
|
240
|
+
...this._history,
|
|
241
|
+
...this._pending
|
|
242
|
+
], {
|
|
243
|
+
system,
|
|
244
|
+
cacheControl: "ephemeral"
|
|
245
|
+
});
|
|
246
|
+
const messages = yield* LanguageModel.streamText({
|
|
247
|
+
prompt: prompt2,
|
|
248
|
+
toolkit,
|
|
249
|
+
disableToolCallResolution: true
|
|
250
|
+
}).pipe(
|
|
251
|
+
// Disable tool call parsing so that we can handle parameter schema errors on a per-tool call basis.
|
|
252
|
+
withoutToolCallParising,
|
|
253
|
+
// TOOD(dmaretskyi): Error mapping.
|
|
254
|
+
AiParser.parseResponse({
|
|
255
|
+
onBegin: () => observer.onBegin(),
|
|
256
|
+
onBlock: (block) => observer.onBlock(block),
|
|
257
|
+
onPart: (part) => observer.onPart(part),
|
|
258
|
+
onEnd: (summary) => observer.onEnd(summary)
|
|
259
|
+
}),
|
|
260
|
+
Stream.mapEffect((block) => Effect3.gen(function* () {
|
|
261
|
+
return yield* submitMessage(Obj2.make(Message2.Message, {
|
|
262
|
+
created: (/* @__PURE__ */ new Date()).toISOString(),
|
|
263
|
+
sender: {
|
|
264
|
+
role: "assistant"
|
|
265
|
+
},
|
|
266
|
+
blocks: [
|
|
267
|
+
block
|
|
268
|
+
]
|
|
269
|
+
}));
|
|
270
|
+
})),
|
|
271
|
+
Stream.runCollect,
|
|
272
|
+
Effect3.map(Chunk.toArray)
|
|
273
|
+
);
|
|
274
|
+
const toolCalls = messages.flatMap((message) => message.blocks.filter((block) => block._tag === "toolCall" && block.providerExecuted === false).map((block) => ({
|
|
275
|
+
block,
|
|
276
|
+
message
|
|
277
|
+
})));
|
|
278
|
+
if (toolCalls.length === 0) {
|
|
279
|
+
break;
|
|
280
|
+
} else if (!toolkit) {
|
|
281
|
+
throw new Error("No toolkit provided");
|
|
282
|
+
}
|
|
283
|
+
const toolResults = yield* Effect3.forEach(toolCalls, ({ block, message }) => {
|
|
284
|
+
return callTool(toolkit, block).pipe(Effect3.provide(TracingService.layerSubframe((context) => ({
|
|
285
|
+
...context,
|
|
286
|
+
parentMessage: message.id,
|
|
287
|
+
toolCallId: block.toolCallId
|
|
288
|
+
}))));
|
|
289
|
+
});
|
|
290
|
+
yield* submitMessage(Obj2.make(Message2.Message, {
|
|
291
|
+
created: (/* @__PURE__ */ new Date()).toISOString(),
|
|
292
|
+
sender: {
|
|
293
|
+
role: "tool"
|
|
294
|
+
},
|
|
295
|
+
blocks: toolResults
|
|
296
|
+
}));
|
|
297
|
+
this._toolCalls++;
|
|
298
|
+
} while (true);
|
|
299
|
+
this._ended = Date.now();
|
|
300
|
+
log2("done", {
|
|
301
|
+
pending: this._pending.length,
|
|
302
|
+
duration: this.duration,
|
|
303
|
+
tools: this._toolCalls
|
|
304
|
+
}, {
|
|
305
|
+
F: __dxlog_file2,
|
|
306
|
+
L: 219,
|
|
307
|
+
S: this,
|
|
308
|
+
C: (f, a) => f(...a)
|
|
309
|
+
});
|
|
310
|
+
return this._pending;
|
|
311
|
+
}).pipe(this._semaphore.withPermits(1), Effect3.withSpan("AiSession.run"));
|
|
312
|
+
/**
|
|
313
|
+
* @deprecated
|
|
314
|
+
*/
|
|
315
|
+
// TODO(burdon): Implement or remove.
|
|
316
|
+
async runStructured(_schema, _options) {
|
|
317
|
+
return todo();
|
|
318
|
+
}
|
|
319
|
+
};
|
|
320
|
+
var createSnippet = (text, len = 32) => text.length <= len * 2 ? text : [
|
|
321
|
+
text.slice(0, len),
|
|
322
|
+
"...",
|
|
323
|
+
text.slice(-len)
|
|
324
|
+
].join("");
|
|
325
|
+
|
|
326
|
+
// src/session/toolkit.ts
|
|
327
|
+
import * as Toolkit from "@effect/ai/Toolkit";
|
|
328
|
+
import * as Effect4 from "effect/Effect";
|
|
329
|
+
import { ToolExecutionService, ToolResolverService } from "@dxos/ai";
|
|
330
|
+
import { isTruthy } from "@dxos/util";
|
|
331
|
+
var createToolkit = ({ toolkit: toolkitProp, blueprints = [] }) => Effect4.gen(function* () {
|
|
332
|
+
const blueprintToolkit = yield* ToolResolverService.resolveToolkit(blueprints.flatMap(({ tools }) => tools));
|
|
333
|
+
const blueprintToolHandler = yield* blueprintToolkit.toContext(ToolExecutionService.handlersFor(blueprintToolkit));
|
|
334
|
+
const toolkit = Toolkit.merge(...[
|
|
335
|
+
toolkitProp,
|
|
336
|
+
blueprintToolkit
|
|
337
|
+
].filter(isTruthy));
|
|
338
|
+
return yield* toolkit.pipe(Effect4.provide(blueprintToolHandler));
|
|
339
|
+
});
|
|
340
|
+
|
|
341
|
+
// src/session/version-pin.ts
|
|
342
|
+
import * as Schema from "effect/Schema";
|
|
343
|
+
import { getVersion } from "@dxos/echo-db";
|
|
344
|
+
import { ObjectId } from "@dxos/keys";
|
|
345
|
+
var ObjectVersionSchema = Schema.Unknown;
|
|
346
|
+
var VersionPinSchema = Schema.Struct({
|
|
347
|
+
// TODO(dmaretskyi): Use Ref when those support encoding.
|
|
348
|
+
objectId: ObjectId,
|
|
349
|
+
// TODO(dmaretskyi): Could be opaque.
|
|
350
|
+
version: ObjectVersionSchema
|
|
351
|
+
});
|
|
352
|
+
var VersionPin = class extends VersionPinSchema {
|
|
353
|
+
static DISPOSITION = "version-pin";
|
|
354
|
+
static fromObject(object) {
|
|
355
|
+
return VersionPin.make({
|
|
356
|
+
objectId: object.id,
|
|
357
|
+
version: getVersion(object)
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
static createBlock(pin) {
|
|
361
|
+
return {
|
|
362
|
+
_tag: "json",
|
|
363
|
+
disposition: VersionPin.DISPOSITION,
|
|
364
|
+
data: JSON.stringify(pin)
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
};
|
|
368
|
+
|
|
369
|
+
// src/session/GenericToolkit.ts
|
|
370
|
+
var GenericToolkit_exports = {};
|
|
371
|
+
__export(GenericToolkit_exports, {
|
|
372
|
+
Provider: () => Provider,
|
|
373
|
+
TypeId: () => TypeId,
|
|
374
|
+
empty: () => empty3,
|
|
375
|
+
make: () => make,
|
|
376
|
+
merge: () => merge3,
|
|
377
|
+
providerEmpty: () => providerEmpty,
|
|
378
|
+
providerLayer: () => providerLayer
|
|
379
|
+
});
|
|
380
|
+
import * as Toolkit2 from "@effect/ai/Toolkit";
|
|
381
|
+
import * as Context2 from "effect/Context";
|
|
382
|
+
import * as Effect5 from "effect/Effect";
|
|
383
|
+
import * as Layer from "effect/Layer";
|
|
384
|
+
import * as Pipeable from "effect/Pipeable";
|
|
385
|
+
var TypeId = "~@dxos/assistant/GenericToolkit";
|
|
386
|
+
var make = (toolkit, layer) => {
|
|
387
|
+
return {
|
|
388
|
+
[TypeId]: TypeId,
|
|
389
|
+
toolkit,
|
|
390
|
+
layer,
|
|
391
|
+
handlers: toolkit.pipe(Effect5.provide(layer)),
|
|
392
|
+
pipe() {
|
|
393
|
+
return Pipeable.pipeArguments(this, arguments);
|
|
394
|
+
}
|
|
395
|
+
};
|
|
396
|
+
};
|
|
397
|
+
var empty3 = make(Toolkit2.empty, Layer.empty);
|
|
398
|
+
var merge3 = (...toolkits) => {
|
|
399
|
+
return make(Toolkit2.merge(...toolkits.map((t) => t.toolkit)), Layer.mergeAll(...toolkits.map((t) => t.layer)));
|
|
400
|
+
};
|
|
401
|
+
var Provider = class extends Context2.Tag("@dxos/assistant/GenericToolkit.Provider")() {
|
|
402
|
+
};
|
|
403
|
+
var providerLayer = (toolkit) => Layer.succeed(Provider, {
|
|
404
|
+
getToolkit: () => toolkit
|
|
405
|
+
});
|
|
406
|
+
var providerEmpty = providerLayer(empty3);
|
|
407
|
+
|
|
408
|
+
// src/types/artifact.ts
|
|
409
|
+
import * as Schema2 from "effect/Schema";
|
|
410
|
+
import { Type } from "@dxos/echo";
|
|
411
|
+
import { Database } from "@dxos/echo";
|
|
412
|
+
import { EncodedReference } from "@dxos/echo-protocol";
|
|
413
|
+
import { DXN, LOCAL_SPACE_TAG } from "@dxos/keys";
|
|
414
|
+
import { trim as trim2 } from "@dxos/util";
|
|
415
|
+
var createArtifactElement = (id) => `<artifact id=${id} />`;
|
|
416
|
+
var ArtifactId = class extends Schema2.String.annotations({
|
|
417
|
+
// TODO(dmaretskyi): This section gets overriden.
|
|
418
|
+
description: trim2`
|
|
419
|
+
The ID of the referenced object. Formats accepted:
|
|
420
|
+
- DXN (dxn:echo:@:01KG7R1ZXWFMWQ4DA1Q6TN1DG4). DXNs can be prepended with an @ symbol for compatibility with in-text references.
|
|
421
|
+
- space ID, object ID tuple (spaceID:objectID)
|
|
422
|
+
- Only object ID that is assumed to be in the current space (01KG7R1ZXWFMWQ4DA1Q6TN1DG4)
|
|
423
|
+
`,
|
|
424
|
+
examples: [
|
|
425
|
+
"dxn:echo:@:01KG7R1ZXWFMWQ4DA1Q6TN1DG4",
|
|
426
|
+
"@dxn:echo:@:01KG7R1ZXWFMWQ4DA1Q6TN1DG4",
|
|
427
|
+
"BM3FSHFOMJCHCG5QW7JTVKGYABD2GAA7G:01KG7R1ZXWFMWQ4DA1Q6TN1DG4",
|
|
428
|
+
"01KG7R1ZXWFMWQ4DA1Q6TN1DG4"
|
|
429
|
+
]
|
|
430
|
+
}) {
|
|
431
|
+
static toDXN(reference, owningSpaceId) {
|
|
432
|
+
if (reference.startsWith("@dxn:")) {
|
|
433
|
+
return DXN.parse(reference.slice(1));
|
|
434
|
+
} else if (reference.startsWith("dxn:")) {
|
|
435
|
+
return DXN.parse(reference);
|
|
436
|
+
} else if (/^[A-Z0-9]+:[A-Z0-9]+$/.test(reference)) {
|
|
437
|
+
const [spaceId, objectId] = reference.split(":");
|
|
438
|
+
return new DXN(DXN.kind.ECHO, [
|
|
439
|
+
spaceId === owningSpaceId ? LOCAL_SPACE_TAG : spaceId,
|
|
440
|
+
objectId
|
|
441
|
+
]);
|
|
442
|
+
} else if (/^[A-Z0-9]+$/.test(reference)) {
|
|
443
|
+
return DXN.fromLocalObjectId(reference);
|
|
444
|
+
} else {
|
|
445
|
+
throw new Error(`Unable to parse object reference: ${reference}`);
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* Resolves an artifact ID to an object.
|
|
450
|
+
*/
|
|
451
|
+
static resolve(schema, ref) {
|
|
452
|
+
const dxn = ArtifactId.toDXN(ref);
|
|
453
|
+
return Database.resolve(dxn, schema);
|
|
454
|
+
}
|
|
455
|
+
};
|
|
456
|
+
var RefFromLLM = Schema2.transform(ArtifactId, Type.Ref(Type.Obj), {
|
|
457
|
+
decode: (fromA, fromI) => EncodedReference.fromDXN(ArtifactId.toDXN(fromA)),
|
|
458
|
+
encode: (toI, toA) => EncodedReference.toDXN(toI).toString(),
|
|
459
|
+
strict: false
|
|
460
|
+
}).annotations({
|
|
461
|
+
description: ArtifactId.ast.annotations.description
|
|
462
|
+
});
|
|
463
|
+
|
|
464
|
+
// src/functions/services.ts
|
|
465
|
+
import * as Tool from "@effect/ai/Tool";
|
|
466
|
+
import * as Context3 from "effect/Context";
|
|
467
|
+
import * as Effect6 from "effect/Effect";
|
|
468
|
+
import * as Layer2 from "effect/Layer";
|
|
469
|
+
import * as Record from "effect/Record";
|
|
470
|
+
import * as Schema3 from "effect/Schema";
|
|
471
|
+
import { AiToolNotFoundError, ToolExecutionService as ToolExecutionService2, ToolResolverService as ToolResolverService2 } from "@dxos/ai";
|
|
472
|
+
import { todo as todo2 } from "@dxos/debug";
|
|
473
|
+
import { Type as Type2 } from "@dxos/echo";
|
|
474
|
+
import { FunctionInvocationService } from "@dxos/functions";
|
|
475
|
+
import { invariant } from "@dxos/invariant";
|
|
476
|
+
var __dxlog_file3 = "/__w/dxos/dxos/packages/core/assistant/src/functions/services.ts";
|
|
477
|
+
var makeToolResolverFromFunctions = () => {
|
|
478
|
+
return Layer2.effect(ToolResolverService2, Effect6.gen(function* () {
|
|
479
|
+
const toolkitProvider = yield* GenericToolkit_exports.Provider;
|
|
480
|
+
const functionInvocationService = yield* FunctionInvocationService;
|
|
481
|
+
return {
|
|
482
|
+
resolve: (id) => Effect6.gen(function* () {
|
|
483
|
+
const toolkit = toolkitProvider.getToolkit();
|
|
484
|
+
const tool = toolkit.toolkit.tools[id];
|
|
485
|
+
if (tool) {
|
|
486
|
+
return tool;
|
|
487
|
+
}
|
|
488
|
+
return yield* functionInvocationService.resolveFunction(id).pipe(Effect6.map(projectFunctionToTool), Effect6.catchTag("FunctionNotFound", () => Effect6.fail(new AiToolNotFoundError(id))));
|
|
489
|
+
})
|
|
490
|
+
};
|
|
491
|
+
}));
|
|
492
|
+
};
|
|
493
|
+
var makeToolExecutionServiceFromFunctions = () => {
|
|
494
|
+
return Layer2.effect(ToolExecutionService2, Effect6.gen(function* () {
|
|
495
|
+
const toolkitProvider = yield* GenericToolkit_exports.Provider;
|
|
496
|
+
const toolkit = toolkitProvider.getToolkit();
|
|
497
|
+
const toolkitHandler = yield* toolkit.toolkit.pipe(Effect6.provide(toolkit.layer));
|
|
498
|
+
invariant(isHandlerLike(toolkitHandler), void 0, {
|
|
499
|
+
F: __dxlog_file3,
|
|
500
|
+
L: 76,
|
|
501
|
+
S: this,
|
|
502
|
+
A: [
|
|
503
|
+
"isHandlerLike(toolkitHandler)",
|
|
504
|
+
""
|
|
505
|
+
]
|
|
506
|
+
});
|
|
507
|
+
const functionInvocationService = yield* FunctionInvocationService;
|
|
508
|
+
return {
|
|
509
|
+
handlersFor: (toolkit2) => {
|
|
510
|
+
const makeHandler = (tool) => {
|
|
511
|
+
return Effect6.fn(`toolFunctionHandler ${tool.name}`)(function* (input) {
|
|
512
|
+
if (toolkitHandler.tools[tool.name]) {
|
|
513
|
+
if (Tool.isProviderDefined(tool)) {
|
|
514
|
+
throw new Error("Attempted to call a provider-defined tool");
|
|
515
|
+
}
|
|
516
|
+
const { result } = yield* toolkitHandler.handle(tool.name, input);
|
|
517
|
+
return result;
|
|
518
|
+
}
|
|
519
|
+
const { definition: functionDef } = Context3.get(FunctionToolAnnotation)(tool.annotations);
|
|
520
|
+
return yield* functionInvocationService.invokeFunction(functionDef, input).pipe(Effect6.catchAllDefect((defect) => Effect6.fail(defect)));
|
|
521
|
+
});
|
|
522
|
+
};
|
|
523
|
+
return toolkit2.of(Record.map(toolkit2.tools, (tool, _name) => Tool.isUserDefined(tool) ? makeHandler(tool) : null));
|
|
524
|
+
}
|
|
525
|
+
};
|
|
526
|
+
}));
|
|
527
|
+
};
|
|
528
|
+
var ToolExecutionServices = Layer2.mergeAll(makeToolResolverFromFunctions(), makeToolExecutionServiceFromFunctions());
|
|
529
|
+
var FunctionToolAnnotation = class extends Context3.Tag("@dxos/assistant/FunctionToolAnnotation")() {
|
|
530
|
+
};
|
|
531
|
+
var toolCache = /* @__PURE__ */ new WeakMap();
|
|
532
|
+
var projectFunctionToTool = (fn2) => {
|
|
533
|
+
if (toolCache.has(fn2)) {
|
|
534
|
+
return toolCache.get(fn2);
|
|
535
|
+
}
|
|
536
|
+
const tool = Tool.make(makeToolName(fn2.name), {
|
|
537
|
+
description: fn2.description,
|
|
538
|
+
parameters: createStructFieldsFromSchema(fn2.inputSchema),
|
|
539
|
+
// TODO(dmaretskyi): Include output schema.
|
|
540
|
+
failure: Schema3.Any
|
|
541
|
+
}).annotate(FunctionToolAnnotation, {
|
|
542
|
+
definition: fn2
|
|
543
|
+
});
|
|
544
|
+
toolCache.set(fn2, tool);
|
|
545
|
+
return tool;
|
|
546
|
+
};
|
|
547
|
+
var makeToolName = (name) => {
|
|
548
|
+
const toolName = name.toLowerCase().replace(/[^a-zA-Z0-9]/g, "-");
|
|
549
|
+
invariant(toolName.match(/^[a-z_][a-z0-9-_]*$/), void 0, {
|
|
550
|
+
F: __dxlog_file3,
|
|
551
|
+
L: 152,
|
|
552
|
+
S: void 0,
|
|
553
|
+
A: [
|
|
554
|
+
"toolName.match(/^[a-z_][a-z0-9-_]*$/)",
|
|
555
|
+
""
|
|
556
|
+
]
|
|
557
|
+
});
|
|
558
|
+
return toolName;
|
|
559
|
+
};
|
|
560
|
+
var createStructFieldsFromSchema = (schema) => {
|
|
561
|
+
switch (schema.ast._tag) {
|
|
562
|
+
case "TypeLiteral":
|
|
563
|
+
return Object.fromEntries(schema.ast.propertySignatures.map((prop) => [
|
|
564
|
+
prop.name,
|
|
565
|
+
Schema3.make(mapSchemaTypeForLLM(prop.type))
|
|
566
|
+
]));
|
|
567
|
+
case "VoidKeyword":
|
|
568
|
+
return {};
|
|
569
|
+
default:
|
|
570
|
+
return todo2(`Unsupported schema AST: ${schema.ast._tag}`);
|
|
571
|
+
}
|
|
572
|
+
};
|
|
573
|
+
var mapSchemaTypeForLLM = (ast) => {
|
|
574
|
+
if (Type2.Ref.isRefSchemaAST(ast)) {
|
|
575
|
+
const description = ast.annotations.description ? ast.annotations.description + "\n" + RefFromLLM.ast.annotations.description : RefFromLLM.ast.annotations.description;
|
|
576
|
+
return RefFromLLM.annotations({
|
|
577
|
+
description
|
|
578
|
+
}).ast;
|
|
579
|
+
}
|
|
580
|
+
return ast;
|
|
581
|
+
};
|
|
582
|
+
var isHandlerLike = (value) => {
|
|
583
|
+
return typeof value.tools === "object" && typeof value.handle === "function";
|
|
584
|
+
};
|
|
585
|
+
|
|
586
|
+
export {
|
|
587
|
+
ArtifactDiffResolver,
|
|
588
|
+
GenerationObserver,
|
|
589
|
+
AiModelError,
|
|
590
|
+
AiAssistantError,
|
|
591
|
+
formatSystemPrompt,
|
|
592
|
+
formatUserPrompt,
|
|
593
|
+
AiSession,
|
|
594
|
+
createToolkit,
|
|
595
|
+
VersionPin,
|
|
596
|
+
GenericToolkit_exports,
|
|
597
|
+
createArtifactElement,
|
|
598
|
+
ArtifactId,
|
|
599
|
+
RefFromLLM,
|
|
600
|
+
makeToolResolverFromFunctions,
|
|
601
|
+
makeToolExecutionServiceFromFunctions,
|
|
602
|
+
ToolExecutionServices
|
|
603
|
+
};
|
|
604
|
+
//# sourceMappingURL=chunk-QBD6NQJK.mjs.map
|