@dxos/assistant 0.7.5-labs.ff2ff30 → 0.7.5-main.5ae2ba8
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/index.mjs +86 -56
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +20 -20
- package/dist/lib/browser/testing/index.mjs.map +2 -2
- package/dist/lib/node/index.cjs +89 -59
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/testing/index.cjs +20 -20
- package/dist/lib/node/testing/index.cjs.map +2 -2
- package/dist/lib/node-esm/index.mjs +86 -56
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/testing/index.mjs +20 -20
- package/dist/lib/node-esm/testing/index.mjs.map +2 -2
- package/dist/types/src/ai-service/client.d.ts +7 -14
- package/dist/types/src/ai-service/client.d.ts.map +1 -1
- package/dist/types/src/ai-service/defs.d.ts +3 -0
- package/dist/types/src/ai-service/defs.d.ts.map +1 -0
- package/dist/types/src/ai-service/index.d.ts +1 -0
- package/dist/types/src/ai-service/index.d.ts.map +1 -1
- package/dist/types/src/ai-service/parser.d.ts +3 -3
- package/dist/types/src/ai-service/parser.d.ts.map +1 -1
- package/dist/types/src/ai-service/stream.d.ts.map +1 -1
- package/dist/types/src/ai-service/testing/index.d.ts +3 -0
- package/dist/types/src/ai-service/testing/index.d.ts.map +1 -0
- package/dist/types/src/ai-service/testing/mock.d.ts +7 -0
- package/dist/types/src/ai-service/testing/mock.d.ts.map +1 -0
- package/dist/types/src/ai-service/{testing.d.ts → testing/test-stream.d.ts} +1 -1
- package/dist/types/src/ai-service/testing/test-stream.d.ts.map +1 -0
- package/dist/types/src/ai-service/types.d.ts +97 -14
- package/dist/types/src/ai-service/types.d.ts.map +1 -1
- package/dist/types/src/conversation/conversation.d.ts.map +1 -1
- package/dist/types/src/testing/defs.d.ts.map +1 -1
- package/package.json +13 -13
- package/src/ai-service/client.test.ts +9 -8
- package/src/ai-service/client.ts +16 -29
- package/src/ai-service/defs.ts +24 -0
- package/src/ai-service/index.ts +1 -0
- package/src/ai-service/parser.ts +14 -1
- package/src/ai-service/stream.ts +1 -1
- package/src/ai-service/testing/index.ts +6 -0
- package/src/ai-service/testing/mock.ts +17 -0
- package/src/ai-service/{testing.ts → testing/test-stream.ts} +1 -1
- package/src/ai-service/types.ts +12 -16
- package/src/bin/chat.ts +4 -3
- package/src/conversation/conversation.test.ts +4 -4
- package/src/conversation/conversation.ts +1 -1
- package/src/testing/artifacts.test.ts +9 -9
- package/src/testing/defs.ts +1 -0
- package/src/testing/object-extraction.test.ts +1 -1
- package/src/testing/query-promts.ts +20 -20
- package/src/testing/query.test.ts +3 -3
- package/dist/types/src/ai-service/testing.d.ts.map +0 -1
package/src/ai-service/client.ts
CHANGED
|
@@ -4,21 +4,19 @@
|
|
|
4
4
|
|
|
5
5
|
import { Schema as S } from '@effect/schema';
|
|
6
6
|
|
|
7
|
-
import { Message
|
|
7
|
+
import { Message } from '@dxos/artifact';
|
|
8
8
|
import { invariant } from '@dxos/invariant';
|
|
9
|
-
import {
|
|
9
|
+
import { log } from '@dxos/log';
|
|
10
10
|
|
|
11
11
|
import { createGenerationStream, type GenerationStream } from './stream';
|
|
12
12
|
import { type GenerateRequest } from './types';
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
14
|
+
export interface AIService {
|
|
15
|
+
exec(request: GenerateRequest): Promise<GenerationStream>;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface AIServiceClient extends AIService {
|
|
19
19
|
appendMessages(messages: Message[]): Promise<void>;
|
|
20
|
-
updateMessage(spaceId: SpaceId, threadId: string, messageId: string, message: Message): Promise<void>;
|
|
21
|
-
generate(request: GenerateRequest): Promise<GenerationStream>;
|
|
22
20
|
}
|
|
23
21
|
|
|
24
22
|
export type AIServiceClientParams = {
|
|
@@ -37,19 +35,6 @@ export class AIServiceClientImpl implements AIServiceClient {
|
|
|
37
35
|
this._endpoint = endpoint;
|
|
38
36
|
}
|
|
39
37
|
|
|
40
|
-
async getSpace(spaceId: SpaceId): Promise<Space> {
|
|
41
|
-
throw new Error('Not implemented');
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
async getThread(spaceId: SpaceId, threadId: string): Promise<Thread> {
|
|
45
|
-
throw new Error('Not implemented');
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
async getMessages(spaceId: SpaceId, threadId: string): Promise<Message[]> {
|
|
49
|
-
const res = await fetch(`${this._endpoint}/space/${spaceId}/thread/${threadId}/message`);
|
|
50
|
-
return S.decodePromise(S.Array(Message).pipe(S.mutable))((await res.json()).data.results);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
38
|
async appendMessages(messages: Message[]): Promise<void> {
|
|
54
39
|
const url = `${this._endpoint}/message`;
|
|
55
40
|
const res = await fetch(url, {
|
|
@@ -65,15 +50,17 @@ export class AIServiceClientImpl implements AIServiceClient {
|
|
|
65
50
|
}
|
|
66
51
|
}
|
|
67
52
|
|
|
68
|
-
// TODO(dmaretskyi): Accept partial message schema.
|
|
69
|
-
async updateMessage(spaceId: SpaceId, threadId: string, messageId: string, message: Message): Promise<void> {
|
|
70
|
-
throw new Error('Not implemented');
|
|
71
|
-
}
|
|
72
|
-
|
|
73
53
|
/**
|
|
74
|
-
*
|
|
54
|
+
* Process request and open message stream.
|
|
75
55
|
*/
|
|
76
|
-
async
|
|
56
|
+
async exec(request: GenerateRequest): Promise<GenerationStream> {
|
|
57
|
+
// TODO(dmaretskyi): Errors if tools are not provided.
|
|
58
|
+
request = {
|
|
59
|
+
tools: request.tools ?? [],
|
|
60
|
+
...request,
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
log.info('requesting', { endpoint: this._endpoint });
|
|
77
64
|
const controller = new AbortController();
|
|
78
65
|
const response = await fetch(`${this._endpoint}/generate`, {
|
|
79
66
|
signal: controller.signal,
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
// TODO(burdon): Share with Edge.
|
|
6
|
+
// TODO(burdon): Move to service config retrieved by HTTP?
|
|
7
|
+
|
|
8
|
+
export const DEFAULT_LLM_MODEL = '@anthropic/claude-3-5-sonnet-20241022';
|
|
9
|
+
|
|
10
|
+
export const DEFAULT_LLM_MODELS = [
|
|
11
|
+
// AI Gateway.
|
|
12
|
+
// https://developers.cloudflare.com/ai-gateway
|
|
13
|
+
'@anthropic/claude-3-5-haiku-20241022',
|
|
14
|
+
'@anthropic/claude-3-5-sonnet-20241022',
|
|
15
|
+
'@anthropic/claude-3-7-sonnet-20250219',
|
|
16
|
+
|
|
17
|
+
// Workers AI.
|
|
18
|
+
// https://developers.cloudflare.com/workers-ai/models
|
|
19
|
+
'@cf/deepseek-ai/deepseek-r1-distill-qwen-32b',
|
|
20
|
+
'@hf/nousresearch/hermes-2-pro-mistral-7b',
|
|
21
|
+
'@ollama/llama-3-1-nemotron-70b-instruct',
|
|
22
|
+
'@ollama/llama-3-1-nemotron-mini-4b-instruct',
|
|
23
|
+
'@ollama/llama-3-2-3b',
|
|
24
|
+
];
|
package/src/ai-service/index.ts
CHANGED
package/src/ai-service/parser.ts
CHANGED
|
@@ -60,7 +60,7 @@ export class MixedStreamParser {
|
|
|
60
60
|
/**
|
|
61
61
|
* Parse stream until end.
|
|
62
62
|
*/
|
|
63
|
-
async parse(stream: GenerationStream) {
|
|
63
|
+
async parse(stream: GenerationStream): Promise<Message[]> {
|
|
64
64
|
const transformer = new StreamTransform();
|
|
65
65
|
|
|
66
66
|
/**
|
|
@@ -74,6 +74,8 @@ export class MixedStreamParser {
|
|
|
74
74
|
let streamBlock: StreamBlock | undefined;
|
|
75
75
|
const stack: StreamBlock[] = [];
|
|
76
76
|
|
|
77
|
+
const messagesCollected: Message[] = [];
|
|
78
|
+
|
|
77
79
|
for await (const event of stream) {
|
|
78
80
|
// log.info('event', { type: event.type, event });
|
|
79
81
|
switch (event.type) {
|
|
@@ -103,6 +105,7 @@ export class MixedStreamParser {
|
|
|
103
105
|
if (!this._message) {
|
|
104
106
|
log.warn('unexpected message_stop');
|
|
105
107
|
} else {
|
|
108
|
+
messagesCollected.push(this._message);
|
|
106
109
|
this._message = undefined;
|
|
107
110
|
}
|
|
108
111
|
break;
|
|
@@ -247,6 +250,8 @@ export class MixedStreamParser {
|
|
|
247
250
|
this._emitUpdate(contentBlock, streamBlock);
|
|
248
251
|
}
|
|
249
252
|
} // for.
|
|
253
|
+
|
|
254
|
+
return messagesCollected;
|
|
250
255
|
}
|
|
251
256
|
}
|
|
252
257
|
|
|
@@ -317,6 +322,14 @@ export const mergeMessageBlock = (
|
|
|
317
322
|
}),
|
|
318
323
|
};
|
|
319
324
|
}
|
|
325
|
+
|
|
326
|
+
case 'tool-list': {
|
|
327
|
+
return {
|
|
328
|
+
type: 'json',
|
|
329
|
+
disposition: 'tool_list',
|
|
330
|
+
json: JSON.stringify({}),
|
|
331
|
+
};
|
|
332
|
+
}
|
|
320
333
|
}
|
|
321
334
|
|
|
322
335
|
break;
|
package/src/ai-service/stream.ts
CHANGED
|
@@ -11,7 +11,7 @@ import { iterSSEMessages } from './util';
|
|
|
11
11
|
/**
|
|
12
12
|
* Creates a stream from an SSE response.
|
|
13
13
|
*/
|
|
14
|
-
export const createGenerationStream = (response: Response, controller = new AbortController()) => {
|
|
14
|
+
export const createGenerationStream = (response: Response, controller = new AbortController()): GenerationStream => {
|
|
15
15
|
const iterator = async function* () {
|
|
16
16
|
for await (const sse of iterSSEMessages(response, controller)) {
|
|
17
17
|
if (sse.event === 'completion') {
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { type GenerationStream, type AIService, type GenerateRequest, createGenerationStream } from '@dxos/assistant';
|
|
6
|
+
|
|
7
|
+
import { createTestSSEStream } from './test-stream';
|
|
8
|
+
|
|
9
|
+
export class MockAIService implements AIService {
|
|
10
|
+
constructor(private readonly _responses: string[]) {}
|
|
11
|
+
|
|
12
|
+
// TODO(burdon): Match response to request.
|
|
13
|
+
// TODO(burdon): See MockGpt (from conductor).
|
|
14
|
+
async exec(request: GenerateRequest): Promise<GenerationStream> {
|
|
15
|
+
return createGenerationStream(new Response(createTestSSEStream(this._responses)));
|
|
16
|
+
}
|
|
17
|
+
}
|
package/src/ai-service/types.ts
CHANGED
|
@@ -7,17 +7,11 @@ import { Schema as S } from '@effect/schema';
|
|
|
7
7
|
import { Tool, Message, type MessageContentBlock, SpaceIdSchema } from '@dxos/artifact';
|
|
8
8
|
import { ObjectId } from '@dxos/echo-schema';
|
|
9
9
|
|
|
10
|
+
import { DEFAULT_LLM_MODELS } from './defs';
|
|
11
|
+
|
|
10
12
|
export const createArtifactElement = (id: ObjectId) => `<artifact id=${id} />`;
|
|
11
13
|
|
|
12
|
-
export const LLMModel = S.Literal(
|
|
13
|
-
'@anthropic/claude-3-5-haiku-20241022',
|
|
14
|
-
'@anthropic/claude-3-5-sonnet-20241022',
|
|
15
|
-
'@cf/deepseek-ai/deepseek-r1-distill-qwen-32b',
|
|
16
|
-
'@hf/nousresearch/hermes-2-pro-mistral-7b',
|
|
17
|
-
'@ollama/llama-3-2-3b',
|
|
18
|
-
'@ollama/llama-3-1-nemotron-70b-instruct',
|
|
19
|
-
'@ollama/llama-3-1-nemotron-mini-4b-instruct',
|
|
20
|
-
);
|
|
14
|
+
export const LLMModel = S.Literal(...DEFAULT_LLM_MODELS);
|
|
21
15
|
|
|
22
16
|
export type LLMModel = S.Schema.Type<typeof LLMModel>;
|
|
23
17
|
|
|
@@ -34,14 +28,15 @@ export const GenerateRequest = S.Struct({
|
|
|
34
28
|
spaceId: S.optional(SpaceIdSchema),
|
|
35
29
|
threadId: S.optional(ObjectId),
|
|
36
30
|
|
|
37
|
-
|
|
38
|
-
|
|
31
|
+
/**
|
|
32
|
+
* Preferred model or system default.
|
|
33
|
+
*/
|
|
34
|
+
model: S.optional(LLMModel),
|
|
39
35
|
|
|
40
36
|
/**
|
|
41
|
-
*
|
|
37
|
+
* Tools available for the LLM.
|
|
42
38
|
*/
|
|
43
|
-
|
|
44
|
-
// prompt: Message,
|
|
39
|
+
tools: S.optional(S.Array(Tool).pipe(S.mutable)),
|
|
45
40
|
|
|
46
41
|
/**
|
|
47
42
|
* System instructions to the LLM.
|
|
@@ -51,12 +46,13 @@ export const GenerateRequest = S.Struct({
|
|
|
51
46
|
/**
|
|
52
47
|
* History of messages to include in the context window.
|
|
53
48
|
*/
|
|
49
|
+
// TODO(burdon): Rename messages.
|
|
54
50
|
history: S.optional(S.Array(Message)),
|
|
55
51
|
|
|
56
52
|
/**
|
|
57
|
-
*
|
|
53
|
+
* Current request.
|
|
58
54
|
*/
|
|
59
|
-
|
|
55
|
+
prompt: S.optional(Message),
|
|
60
56
|
});
|
|
61
57
|
|
|
62
58
|
export type GenerateRequest = S.Schema.Type<typeof GenerateRequest>;
|
package/src/bin/chat.ts
CHANGED
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
// Copyright 2024 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import { writeFileSync } from 'fs';
|
|
6
5
|
import inquirer from 'inquirer';
|
|
6
|
+
import { writeFileSync } from 'node:fs';
|
|
7
7
|
|
|
8
8
|
import { createUserMessage } from '@dxos/artifact';
|
|
9
9
|
import { ObjectId } from '@dxos/echo-schema';
|
|
10
10
|
import { SpaceId } from '@dxos/keys';
|
|
11
11
|
import { log } from '@dxos/log';
|
|
12
12
|
|
|
13
|
-
import { AIServiceClientImpl, ToolTypes } from '../ai-service';
|
|
13
|
+
import { AIServiceClientImpl, ToolTypes, DEFAULT_LLM_MODEL } from '../ai-service';
|
|
14
14
|
import { runLLM } from '../conversation';
|
|
15
15
|
import {
|
|
16
16
|
AI_SERVICE_ENDPOINT,
|
|
@@ -24,6 +24,7 @@ import {
|
|
|
24
24
|
Task,
|
|
25
25
|
} from '../testing';
|
|
26
26
|
|
|
27
|
+
// TOOD(burdon): Get from config.
|
|
27
28
|
const client = new AIServiceClientImpl({
|
|
28
29
|
endpoint: AI_SERVICE_ENDPOINT.LOCAL,
|
|
29
30
|
});
|
|
@@ -48,7 +49,7 @@ while (true) {
|
|
|
48
49
|
await client.appendMessages([createUserMessage(spaceId, threadId, prompt.message)]);
|
|
49
50
|
|
|
50
51
|
await runLLM({
|
|
51
|
-
model:
|
|
52
|
+
model: DEFAULT_LLM_MODEL,
|
|
52
53
|
spaceId,
|
|
53
54
|
threadId,
|
|
54
55
|
system: createSystemPrompt(schemaTypes),
|
|
@@ -11,7 +11,7 @@ import { SpaceId } from '@dxos/keys';
|
|
|
11
11
|
import { log } from '@dxos/log';
|
|
12
12
|
|
|
13
13
|
import { runLLM, type ConversationEvent } from './conversation';
|
|
14
|
-
import { AIServiceClientImpl } from '../ai-service';
|
|
14
|
+
import { AIServiceClientImpl, DEFAULT_LLM_MODEL } from '../ai-service';
|
|
15
15
|
import { AI_SERVICE_ENDPOINT } from '../testing';
|
|
16
16
|
|
|
17
17
|
// TODO(burdon): Local live LLM test.
|
|
@@ -25,7 +25,7 @@ describe.skip('Conversation tests', () => {
|
|
|
25
25
|
const threadId = ObjectId.random();
|
|
26
26
|
|
|
27
27
|
const result = await runLLM({
|
|
28
|
-
model:
|
|
28
|
+
model: DEFAULT_LLM_MODEL,
|
|
29
29
|
history: [createUserMessage(spaceId, threadId, 'Hello, how are you?')],
|
|
30
30
|
tools: [],
|
|
31
31
|
client,
|
|
@@ -37,7 +37,7 @@ describe.skip('Conversation tests', () => {
|
|
|
37
37
|
});
|
|
38
38
|
|
|
39
39
|
test('tool call', async ({ expect }) => {
|
|
40
|
-
const custodian = defineTool({
|
|
40
|
+
const custodian = defineTool('testing', {
|
|
41
41
|
name: 'custodian',
|
|
42
42
|
description: 'Custodian can tell you the password if you say the magic word',
|
|
43
43
|
schema: S.Struct({
|
|
@@ -56,7 +56,7 @@ describe.skip('Conversation tests', () => {
|
|
|
56
56
|
const threadId = ObjectId.random();
|
|
57
57
|
|
|
58
58
|
const result = await runLLM({
|
|
59
|
-
model:
|
|
59
|
+
model: DEFAULT_LLM_MODEL,
|
|
60
60
|
history: [createUserMessage(spaceId, threadId, 'What is the password? Ask the custodian.')],
|
|
61
61
|
tools: [custodian],
|
|
62
62
|
client,
|
|
@@ -43,7 +43,7 @@ export const runLLM = async (params: CreateLLMConversationParams) => {
|
|
|
43
43
|
const generate = async () => {
|
|
44
44
|
log('llm generate', { tools: params.tools });
|
|
45
45
|
const beginTs = Date.now();
|
|
46
|
-
const stream = await params.client.
|
|
46
|
+
const stream = await params.client.exec({
|
|
47
47
|
model: params.model,
|
|
48
48
|
spaceId: params.spaceId,
|
|
49
49
|
threadId: params.threadId,
|
|
@@ -41,16 +41,16 @@ const list: ArtifactDef = {
|
|
|
41
41
|
description: 'Ordered set of text items.',
|
|
42
42
|
schema: ListSchema,
|
|
43
43
|
actions: [
|
|
44
|
-
defineTool({
|
|
45
|
-
name: '
|
|
44
|
+
defineTool('list', {
|
|
45
|
+
name: 'query',
|
|
46
46
|
description: 'Query all lists',
|
|
47
47
|
schema: S.Struct({}),
|
|
48
48
|
execute: async ({}, context) => {
|
|
49
49
|
return ToolResult.Success(LISTS[id]);
|
|
50
50
|
},
|
|
51
51
|
}),
|
|
52
|
-
defineTool({
|
|
53
|
-
name: '
|
|
52
|
+
defineTool('list', {
|
|
53
|
+
name: 'inspect',
|
|
54
54
|
description: 'Get contents of the list',
|
|
55
55
|
schema: S.Struct({
|
|
56
56
|
id: ObjectId.annotations({ description: 'The list to inspect' }),
|
|
@@ -59,8 +59,8 @@ const list: ArtifactDef = {
|
|
|
59
59
|
return ToolResult.Success(LISTS[id]);
|
|
60
60
|
},
|
|
61
61
|
}),
|
|
62
|
-
defineTool({
|
|
63
|
-
name: '
|
|
62
|
+
defineTool('list', {
|
|
63
|
+
name: 'create',
|
|
64
64
|
description: 'Add one or more items to an existing list',
|
|
65
65
|
schema: S.Struct({
|
|
66
66
|
id: ObjectId.annotations({ description: 'The list to add items to' }),
|
|
@@ -78,7 +78,7 @@ const LISTS: Record<ObjectId, ListSchema> = {};
|
|
|
78
78
|
|
|
79
79
|
const artifacts = [list];
|
|
80
80
|
|
|
81
|
-
const getArtifactDefinitions = defineTool({
|
|
81
|
+
const getArtifactDefinitions = defineTool('system', {
|
|
82
82
|
name: 'getArtifactDefinitions',
|
|
83
83
|
description: 'Queries the definitions and metadata of artifacts defined in the system',
|
|
84
84
|
schema: S.Any,
|
|
@@ -136,7 +136,7 @@ describe('Artifacts', () => {
|
|
|
136
136
|
]);
|
|
137
137
|
|
|
138
138
|
const stream = await client.generate({
|
|
139
|
-
model:
|
|
139
|
+
model: DEFAULT_LLM_MODEL,
|
|
140
140
|
spaceId,
|
|
141
141
|
threadId,
|
|
142
142
|
systemPrompt: 'You are a helpful assistant.',
|
|
@@ -164,7 +164,7 @@ describe('Artifacts', () => {
|
|
|
164
164
|
]);
|
|
165
165
|
|
|
166
166
|
const stream2 = await client.generate({
|
|
167
|
-
model:
|
|
167
|
+
model: DEFAULT_LLM_MODEL,
|
|
168
168
|
spaceId,
|
|
169
169
|
threadId,
|
|
170
170
|
systemPrompt: 'You are a helpful assistant.',
|
package/src/testing/defs.ts
CHANGED
|
@@ -12,34 +12,34 @@ import { executeQuery, formatJsonSchemaForLLM, type DataSource } from '../cypher
|
|
|
12
12
|
import { trim } from '../util';
|
|
13
13
|
|
|
14
14
|
export const createCypherTool = (dataSource: DataSource, schemaTypes: S.Schema.Any[] = []) =>
|
|
15
|
-
defineTool({
|
|
16
|
-
name: '
|
|
15
|
+
defineTool('dxos.org/echo', {
|
|
16
|
+
name: 'query',
|
|
17
17
|
description:
|
|
18
18
|
'Query the ECHO graph database in cypher query language. Returns data from the database.' +
|
|
19
19
|
(schemaTypes.length > 0 ? `\n\n${createSystemPrompt(schemaTypes)}` : ''),
|
|
20
20
|
schema: S.Struct({
|
|
21
21
|
query: S.String.annotations({
|
|
22
22
|
description: `
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
23
|
+
A valid cypher query string to execute.
|
|
24
|
+
Query must have one MATCH clause.
|
|
25
|
+
Match clause can have multiple patterns but they must all be connected via a relationship chain.
|
|
26
|
+
Query might have zero or one WHERE clauses.
|
|
27
|
+
Query must have one RETURN clause.
|
|
28
|
+
RETURN clause can have multiple expressions separated by commas.
|
|
29
|
+
DISTINCT keyword is not allowed.
|
|
30
30
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
<example>
|
|
32
|
+
MATCH (n:Person) RETURN n.name
|
|
33
|
+
</example>
|
|
34
34
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
35
|
+
<example>
|
|
36
|
+
MATCH (s:Studio)-[:PRODUCED]->(m:Movie)-[:PRODUCED_IN]->(c:City {name: "Las Vegas"}) RETURN s
|
|
37
|
+
</example>
|
|
38
|
+
|
|
39
|
+
<example>
|
|
40
|
+
MATCH (a:Actor)-[:STARRED_IN]->(m:Movie)<-[:PRODUCED]-(s:Studio {name: "Cinema Pictures"}) WHERE m.name = "Once upon a time" RETURN m.name, a.name
|
|
41
|
+
</example>
|
|
42
|
+
`,
|
|
43
43
|
}),
|
|
44
44
|
}),
|
|
45
45
|
execute: async ({ query }) => {
|
|
@@ -15,7 +15,7 @@ import { createLogger } from './logger';
|
|
|
15
15
|
import { createCypherTool, createSystemPrompt } from './query-promts';
|
|
16
16
|
import { createTestData, seedTestData } from './test-data';
|
|
17
17
|
import { Contact, Org, Project, Task } from './test-schema';
|
|
18
|
-
import { AIServiceClientImpl } from '../ai-service';
|
|
18
|
+
import { AIServiceClientImpl, DEFAULT_LLM_MODEL } from '../ai-service';
|
|
19
19
|
import { runLLM } from '../conversation';
|
|
20
20
|
import { EchoDataSource } from '../cypher';
|
|
21
21
|
|
|
@@ -41,7 +41,7 @@ test.skip('cypher query', async () => {
|
|
|
41
41
|
]);
|
|
42
42
|
|
|
43
43
|
const result = await runLLM({
|
|
44
|
-
model:
|
|
44
|
+
model: DEFAULT_LLM_MODEL,
|
|
45
45
|
tools: [cypherTool],
|
|
46
46
|
spaceId,
|
|
47
47
|
threadId,
|
|
@@ -78,7 +78,7 @@ test.skip('query ECHO', async () => {
|
|
|
78
78
|
]);
|
|
79
79
|
|
|
80
80
|
const result = await runLLM({
|
|
81
|
-
model:
|
|
81
|
+
model: DEFAULT_LLM_MODEL,
|
|
82
82
|
tools: [cypherTool],
|
|
83
83
|
spaceId,
|
|
84
84
|
threadId,
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../../../src/ai-service/testing.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,eAAO,MAAM,mBAAmB,SACxB,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,gBACH;IAAE,OAAO,CAAC,EAAE,MAAM,GAAG,WAAW,CAAA;CAAE,KACvD,cA8EF,CAAC"}
|