Skip to content
Merged
Show file tree
Hide file tree
Changes from 23 commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
e19da71
fix: fixed duplicate export dynamics (#1399)
AlessandroMarc Oct 18, 2024
48664d7
chore: minor updates in the README (#1400)
Smoothengineer Oct 20, 2024
c4478b5
docs: update library.mdx (#1406)
Muhammad-Adam1 Oct 22, 2024
30b2fa7
fix[#1415]: using torch 2.2.0 in macOS x86_64 (#1417)
giuseppe-coco Oct 29, 2024
f32bd0d
chore: add /app to PYTHONPATH (#1416)
giuseppe-coco Oct 29, 2024
719043c
docs: update llms.mdx (#1410)
Muhammad-Adam1 Oct 29, 2024
437f949
fix[output_format]: accept dataframe dict as output and secure sql qu…
ArslanSaleem Nov 18, 2024
27cb449
chore[Security]: restrict libs to allow specific functionalities (#1429)
ArslanSaleem Nov 20, 2024
0e4e1d0
docs: update docs about customer whitelisted dependencies
gventuri Nov 20, 2024
b809841
Release v2.4.0
gventuri Nov 20, 2024
34535a2
fix: update last_code_generated in smart_dataframe's __init__.py (#1484)
bence-kecskes Dec 18, 2024
68b6557
Release v2.4.1
gventuri Dec 18, 2024
daf5696
fix: docker-compose-npm-error (#1486)
Charisn Dec 19, 2024
d63f918
fix: remove plt.show if exists in the generated code (#1501)
ArslanSaleem Jan 2, 2025
63df017
fix: make seaborn as an optional dependency (#1500)
ArslanSaleem Jan 2, 2025
cfeb071
fix: check if whitelisted lib is actually exists in the additional de…
ArslanSaleem Jan 2, 2025
554a638
feat(security): add security config to disable it (#1498)
ArslanSaleem Jan 2, 2025
cf33faa
Release v2.4.2
gventuri Jan 2, 2025
f17fcea
Merge branch 'main' into merge_main/ci_fixes
ArslanSaleem Jan 7, 2025
52b04aa
fix(test_cases): handle and clean test cases of pandasai
ArslanSaleem Jan 8, 2025
6afb61d
ruff changes
ArslanSaleem Jan 8, 2025
28bb719
add poetry lock file
ArslanSaleem Jan 8, 2025
0be115f
Merge branch 'release/v3' into merge_main/ci_fixes
ArslanSaleem Jan 8, 2025
58fcff7
fix github ci workflow
ArslanSaleem Jan 8, 2025
b47f79e
fix: extension deps installation
ArslanSaleem Jan 8, 2025
ebb83a5
fix: github workflows
ArslanSaleem Jan 8, 2025
967118a
fix: unnecessary comments
ArslanSaleem Jan 8, 2025
dd61ab8
fix: ruff errors
ArslanSaleem Jan 8, 2025
07ce3cc
fix: ruff errors
ArslanSaleem Jan 8, 2025
b5e6a58
fix: typos
ArslanSaleem Jan 8, 2025
ffe986c
fix ci yml file
ArslanSaleem Jan 8, 2025
c2d6081
fix: ci
ArslanSaleem Jan 8, 2025
eb41a18
fix make file for hardcoded env
ArslanSaleem Jan 8, 2025
1afd565
fix make file for hardcoded env
ArslanSaleem Jan 8, 2025
b183fac
fix make file for hardcoded env
ArslanSaleem Jan 8, 2025
eac2c21
fix make file for hardcoded env
ArslanSaleem Jan 8, 2025
4d5f54c
fix: imports in extensions
ArslanSaleem Jan 8, 2025
b2ded79
fix(testcases): extension test cases fixed
ArslanSaleem Jan 8, 2025
466b079
fix: ci clear cache and suggested improvements
ArslanSaleem Jan 8, 2025
575f852
clean up before running CI
ArslanSaleem Jan 8, 2025
0c6e5ce
fix ci pipeline
ArslanSaleem Jan 8, 2025
9a29b78
fix ci pipeline
ArslanSaleem Jan 8, 2025
65cd422
fix ci pipeline
ArslanSaleem Jan 8, 2025
2cd2353
fix ci pipeline
ArslanSaleem Jan 8, 2025
def1433
fix ci pipeline
ArslanSaleem Jan 8, 2025
ee62baf
fix: ci
ArslanSaleem Jan 8, 2025
0958749
fix: ci
ArslanSaleem Jan 8, 2025
bcec071
fix: ci
ArslanSaleem Jan 8, 2025
2da1398
fix github bug
ArslanSaleem Jan 8, 2025
7570c2b
fix: CI
ArslanSaleem Jan 8, 2025
f2f15ce
fix: CI
ArslanSaleem Jan 8, 2025
f8e5f23
fix: test case on windows
ArslanSaleem Jan 8, 2025
59b42ed
fix: test case on windows
ArslanSaleem Jan 8, 2025
7e207eb
fix: test case on windows
ArslanSaleem Jan 8, 2025
3982c45
fix: test case on windows
ArslanSaleem Jan 8, 2025
ecafc64
fix: CI
ArslanSaleem Jan 8, 2025
64e51e3
feat(biqquery): add test cases for big query connector
ArslanSaleem Jan 8, 2025
4d84252
fix env issue of pandas not found
ArslanSaleem Jan 8, 2025
ea9a37d
fix: ci use pyproject
ArslanSaleem Jan 8, 2025
7c4119b
fix: lock file
ArslanSaleem Jan 8, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,19 @@
[![Downloads](https://static.pepy.tech/badge/pandasai)](https://pepy.tech/project/pandasai) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/1ZnO-njhL7TBOYPZaqvMvGtsjckZKrv2E?usp=sharing)

PandasAI is a Python platform that makes it easy to ask questions to your data in natural language. It helps non-technical users to interact with their data in a more natural way, and it helps technical users to save time and effort when working with data.
PandasAI is a Python platform that makes it easy to ask questions to your data in natural language. It helps non-technical users to interact with their data in a more natural way, and it helps technical users to save time, and effort when working with data.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ArslanSaleem this new punctuation seems to be incorrect

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes looking at the test extension deps not getting installed in github flow


# 🚀 Deploying PandasAI

PandasAI can be used in a variety of ways. You can easily use it in your Jupyter notebooks or streamlit apps, or you can deploy it as a REST API such as with FastAPI or Flask.
PandasAI can be used in a variety of ways. You can easily use it in your Jupyter notebooks or Streamlit apps, or you can deploy it as a REST API such as with FastAPI or Flask.

If you are interested in the managed PandasAI Cloud or our self-hosted Enterprise Offering, [contact us](https://forms.gle/JEUqkwuTqFZjhP7h8).

# 🔧 Getting started

You can find the full documentation for PandasAI [here](https://pandas-ai.readthedocs.io/en/latest/).

You can either decide to use PandasAI in your Jupyter notebooks, streamlit apps, or use the client and server architecture from the repo.
You can either decide to use PandasAI in your Jupyter notebooks, Streamlit apps, or use the client and server architecture from the repo.

## ☁️ Using the platform

Expand Down
18 changes: 8 additions & 10 deletions client/app/(ee)/settings/logs/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,15 @@ import React from "react";
import { GetLogs } from "@/services/logs";
import LogsCard from "./logs-card";

export const dynamic = 'force-dynamic';
export const dynamic = "force-dynamic";

export default async function Logs() {
const data = await GetLogs();
const data = await GetLogs();

return (
<div className="w-full h-full overflow-y-auto custom-scroll mt-5 px-2 md:px-4">
<h1 className="text-2xl font-bold dark:text-white mb-10">Logs</h1>
<LogsCard logs={data?.logs || []} logs_count={data?.logs_count} />
</div>
);
return (
<div className="w-full h-full overflow-y-auto custom-scroll mt-5 px-2 md:px-4">
<h1 className="text-2xl font-bold dark:text-white mb-10">Logs</h1>
<LogsCard logs={data?.logs || []} logs_count={data?.logs_count} />
</div>
);
}
export const dynamic='force-dynamic';

44 changes: 21 additions & 23 deletions client/app/settings/datasets/[id]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,34 +3,32 @@ import Link from "next/link";
import DatasetCard from "./DatasetCard";
import { GetDatasetDetails } from "@/services/datasets";

export const dynamic = 'force-dynamic';
export const dynamic = "force-dynamic";

interface PageProps {
params: {
id: string;
};
params: {
id: string;
};
}

export default async function DatasetDetailsPage({ params }: PageProps) {
const data = await GetDatasetDetails(params.id);
const dataframe = data?.dataset;
const data = await GetDatasetDetails(params.id);
const dataframe = data?.dataset;

return (
<>
<div className="w-full h-full overflow-y-auto custom-scroll mt-5 px-2 md:px-4">
<h1 className="text-2xl font-bold dark:text-white mb-10">
<Link href="/settings/datasets">Datasets</Link>
<small>{` › ${dataframe?.name || ""}`}</small>
</h1>
return (
<>
<div className="w-full h-full overflow-y-auto custom-scroll mt-5 px-2 md:px-4">
<h1 className="text-2xl font-bold dark:text-white mb-10">
<Link href="/settings/datasets">Datasets</Link>
<small>{` › ${dataframe?.name || ""}`}</small>
</h1>

<div className="flex flex-col p-2 md:p-4 font-montserrat">
<div className="flex items-center justify-center w-[50%]">
<DatasetCard dataframe={dataframe} />
</div>
</div>
</div>
</>
);
<div className="flex flex-col p-2 md:p-4 font-montserrat">
<div className="flex items-center justify-center w-[50%]">
<DatasetCard dataframe={dataframe} />
</div>
</div>
</div>
</>
);
}
export const dynamic='force-dynamic';

80 changes: 35 additions & 45 deletions client/app/settings/datasets/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,53 +7,43 @@ import { Button } from "@/components/ui/button";
import { GetAllDataSets } from "@/services/datasets";
import AddNewCard from "./AddNewCard";

export const dynamic = 'force-dynamic';
export const dynamic = "force-dynamic";

export default async function Datasets() {
const data = await GetAllDataSets();
const data = await GetAllDataSets();

return (
<div className="w-full h-full overflow-y-auto custom-scroll mt-5 px-2 md:px-4">
<h1 className="text-2xl font-bold dark:text-white mb-10">Datasets</h1>
<div className="grid 2xl:grid-cols-4 xl:grid-cols-3 lg:grid-cols-2 gap-4">
{data?.datasets?.map((item) => (
<Card
key={item.id}
extra={
"w-full pt-4 px-6 h-full border dark:border-none border-[#ccc] pb-8"
}
>
<header className="relative flex items-center justify-between">
<div className="w-full">
<div className="flex justify-center h-24">
<FaFileCsv size="4em" key={0} />
</div>
<div className="h-[65px] w-full overflow-hidden">
<AppTooltip text={item.name}>
<h1
data-tooltip-id={`${item.id}`}
className="dark:text-white font-bold font-montserrat text-[20px] text-center customellipsis"
>
{item.name}
</h1>
</AppTooltip>
</div>
</div>
</header>
<div className="w-full flex flex-wrap items-center justify-center mt-1">
<Link href={`/settings/datasets/${item?.id}`}>
<Button>Details</Button>
</Link>
</div>
</Card>
))}
return (
<div className="w-full h-full overflow-y-auto custom-scroll mt-5 px-2 md:px-4">
<h1 className="text-2xl font-bold dark:text-white mb-10">Datasets</h1>
<div className="grid 2xl:grid-cols-4 xl:grid-cols-3 lg:grid-cols-2 gap-4">
{data?.datasets?.map(item => (
<Card key={item.id} extra={"w-full pt-4 px-6 h-full border dark:border-none border-[#ccc] pb-8"}>
<header className="relative flex items-center justify-between">
<div className="w-full">
<div className="flex justify-center h-24">
<FaFileCsv size="4em" key={0} />
</div>
<div className="h-[65px] w-full overflow-hidden">
<AppTooltip text={item.name}>
<h1 data-tooltip-id={`${item.id}`} className="dark:text-white font-bold font-montserrat text-[20px] text-center customellipsis">
{item.name}
</h1>
</AppTooltip>
</div>
</div>
</header>
<div className="w-full flex flex-wrap items-center justify-center mt-1">
<Link href={`/settings/datasets/${item?.id}`}>
<Button>Details</Button>
</Link>
</div>
</Card>
))}

<Link href={`/settings/datasets/add`}>
<AddNewCard text="New dataset" />
</Link>
</div>
</div>
);
<Link href={`/settings/datasets/add`}>
<AddNewCard text="New dataset" />
</Link>
</div>
</div>
);
}
export const dynamic='force-dynamic';

6 changes: 2 additions & 4 deletions client/app/settings/page.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
import { redirect } from "next/navigation";

export const dynamic = 'force-dynamic';
export const dynamic = "force-dynamic";

export default function Home() {
redirect("/settings/datasets");
redirect("/settings/datasets");
}
export const dynamic='force-dynamic';

42 changes: 19 additions & 23 deletions client/app/settings/workspaces/addspaces/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,32 +4,28 @@ import { GetAllDataSets } from "@/services/datasets";
import AddSpaceCard from "./AddSpaceCard";
import { Button } from "@/components/ui/button";

export const dynamic = 'force-dynamic';
export const dynamic = "force-dynamic";

export default async function AddSpaces() {
const data = await GetAllDataSets();
const data = await GetAllDataSets();

return (
<div className="w-full h-full overflow-y-auto custom-scroll mt-5 px-2 md:px-4">
<h1 className="text-2xl font-bold dark:text-white mb-10">
<Link href="/settings/workspaces">Workspaces</Link>
<small> › New</small>
</h1>
return (
<div className="w-full h-full overflow-y-auto custom-scroll mt-5 px-2 md:px-4">
<h1 className="text-2xl font-bold dark:text-white mb-10">
<Link href="/settings/workspaces">Workspaces</Link>
<small> › New</small>
</h1>

{data?.datasets?.length === 0 ? (
<div className="flex flex-col items-center justify-center m-auto">
<p className="dark:text-white font-montserrat text-lg mb-3">
No datasets available, please add one
</p>
{data?.datasets?.length === 0 ? (
<div className="flex flex-col items-center justify-center m-auto">
<p className="dark:text-white font-montserrat text-lg mb-3">No datasets available, please add one</p>

<Link href={"/settings/datasets/add"}></Link>
<Button>Add</Button>
</div>
) : (
<AddSpaceCard datasets={data?.datasets} />
)}
</div>
);
<Link href={"/settings/datasets/add"}></Link>
<Button>Add</Button>
</div>
) : (
<AddSpaceCard datasets={data?.datasets} />
)}
</div>
);
}
export const dynamic='force-dynamic';

38 changes: 17 additions & 21 deletions client/app/settings/workspaces/editspaces/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,28 +4,24 @@ import { GetAllDataSets } from "@/services/datasets";
import EditSpaceCard from "./EditSpaceCard";
import { GetWorkspaceDetails } from "@/services/spaces";

export const dynamic = 'force-dynamic';
export const dynamic = "force-dynamic";

export default async function EditWorkSpaces({ searchParams }) {
const data = await GetAllDataSets();
const workspaceDetails = await GetWorkspaceDetails(searchParams.id);
const data = await GetAllDataSets();
const workspaceDetails = await GetWorkspaceDetails(searchParams.id);

return (
<div className="w-full h-full overflow-y-auto custom-scroll mt-5 px-2 md:px-4">
<h1 className="text-2xl font-bold dark:text-white mb-10">
<Link href={`/settings/workspaces`}>Workspaces</Link>
<small>
<Link href={`/settings/workspaces/${searchParams.id}`}>
<small>
{workspaceDetails?.name && ` › ${workspaceDetails?.name}`}
</small>
</Link>{" "}
› Edit
</small>
</h1>
<EditSpaceCard datasets={data?.datasets} workspaceId={searchParams?.id} />
</div>
);
return (
<div className="w-full h-full overflow-y-auto custom-scroll mt-5 px-2 md:px-4">
<h1 className="text-2xl font-bold dark:text-white mb-10">
<Link href={`/settings/workspaces`}>Workspaces</Link>
<small>
<Link href={`/settings/workspaces/${searchParams.id}`}>
<small>{workspaceDetails?.name && ` › ${workspaceDetails?.name}`}</small>
</Link>{" "}
› Edit
</small>
</h1>
<EditSpaceCard datasets={data?.datasets} workspaceId={searchParams?.id} />
</div>
);
}
export const dynamic='force-dynamic';

70 changes: 30 additions & 40 deletions client/app/settings/workspaces/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,49 +6,39 @@ import AppTooltip from "@/components/AppTooltip";
import { Button } from "@/components/ui/button";
import { GetAllWorkspaces } from "@/services/spaces";

export const dynamic = 'force-dynamic';
export const dynamic = "force-dynamic";

export default async function WorkSpaces() {
const data = await GetAllWorkspaces();
const data = await GetAllWorkspaces();

return (
<div className="w-full overflow-y-auto custom-scroll px-2 mt-5 md:px-4 h-full">
<h1 className="text-2xl font-bold dark:text-white mb-10">Workspaces</h1>
return (
<div className="w-full overflow-y-auto custom-scroll px-2 mt-5 md:px-4 h-full">
<h1 className="text-2xl font-bold dark:text-white mb-10">Workspaces</h1>

<div className="grid 2xl:grid-cols-4 xl:grid-cols-3 lg:grid-cols-2 gap-4">
{data?.map((item, index) => (
<Card
key={index}
extra={
"w-full py-4 px-6 h-full border dark:border-none border-[#ccc]"
}
>
<div className="flex flex-col justify-center items-center gap-6 py-[30px]">
<div className="h-[65px] w-full overflow-hidden">
<AppTooltip text={item.name}>
<h1
data-tooltip-id={item.id}
className="dark:text-white font-bold font-montserrat text-[20px] text-center customellipsis"
>
{item.name}
</h1>
</AppTooltip>
</div>
<div className="grid 2xl:grid-cols-4 xl:grid-cols-3 lg:grid-cols-2 gap-4">
{data?.map((item, index) => (
<Card key={index} extra={"w-full py-4 px-6 h-full border dark:border-none border-[#ccc]"}>
<div className="flex flex-col justify-center items-center gap-6 py-[30px]">
<div className="h-[65px] w-full overflow-hidden">
<AppTooltip text={item.name}>
<h1 data-tooltip-id={item.id} className="dark:text-white font-bold font-montserrat text-[20px] text-center customellipsis">
{item.name}
</h1>
</AppTooltip>
</div>

<div className="w-full flex flex-wrap items-center justify-center mt-1">
<Link href={`/settings/workspaces/${item?.id}`}>
<Button>Details</Button>
</Link>
</div>
</div>
</Card>
))}
<Link href={"/settings/workspaces/addspaces"}>
<AddNewCard text="New workspace" />
</Link>
</div>
</div>
);
<div className="w-full flex flex-wrap items-center justify-center mt-1">
<Link href={`/settings/workspaces/${item?.id}`}>
<Button>Details</Button>
</Link>
</div>
</div>
</Card>
))}
<Link href={"/settings/workspaces/addspaces"}>
<AddNewCard text="New workspace" />
</Link>
</div>
</div>
);
}
export const dynamic='force-dynamic';

Loading
Loading