@dxos/assistant-toolkit 0.8.4-main.1068cf700f
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +8 -0
- package/README.md +3 -0
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +7 -0
- package/dist/lib/neutral/index.mjs +3708 -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 +44 -0
- package/dist/lib/neutral/testing/index.mjs.map +7 -0
- package/dist/types/src/blueprints/design/design-blueprint.d.ts +18 -0
- package/dist/types/src/blueprints/design/design-blueprint.d.ts.map +1 -0
- package/dist/types/src/blueprints/design/design-blueprint.test.d.ts +2 -0
- package/dist/types/src/blueprints/design/design-blueprint.test.d.ts.map +1 -0
- package/dist/types/src/blueprints/design/index.d.ts +3 -0
- package/dist/types/src/blueprints/design/index.d.ts.map +1 -0
- package/dist/types/src/blueprints/discord/discord-blueprint.d.ts +18 -0
- package/dist/types/src/blueprints/discord/discord-blueprint.d.ts.map +1 -0
- package/dist/types/src/blueprints/discord/index.d.ts +3 -0
- package/dist/types/src/blueprints/discord/index.d.ts.map +1 -0
- package/dist/types/src/blueprints/index.d.ts +8 -0
- package/dist/types/src/blueprints/index.d.ts.map +1 -0
- package/dist/types/src/blueprints/linear/index.d.ts +3 -0
- package/dist/types/src/blueprints/linear/index.d.ts.map +1 -0
- package/dist/types/src/blueprints/linear/linear-blueprint.d.ts +18 -0
- package/dist/types/src/blueprints/linear/linear-blueprint.d.ts.map +1 -0
- package/dist/types/src/blueprints/markdown/index.d.ts +3 -0
- package/dist/types/src/blueprints/markdown/index.d.ts.map +1 -0
- package/dist/types/src/blueprints/markdown/markdown-blueprint.d.ts +18 -0
- package/dist/types/src/blueprints/markdown/markdown-blueprint.d.ts.map +1 -0
- package/dist/types/src/blueprints/planning/index.d.ts +3 -0
- package/dist/types/src/blueprints/planning/index.d.ts.map +1 -0
- package/dist/types/src/blueprints/planning/planning-blueprint.d.ts +18 -0
- package/dist/types/src/blueprints/planning/planning-blueprint.d.ts.map +1 -0
- package/dist/types/src/blueprints/planning/planning-blueprint.test.d.ts +2 -0
- package/dist/types/src/blueprints/planning/planning-blueprint.test.d.ts.map +1 -0
- package/dist/types/src/blueprints/research/index.d.ts +3 -0
- package/dist/types/src/blueprints/research/index.d.ts.map +1 -0
- package/dist/types/src/blueprints/research/research-blueprint.d.ts +18 -0
- package/dist/types/src/blueprints/research/research-blueprint.d.ts.map +1 -0
- package/dist/types/src/blueprints/research/research-blueprint.test.d.ts +2 -0
- package/dist/types/src/blueprints/research/research-blueprint.test.d.ts.map +1 -0
- package/dist/types/src/blueprints/testing.d.ts +10 -0
- package/dist/types/src/blueprints/testing.d.ts.map +1 -0
- package/dist/types/src/blueprints/websearch/index.d.ts +4 -0
- package/dist/types/src/blueprints/websearch/index.d.ts.map +1 -0
- package/dist/types/src/blueprints/websearch/websearch-blueprint.d.ts +18 -0
- package/dist/types/src/blueprints/websearch/websearch-blueprint.d.ts.map +1 -0
- package/dist/types/src/blueprints/websearch/websearch-toolkit.d.ts +27 -0
- package/dist/types/src/blueprints/websearch/websearch-toolkit.d.ts.map +1 -0
- package/dist/types/src/chat/Chat.d.ts +31 -0
- package/dist/types/src/chat/Chat.d.ts.map +1 -0
- package/dist/types/src/chat/index.d.ts +2 -0
- package/dist/types/src/chat/index.d.ts.map +1 -0
- package/dist/types/src/crud/graph.d.ts +67 -0
- package/dist/types/src/crud/graph.d.ts.map +1 -0
- package/dist/types/src/crud/graph.test.d.ts +2 -0
- package/dist/types/src/crud/graph.test.d.ts.map +1 -0
- package/dist/types/src/crud/index.d.ts +2 -0
- package/dist/types/src/crud/index.d.ts.map +1 -0
- package/dist/types/src/experimental/feed.test.d.ts +2 -0
- package/dist/types/src/experimental/feed.test.d.ts.map +1 -0
- package/dist/types/src/functions/agent/index.d.ts +5 -0
- package/dist/types/src/functions/agent/index.d.ts.map +1 -0
- package/dist/types/src/functions/agent/prompt.d.ts +76 -0
- package/dist/types/src/functions/agent/prompt.d.ts.map +1 -0
- package/dist/types/src/functions/discord/fetch-messages.d.ts +11 -0
- package/dist/types/src/functions/discord/fetch-messages.d.ts.map +1 -0
- package/dist/types/src/functions/discord/fetch-messages.test.d.ts +2 -0
- package/dist/types/src/functions/discord/fetch-messages.test.d.ts.map +1 -0
- package/dist/types/src/functions/discord/index.d.ts +12 -0
- package/dist/types/src/functions/discord/index.d.ts.map +1 -0
- package/dist/types/src/functions/document/create.d.ts +6 -0
- package/dist/types/src/functions/document/create.d.ts.map +1 -0
- package/dist/types/src/functions/document/index.d.ts +30 -0
- package/dist/types/src/functions/document/index.d.ts.map +1 -0
- package/dist/types/src/functions/document/read.d.ts +14 -0
- package/dist/types/src/functions/document/read.d.ts.map +1 -0
- package/dist/types/src/functions/document/update.d.ts +13 -0
- package/dist/types/src/functions/document/update.d.ts.map +1 -0
- package/dist/types/src/functions/entity-extraction/entity-extraction.d.ts +174 -0
- package/dist/types/src/functions/entity-extraction/entity-extraction.d.ts.map +1 -0
- package/dist/types/src/functions/entity-extraction/entity-extraction.test.d.ts +2 -0
- package/dist/types/src/functions/entity-extraction/entity-extraction.test.d.ts.map +1 -0
- package/dist/types/src/functions/entity-extraction/index.d.ts +175 -0
- package/dist/types/src/functions/entity-extraction/index.d.ts.map +1 -0
- package/dist/types/src/functions/exa/data/exa-search-1748337321991.d.ts +38 -0
- package/dist/types/src/functions/exa/data/exa-search-1748337321991.d.ts.map +1 -0
- package/dist/types/src/functions/exa/data/exa-search-1748337331526.d.ts +37 -0
- package/dist/types/src/functions/exa/data/exa-search-1748337331526.d.ts.map +1 -0
- package/dist/types/src/functions/exa/data/exa-search-1748337344119.d.ts +58 -0
- package/dist/types/src/functions/exa/data/exa-search-1748337344119.d.ts.map +1 -0
- package/dist/types/src/functions/exa/data/index.d.ts +3 -0
- package/dist/types/src/functions/exa/data/index.d.ts.map +1 -0
- package/dist/types/src/functions/exa/exa.d.ts +5 -0
- package/dist/types/src/functions/exa/exa.d.ts.map +1 -0
- package/dist/types/src/functions/exa/index.d.ts +3 -0
- package/dist/types/src/functions/exa/index.d.ts.map +1 -0
- package/dist/types/src/functions/exa/mock.d.ts +5 -0
- package/dist/types/src/functions/exa/mock.d.ts.map +1 -0
- package/dist/types/src/functions/github/fetch-prs.d.ts +6 -0
- package/dist/types/src/functions/github/fetch-prs.d.ts.map +1 -0
- package/dist/types/src/functions/index.d.ts +8 -0
- package/dist/types/src/functions/index.d.ts.map +1 -0
- package/dist/types/src/functions/linear/index.d.ts +9 -0
- package/dist/types/src/functions/linear/index.d.ts.map +1 -0
- package/dist/types/src/functions/linear/linear.test.d.ts +2 -0
- package/dist/types/src/functions/linear/linear.test.d.ts.map +1 -0
- package/dist/types/src/functions/linear/sync-issues.d.ts +12 -0
- package/dist/types/src/functions/linear/sync-issues.d.ts.map +1 -0
- package/dist/types/src/functions/research/document-create.d.ts +9 -0
- package/dist/types/src/functions/research/document-create.d.ts.map +1 -0
- package/dist/types/src/functions/research/index.d.ts +21 -0
- package/dist/types/src/functions/research/index.d.ts.map +1 -0
- package/dist/types/src/functions/research/research-graph.d.ts +19 -0
- package/dist/types/src/functions/research/research-graph.d.ts.map +1 -0
- package/dist/types/src/functions/research/research.d.ts +14 -0
- package/dist/types/src/functions/research/research.d.ts.map +1 -0
- package/dist/types/src/functions/research/research.test.d.ts +2 -0
- package/dist/types/src/functions/research/research.test.d.ts.map +1 -0
- package/dist/types/src/functions/research/types.d.ts +6 -0
- package/dist/types/src/functions/research/types.d.ts.map +1 -0
- package/dist/types/src/functions/tasks/index.d.ts +29 -0
- package/dist/types/src/functions/tasks/index.d.ts.map +1 -0
- package/dist/types/src/functions/tasks/read.d.ts +14 -0
- package/dist/types/src/functions/tasks/read.d.ts.map +1 -0
- package/dist/types/src/functions/tasks/task-list.d.ts +74 -0
- package/dist/types/src/functions/tasks/task-list.d.ts.map +1 -0
- package/dist/types/src/functions/tasks/task-list.test.d.ts +2 -0
- package/dist/types/src/functions/tasks/task-list.test.d.ts.map +1 -0
- package/dist/types/src/functions/tasks/update.d.ts +16 -0
- package/dist/types/src/functions/tasks/update.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +9 -0
- package/dist/types/src/index.d.ts.map +1 -0
- package/dist/types/src/initiative/Initiative.d.ts +41 -0
- package/dist/types/src/initiative/Initiative.d.ts.map +1 -0
- package/dist/types/src/initiative/blueprint.d.ts +153 -0
- package/dist/types/src/initiative/blueprint.d.ts.map +1 -0
- package/dist/types/src/initiative/functions/addArtifact.d.ts +6 -0
- package/dist/types/src/initiative/functions/addArtifact.d.ts.map +1 -0
- package/dist/types/src/initiative/functions/agent.d.ts +62 -0
- package/dist/types/src/initiative/functions/agent.d.ts.map +1 -0
- package/dist/types/src/initiative/functions/getContext.d.ts +13 -0
- package/dist/types/src/initiative/functions/getContext.d.ts.map +1 -0
- package/dist/types/src/initiative/functions/index.d.ts +5 -0
- package/dist/types/src/initiative/functions/index.d.ts.map +1 -0
- package/dist/types/src/initiative/functions/qualifier.d.ts +60 -0
- package/dist/types/src/initiative/functions/qualifier.d.ts.map +1 -0
- package/dist/types/src/initiative/index.d.ts +6 -0
- package/dist/types/src/initiative/index.d.ts.map +1 -0
- package/dist/types/src/initiative/initiative.test.d.ts +2 -0
- package/dist/types/src/initiative/initiative.test.d.ts.map +1 -0
- package/dist/types/src/initiative/plan.d.ts +77 -0
- package/dist/types/src/initiative/plan.d.ts.map +1 -0
- package/dist/types/src/initiative/util.d.ts +29 -0
- package/dist/types/src/initiative/util.d.ts.map +1 -0
- package/dist/types/src/planning/blueprint.d.ts +18 -0
- package/dist/types/src/planning/blueprint.d.ts.map +1 -0
- package/dist/types/src/planning/functions/index.d.ts +2 -0
- package/dist/types/src/planning/functions/index.d.ts.map +1 -0
- package/dist/types/src/planning/functions/update-tasks.d.ts +9 -0
- package/dist/types/src/planning/functions/update-tasks.d.ts.map +1 -0
- package/dist/types/src/planning/index.d.ts +3 -0
- package/dist/types/src/planning/index.d.ts.map +1 -0
- package/dist/types/src/sync/index.d.ts +2 -0
- package/dist/types/src/sync/index.d.ts.map +1 -0
- package/dist/types/src/sync/sync.d.ts +15 -0
- package/dist/types/src/sync/sync.d.ts.map +1 -0
- package/dist/types/src/testing/index.d.ts +2 -0
- package/dist/types/src/testing/index.d.ts.map +1 -0
- package/dist/types/src/testing/plugins.d.ts +19 -0
- package/dist/types/src/testing/plugins.d.ts.map +1 -0
- package/dist/types/src/toolkits/AssistantToolkit.d.ts +43 -0
- package/dist/types/src/toolkits/AssistantToolkit.d.ts.map +1 -0
- package/dist/types/src/toolkits/AssistantToolkit.test.d.ts +2 -0
- package/dist/types/src/toolkits/AssistantToolkit.test.d.ts.map +1 -0
- package/dist/types/src/toolkits/SystemToolkit.d.ts +99 -0
- package/dist/types/src/toolkits/SystemToolkit.d.ts.map +1 -0
- package/dist/types/src/toolkits/WebToolkit.d.ts +38 -0
- package/dist/types/src/toolkits/WebToolkit.d.ts.map +1 -0
- package/dist/types/src/toolkits/index.d.ts +4 -0
- package/dist/types/src/toolkits/index.d.ts.map +1 -0
- package/dist/types/src/util/graphql.d.ts +22 -0
- package/dist/types/src/util/graphql.d.ts.map +1 -0
- package/dist/types/src/util/index.d.ts +2 -0
- package/dist/types/src/util/index.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -0
- package/package.json +74 -0
- package/src/blueprints/design/design-blueprint.test.ts +100 -0
- package/src/blueprints/design/design-blueprint.ts +31 -0
- package/src/blueprints/design/index.ts +7 -0
- package/src/blueprints/discord/discord-blueprint.ts +32 -0
- package/src/blueprints/discord/index.ts +7 -0
- package/src/blueprints/index.ts +11 -0
- package/src/blueprints/linear/index.ts +7 -0
- package/src/blueprints/linear/linear-blueprint.ts +33 -0
- package/src/blueprints/markdown/index.ts +7 -0
- package/src/blueprints/markdown/markdown-blueprint.ts +24 -0
- package/src/blueprints/planning/index.ts +7 -0
- package/src/blueprints/planning/planning-blueprint.test.ts +120 -0
- package/src/blueprints/planning/planning-blueprint.ts +96 -0
- package/src/blueprints/research/index.ts +7 -0
- package/src/blueprints/research/research-blueprint.test.ts +7 -0
- package/src/blueprints/research/research-blueprint.ts +51 -0
- package/src/blueprints/testing.ts +30 -0
- package/src/blueprints/websearch/index.ts +9 -0
- package/src/blueprints/websearch/websearch-blueprint.ts +18 -0
- package/src/blueprints/websearch/websearch-toolkit.ts +8 -0
- package/src/chat/Chat.ts +45 -0
- package/src/chat/index.ts +5 -0
- package/src/crud/graph.test.ts +46 -0
- package/src/crud/graph.ts +380 -0
- package/src/crud/index.ts +5 -0
- package/src/experimental/feed.test.ts +106 -0
- package/src/functions/agent/index.ts +11 -0
- package/src/functions/agent/prompt.ts +116 -0
- package/src/functions/discord/fetch-messages.test.ts +54 -0
- package/src/functions/discord/fetch-messages.ts +252 -0
- package/src/functions/discord/index.ts +9 -0
- package/src/functions/document/create.ts +29 -0
- package/src/functions/document/index.ts +13 -0
- package/src/functions/document/read.ts +32 -0
- package/src/functions/document/update.ts +32 -0
- package/src/functions/entity-extraction/entity-extraction.conversations.json +1 -0
- package/src/functions/entity-extraction/entity-extraction.test.ts +74 -0
- package/src/functions/entity-extraction/entity-extraction.ts +181 -0
- package/src/functions/entity-extraction/index.ts +9 -0
- package/src/functions/exa/data/exa-search-1748337321991.ts +131 -0
- package/src/functions/exa/data/exa-search-1748337331526.ts +144 -0
- package/src/functions/exa/data/exa-search-1748337344119.ts +133 -0
- package/src/functions/exa/data/index.ts +11 -0
- package/src/functions/exa/exa.ts +37 -0
- package/src/functions/exa/index.ts +6 -0
- package/src/functions/exa/mock.ts +71 -0
- package/src/functions/github/fetch-prs.ts +31 -0
- package/src/functions/index.ts +11 -0
- package/src/functions/linear/index.ts +9 -0
- package/src/functions/linear/linear.test.ts +58 -0
- package/src/functions/linear/sync-issues.ts +191 -0
- package/src/functions/research/document-create.ts +73 -0
- package/src/functions/research/index.ts +14 -0
- package/src/functions/research/research-graph.ts +49 -0
- package/src/functions/research/research-instructions.tpl +106 -0
- package/src/functions/research/research.conversations.json +1 -0
- package/src/functions/research/research.test.ts +144 -0
- package/src/functions/research/research.ts +182 -0
- package/src/functions/research/types.ts +26 -0
- package/src/functions/tasks/index.ts +11 -0
- package/src/functions/tasks/read.ts +34 -0
- package/src/functions/tasks/task-list.test.ts +99 -0
- package/src/functions/tasks/task-list.ts +165 -0
- package/src/functions/tasks/update.ts +52 -0
- package/src/index.ts +12 -0
- package/src/initiative/Initiative.ts +61 -0
- package/src/initiative/blueprint.ts +60 -0
- package/src/initiative/functions/addArtifact.ts +41 -0
- package/src/initiative/functions/agent.ts +77 -0
- package/src/initiative/functions/getContext.ts +54 -0
- package/src/initiative/functions/index.ts +8 -0
- package/src/initiative/functions/qualifier.ts +98 -0
- package/src/initiative/index.ts +9 -0
- package/src/initiative/initiative.test.ts +584 -0
- package/src/initiative/plan.ts +107 -0
- package/src/initiative/util.ts +137 -0
- package/src/planning/blueprint.ts +14 -0
- package/src/planning/functions/index.ts +5 -0
- package/src/planning/functions/update-tasks.ts +168 -0
- package/src/planning/index.ts +6 -0
- package/src/sync/index.ts +5 -0
- package/src/sync/sync.ts +95 -0
- package/src/testing/index.ts +5 -0
- package/src/testing/plugins.tsx +69 -0
- package/src/toolkits/AssistantToolkit.conversations.json +1 -0
- package/src/toolkits/AssistantToolkit.test.ts +72 -0
- package/src/toolkits/AssistantToolkit.ts +70 -0
- package/src/toolkits/SystemToolkit.ts +299 -0
- package/src/toolkits/WebToolkit.ts +34 -0
- package/src/toolkits/index.ts +7 -0
- package/src/typedefs.d.ts +8 -0
- package/src/util/graphql.ts +31 -0
- package/src/util/index.ts +5 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
export default {
|
|
6
|
+
requestId: '32df0c541f9883180b35e04caece4374',
|
|
7
|
+
autopromptString: 'open source AI knowledge management projects features comparison 2024',
|
|
8
|
+
autoDate: '2024-01-01T00:00:00.000Z',
|
|
9
|
+
resolvedSearchType: 'neural',
|
|
10
|
+
results: [
|
|
11
|
+
{
|
|
12
|
+
id: 'https://tryfastgpt.ai/',
|
|
13
|
+
title: 'FastGPT',
|
|
14
|
+
url: 'https://tryfastgpt.ai/',
|
|
15
|
+
publishedDate: '2024-01-01T00:00:00.000Z',
|
|
16
|
+
author: 'labring',
|
|
17
|
+
score: 0.36898404359817505,
|
|
18
|
+
text: '20w+ Users are leveraging FastGPT to create their own specialized AI knowledge bases Empowerwith Your Expertise A free, open-source, and powerful AI knowledge base platform, offers out-of-the-box data processing, model invocation, RAG retrieval, and visual AI workflows. Easily build complex LLM applications. Features Why Choose FastGPT? Discover the advantages of FastGPT Open Source Secure and reliable open-source codebase. Optimized Q&A Enhanced question-answering accuracy for customer service. Visual Workflow Design complex workflows with ease using the Flow module. Seamless Extensibility Seamlessly integrate FastGPT into your applications via API. Debugging Tools Refine your models with comprehensive debugging features. Multi-Model Compatibility Compatible with various LLM models, with more to come. Do you find this open-source AI knowledge base platform valuable? Show your support by giving us a star 🌟 FAQ Find answers to the most common inquiries here. FastGPT allows commercial usage, such as serving as a backend service for other applications or as an application development platform for enterprises. However, when it comes to multi-tenant SaaS services or matters involving the LOGO and copyright information, you must contact the author to obtain a commercial license. FastGPT supports importing documents in various formats, including Word, PDF, Excel, Markdown, and web links. It also enables syncing data from an entire website, automatically handling text preprocessing, vectorization, and QA splitting, which saves manual training time and improves efficiency. As long as the API of the model you want to integrate aligns with the official OpenAI API, it can be used with FastGPT. You can utilize projects like One API to unify access to different models and provide an API that is compatible with the official OpenAI API. If you come across any problems while using FastGPT, please join our community or forum, create a post, and reach out to us for assistance.',
|
|
19
|
+
favicon: 'https://tryfastgpt.ai/favicon-16x16.png',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
id: 'https://casibase.org',
|
|
23
|
+
title:
|
|
24
|
+
'Casibase | Casibase · Open-Source LangChain-like AI Knowledge Database & Chat Bot with Admin UI and multi-model support (ChatGPT, Claude, Llama 3, DeepSeek R1, HuggingFace, etc.)',
|
|
25
|
+
url: 'https://casibase.org',
|
|
26
|
+
publishedDate: '2025-01-01T00:00:00.000Z',
|
|
27
|
+
author: '',
|
|
28
|
+
score: 0.354640930891037,
|
|
29
|
+
text: 'Comprehensive Model Support Integrates a diverse range of AI models, including ChatGPT, Azure OpenAI, HuggingFace, and more, complemented by support for various embedding APIs like OpenAI Ada and Baidu Wenxin Yiyi. Advanced Document Handling & AI Assistance Supports multiple document formats including txt, markdown, docx, pdf with intelligent parsing, and features an embedded AI assistant for real-time online chat and manual session handover. Enterprise-Level Features & Multilingual Support Offers multi-user and multi-tenant capabilities with enterprise-grade Single Sign-On (SSO), comprehensive chat session logging for auditing, and a multilingual interface supporting Chinese, English, and more. Casibase is an open source AI knowledge base and dialogue system that combines the latest RAG (Retrieval Augmented Generation) technology, enterprise-grade Single Sign-On (SSO) functionality, and support for a wide range of mainstream AI models. Casibase is designed to provide enterprises and developers with a powerful, flexible, and easy-to-use knowledge management and intelligent dialogue platform. Casibase provides various provider configurations, such as storage providers, model providers, embedding providers, etc. To chat with AI easily, please visit the Casibase Guide for more details. Enterprise-class identity management capabilities Casibase uses Casdoor as its identity and single sign-on (SSO) provider. Through its deep integration with Casdoor, Casibase not only simplifies the user login process, but also provides a high level of security and flexibility, enabling organisations to easily manage user identities and access rights.',
|
|
30
|
+
favicon: 'https://casibase.org/img/favicon.png',
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
id: 'https://www.open-notebook.ai/',
|
|
34
|
+
title: 'What is Open Notebook? | Open Notebook',
|
|
35
|
+
url: 'https://www.open-notebook.ai/',
|
|
36
|
+
publishedDate: '2024-01-01T00:00:00.000Z',
|
|
37
|
+
author: '',
|
|
38
|
+
score: 0.36405712366104126,
|
|
39
|
+
text: "Take Control of Your Learning. Privately. A powerful open-source, AI-powered note-taking/research platform that respects your privacy 🎙️ Podcast Generator Transform your notes into engaging podcasts with customizable voices, speakers, and episodes 🤖 AI-Powered Notes Leverage AI to summarize, generate insights, and manage your notes 🔒 Privacy Control Full control over what information AI can access 🔄 Content Integration Support for links, PDFs, TXT, PPT, YouTube, and more What is Open Notebook? Open Notebook is the cognitive partner you always wanted and could never explain why. It combines the power of AI with unwavering privacy controls. It's designed for researchers, students, and professionals who want to enhance their learning and abilities while maintaining complete control over workflows, models, and how their data gets used and exposed. Is this right for me? 📚 Learning Enthusiast You're constantly seeking knowledge and want to go beyond surface-level understanding. Learning for you is about building deep, lasting comprehension. 🤝 You want a learning partner You believe your learning process can improve by partnering with a tailor made AI. You want to be provoked to think more clearly. 🤯 Your learning backlog is way too big You have hundreds of links you would love to read, but there is no time for it all. You want to make sure those are catalogued for when you need them. ✍️ Independent Thinker You value both taking notes and forming your own ideas. You understand different viewpoints but believe in developing your own perspective. 🔒 You are privacy aware You don't want all your context, thoughts and plans to be all over Big Tech, if not necessary. 💁 You like things your way You want to decide how your content is handled, which AI models you want to interact with and help specifically it should help/challenge you. What is the plan for the future? There is much more that can be done to augment human knowledge. Open Notebook's first release is just a first step in that direction. The end goal is to build a Cognitive Partner for every person. A customized assistant that can help you develop your skills, knowledge, and opinions in a way that makes sense to you. Learn more about our long-term vision and roadmap in our Vision page.",
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
id: 'https://www.suna.so/',
|
|
43
|
+
title: 'Suna - Open Source Generalist AI Agent',
|
|
44
|
+
url: 'https://www.suna.so/',
|
|
45
|
+
publishedDate: '2025-06-21T00:00:00.000Z',
|
|
46
|
+
author: 'Kortix Team',
|
|
47
|
+
score: 0.3588857054710388,
|
|
48
|
+
text: '100% OPEN SOURCE Suna, your AI Employee. Suna by Kortix – is a generalist AI Agent that acts on your behalf. See Suna in action Explore real-world examples of how Suna completes complex tasks autonomously Suna is fully open source. Join our community and help shape the future of AI. The Generalist AI Agent Explore, contribute, or fork our repository. Suna is built with transparency and collaboration at its core. TypeScript Python Apache 2.0 License View on GitHub Transparency & Trust We believe AI should be open and accessible to everyone. Our open source approach ensures accountability, innovation, and community collaboration. Transparency Fully auditable codebase Community Join our developers Apache 2.0 Free to use and modify Choose the right plan for your needs Start with our free plan or upgrade to a premium plan for more usage hours Free $0 Get started with 60 min/month Public Projects Basic Model (Limited capabilities) Pro Popular $20 /month Everything in Free, plus: 2 hours/month 2 hours Private projects Access to intelligent Model (Full Suna) Custom $50 /month Everything in Pro, plus: Customize your monthly usage 6 hours/month Suited to you needs',
|
|
49
|
+
image: 'https://suna.so/opengraph-image?971e689ec8d3b4eb',
|
|
50
|
+
favicon: 'https://www.suna.so/favicon.png',
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
id: 'https://github.com/AIDotNet/AntSK',
|
|
54
|
+
title:
|
|
55
|
+
'GitHub - AIDotNet/AntSK: 基于.Net8+AntBlazor+SemanticKernel 和KernelMemory 打造的AI知识库/智能体,支持本地离线AI大模型。可以不联网离线运行。支持aspire观测应用数据',
|
|
56
|
+
url: 'https://github.com/AIDotNet/AntSK',
|
|
57
|
+
publishedDate: '2024-02-01T15:08:17.000Z',
|
|
58
|
+
author: 'AIDotNet',
|
|
59
|
+
score: 0.3635949492454529,
|
|
60
|
+
text: '简体中文 | English \n AntSK \n AI Knowledge Base/Intelligent Agent built on .Net8+AntBlazor+SemanticKernel \n ⭐Core Features \n \n \n Semantic Kernel: Utilizes advanced natural language processing technology to accurately understand, process, and respond to complex semantic queries, providing users with precise information retrieval and recommendation services. \n \n \n Kernel Memory: Capable of continuous learning and storing knowledge points, AntSK has long-term memory function, accumulates experience, and provides a more personalized interaction experience. \n \n \n Knowledge Base: Import knowledge base through documents (Word, PDF, Excel, Txt, Markdown, Json, PPT) and perform knowledge base Q&A. \n \n \n GPT Generation: This platform supports creating personalized GPT models, enabling users to build their own GPT models. \n \n \n API Interface Publishing: Exposes internal functions in the form of APIs, enabling developers to integrate AntSK into other applications and enhance application intelligence. \n \n \n API Plugin System: Open API plugin system that allows third-party developers or service providers to easily integrate their services into AntSK, continuously enhancing application functionality. \n \n \n.Net Plugin System: Open dll plugin system that allows third-party developers or service providers to easily integrate their business functions by generating dll in standard format code, continuously enhancing application functionality. \n \n \n Online Search: AntSK, real-time access to the latest information, ensuring users receive the most timely and relevant data. \n \n \n Model Management: Adapts and manages integration of different models from different manufacturers, models offline running supported by llamafactory and ollama. \n \n \n Domestic Innovation: AntSK supports domestic models and databases and can run under domestic innovation conditions. \n \n \n Model Fine-Tuning: Planned based on llamafactory for model fine-tuning. \n \n \n ⛪Application Scenarios \n AntSK is suitable for various business scenarios, such as: \n \n Enterprise knowledge management system \n Automatic customer service and chatbots \n Enterprise search engine \n Personalized recommendation system \n Intelligent writing assistance \n Education and online learning platforms \n Other interesting AI Apps \n \n ✏️Function Examples \n Online Demo \n document \n demo \nand\n demo1 \n Default account: test\nDefault password: test\nDue to the low configuration of the cloud server, the local model cannot be run, so the system settings permissions have been closed. You can simply view the interface. If you want to use the local model, please download and use it on your own.\n \n Other Function Examples \n Video Demonstration \n ❓How to get started? \n Here I am using Postgres as the data and vector storage because Semantic Kernel and Kernel Memory support it, but you can also use other options. \n The model by default supports the local model of openai, azure openai, and llama. If you need to use other models, you can integrate t',
|
|
61
|
+
image:
|
|
62
|
+
'https://opengraph.githubassets.com/945bd786b32bfe02a9a537c511d768696a91e155dc07052bba541d1b3e6517c0/AIDotNet/AntSK',
|
|
63
|
+
favicon: 'https://github.com/fluidicon.png',
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
id: 'https://www.cognee.ai/',
|
|
67
|
+
title: 'Improve your AI infrastructure - AI memory engine',
|
|
68
|
+
url: 'https://www.cognee.ai/',
|
|
69
|
+
publishedDate: '2025-05-21T00:00:00.000Z',
|
|
70
|
+
author: '',
|
|
71
|
+
score: 0.3653402328491211,
|
|
72
|
+
text: 'AI agent responses you can rely on AI Memory Python SDK. 90% accuracy out of the box. People use cognee to sort out their data and improve AI answers Ask cognee 89.4% answer relevancy Vector store Ask RAG Potato answer relevancy ChatGPT Ask ChatGPT 5% answer relevancy Improve responses from LLM applications Text generation Content summaries Customer analysis Chatbot responses Code generation Translations Why choose Cognee 1 It’s free and open-source We’re all about building in the open. Just install the Python library, or clone the repo from GitHub and start playing around. Super flexible for developers and hobbyists. 2 Totally customisable storage Want to use a different database provider? No problem. cognee supports many out of the box (like vector and graph databases), but you can easily plug in your own by following the docs. 3 Smart data with ontologies Cognee isn’t just storing random chunks of data - everything is related! RDF-based ontologies define the structure with publicly available rules and ontologies to make your data even smarter. 4 Actual reasoning (no guessing here!) Instead of just guessing based on patterns, cognee can use real reasoners. You can use existing ones, or build your own for your specific case. 5 Built for your servers You can run everything on your own servers, so if you’re dealing with sensitive data there’s no third-party risk. 6 Handles loads of data Need to analyse a lot of data? Whether it’s gigabytes (or terabytes :hushed:) cognee’s distributed system can handle it. It scales exactly when you need it to. 1 It’s free and open-source We’re all about building in the open. Just install the Python library, or clone the repo from GitHub and start playing around. Super flexible for developers and hobbyists. 3 Smart data with ontologies Cognee isn’t just storing random chunks of data - everything is related! RDF-based ontologies define the structure with publicly available rules and ontologies to make your data even smarter. 5 Built for your servers You can run everything on your own servers, so if you’re dealing with sensitive data there’s no third-party risk. 2 Totally customisable storage Want to use a different database provider? No problem. cognee supports many out of the box (like vector and graph databases), but you can easily plug in your own by following the docs. 4 Actual reasoning (no guessing here!) Instead of just guessing based on patterns, cognee can use real reasoners. You can use existing ones, or build your own for your specific case. 6 Handles loads of data Need to analyse a lot of data? Whether it’s gigabytes (or terabytes :hushed:) cognee’s distributed system can handle it. It scales exactly when you need it to. Success case Increased answer relevancy with more support agents using the tool. Helping Dynamo increase customer engagement Problem Dynamo helps gaming companies interact with their user base. Agents communicate via messenger to offer bonuses and encourage participation in tournaments a',
|
|
73
|
+
image: 'https://www.cognee.ai/images/meta/cognee-logo-text-on-gradient.png',
|
|
74
|
+
favicon: 'https://www.cognee.ai/favicon.ico',
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
id: 'https://github.com/AI4WA/Docs2KG',
|
|
78
|
+
title:
|
|
79
|
+
'GitHub - AI4WA/Docs2KG: Docs2KG: A Human-LLM Collaborative Approach to Unified Knowledge Graph Construction from Heterogeneous Documents',
|
|
80
|
+
url: 'https://github.com/AI4WA/Docs2KG',
|
|
81
|
+
publishedDate: '2024-05-08T15:21:54.000Z',
|
|
82
|
+
author: 'AI4WA',
|
|
83
|
+
score: 0.36111196875572205,
|
|
84
|
+
text: 'Docs2KG \n A Human-LLM Collaborative Approach to Unified Knowledge Graph Construction from Heterogeneous Documents \n \n \n \n \n \n \n Installation \n We have published the package to PyPi: Docs2KG, \n You can install it via: \n pip install Docs2KG\npython -m spacy download en_core_web_sm \n \n \n \n Setup and Tutorial \n Detailed setup and tutorial can be found in the documentation. \n You have two ways to run the package: \n \n import the package in the code, and hook it with your own code \n run the package in the command line \n \n Command Line \n # first setup the CONFIG_FILE environment variable to local one \n export CONFIG_FILE=config.yml # or any other path for the configuration file \ndocs2kg # this command will tell you how to use the package \n # we currently support the following commands \ndocs2kg process-document your_input_file --agent-name phi3.5 --agent-type ollama --project-id your_project_id\ndocs2kg batch-process your_input_dir --agent-name phi3.5 --agent-type ollama --project-id your_project_id\ndocs2kg list-formats # list all the supported formats \n Usage: docs2kg [OPTIONS] COMMAND [ARGS]...\n Docs2KG - Document to Knowledge Graph conversion tool.\n Supports multiple document formats: PDF, DOCX, HTML, and EPUB.\nOptions:\n -c, --config PATH Path to the configuration file (default: ./config.yml)\n --help Show this message and exit.\nCommands:\n batch-process Process all supported documents in a directory.\n list-formats List all supported document formats.\n neo4j Load data to Neo4j database.\n process-document Process a single document file.\n \n Usage: docs2kg process-document [OPTIONS] FILE_PATH\n Process a single document file.\n FILE_PATH: Path to the document file (PDF, DOCX, HTML, or EPUB)\nOptions:\n -p, --project-id TEXT Project ID for the knowledge graph construction\n -n, --agent-name TEXT Name of the agent to use for NER extraction\n -t, --agent-type TEXT Type of the agent to use for NER extraction\n --help Show this message and exit.\n \n Usage: docs2kg neo4j [OPTIONS] PROJECT_ID\n Load data to Neo4j database.\nOptions:\n -m, --mode [import|export|load|docker_start|docker_stop]\n Mode of operation (import or export)\n -u, --neo4j-uri TEXT URI for the Neo4j database\n -U, --neo4j-user TEXT Username for the Neo4j database\n -P, --neo4j-password TEXT Password for the Neo4j database\n -r, --reset_db Reset the database before loading data\n --help \n \n Motivation \n To digest diverse unstructured documents into a unified knowledge graph, there are two main challenges: \n \n How to get the documents to be digitized? \n \n With the dual-path data processing\n \n For image based documents, like scanned PDF, images, etc., we can process them through the layout analysis and\nOCR, etc. Docling and MinerU are focusing on this part. \n For native digital documents, like ebook, docx, html, etc., we can process them through the programming parser \n \n \n It is promising that we will have a robust solution soon. \n \n \n How to construct a high-quality unified knowledge graph with less effort? \n \n Fo',
|
|
85
|
+
image:
|
|
86
|
+
'https://opengraph.githubassets.com/170da8210f59c1e9bb44ebe1ee84b35e1fd9d3d74d1aec22323534770d4921af/AI4WA/Docs2KG',
|
|
87
|
+
favicon: 'https://github.com/fluidicon.png',
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
id: 'https://github.com/RoboZoom/knowledge_management',
|
|
91
|
+
title: 'GitHub - RoboZoom/knowledge_management',
|
|
92
|
+
url: 'https://github.com/RoboZoom/knowledge_management',
|
|
93
|
+
publishedDate: '2024-02-08T02:20:22.000Z',
|
|
94
|
+
author: 'RoboZoom',
|
|
95
|
+
score: 0.37371376156806946,
|
|
96
|
+
text: '\n \n \n \n \n \n \n \n \n \n \nGitHub Copilot\n \nWrite better code with AI\n \n \n \n \n \n \nGitHub Models\n \nNew\n \n \nManage and compare prompts\n \n \n \n \n \n \nGitHub Advanced Security\n \nFind and fix vulnerabilities\n \n \n \n \n \n \nActions\n \nAutomate any workflow\n \n \n \n \n \n \nCodespaces\n \nInstant dev environments\n \n \n \n \n \n \n \n \n \n \nIssues\n \nPlan and track work\n \n \n \n \n \n \nCode Review\n \nManage code changes\n \n \n \n \n \n \nDiscussions\n \nCollaborate outside of code\n \n \n \n \n \n \nCode Search\n \nFind more, search less\n \n \n \n \n \n \n \n \n \n \n Explore \n \n \nLearning Pathways\n \n \n \nEvents & Webinars\n \n \n \nEbooks & Whitepapers\n \n \n \nCustomer Stories\n \n \n \nPartners\n \n \n \nExecutive Insights\n \n \n \n \n \n \n \n \n \n \n \n \nGitHub Sponsors\n \nFund open source developers\n \n \n \n \n \n \n \n \n \n \nThe ReadME Project\n \nGitHub community articles\n \n \n \n \n \n \n \n \n \n \n \n \n \nEnterprise platform\n \nAI-powered developer platform\n \n \n \n \n \n \n Pricing \n \n \n \n \n \nSign up\n \n \n',
|
|
97
|
+
image:
|
|
98
|
+
'https://opengraph.githubassets.com/2388498497e355faeecdd0ebc0ae18ac0680ba329b5f7030aa21bc38ddaa6b8b/RoboZoom/knowledge_management',
|
|
99
|
+
favicon: 'https://github.com/fluidicon.png',
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
id: 'https://creati.ai/ai-tools/sciphi/',
|
|
103
|
+
title: 'SciPhi: Build, Deploy, and Optimize AI Systems | Creati.ai',
|
|
104
|
+
url: 'https://creati.ai/ai-tools/sciphi/',
|
|
105
|
+
publishedDate: '2024-07-01T00:00:00.000Z',
|
|
106
|
+
author: '',
|
|
107
|
+
score: 0.37101393938064575,
|
|
108
|
+
text: "SciPhi simplifies building, deploying, and optimizing Retrieval-Augmented Generation (RAG) systems, empowering developers to focus on AI innovation. Added on: Social & Email: Platform: SciPhi SciPhi simplifies building, deploying, and optimizing Retrieval-Augmented Generation (RAG) systems, empowering developers to focus on AI innovation. Added on: Social & Email: Platform: What is SciPhi? SciPhi is an open-source platform designed to simplify the building, deploying, and scaling of Retrieval-Augmented Generation (RAG) systems. It provides an end-to-end solution for developers, enabling them to focus on AI innovation without worrying about the underlying infrastructure. With tools for automated knowledge graph extraction, document and user management, and robust observability, SciPhi ensures efficient and optimized RAG system deployment. Who will use SciPhi? Developers AI Engineers Data Scientists Tech Startups Research Institutions How to use the SciPhi? Step1: Visit the SciPhi website. Step2: Sign up for an account or log in. Step3: Access the platform's dashboard. Step4: Follow guides to build and deploy your RAG system. Step5: Use tools for knowledge graph extraction and management. Step6: Optimize and monitor your system using provided observability features. SciPhi's Core Features & Benefits The Core Features of SciPhi End-to-End RAG System Deployment Automated Knowledge Graph Extraction Document and User Management Robust Observability Tools The Benefits of SciPhi Simplifies AI Development Speeds Up Deployment Time Enhances System Optimization Reduces Infrastructure Complexity SciPhi's Main Use Cases & Applications Building RAG Systems for AI Applications Deploying Knowledge Graphs Managing Large Document Repositories Optimizing AI System Performance FAQs of SciPhi SciPhi is an open-source platform designed to simplify building, deploying, and optimizing Retrieval-Augmented Generation (RAG) systems. SciPhi is intended for developers, AI engineers, data scientists, tech startups, and research institutions. Core features include end-to-end RAG system deployment, automated knowledge graph extraction, document and user management, and robust observability tools. Visit the SciPhi website, sign up for an account, and follow the guides to build and deploy your RAG system. SciPhi supports web platforms. SciPhi simplifies AI development, speeds up deployment time, enhances system optimization, and reduces infrastructure complexity. Yes, alternatives include LangChain, LlamaIndex, Haystack, and Flower. SciPhi supports building RAG systems for AI applications, deploying knowledge graphs, managing large document repositories, and optimizing AI system performance. You can reach out to their support team via their support email provided on the website. SciPhi offers both free and paid plans. Details on pricing can be found on their website. SciPhi Company Information Website: https://www.sciphi.ai Company Name: SciPhi Support Email: [ema",
|
|
109
|
+
image: 'https://cdn-image.creati.ai/ai-tools/product-image/sciphi.webp',
|
|
110
|
+
favicon: 'https://cdn-image.creati.ai/image/Creatiai.ico',
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
id: 'https://helpjuice.com/blog/open-source-knowledge-base',
|
|
114
|
+
title: 'The 12 Best Open Source Knowledge Base Software for 2024',
|
|
115
|
+
url: 'https://helpjuice.com/blog/open-source-knowledge-base',
|
|
116
|
+
author: 'Zeeshan Khan',
|
|
117
|
+
text: "\n \n \n \n \n At Helpjuice / \n \n #Software & Alternatives\n May 15 2025 \n 11m read \n \n \n \n \n On the hunt for the perfect knowledge base software that’s open source? This post will walk you through the best options for your business. \n \n \n \n \n There’s no denying that a knowledge base can make a major impact on your organization. Whether it's to help provide better support to your customers or to enable your employees to find the information they need to do their job, a finely-tuned knowledge base can make all the difference when it comes to how knowledge and information flows through your business. And with plenty of options on the market out there, there’s certainly no shortage of open source knowledge base software. But how can you tell you’re not investing time into installing and learning new software that your team won't use anyway? How can you avoid the time and effort put into an open source option that you later determine to not be a good fit for your needs? It’s simple—do a little research beforehand. We know, we know—you don’t have endless time to invest in that kind of thing (what with a business to run and all). That’s why we’ve created a helpful list of the must-consider open source knowledge base software that companies of all niches, industries, and sizes should consider. We’re even throwing in a little helpful knowledge that should equip you with the information needed to choose the right software for you—like what knowledge base software is in the first place, the benefits of open source software, and how to address your unique needs as a company to choose the right software for you. Want to skip ahead on some of the basics of open-source knowledge base software? Be our guest. The best open source knowledge base software includes: \n BookStack \n OpenKM \n myBase \n eXo \n PHPKB \n Documize \n DocuWiki \n phpMyFAQ \n MediaWiki \n xWiki \n TWiki \n TiddlyWiki \n What is an Open Source Knowledge Base? Before we dive into which open-source knowledge base software you should consider for your business, we should probably ensure we’re on the same page about what exactly open-source knowledge base software is. First things first, let’s start with the term knowledge base. A knowledge base is a central place that allows structured storage of information where users can search for and access this information. Knowledge base software should be the key tool that helps make this process seamless, simplified, and efficient. Knowledge base software is designed to help you create and manage your knowledge base to the best of your ability. this usually includes setting up the knowledge base architecture, creating and editing documentation, searching, and analyzing your knowledge base, and more. Ideally, this is the irreplaceable piece of the puzzle that operates your entire knowledge management system that helps orchestrate, manage, and optimize the flow of knowledge within your organization. That part seems pretty clear, right? Next, we’ll move on to",
|
|
118
|
+
image:
|
|
119
|
+
'https://static.helpjuice.com/helpjuice_production/uploads/upload/image/4752/direct/1636499945090-Open%20Source%20Knowledge%20Base%20Software.jpg',
|
|
120
|
+
favicon:
|
|
121
|
+
'https://static.helpjuice.com/assets/favicon-32x32-161f2153235b710a8ed7b9233ed6b195936bdb57bf1310e720f7fea79547cf9d.png',
|
|
122
|
+
},
|
|
123
|
+
],
|
|
124
|
+
costDollars: {
|
|
125
|
+
total: 0.015,
|
|
126
|
+
search: {
|
|
127
|
+
neural: 0.005,
|
|
128
|
+
},
|
|
129
|
+
contents: {
|
|
130
|
+
text: 0.01,
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import type { SearchResponse } from 'exa-js';
|
|
6
|
+
|
|
7
|
+
import Search1 from './exa-search-1748337321991';
|
|
8
|
+
import Search2 from './exa-search-1748337331526';
|
|
9
|
+
import Search3 from './exa-search-1748337344119';
|
|
10
|
+
|
|
11
|
+
export const SEARCH_RESULTS: SearchResponse<any>[] = [Search1, Search2, Search3];
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Effect from 'effect/Effect';
|
|
6
|
+
import * as Schema from 'effect/Schema';
|
|
7
|
+
import Exa from 'exa-js';
|
|
8
|
+
|
|
9
|
+
import { CredentialsService, defineFunction } from '@dxos/functions';
|
|
10
|
+
|
|
11
|
+
export default defineFunction({
|
|
12
|
+
key: 'dxos.org/function/exa',
|
|
13
|
+
name: 'Exa',
|
|
14
|
+
description: 'Search the web for information',
|
|
15
|
+
inputSchema: Schema.Struct({
|
|
16
|
+
query: Schema.String.annotations({
|
|
17
|
+
description: 'The query to search for.',
|
|
18
|
+
}),
|
|
19
|
+
}),
|
|
20
|
+
outputSchema: Schema.Unknown,
|
|
21
|
+
handler: Effect.fnUntraced(function* ({ data: { query } }) {
|
|
22
|
+
const credential = yield* CredentialsService.getCredential({ service: 'exa.ai' });
|
|
23
|
+
const exa = new Exa(credential.apiKey);
|
|
24
|
+
|
|
25
|
+
const context = yield* Effect.promise(async () =>
|
|
26
|
+
exa.searchAndContents(query, {
|
|
27
|
+
type: 'auto',
|
|
28
|
+
text: {
|
|
29
|
+
maxCharacters: 3_000,
|
|
30
|
+
},
|
|
31
|
+
livecrawl: 'always',
|
|
32
|
+
}),
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
return context;
|
|
36
|
+
}),
|
|
37
|
+
});
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Effect from 'effect/Effect';
|
|
6
|
+
import * as Schema from 'effect/Schema';
|
|
7
|
+
|
|
8
|
+
import { defineFunction } from '@dxos/functions';
|
|
9
|
+
|
|
10
|
+
import { SEARCH_RESULTS } from './data';
|
|
11
|
+
|
|
12
|
+
export default defineFunction({
|
|
13
|
+
key: 'dxos.org/function/exa-mock',
|
|
14
|
+
name: 'Exa mock',
|
|
15
|
+
description: 'Search the web for information',
|
|
16
|
+
inputSchema: Schema.Struct({
|
|
17
|
+
query: Schema.String.annotations({
|
|
18
|
+
description: 'The query to search for.',
|
|
19
|
+
}),
|
|
20
|
+
}),
|
|
21
|
+
outputSchema: Schema.Unknown,
|
|
22
|
+
handler: Effect.fnUntraced(function* ({ data: { query } }) {
|
|
23
|
+
const result = SEARCH_RESULTS.reduce(
|
|
24
|
+
(closest, current) => {
|
|
25
|
+
if (!current.autopromptString) {
|
|
26
|
+
return closest;
|
|
27
|
+
}
|
|
28
|
+
if (!closest) {
|
|
29
|
+
return current;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Calculate Levenshtein distance
|
|
33
|
+
const dist1 = levenshteinDistance(query, current.autopromptString);
|
|
34
|
+
const dist2 = levenshteinDistance(query, closest.autopromptString || '');
|
|
35
|
+
|
|
36
|
+
// Weight by length of the longer string to normalize
|
|
37
|
+
const weight1 = dist1 / Math.max(query.length, current.autopromptString.length);
|
|
38
|
+
const weight2 = dist2 / Math.max(query.length, closest.autopromptString?.length || 0);
|
|
39
|
+
|
|
40
|
+
return weight1 < weight2 ? current : closest;
|
|
41
|
+
},
|
|
42
|
+
null as (typeof SEARCH_RESULTS)[0] | null,
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
return result;
|
|
46
|
+
}),
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
const levenshteinDistance = (str1: string, str2: string): number => {
|
|
50
|
+
const m = str1.length;
|
|
51
|
+
const n = str2.length;
|
|
52
|
+
const dp: number[][] = Array(m + 1)
|
|
53
|
+
.fill(null)
|
|
54
|
+
.map(() => Array(n + 1).fill(0));
|
|
55
|
+
|
|
56
|
+
for (let i = 0; i <= m; i++) {
|
|
57
|
+
dp[i][0] = i;
|
|
58
|
+
}
|
|
59
|
+
for (let j = 0; j <= n; j++) {
|
|
60
|
+
dp[0][j] = j;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
for (let i = 1; i <= m; i++) {
|
|
64
|
+
for (let j = 1; j <= n; j++) {
|
|
65
|
+
dp[i][j] =
|
|
66
|
+
str1[i - 1] === str2[j - 1] ? dp[i - 1][j - 1] : Math.min(dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1]) + 1;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return dp[m][n];
|
|
71
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as HttpClient from '@effect/platform/HttpClient';
|
|
6
|
+
import * as Effect from 'effect/Effect';
|
|
7
|
+
import * as Schema from 'effect/Schema';
|
|
8
|
+
|
|
9
|
+
import { CredentialsService, defineFunction, withAuthorization } from '@dxos/functions';
|
|
10
|
+
|
|
11
|
+
export default defineFunction({
|
|
12
|
+
key: 'dxos.org/function/github/fetch-prs',
|
|
13
|
+
name: 'Fetch PRs',
|
|
14
|
+
description: 'Fetches PRs from GitHub.',
|
|
15
|
+
inputSchema: Schema.Struct({
|
|
16
|
+
owner: Schema.String.annotations({
|
|
17
|
+
description: 'GitHub owner.',
|
|
18
|
+
}),
|
|
19
|
+
repo: Schema.String.annotations({
|
|
20
|
+
description: 'GitHub repository.',
|
|
21
|
+
}),
|
|
22
|
+
}),
|
|
23
|
+
handler: Effect.fnUntraced(function* ({ data }) {
|
|
24
|
+
const credential = yield* CredentialsService.getCredential({ service: 'github.com' });
|
|
25
|
+
const client = yield* HttpClient.HttpClient.pipe(Effect.map(withAuthorization(credential.apiKey!)));
|
|
26
|
+
|
|
27
|
+
const response = yield* client.get(`https://api.github.com/repos/${data.owner}/${data.repo}/pulls`);
|
|
28
|
+
const json: any = yield* response.json;
|
|
29
|
+
return json;
|
|
30
|
+
}),
|
|
31
|
+
});
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { describe, it } from '@effect/vitest';
|
|
6
|
+
import * as Effect from 'effect/Effect';
|
|
7
|
+
|
|
8
|
+
import { AssistantTestLayer } from '@dxos/assistant/testing';
|
|
9
|
+
import { Obj, Query } from '@dxos/echo';
|
|
10
|
+
import { Database } from '@dxos/echo';
|
|
11
|
+
import { TestHelpers } from '@dxos/effect/testing';
|
|
12
|
+
import { FunctionInvocationService } from '@dxos/functions';
|
|
13
|
+
import { Person, Pipeline, Task } from '@dxos/types';
|
|
14
|
+
|
|
15
|
+
import { LINEAR_ID_KEY, default as fetchLinearIssues } from './sync-issues';
|
|
16
|
+
|
|
17
|
+
const TestLayer = AssistantTestLayer({
|
|
18
|
+
functions: [fetchLinearIssues],
|
|
19
|
+
types: [Task.Task, Person.Person, Pipeline.Pipeline],
|
|
20
|
+
credentials: [{ service: 'linear.app', apiKey: process.env.LINEAR_API_KEY }],
|
|
21
|
+
tracing: 'pretty',
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
describe.skip('Linear', { timeout: 600_000 }, () => {
|
|
25
|
+
it.effect(
|
|
26
|
+
'sync',
|
|
27
|
+
Effect.fnUntraced(
|
|
28
|
+
function* (_) {
|
|
29
|
+
yield* Database.flush({ indexes: true });
|
|
30
|
+
|
|
31
|
+
yield* FunctionInvocationService.invokeFunction(fetchLinearIssues, {
|
|
32
|
+
team: '1127c63a-6f77-4725-9229-50f6cd47321c',
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
const persons = yield* Database.runQuery(Query.type(Person.Person));
|
|
36
|
+
console.log('people', {
|
|
37
|
+
count: persons.length,
|
|
38
|
+
people: persons.map((_) => `(${_.id}) ${Obj.getLabel(_)} [${Obj.getKeys(_, LINEAR_ID_KEY)[0]?.id}]`),
|
|
39
|
+
});
|
|
40
|
+
const projects = yield* Database.runQuery(Query.type(Pipeline.Pipeline));
|
|
41
|
+
console.log('projects', {
|
|
42
|
+
count: projects.length,
|
|
43
|
+
projects: projects.map((_) => `(${_.id}) ${Obj.getLabel(_)} [${Obj.getKeys(_, LINEAR_ID_KEY)[0]?.id}]`),
|
|
44
|
+
});
|
|
45
|
+
const tasks = yield* Database.runQuery(Query.type(Task.Task));
|
|
46
|
+
console.log('tasks', {
|
|
47
|
+
count: tasks.length,
|
|
48
|
+
tasks: tasks.map((_) => `(${_.id}) ${Obj.getLabel(_)} [${Obj.getKeys(_, LINEAR_ID_KEY)[0]?.id}]`),
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
yield* Database.flush({ indexes: true });
|
|
52
|
+
},
|
|
53
|
+
Effect.provide(TestLayer),
|
|
54
|
+
TestHelpers.taggedTest('sync'),
|
|
55
|
+
TestHelpers.provideTestContext,
|
|
56
|
+
),
|
|
57
|
+
);
|
|
58
|
+
});
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as FetchHttpClient from '@effect/platform/FetchHttpClient';
|
|
6
|
+
import * as HttpClient from '@effect/platform/HttpClient';
|
|
7
|
+
import * as Array from 'effect/Array';
|
|
8
|
+
import * as Effect from 'effect/Effect';
|
|
9
|
+
import * as Function from 'effect/Function';
|
|
10
|
+
import * as Schema from 'effect/Schema';
|
|
11
|
+
|
|
12
|
+
import { Filter, Obj, Query, Ref, type Type } from '@dxos/echo';
|
|
13
|
+
import { Database } from '@dxos/echo';
|
|
14
|
+
import { CredentialsService, defineFunction, withAuthorization } from '@dxos/functions';
|
|
15
|
+
import { log } from '@dxos/log';
|
|
16
|
+
import { Person, Pipeline, Task } from '@dxos/types';
|
|
17
|
+
|
|
18
|
+
import { syncObjects } from '../../sync';
|
|
19
|
+
import { graphqlRequestBody } from '../../util';
|
|
20
|
+
|
|
21
|
+
const queryIssues = `
|
|
22
|
+
query Issues($teamId: String!, $after: DateTimeOrDuration!) {
|
|
23
|
+
team(id: $teamId) {
|
|
24
|
+
id
|
|
25
|
+
name
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
issues(last: 150, orderBy: updatedAt, filter: {
|
|
29
|
+
updatedAt: { gt: $after }
|
|
30
|
+
}) {
|
|
31
|
+
edges {
|
|
32
|
+
node {
|
|
33
|
+
id
|
|
34
|
+
title
|
|
35
|
+
createdAt
|
|
36
|
+
updatedAt
|
|
37
|
+
description
|
|
38
|
+
assignee { id, name }
|
|
39
|
+
state {
|
|
40
|
+
name
|
|
41
|
+
}
|
|
42
|
+
project {
|
|
43
|
+
id
|
|
44
|
+
name
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
cursor
|
|
48
|
+
}
|
|
49
|
+
pageInfo {
|
|
50
|
+
hasNextPage
|
|
51
|
+
endCursor
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
`;
|
|
57
|
+
|
|
58
|
+
type LinearIssue = {
|
|
59
|
+
id: string;
|
|
60
|
+
title: string;
|
|
61
|
+
createdAt: string;
|
|
62
|
+
updatedAt: string;
|
|
63
|
+
description: string;
|
|
64
|
+
assignee: LinearPerson;
|
|
65
|
+
state: { name: string };
|
|
66
|
+
project: { id: string; name: string };
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
type LinearPerson = {
|
|
70
|
+
id: string;
|
|
71
|
+
name: string;
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
export const LINEAR_ID_KEY = 'linear.app/id';
|
|
75
|
+
export const LINEAR_TEAM_ID_KEY = 'linear.app/teamId';
|
|
76
|
+
export const LINEAR_UPDATED_AT_KEY = 'linear.app/updatedAt';
|
|
77
|
+
|
|
78
|
+
export default defineFunction({
|
|
79
|
+
key: 'dxos.org/function/linear/sync-issues',
|
|
80
|
+
name: 'Linear',
|
|
81
|
+
description: 'Sync issues from Linear.',
|
|
82
|
+
inputSchema: Schema.Struct({
|
|
83
|
+
team: Schema.String.annotations({
|
|
84
|
+
description: 'Linear team id.',
|
|
85
|
+
}),
|
|
86
|
+
}),
|
|
87
|
+
handler: Effect.fnUntraced(function* ({ data }) {
|
|
88
|
+
const credential = yield* CredentialsService.getCredential({ service: 'linear.app' });
|
|
89
|
+
const client = yield* HttpClient.HttpClient.pipe(Effect.map(withAuthorization(credential.apiKey!)));
|
|
90
|
+
|
|
91
|
+
// Get the timestamp that was previosly synced.
|
|
92
|
+
const after = yield* getLatestUpdateTimestamp(data.team, Task.Task);
|
|
93
|
+
log.info('will fetch', { after });
|
|
94
|
+
|
|
95
|
+
// Fetch the issues that have changed since the last sync.
|
|
96
|
+
const response = yield* client.post('https://api.linear.app/graphql', {
|
|
97
|
+
body: yield* graphqlRequestBody(queryIssues, {
|
|
98
|
+
teamId: data.team,
|
|
99
|
+
after,
|
|
100
|
+
}),
|
|
101
|
+
});
|
|
102
|
+
const json: any = yield* response.json;
|
|
103
|
+
const tasks = (json.data.team.issues.edges as any[]).map((edge: any) =>
|
|
104
|
+
mapLinearIssue(edge.node as LinearIssue, { teamId: data.team }),
|
|
105
|
+
);
|
|
106
|
+
log.info('Fetched tasks', { count: tasks.length });
|
|
107
|
+
|
|
108
|
+
// Synchronize new objects with ECHO.
|
|
109
|
+
return {
|
|
110
|
+
objects: yield* syncObjects(tasks, { foreignKeyId: LINEAR_ID_KEY }),
|
|
111
|
+
syncComplete: tasks.length < 150,
|
|
112
|
+
};
|
|
113
|
+
}, Effect.provide(FetchHttpClient.layer)),
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
const getLatestUpdateTimestamp: (
|
|
117
|
+
teamId: string,
|
|
118
|
+
dataType: Type.Obj.Any,
|
|
119
|
+
) => Effect.Effect<string, never, Database.Service> = Effect.fnUntraced(function* (teamId, dataType) {
|
|
120
|
+
const existingTasks = yield* Database.runQuery(
|
|
121
|
+
Query.type(dataType).select(Filter.foreignKeys(dataType, [{ source: LINEAR_TEAM_ID_KEY, id: teamId }])),
|
|
122
|
+
);
|
|
123
|
+
return Function.pipe(
|
|
124
|
+
existingTasks,
|
|
125
|
+
Array.map((task) => Obj.getKeys(task, LINEAR_UPDATED_AT_KEY).at(0)?.id),
|
|
126
|
+
Array.filter((x) => x !== undefined),
|
|
127
|
+
Array.reduce('2025-01-01T00:00:00.000Z', (acc: string, x: string) => (x > acc ? x : acc)),
|
|
128
|
+
);
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
const mapLinearPerson = (person: LinearPerson, { teamId }: { teamId: string }): Person.Person =>
|
|
132
|
+
Obj.make(Person.Person, {
|
|
133
|
+
[Obj.Meta]: {
|
|
134
|
+
keys: [
|
|
135
|
+
{
|
|
136
|
+
id: person.id,
|
|
137
|
+
source: LINEAR_ID_KEY,
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
id: teamId,
|
|
141
|
+
source: LINEAR_TEAM_ID_KEY,
|
|
142
|
+
},
|
|
143
|
+
],
|
|
144
|
+
},
|
|
145
|
+
nickname: person.name,
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
const mapLinearIssue = (issue: LinearIssue, { teamId }: { teamId: string }): Task.Task =>
|
|
149
|
+
Obj.make(Task.Task, {
|
|
150
|
+
[Obj.Meta]: {
|
|
151
|
+
keys: [
|
|
152
|
+
{
|
|
153
|
+
id: issue.id,
|
|
154
|
+
source: LINEAR_ID_KEY,
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
id: issue.updatedAt,
|
|
158
|
+
source: LINEAR_UPDATED_AT_KEY,
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
id: teamId,
|
|
162
|
+
source: LINEAR_TEAM_ID_KEY,
|
|
163
|
+
},
|
|
164
|
+
],
|
|
165
|
+
},
|
|
166
|
+
title: issue.title ?? undefined,
|
|
167
|
+
description: issue.description ?? undefined,
|
|
168
|
+
assigned: !issue.assignee ? undefined : Ref.make(mapLinearPerson(issue.assignee, { teamId })),
|
|
169
|
+
// TODO(dmaretskyi): Sync those (+ linear team as org?).
|
|
170
|
+
// state: issue.state.name,
|
|
171
|
+
|
|
172
|
+
project: !issue.project
|
|
173
|
+
? undefined
|
|
174
|
+
: Ref.make(
|
|
175
|
+
Pipeline.make({
|
|
176
|
+
[Obj.Meta]: {
|
|
177
|
+
keys: [
|
|
178
|
+
{
|
|
179
|
+
id: issue.project.id,
|
|
180
|
+
source: LINEAR_ID_KEY,
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
id: teamId,
|
|
184
|
+
source: LINEAR_TEAM_ID_KEY,
|
|
185
|
+
},
|
|
186
|
+
],
|
|
187
|
+
},
|
|
188
|
+
name: issue.project.name,
|
|
189
|
+
}),
|
|
190
|
+
),
|
|
191
|
+
});
|