@dxos/assistant 0.7.5-labs.ff2ff30 → 0.7.5-main.b19bfc8
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 +81 -37
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs.map +2 -2
- package/dist/lib/node/index.cjs +84 -40
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/testing/index.cjs.map +2 -2
- package/dist/lib/node-esm/index.mjs +81 -37
- 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.map +2 -2
- 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/types.d.ts +9 -6
- package/dist/types/src/ai-service/types.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 +5 -4
- package/src/ai-service/client.ts +8 -0
- 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/types.ts +11 -15
- package/src/bin/chat.ts +4 -3
- package/src/conversation/conversation.test.ts +3 -3
- package/src/testing/artifacts.test.ts +2 -2
- package/src/testing/defs.ts +1 -0
- package/src/testing/object-extraction.test.ts +1 -1
- package/src/testing/query.test.ts +3 -3
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/testing/defs.ts", "../../../../src/testing/logger.ts", "../../../../src/testing/query-promts.ts", "../../../../src/testing/test-data.ts", "../../../../src/testing/test-schema.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nexport const AI_SERVICE_ENDPOINT = {\n LOCAL: 'http://localhost:8788',\n REMOTE: 'https://ai-service.dxos.workers.dev',\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport type { ImageSource, MessageContentBlock } from '@dxos/artifact';\n\nimport type { ConversationEvent } from '../conversation';\n\nexport const createLogger = ({\n stream,\n filter,\n onImage,\n}: {\n stream?: boolean;\n filter?: (event: ConversationEvent) => boolean;\n onImage?: (img: { id: string; description?: string; source: ImageSource }) => void;\n} = {}) => {\n const images: Record<string, any> = {};\n let currentText = '';\n\n return (event: ConversationEvent) => {\n if (typeof filter === 'function' && !filter(event)) {\n return;\n }\n\n const printContentBlock = (content: MessageContentBlock) => {\n switch (content.type) {\n case 'text':\n process.stdout.write(content.text);\n break;\n case 'tool_use':\n process.stdout.write(`⚙️ [Tool Use] ${content.name}\\n`);\n break;\n case 'image': {\n if (content.id && content.source) {\n images[content.id] = content.source;\n }\n process.stdout.write(`[Image id=${content.id} mediaType=${content.source?.mediaType}]`);\n break;\n }\n }\n };\n\n const onTextBlockPrinted = (text: string) => {\n const imageMatch = text.match(/<image id=\"([^\"]+)\"(?:\\s+prompt=\"([^\"]+)\")?\\s*\\/>/);\n if (imageMatch && onImage && images[imageMatch[1]]) {\n onImage({\n id: imageMatch[1],\n description: imageMatch[2], // Extract prompt as description if present\n source: images[imageMatch[1]],\n });\n }\n };\n\n if (stream) {\n switch (event.type) {\n case 'message_start': {\n process.stdout.write(`${event.message.role.toUpperCase()}\\n\\n`);\n for (const content of event.message.content) {\n printContentBlock(content);\n }\n break;\n }\n case 'content_block_start': {\n currentText = '';\n printContentBlock(event.content);\n break;\n }\n case 'content_block_delta': {\n switch (event.delta.type) {\n case 'text_delta': {\n currentText += event.delta.text;\n process.stdout.write(event.delta.text);\n break;\n }\n case 'input_json_delta': {\n process.stdout.write(event.delta.partial_json);\n break;\n }\n }\n break;\n }\n case 'content_block_stop': {\n process.stdout.write('\\n');\n onTextBlockPrinted(currentText);\n currentText = '';\n break;\n }\n case 'message_delta': {\n break;\n }\n case 'message_stop': {\n process.stdout.write('\\n\\n');\n break;\n }\n }\n }\n\n switch (event.type) {\n case 'message': {\n if (!stream || event.message.role !== 'assistant') {\n process.stdout.write(`${event.message.role.toUpperCase()}\\n\\n`);\n for (const block of event.message.content) {\n switch (block.type) {\n case 'text':\n process.stdout.write(block.text + '\\n');\n onTextBlockPrinted(block.text);\n break;\n case 'tool_use':\n process.stdout.write(`⚙️ [Tool Use] ${block.name}\\n`);\n process.stdout.write(` ${JSON.stringify(block.input)}\\n`);\n break;\n case 'tool_result':\n if (block.isError) {\n process.stdout.write('❌ [Tool Error]\\n');\n process.stdout.write(block.content + '\\n');\n } else {\n process.stdout.write('✅ [Tool Success]\\n');\n process.stdout.write(block.content + '\\n');\n }\n }\n process.stdout.write('\\n\\n');\n }\n }\n break;\n }\n }\n };\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Schema as S } from '@effect/schema';\n\nimport { defineTool, ToolResult } from '@dxos/artifact';\nimport { toJsonSchema } from '@dxos/echo-schema';\nimport { log } from '@dxos/log';\n\nimport { executeQuery, formatJsonSchemaForLLM, type DataSource } from '../cypher';\nimport { trim } from '../util';\n\nexport const createCypherTool = (dataSource: DataSource, schemaTypes: S.Schema.Any[] = []) =>\n defineTool({\n name: 'graphQuery',\n description:\n 'Query the ECHO graph database in cypher query language. Returns data from the database.' +\n (schemaTypes.length > 0 ? `\\n\\n${createSystemPrompt(schemaTypes)}` : ''),\n schema: S.Struct({\n query: S.String.annotations({\n description: `\n A valid cypher query string to execute.\n Query must have one MATCH clause.\n Match clause can have multiple patterns but they must all be connected via a relationship chain.\n Query might have zero or one WHERE clauses.\n Query must have one RETURN clause.\n RETURN clause can have multiple expressions separated by commas.\n DISTINCT keyword is not allowed.\n\n <example>\n MATCH (n:Person) RETURN n.name\n </example>\n\n <example>\n MATCH (s:Studio)-[:PRODUCED]->(m:Movie)-[:PRODUCED_IN]->(c:City {name: \"Las Vegas\"}) RETURN s\n </example>\n \n <example>\n 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\n </example>\n `,\n }),\n }),\n execute: async ({ query }) => {\n try {\n log('cypher query', { query });\n const results = await executeQuery(dataSource, query);\n log('query complete', { results });\n return ToolResult.Success(results);\n } catch (e: any) {\n log.catch(e);\n return ToolResult.Error(e.message);\n }\n },\n });\n\nexport const createSystemPrompt = (schemaTypes: S.Schema.Any[]) => trim`\n You have access to ECHO graph database. You can query the database to get data to satisfy user prompts.\n\n Database schema is defined in pseud-cypher syntax. The schema is:\n\n <schema>\n ${formatJsonSchemaForLLM(schemaTypes.map((schema) => toJsonSchema(schema)))}\n <schema>\n\n Before replying always think step-by-step on how to proceed.\n Print your thoughts inside <cot> tags.\n \n <example>\n <cot>To answer the question I need to ...</cot>\n </example>\n\n Before answering the user's question, decide what tools you need to use to answer the question.\n`;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type Schema as S } from '@effect/schema';\n\nimport { raise } from '@dxos/debug';\nimport type { EchoDatabase } from '@dxos/echo-db';\nimport { JSON_SCHEMA_ECHO_REF_ID, ObjectId, toJsonSchema, type JsonSchemaType, type Ref } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { create, makeRef } from '@dxos/live-object';\n\nimport {\n type DataSource,\n type Node,\n type Relationship,\n formatInferredRelationshipLabel,\n formatNodeLabel,\n} from '../cypher';\nimport { Contact, Org, Project, Task } from '../testing';\n\nexport const seedTestData = (db: EchoDatabase) => {\n const contactRich = db.add(\n create(Contact, {\n name: 'Rich',\n }),\n );\n const contactJosiah = db.add(\n create(Contact, {\n name: 'Josiah',\n }),\n );\n const contactDima = db.add(\n create(Contact, {\n name: 'Dima',\n }),\n );\n const contactFred = db.add(\n create(Contact, {\n name: 'Fred',\n }),\n );\n\n const projectComposer = db.add(\n create(Project, {\n name: 'Composer',\n }),\n );\n const projectEcho = db.add(\n create(Project, {\n name: 'ECHO',\n }),\n );\n const projectDoodles = db.add(\n create(Project, {\n name: 'Doodles',\n }),\n );\n\n const _taskComposer1 = db.add(\n create(Task, {\n name: 'Optimize startup performance',\n project: makeRef(projectComposer),\n assignee: makeRef(contactJosiah),\n }),\n );\n const _taskComposer2 = db.add(\n create(Task, {\n name: 'Create form builder',\n project: makeRef(projectComposer),\n assignee: makeRef(contactRich),\n }),\n );\n const _taskComposer3 = db.add(\n create(Task, {\n name: 'Add support for custom themes',\n project: makeRef(projectComposer),\n assignee: makeRef(contactJosiah),\n }),\n );\n const _taskComposer5 = db.add(\n create(Task, {\n name: 'Implement community plugin',\n project: makeRef(projectComposer),\n assignee: makeRef(contactFred),\n }),\n );\n const _taskComposer4 = db.add(\n create(Task, {\n name: 'Implement dark mode',\n project: makeRef(projectComposer),\n assignee: makeRef(contactRich),\n }),\n );\n const _taskEcho1 = db.add(\n create(Task, {\n name: 'Implement cypher query engine',\n project: makeRef(projectEcho),\n assignee: makeRef(contactDima),\n }),\n );\n const _taskEcho2 = db.add(\n create(Task, {\n name: 'Add schema editor',\n project: makeRef(projectEcho),\n assignee: makeRef(contactRich),\n }),\n );\n const _taskDoodles1 = db.add(\n create(Task, {\n name: 'Add support for custom themes',\n project: makeRef(projectDoodles),\n assignee: makeRef(contactFred),\n }),\n );\n const _taskDoodles2 = db.add(\n create(Task, {\n name: 'Implement dark mode',\n project: makeRef(projectDoodles),\n assignee: makeRef(contactJosiah),\n }),\n );\n\n const _orgDxos = db.add(\n create(Org, {\n name: 'DXOS',\n employees: [makeRef(contactRich), makeRef(contactJosiah), makeRef(contactDima)],\n projects: [makeRef(projectEcho)],\n }),\n );\n const _orgBraneframe = db.add(\n create(Org, {\n name: 'Braneframe',\n employees: [makeRef(contactJosiah), makeRef(contactRich)],\n projects: [makeRef(projectComposer)],\n }),\n );\n};\n\n// TODO(burdon): Use schema/testing.\nexport const createTestData = (): MockDataSource => {\n const dataSource = new MockDataSource();\n\n const contactRich = dataSource.add(Contact, {\n id: ObjectId.random(),\n name: 'Rich',\n });\n const contactJosiah = dataSource.add(Contact, {\n id: ObjectId.random(),\n name: 'Josiah',\n });\n const contactDima = dataSource.add(Contact, {\n id: ObjectId.random(),\n name: 'Dima',\n });\n const contactFred = dataSource.add(Contact, {\n id: ObjectId.random(),\n name: 'Fred',\n });\n\n const projectComposer = dataSource.add(Project, {\n id: ObjectId.random(),\n name: 'Composer',\n });\n const projectEcho = dataSource.add(Project, {\n id: ObjectId.random(),\n name: 'ECHO',\n });\n const projectDoodles = dataSource.add(Project, {\n id: ObjectId.random(),\n name: 'Doodles',\n });\n\n const _taskComposer1 = dataSource.add(Task, {\n id: ObjectId.random(),\n name: 'Optimize startup performance',\n project: makeRef(projectComposer),\n assignee: makeRef(contactJosiah),\n });\n const _taskComposer2 = dataSource.add(Task, {\n id: ObjectId.random(),\n name: 'Create form builder',\n project: makeRef(projectComposer),\n assignee: makeRef(contactRich),\n });\n const _taskComposer3 = dataSource.add(Task, {\n id: ObjectId.random(),\n name: 'Add support for custom themes',\n project: makeRef(projectComposer),\n assignee: makeRef(contactJosiah),\n });\n const _taskComposer5 = dataSource.add(Task, {\n id: ObjectId.random(),\n name: 'Implement community plugin',\n project: makeRef(projectComposer),\n assignee: makeRef(contactFred),\n });\n const _taskComposer4 = dataSource.add(Task, {\n id: ObjectId.random(),\n name: 'Implement dark mode',\n project: makeRef(projectComposer),\n assignee: makeRef(contactRich),\n });\n const _taskEcho1 = dataSource.add(Task, {\n id: ObjectId.random(),\n name: 'Implement cypher query engine',\n project: makeRef(projectEcho),\n assignee: makeRef(contactDima),\n });\n const _taskEcho2 = dataSource.add(Task, {\n id: ObjectId.random(),\n name: 'Add schema editor',\n project: makeRef(projectEcho),\n assignee: makeRef(contactRich),\n });\n const _taskDoodles1 = dataSource.add(Task, {\n id: ObjectId.random(),\n name: 'Add support for custom themes',\n project: makeRef(projectDoodles),\n assignee: makeRef(contactFred),\n });\n const _taskDoodles2 = dataSource.add(Task, {\n id: ObjectId.random(),\n name: 'Implement dark mode',\n project: makeRef(projectDoodles),\n assignee: makeRef(contactJosiah),\n });\n\n const _orgDxos = dataSource.add(Org, {\n id: ObjectId.random(),\n name: 'DXOS',\n employees: [makeRef(contactRich), makeRef(contactJosiah), makeRef(contactDima)],\n projects: [makeRef(projectEcho)],\n });\n const _orgBraneframe = dataSource.add(Org, {\n id: ObjectId.random(),\n name: 'Braneframe',\n employees: [makeRef(contactJosiah), makeRef(contactRich)],\n projects: [makeRef(projectComposer)],\n });\n dataSource.computeGraph();\n\n return dataSource;\n};\n\nexport class MockDataSource implements DataSource {\n objects: Record<\n string,\n {\n schema: S.Schema.All;\n typeDxn: string;\n id: string;\n data: unknown;\n }\n > = {};\n\n schema: Record<\n string,\n {\n json: JsonSchemaType;\n instance: S.Schema.All;\n }\n > = {};\n\n nodes: Node[] = [];\n relationships: Relationship[] = [];\n\n async getNodes({ label }: { label?: string }) {\n return this.nodes.filter((node) => !label || node.label === label);\n }\n\n async getRelationships({ label }: { label?: string }) {\n return this.relationships.filter((relationship) => !label || relationship.label === label);\n }\n\n add<S extends S.Schema.All>(schema: S, data: S.Schema.Type<S>) {\n invariant(typeof data.id === 'string', 'Data must have an id');\n const jsonSchema = toJsonSchema(schema);\n if (!this.schema[jsonSchema.$id!]) {\n this.schema[jsonSchema.$id!] = {\n json: jsonSchema,\n instance: schema,\n };\n }\n\n const typenameDxn = jsonSchema.$id ?? raise(new Error('Schema must have $id'));\n\n this.objects[data.id] = {\n schema,\n id: data.id,\n typeDxn: typenameDxn,\n data,\n };\n\n return data;\n }\n\n computeGraph() {\n this.nodes = [];\n this.relationships = [];\n\n for (const object of Object.values(this.objects)) {\n this.nodes.push({\n kind: 'node',\n id: object.id,\n label: formatNodeLabel(object.typeDxn),\n properties: object.data as any,\n });\n }\n\n for (const object of Object.values(this.objects)) {\n const schema = this.schema[object.typeDxn].json;\n const typenameDxn = schema.$id ?? raise(new Error('Schema must have $id'));\n\n for (const [name, propSchema] of Object.entries(schema.properties!)) {\n if (propSchema.$id === JSON_SCHEMA_ECHO_REF_ID) {\n const label = formatInferredRelationshipLabel(typenameDxn, name);\n\n const source = this.nodes.find((node) => node.id === object.id);\n if (!source) {\n continue;\n }\n\n const { id: targetId } = (object.data as any)[name].target;\n\n const target = this.nodes.find((node) => node.id === targetId);\n if (!target) {\n continue;\n }\n\n this.relationships.push({\n kind: 'relationship',\n id: `${object.id}-${name}-${target.id}`,\n label,\n properties: {},\n source,\n target,\n });\n } else if (\n propSchema.type === 'array' &&\n propSchema.items &&\n typeof propSchema.items === 'object' &&\n '$id' in propSchema.items &&\n propSchema.items.$id === JSON_SCHEMA_ECHO_REF_ID\n ) {\n const label = formatInferredRelationshipLabel(typenameDxn, name);\n\n const source = this.nodes.find((node) => node.id === object.id);\n if (!source) {\n continue;\n }\n\n for (const { id: targetId } of (object.data as any)[name].map((x: Ref<any>) => x.target)) {\n const target = this.nodes.find((node) => node.id === targetId);\n if (!target) {\n continue;\n }\n\n this.relationships.push({\n kind: 'relationship',\n id: `${object.id}-${name}-${targetId}`,\n label,\n properties: {},\n source,\n target,\n });\n }\n }\n }\n }\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Schema as S } from '@effect/schema';\n\nimport { EntityKind, ObjectAnnotationId, Ref } from '@dxos/echo-schema';\n\n// TODO(burdon): Reconcile with sdk/schema/testing.\n// TODO(burdon): Convert interface to type.\n\n// TODO(dmaretskyi): Extract.\nexport const ObjectId = S.String.annotations({ description: 'The unique object identifier.' });\n\nexport const Contact = S.Struct({\n id: ObjectId,\n name: S.String.annotations({ description: 'The name of the person.' }),\n email: S.optional(S.String).annotations({ description: 'Email address.' }),\n})\n .pipe(S.mutable)\n .annotations({\n [ObjectAnnotationId]: {\n kind: EntityKind.Object,\n typename: 'example.com/type/Contact',\n version: '0.1.0',\n },\n description: 'Contact information.',\n });\nexport interface Contact extends S.Schema.Type<typeof Contact> {}\n\nexport const Project = S.Struct({\n id: ObjectId,\n name: S.String.annotations({ description: 'The name of the project.' }),\n description: S.optional(S.String).annotations({ description: 'The description of the project.' }),\n})\n .pipe(S.mutable)\n .annotations({\n [ObjectAnnotationId]: {\n kind: EntityKind.Object,\n typename: 'example.com/type/Project',\n version: '0.1.0',\n },\n description: 'Contact information.',\n });\nexport interface Project extends S.Schema.Type<typeof Project> {}\n\nexport const Task = S.Struct({\n id: ObjectId,\n name: S.String.annotations({ description: 'The name of the task.' }),\n description: S.optional(S.String).annotations({ description: 'The description of the task.' }),\n project: Ref(Project),\n assignee: Ref(Contact),\n})\n .pipe(S.mutable)\n .annotations({\n [ObjectAnnotationId]: {\n kind: EntityKind.Object,\n typename: 'example.com/type/Task',\n version: '0.1.0',\n },\n description: 'Contact information.',\n });\nexport interface Task extends S.Schema.Type<typeof Task> {}\n\nexport const Org = S.Struct({\n id: ObjectId,\n name: S.String.annotations({ description: 'The name of the organization.' }),\n projects: S.Array(Ref(Project)),\n employees: S.Array(Ref(Contact)),\n})\n .pipe(S.mutable)\n .annotations({\n [ObjectAnnotationId]: {\n kind: EntityKind.Object,\n typename: 'example.com/type/Org',\n version: '0.1.0',\n },\n description: 'Contact information.',\n });\nexport interface Org extends S.Schema.Type<typeof Org> {}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\n// TODO(burdon): Remove/Reconcile with @dxos/assistant-testing.\nexport const AI_SERVICE_ENDPOINT = {\n LOCAL: 'http://localhost:8788',\n REMOTE: 'https://ai-service.dxos.workers.dev',\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport type { ImageSource, MessageContentBlock } from '@dxos/artifact';\n\nimport type { ConversationEvent } from '../conversation';\n\nexport const createLogger = ({\n stream,\n filter,\n onImage,\n}: {\n stream?: boolean;\n filter?: (event: ConversationEvent) => boolean;\n onImage?: (img: { id: string; description?: string; source: ImageSource }) => void;\n} = {}) => {\n const images: Record<string, any> = {};\n let currentText = '';\n\n return (event: ConversationEvent) => {\n if (typeof filter === 'function' && !filter(event)) {\n return;\n }\n\n const printContentBlock = (content: MessageContentBlock) => {\n switch (content.type) {\n case 'text':\n process.stdout.write(content.text);\n break;\n case 'tool_use':\n process.stdout.write(`⚙️ [Tool Use] ${content.name}\\n`);\n break;\n case 'image': {\n if (content.id && content.source) {\n images[content.id] = content.source;\n }\n process.stdout.write(`[Image id=${content.id} mediaType=${content.source?.mediaType}]`);\n break;\n }\n }\n };\n\n const onTextBlockPrinted = (text: string) => {\n const imageMatch = text.match(/<image id=\"([^\"]+)\"(?:\\s+prompt=\"([^\"]+)\")?\\s*\\/>/);\n if (imageMatch && onImage && images[imageMatch[1]]) {\n onImage({\n id: imageMatch[1],\n description: imageMatch[2], // Extract prompt as description if present\n source: images[imageMatch[1]],\n });\n }\n };\n\n if (stream) {\n switch (event.type) {\n case 'message_start': {\n process.stdout.write(`${event.message.role.toUpperCase()}\\n\\n`);\n for (const content of event.message.content) {\n printContentBlock(content);\n }\n break;\n }\n case 'content_block_start': {\n currentText = '';\n printContentBlock(event.content);\n break;\n }\n case 'content_block_delta': {\n switch (event.delta.type) {\n case 'text_delta': {\n currentText += event.delta.text;\n process.stdout.write(event.delta.text);\n break;\n }\n case 'input_json_delta': {\n process.stdout.write(event.delta.partial_json);\n break;\n }\n }\n break;\n }\n case 'content_block_stop': {\n process.stdout.write('\\n');\n onTextBlockPrinted(currentText);\n currentText = '';\n break;\n }\n case 'message_delta': {\n break;\n }\n case 'message_stop': {\n process.stdout.write('\\n\\n');\n break;\n }\n }\n }\n\n switch (event.type) {\n case 'message': {\n if (!stream || event.message.role !== 'assistant') {\n process.stdout.write(`${event.message.role.toUpperCase()}\\n\\n`);\n for (const block of event.message.content) {\n switch (block.type) {\n case 'text':\n process.stdout.write(block.text + '\\n');\n onTextBlockPrinted(block.text);\n break;\n case 'tool_use':\n process.stdout.write(`⚙️ [Tool Use] ${block.name}\\n`);\n process.stdout.write(` ${JSON.stringify(block.input)}\\n`);\n break;\n case 'tool_result':\n if (block.isError) {\n process.stdout.write('❌ [Tool Error]\\n');\n process.stdout.write(block.content + '\\n');\n } else {\n process.stdout.write('✅ [Tool Success]\\n');\n process.stdout.write(block.content + '\\n');\n }\n }\n process.stdout.write('\\n\\n');\n }\n }\n break;\n }\n }\n };\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Schema as S } from '@effect/schema';\n\nimport { defineTool, ToolResult } from '@dxos/artifact';\nimport { toJsonSchema } from '@dxos/echo-schema';\nimport { log } from '@dxos/log';\n\nimport { executeQuery, formatJsonSchemaForLLM, type DataSource } from '../cypher';\nimport { trim } from '../util';\n\nexport const createCypherTool = (dataSource: DataSource, schemaTypes: S.Schema.Any[] = []) =>\n defineTool({\n name: 'graphQuery',\n description:\n 'Query the ECHO graph database in cypher query language. Returns data from the database.' +\n (schemaTypes.length > 0 ? `\\n\\n${createSystemPrompt(schemaTypes)}` : ''),\n schema: S.Struct({\n query: S.String.annotations({\n description: `\n A valid cypher query string to execute.\n Query must have one MATCH clause.\n Match clause can have multiple patterns but they must all be connected via a relationship chain.\n Query might have zero or one WHERE clauses.\n Query must have one RETURN clause.\n RETURN clause can have multiple expressions separated by commas.\n DISTINCT keyword is not allowed.\n\n <example>\n MATCH (n:Person) RETURN n.name\n </example>\n\n <example>\n MATCH (s:Studio)-[:PRODUCED]->(m:Movie)-[:PRODUCED_IN]->(c:City {name: \"Las Vegas\"}) RETURN s\n </example>\n \n <example>\n 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\n </example>\n `,\n }),\n }),\n execute: async ({ query }) => {\n try {\n log('cypher query', { query });\n const results = await executeQuery(dataSource, query);\n log('query complete', { results });\n return ToolResult.Success(results);\n } catch (e: any) {\n log.catch(e);\n return ToolResult.Error(e.message);\n }\n },\n });\n\nexport const createSystemPrompt = (schemaTypes: S.Schema.Any[]) => trim`\n You have access to ECHO graph database. You can query the database to get data to satisfy user prompts.\n\n Database schema is defined in pseud-cypher syntax. The schema is:\n\n <schema>\n ${formatJsonSchemaForLLM(schemaTypes.map((schema) => toJsonSchema(schema)))}\n <schema>\n\n Before replying always think step-by-step on how to proceed.\n Print your thoughts inside <cot> tags.\n \n <example>\n <cot>To answer the question I need to ...</cot>\n </example>\n\n Before answering the user's question, decide what tools you need to use to answer the question.\n`;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type Schema as S } from '@effect/schema';\n\nimport { raise } from '@dxos/debug';\nimport type { EchoDatabase } from '@dxos/echo-db';\nimport { JSON_SCHEMA_ECHO_REF_ID, ObjectId, toJsonSchema, type JsonSchemaType, type Ref } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { create, makeRef } from '@dxos/live-object';\n\nimport {\n type DataSource,\n type Node,\n type Relationship,\n formatInferredRelationshipLabel,\n formatNodeLabel,\n} from '../cypher';\nimport { Contact, Org, Project, Task } from '../testing';\n\nexport const seedTestData = (db: EchoDatabase) => {\n const contactRich = db.add(\n create(Contact, {\n name: 'Rich',\n }),\n );\n const contactJosiah = db.add(\n create(Contact, {\n name: 'Josiah',\n }),\n );\n const contactDima = db.add(\n create(Contact, {\n name: 'Dima',\n }),\n );\n const contactFred = db.add(\n create(Contact, {\n name: 'Fred',\n }),\n );\n\n const projectComposer = db.add(\n create(Project, {\n name: 'Composer',\n }),\n );\n const projectEcho = db.add(\n create(Project, {\n name: 'ECHO',\n }),\n );\n const projectDoodles = db.add(\n create(Project, {\n name: 'Doodles',\n }),\n );\n\n const _taskComposer1 = db.add(\n create(Task, {\n name: 'Optimize startup performance',\n project: makeRef(projectComposer),\n assignee: makeRef(contactJosiah),\n }),\n );\n const _taskComposer2 = db.add(\n create(Task, {\n name: 'Create form builder',\n project: makeRef(projectComposer),\n assignee: makeRef(contactRich),\n }),\n );\n const _taskComposer3 = db.add(\n create(Task, {\n name: 'Add support for custom themes',\n project: makeRef(projectComposer),\n assignee: makeRef(contactJosiah),\n }),\n );\n const _taskComposer5 = db.add(\n create(Task, {\n name: 'Implement community plugin',\n project: makeRef(projectComposer),\n assignee: makeRef(contactFred),\n }),\n );\n const _taskComposer4 = db.add(\n create(Task, {\n name: 'Implement dark mode',\n project: makeRef(projectComposer),\n assignee: makeRef(contactRich),\n }),\n );\n const _taskEcho1 = db.add(\n create(Task, {\n name: 'Implement cypher query engine',\n project: makeRef(projectEcho),\n assignee: makeRef(contactDima),\n }),\n );\n const _taskEcho2 = db.add(\n create(Task, {\n name: 'Add schema editor',\n project: makeRef(projectEcho),\n assignee: makeRef(contactRich),\n }),\n );\n const _taskDoodles1 = db.add(\n create(Task, {\n name: 'Add support for custom themes',\n project: makeRef(projectDoodles),\n assignee: makeRef(contactFred),\n }),\n );\n const _taskDoodles2 = db.add(\n create(Task, {\n name: 'Implement dark mode',\n project: makeRef(projectDoodles),\n assignee: makeRef(contactJosiah),\n }),\n );\n\n const _orgDxos = db.add(\n create(Org, {\n name: 'DXOS',\n employees: [makeRef(contactRich), makeRef(contactJosiah), makeRef(contactDima)],\n projects: [makeRef(projectEcho)],\n }),\n );\n const _orgBraneframe = db.add(\n create(Org, {\n name: 'Braneframe',\n employees: [makeRef(contactJosiah), makeRef(contactRich)],\n projects: [makeRef(projectComposer)],\n }),\n );\n};\n\n// TODO(burdon): Use schema/testing.\nexport const createTestData = (): MockDataSource => {\n const dataSource = new MockDataSource();\n\n const contactRich = dataSource.add(Contact, {\n id: ObjectId.random(),\n name: 'Rich',\n });\n const contactJosiah = dataSource.add(Contact, {\n id: ObjectId.random(),\n name: 'Josiah',\n });\n const contactDima = dataSource.add(Contact, {\n id: ObjectId.random(),\n name: 'Dima',\n });\n const contactFred = dataSource.add(Contact, {\n id: ObjectId.random(),\n name: 'Fred',\n });\n\n const projectComposer = dataSource.add(Project, {\n id: ObjectId.random(),\n name: 'Composer',\n });\n const projectEcho = dataSource.add(Project, {\n id: ObjectId.random(),\n name: 'ECHO',\n });\n const projectDoodles = dataSource.add(Project, {\n id: ObjectId.random(),\n name: 'Doodles',\n });\n\n const _taskComposer1 = dataSource.add(Task, {\n id: ObjectId.random(),\n name: 'Optimize startup performance',\n project: makeRef(projectComposer),\n assignee: makeRef(contactJosiah),\n });\n const _taskComposer2 = dataSource.add(Task, {\n id: ObjectId.random(),\n name: 'Create form builder',\n project: makeRef(projectComposer),\n assignee: makeRef(contactRich),\n });\n const _taskComposer3 = dataSource.add(Task, {\n id: ObjectId.random(),\n name: 'Add support for custom themes',\n project: makeRef(projectComposer),\n assignee: makeRef(contactJosiah),\n });\n const _taskComposer5 = dataSource.add(Task, {\n id: ObjectId.random(),\n name: 'Implement community plugin',\n project: makeRef(projectComposer),\n assignee: makeRef(contactFred),\n });\n const _taskComposer4 = dataSource.add(Task, {\n id: ObjectId.random(),\n name: 'Implement dark mode',\n project: makeRef(projectComposer),\n assignee: makeRef(contactRich),\n });\n const _taskEcho1 = dataSource.add(Task, {\n id: ObjectId.random(),\n name: 'Implement cypher query engine',\n project: makeRef(projectEcho),\n assignee: makeRef(contactDima),\n });\n const _taskEcho2 = dataSource.add(Task, {\n id: ObjectId.random(),\n name: 'Add schema editor',\n project: makeRef(projectEcho),\n assignee: makeRef(contactRich),\n });\n const _taskDoodles1 = dataSource.add(Task, {\n id: ObjectId.random(),\n name: 'Add support for custom themes',\n project: makeRef(projectDoodles),\n assignee: makeRef(contactFred),\n });\n const _taskDoodles2 = dataSource.add(Task, {\n id: ObjectId.random(),\n name: 'Implement dark mode',\n project: makeRef(projectDoodles),\n assignee: makeRef(contactJosiah),\n });\n\n const _orgDxos = dataSource.add(Org, {\n id: ObjectId.random(),\n name: 'DXOS',\n employees: [makeRef(contactRich), makeRef(contactJosiah), makeRef(contactDima)],\n projects: [makeRef(projectEcho)],\n });\n const _orgBraneframe = dataSource.add(Org, {\n id: ObjectId.random(),\n name: 'Braneframe',\n employees: [makeRef(contactJosiah), makeRef(contactRich)],\n projects: [makeRef(projectComposer)],\n });\n dataSource.computeGraph();\n\n return dataSource;\n};\n\nexport class MockDataSource implements DataSource {\n objects: Record<\n string,\n {\n schema: S.Schema.All;\n typeDxn: string;\n id: string;\n data: unknown;\n }\n > = {};\n\n schema: Record<\n string,\n {\n json: JsonSchemaType;\n instance: S.Schema.All;\n }\n > = {};\n\n nodes: Node[] = [];\n relationships: Relationship[] = [];\n\n async getNodes({ label }: { label?: string }) {\n return this.nodes.filter((node) => !label || node.label === label);\n }\n\n async getRelationships({ label }: { label?: string }) {\n return this.relationships.filter((relationship) => !label || relationship.label === label);\n }\n\n add<S extends S.Schema.All>(schema: S, data: S.Schema.Type<S>) {\n invariant(typeof data.id === 'string', 'Data must have an id');\n const jsonSchema = toJsonSchema(schema);\n if (!this.schema[jsonSchema.$id!]) {\n this.schema[jsonSchema.$id!] = {\n json: jsonSchema,\n instance: schema,\n };\n }\n\n const typenameDxn = jsonSchema.$id ?? raise(new Error('Schema must have $id'));\n\n this.objects[data.id] = {\n schema,\n id: data.id,\n typeDxn: typenameDxn,\n data,\n };\n\n return data;\n }\n\n computeGraph() {\n this.nodes = [];\n this.relationships = [];\n\n for (const object of Object.values(this.objects)) {\n this.nodes.push({\n kind: 'node',\n id: object.id,\n label: formatNodeLabel(object.typeDxn),\n properties: object.data as any,\n });\n }\n\n for (const object of Object.values(this.objects)) {\n const schema = this.schema[object.typeDxn].json;\n const typenameDxn = schema.$id ?? raise(new Error('Schema must have $id'));\n\n for (const [name, propSchema] of Object.entries(schema.properties!)) {\n if (propSchema.$id === JSON_SCHEMA_ECHO_REF_ID) {\n const label = formatInferredRelationshipLabel(typenameDxn, name);\n\n const source = this.nodes.find((node) => node.id === object.id);\n if (!source) {\n continue;\n }\n\n const { id: targetId } = (object.data as any)[name].target;\n\n const target = this.nodes.find((node) => node.id === targetId);\n if (!target) {\n continue;\n }\n\n this.relationships.push({\n kind: 'relationship',\n id: `${object.id}-${name}-${target.id}`,\n label,\n properties: {},\n source,\n target,\n });\n } else if (\n propSchema.type === 'array' &&\n propSchema.items &&\n typeof propSchema.items === 'object' &&\n '$id' in propSchema.items &&\n propSchema.items.$id === JSON_SCHEMA_ECHO_REF_ID\n ) {\n const label = formatInferredRelationshipLabel(typenameDxn, name);\n\n const source = this.nodes.find((node) => node.id === object.id);\n if (!source) {\n continue;\n }\n\n for (const { id: targetId } of (object.data as any)[name].map((x: Ref<any>) => x.target)) {\n const target = this.nodes.find((node) => node.id === targetId);\n if (!target) {\n continue;\n }\n\n this.relationships.push({\n kind: 'relationship',\n id: `${object.id}-${name}-${targetId}`,\n label,\n properties: {},\n source,\n target,\n });\n }\n }\n }\n }\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Schema as S } from '@effect/schema';\n\nimport { EntityKind, ObjectAnnotationId, Ref } from '@dxos/echo-schema';\n\n// TODO(burdon): Reconcile with sdk/schema/testing.\n// TODO(burdon): Convert interface to type.\n\n// TODO(dmaretskyi): Extract.\nexport const ObjectId = S.String.annotations({ description: 'The unique object identifier.' });\n\nexport const Contact = S.Struct({\n id: ObjectId,\n name: S.String.annotations({ description: 'The name of the person.' }),\n email: S.optional(S.String).annotations({ description: 'Email address.' }),\n})\n .pipe(S.mutable)\n .annotations({\n [ObjectAnnotationId]: {\n kind: EntityKind.Object,\n typename: 'example.com/type/Contact',\n version: '0.1.0',\n },\n description: 'Contact information.',\n });\nexport interface Contact extends S.Schema.Type<typeof Contact> {}\n\nexport const Project = S.Struct({\n id: ObjectId,\n name: S.String.annotations({ description: 'The name of the project.' }),\n description: S.optional(S.String).annotations({ description: 'The description of the project.' }),\n})\n .pipe(S.mutable)\n .annotations({\n [ObjectAnnotationId]: {\n kind: EntityKind.Object,\n typename: 'example.com/type/Project',\n version: '0.1.0',\n },\n description: 'Contact information.',\n });\nexport interface Project extends S.Schema.Type<typeof Project> {}\n\nexport const Task = S.Struct({\n id: ObjectId,\n name: S.String.annotations({ description: 'The name of the task.' }),\n description: S.optional(S.String).annotations({ description: 'The description of the task.' }),\n project: Ref(Project),\n assignee: Ref(Contact),\n})\n .pipe(S.mutable)\n .annotations({\n [ObjectAnnotationId]: {\n kind: EntityKind.Object,\n typename: 'example.com/type/Task',\n version: '0.1.0',\n },\n description: 'Contact information.',\n });\nexport interface Task extends S.Schema.Type<typeof Task> {}\n\nexport const Org = S.Struct({\n id: ObjectId,\n name: S.String.annotations({ description: 'The name of the organization.' }),\n projects: S.Array(Ref(Project)),\n employees: S.Array(Ref(Contact)),\n})\n .pipe(S.mutable)\n .annotations({\n [ObjectAnnotationId]: {\n kind: EntityKind.Object,\n typename: 'example.com/type/Org',\n version: '0.1.0',\n },\n description: 'Contact information.',\n });\nexport interface Org extends S.Schema.Type<typeof Org> {}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["import_echo_schema", "import_schema", "AI_SERVICE_ENDPOINT", "LOCAL", "REMOTE", "createLogger", "stream", "filter", "onImage", "images", "currentText", "event", "printContentBlock", "content", "type", "process", "stdout", "write", "text", "name", "id", "source", "mediaType", "onTextBlockPrinted", "imageMatch", "match", "description", "message", "role", "toUpperCase", "delta", "partial_json", "block", "JSON", "stringify", "input", "isError", "createCypherTool", "dataSource", "schemaTypes", "defineTool", "length", "createSystemPrompt", "schema", "S", "Struct", "query", "String", "annotations", "execute", "log", "results", "executeQuery", "ToolResult", "Success", "e", "catch", "Error", "trim", "formatJsonSchemaForLLM", "map", "toJsonSchema", "seedTestData", "db", "contactRich", "add", "create", "Contact", "contactJosiah", "contactDima", "contactFred", "projectComposer", "Project", "projectEcho", "projectDoodles", "_taskComposer1", "Task", "project", "makeRef", "assignee", "_taskComposer2", "_taskComposer3", "_taskComposer5", "_taskComposer4", "_taskEcho1", "_taskEcho2", "_taskDoodles1", "_taskDoodles2", "_orgDxos", "Org", "employees", "projects", "_orgBraneframe", "createTestData", "MockDataSource", "ObjectId", "random", "computeGraph", "objects", "nodes", "relationships", "getNodes", "label", "node", "getRelationships", "relationship", "data", "invariant", "jsonSchema", "$id", "json", "instance", "typenameDxn", "raise", "typeDxn", "object", "Object", "values", "push", "kind", "formatNodeLabel", "properties", "propSchema", "entries", "JSON_SCHEMA_ECHO_REF_ID", "formatInferredRelationshipLabel", "find", "targetId", "target", "items", "x", "email", "optional", "pipe", "mutable", "ObjectAnnotationId", "EntityKind", "typename", "version", "Ref", "Array"]
|
|
7
7
|
}
|
|
@@ -14,6 +14,7 @@ import {
|
|
|
14
14
|
import { Schema as S } from "@effect/schema";
|
|
15
15
|
import { Message } from "@dxos/artifact";
|
|
16
16
|
import { invariant } from "@dxos/invariant";
|
|
17
|
+
import { log as log2 } from "@dxos/log";
|
|
17
18
|
|
|
18
19
|
// packages/experimental/assistant/src/ai-service/stream.ts
|
|
19
20
|
import { Trigger } from "@dxos/async";
|
|
@@ -355,7 +356,7 @@ var AIServiceClientImpl = class {
|
|
|
355
356
|
constructor({ endpoint }) {
|
|
356
357
|
invariant(endpoint, "endpoint is required", {
|
|
357
358
|
F: __dxlog_file2,
|
|
358
|
-
L:
|
|
359
|
+
L: 37,
|
|
359
360
|
S: this,
|
|
360
361
|
A: [
|
|
361
362
|
"endpoint",
|
|
@@ -397,6 +398,18 @@ var AIServiceClientImpl = class {
|
|
|
397
398
|
* Open message stream.
|
|
398
399
|
*/
|
|
399
400
|
async generate(request) {
|
|
401
|
+
request = {
|
|
402
|
+
tools: request.tools ?? [],
|
|
403
|
+
...request
|
|
404
|
+
};
|
|
405
|
+
log2.info("requesting", {
|
|
406
|
+
endpoint: this._endpoint
|
|
407
|
+
}, {
|
|
408
|
+
F: __dxlog_file2,
|
|
409
|
+
L: 84,
|
|
410
|
+
S: this,
|
|
411
|
+
C: (f, a) => f(...a)
|
|
412
|
+
});
|
|
400
413
|
const controller = new AbortController();
|
|
401
414
|
const response = await fetch(`${this._endpoint}/generate`, {
|
|
402
415
|
signal: controller.signal,
|
|
@@ -408,7 +421,7 @@ var AIServiceClientImpl = class {
|
|
|
408
421
|
});
|
|
409
422
|
invariant(response.body instanceof ReadableStream, void 0, {
|
|
410
423
|
F: __dxlog_file2,
|
|
411
|
-
L:
|
|
424
|
+
L: 93,
|
|
412
425
|
S: this,
|
|
413
426
|
A: [
|
|
414
427
|
"response.body instanceof ReadableStream",
|
|
@@ -419,12 +432,29 @@ var AIServiceClientImpl = class {
|
|
|
419
432
|
}
|
|
420
433
|
};
|
|
421
434
|
|
|
435
|
+
// packages/experimental/assistant/src/ai-service/defs.ts
|
|
436
|
+
var DEFAULT_LLM_MODEL = "@anthropic/claude-3-5-sonnet-20241022";
|
|
437
|
+
var DEFAULT_LLM_MODELS = [
|
|
438
|
+
// AI Gateway.
|
|
439
|
+
// https://developers.cloudflare.com/ai-gateway
|
|
440
|
+
"@anthropic/claude-3-5-haiku-20241022",
|
|
441
|
+
"@anthropic/claude-3-5-sonnet-20241022",
|
|
442
|
+
"@anthropic/claude-3-7-sonnet-20250219",
|
|
443
|
+
// Workers AI.
|
|
444
|
+
// https://developers.cloudflare.com/workers-ai/models
|
|
445
|
+
"@cf/deepseek-ai/deepseek-r1-distill-qwen-32b",
|
|
446
|
+
"@hf/nousresearch/hermes-2-pro-mistral-7b",
|
|
447
|
+
"@ollama/llama-3-1-nemotron-70b-instruct",
|
|
448
|
+
"@ollama/llama-3-1-nemotron-mini-4b-instruct",
|
|
449
|
+
"@ollama/llama-3-2-3b"
|
|
450
|
+
];
|
|
451
|
+
|
|
422
452
|
// packages/experimental/assistant/src/ai-service/parser.ts
|
|
423
453
|
import { Message as Message2 } from "@dxos/artifact";
|
|
424
454
|
import { Event } from "@dxos/async";
|
|
425
455
|
import { createStatic } from "@dxos/echo-schema";
|
|
426
456
|
import { invariant as invariant2 } from "@dxos/invariant";
|
|
427
|
-
import { log as
|
|
457
|
+
import { log as log3 } from "@dxos/log";
|
|
428
458
|
import { isNotFalsy, safeParseJson } from "@dxos/util";
|
|
429
459
|
|
|
430
460
|
// packages/experimental/assistant/src/ai-service/transform.ts
|
|
@@ -567,6 +597,7 @@ var MixedStreamParser = class {
|
|
|
567
597
|
let contentBlock;
|
|
568
598
|
let streamBlock;
|
|
569
599
|
const stack = [];
|
|
600
|
+
const messagesCollected = [];
|
|
570
601
|
for await (const event of stream) {
|
|
571
602
|
switch (event.type) {
|
|
572
603
|
//
|
|
@@ -574,9 +605,9 @@ var MixedStreamParser = class {
|
|
|
574
605
|
//
|
|
575
606
|
case "message_start": {
|
|
576
607
|
if (this._message) {
|
|
577
|
-
|
|
608
|
+
log3.warn("unexpected message_start", void 0, {
|
|
578
609
|
F: __dxlog_file3,
|
|
579
|
-
L:
|
|
610
|
+
L: 88,
|
|
580
611
|
S: this,
|
|
581
612
|
C: (f, a) => f(...a)
|
|
582
613
|
});
|
|
@@ -590,9 +621,9 @@ var MixedStreamParser = class {
|
|
|
590
621
|
}
|
|
591
622
|
case "message_delta": {
|
|
592
623
|
if (!this._message) {
|
|
593
|
-
|
|
624
|
+
log3.warn("unexpected message_delta", void 0, {
|
|
594
625
|
F: __dxlog_file3,
|
|
595
|
-
L:
|
|
626
|
+
L: 98,
|
|
596
627
|
S: this,
|
|
597
628
|
C: (f, a) => f(...a)
|
|
598
629
|
});
|
|
@@ -601,13 +632,14 @@ var MixedStreamParser = class {
|
|
|
601
632
|
}
|
|
602
633
|
case "message_stop": {
|
|
603
634
|
if (!this._message) {
|
|
604
|
-
|
|
635
|
+
log3.warn("unexpected message_stop", void 0, {
|
|
605
636
|
F: __dxlog_file3,
|
|
606
|
-
L:
|
|
637
|
+
L: 106,
|
|
607
638
|
S: this,
|
|
608
639
|
C: (f, a) => f(...a)
|
|
609
640
|
});
|
|
610
641
|
} else {
|
|
642
|
+
messagesCollected.push(this._message);
|
|
611
643
|
this._message = void 0;
|
|
612
644
|
}
|
|
613
645
|
break;
|
|
@@ -617,11 +649,11 @@ var MixedStreamParser = class {
|
|
|
617
649
|
//
|
|
618
650
|
case "content_block_start": {
|
|
619
651
|
if (contentBlock) {
|
|
620
|
-
|
|
652
|
+
log3.warn("unexpected content_block_start", {
|
|
621
653
|
content: contentBlock
|
|
622
654
|
}, {
|
|
623
655
|
F: __dxlog_file3,
|
|
624
|
-
L:
|
|
656
|
+
L: 120,
|
|
625
657
|
S: this,
|
|
626
658
|
C: (f, a) => f(...a)
|
|
627
659
|
});
|
|
@@ -631,9 +663,9 @@ var MixedStreamParser = class {
|
|
|
631
663
|
}
|
|
632
664
|
case "content_block_delta": {
|
|
633
665
|
if (!contentBlock) {
|
|
634
|
-
|
|
666
|
+
log3.warn("unexpected content_block_delta", void 0, {
|
|
635
667
|
F: __dxlog_file3,
|
|
636
|
-
L:
|
|
668
|
+
L: 130,
|
|
637
669
|
S: this,
|
|
638
670
|
C: (f, a) => f(...a)
|
|
639
671
|
});
|
|
@@ -659,7 +691,7 @@ var MixedStreamParser = class {
|
|
|
659
691
|
const top = stack.pop();
|
|
660
692
|
invariant2(top && top.type === "tag", void 0, {
|
|
661
693
|
F: __dxlog_file3,
|
|
662
|
-
L:
|
|
694
|
+
L: 154,
|
|
663
695
|
S: this,
|
|
664
696
|
A: [
|
|
665
697
|
"top && top.type === 'tag'",
|
|
@@ -683,7 +715,7 @@ var MixedStreamParser = class {
|
|
|
683
715
|
const last = streamBlock.content.at(-1);
|
|
684
716
|
invariant2(last, void 0, {
|
|
685
717
|
F: __dxlog_file3,
|
|
686
|
-
L:
|
|
718
|
+
L: 171,
|
|
687
719
|
S: this,
|
|
688
720
|
A: [
|
|
689
721
|
"last",
|
|
@@ -735,11 +767,11 @@ var MixedStreamParser = class {
|
|
|
735
767
|
//
|
|
736
768
|
case "input_json_delta": {
|
|
737
769
|
if (!contentBlock) {
|
|
738
|
-
|
|
770
|
+
log3.warn("unexpected input_json_delta", {
|
|
739
771
|
contentBlock
|
|
740
772
|
}, {
|
|
741
773
|
F: __dxlog_file3,
|
|
742
|
-
L:
|
|
774
|
+
L: 221,
|
|
743
775
|
S: this,
|
|
744
776
|
C: (f, a) => f(...a)
|
|
745
777
|
});
|
|
@@ -760,9 +792,9 @@ var MixedStreamParser = class {
|
|
|
760
792
|
}
|
|
761
793
|
case "content_block_stop": {
|
|
762
794
|
if (!contentBlock) {
|
|
763
|
-
|
|
795
|
+
log3.warn("unexpected content_block_stop", void 0, {
|
|
764
796
|
F: __dxlog_file3,
|
|
765
|
-
L:
|
|
797
|
+
L: 238,
|
|
766
798
|
S: this,
|
|
767
799
|
C: (f, a) => f(...a)
|
|
768
800
|
});
|
|
@@ -778,15 +810,16 @@ var MixedStreamParser = class {
|
|
|
778
810
|
this._emitUpdate(contentBlock, streamBlock);
|
|
779
811
|
}
|
|
780
812
|
}
|
|
813
|
+
return messagesCollected;
|
|
781
814
|
}
|
|
782
815
|
};
|
|
783
816
|
var mergeMessageBlock = (contentBlock, streamBlock) => {
|
|
784
|
-
|
|
817
|
+
log3("mergeMessageBlock", {
|
|
785
818
|
contentBlock,
|
|
786
819
|
streamBlock
|
|
787
820
|
}, {
|
|
788
821
|
F: __dxlog_file3,
|
|
789
|
-
L:
|
|
822
|
+
L: 265,
|
|
790
823
|
S: void 0,
|
|
791
824
|
C: (f, a) => f(...a)
|
|
792
825
|
});
|
|
@@ -853,6 +886,13 @@ var mergeMessageBlock = (contentBlock, streamBlock) => {
|
|
|
853
886
|
})
|
|
854
887
|
};
|
|
855
888
|
}
|
|
889
|
+
case "tool-list": {
|
|
890
|
+
return {
|
|
891
|
+
type: "json",
|
|
892
|
+
disposition: "tool_list",
|
|
893
|
+
json: JSON.stringify({})
|
|
894
|
+
};
|
|
895
|
+
}
|
|
856
896
|
}
|
|
857
897
|
break;
|
|
858
898
|
}
|
|
@@ -883,7 +923,7 @@ import { Schema as S2 } from "@effect/schema";
|
|
|
883
923
|
import { Tool, Message as Message3, SpaceIdSchema } from "@dxos/artifact";
|
|
884
924
|
import { ObjectId } from "@dxos/echo-schema";
|
|
885
925
|
var createArtifactElement = (id) => `<artifact id=${id} />`;
|
|
886
|
-
var LLMModel = S2.Literal(
|
|
926
|
+
var LLMModel = S2.Literal(...DEFAULT_LLM_MODELS);
|
|
887
927
|
var ToolTypes = Object.freeze({
|
|
888
928
|
// TODO(dmaretskyi): Not implemented yet.
|
|
889
929
|
// DatabaseQuery: 'database_query',
|
|
@@ -892,18 +932,20 @@ var ToolTypes = Object.freeze({
|
|
|
892
932
|
var GenerateRequest = S2.Struct({
|
|
893
933
|
spaceId: S2.optional(SpaceIdSchema),
|
|
894
934
|
threadId: S2.optional(ObjectId),
|
|
895
|
-
// TODO(burdon): Make optional with default.
|
|
896
|
-
model: LLMModel,
|
|
897
935
|
/**
|
|
898
|
-
*
|
|
936
|
+
* Preferred model or system default.
|
|
899
937
|
*/
|
|
900
|
-
|
|
901
|
-
// prompt: Message,
|
|
938
|
+
model: S2.optional(LLMModel),
|
|
902
939
|
/**
|
|
903
940
|
* System instructions to the LLM.
|
|
904
941
|
*/
|
|
905
942
|
systemPrompt: S2.optional(S2.String),
|
|
906
943
|
/**
|
|
944
|
+
* Current request.
|
|
945
|
+
*/
|
|
946
|
+
// TODO(burdon): Remove from history.
|
|
947
|
+
// prompt: Message,
|
|
948
|
+
/**
|
|
907
949
|
* History of messages to include in the context window.
|
|
908
950
|
*/
|
|
909
951
|
history: S2.optional(S2.Array(Message3)),
|
|
@@ -917,13 +959,13 @@ var GenerateRequest = S2.Struct({
|
|
|
917
959
|
import { ToolResult, Message as Message4 } from "@dxos/artifact";
|
|
918
960
|
import { createStatic as createStatic2, ObjectId as ObjectId2 } from "@dxos/echo-schema";
|
|
919
961
|
import { invariant as invariant3 } from "@dxos/invariant";
|
|
920
|
-
import { log as
|
|
962
|
+
import { log as log4 } from "@dxos/log";
|
|
921
963
|
var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/experimental/assistant/src/conversation/conversation.ts";
|
|
922
964
|
var runLLM = async (params) => {
|
|
923
965
|
let conversationResult = null;
|
|
924
966
|
const history = params.history ?? [];
|
|
925
967
|
const generate = async () => {
|
|
926
|
-
|
|
968
|
+
log4("llm generate", {
|
|
927
969
|
tools: params.tools
|
|
928
970
|
}, {
|
|
929
971
|
F: __dxlog_file4,
|
|
@@ -955,7 +997,7 @@ var runLLM = async (params) => {
|
|
|
955
997
|
""
|
|
956
998
|
]
|
|
957
999
|
});
|
|
958
|
-
|
|
1000
|
+
log4("llm result", {
|
|
959
1001
|
time: Date.now() - beginTs,
|
|
960
1002
|
message
|
|
961
1003
|
}, {
|
|
@@ -1010,7 +1052,7 @@ var runLLM = async (params) => {
|
|
|
1010
1052
|
const toolResult = await tool.execute(toolCall.input);
|
|
1011
1053
|
switch (toolResult.kind) {
|
|
1012
1054
|
case "error": {
|
|
1013
|
-
|
|
1055
|
+
log4.warn("tool error", {
|
|
1014
1056
|
message: toolResult.message
|
|
1015
1057
|
}, {
|
|
1016
1058
|
F: __dxlog_file4,
|
|
@@ -1040,7 +1082,7 @@ var runLLM = async (params) => {
|
|
|
1040
1082
|
return true;
|
|
1041
1083
|
}
|
|
1042
1084
|
case "success": {
|
|
1043
|
-
|
|
1085
|
+
log4("tool success", {
|
|
1044
1086
|
result: toolResult.result
|
|
1045
1087
|
}, {
|
|
1046
1088
|
F: __dxlog_file4,
|
|
@@ -1069,7 +1111,7 @@ var runLLM = async (params) => {
|
|
|
1069
1111
|
return true;
|
|
1070
1112
|
}
|
|
1071
1113
|
case "break": {
|
|
1072
|
-
|
|
1114
|
+
log4("tool break", {
|
|
1073
1115
|
result: toolResult.result
|
|
1074
1116
|
}, {
|
|
1075
1117
|
F: __dxlog_file4,
|
|
@@ -1135,7 +1177,7 @@ var runTools = async ({ message, tools, extensions }) => {
|
|
|
1135
1177
|
extensions
|
|
1136
1178
|
});
|
|
1137
1179
|
} catch (error) {
|
|
1138
|
-
|
|
1180
|
+
log4("tool error", {
|
|
1139
1181
|
error
|
|
1140
1182
|
}, {
|
|
1141
1183
|
F: __dxlog_file4,
|
|
@@ -1147,7 +1189,7 @@ var runTools = async ({ message, tools, extensions }) => {
|
|
|
1147
1189
|
}
|
|
1148
1190
|
switch (toolResult.kind) {
|
|
1149
1191
|
case "error": {
|
|
1150
|
-
|
|
1192
|
+
log4("tool error", {
|
|
1151
1193
|
message: toolResult.message
|
|
1152
1194
|
}, {
|
|
1153
1195
|
F: __dxlog_file4,
|
|
@@ -1172,7 +1214,7 @@ var runTools = async ({ message, tools, extensions }) => {
|
|
|
1172
1214
|
};
|
|
1173
1215
|
}
|
|
1174
1216
|
case "success": {
|
|
1175
|
-
|
|
1217
|
+
log4("tool success", {
|
|
1176
1218
|
result: toolResult.result
|
|
1177
1219
|
}, {
|
|
1178
1220
|
F: __dxlog_file4,
|
|
@@ -1196,7 +1238,7 @@ var runTools = async ({ message, tools, extensions }) => {
|
|
|
1196
1238
|
};
|
|
1197
1239
|
}
|
|
1198
1240
|
case "break": {
|
|
1199
|
-
|
|
1241
|
+
log4("tool break", {
|
|
1200
1242
|
result: toolResult.result
|
|
1201
1243
|
}, {
|
|
1202
1244
|
F: __dxlog_file4,
|
|
@@ -1213,6 +1255,8 @@ var runTools = async ({ message, tools, extensions }) => {
|
|
|
1213
1255
|
};
|
|
1214
1256
|
export {
|
|
1215
1257
|
AIServiceClientImpl,
|
|
1258
|
+
DEFAULT_LLM_MODEL,
|
|
1259
|
+
DEFAULT_LLM_MODELS,
|
|
1216
1260
|
EchoDataSource,
|
|
1217
1261
|
GenerateRequest,
|
|
1218
1262
|
GenerationStream,
|