Merge branch 'dev' into fix_issue_with_path

This commit is contained in:
lxobr 2025-09-10 09:51:30 +02:00 committed by GitHub
commit b98cb48382
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
20 changed files with 435 additions and 95 deletions

View file

@ -16,7 +16,7 @@
STRUCTURED_OUTPUT_FRAMEWORK="instructor" STRUCTURED_OUTPUT_FRAMEWORK="instructor"
LLM_API_KEY="your_api_key" LLM_API_KEY="your_api_key"
LLM_MODEL="openai/gpt-5-mini" LLM_MODEL="openai/gpt-4o-mini"
LLM_PROVIDER="openai" LLM_PROVIDER="openai"
LLM_ENDPOINT="" LLM_ENDPOINT=""
LLM_API_VERSION="" LLM_API_VERSION=""
@ -33,7 +33,7 @@ EMBEDDING_MAX_TOKENS=8191
# If using BAML structured output these env variables will be used # If using BAML structured output these env variables will be used
BAML_LLM_PROVIDER=openai BAML_LLM_PROVIDER=openai
BAML_LLM_MODEL="gpt-5-mini" BAML_LLM_MODEL="gpt-4o-mini"
BAML_LLM_ENDPOINT="" BAML_LLM_ENDPOINT=""
BAML_LLM_API_KEY="your_api_key" BAML_LLM_API_KEY="your_api_key"
BAML_LLM_API_VERSION="" BAML_LLM_API_VERSION=""

97
.github/ISSUE_TEMPLATE/bug_report.yml vendored Normal file
View file

@ -0,0 +1,97 @@
name: 🐛 Bug Report
description: Report a bug or unexpected behavior
title: "[Bug]: "
labels: ["bug", "needs-triage"]
assignees: []
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill out this bug report! Please provide a clear and detailed description.
- type: textarea
id: description
attributes:
label: Bug Description
description: Please provide a clear and concise description of the bug. What happened vs what you expected?
placeholder: Describe the bug in detail...
validations:
required: true
- type: textarea
id: reproduction
attributes:
label: Steps to Reproduce
description: Please provide detailed steps to reproduce the issue
placeholder: |
1. Go to...
2. Click on...
3. See error...
validations:
required: true
- type: textarea
id: expected
attributes:
label: Expected Behavior
description: What did you expect to happen?
placeholder: Describe what you expected...
validations:
required: true
- type: textarea
id: actual
attributes:
label: Actual Behavior
description: What actually happened?
placeholder: Describe what actually happened...
validations:
required: true
- type: textarea
id: environment
attributes:
label: Environment
description: Please provide your environment details
placeholder: |
- OS: [e.g. macOS 13.0, Ubuntu 20.04]
- Python version: [e.g. 3.9.0]
- Cognee version: [e.g. 0.1.0]
- LLM Provider: [e.g. OpenAI, Ollama]
- Database: [e.g. Neo4j, FalkorDB]
validations:
required: true
- type: textarea
id: logs
attributes:
label: Logs/Error Messages
description: Please include any relevant logs or error messages
placeholder: Paste logs here...
render: shell
validations:
required: false
- type: textarea
id: additional
attributes:
label: Additional Context
description: Add any other context about the problem here
placeholder: Any additional information...
validations:
required: false
- type: checkboxes
id: checklist
attributes:
label: Pre-submission Checklist
description: Please confirm the following before submitting
options:
- label: I have searched existing issues to ensure this bug hasn't been reported already
required: true
- label: I have provided a clear and detailed description of the bug
required: true
- label: I have included steps to reproduce the issue
required: true
- label: I have included my environment details
required: true

8
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View file

@ -0,0 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: 💬 Discord Community
url: https://discord.gg/NQtRemgQVD
about: Join our Discord community for questions, discussions, and support
- name: 📖 Documentation
url: https://docs.cognee.ai
about: Check our documentation for guides and API references

View file

@ -0,0 +1,73 @@
name: 📚 Documentation Issue
description: Report an issue with documentation or suggest documentation improvements
title: "[Docs]: "
labels: ["documentation", "needs-triage"]
assignees: []
body:
- type: markdown
attributes:
value: |
Thanks for helping improve our documentation! Please provide details about the documentation issue or improvement.
- type: dropdown
id: doc-type
attributes:
label: Documentation Type
description: What type of documentation issue is this?
options:
- Missing documentation
- Incorrect documentation
- Unclear documentation
- Documentation improvement
- New documentation request
validations:
required: true
- type: textarea
id: location
attributes:
label: Documentation Location
description: Where is the documentation issue located? (URL, file path, section, etc.)
placeholder: https://cognee.ai/docs/... or specific file/section
validations:
required: true
- type: textarea
id: issue
attributes:
label: Issue Description
description: Please describe the documentation issue or improvement needed
placeholder: The documentation is unclear about...
validations:
required: true
- type: textarea
id: suggestion
attributes:
label: Suggested Improvement
description: How would you improve this documentation?
placeholder: I suggest changing this to...
validations:
required: false
- type: textarea
id: additional
attributes:
label: Additional Context
description: Add any other context about the documentation issue
placeholder: Additional context...
validations:
required: false
- type: checkboxes
id: checklist
attributes:
label: Pre-submission Checklist
description: Please confirm the following before submitting
options:
- label: I have searched existing issues to ensure this documentation issue hasn't been reported already
required: true
- label: I have provided a clear description of the documentation issue
required: true
- label: I have specified the location of the documentation issue
required: true

View file

@ -0,0 +1,78 @@
name: 🚀 Feature Request
description: Suggest a new feature or enhancement
title: "[Feature]: "
labels: ["enhancement", "needs-triage"]
assignees: []
body:
- type: markdown
attributes:
value: |
Thanks for suggesting a new feature! Please provide a clear and detailed description of your idea.
- type: textarea
id: problem
attributes:
label: Problem Statement
description: Is your feature request related to a problem? Please describe the problem you're trying to solve.
placeholder: I'm always frustrated when...
validations:
required: true
- type: textarea
id: solution
attributes:
label: Proposed Solution
description: Describe the solution you'd like to see implemented
placeholder: I would like to see...
validations:
required: true
- type: textarea
id: alternatives
attributes:
label: Alternatives Considered
description: Describe any alternative solutions or features you've considered
placeholder: I have also considered...
validations:
required: false
- type: textarea
id: use-case
attributes:
label: Use Case
description: Describe your specific use case and how this feature would help
placeholder: This feature would help me...
validations:
required: true
- type: textarea
id: implementation
attributes:
label: Implementation Ideas
description: If you have ideas about how this could be implemented, please share them
placeholder: This could be implemented by...
validations:
required: false
- type: textarea
id: additional
attributes:
label: Additional Context
description: Add any other context, screenshots, or examples about the feature request
placeholder: Additional context...
validations:
required: false
- type: checkboxes
id: checklist
attributes:
label: Pre-submission Checklist
description: Please confirm the following before submitting
options:
- label: I have searched existing issues to ensure this feature hasn't been requested already
required: true
- label: I have provided a clear problem statement and proposed solution
required: true
- label: I have described my specific use case
required: true

View file

@ -1,7 +1,50 @@
<!-- .github/pull_request_template.md --> <!-- .github/pull_request_template.md -->
## Description ## Description
<!-- Provide a clear description of the changes in this PR --> <!--
Please provide a clear, human-generated description of the changes in this PR.
DO NOT use AI-generated descriptions. We want to understand your thought process and reasoning.
-->
## Type of Change
<!-- Please check the relevant option -->
- [ ] Bug fix (non-breaking change that fixes an issue)
- [ ] New feature (non-breaking change that adds functionality)
- [ ] Breaking change (fix or feature that would cause existing functionality to change)
- [ ] Documentation update
- [ ] Code refactoring
- [ ] Performance improvement
- [ ] Other (please specify):
## Changes Made
<!-- List the specific changes made in this PR -->
-
-
-
## Testing
<!-- Describe how you tested your changes -->
## Screenshots/Videos (if applicable)
<!-- Add screenshots or videos to help explain your changes -->
## Pre-submission Checklist
<!-- Please check all boxes that apply before submitting your PR -->
- [ ] **I have tested my changes thoroughly before submitting this PR**
- [ ] **This PR contains minimal changes necessary to address the issue/feature**
- [ ] My code follows the project's coding standards and style guidelines
- [ ] I have added tests that prove my fix is effective or that my feature works
- [ ] I have added necessary documentation (if applicable)
- [ ] All new and existing tests pass
- [ ] I have searched existing PRs to ensure this change hasn't been submitted already
- [ ] I have linked any relevant issues in the description
- [ ] My commits have clear and descriptive messages
## Related Issues
<!-- Link any related issues using "Fixes #issue_number" or "Relates to #issue_number" -->
## Additional Notes
<!-- Add any additional notes, concerns, or context for reviewers -->
## DCO Affirmation ## DCO Affirmation
I affirm that all code in every commit of this pull request conforms to the terms of the Topoteretes Developer Certificate of Origin. I affirm that all code in every commit of this pull request conforms to the terms of the Topoteretes Developer Certificate of Origin.

View file

@ -1,22 +1,29 @@
"use client";
import Link from "next/link"; import Link from "next/link";
import { BackIcon } from "@/ui/Icons"; import { BackIcon } from "@/ui/Icons";
import { CTAButton } from "@/ui/elements"; import { CTAButton } from "@/ui/elements";
import Header from "@/ui/Layout/Header"; import Header from "@/ui/Layout/Header";
import { useAuthenticatedUser } from "@/modules/auth";
export default function Account() { export default function Account() {
const { user } = useAuthenticatedUser();
const account = { const account = {
name: "John Doe", name: user ? user.name || user.email : "NN",
}; };
return ( return (
<> <div className="bg-gray-200 h-full max-w-[1920px] mx-auto">
<div className="absolute top-0 right-0 bottom-0 left-0 flex flex-row gap-2.5"> <video
<div className="flex-1/5 bg-gray-100 h-full"></div> autoPlay
<div className="flex-1/5 bg-gray-100 h-full"></div> loop
<div className="flex-1/5 bg-gray-100 h-full"></div> muted
<div className="flex-1/5 bg-gray-100 h-full"></div> playsInline
<div className="flex-1/5 bg-gray-100 h-full"></div> className="fixed inset-0 z-0 object-cover w-full h-full"
</div> >
<source src="/videos/background-video-blur.mp4" type="video/mp4" />
Your browser does not support the video tag.
</video>
<Header /> <Header />
@ -46,6 +53,6 @@ export default function Account() {
<div className="flex-1/5 py-4 px-5 rounded-xl"> <div className="flex-1/5 py-4 px-5 rounded-xl">
</div> </div>
</div> </div>
</> </div>
); );
} }

View file

@ -1,10 +1,11 @@
import { FormEvent, useCallback, useState } from "react"; import { FormEvent, useCallback, useState } from "react";
import { CloseIcon, PlusIcon } from "@/ui/Icons"; import { CloseIcon, PlusIcon } from "@/ui/Icons";
import { useModal } from "@/ui/elements/Modal"; import { useModal } from "@/ui/elements/Modal";
import { CTAButton, GhostButton, IconButton, Modal, Select } from "@/ui/elements"; import { CTAButton, GhostButton, IconButton, Modal, NeutralButton, Select } from "@/ui/elements";
import addData from "@/modules/ingestion/addData"; import addData from "@/modules/ingestion/addData";
import { Dataset } from "@/modules/ingestion/useDatasets"; import { Dataset } from "@/modules/ingestion/useDatasets";
import cognifyDataset from "@/modules/datasets/cognifyDataset";
interface AddDataToCogneeProps { interface AddDataToCogneeProps {
datasets: Dataset[]; datasets: Dataset[];
@ -39,9 +40,16 @@ export default function AddDataToCognee({ datasets, refreshDatasets }: AddDataTo
}, },
Array.from(filesForUpload) Array.from(filesForUpload)
) )
.then(() => { .then(({ dataset_id, dataset_name }) => {
refreshDatasets(); refreshDatasets();
setFilesForUpload(null); setFilesForUpload(null);
return cognifyDataset({
id: dataset_id,
name: dataset_name,
data: [], // not important, just to mimick Dataset
status: "", // not important, just to mimick Dataset
});
}); });
}, [filesForUpload, refreshDatasets]); }, [filesForUpload, refreshDatasets]);
@ -64,20 +72,22 @@ export default function AddDataToCognee({ datasets, refreshDatasets }: AddDataTo
<div className="w-full max-w-2xl"> <div className="w-full max-w-2xl">
<div className="flex flex-row items-center justify-between"> <div className="flex flex-row items-center justify-between">
<span className="text-2xl">Add new data to a dataset?</span> <span className="text-2xl">Add new data to a dataset?</span>
<IconButton onClick={closeAddDataModal}><CloseIcon /></IconButton> <IconButton disabled={isProcessingDataWithCognee} onClick={closeAddDataModal}><CloseIcon /></IconButton>
</div> </div>
<div className="mt-8 mb-6">Please select a dataset to add data in.<br/> If you don&apos;t have any, don&apos;t worry, we will create one for you.</div> <div className="mt-8 mb-6">Please select a dataset to add data in.<br/> If you don&apos;t have any, don&apos;t worry, we will create one for you.</div>
<form onSubmit={submitDataToCognee}> <form onSubmit={submitDataToCognee}>
<div className="max-w-md flex flex-col gap-4"> <div className="max-w-md flex flex-col gap-4">
<Select name="datasetName"> <Select name="datasetName">
<option value="">select a dataset</option> {!datasets.length && <option value="">main_dataset</option>}
{datasets.map((dataset: Dataset) => <option key={dataset.id} value={dataset.id}>{dataset.name}</option>)} {datasets.map((dataset: Dataset, index) => (
<option selected={index===0} key={dataset.id} value={dataset.id}>{dataset.name}</option>
))}
</Select> </Select>
<GhostButton className="w-full relative justify-start pl-4"> <NeutralButton className="w-full relative justify-start pl-4">
<input onChange={prepareFiles} required name="files" tabIndex={-1} type="file" multiple className="absolute w-full h-full cursor-pointer opacity-0" /> <input onChange={prepareFiles} required name="files" tabIndex={-1} type="file" multiple className="absolute w-full h-full cursor-pointer opacity-0" />
<span>select files</span> <span>select files</span>
</GhostButton> </NeutralButton>
{filesForUpload?.length && ( {filesForUpload?.length && (
<div className="pt-4 mt-4 border-t-1 border-t-gray-100"> <div className="pt-4 mt-4 border-t-1 border-t-gray-100">
@ -91,7 +101,7 @@ export default function AddDataToCognee({ datasets, refreshDatasets }: AddDataTo
)} )}
</div> </div>
<div className="flex flex-row gap-4 mt-4 justify-end"> <div className="flex flex-row gap-4 mt-4 justify-end">
<GhostButton type="button" onClick={() => closeAddDataModal()}>cancel</GhostButton> <GhostButton disabled={isProcessingDataWithCognee} type="button" onClick={() => closeAddDataModal()}>cancel</GhostButton>
<CTAButton disabled={isProcessingDataWithCognee} type="submit"> <CTAButton disabled={isProcessingDataWithCognee} type="submit">
{isProcessingDataWithCognee ? "processing..." : "add"} {isProcessingDataWithCognee ? "processing..." : "add"}
</CTAButton> </CTAButton>

View file

@ -93,6 +93,17 @@ export default function Dashboard() {
return ( return (
<div className="h-full flex flex-col bg-gray-200"> <div className="h-full flex flex-col bg-gray-200">
<video
autoPlay
loop
muted
playsInline
className="fixed inset-0 z-0 object-cover w-full h-full"
>
<source src="/videos/background-video-blur.mp4" type="video/mp4" />
Your browser does not support the video tag.
</video>
<Header /> <Header />
<div className="relative flex-1 flex flex-row gap-2.5 items-start w-full max-w-[1920px] max-h-[calc(100% - 3.5rem)] overflow-hidden mx-auto px-2.5 py-2.5"> <div className="relative flex-1 flex flex-row gap-2.5 items-start w-full max-w-[1920px] max-h-[calc(100% - 3.5rem)] overflow-hidden mx-auto px-2.5 py-2.5">

View file

@ -8,8 +8,8 @@ import { CloseIcon, DatasetIcon, MinusIcon, PlusIcon } from "@/ui/Icons";
import useDatasets, { Dataset } from "@/modules/ingestion/useDatasets"; import useDatasets, { Dataset } from "@/modules/ingestion/useDatasets";
import addData from "@/modules/ingestion/addData"; import addData from "@/modules/ingestion/addData";
import cognifyDataset from "@/modules/datasets/cognifyDataset"; import cognifyDataset from "@/modules/datasets/cognifyDataset";
import { DataFile } from '@/modules/ingestion/useData'; import { DataFile } from "@/modules/ingestion/useData";
import { LoadingIndicator } from '@/ui/App'; import { LoadingIndicator } from "@/ui/App";
interface DatasetsChangePayload { interface DatasetsChangePayload {
datasets: Dataset[] datasets: Dataset[]
@ -156,20 +156,16 @@ export default function DatasetsAccordion({
} }
}; };
const { const [datasetInProcessing, setProcessingDataset] = useState<Dataset | null>(null);
value: isProcessingFiles,
setTrue: setProcessingFilesInProgress,
setFalse: setProcessingFilesDone,
} = useBoolean(false);
const handleAddFiles = (dataset: Dataset, event: ChangeEvent<HTMLInputElement>) => { const handleAddFiles = (dataset: Dataset, event: ChangeEvent<HTMLInputElement>) => {
event.stopPropagation(); event.stopPropagation();
if (isProcessingFiles) { if (datasetInProcessing) {
return; return;
} }
setProcessingFilesInProgress(); setProcessingDataset(dataset);
if (!event.target.files) { if (!event.target.files) {
return; return;
@ -184,12 +180,10 @@ export default function DatasetsAccordion({
return addData(dataset, files) return addData(dataset, files)
.then(async () => { .then(async () => {
await getDatasetData(dataset.id); await getDatasetData(dataset.id);
const onUpdate = () => {};
return cognifyDataset(dataset, onUpdate) return cognifyDataset(dataset)
.finally(() => { .finally(() => {
setProcessingFilesDone(); setProcessingDataset(null);
}); });
}); });
}; };
@ -230,7 +224,12 @@ export default function DatasetsAccordion({
isOpen={isDatasetsPanelOpen} isOpen={isDatasetsPanelOpen}
openAccordion={openDatasetsPanel} openAccordion={openDatasetsPanel}
closeAccordion={closeDatasetsPanel} closeAccordion={closeDatasetsPanel}
tools={tools || <IconButton onClick={handleDatasetAdd}><PlusIcon /></IconButton>} tools={(
<div className="flex flex-row gap-4 items-center">
{tools}
<IconButton onClick={handleDatasetAdd}><PlusIcon /></IconButton>
</div>
)}
switchCaretPosition={switchCaretPosition} switchCaretPosition={switchCaretPosition}
className={className} className={className}
contentClassName={contentClassName} contentClassName={contentClassName}
@ -247,7 +246,7 @@ export default function DatasetsAccordion({
key={dataset.id} key={dataset.id}
title={( title={(
<div className="flex flex-row gap-2 items-center py-1.5 cursor-pointer"> <div className="flex flex-row gap-2 items-center py-1.5 cursor-pointer">
{isProcessingFiles ? <LoadingIndicator /> : <DatasetIcon />} {datasetInProcessing?.id == dataset.id ? <LoadingIndicator /> : <DatasetIcon />}
<span className="text-xs">{dataset.name}</span> <span className="text-xs">{dataset.name}</span>
</div> </div>
)} )}

View file

@ -5,16 +5,17 @@ import Header from "@/ui/Layout/Header";
export default function Plan() { export default function Plan() {
return ( return (
<> <div className="bg-gray-200 h-full max-w-[1920px] mx-auto">
<div className="absolute top-0 right-0 bottom-0 left-0 flex flex-row gap-2.5"> <video
<div className="flex-1/5 bg-gray-100 h-full"></div> autoPlay
<div className="flex-3/5 h-full flex flex-row gap-2.5"> loop
<div className="flex-1/3 bg-gray-100 h-full"></div> muted
<div className="flex-1/3 bg-gray-100 h-full"></div> playsInline
<div className="flex-1/3 bg-gray-100 h-full"></div> className="fixed inset-0 z-0 object-cover w-full h-full"
</div> >
<div className="flex-1/5 bg-gray-100 h-full"></div> <source src="/videos/background-video-blur.mp4" type="video/mp4" />
</div> Your browser does not support the video tag.
</video>
<Header /> <Header />
@ -27,25 +28,29 @@ export default function Plan() {
</div> </div>
<div className="flex-3/5"> <div className="flex-3/5">
<div className="bg-[rgba(255,255,255,0.7)] rounded-xl px-5 py-4 mb-2">
Affordable and transparent pricing
</div>
<div className="grid grid-cols-3 gap-x-2.5"> <div className="grid grid-cols-3 gap-x-2.5">
<div className="pt-13 py-4 px-5 mb-2.5 rounded-tl-xl rounded-tr-xl bg-white h-full"> <div className="pt-13 py-4 px-5 mb-2.5 rounded-tl-xl rounded-tr-xl bg-[rgba(255,255,255,0.7)] h-full">
<div>Basic</div> <div>Basic</div>
<div className="text-3xl mb-4 font-bold">Free</div> <div className="text-3xl mb-4 font-bold">Free</div>
</div> </div>
<div className="pt-13 py-4 px-5 mb-2.5 rounded-tl-xl rounded-tr-xl bg-white h-full"> <div className="pt-13 py-4 px-5 mb-2.5 rounded-tl-xl rounded-tr-xl bg-[rgba(255,255,255,0.7)] h-full">
<div>On-prem Subscription</div> <div>On-prem Subscription</div>
<div className="mb-4"><span className="text-3xl font-bold">$2470</span><span className="text-gray-400"> /per month</span></div> <div className="mb-4"><span className="text-3xl font-bold">$2470</span><span className="text-gray-400"> /per month</span></div>
<div className="mb-9"><span className="font-bold">Save 20% </span>yearly</div> <div className="mb-9"><span className="font-bold">Save 20% </span>yearly</div>
</div> </div>
<div className="pt-13 py-4 px-5 mb-2.5 rounded-tl-xl rounded-tr-xl bg-white h-full"> <div className="pt-13 py-4 px-5 mb-2.5 rounded-tl-xl rounded-tr-xl bg-[rgba(255,255,255,0.7)] h-full">
<div>Cloud Subscription</div> <div>Cloud Subscription</div>
<div className="mb-4"><span className="text-3xl font-bold">$25</span><span className="text-gray-400"> /per month</span></div> <div className="mb-4"><span className="text-3xl font-bold">$25</span><span className="text-gray-400"> /per month</span></div>
<div className="mb-9 text-gray-400">(beta pricing)</div> <div className="mb-9 text-gray-400">(beta pricing)</div>
</div> </div>
<div className="bg-white rounded-bl-xl rounded-br-xl h-full"> <div className="bg-[rgba(255,255,255,0.7)] rounded-bl-xl rounded-br-xl h-full py-4 px-5">
<div className="mb-1 invisible">Everything in the free plan, plus...</div> <div className="mb-1 invisible">Everything in the free plan, plus...</div>
<div className="flex flex-col gap-3 mb-28"> <div className="flex flex-col gap-3 mb-28">
<div className="flex flex-row gap-2"><CheckIcon className="mt-1 shrink-0" />License to use Cognee open source</div> <div className="flex flex-row gap-2"><CheckIcon className="mt-1 shrink-0" />License to use Cognee open source</div>
@ -56,7 +61,7 @@ export default function Plan() {
</div> </div>
</div> </div>
<div className="bg-white rounded-bl-xl rounded-br-xl h-full"> <div className="bg-[rgba(255,255,255,0.7)] rounded-bl-xl rounded-br-xl h-full py-4 px-5">
<div className="mb-1 text-gray-400">Everything in the free plan, plus...</div> <div className="mb-1 text-gray-400">Everything in the free plan, plus...</div>
<div className="flex flex-col gap-3 mb-10"> <div className="flex flex-col gap-3 mb-10">
<div className="flex flex-row gap-2"><CheckIcon className="mt-1 shrink-0" />License to use Cognee open source and Cognee Platform</div> <div className="flex flex-row gap-2"><CheckIcon className="mt-1 shrink-0" />License to use Cognee open source and Cognee Platform</div>
@ -69,7 +74,7 @@ export default function Plan() {
</div> </div>
</div> </div>
<div className="bg-white rounded-bl-xl rounded-br-xl h-full"> <div className="bg-[rgba(255,255,255,0.7)] rounded-bl-xl rounded-br-xl h-full py-4 px-5">
<div className="mb-1 text-gray-400">Everything in the free plan, plus...</div> <div className="mb-1 text-gray-400">Everything in the free plan, plus...</div>
<div className="flex flex-col gap-3 mb-10"> <div className="flex flex-col gap-3 mb-10">
<div className="flex flex-row gap-2"><CheckIcon className="mt-1 shrink-0" />Fully hosted cloud platform</div> <div className="flex flex-row gap-2"><CheckIcon className="mt-1 shrink-0" />Fully hosted cloud platform</div>
@ -83,24 +88,25 @@ export default function Plan() {
</div> </div>
<div className="pt-4 pb-14 mb-2.5"> <div className="pt-4 pb-14 mb-2.5">
<NeutralButton>Try for free</NeutralButton> <NeutralButton className="w-full">Try for free</NeutralButton>
</div> </div>
<div className="pt-4 pb-14 mb-2.5"> <div className="pt-4 pb-14 mb-2.5">
<CTAButton>Talk to us</CTAButton> <CTAButton className="w-full">Talk to us</CTAButton>
</div> </div>
<div className="pt-4 pb-14 mb-2.5"> <div className="pt-4 pb-14 mb-2.5">
<NeutralButton>Sign up for Cogwit Beta</NeutralButton> <NeutralButton className="w-full">Sign up for Cogwit Beta</NeutralButton>
</div> </div>
</div> </div>
<div className="grid grid-cols-4 py-4 px-5 bg-[rgba(255,255,255,0.5)] mb-12"> <div className="grid grid-cols-4 py-4 px-5 mb-4">
<div>Feature Comparison</div> <div>Feature Comparison</div>
<div className="text-center">Basic</div> <div className="text-center">Basic</div>
<div className="text-center">On-prem</div> <div className="text-center">On-prem</div>
<div className="text-center">Cloud</div> <div className="text-center">Cloud</div>
</div>
<div className="grid grid-cols-4 py-1 px-5 mb-12 bg-[rgba(255,255,255,0.7)] rounded-xl">
<div className="border-b-[1px] border-b-gray-100 py-3">Data Sources</div> <div className="border-b-[1px] border-b-gray-100 py-3">Data Sources</div>
<div className="text-center border-b-[1px] border-b-gray-100 py-3">28+</div> <div className="text-center border-b-[1px] border-b-gray-100 py-3">28+</div>
<div className="text-center border-b-[1px] border-b-gray-100 py-3">28+</div> <div className="text-center border-b-[1px] border-b-gray-100 py-3">28+</div>
@ -121,37 +127,39 @@ export default function Plan() {
<div className="text-center border-b-[1px] border-b-gray-100 py-3">Hands-on</div> <div className="text-center border-b-[1px] border-b-gray-100 py-3">Hands-on</div>
<div className="text-center border-b-[1px] border-b-gray-100 py-3">Priority</div> <div className="text-center border-b-[1px] border-b-gray-100 py-3">Priority</div>
<div className="border-b-[1px] border-b-gray-100 py-3">SLA</div> <div className="py-3">SLA</div>
<div className="text-center border-b-[1px] border-b-gray-100 py-3"></div> <div className="text-center py-3"></div>
<div className="text-center border-b-[1px] border-b-gray-100 py-3">1 day</div> <div className="text-center py-3">1 day</div>
<div className="text-center border-b-[1px] border-b-gray-100 py-3">Standard</div> <div className="text-center py-3">Standard</div>
</div> </div>
<div className="grid grid-cols-2 gap-x-2.5 gap-y-2.5 mb-12"> <div className="grid grid-cols-2 gap-x-2.5 gap-y-2.5 mb-12">
<div className="bg-[rgba(255,255,255,0.5)] py-4 px-5"> <div className="bg-[rgba(255,255,255,0.5)] py-4 px-5 rounded-xl">
<div>Can I change my plan anytime?</div> <div>Can I change my plan anytime?</div>
<div className="text-gray-500 mt-6">Yes, you can upgrade or downgrade your plan at any time. Changes take effect immediately.</div> <div className="text-gray-500 mt-6">Yes, you can upgrade or downgrade your plan at any time. Changes take effect immediately.</div>
</div> </div>
<div className="bg-[rgba(255,255,255,0.5)] py-4 px-5"> <div className="bg-[rgba(255,255,255,0.5)] py-4 px-5 rounded-xl">
<div>What happens to my data if I downgrade?</div> <div>What happens to my data if I downgrade?</div>
<div className="text-gray-500 mt-6">Your data is preserved, but features may be limited based on your new plan constraints.</div> <div className="text-gray-500 mt-6">Your data is preserved, but features may be limited based on your new plan constraints.</div>
</div> </div>
<div className="bg-[rgba(255,255,255,0.5)] py-4 px-5"> <div className="bg-[rgba(255,255,255,0.5)] py-4 px-5 rounded-xl">
<div>Do you offer educational discounts?</div> <div>Do you offer educational discounts?</div>
<div className="text-gray-500 mt-6">Yes, we offer special pricing for educational institutions and students. Contact us for details.</div> <div className="text-gray-500 mt-6">Yes, we offer special pricing for educational institutions and students. Contact us for details.</div>
</div> </div>
<div className="bg-[rgba(255,255,255,0.5)] py-4 px-5"> <div className="bg-[rgba(255,255,255,0.5)] py-4 px-5 rounded-xl">
<div>Is there a free trial for paid plans?</div> <div>Is there a free trial for paid plans?</div>
<div className="text-gray-500 mt-6">All new accounts start with a 14-day free trial of our Pro plan features.</div> <div className="text-gray-500 mt-6">All new accounts start with a 14-day free trial of our Pro plan features.</div>
</div> </div>
</div> </div>
</div> </div>
<div className="flex-1/5 h-full text-center flex flex-col self-end mb-12"> <div className="flex-1/5 h-full text-center flex flex-col self-end mb-12 max-w-[1920px]">
<span className="text-sm mb-2">Need a custom solution?</span> <div className="fixed bottom-6 w-[calc(min(1920px,100%)/5)] mx-auto">
<CTAButton>Contact us</CTAButton> <div className="text-sm mb-2">Need a custom solution?</div>
<CTAButton className="w-full">Contact us</CTAButton>
</div>
</div> </div>
</div> </div>
</> </div>
); );
} }

View file

@ -1,13 +1,13 @@
import { fetch } from "@/utils"; import { fetch } from "@/utils";
import getDatasetGraph from "./getDatasetGraph"; // import getDatasetGraph from "./getDatasetGraph";
import { Dataset } from "../ingestion/useDatasets"; import { Dataset } from "../ingestion/useDatasets";
interface GraphData { // interface GraphData {
nodes: { id: string; label: string; properties?: object }[]; // nodes: { id: string; label: string; properties?: object }[];
edges: { source: string; target: string; label: string }[]; // edges: { source: string; target: string; label: string }[];
} // }
export default async function cognifyDataset(dataset: Dataset, onUpdate: (data: GraphData) => void) { export default async function cognifyDataset(dataset: Dataset) {
// const data = await ( // const data = await (
return fetch("/v1/cognify", { return fetch("/v1/cognify", {
method: "POST", method: "POST",
@ -19,16 +19,16 @@ export default async function cognifyDataset(dataset: Dataset, onUpdate: (data:
runInBackground: false, runInBackground: false,
}), }),
}) })
.then((response) => response.json()) .then((response) => response.json());
.then(() => { // .then(() => {
return getDatasetGraph(dataset) // return getDatasetGraph(dataset)
.then((data) => { // .then((data) => {
onUpdate({ // onUpdate({
nodes: data.nodes, // nodes: data.nodes,
edges: data.edges, // edges: data.edges,
}); // });
}); // });
}); // });
// ) // )
// const websocket = new WebSocket(`ws://localhost:8000/api/v1/cognify/subscribe/${data.pipeline_run_id}`); // const websocket = new WebSocket(`ws://localhost:8000/api/v1/cognify/subscribe/${data.pipeline_run_id}`);

View file

@ -27,10 +27,10 @@ export default function Header() {
return ( return (
<> <>
<header className="relative bg-[rgba(244,244,244,0.5)] flex flex-row h-14 min-h-14 px-5 items-center justify-between w-full max-w-[1920px] mx-auto"> <header className="relative bg-[rgba(244,244,244,0.3)] flex flex-row h-14 min-h-14 px-5 items-center justify-between w-full max-w-[1920px] mx-auto">
<div className="flex flex-row gap-4 items-center"> <div className="flex flex-row gap-4 items-center">
<CogneeIcon /> <CogneeIcon />
<div className="text-lg">Cognee Graph Interface</div> <div className="text-lg">Cognee Local</div>
</div> </div>
<div className="flex flex-row items-center gap-2.5"> <div className="flex flex-row items-center gap-2.5">

View file

@ -36,7 +36,9 @@ def get_notebooks_router():
async def create_notebook_endpoint( async def create_notebook_endpoint(
notebook_data: NotebookData, user: User = Depends(get_authenticated_user) notebook_data: NotebookData, user: User = Depends(get_authenticated_user)
): ):
return await create_notebook(user.id, notebook_data.name, notebook_data.cells) return await create_notebook(
user.id, notebook_data.name, notebook_data.cells, deletable=True
)
@router.put("/{notebook_id}") @router.put("/{notebook_id}")
async def update_notebook_endpoint( async def update_notebook_endpoint(

View file

@ -35,7 +35,7 @@ class LLMConfig(BaseSettings):
structured_output_framework: str = "instructor" structured_output_framework: str = "instructor"
llm_provider: str = "openai" llm_provider: str = "openai"
llm_model: str = "gpt-5-mini" llm_model: str = "openai/gpt-4o-mini"
llm_endpoint: str = "" llm_endpoint: str = ""
llm_api_key: Optional[str] = None llm_api_key: Optional[str] = None
llm_api_version: Optional[str] = None llm_api_version: Optional[str] = None
@ -44,7 +44,7 @@ class LLMConfig(BaseSettings):
llm_max_completion_tokens: int = 16384 llm_max_completion_tokens: int = 16384
baml_llm_provider: str = "openai" baml_llm_provider: str = "openai"
baml_llm_model: str = "gpt-5-mini" baml_llm_model: str = "gpt-4o-mini"
baml_llm_endpoint: str = "" baml_llm_endpoint: str = ""
baml_llm_api_key: Optional[str] = None baml_llm_api_key: Optional[str] = None
baml_llm_temperature: float = 0.0 baml_llm_temperature: float = 0.0

View file

@ -15,7 +15,9 @@ async def create_notebook(
deletable: Optional[bool], deletable: Optional[bool],
session: AsyncSession, session: AsyncSession,
) -> Notebook: ) -> Notebook:
notebook = Notebook(name=notebook_name, owner_id=user_id, cells=cells, deletable=deletable) notebook = Notebook(
name=notebook_name, owner_id=user_id, cells=cells, deletable=deletable or True
)
session.add(notebook) session.add(notebook)

View file

@ -114,7 +114,7 @@ class TemporalRetriever(GraphCompletionRetriever):
"No timestamps identified based on the query, performing retrieval using triplet search on events and entities." "No timestamps identified based on the query, performing retrieval using triplet search on events and entities."
) )
triplets = await self.get_triplets(query) triplets = await self.get_triplets(query)
return await self.resolve_edges_to_text(triplets) return await self.resolve_edges_to_text(triplets), triplets
if ids: if ids:
relevant_events = await graph_engine.collect_events(ids=ids) relevant_events = await graph_engine.collect_events(ids=ids)
@ -123,7 +123,7 @@ class TemporalRetriever(GraphCompletionRetriever):
"No events identified based on timestamp filtering, performing retrieval using triplet search on events and entities." "No events identified based on timestamp filtering, performing retrieval using triplet search on events and entities."
) )
triplets = await self.get_triplets(query) triplets = await self.get_triplets(query)
return await self.resolve_edges_to_text(triplets) return await self.resolve_edges_to_text(triplets), triplets
vector_engine = get_vector_engine() vector_engine = get_vector_engine()
query_vector = (await vector_engine.embedding_engine.embed_text([query]))[0] query_vector = (await vector_engine.embedding_engine.embed_text([query]))[0]

View file

@ -29,7 +29,9 @@ async def get_default_user() -> SimpleNamespace:
# We return a SimpleNamespace to have the same user type as our SaaS # We return a SimpleNamespace to have the same user type as our SaaS
# SimpleNamespace is just a dictionary which can be accessed through attributes # SimpleNamespace is just a dictionary which can be accessed through attributes
auth_data = SimpleNamespace(id=user.id, tenant_id=user.tenant_id, roles=[]) auth_data = SimpleNamespace(
id=user.id, email=user.email, tenant_id=user.tenant_id, roles=[]
)
return auth_data return auth_data
except Exception as error: except Exception as error:
if "principals" in str(error.args): if "principals" in str(error.args):

View file

@ -268,7 +268,7 @@ def setup_logging(log_level=None, name=None):
global _is_structlog_configured global _is_structlog_configured
# Regular detailed logging for non-CLI usage # Regular detailed logging for non-CLI usage
log_level = log_level if log_level else log_levels[os.getenv("LOG_LEVEL", "INFO")] log_level = log_level if log_level else log_levels[os.getenv("LOG_LEVEL", "INFO").upper()]
# Configure external library logging early to suppress verbose output # Configure external library logging early to suppress verbose output
configure_external_library_logging() configure_external_library_logging()