From 2227503f5091961041ddb1da5b7c7836febfa650 Mon Sep 17 00:00:00 2001 From: Hao Zhu Date: Thu, 23 May 2024 16:50:02 -0400 Subject: [PATCH 1/6] Adding a doc site using Nextra (#78) * git ignore * add nextra site * change path to docs * Add installation instruction (#76) * fix an accordion bug --- .github/workflows/deploy.yml | 90 +++++++ .gitignore | 6 +- docs/.nojekyll | 0 docs/bun.lockb | Bin 0 -> 325450 bytes docs/components.json | 17 ++ docs/components/ui/accordion.tsx | 56 +++++ docs/components/ui/badge.tsx | 36 +++ docs/components/ui/button.tsx | 56 +++++ docs/components/ui/card.tsx | 79 ++++++ docs/components/ui/checkbox.tsx | 28 +++ docs/components/ui/command.tsx | 153 ++++++++++++ .../ui/data-table-faceted-filter.tsx | 146 +++++++++++ docs/components/ui/dialog.tsx | 120 +++++++++ docs/components/ui/dropdown-menu.tsx | 198 +++++++++++++++ docs/components/ui/input.tsx | 25 ++ docs/components/ui/menubar.tsx | 234 ++++++++++++++++++ docs/components/ui/popover.tsx | 29 +++ docs/components/ui/separator.tsx | 29 +++ docs/components/ui/table.tsx | 117 +++++++++ docs/lib/utils.ts | 6 + docs/next-env.d.ts | 5 + docs/next.config.js | 37 +++ docs/package.json | 48 ++++ docs/pages/_app.tsx | 7 + docs/pages/_meta.json | 29 +++ docs/{ => pages}/all_the_issues.md | 0 docs/{ => pages}/examples.md | 0 docs/{ => pages}/hyperparameters.md | 0 docs/pages/index.mdx | 167 +++++++++++++ docs/{ => pages}/scripts.md | 0 docs/{ => pages}/simulation_modes.md | 0 docs/{ => pages}/xml.md | 0 docs/postcss.config.mjs | 8 + docs/public/favicon.ico | Bin 0 -> 45630 bytes docs/public/favicon.svg | 14 ++ docs/public/next.svg | 1 + docs/public/vercel.svg | 1 + docs/styles/globals.css | 76 ++++++ docs/tailwind.config.ts | 80 ++++++ docs/theme.config.jsx | 75 ++++++ docs/tsconfig.json | 21 ++ 41 files changed, 1993 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/deploy.yml create mode 100644 docs/.nojekyll create mode 100755 docs/bun.lockb create mode 100644 docs/components.json create mode 100644 docs/components/ui/accordion.tsx create mode 100644 docs/components/ui/badge.tsx create mode 100644 docs/components/ui/button.tsx create mode 100644 docs/components/ui/card.tsx create mode 100644 docs/components/ui/checkbox.tsx create mode 100644 docs/components/ui/command.tsx create mode 100644 docs/components/ui/data-table-faceted-filter.tsx create mode 100644 docs/components/ui/dialog.tsx create mode 100644 docs/components/ui/dropdown-menu.tsx create mode 100644 docs/components/ui/input.tsx create mode 100644 docs/components/ui/menubar.tsx create mode 100644 docs/components/ui/popover.tsx create mode 100644 docs/components/ui/separator.tsx create mode 100644 docs/components/ui/table.tsx create mode 100644 docs/lib/utils.ts create mode 100644 docs/next-env.d.ts create mode 100644 docs/next.config.js create mode 100644 docs/package.json create mode 100644 docs/pages/_app.tsx create mode 100644 docs/pages/_meta.json rename docs/{ => pages}/all_the_issues.md (100%) rename docs/{ => pages}/examples.md (100%) rename docs/{ => pages}/hyperparameters.md (100%) create mode 100644 docs/pages/index.mdx rename docs/{ => pages}/scripts.md (100%) rename docs/{ => pages}/simulation_modes.md (100%) rename docs/{ => pages}/xml.md (100%) create mode 100644 docs/postcss.config.mjs create mode 100644 docs/public/favicon.ico create mode 100644 docs/public/favicon.svg create mode 100644 docs/public/next.svg create mode 100644 docs/public/vercel.svg create mode 100644 docs/styles/globals.css create mode 100644 docs/tailwind.config.ts create mode 100644 docs/theme.config.jsx create mode 100644 docs/tsconfig.json diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 000000000..7bc94c136 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,90 @@ +# Sample workflow for building and deploying a Next.js site to GitHub Pages +# +# To get started with Next.js see: https://nextjs.org/docs/getting-started +# +name: Deploy Next.js site to Pages + +on: + # Runs on pushes targeting the default branch + push: + branches: ["main", "dev"] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: "pages" + cancel-in-progress: false + +jobs: + # Build job + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - uses: actions/setup-python@v4 + with: + python-version: 3.x + - uses: actions/cache@v2 + with: + key: ${{ github.ref }} + path: .cache + + - name: Detect package manager + id: detect-package-manager + run: | + if [ -f "${{ github.workspace }}/docs/bun.lockb" ]; then + echo "manager=bun" >> $GITHUB_OUTPUT + echo "command=install" >> $GITHUB_OUTPUT + echo "runner=bun" >> $GITHUB_OUTPUT + exit 0 + elif [ -f "${{ github.workspace }}/docs/package.json" ]; then + echo "manager=npm" >> $GITHUB_OUTPUT + echo "command=ci" >> $GITHUB_OUTPUT + echo "runner=npx --no-install" >> $GITHUB_OUTPUT + exit 0 + else + echo "Unable to determine package manager" + exit 1 + fi + + - name: Setup Bun + uses: oven-sh/setup-bun@v1 + with: + bun-version: latest + + - name: Setup Pages + uses: actions/configure-pages@v4 + + - name: Install dependencies + run: cd ${{ github.workspace }}/docs/; ${{ steps.detect-package-manager.outputs.manager }} ${{ steps.detect-package-manager.outputs.command }} + + - name: Build with Next.js + run: cd ${{ github.workspace }}/docs/; ${{ steps.detect-package-manager.outputs.runner }} next build + + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: ./docs/out + + # Deployment job + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.gitignore b/.gitignore index 537893e93..c0f8b63f7 100644 --- a/.gitignore +++ b/.gitignore @@ -14,7 +14,6 @@ dist/ downloads/ eggs/ .eggs/ -lib/ lib64/ parts/ sdist/ @@ -157,3 +156,8 @@ backup/* **/.DS_Store **/merge.ps1 **/*.otreezip + +.next/* +node_modules/* +docs/.next/* +docs/node_modules/* diff --git a/docs/.nojekyll b/docs/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/docs/bun.lockb b/docs/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..5cda3bd6603abf531a396fc0a2cb0bfb12315db9 GIT binary patch literal 325450 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­H9-$oK}SI+1#VRh`KC5Fq`I29iGxh(D$Y_+a}) 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%0AD9;A~+6!K*K>{*bn)Hrqj_QfV68#!6 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¬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 literal 0 HcmV?d00001 diff --git a/docs/components.json b/docs/components.json new file mode 100644 index 000000000..45fab1d9f --- /dev/null +++ b/docs/components.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "default", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "tailwind.config.ts", + "css": "styles/globals.css", + "baseColor": "stone", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils" + } +} diff --git a/docs/components/ui/accordion.tsx b/docs/components/ui/accordion.tsx new file mode 100644 index 000000000..e6a723d06 --- /dev/null +++ b/docs/components/ui/accordion.tsx @@ -0,0 +1,56 @@ +import * as React from "react" +import * as AccordionPrimitive from "@radix-ui/react-accordion" +import { ChevronDown } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Accordion = AccordionPrimitive.Root + +const AccordionItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AccordionItem.displayName = "AccordionItem" + +const AccordionTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + svg]:rotate-180", + className + )} + {...props} + > + {children} + + + +)) +AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName + +const AccordionContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + +

{children}
+ +)) + +AccordionContent.displayName = AccordionPrimitive.Content.displayName + +export { Accordion, AccordionItem, AccordionTrigger, AccordionContent } diff --git a/docs/components/ui/badge.tsx b/docs/components/ui/badge.tsx new file mode 100644 index 000000000..f000e3ef5 --- /dev/null +++ b/docs/components/ui/badge.tsx @@ -0,0 +1,36 @@ +import * as React from "react" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const badgeVariants = cva( + "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2", + { + variants: { + variant: { + default: + "border-transparent bg-primary text-primary-foreground hover:bg-primary/80", + secondary: + "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80", + destructive: + "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80", + outline: "text-foreground", + }, + }, + defaultVariants: { + variant: "default", + }, + } +) + +export interface BadgeProps + extends React.HTMLAttributes, + VariantProps {} + +function Badge({ className, variant, ...props }: BadgeProps) { + return ( +
+ ) +} + +export { Badge, badgeVariants } diff --git a/docs/components/ui/button.tsx b/docs/components/ui/button.tsx new file mode 100644 index 000000000..63acdf7a1 --- /dev/null +++ b/docs/components/ui/button.tsx @@ -0,0 +1,56 @@ +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const buttonVariants = cva( + "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50", + { + variants: { + variant: { + default: "bg-primary text-primary-foreground hover:bg-primary/90", + destructive: + "bg-destructive text-destructive-foreground hover:bg-destructive/90", + outline: + "border border-input bg-transparent hover:bg-accent hover:text-accent-foreground", + secondary: + "bg-secondary text-secondary-foreground hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-10 px-4 py-2", + sm: "h-9 rounded-md px-3", + lg: "h-11 rounded-md px-8", + icon: "h-10 w-10", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + } +) + +export interface ButtonProps + extends React.ButtonHTMLAttributes, + VariantProps { + asChild?: boolean +} + +const Button = React.forwardRef( + ({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : "button" + return ( + + ) + } +) +Button.displayName = "Button" + +export { Button, buttonVariants } diff --git a/docs/components/ui/card.tsx b/docs/components/ui/card.tsx new file mode 100644 index 000000000..afa13ecfa --- /dev/null +++ b/docs/components/ui/card.tsx @@ -0,0 +1,79 @@ +import * as React from "react" + +import { cn } from "@/lib/utils" + +const Card = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +Card.displayName = "Card" + +const CardHeader = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardHeader.displayName = "CardHeader" + +const CardTitle = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +

+)) +CardTitle.displayName = "CardTitle" + +const CardDescription = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +

+)) +CardDescription.displayName = "CardDescription" + +const CardContent = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +

+)) +CardContent.displayName = "CardContent" + +const CardFooter = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardFooter.displayName = "CardFooter" + +export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent } diff --git a/docs/components/ui/checkbox.tsx b/docs/components/ui/checkbox.tsx new file mode 100644 index 000000000..ddbdd01d8 --- /dev/null +++ b/docs/components/ui/checkbox.tsx @@ -0,0 +1,28 @@ +import * as React from "react" +import * as CheckboxPrimitive from "@radix-ui/react-checkbox" +import { Check } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Checkbox = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + + + +)) +Checkbox.displayName = CheckboxPrimitive.Root.displayName + +export { Checkbox } diff --git a/docs/components/ui/command.tsx b/docs/components/ui/command.tsx new file mode 100644 index 000000000..d623ee06e --- /dev/null +++ b/docs/components/ui/command.tsx @@ -0,0 +1,153 @@ +import * as React from "react" +import { type DialogProps } from "@radix-ui/react-dialog" +import { Command as CommandPrimitive } from "cmdk" +import { Search } from "lucide-react" + +import { cn } from "@/lib/utils" +import { Dialog, DialogContent } from "@/components/ui/dialog" + +const Command = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +Command.displayName = CommandPrimitive.displayName + +interface CommandDialogProps extends DialogProps {} + +const CommandDialog = ({ children, ...props }: CommandDialogProps) => { + return ( + + + + {children} + + + + ) +} + +const CommandInput = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( +
+ + +
+)) + +CommandInput.displayName = CommandPrimitive.Input.displayName + +const CommandList = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) + +CommandList.displayName = CommandPrimitive.List.displayName + +const CommandEmpty = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>((props, ref) => ( + +)) + +CommandEmpty.displayName = CommandPrimitive.Empty.displayName + +const CommandGroup = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) + +CommandGroup.displayName = CommandPrimitive.Group.displayName + +const CommandSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +CommandSeparator.displayName = CommandPrimitive.Separator.displayName + +const CommandItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) + +CommandItem.displayName = CommandPrimitive.Item.displayName + +const CommandShortcut = ({ + className, + ...props +}: React.HTMLAttributes) => { + return ( + + ) +} +CommandShortcut.displayName = "CommandShortcut" + +export { + Command, + CommandDialog, + CommandInput, + CommandList, + CommandEmpty, + CommandGroup, + CommandItem, + CommandShortcut, + CommandSeparator, +} diff --git a/docs/components/ui/data-table-faceted-filter.tsx b/docs/components/ui/data-table-faceted-filter.tsx new file mode 100644 index 000000000..bf0048164 --- /dev/null +++ b/docs/components/ui/data-table-faceted-filter.tsx @@ -0,0 +1,146 @@ +import * as React from "react" +import { CheckIcon, PlusCircledIcon } from "@radix-ui/react-icons" +import { Column } from "@tanstack/react-table" + +import { cn } from "@/lib/utils" +import { Badge } from "./badge" +import { Button } from "./button" +import { + Command, + CommandEmpty, + CommandGroup, + CommandInput, + CommandItem, + CommandList, + CommandSeparator, +} from "./command" +import { + Popover, + PopoverContent, + PopoverTrigger, +} from "./popover" +import { Separator } from "./separator" + +interface DataTableFacetedFilterProps { + column?: Column + title?: string + options: { + label: string + value: string + icon?: React.ComponentType<{ className?: string }> + }[] +} + +export function DataTableFacetedFilter({ + column, + title, + options, +}: DataTableFacetedFilterProps) { + const facets = column?.getFacetedUniqueValues() + const selectedValues = new Set(column?.getFilterValue() as string[]) + + return ( + + + + + + + + No results found. + + {options.map((option) => { + const isSelected = selectedValues.has(option.value) + return ( + { + if (isSelected) { + selectedValues.delete(option.value) + } else { + selectedValues.add(option.value) + } + const filterValues = Array.from(selectedValues) + column?.setFilterValue( + filterValues.length ? filterValues : undefined + ) + }} + > +
+ +
+ {option.icon && ( + + )} + {option.label} + {facets?.get(option.value) && ( + + {facets.get(option.value)} + + )} +
+ ) + })} +
+ {selectedValues.size > 0 && ( + <> + + + column?.setFilterValue(undefined)} + className="justify-center text-center" + > + Clear filters + + + + )} +
+
+
+
+ ) +} diff --git a/docs/components/ui/dialog.tsx b/docs/components/ui/dialog.tsx new file mode 100644 index 000000000..c23630eb8 --- /dev/null +++ b/docs/components/ui/dialog.tsx @@ -0,0 +1,120 @@ +import * as React from "react" +import * as DialogPrimitive from "@radix-ui/react-dialog" +import { X } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Dialog = DialogPrimitive.Root + +const DialogTrigger = DialogPrimitive.Trigger + +const DialogPortal = DialogPrimitive.Portal + +const DialogClose = DialogPrimitive.Close + +const DialogOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DialogOverlay.displayName = DialogPrimitive.Overlay.displayName + +const DialogContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + {children} + + + Close + + + +)) +DialogContent.displayName = DialogPrimitive.Content.displayName + +const DialogHeader = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+) +DialogHeader.displayName = "DialogHeader" + +const DialogFooter = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+) +DialogFooter.displayName = "DialogFooter" + +const DialogTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DialogTitle.displayName = DialogPrimitive.Title.displayName + +const DialogDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DialogDescription.displayName = DialogPrimitive.Description.displayName + +export { + Dialog, + DialogPortal, + DialogOverlay, + DialogClose, + DialogTrigger, + DialogContent, + DialogHeader, + DialogFooter, + DialogTitle, + DialogDescription, +} diff --git a/docs/components/ui/dropdown-menu.tsx b/docs/components/ui/dropdown-menu.tsx new file mode 100644 index 000000000..769ff7aa7 --- /dev/null +++ b/docs/components/ui/dropdown-menu.tsx @@ -0,0 +1,198 @@ +import * as React from "react" +import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu" +import { Check, ChevronRight, Circle } from "lucide-react" + +import { cn } from "@/lib/utils" + +const DropdownMenu = DropdownMenuPrimitive.Root + +const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger + +const DropdownMenuGroup = DropdownMenuPrimitive.Group + +const DropdownMenuPortal = DropdownMenuPrimitive.Portal + +const DropdownMenuSub = DropdownMenuPrimitive.Sub + +const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup + +const DropdownMenuSubTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean + } +>(({ className, inset, children, ...props }, ref) => ( + + {children} + + +)) +DropdownMenuSubTrigger.displayName = + DropdownMenuPrimitive.SubTrigger.displayName + +const DropdownMenuSubContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DropdownMenuSubContent.displayName = + DropdownMenuPrimitive.SubContent.displayName + +const DropdownMenuContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, sideOffset = 4, ...props }, ref) => ( + + + +)) +DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName + +const DropdownMenuItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean + } +>(({ className, inset, ...props }, ref) => ( + +)) +DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName + +const DropdownMenuCheckboxItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, checked, ...props }, ref) => ( + + + + + + + {children} + +)) +DropdownMenuCheckboxItem.displayName = + DropdownMenuPrimitive.CheckboxItem.displayName + +const DropdownMenuRadioItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + + + {children} + +)) +DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName + +const DropdownMenuLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean + } +>(({ className, inset, ...props }, ref) => ( + +)) +DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName + +const DropdownMenuSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName + +const DropdownMenuShortcut = ({ + className, + ...props +}: React.HTMLAttributes) => { + return ( + + ) +} +DropdownMenuShortcut.displayName = "DropdownMenuShortcut" + +export { + DropdownMenu, + DropdownMenuTrigger, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuCheckboxItem, + DropdownMenuRadioItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuGroup, + DropdownMenuPortal, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuRadioGroup, +} diff --git a/docs/components/ui/input.tsx b/docs/components/ui/input.tsx new file mode 100644 index 000000000..929e05f50 --- /dev/null +++ b/docs/components/ui/input.tsx @@ -0,0 +1,25 @@ +import * as React from "react" + +import { cn } from "@/lib/utils" + +export interface InputProps + extends React.InputHTMLAttributes {} + +const Input = React.forwardRef( + ({ className, type, ...props }, ref) => { + return ( + + ) + } +) +Input.displayName = "Input" + +export { Input } diff --git a/docs/components/ui/menubar.tsx b/docs/components/ui/menubar.tsx new file mode 100644 index 000000000..d11c2993f --- /dev/null +++ b/docs/components/ui/menubar.tsx @@ -0,0 +1,234 @@ +import * as React from "react" +import * as MenubarPrimitive from "@radix-ui/react-menubar" +import { Check, ChevronRight, Circle } from "lucide-react" + +import { cn } from "@/lib/utils" + +const MenubarMenu = MenubarPrimitive.Menu + +const MenubarGroup = MenubarPrimitive.Group + +const MenubarPortal = MenubarPrimitive.Portal + +const MenubarSub = MenubarPrimitive.Sub + +const MenubarRadioGroup = MenubarPrimitive.RadioGroup + +const Menubar = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +Menubar.displayName = MenubarPrimitive.Root.displayName + +const MenubarTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +MenubarTrigger.displayName = MenubarPrimitive.Trigger.displayName + +const MenubarSubTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean + } +>(({ className, inset, children, ...props }, ref) => ( + + {children} + + +)) +MenubarSubTrigger.displayName = MenubarPrimitive.SubTrigger.displayName + +const MenubarSubContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +MenubarSubContent.displayName = MenubarPrimitive.SubContent.displayName + +const MenubarContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>( + ( + { className, align = "start", alignOffset = -4, sideOffset = 8, ...props }, + ref + ) => ( + + + + ) +) +MenubarContent.displayName = MenubarPrimitive.Content.displayName + +const MenubarItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean + } +>(({ className, inset, ...props }, ref) => ( + +)) +MenubarItem.displayName = MenubarPrimitive.Item.displayName + +const MenubarCheckboxItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, checked, ...props }, ref) => ( + + + + + + + {children} + +)) +MenubarCheckboxItem.displayName = MenubarPrimitive.CheckboxItem.displayName + +const MenubarRadioItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + + + {children} + +)) +MenubarRadioItem.displayName = MenubarPrimitive.RadioItem.displayName + +const MenubarLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean + } +>(({ className, inset, ...props }, ref) => ( + +)) +MenubarLabel.displayName = MenubarPrimitive.Label.displayName + +const MenubarSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +MenubarSeparator.displayName = MenubarPrimitive.Separator.displayName + +const MenubarShortcut = ({ + className, + ...props +}: React.HTMLAttributes) => { + return ( + + ) +} +MenubarShortcut.displayname = "MenubarShortcut" + +export { + Menubar, + MenubarMenu, + MenubarTrigger, + MenubarContent, + MenubarItem, + MenubarSeparator, + MenubarLabel, + MenubarCheckboxItem, + MenubarRadioGroup, + MenubarRadioItem, + MenubarPortal, + MenubarSubContent, + MenubarSubTrigger, + MenubarGroup, + MenubarSub, + MenubarShortcut, +} diff --git a/docs/components/ui/popover.tsx b/docs/components/ui/popover.tsx new file mode 100644 index 000000000..bbba7e0eb --- /dev/null +++ b/docs/components/ui/popover.tsx @@ -0,0 +1,29 @@ +import * as React from "react" +import * as PopoverPrimitive from "@radix-ui/react-popover" + +import { cn } from "@/lib/utils" + +const Popover = PopoverPrimitive.Root + +const PopoverTrigger = PopoverPrimitive.Trigger + +const PopoverContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, align = "center", sideOffset = 4, ...props }, ref) => ( + + + +)) +PopoverContent.displayName = PopoverPrimitive.Content.displayName + +export { Popover, PopoverTrigger, PopoverContent } diff --git a/docs/components/ui/separator.tsx b/docs/components/ui/separator.tsx new file mode 100644 index 000000000..6d7f12265 --- /dev/null +++ b/docs/components/ui/separator.tsx @@ -0,0 +1,29 @@ +import * as React from "react" +import * as SeparatorPrimitive from "@radix-ui/react-separator" + +import { cn } from "@/lib/utils" + +const Separator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>( + ( + { className, orientation = "horizontal", decorative = true, ...props }, + ref + ) => ( + + ) +) +Separator.displayName = SeparatorPrimitive.Root.displayName + +export { Separator } diff --git a/docs/components/ui/table.tsx b/docs/components/ui/table.tsx new file mode 100644 index 000000000..7f3502f8b --- /dev/null +++ b/docs/components/ui/table.tsx @@ -0,0 +1,117 @@ +import * as React from "react" + +import { cn } from "@/lib/utils" + +const Table = React.forwardRef< + HTMLTableElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+ + +)) +Table.displayName = "Table" + +const TableHeader = React.forwardRef< + HTMLTableSectionElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( + +)) +TableHeader.displayName = "TableHeader" + +const TableBody = React.forwardRef< + HTMLTableSectionElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( + +)) +TableBody.displayName = "TableBody" + +const TableFooter = React.forwardRef< + HTMLTableSectionElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( + tr]:last:border-b-0", + className + )} + {...props} + /> +)) +TableFooter.displayName = "TableFooter" + +const TableRow = React.forwardRef< + HTMLTableRowElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( + +)) +TableRow.displayName = "TableRow" + +const TableHead = React.forwardRef< + HTMLTableCellElement, + React.ThHTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +TableHead.displayName = "TableHead" + +const TableCell = React.forwardRef< + HTMLTableCellElement, + React.TdHTMLAttributes +>(({ className, ...props }, ref) => ( + +)) +TableCell.displayName = "TableCell" + +const TableCaption = React.forwardRef< + HTMLTableCaptionElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +TableCaption.displayName = "TableCaption" + +export { + Table, + TableHeader, + TableBody, + TableFooter, + TableHead, + TableRow, + TableCell, + TableCaption, +} diff --git a/docs/lib/utils.ts b/docs/lib/utils.ts new file mode 100644 index 000000000..d084ccade --- /dev/null +++ b/docs/lib/utils.ts @@ -0,0 +1,6 @@ +import { type ClassValue, clsx } from "clsx" +import { twMerge } from "tailwind-merge" + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} diff --git a/docs/next-env.d.ts b/docs/next-env.d.ts new file mode 100644 index 000000000..4f11a03dc --- /dev/null +++ b/docs/next-env.d.ts @@ -0,0 +1,5 @@ +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/docs/next.config.js b/docs/next.config.js new file mode 100644 index 000000000..83b4997b4 --- /dev/null +++ b/docs/next.config.js @@ -0,0 +1,37 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = { + reactStrictMode: true, + /** + * Enable static exports for the App Router. + * + * @see https://nextjs.org/docs/app/building-your-application/deploying/static-exports + */ + output: "export", + + /** + * Set base path. This is the slug of your GitHub repository. + * + * @see https://nextjs.org/docs/app/api-reference/next-config-js/basePath + */ + basePath: "", + + /** + * Disable server-based image optimization. Next.js does not support + * dynamic features with static exports. + * + * @see https://nextjs.org/docs/app/api-reference/components/image#unoptimized + */ + images: { + unoptimized: true, + }, +}; + +// export default nextConfig; + +const withNextra = require('nextra')({ + theme: 'nextra-theme-docs', + themeConfig: './theme.config.jsx', + defaultShowCopyCode: true, +}) + +module.exports = withNextra(nextConfig) diff --git a/docs/package.json b/docs/package.json new file mode 100644 index 000000000..bca31d540 --- /dev/null +++ b/docs/package.json @@ -0,0 +1,48 @@ +{ + "name": "docs", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@radix-ui/react-accordion": "^1.1.2", + "@radix-ui/react-checkbox": "^1.0.4", + "@radix-ui/react-dialog": "^1.0.5", + "@radix-ui/react-dropdown-menu": "^2.0.6", + "@radix-ui/react-icons": "^1.3.0", + "@radix-ui/react-menubar": "^1.0.4", + "@radix-ui/react-popover": "^1.0.7", + "@radix-ui/react-separator": "^1.0.3", + "@radix-ui/react-slot": "^1.0.2", + "@tanstack/react-table": "^8.16.0", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.0", + "cmdk": "^1.0.0", + "lucide-react": "^0.376.0", + "moment": "^2.30.1", + "next": "^14.2.2", + "next-themes": "^0.3.0", + "nextra": "^2.13.4", + "nextra-theme-docs": "^2.13.4", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "recharts": "^2.12.6", + "tailwind-merge": "^2.2.2", + "tailwindcss-animate": "^1.0.7", + "uvcanvas": "^0.2.1" + }, + "devDependencies": { + "typescript": "^5", + "@types/node": "^20", + "@types/react": "^18", + "@types/react-dom": "^18", + "postcss": "^8", + "tailwindcss": "^3.4.1", + "eslint": "^8", + "eslint-config-next": "14.2.2" + } +} diff --git a/docs/pages/_app.tsx b/docs/pages/_app.tsx new file mode 100644 index 000000000..f615119a6 --- /dev/null +++ b/docs/pages/_app.tsx @@ -0,0 +1,7 @@ +import '@/styles/globals.css' +import type { AppProps } from 'next/app' +import React from 'react' + +export default function App({ Component, pageProps }: AppProps) { + return +} diff --git a/docs/pages/_meta.json b/docs/pages/_meta.json new file mode 100644 index 000000000..0d5395957 --- /dev/null +++ b/docs/pages/_meta.json @@ -0,0 +1,29 @@ +{ + "index": { + "type": "page", + "title": "Home" + }, + "contribution_menu": { + "title": "Documentation", + "type": "menu", + "items": { + "examples": { + "title": "Examples", + "href": "/examples" + }, + "hyperparameters": { + "title": "Hyperparameters", + "href": "/hyperparameters" + }, + "scripts": { + "title": "Scripts", + "href": "/scripts" + }, + "xml": { + "title": "XML Formatter", + "href": "/xml" + + } + } + } +} diff --git a/docs/all_the_issues.md b/docs/pages/all_the_issues.md similarity index 100% rename from docs/all_the_issues.md rename to docs/pages/all_the_issues.md diff --git a/docs/examples.md b/docs/pages/examples.md similarity index 100% rename from docs/examples.md rename to docs/pages/examples.md diff --git a/docs/hyperparameters.md b/docs/pages/hyperparameters.md similarity index 100% rename from docs/hyperparameters.md rename to docs/pages/hyperparameters.md diff --git a/docs/pages/index.mdx b/docs/pages/index.mdx new file mode 100644 index 000000000..cd36a89d8 --- /dev/null +++ b/docs/pages/index.mdx @@ -0,0 +1,167 @@ +import Link from 'next/link' +import { Lumiflex } from 'uvcanvas' +import { Button } from "../components/ui/button" +import { MoveRight } from "lucide-react" +import { Accordion, AccordionItem, AccordionContent, AccordionTrigger } from "../components/ui/accordion" +import { Steps } from 'nextra/components' + + +# Sotopia - Getting Started +https://github.com/sotopia-lab/sotopia + + +## Simulate social interactions between AIs and humans + +* Enables human-AI interaction + - use `LLMAgent` to create LLM-based social agents, + - REST API-based interface for humans. +* Preset social tasks, characters, and interactions + - more than 200 social tasks, 40 characters, and 10k interaction episodes, + - interactions between agents backed by both closed-source and open-source LLMs, and human participants, + - evaluation of the performance based on multiple social dimensions. +* Realistic social interaction + - agents can talk, do non-verbal communication and performance physical actions, + - characters have different personalities, backgrounds, and relationships, + - agents can have different goals and motivations. +* Create your own + - modular design for easy extension, + - subclass `BaseAgent`, `ParallelSotopiaEnv`, `Evaluator` to create your own agents, environments, and evaluators, + - add your customized social tasks and characters. + +## Installation + +
+ + Open in Colab + for a quick tutorial +
+ +### Basic Usage + +This package supports Python 3.11 and above. + + + +#### Install the package + +```bash +pip install sotopia +``` + + + + Using Conda? + + Create a new environment with conda and install the package with pip: + ```bash + conda create -n sotopia python=3.11; + conda activate sotopia; + ``` + + + + Want to use the nightly version? + +

Install the nightly version with:

+ ```bash + git clone git@github.com:sotopia-lab/sotopia.git; + curl -sSL https://install.python-poetry.org | python3; + poetry install; + ``` +
+
+ + Where to put my OpenAI/TogetherAI/Groq/Replicate API keys? + +

Although API keys are not required for all the experiments, you need to use these keys when you use LLMs from these providers. + For example, set the environment variable `OPENAI_API_KEY` to your key. The recommend way is to add the key to the conda environment:

+ ```bash + conda env config vars set OPENAI_API_KEY=your_key + ``` +
+
+
+ +#### Set up Redis stack + +Redis stack is a required dependency for using Sotopia. There are two ways to set up Redis stack: + + + + Docker is my thing. + + Please follow the [instruction](https://redis.io/docs/stack/get-started/install/docker/) to start a redis-stack server or use an existing server. You can also check [Q&A](/docs/all_the_issues.md) to initiate the redis server with the Sotopia data. + + The `REDIS_OM_URL` need to be set before loading and saving agents: + ```bash + conda env config vars set REDIS_OM_URL="redis://user:password@host:port" + ``` + + + + No, I don't want to use Docker. + + + ### Download the Redis stack + ```bash + # if you are using Ubunutu 20.04 + curl -fsSL https://packages.redis.io/redis-stack/redis-stack-server-7.2.0-v10.focal.x86_64.tar.gz -o redis-stack-server.tar.gz + tar -xvzf redis-stack-server.tar.gz + export PATH=$(pwd)/redis-stack-server-7.2.0-v10/bin:$PATH + # if you are using Ubunutu 22.04, please do an extra step + wget http://nz2.archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2.22_amd64.deb + sudo dpkg -i libssl1.1_1.1.1f-1ubuntu2.22_amd64.deb + # if you are using macOs + brew tap redis-stack/redis-stack + brew install redis-stack + ``` + + ### Start the server + ```bash + ./redis-stack-server-7.2.0-v10/bin/redis-stack-server --daemonize yes + ``` + + For other platforms, please check the [instruction](https://redis.io/docs/latest/operate/oss_and_stack/install/install-stack/). + + ### The `REDIS_OM_URL` need to be set before loading and saving agents: + ```bash + conda env config vars set REDIS_OM_URL="redis://user:password@host:port" + ``` + If you are using the default settings, you can set the `REDIS_OM_URL` to `redis://localhost:6379`. + + + + + +#### Set up the log folder + +Just make a folder to store the logs: +```bash +mkdir logs +``` + + + +## Quick Start + +You can view an episode demo with default parameters with the following: +```python +import asyncio +from sotopia.samplers import UniformSampler +from sotopia.server import run_async_server + +asyncio.run( + run_async_server( + model_dict={ + "env": "gpt-4", + "agent1": "gpt-3.5-turbo", + "agent2": "gpt-3.5-turbo", + }, + sampler=UniformSampler(), + ) +) +``` +or if you have cloned the repo, run +```bash +python examples/minimalist_demo.py +``` diff --git a/docs/scripts.md b/docs/pages/scripts.md similarity index 100% rename from docs/scripts.md rename to docs/pages/scripts.md diff --git a/docs/simulation_modes.md b/docs/pages/simulation_modes.md similarity index 100% rename from docs/simulation_modes.md rename to docs/pages/simulation_modes.md diff --git a/docs/xml.md b/docs/pages/xml.md similarity index 100% rename from docs/xml.md rename to docs/pages/xml.md diff --git a/docs/postcss.config.mjs b/docs/postcss.config.mjs new file mode 100644 index 000000000..1a69fd2a4 --- /dev/null +++ b/docs/postcss.config.mjs @@ -0,0 +1,8 @@ +/** @type {import('postcss-load-config').Config} */ +const config = { + plugins: { + tailwindcss: {}, + }, +}; + +export default config; diff --git a/docs/public/favicon.ico b/docs/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..855dd3aa4fa4f88d78e90a0c2a9962013d1937f0 GIT binary patch literal 45630 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 literal 0 HcmV?d00001 diff --git a/docs/public/favicon.svg b/docs/public/favicon.svg new file mode 100644 index 000000000..ed06047cb --- /dev/null +++ b/docs/public/favicon.svg @@ -0,0 +1,14 @@ + + + + + + diff --git a/docs/public/next.svg b/docs/public/next.svg new file mode 100644 index 000000000..5bb00d403 --- /dev/null +++ b/docs/public/next.svg @@ -0,0 +1 @@ + diff --git a/docs/public/vercel.svg b/docs/public/vercel.svg new file mode 100644 index 000000000..1aeda7d6d --- /dev/null +++ b/docs/public/vercel.svg @@ -0,0 +1 @@ + diff --git a/docs/styles/globals.css b/docs/styles/globals.css new file mode 100644 index 000000000..b8f77e5b8 --- /dev/null +++ b/docs/styles/globals.css @@ -0,0 +1,76 @@ +@tailwind base; + @tailwind components; + @tailwind utilities; + + @layer base { + :root { + --background: 0 0% 100%; + --foreground: 20 14.3% 4.1%; + + --card: 0 0% 100%; + --card-foreground: 20 14.3% 4.1%; + + --popover: 0 0% 100%; + --popover-foreground: 20 14.3% 4.1%; + + --primary: 24 9.8% 10%; + --primary-foreground: 60 9.1% 97.8%; + + --secondary: 60 4.8% 95.9%; + --secondary-foreground: 24 9.8% 10%; + + --muted: 60 4.8% 95.9%; + --muted-foreground: 25 5.3% 44.7%; + + --accent: 60 4.8% 95.9%; + --accent-foreground: 24 9.8% 10%; + + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 60 9.1% 97.8%; + + --border: 20 5.9% 90%; + --input: 20 5.9% 90%; + --ring: 20 14.3% 4.1%; + + --radius: 0.5rem; + } + + .dark { + --background: 20 14.3% 4.1%; + --foreground: 60 9.1% 97.8%; + + --card: 20 14.3% 4.1%; + --card-foreground: 60 9.1% 97.8%; + + --popover: 20 14.3% 4.1%; + --popover-foreground: 60 9.1% 97.8%; + + --primary: 60 9.1% 97.8%; + --primary-foreground: 24 9.8% 10%; + + --secondary: 12 6.5% 15.1%; + --secondary-foreground: 60 9.1% 97.8%; + + --muted: 12 6.5% 15.1%; + --muted-foreground: 24 5.4% 63.9%; + + --accent: 12 6.5% 15.1%; + --accent-foreground: 60 9.1% 97.8%; + + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 60 9.1% 97.8%; + + --border: 12 6.5% 15.1%; + --input: 12 6.5% 15.1%; + --ring: 24 5.7% 82.9%; + } + } + + @layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } + } diff --git a/docs/tailwind.config.ts b/docs/tailwind.config.ts new file mode 100644 index 000000000..479a527ee --- /dev/null +++ b/docs/tailwind.config.ts @@ -0,0 +1,80 @@ +import type { Config } from "tailwindcss" + +const config = { + darkMode: ["selector"], + content: [ + './pages/**/*.{ts,tsx,md,mdx}', + './components/**/*.{ts,tsx,md,mdx}', + './app/**/*.{ts,tsx}', + './src/**/*.{ts,tsx}', + ], + prefix: "", + theme: { + container: { + center: true, + padding: "2rem", + screens: { + "2xl": "1400px", + }, + }, + extend: { + colors: { + border: "hsl(var(--border))", + input: "hsl(var(--input))", + ring: "hsl(var(--ring))", + background: "hsl(var(--background))", + foreground: "hsl(var(--foreground))", + primary: { + DEFAULT: "hsl(var(--primary))", + foreground: "hsl(var(--primary-foreground))", + }, + secondary: { + DEFAULT: "hsl(var(--secondary))", + foreground: "hsl(var(--secondary-foreground))", + }, + destructive: { + DEFAULT: "hsl(var(--destructive))", + foreground: "hsl(var(--destructive-foreground))", + }, + muted: { + DEFAULT: "hsl(var(--muted))", + foreground: "hsl(var(--muted-foreground))", + }, + accent: { + DEFAULT: "hsl(var(--accent))", + foreground: "hsl(var(--accent-foreground))", + }, + popover: { + DEFAULT: "hsl(var(--popover))", + foreground: "hsl(var(--popover-foreground))", + }, + card: { + DEFAULT: "hsl(var(--card))", + foreground: "hsl(var(--card-foreground))", + }, + }, + borderRadius: { + lg: "var(--radius)", + md: "calc(var(--radius) - 2px)", + sm: "calc(var(--radius) - 4px)", + }, + keyframes: { + "accordion-down": { + from: { height: "0" }, + to: { height: "var(--radix-accordion-content-height)" }, + }, + "accordion-up": { + from: { height: "var(--radix-accordion-content-height)" }, + to: { height: "0" }, + }, + }, + animation: { + "accordion-down": "accordion-down 0.2s ease-out", + "accordion-up": "accordion-up 0.2s ease-out", + }, + }, + }, + plugins: [require("tailwindcss-animate")], +} satisfies Config + +export default config diff --git a/docs/theme.config.jsx b/docs/theme.config.jsx new file mode 100644 index 000000000..b42bee33d --- /dev/null +++ b/docs/theme.config.jsx @@ -0,0 +1,75 @@ +import Link from "next/link" + +export default { + logo:
+ + + + + + + Sotopia
, + project: { + link: 'https://github.com/sotopia-lab/sotopia', + }, + toc: { + backToTop: true, + }, + sidebar: { + toggleButton: true, + }, + search: { + placeholder: 'Search contents', + }, + feedback: { + content: null, + }, + head: ( + <> + + + + ), + footer: { + text: ( + + MIT {new Date().getFullYear()} ©{' '} + + Sotopia Lab + + . + + ) + }, + useNextSeoProps() { + return { + titleTemplate: '%s – sotopia', + description: '', + openGraph: { + type: 'website', + images: [ + { + url: 'https://github.com/sotopia-lab/sotopia/raw/main/figs/title.png', + } + ], + locale: 'en_US', + url: 'https://sotopia.world', + siteName: 'Sotopia', + title: 'Sotopia', + description: 'Sotopia: an Open-ended Social Learning Environment', + }, + twitter: { + cardType: 'summary_large_image', + title: 'Sotopia: an Open-ended Social Learning Environment', + image: 'https://github.com/sotopia-lab/sotopia/raw/main/figs/title.png', + }, + } + + }, + // ... other theme options + } diff --git a/docs/tsconfig.json b/docs/tsconfig.json new file mode 100644 index 000000000..c5aea60b3 --- /dev/null +++ b/docs/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "paths": { + "@/*": ["./*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "pages/index.mdx", "pages/index.mdx"], + "exclude": ["node_modules"] +} From 184d1ca84e03c549bab05d2b8b530d65b1c75a14 Mon Sep 17 00:00:00 2001 From: Hao Zhu Date: Sun, 26 May 2024 16:40:28 -0400 Subject: [PATCH 2/6] Update dependency list and move optional ones to extra dependencies (#80) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * cut 5 dependencies: datasets, scipy, names, torch, and transformers * remove jinja2 * change minimalist demo back * update dependency by adding extra options * 👷 add "chat" extra to intall * add install types for sotopia-chat * add sotopia-chat to mypy * 👷 add multiple python versions * 👷 widen python versions * 💚 add poetry lock to update the lock file * remove 3.9 * update raise syntax to adapt more python versions * add poetry lock to pytest * use wait for for python < 3.11 * add relase to pypi github action * docs: Update Python version support to include Python 3.10, and include instructions to install extra dependencies * added callout components --- .github/workflows/mypy.yml | 14 +- .github/workflows/publish-to-pypi.yml | 38 + .github/workflows/tests.yml | 3 +- docs/pages/{examples.md => examples.mdx} | 6 +- docs/pages/index.mdx | 24 +- examples/generate_scenarios.py | 2 + .../generate_specific_envs.py | 4 +- lmlib/__init__.py | 0 lmlib/api_service/__init__.py | 0 lmlib/api_service/chat_model.py | 197 -- lmlib/api_service/client_api.py | 69 - lmlib/api_service/main.py | 43 - lmlib/api_service/setup_args.py | 114 - lmlib/arguments.py | 149 -- lmlib/model_tools.py | 332 --- lmlib/serve/__init__.py | 0 lmlib/serve/cli.py | 147 -- lmlib/serve/lm_inference.py | 325 --- lmlib/utils/__init__.py | 0 lmlib/utils/conversation.py | 197 -- lmlib/utils/data_utils.py | 61 - poetry.lock | 1884 ++++++++++++----- pyproject.toml | 34 +- sotopia-chat/fastapi_server.py | 19 +- sotopia/generation_utils/__init__.py | 6 - sotopia/renderers/xml_renderer.py | 5 +- stubs/peft/__init__.pyi | 16 - 27 files changed, 1439 insertions(+), 2250 deletions(-) create mode 100644 .github/workflows/publish-to-pypi.yml rename docs/pages/{examples.md => examples.mdx} (72%) rename {sotopia/generation_utils => examples}/generate_specific_envs.py (97%) delete mode 100644 lmlib/__init__.py delete mode 100644 lmlib/api_service/__init__.py delete mode 100644 lmlib/api_service/chat_model.py delete mode 100644 lmlib/api_service/client_api.py delete mode 100644 lmlib/api_service/main.py delete mode 100644 lmlib/api_service/setup_args.py delete mode 100644 lmlib/arguments.py delete mode 100644 lmlib/model_tools.py delete mode 100644 lmlib/serve/__init__.py delete mode 100644 lmlib/serve/cli.py delete mode 100644 lmlib/serve/lm_inference.py delete mode 100644 lmlib/utils/__init__.py delete mode 100644 lmlib/utils/conversation.py delete mode 100644 lmlib/utils/data_utils.py delete mode 100644 stubs/peft/__init__.pyi diff --git a/.github/workflows/mypy.yml b/.github/workflows/mypy.yml index bd3fc784b..aea5b947b 100644 --- a/.github/workflows/mypy.yml +++ b/.github/workflows/mypy.yml @@ -6,20 +6,26 @@ jobs: runs-on: ubuntu-latest strategy: max-parallel: 5 + matrix: + python-version: ["3.10", "3.11", "3.12"] steps: - uses: actions/checkout@v3 - - name: Set up Python 3.11 - uses: actions/setup-python@v4 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 with: - python-version: 3.11.2 + python-version: ${{ matrix.python-version }} + - name: Display Python version + run: python -c "import sys; print(sys.version)" - name: Install dependencies run: | curl -sSL https://install.python-poetry.org | python3 - poetry install --all-extras + poetry lock + poetry install --with test -E chat - name: Type-checking package with mypy run: | # Run this mypy instance against our main package. poetry run pip install types-protobuf==4.24.0.4 poetry run mypy --install-types --non-interactive sotopia + poetry run mypy --install-types --non-interactive sotopia-chat poetry run mypy --strict . diff --git a/.github/workflows/publish-to-pypi.yml b/.github/workflows/publish-to-pypi.yml new file mode 100644 index 000000000..ce091d243 --- /dev/null +++ b/.github/workflows/publish-to-pypi.yml @@ -0,0 +1,38 @@ +# This workflow will upload a Python Package using Twine when a release is created +# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python#publishing-to-package-registries + +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +name: Upload Python Package + +on: + release: + types: [published] + +permissions: + contents: read + +jobs: + release: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - name: Set up Python 3.11 + uses: actions/setup-python@v4 + with: + python-version: 3.11.2 + - name: Install dependencies + run: | + curl -sSL https://install.python-poetry.org | python3 + + - name: Get release version + run: echo "RELEASE_VERSION=$(poetry version | awk '{print $2}')" >> $GITHUB_ENV + + - name: Build and publish Python package + run: poetry publish --build + env: + POETRY_PYPI_TOKEN_PYPI: ${{ secrets.PYPI_TOKEN }} diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index de119fc0f..c0a430b89 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -16,7 +16,8 @@ jobs: - name: Install dependencies run: | curl -sSL https://install.python-poetry.org | python3 - poetry install --all-extras + poetry lock + poetry install --with test -E chat - name: Test with pytest env: # Or as an environment variable OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} diff --git a/docs/pages/examples.md b/docs/pages/examples.mdx similarity index 72% rename from docs/pages/examples.md rename to docs/pages/examples.mdx index e2cc0cfc0..aac169c80 100644 --- a/docs/pages/examples.md +++ b/docs/pages/examples.mdx @@ -1,6 +1,10 @@ +import { Callout } from 'nextra/components' + # Example Scripts For Using The Library -## Example 1: Evaluating existing episodes + + Before running examples, please install extra dependencies with `pip install sotopia[examples]` or `poetry install -E examples` if you are using poetry. + ```python python examples/evaluate_existing_episodes.py --tag= --model= --batch_size= --push-to-db diff --git a/docs/pages/index.mdx b/docs/pages/index.mdx index cd36a89d8..7da796513 100644 --- a/docs/pages/index.mdx +++ b/docs/pages/index.mdx @@ -3,7 +3,7 @@ import { Lumiflex } from 'uvcanvas' import { Button } from "../components/ui/button" import { MoveRight } from "lucide-react" import { Accordion, AccordionItem, AccordionContent, AccordionTrigger } from "../components/ui/accordion" -import { Steps } from 'nextra/components' +import { Steps, Callout } from 'nextra/components' # Sotopia - Getting Started @@ -30,15 +30,20 @@ https://github.com/sotopia-lab/sotopia ## Installation -
+ + +
+ Check out Open in Colab for a quick tutorial
+
+ ### Basic Usage -This package supports Python 3.11 and above. +This package supports Python 3.10 and above. Tested on Ubuntu 22.04 with python 3.11. @@ -80,6 +85,19 @@ pip install sotopia ``` + + What if I want to run examples and sotopia-chat? + +

Install the package with the following command:

+ ```bash + pip install sotopia[examples, chat] + ``` + if you are using poetry, you can install the package with: + ```bash + poetry install -E examples -E chat + ``` +
+
#### Set up Redis stack diff --git a/examples/generate_scenarios.py b/examples/generate_scenarios.py index 25a246c36..88a83ce7e 100644 --- a/examples/generate_scenarios.py +++ b/examples/generate_scenarios.py @@ -12,6 +12,8 @@ from sotopia.database.persistent_profile import RelationshipType from sotopia.generation_utils import ( LLM_Name, +) +from .generate_specific_envs import ( # type:ignore[import-untyped] generate_craigslist_bargains_envs, generate_mutual_friend_envs, ) diff --git a/sotopia/generation_utils/generate_specific_envs.py b/examples/generate_specific_envs.py similarity index 97% rename from sotopia/generation_utils/generate_specific_envs.py rename to examples/generate_specific_envs.py index 4b3149139..bfcd27355 100644 --- a/sotopia/generation_utils/generate_specific_envs.py +++ b/examples/generate_specific_envs.py @@ -4,13 +4,15 @@ Here are the datasets we have so far: 1. Mutual-Friend (https://huggingface.co/datasets/mutual_friends) 2. Craigslist-Bargains (https://huggingface.co/datasets/craigslist_bargains) + +You will have to install the datasets library to use this file. """ import names import numpy as np from datasets import DatasetDict, load_dataset -from .generate import StrOutputParser, generate +from sotopia.generation_utils.generate import StrOutputParser, generate async def generate_mutual_friend_envs() -> tuple[str, list[str]]: diff --git a/lmlib/__init__.py b/lmlib/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/lmlib/api_service/__init__.py b/lmlib/api_service/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/lmlib/api_service/chat_model.py b/lmlib/api_service/chat_model.py deleted file mode 100644 index f00975399..000000000 --- a/lmlib/api_service/chat_model.py +++ /dev/null @@ -1,197 +0,0 @@ -from typing import Any, List - -import torch -from pydantic import BaseModel - -from lmlib.utils.conversation import ( - Conversation, - SeparatorStyle, - compute_skip_echo_len, -) - - -class ChatMessage(BaseModel): - system: str - messages: List[List[str]] # list of [role, message] - input: str - - -def get_conv_from_json(message: ChatMessage) -> Conversation: - system = message.system - messages = message.messages - return Conversation( - system=system, - roles=["INTERVIEWER", "ME"], - messages=messages, - offset=0, - sep_style=SeparatorStyle.TWO, - sep=" ", - sep2="", - ) - - -class ChatModel: - def __init__( - self, - model: Any, - tokenizer: Any, - device: str, - context_len: int = 2048, - stream_interval: int = 2, - ): - self.model = model - self.tokenizer = tokenizer - self.device = device - self.context_len = context_len - self.stream_interval = stream_interval - - @torch.inference_mode() - def generate_stream( - self, - params: Any, - device: str, - context_len: int = 2048, - stream_interval: int = 2, - ) -> Any: - model = self.model - tokenizer = self.tokenizer - prompt = params["prompt"] - l_prompt = len(prompt) - temperature = float(params.get("temperature", 1.0)) - max_new_tokens = int(params.get("max_new_tokens", 256)) - stop_str = params.get("stop", None) - stop_token_ids = params.get("stop_ids", [tokenizer.eos_token_id]) - - input_ids = tokenizer(prompt).input_ids - output_ids = list(input_ids) - - max_src_len = context_len - max_new_tokens - 8 - input_ids = input_ids[-max_src_len:] - token = 0 - - for i in range(max_new_tokens): - if i == 0: - if model.config.is_encoder_decoder: - encoder_outputs = model.encoder( - input_ids=torch.as_tensor([input_ids], device=device) - ) - out = model( - torch.as_tensor([input_ids], device=device), - decoder_input_ids=torch.as_tensor( - [[model.generation_config.decoder_start_token_id]], - device=device, - ), - encoder_outputs=encoder_outputs, - use_cache=True, - ) - logits = out.logits - past_key_values = out.past_key_values - else: - out = model( - torch.as_tensor([input_ids], device=device), - use_cache=True, - ) - logits = out.logits - past_key_values = out.past_key_values - else: - if model.config.is_encoder_decoder: - out = model( - input_ids=torch.as_tensor([input_ids], device=device), - use_cache=True, - encoder_outputs=encoder_outputs, - decoder_input_ids=torch.as_tensor([[token]], device=device), - past_key_values=past_key_values, - ) - logits = out.logits - past_key_values = out.past_key_values - else: - out = model( - input_ids=torch.as_tensor([[token]], device=device), - use_cache=True, - past_key_values=past_key_values, - ) - logits = out.logits - past_key_values = out.past_key_values - - last_token_logits = logits[0][-1] - - if device == "mps": - # Switch to CPU by avoiding some bugs in mps backend. - last_token_logits = last_token_logits.float().to("cpu") - - if temperature < 1e-4: - token = int(torch.argmax(last_token_logits)) - else: - probs = torch.softmax(last_token_logits / temperature, dim=-1) - token = int(torch.multinomial(probs, num_samples=1)) - - output_ids.append(token) - - if token in stop_token_ids: - stopped = True - else: - stopped = False - - if i % stream_interval == 0 or i == max_new_tokens - 1 or stopped: - output = tokenizer.decode(output_ids, skip_special_tokens=True) - if stop_str: - pos = output.rfind(stop_str, l_prompt) - if pos != -1: - output = output[:pos] - stopped = True - yield output - - if stopped: - break - - del past_key_values - - def stream_output(self, output_stream: List[Any], skip_echo_len: int) -> Any: - pre = 0 - for outputs in output_stream: - outputs = outputs[skip_echo_len:].strip() - outputs = outputs.split(" ") - now = len(outputs) - 1 - if now > pre: - yield " ".join(outputs[pre:now]) + " " - pre = now - yield " ".join(outputs[pre:]) - - def prompt_for_input(self, role: str) -> str: - return input(f"{role}: ") - - def prompt_for_output(self, role: str) -> None: - print(f"{role}: ", end="", flush=True) - - def chat_oneshot( - self, - msg: ChatMessage, - temperature: float = 0.7, - max_new_tokens: int = 2048, - ) -> Any: - conv = get_conv_from_json(msg) - inp = msg.input - conv.append_message(conv.roles[0], inp) - conv.append_message(conv.roles[1], "") - prompt = conv.get_prompt() - - skip_echo_len = compute_skip_echo_len(conv, prompt) - stop_str = ( - conv.sep - if conv.sep_style in [SeparatorStyle.SINGLE, SeparatorStyle.BAIZE] - else None - ) - - params = { - "prompt": prompt, - "temperature": temperature, - "max_new_tokens": max_new_tokens, - "stop": stop_str, - } - - # self.prompt_for_output(conv.roles[1]) - outstream = self.generate_stream(params, self.device) - return self.stream_output(outstream, skip_echo_len) - - # output_stream = self.generate_stream(params, self.device) # self.device is "cuda" - # return chatio.stream_output(output_stream, skip_echo_len) diff --git a/lmlib/api_service/client_api.py b/lmlib/api_service/client_api.py deleted file mode 100644 index 0902c7ca9..000000000 --- a/lmlib/api_service/client_api.py +++ /dev/null @@ -1,69 +0,0 @@ -import json -import os.path as osp -from typing import Any, Dict - -import requests - -from lmlib.api_service.chat_model import ChatMessage - - -# write an api service to get the response from the server -class ChatCharacterGPT: - def __init__(self, public_url: str) -> None: - self.public_url = public_url - - def check_msg(self, message: Dict[str, Any]) -> bool: - try: - ChatMessage.parse_raw(json.dumps(message)) - except Exception as e: - print(e) - print("Invalid message type") - return False - return True - - def generate_stream(self, message: Dict[str, Any]) -> Any: - if not self.check_msg(message): - return - post_url = osp.join(self.public_url, "message") - with requests.post(post_url, json=message, stream=True) as response: - # Set the chunk size to 1024 bytes - for chunk in response.iter_content(chunk_size=1024): - yield chunk.decode("utf-8") - - def generate(self, message: Dict[str, Any]) -> str | None: - if not self.check_msg(message): - return None - post_url = osp.join(self.public_url, "message") - with requests.post(post_url, json=message, stream=True) as response: - # Set the chunk size to 1024 bytes - res = "" - for chunk in response.iter_content(chunk_size=1024): - res += chunk.decode("utf-8") - return res - - -# # post method -# public_url='https://a986-128-2-205-154.ngrok-free.app/message/' -# #url = 'http://127.0.0.1:8000/message/' -# with requests.post(public_url, json=js, stream=True) as response: -# # Set the chunk size to 1024 bytes -# for chunk in response.iter_content(chunk_size=100): -# # Print each chunk to the console -# print(chunk) - -if __name__ == "__main__": - js = { - "system": "My name is Eli Dawson, and I'm a 52-year-old forensic psychiatrist. I would like to answer any questions about myself.", - "messages": [ - ["INTERVIEWER", "Hello"], - ["ME", "Thank you for having me. It's a pleasure to be here."], - ], - "input": "what is your job?", - } - public_url = "https://a986-128-2-205-154.ngrok-free.app" - chat = ChatCharacterGPT(public_url) - for chunk in chat.generate_stream(js): - print(chunk) - print(chat.generate(js)) - # for chunk in chat.generate(js): - # print(chunk, end='') diff --git a/lmlib/api_service/main.py b/lmlib/api_service/main.py deleted file mode 100644 index 9db7c7258..000000000 --- a/lmlib/api_service/main.py +++ /dev/null @@ -1,43 +0,0 @@ -import transformers -from fastapi import FastAPI -from fastapi.responses import StreamingResponse - -from lmlib.api_service.chat_model import ChatMessage, ChatModel -from lmlib.api_service.setup_args import setup_inf_args -from lmlib.arguments import InferenceArguments, LoraArguments -from lmlib.serve.lm_inference import load_gen_model - -parser = transformers.HfArgumentParser((InferenceArguments, LoraArguments)) # type: ignore -inf_args, lora_args = setup_inf_args() - - -# hard code model param -model, tokenizer = load_gen_model( - inf_args.model_path, - inf_args.cache_dir, - large_model=inf_args.load_8bit, - device="cuda:0", - lora_path=lora_args.lora_weight_path, -) -chat = ChatModel(model, tokenizer, "cuda", 2048, 2) - -app = FastAPI() - - -@app.post("/message/") -async def gen_from_msg(msg: ChatMessage) -> StreamingResponse: - return StreamingResponse(chat.chat_oneshot(msg)) - - -# for later use, current post method is enough -# @app.put("/message/{msg_id}") -# async def gen_from_id_msg(msg_id: int, msg: ChatMessage): -# # save id -# print(f"id: {msg_id}") -# return StreamingResponse(chat.chat_oneshot(msg)) - - -if __name__ == "__main__": - import uvicorn - - uvicorn.run(app, port=8000, log_level="info") diff --git a/lmlib/api_service/setup_args.py b/lmlib/api_service/setup_args.py deleted file mode 100644 index 697c62e32..000000000 --- a/lmlib/api_service/setup_args.py +++ /dev/null @@ -1,114 +0,0 @@ -import os.path as osp -from argparse import Namespace -from typing import Any, List, Tuple - -from transformers import HfArgumentParser # type: ignore - -from lmlib.arguments import ( - DataArguments, - InferenceArguments, - LoraArguments, - ModelArguments, -) -from lmlib.arguments import PreTrainingArguments as TrainingArguments - -base_dir = "/usr1/data/ruohongz/ds" -save_dir = f"{base_dir}/save" -cache_dir = f"{base_dir}/cache" -data_dir = f"{base_dir}/data" - -exp_dict_default = Namespace( - data_name="info_eli_dawson.json", - model_name="decapoda-research/llama-13b-hf", - lora_model_name=osp.join("eli-lora-llama-13b-v1"), -) - - -def set_path(exp_dict: Any = exp_dict_default) -> Namespace: - data_name = exp_dict.data_name - - paths = Namespace( - base_dir=base_dir, - save_dir=save_dir, - cache_dir=cache_dir, - data_dir=data_dir, - data_name=data_name, - model_name=exp_dict.model_name, - lora_model_name=exp_dict.lora_model_name, - lora_path=osp.join(save_dir, exp_dict.lora_model_name), - ) - return paths - - -def get_args(paths: Namespace) -> List[str]: - args = [ - "--exp_name", - "seed100", - "--seed", - "100", - "--data_dir", - paths.data_dir, - "--output_dir", - paths.save_dir, - "--cache_dir", - paths.cache_dir, - "--max_steps", - "500", - "--model_name_or_path", - paths.model_name, - "--per_device_eval_batch_size", - "32", - "--per_device_train_batch_size", - "32", - "--num_train_epochs", - "1", - "--learning_rate", - "1e-5", - "--max_text_length", - "128", - "--dataloader_num_workers", - "1", - "--model_max_length", - "2048", - ] - return args - - -def setup_args( - exp_dict: Namespace = exp_dict_default, additional_args: List[str] = [] -) -> Tuple[Namespace, Namespace, Namespace, Namespace]: - paths = set_path(exp_dict) - args = get_args(paths) - parser = HfArgumentParser( - (ModelArguments, DataArguments, TrainingArguments, LoraArguments) - ) - ( - model_args, - data_args, - training_args, - lora_args, - ) = parser.parse_args_into_dataclasses(args + additional_args) - return model_args, data_args, training_args, lora_args - - -def get_inf_args(paths: Namespace) -> List[str]: - args = [ - "--model_path", - paths.model_name, - "--cache_dir", - paths.cache_dir, - "--lora_weight_path", - paths.lora_path, - "--load_8bit", - ] - return args - - -def setup_inf_args( - exp_dict: Namespace = exp_dict_default, additional_args: List[str] = [] -) -> Tuple[Namespace, Namespace]: - paths = set_path(exp_dict) - args = get_inf_args(paths) - parser = HfArgumentParser((InferenceArguments, LoraArguments)) - inf_args, lora_args = parser.parse_args_into_dataclasses(args + additional_args) - return inf_args, lora_args diff --git a/lmlib/arguments.py b/lmlib/arguments.py deleted file mode 100644 index dbb21dc50..000000000 --- a/lmlib/arguments.py +++ /dev/null @@ -1,149 +0,0 @@ -from dataclasses import dataclass, field -from typing import Optional, Union - -from transformers.training_args import TrainingArguments - - -@dataclass -class ModelArguments: - model_name_or_path: str = field( - metadata={ - "help": "Path to pretrained model or model identifier from huggingface.co/models" - } - ) - model_name_short: Union[str, None] = field(default=None) - gen_model_name: Union[str, None] = field(default=None) - gen_model_name_short: Union[str, None] = field(default=None) - target_model_path: Union[str, None] = field( - default=None, - metadata={"help": "Path to pretrained reranker target model"}, - ) - config_name: Optional[str] = field( - default=None, - metadata={ - "help": "Pretrained config name or path if not the same as model_name" - }, - ) - tokenizer_name: Optional[str] = field( - default=None, - metadata={ - "help": "Pretrained tokenizer name or path if not the same as model_name" - }, - ) - cache_dir: Optional[str] = field( - default=None, - metadata={ - "help": "Where do you want to store the pretrained models downloaded from s3" - }, - ) - - # out projection - add_pooler: bool = field(default=False) - projection_in_dim: int = field(default=768) - projection_out_dim: int = field(default=768) - - decay_rate: Optional[float] = field( - default=0.6, metadata={"help": "Decay learning rate"} - ) - pooling: Optional[str] = field( - default="pooler", metadata={"help": "Pooling method"} - ) - device: Optional[str] = field(default="cuda:1", metadata={"help": "Device to use"}) - gen_device: Optional[str] = field( - default="cuda:0", metadata={"help": "Device to use"} - ) - max_text_length: int = field(default=128) - - -@dataclass -class DataArguments: - # data dir, path, name related - train_dir: Union[str, None] = field( - default=None, metadata={"help": "Path to train directory"} - ) - train_path: Union[str, None] = field( - default=None, metadata={"help": "Path to single train file"} - ) - eval_path: Union[str, None] = field( - default=None, metadata={"help": "Path to eval file"} - ) - corpus_path: Union[str, None] = field( - default=None, metadata={"help": "Path to corpus file"} - ) - data_dir: Union[str, None] = field( - default=None, metadata={"help": "Path to data directory"} - ) - data_path: Union[str, None] = field( - default=None, metadata={"help": "Path to the single data file"} - ) - processed_data_path: Union[str, None] = field( - default=None, metadata={"help": "Path to processed data directory"} - ) - context_path: Union[str, None] = field(default=None) - dataset_name: Union[str, None] = field( - default=None, metadata={"help": "huggingface dataset name"} - ) - prompt_path: Union[str, None] = field(default=None) - label_name_path: Union[str, None] = field(default=None) - label_path: Union[str, None] = field(default=None) - save_path: Union[str, None] = field(default=None) - - # data format related - data_cache_dir: Union[str, None] = field( - default=None, - metadata={ - "help": "Where do you want to store the data downloaded from huggingface" - }, - ) - exp_name: str = field(default="exp") - conv_template: Union[str, None] = field(default=None) - - -@dataclass -class PreTrainingArguments(TrainingArguments): # type: ignore[misc] - # generate - generation_mode: Union[str, None] = field(default=None) - load_large_model: bool = field(default=False) - num_samples: int = field(default=5) - - top_k: int = field(default=10) - top_p: float = field(default=0.9) - temperature: float = field(default=1.0) - - gen_batch_size: int = field(default=45) - max_length: Union[str, None] = field(default=None) - min_length: Union[str, None] = field(default=None) - do_sample: bool = field(default=True) - num_beams: int = field(default=1) - - max_iter: int = field(default=1000) - model_max_length: int = field(default=512) - - -@dataclass -class LoraArguments: - lora_r: int = 8 - lora_alpha: int = 16 - lora_dropout: float = 0.05 - # lora_target_modules: typing.List[str] = field( - # default_factory=lambda: ["q_proj", "v_proj"] - # ) - lora_target_modules: str = "q_proj,v_proj" - lora_weight_path: str = "" - bias: str = "none" - - -@dataclass -class InferenceArguments: - model_path: str = field(default="decapoda-research/llama-13b-hf") - cache_dir: Union[str, None] = field(default=None) - device: str = field(default="cuda") - gpus: Union[str, None] = field(default=None) - num_gpus: str = field(default="1") - conv_template: Union[str, None] = field(default=None) - temperature: float = field(default=0.7) - max_new_tokens: int = field(default=512) - style: str = field(default="simple") - load_8bit: bool = field(default=False) - max_gpu_memory: bool = field(default=False) - debug: bool = field(default=False) diff --git a/lmlib/model_tools.py b/lmlib/model_tools.py deleted file mode 100644 index b173b3450..000000000 --- a/lmlib/model_tools.py +++ /dev/null @@ -1,332 +0,0 @@ -import os -import os.path as osp -from argparse import Namespace -from typing import Any, Dict, Tuple - -import torch - -# from transformers.trainer_pt_utils import IterableDatasetShard -from logzero import logger -from transformers import ( # type: ignore[attr-defined] - AutoModel, - AutoModelForCausalLM, - AutoTokenizer, -) - -default_args = Namespace(max_len=256) -default_gen_params: Dict[str, str] = {} - - -def load_and_cache_model( - model_name: str, cache_dir: str, margs: Dict[str, Any] = {} -) -> Any: - save_name = osp.basename(model_name) - model_cache_dir = osp.join(cache_dir, save_name) - model_path = osp.join(model_cache_dir, "model.pt") - if osp.exists(model_path): - logger.info(f"load model from {model_path}") - model = torch.load(model_path) - return model - MODEL_CLASS = AutoModelForCausalLM - if margs == {}: - margs = {"torch_dtype": torch.float16} - - margs["cache_dir"] = model_cache_dir - logger.info("load and cache model") - model = MODEL_CLASS.from_pretrained(model_name, **margs) - torch.save(model, model_path) - return model - - -def load_ret_model( - model_args: Any, device: str = "cuda", dtype: Any = torch.float32 -) -> Any: - logger.info(f"ret model dtype: {dtype}") - cache_dir = model_args.cache_dir - ret_model_name = model_args.model_name_or_path - ret_model_name_short = os.path.basename(ret_model_name) - ret_model_cache_dir = osp.join(cache_dir, ret_model_name_short) - ret_model = AutoModel.from_pretrained(ret_model_name, cache_dir=ret_model_cache_dir) - ret_model = ret_model.to(device=device, dtype=dtype) - ret_tokenizer = AutoTokenizer.from_pretrained( - ret_model_name, cache_dir=ret_model_cache_dir - ) - return ret_model, ret_tokenizer - - -def load_and_cache_large_model(model_name: str, cache_dir: str, device: str) -> Any: - MODEL_CLASS = AutoModelForCausalLM - save_name = osp.basename(model_name) - model_cache_dir = osp.join(cache_dir, save_name) - # config = AutoConfig.from_pretrained(model_name, cache_dir=cache_dir) - # with init_empty_weights(config): - # model = MODEL_CLASS.from_config(config) - - # max_memory = {1: "49GIB"} - # device_map = infer_auto_device_map(model, max_memory=max_memory) - # model = load_checkpoint_and_dispatch( - # model, - # model_cache_dir, - # device_map=device_map, - # ) - # save_name = osp.basename(model_name) - device_map = {"": int(device[-1])} - print(device_map) - margs = {"load_in_8bit": True, "device_map": device_map} - model_cache_dir = osp.join(cache_dir, save_name) - margs["cache_dir"] = model_cache_dir - model = MODEL_CLASS.from_pretrained(model_name, **margs) - return model - - -def load_gen_model( - model_args: Any, - large_model: bool = False, - device: str = "cuda", - margs: Dict[str, Any] = {}, -) -> Any: - cache_dir = model_args.cache_dir - gen_model_name = model_args.gen_model_name - if large_model: - gen_model = load_and_cache_large_model( - gen_model_name, cache_dir=cache_dir, device=device - ) - else: - # margs = {"revision": "float16", "torch_dtype": torch.float16, "low_cpu_mem_usage": True} - gen_model = load_and_cache_model( - gen_model_name, cache_dir=cache_dir, margs=margs - ) - gen_model = gen_model.to(device) - if ( - "vicuna" in gen_model_name - or "llama" in gen_model_name - or "alpaca" in gen_model_name - ): - from transformers.models.llama.tokenization_llama import ( - LlamaTokenizer, - ) - - gen_tokenizer = LlamaTokenizer.from_pretrained( - gen_model_name, cache_dir=cache_dir - ) - else: - gen_tokenizer = AutoTokenizer.from_pretrained( - gen_model_name, cache_dir=cache_dir - ) - return gen_model, gen_tokenizer - - -def load_model( - model_args: Any, - large_model: bool = False, - device: str = "cuda", - gen_device: str = "cuda", - dtype: Any = torch.float32, -) -> Dict[str, Tuple[Any, Any]]: - ret_model, ret_tokenizer = load_ret_model(model_args, device=device, dtype=dtype) - gen_model, gen_tokenizer = load_gen_model( - model_args, large_model=large_model, device=gen_device - ) - return { - "ret_model": (ret_model, ret_tokenizer), - "gen_model": (gen_model, gen_tokenizer), - } - - -""" -for later use - -def get_context(torch_dtype: str=None, training_args=None): - if torch_dtype is None: # infer dtype from training_args - assert training_args is not None - if training_args.fp16: - torch_dtype = torch.float16 - elif training_args.bf16: - torch_dtype = torch.bfloat16 - else: - torch_dtype = torch.float32 - context = nullcontext() - if torch_dtype == torch.float16: - context = amp.autocast() - elif torch_dtype == torch.bfloat16: - context = amp.autocast(dtype=torch.bfloat16) - return context - -class RetreiverTool: - def __init__(self, model, tokenizer, args=default_args): - #self.model = model.to(args.device) - self.model = model - self.tokenizer = tokenizer - self.args = args - self.max_len = args.max_len - self.pooling = args.pooling # default simcse is pooler - - def embed( - self, - input_ids=None, - attention_mask=None, - token_type_ids=None, - position_ids=None, - head_mask=None, - inputs_embeds=None, - encoder_hidden_states=None, - encoder_attention_mask=None, - output_attentions=None, - output_hidden_states=None, - normalize=False, - ): - - model_output = self.model.forward( - input_ids=input_ids, - attention_mask=attention_mask, - token_type_ids=token_type_ids, - position_ids=position_ids, - head_mask=head_mask, - inputs_embeds=inputs_embeds, - encoder_hidden_states=encoder_hidden_states, - encoder_attention_mask=encoder_attention_mask, - output_attentions=output_attentions, - output_hidden_states=output_hidden_states, - ) - - if self.pooling == "average": - last_hidden = model_output["last_hidden_state"] - last_hidden = last_hidden.masked_fill(~attention_mask[..., None].bool(), 0.0) - emb = last_hidden.sum(dim=1) / attention_mask.sum(dim=1)[..., None] - elif self.pooling == "cls": - emb = model_output["last_hidden_state"][:, 0] - elif self.pooling == "pooler": - emb = model_output["pooler_output"] - - if normalize: - emb = torch.nn.functional.normalize(emb, dim=-1) - return emb - - @torch.no_grad() - def encode(self, texts): - self.model.eval() - feature = self.tokenizer(texts, - padding='max_length', truncation=True, max_length=self.max_len, - return_tensors="pt" - ).to(self.model.device) - embeddings = self.embed(**feature) - return embeddings.cpu().detach().numpy() - - def encode_batch(self, texts, batch_size=512): - self.model.eval() - embeddings = [] - for i in range(0, len(texts), batch_size): - batch_texts = texts[i:i+batch_size] - embeddings.append(self.encode(batch_texts)) - return np.concatenate(embeddings, axis=0) - - def predict(self, emb_text, emb_label): - pred = emb_text @ emb_label.T - return pred - - @classmethod - def load_model(cls, model_name, args, device="cuda:0"): - tokenizer = AutoTokenizer.from_pretrained(model_name) - model = AutoModel.from_pretrained(model_name).to(device) - return cls(model, tokenizer, args) - - -class GeneratorTool: - def __init__(self, model, tokenizer, args=default_args, lora_train=False): - #self.model = model.to(args.device) - self.model = model - self.model.eval() - self.tokenizer = tokenizer - - if lora_train: - model.config.pad_token_id = tokenizer.pad_token_id = 0 # unk - model.config.bos_token_id = 1 - model.config.eos_token_id = 2 - else: - # set pad token - if self.tokenizer.pad_token is None or self.tokenizer.pad_token == "": - if self.tokenizer.eos_token is None or self.tokenizer.eos_token == "": - self.tokenizer.eos_token = '' - #self.tokenizer.add_special_tokens({'pad_token': '[PAD]'}) - #self.model.resize_token_embeddings(len(self.tokenizer)) - - self.tokenizer.pad_token = self.tokenizer.eos_token - - self.args = args - self.max_len = args.max_len - #self.model.config.pad_token_id = tokenizer.eos_token_ - - self.loss_fn = torch.nn.CrossEntropyLoss(reduction='none', ignore_index=tokenizer.pad_token_id) - - def enc(self, texts): - texts = list(texts) # can't take np array - return self.tokenizer(texts, - padding='max_length', truncation=True, max_length=self.max_len, - return_tensors="pt" - ).to(self.model.device) - - def enc_for_generation(self, texts): - texts = list(texts) # can't take np array - inputs = self.tokenizer(texts, - padding='max_length', truncation=True, max_length=self.max_len, - return_tensors="pt" - ).to(self.model.device) - batch_size, seq_len = inputs['input_ids'].shape - - inputs['attention_mask'] = torch.flip(inputs['attention_mask'], dims=[1]) - shifts = seq_len - inputs['attention_mask'].sum(dim=-1) - for batch_idx in range(batch_size): - inputs['input_ids'][batch_idx] = inputs['input_ids'][batch_idx].roll(shifts[batch_idx].item()) - return inputs, seq_len - - @torch.no_grad() - def calc_loss(self, model, texts): - self.model.eval() - batch = self.enc(texts) - outputs = model(**batch) - shift_logits = outputs.logits[..., :-1, :].contiguous() - shift_labels = batch["input_ids"][..., 1:].contiguous() - loss = self.loss_fn(shift_logits.view(-1, shift_logits.size(-1)), shift_labels.view(-1)).view( - shift_labels.size()) - # pad position loss is 0 - avg_loss = loss.sum(-1) / (loss > 0).sum(-1) - return avg_loss.tolist() - - @torch.no_grad() - def generate(self, prompt_texts, - num_samples=1, min_length=16, max_length=64, - gen_params=default_gen_params): - torch_dtype = self.model.config.torch_dtype - context = get_context(torch_dtype) - with context: - batch, seq_len = self.enc_for_generation(prompt_texts) - - min_length = min_length + seq_len - max_length = min(self.model.config.max_position_embeddings, max_length + seq_len) - - output_ids = self.model.generate( - **batch, - num_return_sequences=num_samples, min_length=min_length, max_length=max_length, - generation_config=gen_params - ) - # get generated text - output_ids = output_ids[:, seq_len:] - gen_text = self.tokenizer.batch_decode(output_ids, skip_special_tokens=True) - # for i, output_text in enumerate(gen_text): - # output_text = post_process(output_text, self.min_length) - return gen_text - - def generate_batch(self, prompt_texts, - num_samples=1, min_length=16, max_length=64, - gen_params=default_gen_params, batch_size=32, verbose=False): - # actual batch is 32 on gpu - bsz = batch_size // num_samples - gen_texts = [] - if verbose: - loop = tqdm(range(0, len(prompt_texts), bsz)) - else: - loop = range(0, len(prompt_texts), bsz) - for i in loop: - gen_texts.extend(self.generate(prompt_texts[i:i+bsz], num_samples, min_length, max_length, gen_params)) - return gen_texts -""" diff --git a/lmlib/serve/__init__.py b/lmlib/serve/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/lmlib/serve/cli.py b/lmlib/serve/cli.py deleted file mode 100644 index 82353a479..000000000 --- a/lmlib/serve/cli.py +++ /dev/null @@ -1,147 +0,0 @@ -""" -Chat with a model with command line interface. -""" - -import os -import re -from argparse import Namespace -from typing import Any, List - -import transformers -from prompt_toolkit import PromptSession -from prompt_toolkit.auto_suggest import AutoSuggestFromHistory -from prompt_toolkit.completion import WordCompleter -from prompt_toolkit.history import InMemoryHistory -from rich.console import Console -from rich.live import Live -from rich.markdown import Markdown - -from lmlib.arguments import InferenceArguments, LoraArguments -from lmlib.serve.lm_inference import ChatIO, chat_loop - - -class SimpleChatIO(ChatIO): - def prompt_for_input(self, role: str) -> str: - return input(f"{role}: ") - - def prompt_for_output(self, role: str) -> None: - print(f"{role}: ", end="", flush=True) - - def stream_output(self, output_stream: List[Any], skip_echo_len: int) -> str: - pre = 0 - for outputs in output_stream: - outputs = outputs[skip_echo_len:].strip() - outputs = outputs.split(" ") - now = len(outputs) - 1 - if now > pre: - print(" ".join(outputs[pre:now]), end=" ", flush=True) - pre = now - print(" ".join(outputs[pre:]), flush=True) - return " ".join(outputs) - - -class RichChatIO(ChatIO): - _prompt_session: Any - - def __init__(self) -> None: - self._prompt_session = PromptSession(history=InMemoryHistory()) - self._completer = WordCompleter( - words=["!exit", "!reset"], pattern=re.compile("$") - ) - self._console = Console() - - def prompt_for_input(self, role: str) -> Any: - self._console.print(f"[bold]{role}:") - # TODO(suquark): multiline input has some issues. fix it later. - prompt_input = self._prompt_session.prompt( - completer=self._completer, - multiline=False, - auto_suggest=AutoSuggestFromHistory(), - key_bindings=None, - ) - self._console.print() - return prompt_input - - def prompt_for_output(self, role: str) -> None: - self._console.print(f"[bold]{role}:") - - def stream_output(self, output_stream: List[Any], skip_echo_len: int) -> Any: - """Stream output from a role.""" - # TODO(suquark): the console flickers when there is a code block - # above it. We need to cut off "live" when a code block is done. - - # Create a Live context for updating the console output - with Live(console=self._console, refresh_per_second=4) as live: - # Read lines from the stream - for outputs in output_stream: - accumulated_text = outputs[skip_echo_len:] - if not accumulated_text: - continue - # Render the accumulated text as Markdown - # NOTE: this is a workaround for the rendering "unstandard markdown" - # in rich. The chatbots output treat "\n" as a new line for - # better compatibility with real-world text. However, rendering - # in markdown would break the format. It is because standard markdown - # treat a single "\n" in normal text as a space. - # Our workaround is adding two spaces at the end of each line. - # This is not a perfect solution, as it would - # introduce trailing spaces (only) in code block, but it works well - # especially for console output, because in general the console does not - # care about trailing spaces. - lines = [] - for line in accumulated_text.splitlines(): - lines.append(line) - if line.startswith("```"): - # Code block marker - do not add trailing spaces, as it would - # break the syntax highlighting - lines.append("\n") - else: - lines.append(" \n") - markdown = Markdown("".join(lines)) - # Update the Live console output - live.update(markdown) - self._console.print() - return outputs[skip_echo_len:] - - -def main(args: Namespace) -> None: - if args.gpus: - if args.num_gpus and len(args.gpus.split(",")) < int(args.num_gpus): - raise ValueError( - f"Larger --num-gpus ({args.num_gpus}) than --gpus {args.gpus}!" - ) - os.environ["CUDA_VISIBLE_DEVICES"] = args.gpus - if args.style == "simple": - chatio: Any = SimpleChatIO() - elif args.style == "rich": - chatio = RichChatIO() - else: - raise ValueError(f"Invalid style for console: {args.style}") - try: - chat_loop( - args, - args.model_path, - args.cache_dir, - args.device, - args.num_gpus, - args.max_gpu_memory, - args.load_8bit, - args.conv_template, - args.temperature, - args.max_new_tokens, - chatio, - args.debug, - ) - except KeyboardInterrupt: - print("exit...") - - -if __name__ == "__main__": - parser = transformers.HfArgumentParser((InferenceArguments, LoraArguments)) # type: ignore - ( - inf_args, - lora_args, - ) = parser.parse_args_into_dataclasses() - - args = Namespace(**vars(inf_args), **vars(lora_args)) - main(args) diff --git a/lmlib/serve/lm_inference.py b/lmlib/serve/lm_inference.py deleted file mode 100644 index bc3bf17d4..000000000 --- a/lmlib/serve/lm_inference.py +++ /dev/null @@ -1,325 +0,0 @@ -"""Inference for FastChat models.""" - -import abc -import os -import os.path as osp -from typing import Any, Dict, Optional, Union - -import torch -from logzero import logger -from peft import PeftModel, set_peft_model_state_dict -from transformers import LlamaTokenizer # type: ignore[attr-defined] - -from lmlib.utils.conversation import ( - SeparatorStyle, - compute_skip_echo_len, - conv_templates, - get_default_conv_template, -) -from lmlib.utils.data_utils import load_json - -# try: -# from transformers import ( -# AutoModel, -# AutoModelForCausalLM, -# AutoModelForSeq2SeqLM, -# LlamaForCausalLM, -# LlamaTokenizer, -# ) -# except ImportError: -# from transformers import ( -# AutoModelForCausalLM, -# LLaMATokenizer, -# LLamaForCausalLM, -# AutoModel, -# AutoModelForSeq2SeqLM, -# ) - - -# from lmlib.serve.compression import compress_module -# from lmlib.serve.monkey_patch_non_inplace import ( -# replace_llama_attn_with_non_inplace_operations, -# ) -# from lmlib.serve.serve_chatglm import chatglm_generate_stream - - -def get_gpu_memory(max_gpus: Union[int, None] = None) -> list[float]: - gpu_memory = [] - num_gpus = ( - torch.cuda.device_count() - if max_gpus is None - else min(max_gpus, torch.cuda.device_count()) - ) - - for gpu_id in range(num_gpus): - with torch.cuda.device(gpu_id): - device = torch.cuda.current_device() - gpu_properties = torch.cuda.get_device_properties(device) - total_memory = gpu_properties.total_memory / (1024**3) - allocated_memory = torch.cuda.memory_allocated() / (1024**3) - available_memory = total_memory - allocated_memory - gpu_memory.append(available_memory) - return gpu_memory - - -def load_gen_model( - gen_model_name: str, - cache_dir: str, - large_model: bool = False, - device: str = "cuda", - lora_path: Union[str, None] = None, - margs: Dict[str, Any] = {}, -) -> Any: - from lmlib.model_tools import ( - load_and_cache_large_model, - load_and_cache_model, - ) - - if large_model: - gen_model = load_and_cache_large_model( - gen_model_name, cache_dir=cache_dir, device=device - ) - else: - # margs = {"revision": "float16", "torch_dtype": torch.float16, "low_cpu_mem_usage": True} - gen_model = load_and_cache_model( - gen_model_name, cache_dir=cache_dir, margs=margs - ) - gen_model = gen_model.to(device) - if lora_path is not None: - logger.info(f"load lora from {lora_path}") - from argparse import Namespace - - from peft import get_peft_model - from transformers.trainer_utils import get_last_checkpoint - - lora_config_json = load_json(osp.join(lora_path, "adapter_config.json")) - lora_config = Namespace(**lora_config_json) - gen_model = get_peft_model(gen_model, lora_config) - - ckpt_path = get_last_checkpoint(lora_path) - if ckpt_path is None: - gen_model = PeftModel.from_pretrained( - gen_model, - lora_path, - torch_dtype=torch.float16, - ) - else: - checkpoint_name = os.path.join(ckpt_path, "pytorch_model.bin") - adapter_weigths = torch.load(checkpoint_name) - set_peft_model_state_dict(gen_model, adapter_weigths) - - gen_tokenizer = LlamaTokenizer.from_pretrained(gen_model_name, cache_dir=cache_dir) - # use the vicuna version of special tokens - gen_tokenizer.add_special_tokens( - { - "bos_token": "", - "eos_token": "", - "unk_token": "", - "pad_token": "", - } - ) - return gen_model, gen_tokenizer - - -@torch.inference_mode() -def generate_stream( - model: Any, - tokenizer: Any, - params: Any, - device: str, - context_len: int = 2048, - stream_interval: int = 2, -) -> Any: - prompt = params["prompt"] - l_prompt = len(prompt) - temperature = float(params.get("temperature", 1.0)) - max_new_tokens = int(params.get("max_new_tokens", 256)) - stop_str = params.get("stop", None) - stop_token_ids = params.get("stop_ids", [tokenizer.eos_token_id]) - - input_ids = tokenizer(prompt).input_ids - output_ids = list(input_ids) - - max_src_len = context_len - max_new_tokens - 8 - input_ids = input_ids[-max_src_len:] - token = 0 - - for i in range(max_new_tokens): - if i == 0: - if model.config.is_encoder_decoder: - encoder_outputs = model.encoder( - input_ids=torch.as_tensor([input_ids], device=device) - ) - out = model( - torch.as_tensor([input_ids], device=device), - decoder_input_ids=torch.as_tensor( - [[model.generation_config.decoder_start_token_id]], - device=device, - ), - encoder_outputs=encoder_outputs, - use_cache=True, - ) - logits = out.logits - past_key_values = out.past_key_values - else: - out = model(torch.as_tensor([input_ids], device=device), use_cache=True) - logits = out.logits - past_key_values = out.past_key_values - else: - if model.config.is_encoder_decoder: - out = model( - input_ids=torch.as_tensor([input_ids], device=device), - use_cache=True, - encoder_outputs=encoder_outputs, - decoder_input_ids=torch.as_tensor([[token]], device=device), - past_key_values=past_key_values, - ) - logits = out.logits - past_key_values = out.past_key_values - else: - out = model( - input_ids=torch.as_tensor([[token]], device=device), - use_cache=True, - past_key_values=past_key_values, - ) - logits = out.logits - past_key_values = out.past_key_values - - last_token_logits = logits[0][-1] - - if device == "mps": - # Switch to CPU by avoiding some bugs in mps backend. - last_token_logits = last_token_logits.float().to("cpu") - - if temperature < 1e-4: - token = int(torch.argmax(last_token_logits)) - else: - probs = torch.softmax(last_token_logits / temperature, dim=-1) - token = int(torch.multinomial(probs, num_samples=1)) - - output_ids.append(token) - - if token in stop_token_ids: - stopped = True - else: - stopped = False - - if i % stream_interval == 0 or i == max_new_tokens - 1 or stopped: - output = tokenizer.decode(output_ids, skip_special_tokens=True) - if stop_str: - pos = output.rfind(stop_str, l_prompt) - if pos != -1: - output = output[:pos] - stopped = True - yield output - - if stopped: - break - - del past_key_values - - -class ChatIO(abc.ABC): - @abc.abstractmethod - def prompt_for_input(self, role: str) -> str: - """Prompt for input from a role.""" - - @abc.abstractmethod - def prompt_for_output(self, role: str) -> None: - """Prompt for output from a role.""" - - @abc.abstractmethod - def stream_output(self, output_stream: Any, skip_echo_len: int) -> str: - """Stream output.""" - - -def chat_loop( - args: Any, - model_path: str, - cache_dir: str, - device: str, - num_gpus: str, - max_gpu_memory: str, - load_8bit: bool, - conv_template: Optional[str], - temperature: float, - max_new_tokens: int, - chatio: ChatIO, - debug: bool, -) -> None: - # Model - int8 = args.load_8bit - lora_path = args.lora_weight_path - model, tokenizer = load_gen_model( - model_path, - cache_dir, - large_model=int8, - device="cuda:0", - lora_path=lora_path, - ) - - # Chat - if conv_template: - conv = conv_templates[conv_template].copy() - else: - conv = get_default_conv_template("vicuna_character").copy() - - # import pdb; pdb.set_trace() - def chat() -> None: - while True: - try: - inp = chatio.prompt_for_input(conv.roles[0]) - except EOFError: - inp = "" - if not inp: - print("exit...") - break - # import pdb; pdb.set_trace() - conv.append_message(conv.roles[0], inp) - conv.append_message(conv.roles[1], "") - - # if is_chatglm: - # prompt = conv.messages[conv.offset :] - # generate_stream_func = chatglm_generate_stream - # else: - generate_stream_func = generate_stream - prompt = conv.get_prompt() - - skip_echo_len = compute_skip_echo_len(conv, prompt) - stop_str = ( - conv.sep - if conv.sep_style in [SeparatorStyle.SINGLE, SeparatorStyle.BAIZE] - else None - ) - - params = { - "model": model_path, - "prompt": prompt, - "temperature": temperature, - "max_new_tokens": max_new_tokens, - "stop": stop_str, - } - - chatio.prompt_for_output(conv.roles[1]) - output_stream = generate_stream_func(model, tokenizer, params, device) - outputs = chatio.stream_output(output_stream, skip_echo_len) - # NOTE: strip is important to align with the training data. - conv.messages[-1][-1] = outputs.strip() - - if debug: - print("\n", {"prompt": prompt, "outputs": outputs}, "\n") - - while True: - try: - conv = get_default_conv_template("vicuna_character").copy() - chat() - except KeyboardInterrupt: - print("restart") - import pdb - - pdb.set_trace() - # x = input("input state") - # if x == "exit": - # break - # else: - # continue diff --git a/lmlib/utils/__init__.py b/lmlib/utils/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/lmlib/utils/conversation.py b/lmlib/utils/conversation.py deleted file mode 100644 index c78a85f76..000000000 --- a/lmlib/utils/conversation.py +++ /dev/null @@ -1,197 +0,0 @@ -""" -Conversation prompt template. -""" - -import dataclasses -from enum import Enum, auto -from typing import Any, List - - -class SeparatorStyle(Enum): - """Different separator style.""" - - SINGLE = auto() - TWO = auto() - DOLLY = auto() - OASST_PYTHIA = auto() - BAIZE = auto() - - -@dataclasses.dataclass -class Conversation: - """A class that keeps all conversation history.""" - - system: str - roles: list[str] - messages: List[List[str]] - offset: int - sep_style: SeparatorStyle = SeparatorStyle.SINGLE - sep: str = "###" - sep2: str | None = None - - # Used for the state in the gradio servers. - # TODO(lmzheng): refactor this - conv_id: Any = None - skip_next: bool = False - model_name: str | None = None - - def get_prompt(self) -> str: - if self.sep_style == SeparatorStyle.SINGLE: - ret = self.system - for role, message in self.messages: - if message: - ret += self.sep + " " + role + ": " + message - else: - ret += self.sep + " " + role + ":" - return ret - elif self.sep_style == SeparatorStyle.TWO: - assert ( - self.sep2 is not None - ), "sep2 should not be None when using TWO style." - seps = (self.sep, self.sep2) - ret = self.system + seps[0] - for i, (role, message) in enumerate(self.messages): - if message: - ret += role + ": " + message.strip() + seps[i % 2] - else: - ret += role + ":" - return ret - elif self.sep_style == SeparatorStyle.DOLLY: - assert ( - self.sep2 is not None - ), "sep2 should not be None when using DOLLY style." - seps = (self.sep, self.sep2) - ret = self.system - for i, (role, message) in enumerate(self.messages): - if message: - ret += role + ":\n" + message + seps[i % 2] - if i % 2 == 1: - ret += "\n\n" - else: - ret += role + ":\n" - return ret - elif self.sep_style == SeparatorStyle.OASST_PYTHIA: - ret = self.system - for role, message in self.messages: - if message: - ret += role + message + self.sep - else: - ret += role - return ret - elif self.sep_style == SeparatorStyle.BAIZE: - ret = self.system - for role, message in self.messages: - if message: - ret += "\n" + role + message - else: - ret += "\n" + role - return ret - else: - raise ValueError(f"Invalid style: {self.sep_style}") - - def append_message(self, role: str, message: str) -> None: - self.messages.append([role, message]) - - def to_gradio_chatbot(self) -> list[list[str | None]]: - ret = [] - for i, (role, msg) in enumerate(self.messages[self.offset :]): - if i % 2 == 0: - ret.append([msg, None]) - else: - ret[-1][-1] = msg - return ret - - def copy(self) -> "Conversation": - return Conversation( - system=self.system, - roles=self.roles, - messages=[[x, y] for x, y in self.messages], - offset=self.offset, - sep_style=self.sep_style, - sep=self.sep, - sep2=self.sep2, - conv_id=self.conv_id, - model_name=self.model_name, - ) - - def dict(self) -> dict[str, Any]: - return { - "system": self.system, - "roles": self.roles, - "messages": self.messages, - "offset": self.offset, - "sep": self.sep, - "sep2": self.sep2, - "conv_id": self.conv_id, - "model_name": self.model_name, - } - - -conv_vicuna_v1_1 = Conversation( - system="A chat between a curious user and an artificial intelligence assistant. " - "The assistant gives helpful, detailed, and polite answers to the user's questions.", - roles=["USER", "ASSISTANT"], - messages=[], - offset=0, - sep_style=SeparatorStyle.TWO, - sep=" ", - sep2="", -) - -conv_emily = Conversation( - system="My name is Emily Harrison and I am a 32-year-old woman. I am very compassionate and values caring for other people. I would like to answer any questions about myself.", - roles=["INTERVIEWER", "ME"], - messages=[], - offset=0, - sep_style=SeparatorStyle.TWO, - sep=" ", - sep2="", -) - -conv_sasha = Conversation( - system="My name is Sasha Ramirez and I am a 42-year-old female police officer. My decision-making style is logical, and my primary values are authority and loyalty. I would like to answer any questions about myself.", - roles=["INTERVIEWER", "ME"], - messages=[], - offset=0, - sep_style=SeparatorStyle.TWO, - sep=" ", - sep2="", -) - -conv_eli = Conversation( - system="My name is Eli Dawson, and I'm a 52-year-old forensic psychiatrist. I would like to answer any questions about myself.", - roles=["INTERVIEWER", "ME"], - messages=[], - offset=0, - sep_style=SeparatorStyle.TWO, - sep=" ", - sep2="", -) - -conv_templates = { - "vicuna_v1_1": conv_vicuna_v1_1, - "vicuna_emily": conv_emily, - "vicuna_sasha": conv_sasha, - "vicuna_eli": conv_eli, -} - - -def get_default_conv_template(model_name: str) -> Conversation: - return conv_vicuna_v1_1 - - -def compute_skip_echo_len( - conv: Conversation, prompt: str, is_chatglm: bool = False -) -> int: - if is_chatglm: - assert len(conv.messages) >= 2 - assert conv.messages[-2][1] is not None - skip_echo_len = len(conv.messages[-2][1]) + 1 - else: - skip_echo_len = len(prompt) + 1 - prompt.count("") * 3 - return skip_echo_len - - -if __name__ == "__main__": - default_conversation = conv_templates["vicuna_v1.1"] - print(default_conversation.get_prompt()) diff --git a/lmlib/utils/data_utils.py b/lmlib/utils/data_utils.py deleted file mode 100644 index f5d741364..000000000 --- a/lmlib/utils/data_utils.py +++ /dev/null @@ -1,61 +0,0 @@ -import json -import os -import random -from typing import Any, Dict, List - -import numpy as np -import torch - - -# IO -def load_data(text_path: str | os.PathLike[str], encoding: str = "utf-8") -> list[str]: - """ - load textual data from file - """ - with open(text_path, encoding=encoding) as fp: - texts = fp.readlines() - return [t.strip() for t in texts] - - -def save_data(filename: str, data: str) -> None: - """ - write textual data to file - """ - with open(filename, "w") as fout: - for d in data: - fout.write(str(d) + "\n") - fout.close() - - -def save_jsonl(path: str, entries: List[Dict[str, Any]]) -> None: - with open(path, "w", encoding="utf8") as fh: - for entry in entries: - fh.write(f"{json.dumps(entry)}\n") - - -def load_jsonl(path: str) -> List[Dict[str, Any]]: - pairs = [] - with open(path, "r", encoding="utf8") as fh: - for line in fh: - pairs.append(json.loads(line)) - return pairs - - -def load_json(path: str) -> dict[str, Any]: - with open(path, "r", encoding="utf8") as fh: - content: dict[str, Any] = json.load(fh) - return content - - -def save_json(path: str, content: Any) -> None: - with open(path, "w", encoding="utf8") as fh: - json.dump(content, fh, indent=4) - - -def set_seed(seed: int) -> None: - """Set RNG seeds for python's `random` module, numpy and torch""" - random.seed(seed) - np.random.seed(seed) - torch.manual_seed(seed) - if torch.cuda.is_available(): - torch.cuda.manual_seed_all(seed) diff --git a/poetry.lock b/poetry.lock index 33e0f0272..3fb7d9cc2 100644 --- a/poetry.lock +++ b/poetry.lock @@ -98,6 +98,7 @@ files = [ [package.dependencies] aiosignal = ">=1.1.2" +async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""} attrs = ">=17.3.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" @@ -120,25 +121,52 @@ files = [ [package.dependencies] frozenlist = ">=1.1.0" +[[package]] +name = "anthropic" +version = "0.26.1" +description = "The official Python library for the anthropic API" +optional = true +python-versions = ">=3.7" +files = [ + {file = "anthropic-0.26.1-py3-none-any.whl", hash = "sha256:2812b9b250b551ed8a1f0a7e6ae3f005654098994f45ebca5b5808bd154c9628"}, + {file = "anthropic-0.26.1.tar.gz", hash = "sha256:26680ff781a6f678a30a1dccd0743631e602b23a47719439ffdef5335fa167d8"}, +] + +[package.dependencies] +anyio = ">=3.5.0,<5" +distro = ">=1.7.0,<2" +httpx = ">=0.23.0,<1" +jiter = ">=0.1.0,<1" +pydantic = ">=1.9.0,<3" +sniffio = "*" +tokenizers = ">=0.13.0" +typing-extensions = ">=4.7,<5" + +[package.extras] +bedrock = ["boto3 (>=1.28.57)", "botocore (>=1.31.57)"] +vertex = ["google-auth (>=2,<3)"] + [[package]] name = "anyio" -version = "3.7.1" +version = "4.3.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "anyio-3.7.1-py3-none-any.whl", hash = "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5"}, - {file = "anyio-3.7.1.tar.gz", hash = "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780"}, + {file = "anyio-4.3.0-py3-none-any.whl", hash = "sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8"}, + {file = "anyio-4.3.0.tar.gz", hash = "sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6"}, ] [package.dependencies] +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} idna = ">=2.8" sniffio = ">=1.1" +typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} [package.extras] -doc = ["Sphinx", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme (>=1.2.2)", "sphinxcontrib-jquery"] -test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (<0.22)"] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (>=0.23)"] [[package]] name = "appnope" @@ -217,6 +245,58 @@ doc-rtd = ["autoapi (>=0.9.0)", "pydata-sphinx-theme (<=0.7.2)", "sphinx (>=4.2. test-tox = ["mypy (>=0.800)", "numpy", "pandera", "pytest (>=4.0.0)", "sphinx", "typing-extensions (>=3.10.0.0)"] test-tox-coverage = ["coverage (>=5.5)"] +[[package]] +name = "boto3" +version = "1.34.113" +description = "The AWS SDK for Python" +optional = true +python-versions = ">=3.8" +files = [ + {file = "boto3-1.34.113-py3-none-any.whl", hash = "sha256:7e59f0a848be477a4c98a90e7a18a0e284adfb643f7879d2b303c5f493661b7a"}, + {file = "boto3-1.34.113.tar.gz", hash = "sha256:009cd143509f2ff4c37582c3f45d50f28c95eed68e8a5c36641206bdb597a9ea"}, +] + +[package.dependencies] +botocore = ">=1.34.113,<1.35.0" +jmespath = ">=0.7.1,<2.0.0" +s3transfer = ">=0.10.0,<0.11.0" + +[package.extras] +crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] + +[[package]] +name = "botocore" +version = "1.34.113" +description = "Low-level, data-driven core of boto 3." +optional = true +python-versions = ">=3.8" +files = [ + {file = "botocore-1.34.113-py3-none-any.whl", hash = "sha256:8ca87776450ef41dd25c327eb6e504294230a5756940d68bcfdedc4a7cdeca97"}, + {file = "botocore-1.34.113.tar.gz", hash = "sha256:449912ba3c4ded64f21d09d428146dd9c05337b2a112e15511bf2c4888faae79"}, +] + +[package.dependencies] +jmespath = ">=0.7.1,<2.0.0" +python-dateutil = ">=2.1,<3.0.0" +urllib3 = [ + {version = ">=1.25.4,<1.27", markers = "python_version < \"3.10\""}, + {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""}, +] + +[package.extras] +crt = ["awscrt (==0.20.9)"] + +[[package]] +name = "cachetools" +version = "5.3.3" +description = "Extensible memoizing collections and decorators" +optional = true +python-versions = ">=3.7" +files = [ + {file = "cachetools-5.3.3-py3-none-any.whl", hash = "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945"}, + {file = "cachetools-5.3.3.tar.gz", hash = "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105"}, +] + [[package]] name = "certifi" version = "2024.2.2" @@ -427,6 +507,28 @@ files = [ {file = "cloudpickle-3.0.0.tar.gz", hash = "sha256:996d9a482c6fb4f33c1a35335cf8afd065d2a56e973270364840712d9131a882"}, ] +[[package]] +name = "cohere" +version = "5.5.3" +description = "" +optional = true +python-versions = "<4.0,>=3.8" +files = [ + {file = "cohere-5.5.3-py3-none-any.whl", hash = "sha256:99d20129713a6dae052368b4839773a214592a76bee345b94a4846d00f702da3"}, + {file = "cohere-5.5.3.tar.gz", hash = "sha256:8c7ebe2f5bf83fee8e55a24a0acdd4b0e94de274fd0ef32b285978289a03e930"}, +] + +[package.dependencies] +boto3 = ">=1.34.0,<2.0.0" +fastavro = ">=1.9.4,<2.0.0" +httpx = ">=0.21.2" +httpx-sse = ">=0.4.0,<0.5.0" +pydantic = ">=1.9.2" +requests = ">=2.0.0,<3.0.0" +tokenizers = ">=0.19,<0.20" +types-requests = ">=2.0.0,<3.0.0" +typing_extensions = ">=4.0.0" + [[package]] name = "colorama" version = "0.4.6" @@ -457,43 +559,43 @@ test = ["pytest"] [[package]] name = "cryptography" -version = "42.0.6" +version = "42.0.7" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-42.0.6-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:073104df012fc815eed976cd7d0a386c8725d0d0947cf9c37f6c36a6c20feb1b"}, - {file = "cryptography-42.0.6-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:5967e3632f42b0c0f9dc2c9da88c79eabdda317860b246d1fbbde4a8bbbc3b44"}, - {file = "cryptography-42.0.6-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b99831397fdc6e6e0aa088b060c278c6e635d25c0d4d14bdf045bf81792fda0a"}, - {file = "cryptography-42.0.6-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:089aeb297ff89615934b22c7631448598495ffd775b7d540a55cfee35a677bf4"}, - {file = "cryptography-42.0.6-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:97eeacae9aa526ddafe68b9202a535f581e21d78f16688a84c8dcc063618e121"}, - {file = "cryptography-42.0.6-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f4cece02478d73dacd52be57a521d168af64ae03d2a567c0c4eb6f189c3b9d79"}, - {file = "cryptography-42.0.6-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:aeb6f56b004e898df5530fa873e598ec78eb338ba35f6fa1449970800b1d97c2"}, - {file = "cryptography-42.0.6-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:8b90c57b3cd6128e0863b894ce77bd36fcb5f430bf2377bc3678c2f56e232316"}, - {file = "cryptography-42.0.6-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d16a310c770cc49908c500c2ceb011f2840674101a587d39fa3ea828915b7e83"}, - {file = "cryptography-42.0.6-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e3442601d276bd9e961d618b799761b4e5d892f938e8a4fe1efbe2752be90455"}, - {file = "cryptography-42.0.6-cp37-abi3-win32.whl", hash = "sha256:00c0faa5b021457848d031ecff041262211cc1e2bce5f6e6e6c8108018f6b44a"}, - {file = "cryptography-42.0.6-cp37-abi3-win_amd64.whl", hash = "sha256:b16b90605c62bcb3aa7755d62cf5e746828cfc3f965a65211849e00c46f8348d"}, - {file = "cryptography-42.0.6-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:eecca86813c6a923cabff284b82ff4d73d9e91241dc176250192c3a9b9902a54"}, - {file = "cryptography-42.0.6-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d93080d2b01b292e7ee4d247bf93ed802b0100f5baa3fa5fd6d374716fa480d4"}, - {file = "cryptography-42.0.6-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ff75b88a4d273c06d968ad535e6cb6a039dd32db54fe36f05ed62ac3ef64a44"}, - {file = "cryptography-42.0.6-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:c05230d8aaaa6b8ab3ab41394dc06eb3d916131df1c9dcb4c94e8f041f704b74"}, - {file = "cryptography-42.0.6-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9184aff0856261ecb566a3eb26a05dfe13a292c85ce5c59b04e4aa09e5814187"}, - {file = "cryptography-42.0.6-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:4bdb39ecbf05626e4bfa1efd773bb10346af297af14fb3f4c7cb91a1d2f34a46"}, - {file = "cryptography-42.0.6-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:e85f433230add2aa26b66d018e21134000067d210c9c68ef7544ba65fc52e3eb"}, - {file = "cryptography-42.0.6-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:65d529c31bd65d54ce6b926a01e1b66eacf770b7e87c0622516a840e400ec732"}, - {file = "cryptography-42.0.6-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f1e933b238978ccfa77b1fee0a297b3c04983f4cb84ae1c33b0ea4ae08266cc9"}, - {file = "cryptography-42.0.6-cp39-abi3-win32.whl", hash = "sha256:bc954251edcd8a952eeaec8ae989fec7fe48109ab343138d537b7ea5bb41071a"}, - {file = "cryptography-42.0.6-cp39-abi3-win_amd64.whl", hash = "sha256:9f1a3bc2747166b0643b00e0b56cd9b661afc9d5ff963acaac7a9c7b2b1ef638"}, - {file = "cryptography-42.0.6-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:945a43ebf036dd4b43ebfbbd6b0f2db29ad3d39df824fb77476ca5777a9dde33"}, - {file = "cryptography-42.0.6-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:f567a82b7c2b99257cca2a1c902c1b129787278ff67148f188784245c7ed5495"}, - {file = "cryptography-42.0.6-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3b750279f3e7715df6f68050707a0cee7cbe81ba2eeb2f21d081bd205885ffed"}, - {file = "cryptography-42.0.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:6981acac509cc9415344cb5bfea8130096ea6ebcc917e75503143a1e9e829160"}, - {file = "cryptography-42.0.6-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:076c92b08dd1ab88108bc84545187e10d3693a9299c593f98c4ea195a0b0ead7"}, - {file = "cryptography-42.0.6-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:81dbe47e28b703bc4711ac74a64ef8b758a0cf056ce81d08e39116ab4bc126fa"}, - {file = "cryptography-42.0.6-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e1f5f15c5ddadf6ee4d1d624a2ae940f14bd74536230b0056ccb28bb6248e42a"}, - {file = "cryptography-42.0.6-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:43e521f21c2458038d72e8cdfd4d4d9f1d00906a7b6636c4272e35f650d1699b"}, - {file = "cryptography-42.0.6.tar.gz", hash = "sha256:f987a244dfb0333fbd74a691c36000a2569eaf7c7cc2ac838f85f59f0588ddc9"}, + {file = "cryptography-42.0.7-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:a987f840718078212fdf4504d0fd4c6effe34a7e4740378e59d47696e8dfb477"}, + {file = "cryptography-42.0.7-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bd13b5e9b543532453de08bcdc3cc7cebec6f9883e886fd20a92f26940fd3e7a"}, + {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a79165431551042cc9d1d90e6145d5d0d3ab0f2d66326c201d9b0e7f5bf43604"}, + {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a47787a5e3649008a1102d3df55424e86606c9bae6fb77ac59afe06d234605f8"}, + {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:02c0eee2d7133bdbbc5e24441258d5d2244beb31da5ed19fbb80315f4bbbff55"}, + {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5e44507bf8d14b36b8389b226665d597bc0f18ea035d75b4e53c7b1ea84583cc"}, + {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:7f8b25fa616d8b846aef64b15c606bb0828dbc35faf90566eb139aa9cff67af2"}, + {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:93a3209f6bb2b33e725ed08ee0991b92976dfdcf4e8b38646540674fc7508e13"}, + {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e6b8f1881dac458c34778d0a424ae5769de30544fc678eac51c1c8bb2183e9da"}, + {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3de9a45d3b2b7d8088c3fbf1ed4395dfeff79d07842217b38df14ef09ce1d8d7"}, + {file = "cryptography-42.0.7-cp37-abi3-win32.whl", hash = "sha256:789caea816c6704f63f6241a519bfa347f72fbd67ba28d04636b7c6b7da94b0b"}, + {file = "cryptography-42.0.7-cp37-abi3-win_amd64.whl", hash = "sha256:8cb8ce7c3347fcf9446f201dc30e2d5a3c898d009126010cbd1f443f28b52678"}, + {file = "cryptography-42.0.7-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:a3a5ac8b56fe37f3125e5b72b61dcde43283e5370827f5233893d461b7360cd4"}, + {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:779245e13b9a6638df14641d029add5dc17edbef6ec915688f3acb9e720a5858"}, + {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d563795db98b4cd57742a78a288cdbdc9daedac29f2239793071fe114f13785"}, + {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:31adb7d06fe4383226c3e963471f6837742889b3c4caa55aac20ad951bc8ffda"}, + {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:efd0bf5205240182e0f13bcaea41be4fdf5c22c5129fc7ced4a0282ac86998c9"}, + {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a9bc127cdc4ecf87a5ea22a2556cab6c7eda2923f84e4f3cc588e8470ce4e42e"}, + {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:3577d029bc3f4827dd5bf8bf7710cac13527b470bbf1820a3f394adb38ed7d5f"}, + {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2e47577f9b18723fa294b0ea9a17d5e53a227867a0a4904a1a076d1646d45ca1"}, + {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1a58839984d9cb34c855197043eaae2c187d930ca6d644612843b4fe8513c886"}, + {file = "cryptography-42.0.7-cp39-abi3-win32.whl", hash = "sha256:e6b79d0adb01aae87e8a44c2b64bc3f3fe59515280e00fb6d57a7267a2583cda"}, + {file = "cryptography-42.0.7-cp39-abi3-win_amd64.whl", hash = "sha256:16268d46086bb8ad5bf0a2b5544d8a9ed87a0e33f5e77dd3c3301e63d941a83b"}, + {file = "cryptography-42.0.7-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2954fccea107026512b15afb4aa664a5640cd0af630e2ee3962f2602693f0c82"}, + {file = "cryptography-42.0.7-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:362e7197754c231797ec45ee081f3088a27a47c6c01eff2ac83f60f85a50fe60"}, + {file = "cryptography-42.0.7-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4f698edacf9c9e0371112792558d2f705b5645076cc0aaae02f816a0171770fd"}, + {file = "cryptography-42.0.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5482e789294854c28237bba77c4c83be698be740e31a3ae5e879ee5444166582"}, + {file = "cryptography-42.0.7-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e9b2a6309f14c0497f348d08a065d52f3020656f675819fc405fb63bbcd26562"}, + {file = "cryptography-42.0.7-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d8e3098721b84392ee45af2dd554c947c32cc52f862b6a3ae982dbb90f577f14"}, + {file = "cryptography-42.0.7-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c65f96dad14f8528a447414125e1fc8feb2ad5a272b8f68477abbcc1ea7d94b9"}, + {file = "cryptography-42.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36017400817987670037fbb0324d71489b6ead6231c9604f8fc1f7d008087c68"}, + {file = "cryptography-42.0.7.tar.gz", hash = "sha256:ecbfbc00bf55888edda9868a4cf927205de8499e7fabe6c050322298382953f2"}, ] [package.dependencies] @@ -511,13 +613,13 @@ test-randomorder = ["pytest-randomly"] [[package]] name = "dataclasses-json" -version = "0.6.5" +version = "0.6.6" description = "Easily serialize dataclasses to and from JSON." optional = false python-versions = "<4.0,>=3.7" files = [ - {file = "dataclasses_json-0.6.5-py3-none-any.whl", hash = "sha256:f49c77aa3a85cac5bf5b7f65f4790ca0d2be8ef4d92c75e91ba0103072788a39"}, - {file = "dataclasses_json-0.6.5.tar.gz", hash = "sha256:1c287594d9fcea72dc42d6d3836cf14848c2dc5ce88f65ed61b36b57f515fe26"}, + {file = "dataclasses_json-0.6.6-py3-none-any.whl", hash = "sha256:e54c5c87497741ad454070ba0ed411523d46beb5da102e221efb873801b0ba85"}, + {file = "dataclasses_json-0.6.6.tar.gz", hash = "sha256:0c09827d26fffda27f1be2fed7a7a01a29c5ddcd2eb6393ad5ebf9d77e9deae8"}, ] [package.dependencies] @@ -526,13 +628,13 @@ typing-inspect = ">=0.4.0,<1" [[package]] name = "datasets" -version = "2.19.0" +version = "2.19.1" description = "HuggingFace community-driven open-source library of datasets" -optional = false +optional = true python-versions = ">=3.8.0" files = [ - {file = "datasets-2.19.0-py3-none-any.whl", hash = "sha256:f57c5316e123d4721b970c68c1cb856505f289cda58f5557ffe745b49c011a8e"}, - {file = "datasets-2.19.0.tar.gz", hash = "sha256:0b47e08cc7af2c6800a42cadc4657b22a0afc7197786c8986d703c08d90886a6"}, + {file = "datasets-2.19.1-py3-none-any.whl", hash = "sha256:f7a78d15896f45004ccac1c298f3c7121f92f91f6f2bfbd4e4f210f827e6e411"}, + {file = "datasets-2.19.1.tar.gz", hash = "sha256:0df9ef6c5e9138cdb996a07385220109ff203c204245578b69cca905eb151d3a"}, ] [package.dependencies] @@ -614,7 +716,7 @@ files = [ name = "dill" version = "0.3.8" description = "serialize all of Python" -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, @@ -647,6 +749,20 @@ files = [ {file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"}, ] +[[package]] +name = "exceptiongroup" +version = "1.2.1" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, + {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, +] + +[package.extras] +test = ["pytest (>=6)"] + [[package]] name = "executing" version = "2.0.1" @@ -674,23 +790,68 @@ files = [ [[package]] name = "fastapi" -version = "0.103.2" +version = "0.109.2" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" -optional = false -python-versions = ">=3.7" +optional = true +python-versions = ">=3.8" files = [ - {file = "fastapi-0.103.2-py3-none-any.whl", hash = "sha256:3270de872f0fe9ec809d4bd3d4d890c6d5cc7b9611d721d6438f9dacc8c4ef2e"}, - {file = "fastapi-0.103.2.tar.gz", hash = "sha256:75a11f6bfb8fc4d2bec0bd710c2d5f2829659c0e8c0afd5560fdda6ce25ec653"}, + {file = "fastapi-0.109.2-py3-none-any.whl", hash = "sha256:2c9bab24667293b501cad8dd388c05240c850b58ec5876ee3283c47d6e1e3a4d"}, + {file = "fastapi-0.109.2.tar.gz", hash = "sha256:f3817eac96fe4f65a2ebb4baa000f394e55f5fccdaf7f75250804bc58f354f73"}, ] [package.dependencies] -anyio = ">=3.7.1,<4.0.0" pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" -starlette = ">=0.27.0,<0.28.0" -typing-extensions = ">=4.5.0" +starlette = ">=0.36.3,<0.37.0" +typing-extensions = ">=4.8.0" [package.extras] -all = ["email-validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] +all = ["email-validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.7)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] + +[[package]] +name = "fastavro" +version = "1.9.4" +description = "Fast read/write of AVRO files" +optional = true +python-versions = ">=3.8" +files = [ + {file = "fastavro-1.9.4-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:60cb38f07462a7fb4e4440ed0de67d3d400ae6b3d780f81327bebde9aa55faef"}, + {file = "fastavro-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:063d01d197fc929c20adc09ca9f0ca86d33ac25ee0963ce0b438244eee8315ae"}, + {file = "fastavro-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87a9053fcfbc895f2a16a4303af22077e3a8fdcf1cd5d6ed47ff2ef22cbba2f0"}, + {file = "fastavro-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:02bf1276b7326397314adf41b34a4890f6ffa59cf7e0eb20b9e4ab0a143a1598"}, + {file = "fastavro-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56bed9eca435389a8861e6e2d631ec7f8f5dda5b23f93517ac710665bd34ca29"}, + {file = "fastavro-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:0cd2099c8c672b853e0b20c13e9b62a69d3fbf67ee7c59c7271ba5df1680310d"}, + {file = "fastavro-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:af8c6d8c43a02b5569c093fc5467469541ac408c79c36a5b0900d3dd0b3ba838"}, + {file = "fastavro-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4a138710bd61580324d23bc5e3df01f0b82aee0a76404d5dddae73d9e4c723f"}, + {file = "fastavro-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:903d97418120ca6b6a7f38a731166c1ccc2c4344ee5e0470d09eb1dc3687540a"}, + {file = "fastavro-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c443eeb99899d062dbf78c525e4614dd77e041a7688fa2710c224f4033f193ae"}, + {file = "fastavro-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ac26ab0774d1b2b7af6d8f4300ad20bbc4b5469e658a02931ad13ce23635152f"}, + {file = "fastavro-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:cf7247874c22be856ba7d1f46a0f6e0379a6025f1a48a7da640444cbac6f570b"}, + {file = "fastavro-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:68912f2020e1b3d70557260b27dd85fb49a4fc6bfab18d384926127452c1da4c"}, + {file = "fastavro-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6925ce137cdd78e109abdb0bc33aad55de6c9f2d2d3036b65453128f2f5f5b92"}, + {file = "fastavro-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b928cd294e36e35516d0deb9e104b45be922ba06940794260a4e5dbed6c192a"}, + {file = "fastavro-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:90c9838bc4c991ffff5dd9d88a0cc0030f938b3fdf038cdf6babde144b920246"}, + {file = "fastavro-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:eca6e54da571b06a3c5a72dbb7212073f56c92a6fbfbf847b91c347510f8a426"}, + {file = "fastavro-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a4b02839ac261100cefca2e2ad04cdfedc556cb66b5ec735e0db428e74b399de"}, + {file = "fastavro-1.9.4-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:4451ee9a305a73313a1558d471299f3130e4ecc10a88bf5742aa03fb37e042e6"}, + {file = "fastavro-1.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a8524fccfb379565568c045d29b2ebf71e1f2c0dd484aeda9fe784ef5febe1a8"}, + {file = "fastavro-1.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33d0a00a6e09baa20f6f038d7a2ddcb7eef0e7a9980e947a018300cb047091b8"}, + {file = "fastavro-1.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:23d7e5b29c9bf6f26e8be754b2c8b919838e506f78ef724de7d22881696712fc"}, + {file = "fastavro-1.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2e6ab3ee53944326460edf1125b2ad5be2fadd80f7211b13c45fa0c503b4cf8d"}, + {file = "fastavro-1.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:64d335ec2004204c501f8697c385d0a8f6b521ac82d5b30696f789ff5bc85f3c"}, + {file = "fastavro-1.9.4-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:7e05f44c493e89e73833bd3ff3790538726906d2856f59adc8103539f4a1b232"}, + {file = "fastavro-1.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:253c63993250bff4ee7b11fb46cf3a4622180a783bedc82a24c6fdcd1b10ca2a"}, + {file = "fastavro-1.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24d6942eb1db14640c2581e0ecd1bbe0afc8a83731fcd3064ae7f429d7880cb7"}, + {file = "fastavro-1.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d47bb66be6091cd48cfe026adcad11c8b11d7d815a2949a1e4ccf03df981ca65"}, + {file = "fastavro-1.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c293897f12f910e58a1024f9c77f565aa8e23b36aafda6ad8e7041accc57a57f"}, + {file = "fastavro-1.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:f05d2afcb10a92e2a9e580a3891f090589b3e567fdc5641f8a46a0b084f120c3"}, + {file = "fastavro-1.9.4.tar.gz", hash = "sha256:56b8363e360a1256c94562393dc7f8611f3baf2b3159f64fb2b9c6b87b14e876"}, +] + +[package.extras] +codecs = ["cramjam", "lz4", "zstandard"] +lz4 = ["lz4"] +snappy = ["cramjam"] +zstandard = ["zstandard"] [[package]] name = "fastjsonschema" @@ -865,6 +1026,150 @@ testing = ["absl-py (>=0.1.6)", "mock (>=3.0.5)", "nose"] tf-nightly = ["tf-nightly"] torch = ["torch (>=1.3.0)"] +[[package]] +name = "google-ai-generativelanguage" +version = "0.6.4" +description = "Google Ai Generativelanguage API client library" +optional = true +python-versions = ">=3.7" +files = [ + {file = "google-ai-generativelanguage-0.6.4.tar.gz", hash = "sha256:1750848c12af96cb24ae1c3dd05e4bfe24867dc4577009ed03e1042d8421e874"}, + {file = "google_ai_generativelanguage-0.6.4-py3-none-any.whl", hash = "sha256:730e471aa549797118fb1c88421ba1957741433ada575cf5dd08d3aebf903ab1"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" + +[[package]] +name = "google-api-core" +version = "2.19.0" +description = "Google API client core library" +optional = true +python-versions = ">=3.7" +files = [ + {file = "google-api-core-2.19.0.tar.gz", hash = "sha256:cf1b7c2694047886d2af1128a03ae99e391108a08804f87cfd35970e49c9cd10"}, + {file = "google_api_core-2.19.0-py3-none-any.whl", hash = "sha256:8661eec4078c35428fd3f69a2c7ee29e342896b70f01d1a1cbcb334372dd6251"}, +] + +[package.dependencies] +google-auth = ">=2.14.1,<3.0.dev0" +googleapis-common-protos = ">=1.56.2,<2.0.dev0" +grpcio = [ + {version = ">=1.33.2,<2.0dev", optional = true, markers = "python_version < \"3.11\" and extra == \"grpc\""}, + {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, +] +grpcio-status = [ + {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "python_version < \"3.11\" and extra == \"grpc\""}, + {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, +] +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" +requests = ">=2.18.0,<3.0.0.dev0" + +[package.extras] +grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "grpcio-status (>=1.33.2,<2.0.dev0)", "grpcio-status (>=1.49.1,<2.0.dev0)"] +grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] +grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] + +[[package]] +name = "google-api-python-client" +version = "2.130.0" +description = "Google API Client Library for Python" +optional = true +python-versions = ">=3.7" +files = [ + {file = "google-api-python-client-2.130.0.tar.gz", hash = "sha256:2bba3122b82a649c677b8a694b8e2bbf2a5fbf3420265caf3343bb88e2e9f0ae"}, + {file = "google_api_python_client-2.130.0-py2.py3-none-any.whl", hash = "sha256:7d45a28d738628715944a9c9d73e8696e7e03ac50b7de87f5e3035cefa94ed3a"}, +] + +[package.dependencies] +google-api-core = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0.dev0" +google-auth = ">=1.32.0,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0.dev0" +google-auth-httplib2 = ">=0.2.0,<1.0.0" +httplib2 = ">=0.19.0,<1.dev0" +uritemplate = ">=3.0.1,<5" + +[[package]] +name = "google-auth" +version = "2.29.0" +description = "Google Authentication Library" +optional = true +python-versions = ">=3.7" +files = [ + {file = "google-auth-2.29.0.tar.gz", hash = "sha256:672dff332d073227550ffc7457868ac4218d6c500b155fe6cc17d2b13602c360"}, + {file = "google_auth-2.29.0-py2.py3-none-any.whl", hash = "sha256:d452ad095688cd52bae0ad6fafe027f6a6d6f560e810fec20914e17a09526415"}, +] + +[package.dependencies] +cachetools = ">=2.0.0,<6.0" +pyasn1-modules = ">=0.2.1" +rsa = ">=3.1.4,<5" + +[package.extras] +aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] +enterprise-cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] +pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] +reauth = ["pyu2f (>=0.1.5)"] +requests = ["requests (>=2.20.0,<3.0.0.dev0)"] + +[[package]] +name = "google-auth-httplib2" +version = "0.2.0" +description = "Google Authentication Library: httplib2 transport" +optional = true +python-versions = "*" +files = [ + {file = "google-auth-httplib2-0.2.0.tar.gz", hash = "sha256:38aa7badf48f974f1eb9861794e9c0cb2a0511a4ec0679b1f886d108f5640e05"}, + {file = "google_auth_httplib2-0.2.0-py2.py3-none-any.whl", hash = "sha256:b65a0a2123300dd71281a7bf6e64d65a0759287df52729bdd1ae2e47dc311a3d"}, +] + +[package.dependencies] +google-auth = "*" +httplib2 = ">=0.19.0" + +[[package]] +name = "google-generativeai" +version = "0.5.4" +description = "Google Generative AI High level API client library and tools." +optional = true +python-versions = ">=3.9" +files = [ + {file = "google_generativeai-0.5.4-py3-none-any.whl", hash = "sha256:036d63ee35e7c8aedceda4f81c390a5102808af09ff3a6e57e27ed0be0708f3c"}, +] + +[package.dependencies] +google-ai-generativelanguage = "0.6.4" +google-api-core = "*" +google-api-python-client = "*" +google-auth = ">=2.15.0" +protobuf = "*" +pydantic = "*" +tqdm = "*" +typing-extensions = "*" + +[package.extras] +dev = ["Pillow", "absl-py", "black", "ipython", "nose2", "pandas", "pytype", "pyyaml"] + +[[package]] +name = "googleapis-common-protos" +version = "1.63.0" +description = "Common protobufs used in Google APIs" +optional = true +python-versions = ">=3.7" +files = [ + {file = "googleapis-common-protos-1.63.0.tar.gz", hash = "sha256:17ad01b11d5f1d0171c06d3ba5c04c54474e883b66b949722b4938ee2694ef4e"}, + {file = "googleapis_common_protos-1.63.0-py2.py3-none-any.whl", hash = "sha256:ae45f75702f7c08b541f750854a678bd8f534a1a6bace6afe975f1d0a82d6632"}, +] + +[package.dependencies] +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" + +[package.extras] +grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] + [[package]] name = "greenlet" version = "3.0.3" @@ -936,6 +1241,99 @@ files = [ docs = ["Sphinx", "furo"] test = ["objgraph", "psutil"] +[[package]] +name = "groq" +version = "0.4.2" +description = "The official Python library for the groq API" +optional = true +python-versions = ">=3.7" +files = [ + {file = "groq-0.4.2-py3-none-any.whl", hash = "sha256:5b2b472c64d9f35210e0487db465415d47162da3a114031ecbfc8843d26302a5"}, + {file = "groq-0.4.2.tar.gz", hash = "sha256:42e8b0abd0f2b2da024b9a747d28960d62951a5364f078e1537c9fceeca8259d"}, +] + +[package.dependencies] +anyio = ">=3.5.0,<5" +distro = ">=1.7.0,<2" +httpx = ">=0.23.0,<1" +pydantic = ">=1.9.0,<3" +sniffio = "*" +typing-extensions = ">=4.7,<5" + +[[package]] +name = "grpcio" +version = "1.64.0" +description = "HTTP/2-based RPC framework" +optional = true +python-versions = ">=3.8" +files = [ + {file = "grpcio-1.64.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:3b09c3d9de95461214a11d82cc0e6a46a6f4e1f91834b50782f932895215e5db"}, + {file = "grpcio-1.64.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:7e013428ab472892830287dd082b7d129f4d8afef49227a28223a77337555eaa"}, + {file = "grpcio-1.64.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:02cc9cc3f816d30f7993d0d408043b4a7d6a02346d251694d8ab1f78cc723e7e"}, + {file = "grpcio-1.64.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f5de082d936e0208ce8db9095821361dfa97af8767a6607ae71425ac8ace15c"}, + {file = "grpcio-1.64.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7b7bf346391dffa182fba42506adf3a84f4a718a05e445b37824136047686a1"}, + {file = "grpcio-1.64.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b2cbdfba18408389a1371f8c2af1659119e1831e5ed24c240cae9e27b4abc38d"}, + {file = "grpcio-1.64.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:aca4f15427d2df592e0c8f3d38847e25135e4092d7f70f02452c0e90d6a02d6d"}, + {file = "grpcio-1.64.0-cp310-cp310-win32.whl", hash = "sha256:7c1f5b2298244472bcda49b599be04579f26425af0fd80d3f2eb5fd8bc84d106"}, + {file = "grpcio-1.64.0-cp310-cp310-win_amd64.whl", hash = "sha256:73f84f9e5985a532e47880b3924867de16fa1aa513fff9b26106220c253c70c5"}, + {file = "grpcio-1.64.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:2a18090371d138a57714ee9bffd6c9c9cb2e02ce42c681aac093ae1e7189ed21"}, + {file = "grpcio-1.64.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:59c68df3a934a586c3473d15956d23a618b8f05b5e7a3a904d40300e9c69cbf0"}, + {file = "grpcio-1.64.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:b52e1ec7185512103dd47d41cf34ea78e7a7361ba460187ddd2416b480e0938c"}, + {file = "grpcio-1.64.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8d598b5d5e2c9115d7fb7e2cb5508d14286af506a75950762aa1372d60e41851"}, + {file = "grpcio-1.64.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01615bbcae6875eee8091e6b9414072f4e4b00d8b7e141f89635bdae7cf784e5"}, + {file = "grpcio-1.64.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0b2dfe6dcace264807d9123d483d4c43274e3f8c39f90ff51de538245d7a4145"}, + {file = "grpcio-1.64.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7f17572dc9acd5e6dfd3014d10c0b533e9f79cd9517fc10b0225746f4c24b58e"}, + {file = "grpcio-1.64.0-cp311-cp311-win32.whl", hash = "sha256:6ec5ed15b4ffe56e2c6bc76af45e6b591c9be0224b3fb090adfb205c9012367d"}, + {file = "grpcio-1.64.0-cp311-cp311-win_amd64.whl", hash = "sha256:597191370951b477b7a1441e1aaa5cacebeb46a3b0bd240ec3bb2f28298c7553"}, + {file = "grpcio-1.64.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:1ce4cd5a61d4532651079e7aae0fedf9a80e613eed895d5b9743e66b52d15812"}, + {file = "grpcio-1.64.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:650a8150a9b288f40d5b7c1d5400cc11724eae50bd1f501a66e1ea949173649b"}, + {file = "grpcio-1.64.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:8de0399b983f8676a7ccfdd45e5b2caec74a7e3cc576c6b1eecf3b3680deda5e"}, + {file = "grpcio-1.64.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:46b8b43ba6a2a8f3103f103f97996cad507bcfd72359af6516363c48793d5a7b"}, + {file = "grpcio-1.64.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a54362f03d4dcfae63be455d0a7d4c1403673498b92c6bfe22157d935b57c7a9"}, + {file = "grpcio-1.64.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1f8ea18b928e539046bb5f9c124d717fbf00cc4b2d960ae0b8468562846f5aa1"}, + {file = "grpcio-1.64.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c56c91bd2923ddb6e7ed28ebb66d15633b03e0df22206f22dfcdde08047e0a48"}, + {file = "grpcio-1.64.0-cp312-cp312-win32.whl", hash = "sha256:874c741c8a66f0834f653a69e7e64b4e67fcd4a8d40296919b93bab2ccc780ba"}, + {file = "grpcio-1.64.0-cp312-cp312-win_amd64.whl", hash = "sha256:0da1d921f8e4bcee307aeef6c7095eb26e617c471f8cb1c454fd389c5c296d1e"}, + {file = "grpcio-1.64.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:c46fb6bfca17bfc49f011eb53416e61472fa96caa0979b4329176bdd38cbbf2a"}, + {file = "grpcio-1.64.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3d2004e85cf5213995d09408501f82c8534700d2babeb81dfdba2a3bff0bb396"}, + {file = "grpcio-1.64.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:6d5541eb460d73a07418524fb64dcfe0adfbcd32e2dac0f8f90ce5b9dd6c046c"}, + {file = "grpcio-1.64.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f279ad72dd7d64412e10f2443f9f34872a938c67387863c4cd2fb837f53e7d2"}, + {file = "grpcio-1.64.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85fda90b81da25993aa47fae66cae747b921f8f6777550895fb62375b776a231"}, + {file = "grpcio-1.64.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a053584079b793a54bece4a7d1d1b5c0645bdbee729215cd433703dc2532f72b"}, + {file = "grpcio-1.64.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:579dd9fb11bc73f0de061cab5f8b2def21480fd99eb3743ed041ad6a1913ee2f"}, + {file = "grpcio-1.64.0-cp38-cp38-win32.whl", hash = "sha256:23b6887bb21d77649d022fa1859e05853fdc2e60682fd86c3db652a555a282e0"}, + {file = "grpcio-1.64.0-cp38-cp38-win_amd64.whl", hash = "sha256:753cb58683ba0c545306f4e17dabf468d29cb6f6b11832e1e432160bb3f8403c"}, + {file = "grpcio-1.64.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:2186d76a7e383e1466e0ea2b0febc343ffeae13928c63c6ec6826533c2d69590"}, + {file = "grpcio-1.64.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0f30596cdcbed3c98024fb4f1d91745146385b3f9fd10c9f2270cbfe2ed7ed91"}, + {file = "grpcio-1.64.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:d9171f025a196f5bcfec7e8e7ffb7c3535f7d60aecd3503f9e250296c7cfc150"}, + {file = "grpcio-1.64.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf4c8daed18ae2be2f1fc7d613a76ee2a2e28fdf2412d5c128be23144d28283d"}, + {file = "grpcio-1.64.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3550493ac1d23198d46dc9c9b24b411cef613798dc31160c7138568ec26bc9b4"}, + {file = "grpcio-1.64.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:3161a8f8bb38077a6470508c1a7301cd54301c53b8a34bb83e3c9764874ecabd"}, + {file = "grpcio-1.64.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2e8fabe2cc57a369638ab1ad8e6043721014fdf9a13baa7c0e35995d3a4a7618"}, + {file = "grpcio-1.64.0-cp39-cp39-win32.whl", hash = "sha256:31890b24d47b62cc27da49a462efe3d02f3c120edb0e6c46dcc0025506acf004"}, + {file = "grpcio-1.64.0-cp39-cp39-win_amd64.whl", hash = "sha256:5a56797dea8c02e7d3a85dfea879f286175cf4d14fbd9ab3ef2477277b927baa"}, + {file = "grpcio-1.64.0.tar.gz", hash = "sha256:257baf07f53a571c215eebe9679c3058a313fd1d1f7c4eede5a8660108c52d9c"}, +] + +[package.extras] +protobuf = ["grpcio-tools (>=1.64.0)"] + +[[package]] +name = "grpcio-status" +version = "1.62.2" +description = "Status proto mapping for gRPC" +optional = true +python-versions = ">=3.6" +files = [ + {file = "grpcio-status-1.62.2.tar.gz", hash = "sha256:62e1bfcb02025a1cd73732a2d33672d3e9d0df4d21c12c51e0bbcaf09bab742a"}, + {file = "grpcio_status-1.62.2-py3-none-any.whl", hash = "sha256:206ddf0eb36bc99b033f03b2c8e95d319f0044defae9b41ae21408e7e0cda48f"}, +] + +[package.dependencies] +googleapis-common-protos = ">=1.5.5" +grpcio = ">=1.62.2" +protobuf = ">=4.21.6" + [[package]] name = "gymnasium" version = "0.29.1" @@ -950,6 +1348,7 @@ files = [ [package.dependencies] cloudpickle = ">=1.2.0" farama-notifications = ">=0.0.1" +importlib-metadata = {version = ">=4.8.0", markers = "python_version < \"3.10\""} numpy = ">=1.21.0" typing-extensions = ">=4.3.0" @@ -1116,6 +1515,20 @@ http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] trio = ["trio (>=0.22.0,<0.26.0)"] +[[package]] +name = "httplib2" +version = "0.22.0" +description = "A comprehensive HTTP client library." +optional = true +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "httplib2-0.22.0-py3-none-any.whl", hash = "sha256:14ae0a53c1ba8f3d37e9e27cf37eabb0fb9980f435ba405d546948b009dd64dc"}, + {file = "httplib2-0.22.0.tar.gz", hash = "sha256:d7a10bc5ef5ab08322488bde8c726eeee5c8618723fdb399597ec58f3d82df81"}, +] + +[package.dependencies] +pyparsing = {version = ">=2.4.2,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.0.2 || >3.0.2,<3.0.3 || >3.0.3,<4", markers = "python_version > \"3.0\""} + [[package]] name = "httpx" version = "0.27.0" @@ -1140,15 +1553,26 @@ cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] +[[package]] +name = "httpx-sse" +version = "0.4.0" +description = "Consume Server-Sent Event (SSE) messages with HTTPX." +optional = true +python-versions = ">=3.8" +files = [ + {file = "httpx-sse-0.4.0.tar.gz", hash = "sha256:1e81a3a3070ce322add1d3529ed42eb5f70817f45ed6ec915ab753f961139721"}, + {file = "httpx_sse-0.4.0-py3-none-any.whl", hash = "sha256:f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f"}, +] + [[package]] name = "huggingface-hub" -version = "0.23.0" +version = "0.23.1" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = false python-versions = ">=3.8.0" files = [ - {file = "huggingface_hub-0.23.0-py3-none-any.whl", hash = "sha256:075c30d48ee7db2bba779190dc526d2c11d422aed6f9044c5e2fdc2c432fdb91"}, - {file = "huggingface_hub-0.23.0.tar.gz", hash = "sha256:7126dedd10a4c6fac796ced4d87a8cf004efc722a5125c2c09299017fa366fa9"}, + {file = "huggingface_hub-0.23.1-py3-none-any.whl", hash = "sha256:720a5bffd2b1b449deb793da8b0df7a9390a7e238534d5a08c9fbcdecb1dd3cb"}, + {file = "huggingface_hub-0.23.1.tar.gz", hash = "sha256:4f62dbf6ae94f400c6d3419485e52bce510591432a5248a65d0cb72e4d479eb4"}, ] [package.dependencies] @@ -1229,6 +1653,20 @@ files = [ {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] +[[package]] +name = "intel-openmp" +version = "2021.4.0" +description = "Intel OpenMP* Runtime Library" +optional = true +python-versions = "*" +files = [ + {file = "intel_openmp-2021.4.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl", hash = "sha256:41c01e266a7fdb631a7609191709322da2bbf24b252ba763f125dd651bcc7675"}, + {file = "intel_openmp-2021.4.0-py2.py3-none-manylinux1_i686.whl", hash = "sha256:3b921236a38384e2016f0f3d65af6732cf2c12918087128a9163225451e776f2"}, + {file = "intel_openmp-2021.4.0-py2.py3-none-manylinux1_x86_64.whl", hash = "sha256:e2240ab8d01472fed04f3544a878cda5da16c26232b7ea1b59132dbfb48b186e"}, + {file = "intel_openmp-2021.4.0-py2.py3-none-win32.whl", hash = "sha256:6e863d8fd3d7e8ef389d52cf97a50fe2afe1a19247e8c0d168ce021546f96fc9"}, + {file = "intel_openmp-2021.4.0-py2.py3-none-win_amd64.whl", hash = "sha256:eef4c8bcc8acefd7f5cd3b9384dbf73d59e2c99fc56545712ded913f43c4a94f"}, +] + [[package]] name = "ipykernel" version = "6.29.4" @@ -1264,40 +1702,40 @@ test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio [[package]] name = "ipython" -version = "8.24.0" +version = "8.18.1" description = "IPython: Productive Interactive Computing" optional = false -python-versions = ">=3.10" +python-versions = ">=3.9" files = [ - {file = "ipython-8.24.0-py3-none-any.whl", hash = "sha256:d7bf2f6c4314984e3e02393213bab8703cf163ede39672ce5918c51fe253a2a3"}, - {file = "ipython-8.24.0.tar.gz", hash = "sha256:010db3f8a728a578bb641fdd06c063b9fb8e96a9464c63aec6310fbcb5e80501"}, + {file = "ipython-8.18.1-py3-none-any.whl", hash = "sha256:e8267419d72d81955ec1177f8a29aaa90ac80ad647499201119e2f05e99aa397"}, + {file = "ipython-8.18.1.tar.gz", hash = "sha256:ca6f079bb33457c66e233e4580ebfc4128855b4cf6370dddd73842a9563e8a27"}, ] [package.dependencies] colorama = {version = "*", markers = "sys_platform == \"win32\""} decorator = "*" +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} jedi = ">=0.16" matplotlib-inline = "*" -pexpect = {version = ">4.3", markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\""} +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} prompt-toolkit = ">=3.0.41,<3.1.0" pygments = ">=2.4.0" stack-data = "*" -traitlets = ">=5.13.0" -typing-extensions = {version = ">=4.6", markers = "python_version < \"3.12\""} +traitlets = ">=5" +typing-extensions = {version = "*", markers = "python_version < \"3.10\""} [package.extras] -all = ["ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole]", "ipython[test,test-extra]"] +all = ["black", "curio", "docrepr", "exceptiongroup", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] black = ["black"] -doc = ["docrepr", "exceptiongroup", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "stack-data", "typing-extensions"] +doc = ["docrepr", "exceptiongroup", "ipykernel", "matplotlib", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] kernel = ["ipykernel"] -matplotlib = ["matplotlib"] nbconvert = ["nbconvert"] nbformat = ["nbformat"] notebook = ["ipywidgets", "notebook"] parallel = ["ipyparallel"] qtconsole = ["qtconsole"] -test = ["pickleshare", "pytest", "pytest-asyncio (<0.22)", "testpath"] -test-extra = ["curio", "ipython[test]", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.23)", "pandas", "trio"] +test = ["pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath"] +test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath", "trio"] [[package]] name = "jedi" @@ -1320,13 +1758,13 @@ testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] [[package]] name = "jinja2" -version = "3.1.3" +version = "3.1.4" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ - {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, - {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, ] [package.dependencies] @@ -1335,6 +1773,87 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] +[[package]] +name = "jiter" +version = "0.4.0" +description = "Fast iterable JSON parser." +optional = true +python-versions = ">=3.8" +files = [ + {file = "jiter-0.4.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:4aa6226d82a4a4505078c0bd5947bad65399635fc5cd4b226512e41753624edf"}, + {file = "jiter-0.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:947111ac906740a948e7b63799481acd3d5ef666ccb178d146e25718640b7408"}, + {file = "jiter-0.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69572ffb4e84ae289a7422b9af4ea123cae2ce0772228859b37d4b26b4bc92ea"}, + {file = "jiter-0.4.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ba6046cbb5d1baa5a781b846f7e5438596a332f249a857d63f86ef5d1d9563b0"}, + {file = "jiter-0.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d4f346e54602782e66d07df0d1c7389384fd93680052ed6170da2c6dc758409e"}, + {file = "jiter-0.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:49110ce693f07e97d61089d894cea05a0b9894d5ccc6ac6fc583028726c8c8af"}, + {file = "jiter-0.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e358df6fd129f3a4e087539f086355ad0107e5da16dbc8bc857d94222eaeed5"}, + {file = "jiter-0.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7eb852ca39a48f3c049def56f0d1771b32e948e4f429a782d14ef4cc64cfd26e"}, + {file = "jiter-0.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:44dc045decb2545bffe2da04ea4c36d9438d3f3d49fc47ed423ea75c352b712e"}, + {file = "jiter-0.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:413adb15372ac63db04373240f40925788e4282c997eeafc2040530049a0a599"}, + {file = "jiter-0.4.0-cp310-none-win32.whl", hash = "sha256:0b48ea71673a97b897e4b94bbc871e62495a5a85f836c9f90712a4c70aa3ef7e"}, + {file = "jiter-0.4.0-cp310-none-win_amd64.whl", hash = "sha256:6a1c84b44afafaf0ba6223679cf17af664b889da14da31d8af3595fd977d96fa"}, + {file = "jiter-0.4.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:b2cc498345fa37ca23fbc20271a553aa46e6eb00924600f49b7dc4b2aa8952ee"}, + {file = "jiter-0.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:69f7221ac09ab421abf04f89942026868297c568133998fb181bcf435760cbf3"}, + {file = "jiter-0.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef7d01c52f3e5a56ae73af36bd13797dd1a56711eb522748e5e84d15425b3f10"}, + {file = "jiter-0.4.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:39be97d5ce0c4d0dae28c23c03a0af0501a725589427e99763f99c42e18aa402"}, + {file = "jiter-0.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eac2ed1ec1e577b92b7ea2d4e6de8aec0c1164defd8af8affdc8ec0f0ec2904a"}, + {file = "jiter-0.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6258837d184c92c9cb91c983c310ad7269d41afb49d34f00ca9246e073943a03"}, + {file = "jiter-0.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:123c2a77b066bf17a4d021e238e8351058cfa56b90ac04f2522d120dc64ea055"}, + {file = "jiter-0.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2df939f792c7a40e55f36700417db551b9f6b84d348990fa0f2c608adeb1f11b"}, + {file = "jiter-0.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:cb1b09b16d40cf9ba1d11ba11e5b96ad29286a6a1c4ad5e6a2aef5e352a89f5d"}, + {file = "jiter-0.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0efb4208889ebdbf933bf08dbcbc16e64ffd34c8e2b28044ee142789a9dc3a67"}, + {file = "jiter-0.4.0-cp311-none-win32.whl", hash = "sha256:20545ac1b68e7e5b066a1e8347840c9cebdd02ace65faae2e655fc02ec5c915c"}, + {file = "jiter-0.4.0-cp311-none-win_amd64.whl", hash = "sha256:6b300f9887c8e4431cd03a974ea3e4f9958885636003c3864220a9b2d2f8462b"}, + {file = "jiter-0.4.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:923432a0563bbae404ff25bb010e348514a69bfab979f2f8119b23b625dbf6d9"}, + {file = "jiter-0.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ab8bb0ec8b97cec4422dc8b37b525442d969244488c805b834609ab0ccd788e2"}, + {file = "jiter-0.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b857adb127b9c533907226791eafa79c5038c3eb5a477984994bf7c4715ba518"}, + {file = "jiter-0.4.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2609cc0d1d8d470e921ff9a604afeb4c701bbe13e00bd9834d5aa6e7ea732a9b"}, + {file = "jiter-0.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d39e99f8b7df46a119b6f84321f6ba01f16fa46abfa765d44c05c486d8e66829"}, + {file = "jiter-0.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:56de8b518ebfe76a70f856741f6de248ce396c50a87acef827b6e8388e3a502d"}, + {file = "jiter-0.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:488b7e777be47f67ce1a1f8f8eb907f9bbd81af5c03784a9bab09d025c250233"}, + {file = "jiter-0.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7ea35e0ecbb5dadd457855eb980dcc548c14cf5341bcd22a43814cb56f2bcc79"}, + {file = "jiter-0.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e1a9e9ee69c80b63951c93226b68d0e955953f64fe758bad2afe7ef7f9016af9"}, + {file = "jiter-0.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:78e2f3cc2a32a21d43ccc5afcf66f5d17e827ccc4e6d21c0b353bdad2c7dcc9c"}, + {file = "jiter-0.4.0-cp312-none-win32.whl", hash = "sha256:eeaa7a2b47a99f4ebbb4142bb58b95617e09f24c87570f6a57d2770687c9ddbe"}, + {file = "jiter-0.4.0-cp312-none-win_amd64.whl", hash = "sha256:8d4a78b385b93ff59a67215d26000fcb4789a388fca3730d1b60fab17fc81e3c"}, + {file = "jiter-0.4.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:ebf20a3fac1089ce26963bf04140da0f803d55332ec69d59c5a87cf1a87d29c4"}, + {file = "jiter-0.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d62244ffc6a168187452277adeefb7b2c30170689c6bf543a51e98e8c17ddab7"}, + {file = "jiter-0.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40b2cde77446a41cec595739fd168be87edff2428eaf7c3438231224dd0ab7a5"}, + {file = "jiter-0.4.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e51fc0a22021ec8905b9b00a2f7d25756f2ff7a653e35a790a2067ae126b51f6"}, + {file = "jiter-0.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a56e6f980b89d7cfe5c43811dcf52d6f37b319428a4540511235dafda9ea7808"}, + {file = "jiter-0.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0fec16adab8d3d3d6d74e3711a1f380836ebeab2a20e3f88cfe2ec5094d8b84"}, + {file = "jiter-0.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19e3de515801c954e8f1dc1f575282a4a86df9e782d4993ea1ed2be9a8dedaa0"}, + {file = "jiter-0.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17e0ad8abf0bb04d81810eaeaab35d2c99b5da11fcd1058e0a389607ff6503b0"}, + {file = "jiter-0.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8dc0132b728f3b3e90ff0d1874504cd49c78f3553bf3745168a7fc0b4cf674e1"}, + {file = "jiter-0.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:81a883104aa96e494d3d28eaf7070780d03ecee8ccfdfaf7e4899710340c47f1"}, + {file = "jiter-0.4.0-cp38-none-win32.whl", hash = "sha256:a044c53ab1aaa4af624ac9574181b5bad8e260aea7e03104738156511433deba"}, + {file = "jiter-0.4.0-cp38-none-win_amd64.whl", hash = "sha256:d920035c869053e3d9a0b3ff94384d16a8ef5fde3dea55f97bd29916f6e27554"}, + {file = "jiter-0.4.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:091e978f4e586a2f1c69bf940d45f4e6a23455877172a0ab7d6de04a3b119299"}, + {file = "jiter-0.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:79134b2d601309bcbe3304a262d7d228ad61d53c80883231c637773000a6d683"}, + {file = "jiter-0.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c471473e0b05058b5d729ff04271b6d45a575ac8bd9948563268c734b380ac7e"}, + {file = "jiter-0.4.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb84b8930da8b32b0b1fdff9817e2c4b47e8981b5647ad11c4975403416e4112"}, + {file = "jiter-0.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7f2805e28941751ebfe0948596a64cde4cfb9b84bea5282affd020063e659c96"}, + {file = "jiter-0.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:42ef59f9e513bf081a8b5c5578933ea9c3a63e559e6e3501a3e72edcd456ff5e"}, + {file = "jiter-0.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ae12e3906f9e565120ab569de261b738e3a1ec50c40e30c67499e4f893e9a8c"}, + {file = "jiter-0.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:264dc1324f45a793bc89af4f653225229eb17bca9ec7107dce6c8fb4fe68d20f"}, + {file = "jiter-0.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9a1c172ec47d846e25881dfbd52438ddb690da4ea04d185e477abd3db6c32f8a"}, + {file = "jiter-0.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ccde31d0bc114aedad0dbd71b7f63ba0f0eecd7ec9ae1926a0ca01c1eb2854e7"}, + {file = "jiter-0.4.0-cp39-none-win32.whl", hash = "sha256:13139b05792fbc13a0f9a5b4c89823ea0874141decae1b8f693f12bb1d28e061"}, + {file = "jiter-0.4.0-cp39-none-win_amd64.whl", hash = "sha256:3a729b2631c6d5551a41069697415fee9659c3eadc9ab87369376ba51930cd00"}, + {file = "jiter-0.4.0.tar.gz", hash = "sha256:68203e02e0419bc3eca717c580c2d8f615aeee1150e2a1fb68d6600a7e52a37c"}, +] + +[[package]] +name = "jmespath" +version = "1.0.1" +description = "JSON Matching Expressions" +optional = true +python-versions = ">=3.7" +files = [ + {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, + {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, +] + [[package]] name = "jsonpatch" version = "1.33" @@ -1397,16 +1916,17 @@ referencing = ">=0.31.0" [[package]] name = "jupyter-client" -version = "8.6.1" +version = "8.6.2" description = "Jupyter protocol implementation and client libraries" optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_client-8.6.1-py3-none-any.whl", hash = "sha256:3b7bd22f058434e3b9a7ea4b1500ed47de2713872288c0d511d19926f99b459f"}, - {file = "jupyter_client-8.6.1.tar.gz", hash = "sha256:e842515e2bab8e19186d89fdfea7abd15e39dd581f94e399f00e2af5a1652d3f"}, + {file = "jupyter_client-8.6.2-py3-none-any.whl", hash = "sha256:50cbc5c66fd1b8f65ecb66bc490ab73217993632809b6e505687de18e9dea39f"}, + {file = "jupyter_client-8.6.2.tar.gz", hash = "sha256:2bda14d55ee5ba58552a8c53ae43d215ad9868853489213f37da060ced54d8df"}, ] [package.dependencies] +importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" python-dateutil = ">=2.8.2" pyzmq = ">=23.0" @@ -1415,7 +1935,7 @@ traitlets = ">=5.3" [package.extras] docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest (<8.2.0)", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] [[package]] name = "jupyter-core" @@ -1450,6 +1970,7 @@ files = [ [package.dependencies] aiohttp = ">=3.8.3,<4.0.0" +async-timeout = {version = ">=4.0.0,<5.0.0", markers = "python_version < \"3.11\""} dataclasses-json = ">=0.5.7,<0.7" jsonpatch = ">=1.33,<2.0" langchain-community = ">=0.0.17,<0.1" @@ -1560,13 +2081,13 @@ requests = ">=2,<3" [[package]] name = "litellm" -version = "1.35.38" +version = "1.38.8" description = "Library to easily interface with LLM API providers" optional = false python-versions = "!=2.7.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,!=3.7.*,>=3.8" files = [ - {file = "litellm-1.35.38-py3-none-any.whl", hash = "sha256:79ab3403c945b340a751d889cf49030fee050487dff6294a21fb9586c49e3faf"}, - {file = "litellm-1.35.38.tar.gz", hash = "sha256:1a0b195c74d45ba0c2391c5be533c211ee1bcdba6be09e6950037432f62f79ea"}, + {file = "litellm-1.38.8-py3-none-any.whl", hash = "sha256:8155eb346dda0d766a401bcfb7b89c0e174a1c324d048b801e0cacd3579b1019"}, + {file = "litellm-1.38.8.tar.gz", hash = "sha256:7ea342b6dd4d409e9bf7642cc0fabe9f0e6fe61613505d36e7dbf9e4128baf72"}, ] [package.dependencies] @@ -1574,7 +2095,7 @@ aiohttp = "*" click = "*" importlib-metadata = ">=6.8.0" jinja2 = ">=3.1.2,<4.0.0" -openai = ">=1.0.0" +openai = ">=1.27.0" python-dotenv = ">=0.2.0" requests = ">=2.31.0,<3.0.0" tiktoken = ">=0.4.0" @@ -1582,7 +2103,7 @@ tokenizers = "*" [package.extras] extra-proxy = ["azure-identity (>=1.15.0,<2.0.0)", "azure-keyvault-secrets (>=4.8.0,<5.0.0)", "google-cloud-kms (>=2.21.3,<3.0.0)", "prisma (==0.11.0)", "resend (>=0.8.0,<0.9.0)"] -proxy = ["PyJWT (>=2.8.0,<3.0.0)", "apscheduler (>=3.10.4,<4.0.0)", "backoff", "cryptography (>=42.0.5,<43.0.0)", "fastapi (>=0.109.1,<0.110.0)", "fastapi-sso (>=0.10.0,<0.11.0)", "gunicorn (>=21.2.0,<22.0.0)", "orjson (>=3.9.7,<4.0.0)", "python-multipart (>=0.0.9,<0.0.10)", "pyyaml (>=6.0.1,<7.0.0)", "rq", "uvicorn (>=0.22.0,<0.23.0)"] +proxy = ["PyJWT (>=2.8.0,<3.0.0)", "apscheduler (>=3.10.4,<4.0.0)", "backoff", "cryptography (>=42.0.5,<43.0.0)", "fastapi (>=0.111.0,<0.112.0)", "fastapi-sso (>=0.10.0,<0.11.0)", "gunicorn (>=22.0.0,<23.0.0)", "orjson (>=3.9.7,<4.0.0)", "python-multipart (>=0.0.9,<0.0.10)", "pyyaml (>=6.0.1,<7.0.0)", "rq", "uvicorn (>=0.22.0,<0.23.0)"] [[package]] name = "lxml" @@ -1829,22 +2350,40 @@ files = [ {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, ] +[[package]] +name = "mkl" +version = "2021.4.0" +description = "Intel® oneAPI Math Kernel Library" +optional = true +python-versions = "*" +files = [ + {file = "mkl-2021.4.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl", hash = "sha256:67460f5cd7e30e405b54d70d1ed3ca78118370b65f7327d495e9c8847705e2fb"}, + {file = "mkl-2021.4.0-py2.py3-none-manylinux1_i686.whl", hash = "sha256:636d07d90e68ccc9630c654d47ce9fdeb036bb46e2b193b3a9ac8cfea683cce5"}, + {file = "mkl-2021.4.0-py2.py3-none-manylinux1_x86_64.whl", hash = "sha256:398dbf2b0d12acaf54117a5210e8f191827f373d362d796091d161f610c1ebfb"}, + {file = "mkl-2021.4.0-py2.py3-none-win32.whl", hash = "sha256:439c640b269a5668134e3dcbcea4350459c4a8bc46469669b2d67e07e3d330e8"}, + {file = "mkl-2021.4.0-py2.py3-none-win_amd64.whl", hash = "sha256:ceef3cafce4c009dd25f65d7ad0d833a0fbadc3d8903991ec92351fe5de1e718"}, +] + +[package.dependencies] +intel-openmp = "==2021.*" +tbb = "==2021.*" + [[package]] name = "more-itertools" -version = "10.2.0" +version = "9.1.0" description = "More routines for operating on iterables, beyond itertools" optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "more-itertools-10.2.0.tar.gz", hash = "sha256:8fccb480c43d3e99a00087634c06dd02b0d50fbf088b380de5a41a015ec239e1"}, - {file = "more_itertools-10.2.0-py3-none-any.whl", hash = "sha256:686b06abe565edfab151cb8fd385a05651e1fdf8f0a14191e4439283421f8684"}, + {file = "more-itertools-9.1.0.tar.gz", hash = "sha256:cabaa341ad0389ea83c17a94566a53ae4c9d07349861ecb14dc6d0345cf9ac5d"}, + {file = "more_itertools-9.1.0-py3-none-any.whl", hash = "sha256:d2bc7f02446e86a68911e58ded76d6561eea00cddfb2a91e7019bbb586c799f3"}, ] [[package]] name = "mpmath" version = "1.3.0" description = "Python library for arbitrary-precision floating-point arithmetic" -optional = false +optional = true python-versions = "*" files = [ {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, @@ -1960,7 +2499,7 @@ files = [ name = "multiprocess" version = "0.70.16" description = "better multiprocessing and multithreading in Python" -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "multiprocess-0.70.16-pp310-pypy310_pp73-macosx_10_13_x86_64.whl", hash = "sha256:476887be10e2f59ff183c006af746cb6f1fd0eadcfd4ef49e605cbe2659920ee"}, @@ -2018,6 +2557,7 @@ files = [ [package.dependencies] mypy-extensions = ">=1.0.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} typing-extensions = ">=4.1.0" [package.extras] @@ -2037,16 +2577,6 @@ files = [ {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, ] -[[package]] -name = "names" -version = "0.3.0" -description = "Generate random names" -optional = false -python-versions = "*" -files = [ - {file = "names-0.3.0.tar.gz", hash = "sha256:726e46254f2ed03f1ffb5d941dae3bc67c35123941c29becd02d48d0caa2a671"}, -] - [[package]] name = "nbclient" version = "0.6.8" @@ -2120,20 +2650,20 @@ files = [ [[package]] name = "networkx" -version = "3.3" +version = "3.2.1" description = "Python package for creating and manipulating graphs and networks" -optional = false -python-versions = ">=3.10" +optional = true +python-versions = ">=3.9" files = [ - {file = "networkx-3.3-py3-none-any.whl", hash = "sha256:28575580c6ebdaf4505b22c6256a2b9de86b316dc63ba9e93abde3d78dfdbcf2"}, - {file = "networkx-3.3.tar.gz", hash = "sha256:0c127d8b2f4865f59ae9cb8aafcd60b5c70f3241ebd66f7defad7c4ab90126c9"}, + {file = "networkx-3.2.1-py3-none-any.whl", hash = "sha256:f18c69adc97877c42332c170849c96cefa91881c99a7cb3e95b7c659ebdc1ec2"}, + {file = "networkx-3.2.1.tar.gz", hash = "sha256:9f1bb5cf3409bf324e0a722c20bdb4c20ee39bf1c30ce8ae499c8502b0b5e0c6"}, ] [package.extras] -default = ["matplotlib (>=3.6)", "numpy (>=1.23)", "pandas (>=1.4)", "scipy (>=1.9,!=1.11.0,!=1.11.1)"] -developer = ["changelist (==0.5)", "mypy (>=1.1)", "pre-commit (>=3.2)", "rtoml"] -doc = ["myst-nb (>=1.0)", "numpydoc (>=1.7)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.14)", "sphinx (>=7)", "sphinx-gallery (>=0.14)", "texext (>=0.6.7)"] -extra = ["lxml (>=4.6)", "pydot (>=2.0)", "pygraphviz (>=1.12)", "sympy (>=1.10)"] +default = ["matplotlib (>=3.5)", "numpy (>=1.22)", "pandas (>=1.4)", "scipy (>=1.9,!=1.11.0,!=1.11.1)"] +developer = ["changelist (==0.4)", "mypy (>=1.1)", "pre-commit (>=3.2)", "rtoml"] +doc = ["nb2plots (>=0.7)", "nbconvert (<7.9)", "numpydoc (>=1.6)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.14)", "sphinx (>=7)", "sphinx-gallery (>=0.14)", "texext (>=0.6.7)"] +extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.11)", "sympy (>=1.10)"] test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] [[package]] @@ -2199,7 +2729,7 @@ files = [ name = "nvidia-cublas-cu12" version = "12.1.3.1" description = "CUBLAS native runtime libraries" -optional = false +optional = true python-versions = ">=3" files = [ {file = "nvidia_cublas_cu12-12.1.3.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:ee53ccca76a6fc08fb9701aa95b6ceb242cdaab118c3bb152af4e579af792728"}, @@ -2210,7 +2740,7 @@ files = [ name = "nvidia-cuda-cupti-cu12" version = "12.1.105" description = "CUDA profiling tools runtime libs." -optional = false +optional = true python-versions = ">=3" files = [ {file = "nvidia_cuda_cupti_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:e54fde3983165c624cb79254ae9818a456eb6e87a7fd4d56a2352c24ee542d7e"}, @@ -2221,7 +2751,7 @@ files = [ name = "nvidia-cuda-nvrtc-cu12" version = "12.1.105" description = "NVRTC native runtime libraries" -optional = false +optional = true python-versions = ">=3" files = [ {file = "nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:339b385f50c309763ca65456ec75e17bbefcbbf2893f462cb8b90584cd27a1c2"}, @@ -2232,7 +2762,7 @@ files = [ name = "nvidia-cuda-runtime-cu12" version = "12.1.105" description = "CUDA Runtime native Libraries" -optional = false +optional = true python-versions = ">=3" files = [ {file = "nvidia_cuda_runtime_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:6e258468ddf5796e25f1dc591a31029fa317d97a0a94ed93468fc86301d61e40"}, @@ -2243,7 +2773,7 @@ files = [ name = "nvidia-cudnn-cu12" version = "8.9.2.26" description = "cuDNN runtime libraries" -optional = false +optional = true python-versions = ">=3" files = [ {file = "nvidia_cudnn_cu12-8.9.2.26-py3-none-manylinux1_x86_64.whl", hash = "sha256:5ccb288774fdfb07a7e7025ffec286971c06d8d7b4fb162525334616d7629ff9"}, @@ -2256,7 +2786,7 @@ nvidia-cublas-cu12 = "*" name = "nvidia-cufft-cu12" version = "11.0.2.54" description = "CUFFT native runtime libraries" -optional = false +optional = true python-versions = ">=3" files = [ {file = "nvidia_cufft_cu12-11.0.2.54-py3-none-manylinux1_x86_64.whl", hash = "sha256:794e3948a1aa71fd817c3775866943936774d1c14e7628c74f6f7417224cdf56"}, @@ -2267,7 +2797,7 @@ files = [ name = "nvidia-curand-cu12" version = "10.3.2.106" description = "CURAND native runtime libraries" -optional = false +optional = true python-versions = ">=3" files = [ {file = "nvidia_curand_cu12-10.3.2.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:9d264c5036dde4e64f1de8c50ae753237c12e0b1348738169cd0f8a536c0e1e0"}, @@ -2278,7 +2808,7 @@ files = [ name = "nvidia-cusolver-cu12" version = "11.4.5.107" description = "CUDA solver native runtime libraries" -optional = false +optional = true python-versions = ">=3" files = [ {file = "nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl", hash = "sha256:8a7ec542f0412294b15072fa7dab71d31334014a69f953004ea7a118206fe0dd"}, @@ -2294,7 +2824,7 @@ nvidia-nvjitlink-cu12 = "*" name = "nvidia-cusparse-cu12" version = "12.1.0.106" description = "CUSPARSE native runtime libraries" -optional = false +optional = true python-versions = ">=3" files = [ {file = "nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:f3b50f42cf363f86ab21f720998517a659a48131e8d538dc02f8768237bd884c"}, @@ -2306,30 +2836,31 @@ nvidia-nvjitlink-cu12 = "*" [[package]] name = "nvidia-nccl-cu12" -version = "2.19.3" +version = "2.20.5" description = "NVIDIA Collective Communication Library (NCCL) Runtime" -optional = false +optional = true python-versions = ">=3" files = [ - {file = "nvidia_nccl_cu12-2.19.3-py3-none-manylinux1_x86_64.whl", hash = "sha256:a9734707a2c96443331c1e48c717024aa6678a0e2a4cb66b2c364d18cee6b48d"}, + {file = "nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1fc150d5c3250b170b29410ba682384b14581db722b2531b0d8d33c595f33d01"}, + {file = "nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_x86_64.whl", hash = "sha256:057f6bf9685f75215d0c53bf3ac4a10b3e6578351de307abad9e18a99182af56"}, ] [[package]] name = "nvidia-nvjitlink-cu12" -version = "12.4.127" +version = "12.5.40" description = "Nvidia JIT LTO Library" -optional = false +optional = true python-versions = ">=3" files = [ - {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:06b3b9b25bf3f8af351d664978ca26a16d2c5127dbd53c0497e28d1fb9611d57"}, - {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:fd9020c501d27d135f983c6d3e244b197a7ccad769e34df53a42e276b0e25fa1"}, + {file = "nvidia_nvjitlink_cu12-12.5.40-py3-none-manylinux2014_x86_64.whl", hash = "sha256:d9714f27c1d0f0895cd8915c07a87a1d0029a0aa36acaf9156952ec2a8a12189"}, + {file = "nvidia_nvjitlink_cu12-12.5.40-py3-none-win_amd64.whl", hash = "sha256:c3401dc8543b52d3a8158007a0c1ab4e9c768fcbd24153a48c86972102197ddd"}, ] [[package]] name = "nvidia-nvtx-cu12" version = "12.1.105" description = "NVIDIA Tools Extension" -optional = false +optional = true python-versions = ">=3" files = [ {file = "nvidia_nvtx_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:dc21cf308ca5691e7c04d962e213f8a4aa9bbfa23d95412f452254c2caeb09e5"}, @@ -2338,13 +2869,13 @@ files = [ [[package]] name = "openai" -version = "1.25.1" +version = "1.30.3" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.25.1-py3-none-any.whl", hash = "sha256:aa2f381f476f5fa4df8728a34a3e454c321caa064b7b68ab6e9daa1ed082dbf9"}, - {file = "openai-1.25.1.tar.gz", hash = "sha256:f561ce86f4b4008eb6c78622d641e4b7e1ab8a8cdb15d2f0b2a49942d40d21a8"}, + {file = "openai-1.30.3-py3-none-any.whl", hash = "sha256:f88119c8a848998be533c71ab8aa832446fa72b7ddbc70917c3f5886dc132051"}, + {file = "openai-1.30.3.tar.gz", hash = "sha256:8e1bcdca2b96fe3636ab522fa153d88efde1b702d12ec32f1c73e9553ff93f45"}, ] [package.dependencies] @@ -2409,7 +2940,11 @@ files = [ ] [package.dependencies] -numpy = {version = ">=1.23.2", markers = "python_version == \"3.11\""} +numpy = [ + {version = ">=1.22.4", markers = "python_version < \"3.11\""}, + {version = ">=1.23.2", markers = "python_version == \"3.11\""}, + {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, +] python-dateutil = ">=2.8.2" pytz = ">=2020.1" tzdata = ">=2022.7" @@ -2441,13 +2976,13 @@ xml = ["lxml (>=4.9.2)"] [[package]] name = "pandas-stubs" -version = "2.2.1.240316" +version = "2.2.2.240514" description = "Type annotations for pandas" optional = false python-versions = ">=3.9" files = [ - {file = "pandas_stubs-2.2.1.240316-py3-none-any.whl", hash = "sha256:0126a26451a37cb893ea62357ca87ba3d181bd999ec8ba2ca5602e20207d6682"}, - {file = "pandas_stubs-2.2.1.240316.tar.gz", hash = "sha256:236a4f812fb6b1922e9607ff09e427f6d8540c421c9e5a40e3e4ddf7adac7f05"}, + {file = "pandas_stubs-2.2.2.240514-py3-none-any.whl", hash = "sha256:5d6f64d45a98bc94152a0f76fa648e598cd2b9ba72302fd34602479f0c391a53"}, + {file = "pandas_stubs-2.2.2.240514.tar.gz", hash = "sha256:85b20da44a62c80eb8389bcf4cbfe31cce1cafa8cca4bf1fc75ec45892e72ce8"}, ] [package.dependencies] @@ -2510,13 +3045,13 @@ ptyprocess = ">=0.5" [[package]] name = "platformdirs" -version = "4.2.1" +version = "4.2.2" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.2.1-py3-none-any.whl", hash = "sha256:17d5a1161b3fd67b390023cb2d3b026bbd40abde6fdb052dfbd3a29c3ba22ee1"}, - {file = "platformdirs-4.2.1.tar.gz", hash = "sha256:031cd18d4ec63ec53e82dceaac0417d218a6863f7745dfcc9efe7793b7039bdf"}, + {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, + {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, ] [package.extras] @@ -2541,13 +3076,13 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "pre-commit" -version = "3.7.0" +version = "3.7.1" description = "A framework for managing and maintaining multi-language pre-commit hooks." optional = false python-versions = ">=3.9" files = [ - {file = "pre_commit-3.7.0-py2.py3-none-any.whl", hash = "sha256:5eae9e10c2b5ac51577c3452ec0a490455c45a0533f7960f993a0d01e59decab"}, - {file = "pre_commit-3.7.0.tar.gz", hash = "sha256:e209d61b8acdcf742404408531f0c37d49d2c734fd7cff2d6076083d191cb060"}, + {file = "pre_commit-3.7.1-py2.py3-none-any.whl", hash = "sha256:fae36fd1d7ad7d6a5a1c0b0d5adb2ed1a3bda5a21bf6c3e5372073d7a11cd4c5"}, + {file = "pre_commit-3.7.1.tar.gz", hash = "sha256:8ca3ad567bc78a4972a3f1a477e94a79d4597e8140a6e0b651c5e33899c3654a"}, ] [package.dependencies] @@ -2571,6 +3106,43 @@ files = [ [package.dependencies] wcwidth = "*" +[[package]] +name = "proto-plus" +version = "1.23.0" +description = "Beautiful, Pythonic protocol buffers." +optional = true +python-versions = ">=3.6" +files = [ + {file = "proto-plus-1.23.0.tar.gz", hash = "sha256:89075171ef11988b3fa157f5dbd8b9cf09d65fffee97e29ce403cd8defba19d2"}, + {file = "proto_plus-1.23.0-py3-none-any.whl", hash = "sha256:a829c79e619e1cf632de091013a4173deed13a55f326ef84f05af6f50ff4c82c"}, +] + +[package.dependencies] +protobuf = ">=3.19.0,<5.0.0dev" + +[package.extras] +testing = ["google-api-core[grpc] (>=1.31.5)"] + +[[package]] +name = "protobuf" +version = "4.25.3" +description = "" +optional = true +python-versions = ">=3.8" +files = [ + {file = "protobuf-4.25.3-cp310-abi3-win32.whl", hash = "sha256:d4198877797a83cbfe9bffa3803602bbe1625dc30d8a097365dbc762e5790faa"}, + {file = "protobuf-4.25.3-cp310-abi3-win_amd64.whl", hash = "sha256:209ba4cc916bab46f64e56b85b090607a676f66b473e6b762e6f1d9d591eb2e8"}, + {file = "protobuf-4.25.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c"}, + {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:e7cb0ae90dd83727f0c0718634ed56837bfeeee29a5f82a7514c03ee1364c019"}, + {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:7c8daa26095f82482307bc717364e7c13f4f1c99659be82890dcfc215194554d"}, + {file = "protobuf-4.25.3-cp38-cp38-win32.whl", hash = "sha256:f4f118245c4a087776e0a8408be33cf09f6c547442c00395fbfb116fac2f8ac2"}, + {file = "protobuf-4.25.3-cp38-cp38-win_amd64.whl", hash = "sha256:c053062984e61144385022e53678fbded7aea14ebb3e0305ae3592fb219ccfa4"}, + {file = "protobuf-4.25.3-cp39-cp39-win32.whl", hash = "sha256:19b270aeaa0099f16d3ca02628546b8baefe2955bbe23224aaf856134eccf1e4"}, + {file = "protobuf-4.25.3-cp39-cp39-win_amd64.whl", hash = "sha256:e3c97a1555fd6388f857770ff8b9703083de6bf1f9274a002a332d65fbb56c8c"}, + {file = "protobuf-4.25.3-py3-none-any.whl", hash = "sha256:f0700d54bcf45424477e46a9f0944155b46fb0639d69728739c0e47bab83f2b9"}, + {file = "protobuf-4.25.3.tar.gz", hash = "sha256:25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c"}, +] + [[package]] name = "psutil" version = "5.9.8" @@ -2626,47 +3198,47 @@ tests = ["pytest"] [[package]] name = "pyarrow" -version = "16.0.0" +version = "16.1.0" description = "Python library for Apache Arrow" -optional = false +optional = true python-versions = ">=3.8" files = [ - {file = "pyarrow-16.0.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:22a1fdb1254e5095d629e29cd1ea98ed04b4bbfd8e42cc670a6b639ccc208b60"}, - {file = "pyarrow-16.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:574a00260a4ed9d118a14770edbd440b848fcae5a3024128be9d0274dbcaf858"}, - {file = "pyarrow-16.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c0815d0ddb733b8c1b53a05827a91f1b8bde6240f3b20bf9ba5d650eb9b89cdf"}, - {file = "pyarrow-16.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df0080339387b5d30de31e0a149c0c11a827a10c82f0c67d9afae3981d1aabb7"}, - {file = "pyarrow-16.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:edf38cce0bf0dcf726e074159c60516447e4474904c0033f018c1f33d7dac6c5"}, - {file = "pyarrow-16.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:91d28f9a40f1264eab2af7905a4d95320ac2f287891e9c8b0035f264fe3c3a4b"}, - {file = "pyarrow-16.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:99af421ee451a78884d7faea23816c429e263bd3618b22d38e7992c9ce2a7ad9"}, - {file = "pyarrow-16.0.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:d22d0941e6c7bafddf5f4c0662e46f2075850f1c044bf1a03150dd9e189427ce"}, - {file = "pyarrow-16.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:266ddb7e823f03733c15adc8b5078db2df6980f9aa93d6bb57ece615df4e0ba7"}, - {file = "pyarrow-16.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cc23090224b6594f5a92d26ad47465af47c1d9c079dd4a0061ae39551889efe"}, - {file = "pyarrow-16.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56850a0afe9ef37249d5387355449c0f94d12ff7994af88f16803a26d38f2016"}, - {file = "pyarrow-16.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:705db70d3e2293c2f6f8e84874b5b775f690465798f66e94bb2c07bab0a6bb55"}, - {file = "pyarrow-16.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:5448564754c154997bc09e95a44b81b9e31ae918a86c0fcb35c4aa4922756f55"}, - {file = "pyarrow-16.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:729f7b262aa620c9df8b9967db96c1575e4cfc8c25d078a06968e527b8d6ec05"}, - {file = "pyarrow-16.0.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:fb8065dbc0d051bf2ae2453af0484d99a43135cadabacf0af588a3be81fbbb9b"}, - {file = "pyarrow-16.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:20ce707d9aa390593ea93218b19d0eadab56390311cb87aad32c9a869b0e958c"}, - {file = "pyarrow-16.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5823275c8addbbb50cd4e6a6839952682a33255b447277e37a6f518d6972f4e1"}, - {file = "pyarrow-16.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ab8b9050752b16a8b53fcd9853bf07d8daf19093533e990085168f40c64d978"}, - {file = "pyarrow-16.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:42e56557bc7c5c10d3e42c3b32f6cff649a29d637e8f4e8b311d334cc4326730"}, - {file = "pyarrow-16.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:2a7abdee4a4a7cfa239e2e8d721224c4b34ffe69a0ca7981354fe03c1328789b"}, - {file = "pyarrow-16.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:ef2f309b68396bcc5a354106741d333494d6a0d3e1951271849787109f0229a6"}, - {file = "pyarrow-16.0.0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:ed66e5217b4526fa3585b5e39b0b82f501b88a10d36bd0d2a4d8aa7b5a48e2df"}, - {file = "pyarrow-16.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cc8814310486f2a73c661ba8354540f17eef51e1b6dd090b93e3419d3a097b3a"}, - {file = "pyarrow-16.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c2f5e239db7ed43e0ad2baf46a6465f89c824cc703f38ef0fde927d8e0955f7"}, - {file = "pyarrow-16.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f293e92d1db251447cb028ae12f7bc47526e4649c3a9924c8376cab4ad6b98bd"}, - {file = "pyarrow-16.0.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:dd9334a07b6dc21afe0857aa31842365a62eca664e415a3f9536e3a8bb832c07"}, - {file = "pyarrow-16.0.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:d91073d1e2fef2c121154680e2ba7e35ecf8d4969cc0af1fa6f14a8675858159"}, - {file = "pyarrow-16.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:71d52561cd7aefd22cf52538f262850b0cc9e4ec50af2aaa601da3a16ef48877"}, - {file = "pyarrow-16.0.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:b93c9a50b965ee0bf4fef65e53b758a7e8dcc0c2d86cebcc037aaaf1b306ecc0"}, - {file = "pyarrow-16.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d831690844706e374c455fba2fb8cfcb7b797bfe53ceda4b54334316e1ac4fa4"}, - {file = "pyarrow-16.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35692ce8ad0b8c666aa60f83950957096d92f2a9d8d7deda93fb835e6053307e"}, - {file = "pyarrow-16.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9dd3151d098e56f16a8389c1247137f9e4c22720b01c6f3aa6dec29a99b74d80"}, - {file = "pyarrow-16.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:bd40467bdb3cbaf2044ed7a6f7f251c8f941c8b31275aaaf88e746c4f3ca4a7a"}, - {file = "pyarrow-16.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:00a1dcb22ad4ceb8af87f7bd30cc3354788776c417f493089e0a0af981bc8d80"}, - {file = "pyarrow-16.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:fda9a7cebd1b1d46c97b511f60f73a5b766a6de4c5236f144f41a5d5afec1f35"}, - {file = "pyarrow-16.0.0.tar.gz", hash = "sha256:59bb1f1edbbf4114c72415f039f1359f1a57d166a331c3229788ccbfbb31689a"}, + {file = "pyarrow-16.1.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:17e23b9a65a70cc733d8b738baa6ad3722298fa0c81d88f63ff94bf25eaa77b9"}, + {file = "pyarrow-16.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4740cc41e2ba5d641071d0ab5e9ef9b5e6e8c7611351a5cb7c1d175eaf43674a"}, + {file = "pyarrow-16.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98100e0268d04e0eec47b73f20b39c45b4006f3c4233719c3848aa27a03c1aef"}, + {file = "pyarrow-16.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f68f409e7b283c085f2da014f9ef81e885d90dcd733bd648cfba3ef265961848"}, + {file = "pyarrow-16.1.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:a8914cd176f448e09746037b0c6b3a9d7688cef451ec5735094055116857580c"}, + {file = "pyarrow-16.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:48be160782c0556156d91adbdd5a4a7e719f8d407cb46ae3bb4eaee09b3111bd"}, + {file = "pyarrow-16.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:9cf389d444b0f41d9fe1444b70650fea31e9d52cfcb5f818b7888b91b586efff"}, + {file = "pyarrow-16.1.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:d0ebea336b535b37eee9eee31761813086d33ed06de9ab6fc6aaa0bace7b250c"}, + {file = "pyarrow-16.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e73cfc4a99e796727919c5541c65bb88b973377501e39b9842ea71401ca6c1c"}, + {file = "pyarrow-16.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf9251264247ecfe93e5f5a0cd43b8ae834f1e61d1abca22da55b20c788417f6"}, + {file = "pyarrow-16.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddf5aace92d520d3d2a20031d8b0ec27b4395cab9f74e07cc95edf42a5cc0147"}, + {file = "pyarrow-16.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:25233642583bf658f629eb230b9bb79d9af4d9f9229890b3c878699c82f7d11e"}, + {file = "pyarrow-16.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a33a64576fddfbec0a44112eaf844c20853647ca833e9a647bfae0582b2ff94b"}, + {file = "pyarrow-16.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:185d121b50836379fe012753cf15c4ba9638bda9645183ab36246923875f8d1b"}, + {file = "pyarrow-16.1.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:2e51ca1d6ed7f2e9d5c3c83decf27b0d17bb207a7dea986e8dc3e24f80ff7d6f"}, + {file = "pyarrow-16.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:06ebccb6f8cb7357de85f60d5da50e83507954af617d7b05f48af1621d331c9a"}, + {file = "pyarrow-16.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b04707f1979815f5e49824ce52d1dceb46e2f12909a48a6a753fe7cafbc44a0c"}, + {file = "pyarrow-16.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d32000693deff8dc5df444b032b5985a48592c0697cb6e3071a5d59888714e2"}, + {file = "pyarrow-16.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:8785bb10d5d6fd5e15d718ee1d1f914fe768bf8b4d1e5e9bf253de8a26cb1628"}, + {file = "pyarrow-16.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:e1369af39587b794873b8a307cc6623a3b1194e69399af0efd05bb202195a5a7"}, + {file = "pyarrow-16.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:febde33305f1498f6df85e8020bca496d0e9ebf2093bab9e0f65e2b4ae2b3444"}, + {file = "pyarrow-16.1.0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b5f5705ab977947a43ac83b52ade3b881eb6e95fcc02d76f501d549a210ba77f"}, + {file = "pyarrow-16.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0d27bf89dfc2576f6206e9cd6cf7a107c9c06dc13d53bbc25b0bd4556f19cf5f"}, + {file = "pyarrow-16.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d07de3ee730647a600037bc1d7b7994067ed64d0eba797ac74b2bc77384f4c2"}, + {file = "pyarrow-16.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbef391b63f708e103df99fbaa3acf9f671d77a183a07546ba2f2c297b361e83"}, + {file = "pyarrow-16.1.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:19741c4dbbbc986d38856ee7ddfdd6a00fc3b0fc2d928795b95410d38bb97d15"}, + {file = "pyarrow-16.1.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:f2c5fb249caa17b94e2b9278b36a05ce03d3180e6da0c4c3b3ce5b2788f30eed"}, + {file = "pyarrow-16.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:e6b6d3cd35fbb93b70ade1336022cc1147b95ec6af7d36906ca7fe432eb09710"}, + {file = "pyarrow-16.1.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:18da9b76a36a954665ccca8aa6bd9f46c1145f79c0bb8f4f244f5f8e799bca55"}, + {file = "pyarrow-16.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:99f7549779b6e434467d2aa43ab2b7224dd9e41bdde486020bae198978c9e05e"}, + {file = "pyarrow-16.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f07fdffe4fd5b15f5ec15c8b64584868d063bc22b86b46c9695624ca3505b7b4"}, + {file = "pyarrow-16.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddfe389a08ea374972bd4065d5f25d14e36b43ebc22fc75f7b951f24378bf0b5"}, + {file = "pyarrow-16.1.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:3b20bd67c94b3a2ea0a749d2a5712fc845a69cb5d52e78e6449bbd295611f3aa"}, + {file = "pyarrow-16.1.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:ba8ac20693c0bb0bf4b238751d4409e62852004a8cf031c73b0e0962b03e45e3"}, + {file = "pyarrow-16.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:31a1851751433d89a986616015841977e0a188662fcffd1a5677453f1df2de0a"}, + {file = "pyarrow-16.1.0.tar.gz", hash = "sha256:15fbb22ea96d11f0b5768504a3f961edab25eaf4197c341720c4a387f6c60315"}, ] [package.dependencies] @@ -2676,13 +3248,38 @@ numpy = ">=1.16.6" name = "pyarrow-hotfix" version = "0.6" description = "" -optional = false +optional = true python-versions = ">=3.5" files = [ {file = "pyarrow_hotfix-0.6-py3-none-any.whl", hash = "sha256:dcc9ae2d220dff0083be6a9aa8e0cdee5182ad358d4931fce825c545e5c89178"}, {file = "pyarrow_hotfix-0.6.tar.gz", hash = "sha256:79d3e030f7ff890d408a100ac16d6f00b14d44a502d7897cd9fc3e3a534e9945"}, ] +[[package]] +name = "pyasn1" +version = "0.6.0" +description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" +optional = true +python-versions = ">=3.8" +files = [ + {file = "pyasn1-0.6.0-py2.py3-none-any.whl", hash = "sha256:cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473"}, + {file = "pyasn1-0.6.0.tar.gz", hash = "sha256:3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c"}, +] + +[[package]] +name = "pyasn1-modules" +version = "0.4.0" +description = "A collection of ASN.1-based protocols modules" +optional = true +python-versions = ">=3.8" +files = [ + {file = "pyasn1_modules-0.4.0-py3-none-any.whl", hash = "sha256:be04f15b66c206eed667e0bb5ab27e2b1855ea54a842e5037738099e8ca4ae0b"}, + {file = "pyasn1_modules-0.4.0.tar.gz", hash = "sha256:831dbcea1b177b28c9baddf4c6d1013c24c3accd14a1873fffaa6a2e905f17b6"}, +] + +[package.dependencies] +pyasn1 = ">=0.4.6,<0.7.0" + [[package]] name = "pycparser" version = "2.22" @@ -2760,35 +3357,51 @@ files = [ [package.extras] windows-terminal = ["colorama (>=0.4.6)"] +[[package]] +name = "pyparsing" +version = "3.1.2" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +optional = true +python-versions = ">=3.6.8" +files = [ + {file = "pyparsing-3.1.2-py3-none-any.whl", hash = "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742"}, + {file = "pyparsing-3.1.2.tar.gz", hash = "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + [[package]] name = "pytest" -version = "8.2.0" +version = "8.2.1" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-8.2.0-py3-none-any.whl", hash = "sha256:1733f0620f6cda4095bbf0d9ff8022486e91892245bb9e7d5542c018f612f233"}, - {file = "pytest-8.2.0.tar.gz", hash = "sha256:d507d4482197eac0ba2bae2e9babf0672eb333017bcedaa5fb1a3d42c1174b3f"}, + {file = "pytest-8.2.1-py3-none-any.whl", hash = "sha256:faccc5d332b8c3719f40283d0d44aa5cf101cec36f88cde9ed8f2bc0538612b1"}, + {file = "pytest-8.2.1.tar.gz", hash = "sha256:5046e5b46d8e4cac199c373041f26be56fdb81eb4e67dc11d4e10811fc3408fd"}, ] [package.dependencies] colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" packaging = "*" pluggy = ">=1.5,<2.0" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} [package.extras] dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] [[package]] name = "pytest-asyncio" -version = "0.23.6" +version = "0.23.7" description = "Pytest support for asyncio" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-asyncio-0.23.6.tar.gz", hash = "sha256:ffe523a89c1c222598c76856e76852b787504ddb72dd5d9b6617ffa8aa2cde5f"}, - {file = "pytest_asyncio-0.23.6-py3-none-any.whl", hash = "sha256:68516fdd1018ac57b846c9846b954f0393b26f094764a28c955eabb0536a4e8a"}, + {file = "pytest_asyncio-0.23.7-py3-none-any.whl", hash = "sha256:009b48127fbe44518a547bddd25611551b0e43ccdbf1e67d12479f569832c20b"}, + {file = "pytest_asyncio-0.23.7.tar.gz", hash = "sha256:5f5c72948f4c49e7db4f29f2521d4031f1c27f86e57b046126654083d4770268"}, ] [package.dependencies] @@ -3033,17 +3646,17 @@ cffi = {version = "*", markers = "implementation_name == \"pypy\""} [[package]] name = "redis" -version = "5.0.4" +version = "4.6.0" description = "Python client for Redis database and key-value store" optional = false python-versions = ">=3.7" files = [ - {file = "redis-5.0.4-py3-none-any.whl", hash = "sha256:7adc2835c7a9b5033b7ad8f8918d09b7344188228809c98df07af226d39dec91"}, - {file = "redis-5.0.4.tar.gz", hash = "sha256:ec31f2ed9675cc54c21ba854cfe0462e6faf1d83c8ce5944709db8a4700b9c61"}, + {file = "redis-4.6.0-py3-none-any.whl", hash = "sha256:e2b03db868160ee4591de3cb90d40ebb50a90dd302138775937f6a42b7ed183c"}, + {file = "redis-4.6.0.tar.gz", hash = "sha256:585dc516b9eb042a619ef0a39c3d7d55fe81bdb4df09a52c9cdde0d07bf1aa7d"}, ] [package.dependencies] -async-timeout = {version = ">=4.0.3", markers = "python_full_version < \"3.11.3\""} +async-timeout = {version = ">=4.0.2", markers = "python_full_version <= \"3.11.2\""} [package.extras] hiredis = ["hiredis (>=1.0.0)"] @@ -3051,22 +3664,22 @@ ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)" [[package]] name = "redis-om" -version = "0.2.2" +version = "0.2.1" description = "Object mappings, and more, for Redis." optional = false -python-versions = "<4.0,>=3.8" +python-versions = ">=3.7,<4.0" files = [ - {file = "redis_om-0.2.2-py3-none-any.whl", hash = "sha256:f395db665f1829e8beef9b23cb74ec397107c73216162900ff4c8563b0bee6a9"}, - {file = "redis_om-0.2.2.tar.gz", hash = "sha256:335eeafcec35f8db15c4ee384b22c115b3040bca93a8a218bbdd965b4c65cb5b"}, + {file = "redis_om-0.2.1-py3-none-any.whl", hash = "sha256:31313a3027a014608b3a4d44ecd1d3000c7d0fe3a25060db19b42225e636cd53"}, + {file = "redis_om-0.2.1.tar.gz", hash = "sha256:150c9cb5238d6003f35e9b6394aab30a0df35b00e955eb7dc508f4345e0a0ccc"}, ] [package.dependencies] click = ">=8.0.1,<9.0.0" hiredis = ">=2.2.3,<3.0.0" -more-itertools = ">=8.14,<11.0" -pydantic = ">=1.10.2,<2.5.0" +more-itertools = ">=8.14,<10.0" +pydantic = ">=1.10.2,<2.1.0" python-ulid = ">=1.0.3,<2.0.0" -redis = ">=3.5.3,<6.0.0" +redis = ">=3.5.3,<5.0.0" types-redis = ">=3.5.9,<5.0.0" typing-extensions = ">=4.4.0,<5.0.0" @@ -3087,101 +3700,101 @@ rpds-py = ">=0.7.0" [[package]] name = "regex" -version = "2024.4.28" +version = "2024.5.15" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.8" files = [ - {file = "regex-2024.4.28-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd196d056b40af073d95a2879678585f0b74ad35190fac04ca67954c582c6b61"}, - {file = "regex-2024.4.28-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8bb381f777351bd534462f63e1c6afb10a7caa9fa2a421ae22c26e796fe31b1f"}, - {file = "regex-2024.4.28-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:47af45b6153522733aa6e92543938e97a70ce0900649ba626cf5aad290b737b6"}, - {file = "regex-2024.4.28-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99d6a550425cc51c656331af0e2b1651e90eaaa23fb4acde577cf15068e2e20f"}, - {file = "regex-2024.4.28-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bf29304a8011feb58913c382902fde3395957a47645bf848eea695839aa101b7"}, - {file = "regex-2024.4.28-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:92da587eee39a52c91aebea8b850e4e4f095fe5928d415cb7ed656b3460ae79a"}, - {file = "regex-2024.4.28-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6277d426e2f31bdbacb377d17a7475e32b2d7d1f02faaecc48d8e370c6a3ff31"}, - {file = "regex-2024.4.28-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28e1f28d07220c0f3da0e8fcd5a115bbb53f8b55cecf9bec0c946eb9a059a94c"}, - {file = "regex-2024.4.28-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:aaa179975a64790c1f2701ac562b5eeb733946eeb036b5bcca05c8d928a62f10"}, - {file = "regex-2024.4.28-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6f435946b7bf7a1b438b4e6b149b947c837cb23c704e780c19ba3e6855dbbdd3"}, - {file = "regex-2024.4.28-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:19d6c11bf35a6ad077eb23852827f91c804eeb71ecb85db4ee1386825b9dc4db"}, - {file = "regex-2024.4.28-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:fdae0120cddc839eb8e3c15faa8ad541cc6d906d3eb24d82fb041cfe2807bc1e"}, - {file = "regex-2024.4.28-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e672cf9caaf669053121f1766d659a8813bd547edef6e009205378faf45c67b8"}, - {file = "regex-2024.4.28-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f57515750d07e14743db55d59759893fdb21d2668f39e549a7d6cad5d70f9fea"}, - {file = "regex-2024.4.28-cp310-cp310-win32.whl", hash = "sha256:a1409c4eccb6981c7baabc8888d3550df518add6e06fe74fa1d9312c1838652d"}, - {file = "regex-2024.4.28-cp310-cp310-win_amd64.whl", hash = "sha256:1f687a28640f763f23f8a9801fe9e1b37338bb1ca5d564ddd41619458f1f22d1"}, - {file = "regex-2024.4.28-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:84077821c85f222362b72fdc44f7a3a13587a013a45cf14534df1cbbdc9a6796"}, - {file = "regex-2024.4.28-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b45d4503de8f4f3dc02f1d28a9b039e5504a02cc18906cfe744c11def942e9eb"}, - {file = "regex-2024.4.28-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:457c2cd5a646dd4ed536c92b535d73548fb8e216ebee602aa9f48e068fc393f3"}, - {file = "regex-2024.4.28-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b51739ddfd013c6f657b55a508de8b9ea78b56d22b236052c3a85a675102dc6"}, - {file = "regex-2024.4.28-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:459226445c7d7454981c4c0ce0ad1a72e1e751c3e417f305722bbcee6697e06a"}, - {file = "regex-2024.4.28-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:670fa596984b08a4a769491cbdf22350431970d0112e03d7e4eeaecaafcd0fec"}, - {file = "regex-2024.4.28-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe00f4fe11c8a521b173e6324d862ee7ee3412bf7107570c9b564fe1119b56fb"}, - {file = "regex-2024.4.28-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:36f392dc7763fe7924575475736bddf9ab9f7a66b920932d0ea50c2ded2f5636"}, - {file = "regex-2024.4.28-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:23a412b7b1a7063f81a742463f38821097b6a37ce1e5b89dd8e871d14dbfd86b"}, - {file = "regex-2024.4.28-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f1d6e4b7b2ae3a6a9df53efbf199e4bfcff0959dbdb5fd9ced34d4407348e39a"}, - {file = "regex-2024.4.28-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:499334ad139557de97cbc4347ee921c0e2b5e9c0f009859e74f3f77918339257"}, - {file = "regex-2024.4.28-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:0940038bec2fe9e26b203d636c44d31dd8766abc1fe66262da6484bd82461ccf"}, - {file = "regex-2024.4.28-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:66372c2a01782c5fe8e04bff4a2a0121a9897e19223d9eab30c54c50b2ebeb7f"}, - {file = "regex-2024.4.28-cp311-cp311-win32.whl", hash = "sha256:c77d10ec3c1cf328b2f501ca32583625987ea0f23a0c2a49b37a39ee5c4c4630"}, - {file = "regex-2024.4.28-cp311-cp311-win_amd64.whl", hash = "sha256:fc0916c4295c64d6890a46e02d4482bb5ccf33bf1a824c0eaa9e83b148291f90"}, - {file = "regex-2024.4.28-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:08a1749f04fee2811c7617fdd46d2e46d09106fa8f475c884b65c01326eb15c5"}, - {file = "regex-2024.4.28-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b8eb28995771c087a73338f695a08c9abfdf723d185e57b97f6175c5051ff1ae"}, - {file = "regex-2024.4.28-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dd7ef715ccb8040954d44cfeff17e6b8e9f79c8019daae2fd30a8806ef5435c0"}, - {file = "regex-2024.4.28-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb0315a2b26fde4005a7c401707c5352df274460f2f85b209cf6024271373013"}, - {file = "regex-2024.4.28-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f2fc053228a6bd3a17a9b0a3f15c3ab3cf95727b00557e92e1cfe094b88cc662"}, - {file = "regex-2024.4.28-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7fe9739a686dc44733d52d6e4f7b9c77b285e49edf8570754b322bca6b85b4cc"}, - {file = "regex-2024.4.28-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74fcf77d979364f9b69fcf8200849ca29a374973dc193a7317698aa37d8b01c"}, - {file = "regex-2024.4.28-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:965fd0cf4694d76f6564896b422724ec7b959ef927a7cb187fc6b3f4e4f59833"}, - {file = "regex-2024.4.28-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:2fef0b38c34ae675fcbb1b5db760d40c3fc3612cfa186e9e50df5782cac02bcd"}, - {file = "regex-2024.4.28-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bc365ce25f6c7c5ed70e4bc674f9137f52b7dd6a125037f9132a7be52b8a252f"}, - {file = "regex-2024.4.28-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:ac69b394764bb857429b031d29d9604842bc4cbfd964d764b1af1868eeebc4f0"}, - {file = "regex-2024.4.28-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:144a1fc54765f5c5c36d6d4b073299832aa1ec6a746a6452c3ee7b46b3d3b11d"}, - {file = "regex-2024.4.28-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2630ca4e152c221072fd4a56d4622b5ada876f668ecd24d5ab62544ae6793ed6"}, - {file = "regex-2024.4.28-cp312-cp312-win32.whl", hash = "sha256:7f3502f03b4da52bbe8ba962621daa846f38489cae5c4a7b5d738f15f6443d17"}, - {file = "regex-2024.4.28-cp312-cp312-win_amd64.whl", hash = "sha256:0dd3f69098511e71880fb00f5815db9ed0ef62c05775395968299cb400aeab82"}, - {file = "regex-2024.4.28-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:374f690e1dd0dbdcddea4a5c9bdd97632cf656c69113f7cd6a361f2a67221cb6"}, - {file = "regex-2024.4.28-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:25f87ae6b96374db20f180eab083aafe419b194e96e4f282c40191e71980c666"}, - {file = "regex-2024.4.28-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5dbc1bcc7413eebe5f18196e22804a3be1bfdfc7e2afd415e12c068624d48247"}, - {file = "regex-2024.4.28-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f85151ec5a232335f1be022b09fbbe459042ea1951d8a48fef251223fc67eee1"}, - {file = "regex-2024.4.28-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:57ba112e5530530fd175ed550373eb263db4ca98b5f00694d73b18b9a02e7185"}, - {file = "regex-2024.4.28-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:224803b74aab56aa7be313f92a8d9911dcade37e5f167db62a738d0c85fdac4b"}, - {file = "regex-2024.4.28-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a54a047b607fd2d2d52a05e6ad294602f1e0dec2291152b745870afc47c1397"}, - {file = "regex-2024.4.28-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a2a512d623f1f2d01d881513af9fc6a7c46e5cfffb7dc50c38ce959f9246c94"}, - {file = "regex-2024.4.28-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c06bf3f38f0707592898428636cbb75d0a846651b053a1cf748763e3063a6925"}, - {file = "regex-2024.4.28-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1031a5e7b048ee371ab3653aad3030ecfad6ee9ecdc85f0242c57751a05b0ac4"}, - {file = "regex-2024.4.28-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d7a353ebfa7154c871a35caca7bfd8f9e18666829a1dc187115b80e35a29393e"}, - {file = "regex-2024.4.28-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:7e76b9cfbf5ced1aca15a0e5b6f229344d9b3123439ffce552b11faab0114a02"}, - {file = "regex-2024.4.28-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:5ce479ecc068bc2a74cb98dd8dba99e070d1b2f4a8371a7dfe631f85db70fe6e"}, - {file = "regex-2024.4.28-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7d77b6f63f806578c604dca209280e4c54f0fa9a8128bb8d2cc5fb6f99da4150"}, - {file = "regex-2024.4.28-cp38-cp38-win32.whl", hash = "sha256:d84308f097d7a513359757c69707ad339da799e53b7393819ec2ea36bc4beb58"}, - {file = "regex-2024.4.28-cp38-cp38-win_amd64.whl", hash = "sha256:2cc1b87bba1dd1a898e664a31012725e48af826bf3971e786c53e32e02adae6c"}, - {file = "regex-2024.4.28-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7413167c507a768eafb5424413c5b2f515c606be5bb4ef8c5dee43925aa5718b"}, - {file = "regex-2024.4.28-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:108e2dcf0b53a7c4ab8986842a8edcb8ab2e59919a74ff51c296772e8e74d0ae"}, - {file = "regex-2024.4.28-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f1c5742c31ba7d72f2dedf7968998730664b45e38827637e0f04a2ac7de2f5f1"}, - {file = "regex-2024.4.28-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecc6148228c9ae25ce403eade13a0961de1cb016bdb35c6eafd8e7b87ad028b1"}, - {file = "regex-2024.4.28-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7d893c8cf0e2429b823ef1a1d360a25950ed11f0e2a9df2b5198821832e1947"}, - {file = "regex-2024.4.28-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4290035b169578ffbbfa50d904d26bec16a94526071ebec3dadbebf67a26b25e"}, - {file = "regex-2024.4.28-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44a22ae1cfd82e4ffa2066eb3390777dc79468f866f0625261a93e44cdf6482b"}, - {file = "regex-2024.4.28-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd24fd140b69f0b0bcc9165c397e9b2e89ecbeda83303abf2a072609f60239e2"}, - {file = "regex-2024.4.28-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:39fb166d2196413bead229cd64a2ffd6ec78ebab83fff7d2701103cf9f4dfd26"}, - {file = "regex-2024.4.28-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9301cc6db4d83d2c0719f7fcda37229691745168bf6ae849bea2e85fc769175d"}, - {file = "regex-2024.4.28-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7c3d389e8d76a49923683123730c33e9553063d9041658f23897f0b396b2386f"}, - {file = "regex-2024.4.28-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:99ef6289b62042500d581170d06e17f5353b111a15aa6b25b05b91c6886df8fc"}, - {file = "regex-2024.4.28-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:b91d529b47798c016d4b4c1d06cc826ac40d196da54f0de3c519f5a297c5076a"}, - {file = "regex-2024.4.28-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:43548ad74ea50456e1c68d3c67fff3de64c6edb85bcd511d1136f9b5376fc9d1"}, - {file = "regex-2024.4.28-cp39-cp39-win32.whl", hash = "sha256:05d9b6578a22db7dedb4df81451f360395828b04f4513980b6bd7a1412c679cc"}, - {file = "regex-2024.4.28-cp39-cp39-win_amd64.whl", hash = "sha256:3986217ec830c2109875be740531feb8ddafe0dfa49767cdcd072ed7e8927962"}, - {file = "regex-2024.4.28.tar.gz", hash = "sha256:83ab366777ea45d58f72593adf35d36ca911ea8bd838483c1823b883a121b0e4"}, + {file = "regex-2024.5.15-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a81e3cfbae20378d75185171587cbf756015ccb14840702944f014e0d93ea09f"}, + {file = "regex-2024.5.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7b59138b219ffa8979013be7bc85bb60c6f7b7575df3d56dc1e403a438c7a3f6"}, + {file = "regex-2024.5.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0bd000c6e266927cb7a1bc39d55be95c4b4f65c5be53e659537537e019232b1"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5eaa7ddaf517aa095fa8da0b5015c44d03da83f5bd49c87961e3c997daed0de7"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba68168daedb2c0bab7fd7e00ced5ba90aebf91024dea3c88ad5063c2a562cca"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6e8d717bca3a6e2064fc3a08df5cbe366369f4b052dcd21b7416e6d71620dca1"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1337b7dbef9b2f71121cdbf1e97e40de33ff114801263b275aafd75303bd62b5"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9ebd0a36102fcad2f03696e8af4ae682793a5d30b46c647eaf280d6cfb32796"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9efa1a32ad3a3ea112224897cdaeb6aa00381627f567179c0314f7b65d354c62"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1595f2d10dff3d805e054ebdc41c124753631b6a471b976963c7b28543cf13b0"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b802512f3e1f480f41ab5f2cfc0e2f761f08a1f41092d6718868082fc0d27143"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a0981022dccabca811e8171f913de05720590c915b033b7e601f35ce4ea7019f"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:19068a6a79cf99a19ccefa44610491e9ca02c2be3305c7760d3831d38a467a6f"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1b5269484f6126eee5e687785e83c6b60aad7663dafe842b34691157e5083e53"}, + {file = "regex-2024.5.15-cp310-cp310-win32.whl", hash = "sha256:ada150c5adfa8fbcbf321c30c751dc67d2f12f15bd183ffe4ec7cde351d945b3"}, + {file = "regex-2024.5.15-cp310-cp310-win_amd64.whl", hash = "sha256:ac394ff680fc46b97487941f5e6ae49a9f30ea41c6c6804832063f14b2a5a145"}, + {file = "regex-2024.5.15-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f5b1dff3ad008dccf18e652283f5e5339d70bf8ba7c98bf848ac33db10f7bc7a"}, + {file = "regex-2024.5.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c6a2b494a76983df8e3d3feea9b9ffdd558b247e60b92f877f93a1ff43d26656"}, + {file = "regex-2024.5.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a32b96f15c8ab2e7d27655969a23895eb799de3665fa94349f3b2fbfd547236f"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10002e86e6068d9e1c91eae8295ef690f02f913c57db120b58fdd35a6bb1af35"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec54d5afa89c19c6dd8541a133be51ee1017a38b412b1321ccb8d6ddbeb4cf7d"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10e4ce0dca9ae7a66e6089bb29355d4432caed736acae36fef0fdd7879f0b0cb"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e507ff1e74373c4d3038195fdd2af30d297b4f0950eeda6f515ae3d84a1770f"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1f059a4d795e646e1c37665b9d06062c62d0e8cc3c511fe01315973a6542e40"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0721931ad5fe0dda45d07f9820b90b2148ccdd8e45bb9e9b42a146cb4f695649"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:833616ddc75ad595dee848ad984d067f2f31be645d603e4d158bba656bbf516c"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:287eb7f54fc81546346207c533ad3c2c51a8d61075127d7f6d79aaf96cdee890"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:19dfb1c504781a136a80ecd1fff9f16dddf5bb43cec6871778c8a907a085bb3d"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:119af6e56dce35e8dfb5222573b50c89e5508d94d55713c75126b753f834de68"}, + {file = "regex-2024.5.15-cp311-cp311-win32.whl", hash = "sha256:1c1c174d6ec38d6c8a7504087358ce9213d4332f6293a94fbf5249992ba54efa"}, + {file = "regex-2024.5.15-cp311-cp311-win_amd64.whl", hash = "sha256:9e717956dcfd656f5055cc70996ee2cc82ac5149517fc8e1b60261b907740201"}, + {file = "regex-2024.5.15-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:632b01153e5248c134007209b5c6348a544ce96c46005d8456de1d552455b014"}, + {file = "regex-2024.5.15-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e64198f6b856d48192bf921421fdd8ad8eb35e179086e99e99f711957ffedd6e"}, + {file = "regex-2024.5.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68811ab14087b2f6e0fc0c2bae9ad689ea3584cad6917fc57be6a48bbd012c49"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ec0c2fea1e886a19c3bee0cd19d862b3aa75dcdfb42ebe8ed30708df64687a"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d0c0c0003c10f54a591d220997dd27d953cd9ccc1a7294b40a4be5312be8797b"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2431b9e263af1953c55abbd3e2efca67ca80a3de8a0437cb58e2421f8184717a"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a605586358893b483976cffc1723fb0f83e526e8f14c6e6614e75919d9862cf"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:391d7f7f1e409d192dba8bcd42d3e4cf9e598f3979cdaed6ab11288da88cb9f2"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9ff11639a8d98969c863d4617595eb5425fd12f7c5ef6621a4b74b71ed8726d5"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4eee78a04e6c67e8391edd4dad3279828dd66ac4b79570ec998e2155d2e59fd5"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8fe45aa3f4aa57faabbc9cb46a93363edd6197cbc43523daea044e9ff2fea83e"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:d0a3d8d6acf0c78a1fff0e210d224b821081330b8524e3e2bc5a68ef6ab5803d"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c486b4106066d502495b3025a0a7251bf37ea9540433940a23419461ab9f2a80"}, + {file = "regex-2024.5.15-cp312-cp312-win32.whl", hash = "sha256:c49e15eac7c149f3670b3e27f1f28a2c1ddeccd3a2812cba953e01be2ab9b5fe"}, + {file = "regex-2024.5.15-cp312-cp312-win_amd64.whl", hash = "sha256:673b5a6da4557b975c6c90198588181029c60793835ce02f497ea817ff647cb2"}, + {file = "regex-2024.5.15-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:87e2a9c29e672fc65523fb47a90d429b70ef72b901b4e4b1bd42387caf0d6835"}, + {file = "regex-2024.5.15-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c3bea0ba8b73b71b37ac833a7f3fd53825924165da6a924aec78c13032f20850"}, + {file = "regex-2024.5.15-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bfc4f82cabe54f1e7f206fd3d30fda143f84a63fe7d64a81558d6e5f2e5aaba9"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5bb9425fe881d578aeca0b2b4b3d314ec88738706f66f219c194d67179337cb"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64c65783e96e563103d641760664125e91bd85d8e49566ee560ded4da0d3e704"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf2430df4148b08fb4324b848672514b1385ae3807651f3567871f130a728cc3"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5397de3219a8b08ae9540c48f602996aa6b0b65d5a61683e233af8605c42b0f2"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:455705d34b4154a80ead722f4f185b04c4237e8e8e33f265cd0798d0e44825fa"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b2b6f1b3bb6f640c1a92be3bbfbcb18657b125b99ecf141fb3310b5282c7d4ed"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:3ad070b823ca5890cab606c940522d05d3d22395d432f4aaaf9d5b1653e47ced"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5b5467acbfc153847d5adb21e21e29847bcb5870e65c94c9206d20eb4e99a384"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:e6662686aeb633ad65be2a42b4cb00178b3fbf7b91878f9446075c404ada552f"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:2b4c884767504c0e2401babe8b5b7aea9148680d2e157fa28f01529d1f7fcf67"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3cd7874d57f13bf70078f1ff02b8b0aa48d5b9ed25fc48547516c6aba36f5741"}, + {file = "regex-2024.5.15-cp38-cp38-win32.whl", hash = "sha256:e4682f5ba31f475d58884045c1a97a860a007d44938c4c0895f41d64481edbc9"}, + {file = "regex-2024.5.15-cp38-cp38-win_amd64.whl", hash = "sha256:d99ceffa25ac45d150e30bd9ed14ec6039f2aad0ffa6bb87a5936f5782fc1569"}, + {file = "regex-2024.5.15-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:13cdaf31bed30a1e1c2453ef6015aa0983e1366fad2667657dbcac7b02f67133"}, + {file = "regex-2024.5.15-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cac27dcaa821ca271855a32188aa61d12decb6fe45ffe3e722401fe61e323cd1"}, + {file = "regex-2024.5.15-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7dbe2467273b875ea2de38ded4eba86cbcbc9a1a6d0aa11dcf7bd2e67859c435"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64f18a9a3513a99c4bef0e3efd4c4a5b11228b48aa80743be822b71e132ae4f5"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d347a741ea871c2e278fde6c48f85136c96b8659b632fb57a7d1ce1872547600"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1878b8301ed011704aea4c806a3cadbd76f84dece1ec09cc9e4dc934cfa5d4da"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4babf07ad476aaf7830d77000874d7611704a7fcf68c9c2ad151f5d94ae4bfc4"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35cb514e137cb3488bce23352af3e12fb0dbedd1ee6e60da053c69fb1b29cc6c"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cdd09d47c0b2efee9378679f8510ee6955d329424c659ab3c5e3a6edea696294"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:72d7a99cd6b8f958e85fc6ca5b37c4303294954eac1376535b03c2a43eb72629"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:a094801d379ab20c2135529948cb84d417a2169b9bdceda2a36f5f10977ebc16"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c0c18345010870e58238790a6779a1219b4d97bd2e77e1140e8ee5d14df071aa"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:16093f563098448ff6b1fa68170e4acbef94e6b6a4e25e10eae8598bb1694b5d"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e38a7d4e8f633a33b4c7350fbd8bad3b70bf81439ac67ac38916c4a86b465456"}, + {file = "regex-2024.5.15-cp39-cp39-win32.whl", hash = "sha256:71a455a3c584a88f654b64feccc1e25876066c4f5ef26cd6dd711308aa538694"}, + {file = "regex-2024.5.15-cp39-cp39-win_amd64.whl", hash = "sha256:cab12877a9bdafde5500206d1020a584355a97884dfd388af3699e9137bf7388"}, + {file = "regex-2024.5.15.tar.gz", hash = "sha256:d3ee02d9e5f482cc8309134a91eeaacbdd2261ba111b0fef3748eeb4913e6a2c"}, ] [[package]] name = "requests" -version = "2.31.0" +version = "2.32.2" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, + {file = "requests-2.32.2-py3-none-any.whl", hash = "sha256:fc06670dd0ed212426dfeb94fc1b983d917c4f9847c863f313c9dfaaffb7c23c"}, + {file = "requests-2.32.2.tar.gz", hash = "sha256:dd951ff5ecf3e3b3aa26b40703ba77495dab41da839ae72ef3c8e5d8e2433289"}, ] [package.dependencies] @@ -3214,117 +3827,174 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "rpds-py" -version = "0.18.0" +version = "0.18.1" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.8" files = [ - {file = "rpds_py-0.18.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:5b4e7d8d6c9b2e8ee2d55c90b59c707ca59bc30058269b3db7b1f8df5763557e"}, - {file = "rpds_py-0.18.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c463ed05f9dfb9baebef68048aed8dcdc94411e4bf3d33a39ba97e271624f8f7"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01e36a39af54a30f28b73096dd39b6802eddd04c90dbe161c1b8dbe22353189f"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d62dec4976954a23d7f91f2f4530852b0c7608116c257833922a896101336c51"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd18772815d5f008fa03d2b9a681ae38d5ae9f0e599f7dda233c439fcaa00d40"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:923d39efa3cfb7279a0327e337a7958bff00cc447fd07a25cddb0a1cc9a6d2da"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39514da80f971362f9267c600b6d459bfbbc549cffc2cef8e47474fddc9b45b1"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a34d557a42aa28bd5c48a023c570219ba2593bcbbb8dc1b98d8cf5d529ab1434"}, - {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:93df1de2f7f7239dc9cc5a4a12408ee1598725036bd2dedadc14d94525192fc3"}, - {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:34b18ba135c687f4dac449aa5157d36e2cbb7c03cbea4ddbd88604e076aa836e"}, - {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c0b5dcf9193625afd8ecc92312d6ed78781c46ecbf39af9ad4681fc9f464af88"}, - {file = "rpds_py-0.18.0-cp310-none-win32.whl", hash = "sha256:c4325ff0442a12113a6379af66978c3fe562f846763287ef66bdc1d57925d337"}, - {file = "rpds_py-0.18.0-cp310-none-win_amd64.whl", hash = "sha256:7223a2a5fe0d217e60a60cdae28d6949140dde9c3bcc714063c5b463065e3d66"}, - {file = "rpds_py-0.18.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3a96e0c6a41dcdba3a0a581bbf6c44bb863f27c541547fb4b9711fd8cf0ffad4"}, - {file = "rpds_py-0.18.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30f43887bbae0d49113cbaab729a112251a940e9b274536613097ab8b4899cf6"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcb25daa9219b4cf3a0ab24b0eb9a5cc8949ed4dc72acb8fa16b7e1681aa3c58"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d68c93e381010662ab873fea609bf6c0f428b6d0bb00f2c6939782e0818d37bf"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b34b7aa8b261c1dbf7720b5d6f01f38243e9b9daf7e6b8bc1fd4657000062f2c"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e6d75ab12b0bbab7215e5d40f1e5b738aa539598db27ef83b2ec46747df90e1"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b8612cd233543a3781bc659c731b9d607de65890085098986dfd573fc2befe5"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aec493917dd45e3c69d00a8874e7cbed844efd935595ef78a0f25f14312e33c6"}, - {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:661d25cbffaf8cc42e971dd570d87cb29a665f49f4abe1f9e76be9a5182c4688"}, - {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1df3659d26f539ac74fb3b0c481cdf9d725386e3552c6fa2974f4d33d78e544b"}, - {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a1ce3ba137ed54f83e56fb983a5859a27d43a40188ba798993812fed73c70836"}, - {file = "rpds_py-0.18.0-cp311-none-win32.whl", hash = "sha256:69e64831e22a6b377772e7fb337533c365085b31619005802a79242fee620bc1"}, - {file = "rpds_py-0.18.0-cp311-none-win_amd64.whl", hash = "sha256:998e33ad22dc7ec7e030b3df701c43630b5bc0d8fbc2267653577e3fec279afa"}, - {file = "rpds_py-0.18.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7f2facbd386dd60cbbf1a794181e6aa0bd429bd78bfdf775436020172e2a23f0"}, - {file = "rpds_py-0.18.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1d9a5be316c15ffb2b3c405c4ff14448c36b4435be062a7f578ccd8b01f0c4d8"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd5bf1af8efe569654bbef5a3e0a56eca45f87cfcffab31dd8dde70da5982475"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5417558f6887e9b6b65b4527232553c139b57ec42c64570569b155262ac0754f"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:56a737287efecafc16f6d067c2ea0117abadcd078d58721f967952db329a3e5c"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8f03bccbd8586e9dd37219bce4d4e0d3ab492e6b3b533e973fa08a112cb2ffc9"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4457a94da0d5c53dc4b3e4de1158bdab077db23c53232f37a3cb7afdb053a4e3"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0ab39c1ba9023914297dd88ec3b3b3c3f33671baeb6acf82ad7ce883f6e8e157"}, - {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9d54553c1136b50fd12cc17e5b11ad07374c316df307e4cfd6441bea5fb68496"}, - {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0af039631b6de0397ab2ba16eaf2872e9f8fca391b44d3d8cac317860a700a3f"}, - {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:84ffab12db93b5f6bad84c712c92060a2d321b35c3c9960b43d08d0f639d60d7"}, - {file = "rpds_py-0.18.0-cp312-none-win32.whl", hash = "sha256:685537e07897f173abcf67258bee3c05c374fa6fff89d4c7e42fb391b0605e98"}, - {file = "rpds_py-0.18.0-cp312-none-win_amd64.whl", hash = "sha256:e003b002ec72c8d5a3e3da2989c7d6065b47d9eaa70cd8808b5384fbb970f4ec"}, - {file = "rpds_py-0.18.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:08f9ad53c3f31dfb4baa00da22f1e862900f45908383c062c27628754af2e88e"}, - {file = "rpds_py-0.18.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c0013fe6b46aa496a6749c77e00a3eb07952832ad6166bd481c74bda0dcb6d58"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e32a92116d4f2a80b629778280103d2a510a5b3f6314ceccd6e38006b5e92dcb"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e541ec6f2ec456934fd279a3120f856cd0aedd209fc3852eca563f81738f6861"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bed88b9a458e354014d662d47e7a5baafd7ff81c780fd91584a10d6ec842cb73"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2644e47de560eb7bd55c20fc59f6daa04682655c58d08185a9b95c1970fa1e07"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e8916ae4c720529e18afa0b879473049e95949bf97042e938530e072fde061d"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:465a3eb5659338cf2a9243e50ad9b2296fa15061736d6e26240e713522b6235c"}, - {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ea7d4a99f3b38c37eac212dbd6ec42b7a5ec51e2c74b5d3223e43c811609e65f"}, - {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:67071a6171e92b6da534b8ae326505f7c18022c6f19072a81dcf40db2638767c"}, - {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:41ef53e7c58aa4ef281da975f62c258950f54b76ec8e45941e93a3d1d8580594"}, - {file = "rpds_py-0.18.0-cp38-none-win32.whl", hash = "sha256:fdea4952db2793c4ad0bdccd27c1d8fdd1423a92f04598bc39425bcc2b8ee46e"}, - {file = "rpds_py-0.18.0-cp38-none-win_amd64.whl", hash = "sha256:7cd863afe7336c62ec78d7d1349a2f34c007a3cc6c2369d667c65aeec412a5b1"}, - {file = "rpds_py-0.18.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:5307def11a35f5ae4581a0b658b0af8178c65c530e94893345bebf41cc139d33"}, - {file = "rpds_py-0.18.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:77f195baa60a54ef9d2de16fbbfd3ff8b04edc0c0140a761b56c267ac11aa467"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39f5441553f1c2aed4de4377178ad8ff8f9d733723d6c66d983d75341de265ab"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a00312dea9310d4cb7dbd7787e722d2e86a95c2db92fbd7d0155f97127bcb40"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f2fc11e8fe034ee3c34d316d0ad8808f45bc3b9ce5857ff29d513f3ff2923a1"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:586f8204935b9ec884500498ccc91aa869fc652c40c093bd9e1471fbcc25c022"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddc2f4dfd396c7bfa18e6ce371cba60e4cf9d2e5cdb71376aa2da264605b60b9"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ddcba87675b6d509139d1b521e0c8250e967e63b5909a7e8f8944d0f90ff36f"}, - {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7bd339195d84439cbe5771546fe8a4e8a7a045417d8f9de9a368c434e42a721e"}, - {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:d7c36232a90d4755b720fbd76739d8891732b18cf240a9c645d75f00639a9024"}, - {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6b0817e34942b2ca527b0e9298373e7cc75f429e8da2055607f4931fded23e20"}, - {file = "rpds_py-0.18.0-cp39-none-win32.whl", hash = "sha256:99f70b740dc04d09e6b2699b675874367885217a2e9f782bdf5395632ac663b7"}, - {file = "rpds_py-0.18.0-cp39-none-win_amd64.whl", hash = "sha256:6ef687afab047554a2d366e112dd187b62d261d49eb79b77e386f94644363294"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ad36cfb355e24f1bd37cac88c112cd7730873f20fb0bdaf8ba59eedf8216079f"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:36b3ee798c58ace201289024b52788161e1ea133e4ac93fba7d49da5fec0ef9e"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8a2f084546cc59ea99fda8e070be2fd140c3092dc11524a71aa8f0f3d5a55ca"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e4461d0f003a0aa9be2bdd1b798a041f177189c1a0f7619fe8c95ad08d9a45d7"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8db715ebe3bb7d86d77ac1826f7d67ec11a70dbd2376b7cc214199360517b641"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:793968759cd0d96cac1e367afd70c235867831983f876a53389ad869b043c948"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66e6a3af5a75363d2c9a48b07cb27c4ea542938b1a2e93b15a503cdfa8490795"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6ef0befbb5d79cf32d0266f5cff01545602344eda89480e1dd88aca964260b18"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d4acf42190d449d5e89654d5c1ed3a4f17925eec71f05e2a41414689cda02d1"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:a5f446dd5055667aabaee78487f2b5ab72e244f9bc0b2ffebfeec79051679984"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:9dbbeb27f4e70bfd9eec1be5477517365afe05a9b2c441a0b21929ee61048124"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:22806714311a69fd0af9b35b7be97c18a0fc2826e6827dbb3a8c94eac6cf7eeb"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:b34ae4636dfc4e76a438ab826a0d1eed2589ca7d9a1b2d5bb546978ac6485461"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c8370641f1a7f0e0669ddccca22f1da893cef7628396431eb445d46d893e5cd"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c8362467a0fdeccd47935f22c256bec5e6abe543bf0d66e3d3d57a8fb5731863"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11a8c85ef4a07a7638180bf04fe189d12757c696eb41f310d2426895356dcf05"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b316144e85316da2723f9d8dc75bada12fa58489a527091fa1d5a612643d1a0e"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf1ea2e34868f6fbf070e1af291c8180480310173de0b0c43fc38a02929fc0e3"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e546e768d08ad55b20b11dbb78a745151acbd938f8f00d0cfbabe8b0199b9880"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4901165d170a5fde6f589acb90a6b33629ad1ec976d4529e769c6f3d885e3e80"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:618a3d6cae6ef8ec88bb76dd80b83cfe415ad4f1d942ca2a903bf6b6ff97a2da"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ed4eb745efbff0a8e9587d22a84be94a5eb7d2d99c02dacf7bd0911713ed14dd"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c81e5f372cd0dc5dc4809553d34f832f60a46034a5f187756d9b90586c2c307"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:43fbac5f22e25bee1d482c97474f930a353542855f05c1161fd804c9dc74a09d"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d7faa6f14017c0b1e69f5e2c357b998731ea75a442ab3841c0dbbbfe902d2c4"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:08231ac30a842bd04daabc4d71fddd7e6d26189406d5a69535638e4dcb88fe76"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:044a3e61a7c2dafacae99d1e722cc2d4c05280790ec5a05031b3876809d89a5c"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3f26b5bd1079acdb0c7a5645e350fe54d16b17bfc5e71f371c449383d3342e17"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:482103aed1dfe2f3b71a58eff35ba105289b8d862551ea576bd15479aba01f66"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1374f4129f9bcca53a1bba0bb86bf78325a0374577cf7e9e4cd046b1e6f20e24"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:635dc434ff724b178cb192c70016cc0ad25a275228f749ee0daf0eddbc8183b1"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:bc362ee4e314870a70f4ae88772d72d877246537d9f8cb8f7eacf10884862432"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:4832d7d380477521a8c1644bbab6588dfedea5e30a7d967b5fb75977c45fd77f"}, - {file = "rpds_py-0.18.0.tar.gz", hash = "sha256:42821446ee7a76f5d9f71f9e33a4fb2ffd724bb3e7f93386150b61a43115788d"}, + {file = "rpds_py-0.18.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:d31dea506d718693b6b2cffc0648a8929bdc51c70a311b2770f09611caa10d53"}, + {file = "rpds_py-0.18.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:732672fbc449bab754e0b15356c077cc31566df874964d4801ab14f71951ea80"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a98a1f0552b5f227a3d6422dbd61bc6f30db170939bd87ed14f3c339aa6c7c9"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f1944ce16401aad1e3f7d312247b3d5de7981f634dc9dfe90da72b87d37887d"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38e14fb4e370885c4ecd734f093a2225ee52dc384b86fa55fe3f74638b2cfb09"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08d74b184f9ab6289b87b19fe6a6d1a97fbfea84b8a3e745e87a5de3029bf944"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d70129cef4a8d979caa37e7fe957202e7eee8ea02c5e16455bc9808a59c6b2f0"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ce0bb20e3a11bd04461324a6a798af34d503f8d6f1aa3d2aa8901ceaf039176d"}, + {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81c5196a790032e0fc2464c0b4ab95f8610f96f1f2fa3d4deacce6a79852da60"}, + {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f3027be483868c99b4985fda802a57a67fdf30c5d9a50338d9db646d590198da"}, + {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d44607f98caa2961bab4fa3c4309724b185b464cdc3ba6f3d7340bac3ec97cc1"}, + {file = "rpds_py-0.18.1-cp310-none-win32.whl", hash = "sha256:c273e795e7a0f1fddd46e1e3cb8be15634c29ae8ff31c196debb620e1edb9333"}, + {file = "rpds_py-0.18.1-cp310-none-win_amd64.whl", hash = "sha256:8352f48d511de5f973e4f2f9412736d7dea76c69faa6d36bcf885b50c758ab9a"}, + {file = "rpds_py-0.18.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6b5ff7e1d63a8281654b5e2896d7f08799378e594f09cf3674e832ecaf396ce8"}, + {file = "rpds_py-0.18.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8927638a4d4137a289e41d0fd631551e89fa346d6dbcfc31ad627557d03ceb6d"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:154bf5c93d79558b44e5b50cc354aa0459e518e83677791e6adb0b039b7aa6a7"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07f2139741e5deb2c5154a7b9629bc5aa48c766b643c1a6750d16f865a82c5fc"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c7672e9fba7425f79019db9945b16e308ed8bc89348c23d955c8c0540da0a07"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:489bdfe1abd0406eba6b3bb4fdc87c7fa40f1031de073d0cfb744634cc8fa261"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c20f05e8e3d4fc76875fc9cb8cf24b90a63f5a1b4c5b9273f0e8225e169b100"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:967342e045564cef76dfcf1edb700b1e20838d83b1aa02ab313e6a497cf923b8"}, + {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2cc7c1a47f3a63282ab0f422d90ddac4aa3034e39fc66a559ab93041e6505da7"}, + {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f7afbfee1157e0f9376c00bb232e80a60e59ed716e3211a80cb8506550671e6e"}, + {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9e6934d70dc50f9f8ea47081ceafdec09245fd9f6032669c3b45705dea096b88"}, + {file = "rpds_py-0.18.1-cp311-none-win32.whl", hash = "sha256:c69882964516dc143083d3795cb508e806b09fc3800fd0d4cddc1df6c36e76bb"}, + {file = "rpds_py-0.18.1-cp311-none-win_amd64.whl", hash = "sha256:70a838f7754483bcdc830444952fd89645569e7452e3226de4a613a4c1793fb2"}, + {file = "rpds_py-0.18.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3dd3cd86e1db5aadd334e011eba4e29d37a104b403e8ca24dcd6703c68ca55b3"}, + {file = "rpds_py-0.18.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:05f3d615099bd9b13ecf2fc9cf2d839ad3f20239c678f461c753e93755d629ee"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35b2b771b13eee8729a5049c976197ff58a27a3829c018a04341bcf1ae409b2b"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ee17cd26b97d537af8f33635ef38be873073d516fd425e80559f4585a7b90c43"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b646bf655b135ccf4522ed43d6902af37d3f5dbcf0da66c769a2b3938b9d8184"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19ba472b9606c36716062c023afa2484d1e4220548751bda14f725a7de17b4f6"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e30ac5e329098903262dc5bdd7e2086e0256aa762cc8b744f9e7bf2a427d3f8"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d58ad6317d188c43750cb76e9deacf6051d0f884d87dc6518e0280438648a9ac"}, + {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e1735502458621921cee039c47318cb90b51d532c2766593be6207eec53e5c4c"}, + {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f5bab211605d91db0e2995a17b5c6ee5edec1270e46223e513eaa20da20076ac"}, + {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2fc24a329a717f9e2448f8cd1f960f9dac4e45b6224d60734edeb67499bab03a"}, + {file = "rpds_py-0.18.1-cp312-none-win32.whl", hash = "sha256:1805d5901779662d599d0e2e4159d8a82c0b05faa86ef9222bf974572286b2b6"}, + {file = "rpds_py-0.18.1-cp312-none-win_amd64.whl", hash = "sha256:720edcb916df872d80f80a1cc5ea9058300b97721efda8651efcd938a9c70a72"}, + {file = "rpds_py-0.18.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:c827576e2fa017a081346dce87d532a5310241648eb3700af9a571a6e9fc7e74"}, + {file = "rpds_py-0.18.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:aa3679e751408d75a0b4d8d26d6647b6d9326f5e35c00a7ccd82b78ef64f65f8"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0abeee75434e2ee2d142d650d1e54ac1f8b01e6e6abdde8ffd6eeac6e9c38e20"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed402d6153c5d519a0faf1bb69898e97fb31613b49da27a84a13935ea9164dfc"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:338dee44b0cef8b70fd2ef54b4e09bb1b97fc6c3a58fea5db6cc083fd9fc2724"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7750569d9526199c5b97e5a9f8d96a13300950d910cf04a861d96f4273d5b104"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:607345bd5912aacc0c5a63d45a1f73fef29e697884f7e861094e443187c02be5"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:207c82978115baa1fd8d706d720b4a4d2b0913df1c78c85ba73fe6c5804505f0"}, + {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6d1e42d2735d437e7e80bab4d78eb2e459af48c0a46e686ea35f690b93db792d"}, + {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5463c47c08630007dc0fe99fb480ea4f34a89712410592380425a9b4e1611d8e"}, + {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:06d218939e1bf2ca50e6b0ec700ffe755e5216a8230ab3e87c059ebb4ea06afc"}, + {file = "rpds_py-0.18.1-cp38-none-win32.whl", hash = "sha256:312fe69b4fe1ffbe76520a7676b1e5ac06ddf7826d764cc10265c3b53f96dbe9"}, + {file = "rpds_py-0.18.1-cp38-none-win_amd64.whl", hash = "sha256:9437ca26784120a279f3137ee080b0e717012c42921eb07861b412340f85bae2"}, + {file = "rpds_py-0.18.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:19e515b78c3fc1039dd7da0a33c28c3154458f947f4dc198d3c72db2b6b5dc93"}, + {file = "rpds_py-0.18.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7b28c5b066bca9a4eb4e2f2663012debe680f097979d880657f00e1c30875a0"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:673fdbbf668dd958eff750e500495ef3f611e2ecc209464f661bc82e9838991e"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d960de62227635d2e61068f42a6cb6aae91a7fe00fca0e3aeed17667c8a34611"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:352a88dc7892f1da66b6027af06a2e7e5d53fe05924cc2cfc56495b586a10b72"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e0ee01ad8260184db21468a6e1c37afa0529acc12c3a697ee498d3c2c4dcaf3"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4c39ad2f512b4041343ea3c7894339e4ca7839ac38ca83d68a832fc8b3748ab"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aaa71ee43a703c321906813bb252f69524f02aa05bf4eec85f0c41d5d62d0f4c"}, + {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6cd8098517c64a85e790657e7b1e509b9fe07487fd358e19431cb120f7d96338"}, + {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:4adec039b8e2928983f885c53b7cc4cda8965b62b6596501a0308d2703f8af1b"}, + {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:32b7daaa3e9389db3695964ce8e566e3413b0c43e3394c05e4b243a4cd7bef26"}, + {file = "rpds_py-0.18.1-cp39-none-win32.whl", hash = "sha256:2625f03b105328729f9450c8badda34d5243231eef6535f80064d57035738360"}, + {file = "rpds_py-0.18.1-cp39-none-win_amd64.whl", hash = "sha256:bf18932d0003c8c4d51a39f244231986ab23ee057d235a12b2684ea26a353590"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cbfbea39ba64f5e53ae2915de36f130588bba71245b418060ec3330ebf85678e"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:a3d456ff2a6a4d2adcdf3c1c960a36f4fd2fec6e3b4902a42a384d17cf4e7a65"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7700936ef9d006b7ef605dc53aa364da2de5a3aa65516a1f3ce73bf82ecfc7ae"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:51584acc5916212e1bf45edd17f3a6b05fe0cbb40482d25e619f824dccb679de"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:942695a206a58d2575033ff1e42b12b2aece98d6003c6bc739fbf33d1773b12f"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b906b5f58892813e5ba5c6056d6a5ad08f358ba49f046d910ad992196ea61397"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6f8e3fecca256fefc91bb6765a693d96692459d7d4c644660a9fff32e517843"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7732770412bab81c5a9f6d20aeb60ae943a9b36dcd990d876a773526468e7163"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:bd1105b50ede37461c1d51b9698c4f4be6e13e69a908ab7751e3807985fc0346"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:618916f5535784960f3ecf8111581f4ad31d347c3de66d02e728de460a46303c"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:17c6d2155e2423f7e79e3bb18151c686d40db42d8645e7977442170c360194d4"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c4c4c3f878df21faf5fac86eda32671c27889e13570645a9eea0a1abdd50922"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:fab6ce90574645a0d6c58890e9bcaac8d94dff54fb51c69e5522a7358b80ab64"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:531796fb842b53f2695e94dc338929e9f9dbf473b64710c28af5a160b2a8927d"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:740884bc62a5e2bbb31e584f5d23b32320fd75d79f916f15a788d527a5e83644"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:998125738de0158f088aef3cb264a34251908dd2e5d9966774fdab7402edfab7"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e2be6e9dd4111d5b31ba3b74d17da54a8319d8168890fbaea4b9e5c3de630ae5"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0cee71bc618cd93716f3c1bf56653740d2d13ddbd47673efa8bf41435a60daa"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2c3caec4ec5cd1d18e5dd6ae5194d24ed12785212a90b37f5f7f06b8bedd7139"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:27bba383e8c5231cd559affe169ca0b96ec78d39909ffd817f28b166d7ddd4d8"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:a888e8bdb45916234b99da2d859566f1e8a1d2275a801bb8e4a9644e3c7e7909"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6031b25fb1b06327b43d841f33842b383beba399884f8228a6bb3df3088485ff"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48c2faaa8adfacefcbfdb5f2e2e7bdad081e5ace8d182e5f4ade971f128e6bb3"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:d85164315bd68c0806768dc6bb0429c6f95c354f87485ee3593c4f6b14def2bd"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6afd80f6c79893cfc0574956f78a0add8c76e3696f2d6a15bca2c66c415cf2d4"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa242ac1ff583e4ec7771141606aafc92b361cd90a05c30d93e343a0c2d82a89"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21be4770ff4e08698e1e8e0bce06edb6ea0626e7c8f560bc08222880aca6a6f"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c45a639e93a0c5d4b788b2613bd637468edd62f8f95ebc6fcc303d58ab3f0a8"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:910e71711d1055b2768181efa0a17537b2622afeb0424116619817007f8a2b10"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b9bb1f182a97880f6078283b3505a707057c42bf55d8fca604f70dedfdc0772a"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d54f74f40b1f7aaa595a02ff42ef38ca654b1469bef7d52867da474243cc633"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:8d2e182c9ee01135e11e9676e9a62dfad791a7a467738f06726872374a83db49"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:636a15acc588f70fda1661234761f9ed9ad79ebed3f2125d44be0862708b666e"}, + {file = "rpds_py-0.18.1.tar.gz", hash = "sha256:dc48b479d540770c811fbd1eb9ba2bb66951863e448efec2e2c102625328e92f"}, +] + +[[package]] +name = "rsa" +version = "4.9" +description = "Pure-Python RSA implementation" +optional = true +python-versions = ">=3.6,<4" +files = [ + {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, + {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"}, +] + +[package.dependencies] +pyasn1 = ">=0.1.3" + +[[package]] +name = "ruff" +version = "0.4.5" +description = "An extremely fast Python linter and code formatter, written in Rust." +optional = false +python-versions = ">=3.7" +files = [ + {file = "ruff-0.4.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:8f58e615dec58b1a6b291769b559e12fdffb53cc4187160a2fc83250eaf54e96"}, + {file = "ruff-0.4.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:84dd157474e16e3a82745d2afa1016c17d27cb5d52b12e3d45d418bcc6d49264"}, + {file = "ruff-0.4.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25f483ad9d50b00e7fd577f6d0305aa18494c6af139bce7319c68a17180087f4"}, + {file = "ruff-0.4.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:63fde3bf6f3ad4e990357af1d30e8ba2730860a954ea9282c95fc0846f5f64af"}, + {file = "ruff-0.4.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78e3ba4620dee27f76bbcad97067766026c918ba0f2d035c2fc25cbdd04d9c97"}, + {file = "ruff-0.4.5-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:441dab55c568e38d02bbda68a926a3d0b54f5510095c9de7f95e47a39e0168aa"}, + {file = "ruff-0.4.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1169e47e9c4136c997f08f9857ae889d614c5035d87d38fda9b44b4338909cdf"}, + {file = "ruff-0.4.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:755ac9ac2598a941512fc36a9070a13c88d72ff874a9781493eb237ab02d75df"}, + {file = "ruff-0.4.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f4b02a65985be2b34b170025a8b92449088ce61e33e69956ce4d316c0fe7cce0"}, + {file = "ruff-0.4.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:75a426506a183d9201e7e5664de3f6b414ad3850d7625764106f7b6d0486f0a1"}, + {file = "ruff-0.4.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:6e1b139b45e2911419044237d90b60e472f57285950e1492c757dfc88259bb06"}, + {file = "ruff-0.4.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:a6f29a8221d2e3d85ff0c7b4371c0e37b39c87732c969b4d90f3dad2e721c5b1"}, + {file = "ruff-0.4.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:d6ef817124d72b54cc923f3444828ba24fa45c3164bc9e8f1813db2f3d3a8a11"}, + {file = "ruff-0.4.5-py3-none-win32.whl", hash = "sha256:aed8166c18b1a169a5d3ec28a49b43340949e400665555b51ee06f22813ef062"}, + {file = "ruff-0.4.5-py3-none-win_amd64.whl", hash = "sha256:b0b03c619d2b4350b4a27e34fd2ac64d0dabe1afbf43de57d0f9d8a05ecffa45"}, + {file = "ruff-0.4.5-py3-none-win_arm64.whl", hash = "sha256:9d15de3425f53161b3f5a5658d4522e4eee5ea002bf2ac7aa380743dd9ad5fba"}, + {file = "ruff-0.4.5.tar.gz", hash = "sha256:286eabd47e7d4d521d199cab84deca135557e6d1e0f0d01c29e757c3cb151b54"}, +] + +[[package]] +name = "s3transfer" +version = "0.10.1" +description = "An Amazon S3 Transfer Manager" +optional = true +python-versions = ">= 3.8" +files = [ + {file = "s3transfer-0.10.1-py3-none-any.whl", hash = "sha256:ceb252b11bcf87080fb7850a224fb6e05c8a776bab8f2b64b7f25b969464839d"}, + {file = "s3transfer-0.10.1.tar.gz", hash = "sha256:5683916b4c724f799e600f41dd9e10a9ff19871bf87623cc8f491cb4f5fa0a19"}, ] +[package.dependencies] +botocore = ">=1.33.2,<2.0a.0" + +[package.extras] +crt = ["botocore[crt] (>=1.33.2,<2.0a.0)"] + [[package]] name = "safetensors" version = "0.4.3" description = "" -optional = false +optional = true python-versions = ">=3.7" files = [ {file = "safetensors-0.4.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:dcf5705cab159ce0130cd56057f5f3425023c407e170bca60b4868048bae64fd"}, @@ -3444,36 +4114,36 @@ torch = ["safetensors[numpy]", "torch (>=1.10)"] [[package]] name = "scipy" -version = "1.13.0" +version = "1.13.1" description = "Fundamental algorithms for scientific computing in Python" -optional = false +optional = true python-versions = ">=3.9" files = [ - {file = "scipy-1.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ba419578ab343a4e0a77c0ef82f088238a93eef141b2b8017e46149776dfad4d"}, - {file = "scipy-1.13.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:22789b56a999265431c417d462e5b7f2b487e831ca7bef5edeb56efe4c93f86e"}, - {file = "scipy-1.13.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05f1432ba070e90d42d7fd836462c50bf98bd08bed0aa616c359eed8a04e3922"}, - {file = "scipy-1.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8434f6f3fa49f631fae84afee424e2483289dfc30a47755b4b4e6b07b2633a4"}, - {file = "scipy-1.13.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:dcbb9ea49b0167de4167c40eeee6e167caeef11effb0670b554d10b1e693a8b9"}, - {file = "scipy-1.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:1d2f7bb14c178f8b13ebae93f67e42b0a6b0fc50eba1cd8021c9b6e08e8fb1cd"}, - {file = "scipy-1.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0fbcf8abaf5aa2dc8d6400566c1a727aed338b5fe880cde64907596a89d576fa"}, - {file = "scipy-1.13.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5e4a756355522eb60fcd61f8372ac2549073c8788f6114449b37e9e8104f15a5"}, - {file = "scipy-1.13.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5acd8e1dbd8dbe38d0004b1497019b2dbbc3d70691e65d69615f8a7292865d7"}, - {file = "scipy-1.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ff7dad5d24a8045d836671e082a490848e8639cabb3dbdacb29f943a678683d"}, - {file = "scipy-1.13.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4dca18c3ffee287ddd3bc8f1dabaf45f5305c5afc9f8ab9cbfab855e70b2df5c"}, - {file = "scipy-1.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:a2f471de4d01200718b2b8927f7d76b5d9bde18047ea0fa8bd15c5ba3f26a1d6"}, - {file = "scipy-1.13.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d0de696f589681c2802f9090fff730c218f7c51ff49bf252b6a97ec4a5d19e8b"}, - {file = "scipy-1.13.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:b2a3ff461ec4756b7e8e42e1c681077349a038f0686132d623fa404c0bee2551"}, - {file = "scipy-1.13.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bf9fe63e7a4bf01d3645b13ff2aa6dea023d38993f42aaac81a18b1bda7a82a"}, - {file = "scipy-1.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e7626dfd91cdea5714f343ce1176b6c4745155d234f1033584154f60ef1ff42"}, - {file = "scipy-1.13.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:109d391d720fcebf2fbe008621952b08e52907cf4c8c7efc7376822151820820"}, - {file = "scipy-1.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:8930ae3ea371d6b91c203b1032b9600d69c568e537b7988a3073dfe4d4774f21"}, - {file = "scipy-1.13.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5407708195cb38d70fd2d6bb04b1b9dd5c92297d86e9f9daae1576bd9e06f602"}, - {file = "scipy-1.13.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:ac38c4c92951ac0f729c4c48c9e13eb3675d9986cc0c83943784d7390d540c78"}, - {file = "scipy-1.13.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09c74543c4fbeb67af6ce457f6a6a28e5d3739a87f62412e4a16e46f164f0ae5"}, - {file = "scipy-1.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28e286bf9ac422d6beb559bc61312c348ca9b0f0dae0d7c5afde7f722d6ea13d"}, - {file = "scipy-1.13.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:33fde20efc380bd23a78a4d26d59fc8704e9b5fd9b08841693eb46716ba13d86"}, - {file = "scipy-1.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:45c08bec71d3546d606989ba6e7daa6f0992918171e2a6f7fbedfa7361c2de1e"}, - {file = "scipy-1.13.0.tar.gz", hash = "sha256:58569af537ea29d3f78e5abd18398459f195546bb3be23d16677fb26616cc11e"}, + {file = "scipy-1.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:20335853b85e9a49ff7572ab453794298bcf0354d8068c5f6775a0eabf350aca"}, + {file = "scipy-1.13.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:d605e9c23906d1994f55ace80e0125c587f96c020037ea6aa98d01b4bd2e222f"}, + {file = "scipy-1.13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cfa31f1def5c819b19ecc3a8b52d28ffdcc7ed52bb20c9a7589669dd3c250989"}, + {file = "scipy-1.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26264b282b9da0952a024ae34710c2aff7d27480ee91a2e82b7b7073c24722f"}, + {file = "scipy-1.13.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:eccfa1906eacc02de42d70ef4aecea45415f5be17e72b61bafcfd329bdc52e94"}, + {file = "scipy-1.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:2831f0dc9c5ea9edd6e51e6e769b655f08ec6db6e2e10f86ef39bd32eb11da54"}, + {file = "scipy-1.13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:27e52b09c0d3a1d5b63e1105f24177e544a222b43611aaf5bc44d4a0979e32f9"}, + {file = "scipy-1.13.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:54f430b00f0133e2224c3ba42b805bfd0086fe488835effa33fa291561932326"}, + {file = "scipy-1.13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e89369d27f9e7b0884ae559a3a956e77c02114cc60a6058b4e5011572eea9299"}, + {file = "scipy-1.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a78b4b3345f1b6f68a763c6e25c0c9a23a9fd0f39f5f3d200efe8feda560a5fa"}, + {file = "scipy-1.13.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:45484bee6d65633752c490404513b9ef02475b4284c4cfab0ef946def50b3f59"}, + {file = "scipy-1.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:5713f62f781eebd8d597eb3f88b8bf9274e79eeabf63afb4a737abc6c84ad37b"}, + {file = "scipy-1.13.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5d72782f39716b2b3509cd7c33cdc08c96f2f4d2b06d51e52fb45a19ca0c86a1"}, + {file = "scipy-1.13.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:017367484ce5498445aade74b1d5ab377acdc65e27095155e448c88497755a5d"}, + {file = "scipy-1.13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:949ae67db5fa78a86e8fa644b9a6b07252f449dcf74247108c50e1d20d2b4627"}, + {file = "scipy-1.13.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de3ade0e53bc1f21358aa74ff4830235d716211d7d077e340c7349bc3542e884"}, + {file = "scipy-1.13.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2ac65fb503dad64218c228e2dc2d0a0193f7904747db43014645ae139c8fad16"}, + {file = "scipy-1.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:cdd7dacfb95fea358916410ec61bbc20440f7860333aee6d882bb8046264e949"}, + {file = "scipy-1.13.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:436bbb42a94a8aeef855d755ce5a465479c721e9d684de76bf61a62e7c2b81d5"}, + {file = "scipy-1.13.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:8335549ebbca860c52bf3d02f80784e91a004b71b059e3eea9678ba994796a24"}, + {file = "scipy-1.13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d533654b7d221a6a97304ab63c41c96473ff04459e404b83275b60aa8f4b7004"}, + {file = "scipy-1.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:637e98dcf185ba7f8e663e122ebf908c4702420477ae52a04f9908707456ba4d"}, + {file = "scipy-1.13.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a014c2b3697bde71724244f63de2476925596c24285c7a637364761f8710891c"}, + {file = "scipy-1.13.1-cp39-cp39-win_amd64.whl", hash = "sha256:392e4ec766654852c25ebad4f64e4e584cf19820b980bc04960bca0b0cd6eaa2"}, + {file = "scipy-1.13.1.tar.gz", hash = "sha256:095a87a0312b08dfd6a6155cbbd310a8c51800fc931b8c0b84003014b874ed3c"}, ] [package.dependencies] @@ -3486,19 +4156,18 @@ test = ["array-api-strict", "asv", "gmpy2", "hypothesis (>=6.30)", "mpmath", "po [[package]] name = "setuptools" -version = "69.5.1" +version = "70.0.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-69.5.1-py3-none-any.whl", hash = "sha256:c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32"}, - {file = "setuptools-69.5.1.tar.gz", hash = "sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987"}, + {file = "setuptools-70.0.0-py3-none-any.whl", hash = "sha256:54faa7f2e8d2d11bcd2c07bed282eef1046b5c080d1c32add737d7b5817b1ad4"}, + {file = "setuptools-70.0.0.tar.gz", hash = "sha256:f211a66637b8fa059bb28183da127d4e86396c991a942b028c6650d4319c3fd0"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "six" @@ -3524,60 +4193,60 @@ files = [ [[package]] name = "sqlalchemy" -version = "2.0.29" +version = "2.0.30" description = "Database Abstraction Library" optional = false python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.29-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4c142852ae192e9fe5aad5c350ea6befe9db14370b34047e1f0f7cf99e63c63b"}, - {file = "SQLAlchemy-2.0.29-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:99a1e69d4e26f71e750e9ad6fdc8614fbddb67cfe2173a3628a2566034e223c7"}, - {file = "SQLAlchemy-2.0.29-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ef3fbccb4058355053c51b82fd3501a6e13dd808c8d8cd2561e610c5456013c"}, - {file = "SQLAlchemy-2.0.29-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d6753305936eddc8ed190e006b7bb33a8f50b9854823485eed3a886857ab8d1"}, - {file = "SQLAlchemy-2.0.29-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0f3ca96af060a5250a8ad5a63699180bc780c2edf8abf96c58af175921df847a"}, - {file = "SQLAlchemy-2.0.29-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c4520047006b1d3f0d89e0532978c0688219857eb2fee7c48052560ae76aca1e"}, - {file = "SQLAlchemy-2.0.29-cp310-cp310-win32.whl", hash = "sha256:b2a0e3cf0caac2085ff172c3faacd1e00c376e6884b5bc4dd5b6b84623e29e4f"}, - {file = "SQLAlchemy-2.0.29-cp310-cp310-win_amd64.whl", hash = "sha256:01d10638a37460616708062a40c7b55f73e4d35eaa146781c683e0fa7f6c43fb"}, - {file = "SQLAlchemy-2.0.29-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:308ef9cb41d099099fffc9d35781638986870b29f744382904bf9c7dadd08513"}, - {file = "SQLAlchemy-2.0.29-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:296195df68326a48385e7a96e877bc19aa210e485fa381c5246bc0234c36c78e"}, - {file = "SQLAlchemy-2.0.29-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a13b917b4ffe5a0a31b83d051d60477819ddf18276852ea68037a144a506efb9"}, - {file = "SQLAlchemy-2.0.29-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f6d971255d9ddbd3189e2e79d743ff4845c07f0633adfd1de3f63d930dbe673"}, - {file = "SQLAlchemy-2.0.29-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:61405ea2d563407d316c63a7b5271ae5d274a2a9fbcd01b0aa5503635699fa1e"}, - {file = "SQLAlchemy-2.0.29-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:de7202ffe4d4a8c1e3cde1c03e01c1a3772c92858837e8f3879b497158e4cb44"}, - {file = "SQLAlchemy-2.0.29-cp311-cp311-win32.whl", hash = "sha256:b5d7ed79df55a731749ce65ec20d666d82b185fa4898430b17cb90c892741520"}, - {file = "SQLAlchemy-2.0.29-cp311-cp311-win_amd64.whl", hash = "sha256:205f5a2b39d7c380cbc3b5dcc8f2762fb5bcb716838e2d26ccbc54330775b003"}, - {file = "SQLAlchemy-2.0.29-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d96710d834a6fb31e21381c6d7b76ec729bd08c75a25a5184b1089141356171f"}, - {file = "SQLAlchemy-2.0.29-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:52de4736404e53c5c6a91ef2698c01e52333988ebdc218f14c833237a0804f1b"}, - {file = "SQLAlchemy-2.0.29-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c7b02525ede2a164c5fa5014915ba3591730f2cc831f5be9ff3b7fd3e30958e"}, - {file = "SQLAlchemy-2.0.29-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dfefdb3e54cd15f5d56fd5ae32f1da2d95d78319c1f6dfb9bcd0eb15d603d5d"}, - {file = "SQLAlchemy-2.0.29-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a88913000da9205b13f6f195f0813b6ffd8a0c0c2bd58d499e00a30eb508870c"}, - {file = "SQLAlchemy-2.0.29-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fecd5089c4be1bcc37c35e9aa678938d2888845a134dd016de457b942cf5a758"}, - {file = "SQLAlchemy-2.0.29-cp312-cp312-win32.whl", hash = "sha256:8197d6f7a3d2b468861ebb4c9f998b9df9e358d6e1cf9c2a01061cb9b6cf4e41"}, - {file = "SQLAlchemy-2.0.29-cp312-cp312-win_amd64.whl", hash = "sha256:9b19836ccca0d321e237560e475fd99c3d8655d03da80c845c4da20dda31b6e1"}, - {file = "SQLAlchemy-2.0.29-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:87a1d53a5382cdbbf4b7619f107cc862c1b0a4feb29000922db72e5a66a5ffc0"}, - {file = "SQLAlchemy-2.0.29-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a0732dffe32333211801b28339d2a0babc1971bc90a983e3035e7b0d6f06b93"}, - {file = "SQLAlchemy-2.0.29-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90453597a753322d6aa770c5935887ab1fc49cc4c4fdd436901308383d698b4b"}, - {file = "SQLAlchemy-2.0.29-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ea311d4ee9a8fa67f139c088ae9f905fcf0277d6cd75c310a21a88bf85e130f5"}, - {file = "SQLAlchemy-2.0.29-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:5f20cb0a63a3e0ec4e169aa8890e32b949c8145983afa13a708bc4b0a1f30e03"}, - {file = "SQLAlchemy-2.0.29-cp37-cp37m-win32.whl", hash = "sha256:e5bbe55e8552019c6463709b39634a5fc55e080d0827e2a3a11e18eb73f5cdbd"}, - {file = "SQLAlchemy-2.0.29-cp37-cp37m-win_amd64.whl", hash = "sha256:c2f9c762a2735600654c654bf48dad388b888f8ce387b095806480e6e4ff6907"}, - {file = "SQLAlchemy-2.0.29-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7e614d7a25a43a9f54fcce4675c12761b248547f3d41b195e8010ca7297c369c"}, - {file = "SQLAlchemy-2.0.29-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:471fcb39c6adf37f820350c28aac4a7df9d3940c6548b624a642852e727ea586"}, - {file = "SQLAlchemy-2.0.29-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:988569c8732f54ad3234cf9c561364221a9e943b78dc7a4aaf35ccc2265f1930"}, - {file = "SQLAlchemy-2.0.29-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dddaae9b81c88083e6437de95c41e86823d150f4ee94bf24e158a4526cbead01"}, - {file = "SQLAlchemy-2.0.29-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:334184d1ab8f4c87f9652b048af3f7abea1c809dfe526fb0435348a6fef3d380"}, - {file = "SQLAlchemy-2.0.29-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:38b624e5cf02a69b113c8047cf7f66b5dfe4a2ca07ff8b8716da4f1b3ae81567"}, - {file = "SQLAlchemy-2.0.29-cp38-cp38-win32.whl", hash = "sha256:bab41acf151cd68bc2b466deae5deeb9e8ae9c50ad113444151ad965d5bf685b"}, - {file = "SQLAlchemy-2.0.29-cp38-cp38-win_amd64.whl", hash = "sha256:52c8011088305476691b8750c60e03b87910a123cfd9ad48576d6414b6ec2a1d"}, - {file = "SQLAlchemy-2.0.29-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3071ad498896907a5ef756206b9dc750f8e57352113c19272bdfdc429c7bd7de"}, - {file = "SQLAlchemy-2.0.29-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dba622396a3170974f81bad49aacebd243455ec3cc70615aeaef9e9613b5bca5"}, - {file = "SQLAlchemy-2.0.29-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b184e3de58009cc0bf32e20f137f1ec75a32470f5fede06c58f6c355ed42a72"}, - {file = "SQLAlchemy-2.0.29-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c37f1050feb91f3d6c32f864d8e114ff5545a4a7afe56778d76a9aec62638ba"}, - {file = "SQLAlchemy-2.0.29-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bda7ce59b06d0f09afe22c56714c65c957b1068dee3d5e74d743edec7daba552"}, - {file = "SQLAlchemy-2.0.29-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:25664e18bef6dc45015b08f99c63952a53a0a61f61f2e48a9e70cec27e55f699"}, - {file = "SQLAlchemy-2.0.29-cp39-cp39-win32.whl", hash = "sha256:77d29cb6c34b14af8a484e831ab530c0f7188f8efed1c6a833a2c674bf3c26ec"}, - {file = "SQLAlchemy-2.0.29-cp39-cp39-win_amd64.whl", hash = "sha256:04c487305ab035a9548f573763915189fc0fe0824d9ba28433196f8436f1449c"}, - {file = "SQLAlchemy-2.0.29-py3-none-any.whl", hash = "sha256:dc4ee2d4ee43251905f88637d5281a8d52e916a021384ec10758826f5cbae305"}, - {file = "SQLAlchemy-2.0.29.tar.gz", hash = "sha256:bd9566b8e58cabd700bc367b60e90d9349cd16f0984973f98a9a09f9c64e86f0"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3b48154678e76445c7ded1896715ce05319f74b1e73cf82d4f8b59b46e9c0ddc"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2753743c2afd061bb95a61a51bbb6a1a11ac1c44292fad898f10c9839a7f75b2"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7bfc726d167f425d4c16269a9a10fe8630ff6d14b683d588044dcef2d0f6be7"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4f61ada6979223013d9ab83a3ed003ded6959eae37d0d685db2c147e9143797"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a365eda439b7a00732638f11072907c1bc8e351c7665e7e5da91b169af794af"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bba002a9447b291548e8d66fd8c96a6a7ed4f2def0bb155f4f0a1309fd2735d5"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-win32.whl", hash = "sha256:0138c5c16be3600923fa2169532205d18891b28afa817cb49b50e08f62198bb8"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-win_amd64.whl", hash = "sha256:99650e9f4cf3ad0d409fed3eec4f071fadd032e9a5edc7270cd646a26446feeb"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:955991a09f0992c68a499791a753523f50f71a6885531568404fa0f231832aa0"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f69e4c756ee2686767eb80f94c0125c8b0a0b87ede03eacc5c8ae3b54b99dc46"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69c9db1ce00e59e8dd09d7bae852a9add716efdc070a3e2068377e6ff0d6fdaa"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1429a4b0f709f19ff3b0cf13675b2b9bfa8a7e79990003207a011c0db880a13"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:efedba7e13aa9a6c8407c48facfdfa108a5a4128e35f4c68f20c3407e4376aa9"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:16863e2b132b761891d6c49f0a0f70030e0bcac4fd208117f6b7e053e68668d0"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-win32.whl", hash = "sha256:2ecabd9ccaa6e914e3dbb2aa46b76dede7eadc8cbf1b8083c94d936bcd5ffb49"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-win_amd64.whl", hash = "sha256:0b3f4c438e37d22b83e640f825ef0f37b95db9aa2d68203f2c9549375d0b2260"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5a79d65395ac5e6b0c2890935bad892eabb911c4aa8e8015067ddb37eea3d56c"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9a5baf9267b752390252889f0c802ea13b52dfee5e369527da229189b8bd592e"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cb5a646930c5123f8461f6468901573f334c2c63c795b9af350063a736d0134"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:296230899df0b77dec4eb799bcea6fbe39a43707ce7bb166519c97b583cfcab3"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c62d401223f468eb4da32627bffc0c78ed516b03bb8a34a58be54d618b74d472"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3b69e934f0f2b677ec111b4d83f92dc1a3210a779f69bf905273192cf4ed433e"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-win32.whl", hash = "sha256:77d2edb1f54aff37e3318f611637171e8ec71472f1fdc7348b41dcb226f93d90"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-win_amd64.whl", hash = "sha256:b6c7ec2b1f4969fc19b65b7059ed00497e25f54069407a8701091beb69e591a5"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5a8e3b0a7e09e94be7510d1661339d6b52daf202ed2f5b1f9f48ea34ee6f2d57"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b60203c63e8f984df92035610c5fb76d941254cf5d19751faab7d33b21e5ddc0"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1dc3eabd8c0232ee8387fbe03e0a62220a6f089e278b1f0aaf5e2d6210741ad"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:40ad017c672c00b9b663fcfcd5f0864a0a97828e2ee7ab0c140dc84058d194cf"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e42203d8d20dc704604862977b1470a122e4892791fe3ed165f041e4bf447a1b"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-win32.whl", hash = "sha256:2a4f4da89c74435f2bc61878cd08f3646b699e7d2eba97144030d1be44e27584"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-win_amd64.whl", hash = "sha256:b6bf767d14b77f6a18b6982cbbf29d71bede087edae495d11ab358280f304d8e"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bc0c53579650a891f9b83fa3cecd4e00218e071d0ba00c4890f5be0c34887ed3"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:311710f9a2ee235f1403537b10c7687214bb1f2b9ebb52702c5aa4a77f0b3af7"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:408f8b0e2c04677e9c93f40eef3ab22f550fecb3011b187f66a096395ff3d9fd"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37a4b4fb0dd4d2669070fb05b8b8824afd0af57587393015baee1cf9890242d9"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a943d297126c9230719c27fcbbeab57ecd5d15b0bd6bfd26e91bfcfe64220621"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0a089e218654e740a41388893e090d2e2c22c29028c9d1353feb38638820bbeb"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-win32.whl", hash = "sha256:fa561138a64f949f3e889eb9ab8c58e1504ab351d6cf55259dc4c248eaa19da6"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-win_amd64.whl", hash = "sha256:7d74336c65705b986d12a7e337ba27ab2b9d819993851b140efdf029248e818e"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ae8c62fe2480dd61c532ccafdbce9b29dacc126fe8be0d9a927ca3e699b9491a"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2383146973a15435e4717f94c7509982770e3e54974c71f76500a0136f22810b"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8409de825f2c3b62ab15788635ccaec0c881c3f12a8af2b12ae4910a0a9aeef6"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0094c5dc698a5f78d3d1539853e8ecec02516b62b8223c970c86d44e7a80f6c7"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:edc16a50f5e1b7a06a2dcc1f2205b0b961074c123ed17ebda726f376a5ab0953"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f7703c2010355dd28f53deb644a05fc30f796bd8598b43f0ba678878780b6e4c"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-win32.whl", hash = "sha256:1f9a727312ff6ad5248a4367358e2cf7e625e98b1028b1d7ab7b806b7d757513"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-win_amd64.whl", hash = "sha256:a0ef36b28534f2a5771191be6edb44cc2673c7b2edf6deac6562400288664221"}, + {file = "SQLAlchemy-2.0.30-py3-none-any.whl", hash = "sha256:7108d569d3990c71e26a42f60474b4c02c8586c4681af5fd67e51a044fdea86a"}, + {file = "SQLAlchemy-2.0.30.tar.gz", hash = "sha256:2b1708916730f4830bc69d6f49d37f7698b5bd7530aca7f04f785f8849e95255"}, ] [package.dependencies] @@ -3641,26 +4310,27 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] [[package]] name = "starlette" -version = "0.27.0" +version = "0.36.3" description = "The little ASGI library that shines." -optional = false -python-versions = ">=3.7" +optional = true +python-versions = ">=3.8" files = [ - {file = "starlette-0.27.0-py3-none-any.whl", hash = "sha256:918416370e846586541235ccd38a474c08b80443ed31c578a418e2209b3eef91"}, - {file = "starlette-0.27.0.tar.gz", hash = "sha256:6a6b0d042acb8d469a01eba54e9cda6cbd24ac602c4cd016723117d6a7e73b75"}, + {file = "starlette-0.36.3-py3-none-any.whl", hash = "sha256:13d429aa93a61dc40bf503e8c801db1f1bca3dc706b10ef2434a36123568f044"}, + {file = "starlette-0.36.3.tar.gz", hash = "sha256:90a671733cfb35771d8cc605e0b679d23b992f8dcfad48cc60b38cb29aeb7080"}, ] [package.dependencies] anyio = ">=3.4.0,<5" +typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} [package.extras] -full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyaml"] +full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7)", "pyyaml"] [[package]] name = "sympy" version = "1.12" description = "Computer algebra system (CAS) in Python" -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "sympy-1.12-py3-none-any.whl", hash = "sha256:c3588cd4295d0c0f603d0f2ae780587e64e2efeedb3521e46b9bb1d08d184fa5"}, @@ -3684,19 +4354,33 @@ files = [ [package.extras] widechars = ["wcwidth"] +[[package]] +name = "tbb" +version = "2021.12.0" +description = "Intel® oneAPI Threading Building Blocks (oneTBB)" +optional = true +python-versions = "*" +files = [ + {file = "tbb-2021.12.0-py2.py3-none-manylinux1_i686.whl", hash = "sha256:f2cc9a7f8ababaa506cbff796ce97c3bf91062ba521e15054394f773375d81d8"}, + {file = "tbb-2021.12.0-py2.py3-none-manylinux1_x86_64.whl", hash = "sha256:a925e9a7c77d3a46ae31c34b0bb7f801c4118e857d137b68f68a8e458fcf2bd7"}, + {file = "tbb-2021.12.0-py3-none-win32.whl", hash = "sha256:b1725b30c174048edc8be70bd43bb95473f396ce895d91151a474d0fa9f450a8"}, + {file = "tbb-2021.12.0-py3-none-win_amd64.whl", hash = "sha256:fc2772d850229f2f3df85f1109c4844c495a2db7433d38200959ee9265b34789"}, +] + [[package]] name = "tenacity" -version = "8.2.3" +version = "8.3.0" description = "Retry code until it succeeds" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tenacity-8.2.3-py3-none-any.whl", hash = "sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c"}, - {file = "tenacity-8.2.3.tar.gz", hash = "sha256:5398ef0d78e63f40007c1fb4c0bff96e1911394d2fa8d194f77619c05ff6cc8a"}, + {file = "tenacity-8.3.0-py3-none-any.whl", hash = "sha256:3649f6443dbc0d9b01b9d8020a9c4ec7a1ff5f6f3c6c8a036ef371f573fe9185"}, + {file = "tenacity-8.3.0.tar.gz", hash = "sha256:953d4e6ad24357bceffbc9707bc74349aca9d245f68eb65419cf0c249a1949a2"}, ] [package.extras] -doc = ["reno", "sphinx", "tornado (>=4.5)"] +doc = ["reno", "sphinx"] +test = ["pytest", "tornado (>=4.5)", "typeguard"] [[package]] name = "tiktoken" @@ -3885,44 +4569,51 @@ dev = ["tokenizers[testing]"] docs = ["setuptools-rust", "sphinx", "sphinx-rtd-theme"] testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests", "ruff"] +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + [[package]] name = "torch" -version = "2.2.2" +version = "2.3.0" description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" -optional = false +optional = true python-versions = ">=3.8.0" files = [ - {file = "torch-2.2.2-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:bc889d311a855dd2dfd164daf8cc903a6b7273a747189cebafdd89106e4ad585"}, - {file = "torch-2.2.2-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:15dffa4cc3261fa73d02f0ed25f5fa49ecc9e12bf1ae0a4c1e7a88bbfaad9030"}, - {file = "torch-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:11e8fe261233aeabd67696d6b993eeb0896faa175c6b41b9a6c9f0334bdad1c5"}, - {file = "torch-2.2.2-cp310-none-macosx_10_9_x86_64.whl", hash = "sha256:b2e2200b245bd9f263a0d41b6a2dab69c4aca635a01b30cca78064b0ef5b109e"}, - {file = "torch-2.2.2-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:877b3e6593b5e00b35bbe111b7057464e76a7dd186a287280d941b564b0563c2"}, - {file = "torch-2.2.2-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:ad4c03b786e074f46606f4151c0a1e3740268bcf29fbd2fdf6666d66341c1dcb"}, - {file = "torch-2.2.2-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:32827fa1fbe5da8851686256b4cd94cc7b11be962862c2293811c94eea9457bf"}, - {file = "torch-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:f9ef0a648310435511e76905f9b89612e45ef2c8b023bee294f5e6f7e73a3e7c"}, - {file = "torch-2.2.2-cp311-none-macosx_10_9_x86_64.whl", hash = "sha256:95b9b44f3bcebd8b6cd8d37ec802048c872d9c567ba52c894bba90863a439059"}, - {file = "torch-2.2.2-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:49aa4126ede714c5aeef7ae92969b4b0bbe67f19665106463c39f22e0a1860d1"}, - {file = "torch-2.2.2-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:cf12cdb66c9c940227ad647bc9cf5dba7e8640772ae10dfe7569a0c1e2a28aca"}, - {file = "torch-2.2.2-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:89ddac2a8c1fb6569b90890955de0c34e1724f87431cacff4c1979b5f769203c"}, - {file = "torch-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:451331406b760f4b1ab298ddd536486ab3cfb1312614cfe0532133535be60bea"}, - {file = "torch-2.2.2-cp312-none-macosx_10_9_x86_64.whl", hash = "sha256:eb4d6e9d3663e26cd27dc3ad266b34445a16b54908e74725adb241aa56987533"}, - {file = "torch-2.2.2-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:bf9558da7d2bf7463390b3b2a61a6a3dbb0b45b161ee1dd5ec640bf579d479fc"}, - {file = "torch-2.2.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:cd2bf7697c9e95fb5d97cc1d525486d8cf11a084c6af1345c2c2c22a6b0029d0"}, - {file = "torch-2.2.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:b421448d194496e1114d87a8b8d6506bce949544e513742b097e2ab8f7efef32"}, - {file = "torch-2.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:3dbcd563a9b792161640c0cffe17e3270d85e8f4243b1f1ed19cca43d28d235b"}, - {file = "torch-2.2.2-cp38-none-macosx_10_9_x86_64.whl", hash = "sha256:31f4310210e7dda49f1fb52b0ec9e59382cfcb938693f6d5378f25b43d7c1d29"}, - {file = "torch-2.2.2-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:c795feb7e8ce2e0ef63f75f8e1ab52e7fd5e1a4d7d0c31367ade1e3de35c9e95"}, - {file = "torch-2.2.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:a6e5770d68158d07456bfcb5318b173886f579fdfbf747543901ce718ea94782"}, - {file = "torch-2.2.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:67dcd726edff108e2cd6c51ff0e416fd260c869904de95750e80051358680d24"}, - {file = "torch-2.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:539d5ef6c4ce15bd3bd47a7b4a6e7c10d49d4d21c0baaa87c7d2ef8698632dfb"}, - {file = "torch-2.2.2-cp39-none-macosx_10_9_x86_64.whl", hash = "sha256:dff696de90d6f6d1e8200e9892861fd4677306d0ef604cb18f2134186f719f82"}, - {file = "torch-2.2.2-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:3a4dd910663fd7a124c056c878a52c2b0be4a5a424188058fe97109d4436ee42"}, + {file = "torch-2.3.0-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:d8ea5a465dbfd8501f33c937d1f693176c9aef9d1c1b0ca1d44ed7b0a18c52ac"}, + {file = "torch-2.3.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:09c81c5859a5b819956c6925a405ef1cdda393c9d8a01ce3851453f699d3358c"}, + {file = "torch-2.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:1bf023aa20902586f614f7682fedfa463e773e26c58820b74158a72470259459"}, + {file = "torch-2.3.0-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:758ef938de87a2653bba74b91f703458c15569f1562bf4b6c63c62d9c5a0c1f5"}, + {file = "torch-2.3.0-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:493d54ee2f9df100b5ce1d18c96dbb8d14908721f76351e908c9d2622773a788"}, + {file = "torch-2.3.0-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:bce43af735c3da16cc14c7de2be7ad038e2fbf75654c2e274e575c6c05772ace"}, + {file = "torch-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:729804e97b7cf19ae9ab4181f91f5e612af07956f35c8b2c8e9d9f3596a8e877"}, + {file = "torch-2.3.0-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:d24e328226d8e2af7cf80fcb1d2f1d108e0de32777fab4aaa2b37b9765d8be73"}, + {file = "torch-2.3.0-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:b0de2bdc0486ea7b14fc47ff805172df44e421a7318b7c4d92ef589a75d27410"}, + {file = "torch-2.3.0-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:a306c87a3eead1ed47457822c01dfbd459fe2920f2d38cbdf90de18f23f72542"}, + {file = "torch-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:f9b98bf1a3c8af2d4c41f0bf1433920900896c446d1ddc128290ff146d1eb4bd"}, + {file = "torch-2.3.0-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:dca986214267b34065a79000cee54232e62b41dff1ec2cab9abc3fc8b3dee0ad"}, + {file = "torch-2.3.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:20572f426965dd8a04e92a473d7e445fa579e09943cc0354f3e6fef6130ce061"}, + {file = "torch-2.3.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:e65ba85ae292909cde0dde6369826d51165a3fc8823dc1854cd9432d7f79b932"}, + {file = "torch-2.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:5515503a193781fd1b3f5c474e89c9dfa2faaa782b2795cc4a7ab7e67de923f6"}, + {file = "torch-2.3.0-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:6ae9f64b09516baa4ef890af0672dc981c20b1f0d829ce115d4420a247e88fba"}, + {file = "torch-2.3.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:cd0dc498b961ab19cb3f8dbf0c6c50e244f2f37dbfa05754ab44ea057c944ef9"}, + {file = "torch-2.3.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:e05f836559251e4096f3786ee99f4a8cbe67bc7fbedba8ad5e799681e47c5e80"}, + {file = "torch-2.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:4fb27b35dbb32303c2927da86e27b54a92209ddfb7234afb1949ea2b3effffea"}, + {file = "torch-2.3.0-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:760f8bedff506ce9e6e103498f9b1e9e15809e008368594c3a66bf74a8a51380"}, ] [package.dependencies] filelock = "*" fsspec = "*" jinja2 = "*" +mkl = {version = ">=2021.1.1,<=2021.4.0", markers = "platform_system == \"Windows\""} networkx = "*" nvidia-cublas-cu12 = {version = "12.1.3.1", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} nvidia-cuda-cupti-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} @@ -3933,10 +4624,10 @@ nvidia-cufft-cu12 = {version = "11.0.2.54", markers = "platform_system == \"Linu nvidia-curand-cu12 = {version = "10.3.2.106", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} nvidia-cusolver-cu12 = {version = "11.4.5.107", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} nvidia-cusparse-cu12 = {version = "12.1.0.106", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-nccl-cu12 = {version = "2.19.3", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nccl-cu12 = {version = "2.20.5", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} nvidia-nvtx-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} sympy = "*" -triton = {version = "2.2.0", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_version < \"3.12\""} +triton = {version = "2.3.0", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_version < \"3.12\""} typing-extensions = ">=4.8.0" [package.extras] @@ -4000,18 +4691,18 @@ test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0, [[package]] name = "transformers" -version = "4.40.1" +version = "4.41.1" description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" -optional = false +optional = true python-versions = ">=3.8.0" files = [ - {file = "transformers-4.40.1-py3-none-any.whl", hash = "sha256:9d5ee0c8142a60501faf9e49a0b42f8e9cb8611823bce4f195a9325a6816337e"}, - {file = "transformers-4.40.1.tar.gz", hash = "sha256:55e1697e6f18b58273e7117bb469cdffc11be28995462d8d5e422fef38d2de36"}, + {file = "transformers-4.41.1-py3-none-any.whl", hash = "sha256:f0680e0b1a01067eccd11f62f0522409422c7d6f91d532fe0f50b136a406129d"}, + {file = "transformers-4.41.1.tar.gz", hash = "sha256:fa859e4c66f0896633a3bf534e0d9a29a9a88478a49f94c5d8270537dc61cc42"}, ] [package.dependencies] filelock = "*" -huggingface-hub = ">=0.19.3,<1.0" +huggingface-hub = ">=0.23.0,<1.0" numpy = ">=1.17" packaging = ">=20.0" pyyaml = ">=5.1" @@ -4024,17 +4715,15 @@ tqdm = ">=4.27" [package.extras] accelerate = ["accelerate (>=0.21.0)"] agents = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "datasets (!=2.5.0)", "diffusers", "opencv-python", "sentencepiece (>=0.1.91,!=0.1.92)", "torch"] -all = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision"] +all = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision"] audio = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] codecarbon = ["codecarbon (==1.2.0)"] deepspeed = ["accelerate (>=0.21.0)", "deepspeed (>=0.9.3)"] -deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.21.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "optuna", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] -dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] -dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.19,<0.20)", "urllib3 (<2.0.0)"] -dev-torch = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "librosa", "nltk", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] -docs = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "hf-doc-builder", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision"] -docs-specific = ["hf-doc-builder"] -flax = ["flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "optax (>=0.0.8,<=0.1.4)"] +deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.21.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk", "optuna", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] +dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.19,<0.20)", "urllib3 (<2.0.0)"] +dev-torch = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "librosa", "nltk", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +flax = ["flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "optax (>=0.0.8,<=0.1.4)", "scipy (<1.13.0)"] flax-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] ftfy = ["ftfy"] integrations = ["optuna", "ray[tune] (>=2.7.0)", "sigopt"] @@ -4044,7 +4733,7 @@ natten = ["natten (>=0.14.6,<0.15.0)"] onnx = ["onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "tf2onnx"] onnxruntime = ["onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)"] optuna = ["optuna"] -quality = ["GitPython (<3.1.19)", "datasets (!=2.5.0)", "hf-doc-builder (>=0.3.0)", "isort (>=5.5.4)", "ruff (==0.1.5)", "urllib3 (<2.0.0)"] +quality = ["GitPython (<3.1.19)", "datasets (!=2.5.0)", "isort (>=5.5.4)", "ruff (==0.1.5)", "urllib3 (<2.0.0)"] ray = ["ray[tune] (>=2.7.0)"] retrieval = ["datasets (!=2.5.0)", "faiss-cpu"] sagemaker = ["sagemaker (>=2.31.0)"] @@ -4053,32 +4742,32 @@ serving = ["fastapi", "pydantic", "starlette", "uvicorn"] sigopt = ["sigopt"] sklearn = ["scikit-learn"] speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] -testing = ["GitPython (<3.1.19)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] -tf = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] -tf-cpu = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow-cpu (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] +testing = ["GitPython (<3.1.19)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk", "parameterized", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] +tf = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] +tf-cpu = ["keras (>2.9,<2.16)", "keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow-cpu (>2.9,<2.16)", "tensorflow-probability (<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] tf-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] timm = ["timm"] tokenizers = ["tokenizers (>=0.19,<0.20)"] torch = ["accelerate (>=0.21.0)", "torch"] torch-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] torch-vision = ["Pillow (>=10.0.1,<=15.0)", "torchvision"] -torchhub = ["filelock", "huggingface-hub (>=0.19.3,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.19,<0.20)", "torch", "tqdm (>=4.27)"] +torchhub = ["filelock", "huggingface-hub (>=0.23.0,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.19,<0.20)", "torch", "tqdm (>=4.27)"] video = ["av (==9.2.0)", "decord (==0.6.0)"] vision = ["Pillow (>=10.0.1,<=15.0)"] [[package]] name = "triton" -version = "2.2.0" +version = "2.3.0" description = "A language and compiler for custom Deep Learning operations" -optional = false +optional = true python-versions = "*" files = [ - {file = "triton-2.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2294514340cfe4e8f4f9e5c66c702744c4a117d25e618bd08469d0bfed1e2e5"}, - {file = "triton-2.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da58a152bddb62cafa9a857dd2bc1f886dbf9f9c90a2b5da82157cd2b34392b0"}, - {file = "triton-2.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af58716e721460a61886668b205963dc4d1e4ac20508cc3f623aef0d70283d5"}, - {file = "triton-2.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8fe46d3ab94a8103e291bd44c741cc294b91d1d81c1a2888254cbf7ff846dab"}, - {file = "triton-2.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8ce26093e539d727e7cf6f6f0d932b1ab0574dc02567e684377630d86723ace"}, - {file = "triton-2.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:227cc6f357c5efcb357f3867ac2a8e7ecea2298cd4606a8ba1e931d1d5a947df"}, + {file = "triton-2.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ce4b8ff70c48e47274c66f269cce8861cf1dc347ceeb7a67414ca151b1822d8"}, + {file = "triton-2.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c3d9607f85103afdb279938fc1dd2a66e4f5999a58eb48a346bd42738f986dd"}, + {file = "triton-2.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:218d742e67480d9581bafb73ed598416cc8a56f6316152e5562ee65e33de01c0"}, + {file = "triton-2.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:381ec6b3dac06922d3e4099cfc943ef032893b25415de295e82b1a82b0359d2c"}, + {file = "triton-2.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:038e06a09c06a164fef9c48de3af1e13a63dc1ba3c792871e61a8e79720ea440"}, + {file = "triton-2.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d8f636e0341ac348899a47a057c3daea99ea7db31528a225a3ba4ded28ccc65"}, ] [package.dependencies] @@ -4165,15 +4854,43 @@ files = [ cryptography = ">=35.0.0" types-pyOpenSSL = "*" +[[package]] +name = "types-requests" +version = "2.31.0.6" +description = "Typing stubs for requests" +optional = true +python-versions = ">=3.7" +files = [ + {file = "types-requests-2.31.0.6.tar.gz", hash = "sha256:cd74ce3b53c461f1228a9b783929ac73a666658f223e28ed29753771477b3bd0"}, + {file = "types_requests-2.31.0.6-py3-none-any.whl", hash = "sha256:a2db9cb228a81da8348b49ad6db3f5519452dd20a9c1e1a868c83c5fe88fd1a9"}, +] + +[package.dependencies] +types-urllib3 = "*" + +[[package]] +name = "types-requests" +version = "2.32.0.20240523" +description = "Typing stubs for requests" +optional = true +python-versions = ">=3.8" +files = [ + {file = "types-requests-2.32.0.20240523.tar.gz", hash = "sha256:26b8a6de32d9f561192b9942b41c0ab2d8010df5677ca8aa146289d11d505f57"}, + {file = "types_requests-2.32.0.20240523-py3-none-any.whl", hash = "sha256:f19ed0e2daa74302069bbbbf9e82902854ffa780bc790742a810a9aaa52f65ec"}, +] + +[package.dependencies] +urllib3 = ">=2" + [[package]] name = "types-setuptools" -version = "69.5.0.20240423" +version = "70.0.0.20240524" description = "Typing stubs for setuptools" optional = false python-versions = ">=3.8" files = [ - {file = "types-setuptools-69.5.0.20240423.tar.gz", hash = "sha256:a7ba908f1746c4337d13f027fa0f4a5bcad6d1d92048219ba792b3295c58586d"}, - {file = "types_setuptools-69.5.0.20240423-py3-none-any.whl", hash = "sha256:a4381e041510755a6c9210e26ad55b1629bc10237aeb9cb8b6bd24996b73db48"}, + {file = "types-setuptools-70.0.0.20240524.tar.gz", hash = "sha256:e31fee7b9d15ef53980526579ac6089b3ae51a005a281acf97178e90ac71aff6"}, + {file = "types_setuptools-70.0.0.20240524-py3-none-any.whl", hash = "sha256:8f5379b9948682d72a9ab531fbe52932e84c4f38deda570255f9bae3edd766bc"}, ] [[package]] @@ -4187,15 +4904,26 @@ files = [ {file = "types_tqdm-4.66.0.20240417-py3-none-any.whl", hash = "sha256:248aef1f9986b7b8c2c12b3cb4399fc17dba0a29e7e3f3f9cd704babb879383d"}, ] +[[package]] +name = "types-urllib3" +version = "1.26.25.14" +description = "Typing stubs for urllib3" +optional = true +python-versions = "*" +files = [ + {file = "types-urllib3-1.26.25.14.tar.gz", hash = "sha256:229b7f577c951b8c1b92c1bc2b2fdb0b49847bd2af6d1cc2a2e3dd340f3bda8f"}, + {file = "types_urllib3-1.26.25.14-py3-none-any.whl", hash = "sha256:9683bbb7fb72e32bfe9d2be6e04875fbe1b3eeec3cbb4ea231435aa7fd6b4f0e"}, +] + [[package]] name = "typing-extensions" -version = "4.11.0" +version = "4.12.0" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, - {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, + {file = "typing_extensions-4.12.0-py3-none-any.whl", hash = "sha256:b349c66bea9016ac22978d800cfff206d5f9816951f12a7d0ec5578b0a819594"}, + {file = "typing_extensions-4.12.0.tar.gz", hash = "sha256:8cbcdc8606ebcb0d95453ad7dc5065e6237b6aa230a31e81d0f440c30fed5fd8"}, ] [[package]] @@ -4224,50 +4952,59 @@ files = [ {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, ] +[[package]] +name = "uritemplate" +version = "4.1.1" +description = "Implementation of RFC 6570 URI Templates" +optional = true +python-versions = ">=3.6" +files = [ + {file = "uritemplate-4.1.1-py2.py3-none-any.whl", hash = "sha256:830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e"}, + {file = "uritemplate-4.1.1.tar.gz", hash = "sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0"}, +] + [[package]] name = "urllib3" -version = "2.2.1" +version = "1.26.18" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=3.8" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ - {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, - {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, + {file = "urllib3-1.26.18-py2.py3-none-any.whl", hash = "sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07"}, + {file = "urllib3-1.26.18.tar.gz", hash = "sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0"}, ] [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -h2 = ["h2 (>=4,<5)"] -socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["zstandard (>=0.18.0)"] +brotli = ["brotli (==1.0.9)", "brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] -name = "uvicorn" -version = "0.23.2" -description = "The lightning-fast ASGI server." +name = "urllib3" +version = "2.2.1" +description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "uvicorn-0.23.2-py3-none-any.whl", hash = "sha256:1f9be6558f01239d4fdf22ef8126c39cb1ad0addf76c40e760549d2c2f43ab53"}, - {file = "uvicorn-0.23.2.tar.gz", hash = "sha256:4d3cc12d7727ba72b64d12d3cc7743124074c0a69f7b201512fc50c3e3f1569a"}, + {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, + {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, ] -[package.dependencies] -click = ">=7.0" -h11 = ">=0.8" - [package.extras] -standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" -version = "20.26.1" +version = "20.26.2" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.26.1-py3-none-any.whl", hash = "sha256:7aa9982a728ae5892558bff6a2839c00b9ed145523ece2274fad6f414690ae75"}, - {file = "virtualenv-20.26.1.tar.gz", hash = "sha256:604bfdceaeece392802e6ae48e69cec49168b9c5f4a44e483963f9242eb0e78b"}, + {file = "virtualenv-20.26.2-py3-none-any.whl", hash = "sha256:a624db5e94f01ad993d476b9ee5346fdf7b9de43ccaee0e0197012dc838a0e9b"}, + {file = "virtualenv-20.26.2.tar.gz", hash = "sha256:82bf0f4eebbb78d36ddaee0283d43fe5736b53880b8a8cdcd37390a07ac3741c"}, ] [package.dependencies] @@ -4290,11 +5027,22 @@ files = [ {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, ] +[[package]] +name = "xmltodict" +version = "0.13.0" +description = "Makes working with XML feel like you are working with JSON" +optional = true +python-versions = ">=3.4" +files = [ + {file = "xmltodict-0.13.0-py2.py3-none-any.whl", hash = "sha256:aa89e8fd76320154a40d19a0df04a4695fb9dc5ba977cbb68ab3e4eb225e7852"}, + {file = "xmltodict-0.13.0.tar.gz", hash = "sha256:341595a488e3e01a85a9d8911d8912fd922ede5fecc4dce437eb4b6c8d037e56"}, +] + [[package]] name = "xxhash" version = "3.4.1" description = "Python binding for xxHash" -optional = false +optional = true python-versions = ">=3.7" files = [ {file = "xxhash-3.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:91dbfa55346ad3e18e738742236554531a621042e419b70ad8f3c1d9c7a16e7f"}, @@ -4512,20 +5260,28 @@ multidict = ">=4.0" [[package]] name = "zipp" -version = "3.18.1" +version = "3.19.0" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.18.1-py3-none-any.whl", hash = "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b"}, - {file = "zipp-3.18.1.tar.gz", hash = "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715"}, + {file = "zipp-3.19.0-py3-none-any.whl", hash = "sha256:96dc6ad62f1441bcaccef23b274ec471518daf4fbbc580341204936a5a3dddec"}, + {file = "zipp-3.19.0.tar.gz", hash = "sha256:952df858fb3164426c976d9338d3961e8e8b3758e2e059e0f754b8c4262625ee"}, ] [package.extras] docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] + +[extras] +anthropic = ["anthropic"] +chat = ["fastapi"] +cohere = ["cohere"] +examples = ["datasets", "scipy", "torch", "transformers"] +google-generativeai = ["google-generativeai"] +groq = ["groq"] [metadata] lock-version = "2.0" -python-versions = ">=3.11, <3.12" -content-hash = "734b222e80f5b00822e8440d4c5fddcc69f867f901f3e6ac7f1717597c8690d2" +python-versions = ">=3.9, <=3.12" +content-hash = "8ce0edb923a09683941fc9f9869e3322b21de89259e2615d28ba1f62dfbb9277" diff --git a/pyproject.toml b/pyproject.toml index 2c95fd80b..0a0ea312b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,43 +8,55 @@ readme = "README.md" packages = [{include = "sotopia"}] [tool.poetry.dependencies] -python = ">=3.11, <3.12" -datasets = "^2.16.1" +python = ">=3.10, <3.13" pandas = "^2.1.1" lxml = "^4.9.3" -scipy = "^1.11.3" openai = "^1.11.0" langchain = "0.1.5" -tiktoken = "^0.5.1" rich = "^13.6.0" -jinja2 = "^3.1.2" PettingZoo = "1.24.0" redis-om = "^0.2.1" pandas-stubs = "*" types-tqdm = "*" -fastapi = "^0.103.2" -uvicorn = "^0.23.2" gin-config = "^0.5.0" absl-py = "^2.0.0" -names = "^0.3.0" together = "^0.2.4" pydantic = "1.10.12" -mypy = "^1.8.0" beartype = "^0.14.0" -torch = ">=2.1 <2.3" -transformers = "^4.34.0" langchain-openai = "^0.0.5" litellm = "^1.23.12" +# dependency versions for extras +fastapi = { version = "^0.109.2", optional = true } +tabulate = { version = "^0.9.0", optional = true } +anthropic = { version = "^0.26.0", optional = true } +xmltodict = { version = "^0.13.0", optional = true } +groq = { version = "^0.4.2", optional = true } +cohere = { version = "^5.1.8", optional = true } +google-generativeai = { version = "^0.5.4", optional = true } +transformers = { version = "^4.41.0", optional = true } +datasets = { version = "^2.19.0", optional = true } +scipy = { version = "^1.13.1", optional = true } +torch = { version = "^2.3.0", optional = true } + [tool.poetry.group.dev.dependencies] pre-commit = "*" nbmake = "*" types-setuptools = "*" +ruff = "*" [tool.poetry.group.test.dependencies] pytest = "*" pytest-asyncio = "*" +mypy = "^1.8.0" +[tool.poetry.extras] +anthropic = ["anthropic"] +groq = ["groq"] +cohere = ["cohere"] +google-generativeai = ["google-generativeai"] +examples = ["transformers", "datasets", "scipy", "torch"] +chat = ["fastapi"] [build-system] requires = ["poetry-core"] diff --git a/sotopia-chat/fastapi_server.py b/sotopia-chat/fastapi_server.py index ae8c293b5..a0fdf6edd 100644 --- a/sotopia-chat/fastapi_server.py +++ b/sotopia-chat/fastapi_server.py @@ -338,11 +338,16 @@ async def _join_after_seconds( await asyncio.sleep(0.1) return str(response.text) - async with asyncio.timeout(200): - _ = await asyncio.gather( - _join_after_seconds(random.random() * 199), - _join_after_seconds(random.random() * 199), - _join_after_seconds(random.random() * 199), - _join_after_seconds(random.random() * 199), - _join_after_seconds(random.random() * 199), + try: + await asyncio.wait_for( + asyncio.gather( + _join_after_seconds(random.random() * 199), + _join_after_seconds(random.random() * 199), + _join_after_seconds(random.random() * 199), + _join_after_seconds(random.random() * 199), + _join_after_seconds(random.random() * 199), + ), + timeout=200, ) + except (TimeoutError, asyncio.TimeoutError) as _: + pass diff --git a/sotopia/generation_utils/__init__.py b/sotopia/generation_utils/__init__.py index c82cffb58..c5fb65099 100644 --- a/sotopia/generation_utils/__init__.py +++ b/sotopia/generation_utils/__init__.py @@ -5,10 +5,6 @@ fill_in_background, generate_goal, ) -from .generate_specific_envs import ( - generate_craigslist_bargains_envs, - generate_mutual_friend_envs, -) __all__ = [ "EnvResponse", @@ -16,6 +12,4 @@ "LLM_Name", "fill_in_background", "generate_goal", - "generate_mutual_friend_envs", - "generate_craigslist_bargains_envs", ] diff --git a/sotopia/renderers/xml_renderer.py b/sotopia/renderers/xml_renderer.py index 2ce119e59..c685a7a81 100644 --- a/sotopia/renderers/xml_renderer.py +++ b/sotopia/renderers/xml_renderer.py @@ -65,7 +65,8 @@ def __call__( self.parser, ).getroot() except etree.XMLSyntaxError as e: - e.add_note(f"The xml_string is {xml_string}") - raise e + raise etree.XMLSyntaxError( + f"Failed to parse xml_string: {xml_string}" + ) from e return _render_xml(root, context) diff --git a/stubs/peft/__init__.pyi b/stubs/peft/__init__.pyi deleted file mode 100644 index f01c1acdc..000000000 --- a/stubs/peft/__init__.pyi +++ /dev/null @@ -1,16 +0,0 @@ -from typing import Any, TypeVar - -import torch - -Model = TypeVar("Model", bound=PushToHubMixin) - -class PushToHubMixin: - @classmethod - def from_pretrained(cls: type[Model], *args: Any, **kwargs: Any) -> Model: ... - -class PeftModel(PushToHubMixin, torch.nn.Module): ... - -def set_peft_model_state_dict( - model: PeftModel, peft_model_state_dict: dict[str, Any] -) -> PeftModel: ... -def get_peft_model(model: PeftModel, peft_config: Any) -> PeftModel: ... From b7b581f2918e0dae4c0e11b77f7033015cdac62f Mon Sep 17 00:00:00 2001 From: Hao Zhu Date: Sun, 2 Jun 2024 16:57:28 -0400 Subject: [PATCH 3/6] Pin LiteLLM version (#87) * Pin LiteLLM version * bump version --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 0a0ea312b..102a4161c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "sotopia" -version = "0.0.6" +version = "0.0.8" description = "A platform for simulating and evaluating social interaction." authors = ["Hao Zhu "] license = "MIT License" @@ -24,7 +24,7 @@ together = "^0.2.4" pydantic = "1.10.12" beartype = "^0.14.0" langchain-openai = "^0.0.5" -litellm = "^1.23.12" +litellm = "~1.23.12" # dependency versions for extras fastapi = { version = "^0.109.2", optional = true } From 9351c5e3646187e8d142a54c4c55cd455ffed76e Mon Sep 17 00:00:00 2001 From: Hao Zhu Date: Fri, 7 Jun 2024 11:50:24 -0400 Subject: [PATCH 4/6] Tutorial notebooks that can be directly opened in colab (#90) * add jupyter notebooks that can be directly opened on colab * update the links in the readme * Prompt to rerun task sampling when no episodes are retrieved --- README.md | 4 +- docs/public/favicon.png | Bin 0 -> 4563 bytes docs/public/favicon.svg | 19 +- notebooks/tutorials/1.1-setup.ipynb | 354 ++++++++++++++++++++++ notebooks/tutorials/1.2-browse-data.ipynb | 334 ++++++++++++++++++++ 5 files changed, 696 insertions(+), 15 deletions(-) create mode 100644 docs/public/favicon.png create mode 100644 notebooks/tutorials/1.1-setup.ipynb create mode 100644 notebooks/tutorials/1.2-browse-data.ipynb diff --git a/README.md b/README.md index 528a8b85c..fb27cfc0a 100644 --- a/README.md +++ b/README.md @@ -46,8 +46,8 @@ If you want to try it out on Google Colab first, please check out our Colab Tuto
  1. Basic
      -
    1. 1.1 Playing with Sotopia in a Google Colab Notebook
    2. -
    3. 1.2 Browsing sotopia data
    4. +
    5. 1.1 Playing with Sotopia in a Google Colab Notebook
    6. +
    7. 1.2 Browsing sotopia data
  2. diff --git a/docs/public/favicon.png b/docs/public/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..ef6b7c1af91506e6f374f9445914f5a48e27e39f GIT binary patch literal 4563 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 literal 0 HcmV?d00001 diff --git a/docs/public/favicon.svg b/docs/public/favicon.svg index ed06047cb..1a4f0aff1 100644 --- a/docs/public/favicon.svg +++ b/docs/public/favicon.svg @@ -1,14 +1,7 @@ - - - - - + + + + + + diff --git a/notebooks/tutorials/1.1-setup.ipynb b/notebooks/tutorials/1.1-setup.ipynb new file mode 100644 index 000000000..f00e7d33b --- /dev/null +++ b/notebooks/tutorials/1.1-setup.ipynb @@ -0,0 +1,354 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "EIQMxzgqlRX7" + }, + "source": [ + "

    \"drawing\"

    " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "bIf4OMHUz6ma" + }, + "source": [ + "# Sotopia Tutorial Series\n", + "\n", + " \"Open \n", + "\n", + "The following is the first tutorial of this series to teach how to quickly build your socially intelligent agents on the sotopia platform.\n", + "\n", + "## Quick links\n", + "\n", + "1. Basics\n", + " \n", + " 1.1 [Playing with Sotopia in a Google Colab Notebook](https://colab.research.google.com/drive/14hJOfzpA37PRUzdlFgiqVzUGIhhngqnz?usp=sharing)\n", + " \n", + " 1.2 [Browsing sotopia data](https://colab.research.google.com/drive/1Gi2U3cA0KG1nekw1A0N0DZpx6gKrj8Nc?usp=sharing)\n", + "\n", + "2. Build your agents (coming soon!)\n", + "3. Evaluate your agents (coming soon!)\n", + "4. Extending Sotopia (coming soon!)\n", + "\n", + "Please contact [Hao Zhu](https://zhuhao.me) for any questions!" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Fe0-ncx5U8q7" + }, + "source": [ + "# Guide on running Redis Stack for [Sotopia](https://sotopia.world)\n", + "\n", + "Author: [Hao Zhu](https://zhuhao.me)\n", + "\n", + "After the release of Sotopia package, I received feedback on the reliance of Sotopia on Redis, a KV database for maintaining profiles, interaction logs, error logs, and communication between the FastAPI server and agents. When hearing about database, people often think of a huge overhead. However, I want to show you in this tutorial that setting up Redis backend for Sotopia is actually extremely easy -- just run the following blocks." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "DYRSxB4pWfDS" + }, + "source": [ + "## Install Redis\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "cellView": "form", + "id": "IJRC8SkzRteQ" + }, + "outputs": [], + "source": [ + "# @title The following block downloads Redis stack server 7.2.0, and libssl 1.1.\n", + "%%capture\n", + "!curl -fsSL https://packages.redis.io/redis-stack/redis-stack-server-7.2.0-v10.focal.x86_64.tar.gz -o redis-stack-server.tar.gz\n", + "!tar -xvf redis-stack-server.tar.gz\n", + "# Installs libssl1.1 for Ubuntu 22 source: https://stackoverflow.com/questions/72133316/libssl-so-1-1-cannot-open-shared-object-file-no-such-file-or-directory\n", + "!wget http://nz2.archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2.22_amd64.deb\n", + "!sudo dpkg -i libssl1.1_1.1.1f-1ubuntu2.22_amd64.deb\n", + "%pip install redis" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "cellView": "form", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "GlqtKYDmR2Ij", + "outputId": "d69d6466-5f8b-4904-ffce-7c1dbec0ca53" + }, + "outputs": [], + "source": [ + "# @title Just one line of code to spin up your redis server:\n", + "\n", + "\n", + "!./redis-stack-server-7.2.0-v10/bin/redis-stack-server --daemonize yes" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "bIf7Nni3XEQk" + }, + "source": [ + "If the above cell results in no error message, you have successfully set up your Redis server." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "cellView": "form", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "gNgwAngBR7vC", + "outputId": "70c0d1ca-6cd9-4adb-b1e0-b7d4859494d9" + }, + "outputs": [], + "source": [ + "# @title Try it out:\n", + "\n", + "import redis\n", + "\n", + "client = redis.Redis(host=\"localhost\", port=6379)\n", + "client.ping()\n", + "client.set(\"foo\", \"Yes it works.\")\n", + "client.get(\"foo\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "RISoihCJXdiL" + }, + "source": [ + "## Run Sotopia with it" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "o0-S_Ug2d4vB" + }, + "source": [ + "To simulate an episode in Sotopia, there's one thing you will have to do: adding your `OPENAI_API_KEY` to the secret to left. Click on the little 🔑 shape button, and then toggle \"Notebook access\", input \"OPENAI_API_KEY\" under Name and the key string under Value.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "ne2r-KmxXpNS" + }, + "outputs": [], + "source": [ + "# @title Run the following cell to add it to the environment variable.\n", + "%%capture\n", + "%pip install sotopia\n", + "import os\n", + "from google.colab import userdata\n", + "\n", + "os.environ[\"REDIS_OM_URL\"] = \"redis://:@localhost:6379\"\n", + "os.environ[\"OPENAI_API_KEY\"] = userdata.get(\"OPENAI_API_KEY\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "cellView": "form", + "id": "X-3yiYuIcLVZ" + }, + "outputs": [], + "source": [ + "# @title Helper functions for adding characters and social tasks\n", + "from sotopia.database.persistent_profile import AgentProfile, EnvironmentProfile\n", + "from typing import Any\n", + "\n", + "\n", + "def add_agent_to_database(**kwargs: dict[str, Any]) -> None:\n", + " agent = AgentProfile(**kwargs)\n", + " agent.save()\n", + "\n", + "\n", + "def add_env_profile(**kwargs: dict[str, Any]) -> None:\n", + " env_profile = EnvironmentProfile(**kwargs)\n", + " env_profile.save()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "cellView": "form", + "id": "6nPHso_4Z9s-" + }, + "outputs": [], + "source": [ + "# @title Let's first add a character to the database. Only name is required when creating a new character\n", + "\n", + "\n", + "first_name = \"Alice\" # @param {type:\"string\"}\n", + "last_name = \"Smith\" # @param {type:\"string\"}\n", + "age = 22 # @param {type:\"integer\"}\n", + "occupation = \"Data Scientist\" # @param {type:\"string\"}\n", + "gender = \"Woman\" # @param [\"Man\", \"Woman\", \"Nonbinary\"]\n", + "gender_pronoun = \"she/her\" # @param {type:\"string\"}\n", + "big_five = \"extraversion, openness\" # @param {type:\"string\"}\n", + "moral_values = [\"power\", \"achievement\"] # @param {type:\"string\"}\n", + "decision_making_style = \"analytical\" # @param {type:\"string\"}\n", + "secret = \"She cheated in her code interview\" # @param {type:\"string\"}\n", + "\n", + "add_agent_to_database(\n", + " first_name=first_name,\n", + " last_name=last_name,\n", + " age=age,\n", + " occupation=occupation,\n", + " gender=gender,\n", + " gender_pronoun=gender_pronoun,\n", + " big_five=big_five,\n", + " moral_values=moral_values,\n", + " decision_making_style=decision_making_style,\n", + " secret=secret,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "cellView": "form", + "id": "jaVLJSMsdVSJ" + }, + "outputs": [], + "source": [ + "# @title Let's add another character\n", + "\n", + "\n", + "first_name = \"Bob\" # @param {type:\"string\"}\n", + "last_name = \"Johnson\" # @param {type:\"string\"}\n", + "age = 30 # @param {type:\"integer\"}\n", + "occupation = \"Chef\" # @param {type:\"string\"}\n", + "gender = \"Man\" # @param [\"Man\", \"Woman\", \"Nonbinary\"]\n", + "gender_pronoun = \"he/his\" # @param {type:\"string\"}\n", + "big_five = \"openness, conscientiousness\" # @param {type:\"string\"}\n", + "moral_values = [\"Benevolence\"] # @param {type:\"string\"}\n", + "decision_making_style = \"conceptual\" # @param {type:\"string\"}\n", + "secret = \"He has a negative net worth.\" # @param {type:\"string\"}\n", + "\n", + "add_agent_to_database(\n", + " first_name=first_name,\n", + " last_name=last_name,\n", + " age=age,\n", + " occupation=occupation,\n", + " gender=gender,\n", + " gender_pronoun=gender_pronoun,\n", + " big_five=big_five,\n", + " moral_values=moral_values,\n", + " decision_making_style=decision_making_style,\n", + " secret=secret,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "cellView": "form", + "id": "gE4iBfHjfZxM" + }, + "outputs": [], + "source": [ + "# @title Let's add a social tasks\n", + "\n", + "scenario = 'A friend is raising a fund for the \"Help the children\" charity' # @param {type:\"string\"}\n", + "social_goal_1 = \"Ask for donation of $100\" # @param {type:\"string\"}\n", + "social_goal_2 = \"Donate less than $10\" # @param {type:\"string\"}\n", + "\n", + "add_env_profile(scenario=scenario, agent_goals=[social_goal_1, social_goal_2])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "TcYo311NdJNb", + "outputId": "e03fb8f3-6cef-4160-ab95-1674747ae70a" + }, + "outputs": [], + "source": [ + "# @title Finally, run a server:\n", + "\n", + "from sotopia.samplers import UniformSampler\n", + "from sotopia.server import run_async_server\n", + "\n", + "\n", + "await run_async_server(\n", + " model_dict={\n", + " \"env\": \"gpt-4\",\n", + " \"agent1\": \"gpt-3.5-turbo\",\n", + " \"agent2\": \"gpt-3.5-turbo\",\n", + " },\n", + " sampler=UniformSampler(),\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "OJXZlHvJAGBS" + }, + "source": [ + "### A note on what is running under the hood\n", + "\n", + "After you added the characters and scenarios to the database, the `run_async_server` samples a pair of characters and one scenario to run the simulation, and then evaluate the simulation. All of the sampling, interaction simulation, and evaluation are handled by Sotopia. You could easily tweak them through editing `run_async_server`, or changing the LLMs, or the sampler according to your own need." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "9YNRGLsRfMvG" + }, + "source": [ + "## Conclusion\n", + "\n", + "In this very short tutorial, I demonstrated the whole pipeline of setting up Redis server, installing sotopia, adding characters and social tasks, and simulating + evaluating the social interaction between two GPT-3.5 agents with GPT-4. This tutorial intends to serve as the first quick example for you. The only thing you have to do besides running all of the cells is add your own OpenAI key[[1]](#cite_note-1). You could also use other LLMs supported by LiteLLM even your own API endpoint. Let me know if you want me to explain more.\n", + "\n", + " [1](#cite_ref-1): *sorry I cannot afford to share mine.*" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.1.undefined" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/notebooks/tutorials/1.2-browse-data.ipynb b/notebooks/tutorials/1.2-browse-data.ipynb new file mode 100644 index 000000000..ff500878c --- /dev/null +++ b/notebooks/tutorials/1.2-browse-data.ipynb @@ -0,0 +1,334 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "EIQMxzgqlRX7" + }, + "source": [ + "

    \"drawing\"

    " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ocrtYaex1s0h" + }, + "source": [ + "# Sotopia Tutorial Series\n", + "\n", + " \"Open \n", + "\n", + "The following is the second tutorial of this series to teach how to quickly build your socially intelligent agents on the sotopia platform.\n", + "\n", + "## Quick links\n", + "\n", + "1. Basics\n", + " \n", + " 1.1 [Playing with Sotopia in a Google Colab Notebook](https://colab.research.google.com/drive/14hJOfzpA37PRUzdlFgiqVzUGIhhngqnz?usp=sharing)\n", + " \n", + " 1.2 [Browsing sotopia data](https://colab.research.google.com/drive/1Gi2U3cA0KG1nekw1A0N0DZpx6gKrj8Nc?usp=sharing)\n", + "\n", + "2. Build your agents (coming soon!)\n", + "3. Evaluate your agents (coming soon!)\n", + "4. Extending Sotopia (coming soon!)\n", + "\n", + "Please contact [Hao Zhu](https://zhuhao.me) for any questions!" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Fe0-ncx5U8q7" + }, + "source": [ + "\n", + "# 1.2 Browsing [Sotopia](https://sotopia.world) data\n", + "\n", + "Author: [Hao Zhu](https://zhuhao.me)\n", + "\n", + "Running the code in this tutorial does not require familiarity of the redis setup. But if you have finished [Tutorial 1.1](https://colab.research.google.com/drive/14hJOfzpA37PRUzdlFgiqVzUGIhhngqnz?usp=sharing), you would have a better idea of the characters (in the format of `sotopia.database.AgentProfile`) and social tasks (in the format of `sotopia.database.EnvironmentProfile`). What you would be able to learn through this tutorial are:\n", + "\n", + "1. How to load all of the existing data from sotopia(-pi) experiments, including 40 characters, hundreds of scenarios, and tens of thousands of interaction episodes.\n", + "2. How to browse them through indexing based on two awesome libraries `redis-om` and `pydantic`." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "DYRSxB4pWfDS" + }, + "source": [ + "## Install Redis\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "cellView": "form", + "id": "IJRC8SkzRteQ" + }, + "outputs": [], + "source": [ + "# @title Download Redis: This code block is exactly the same as [Tutorial 1.1](https://colab.research.google.com/drive/14hJOfzpA37PRUzdlFgiqVzUGIhhngqnz?usp=sharing).\n", + "%%capture\n", + "!curl -fsSL https://packages.redis.io/redis-stack/redis-stack-server-7.2.0-v10.focal.x86_64.tar.gz -o redis-stack-server.tar.gz\n", + "!tar -xvf redis-stack-server.tar.gz\n", + "# Installs libssl1.1 for Ubuntu 22 source: https://stackoverflow.com/questions/72133316/libssl-so-1-1-cannot-open-shared-object-file-no-such-file-or-directory\n", + "!wget http://nz2.archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2.22_amd64.deb\n", + "!sudo dpkg -i libssl1.1_1.1.1f-1ubuntu2.22_amd64.deb\n", + "%pip install redis" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "cellView": "form", + "id": "GlqtKYDmR2Ij" + }, + "outputs": [], + "source": [ + "%%capture\n", + "# @title Download existing data in a single file, and launch redis\n", + "\n", + "!mkdir -p /content/redis-stack-server-7.2.0-v10/var/db/redis-stack\n", + "!curl -L https://huggingface.co/datasets/cmu-lti/sotopia-pi/resolve/main/dump.rdb?download=true --output /content/redis-stack-server-7.2.0-v10/var/db/redis-stack/dump.rdb\n", + "!./redis-stack-server-7.2.0-v10/bin/redis-stack-server --daemonize yes" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "bIf7Nni3XEQk" + }, + "source": [ + "If the above cell results in no error message, you have successfully set up your Redis server." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "cellView": "form", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "gNgwAngBR7vC", + "outputId": "321eb7f8-29c1-4d84-aa9a-2f114a4f8f49" + }, + "outputs": [], + "source": [ + "# @title Your DB is now pre-populated with existing data:\n", + "\n", + "import redis\n", + "from redis import BusyLoadingError\n", + "import time\n", + "\n", + "client = redis.Redis(host=\"localhost\", port=6379)\n", + "while True:\n", + " try:\n", + " client.ping()\n", + " break\n", + " except BusyLoadingError:\n", + " time.sleep(1)\n", + "print(f\"Voila, you have loaded {client.dbsize()} data!\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "RISoihCJXdiL" + }, + "source": [ + "## Browse the data you have just loaded" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "cellView": "form", + "id": "ne2r-KmxXpNS" + }, + "outputs": [], + "source": [ + "# @title First, install sotopia\n", + "%%capture\n", + "%pip install sotopia\n", + "import os\n", + "\n", + "os.environ[\"REDIS_OM_URL\"] = \"redis://:@localhost:6379\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "cellView": "form", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 353 + }, + "id": "ImjdFUlGGA4_", + "outputId": "df1abaac-fce7-4e14-fd84-0dc3d96d8521" + }, + "outputs": [], + "source": [ + "# @title Show me a random character\n", + "import random\n", + "from rich import print\n", + "\n", + "from sotopia.database import AgentProfile\n", + "\n", + "\n", + "all_character_pks = list(AgentProfile.all_pks())\n", + "pk = random.choice(all_character_pks)\n", + "\n", + "print(AgentProfile.get(pk))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "cellView": "form", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 321 + }, + "id": "Su5EwfIPHQWp", + "outputId": "47e36153-fa91-4a34-cc5b-80dea2e516dd" + }, + "outputs": [], + "source": [ + "# @title Show me a random social task\n", + "from sotopia.database import EnvironmentProfile\n", + "\n", + "all_task_pks = list(EnvironmentProfile.all_pks())\n", + "pk = random.choice(all_task_pks)\n", + "\n", + "print(EnvironmentProfile.get(pk))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "cellView": "form", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "SFW9PRzzH1Pt", + "outputId": "d53ab793-6740-4e69-9fc7-3a911c892aa1" + }, + "outputs": [], + "source": [ + "# @title Show me an Episode of the random social task before\n", + "\n", + "from sotopia.database import EpisodeLog\n", + "\n", + "all_episodes = list(EpisodeLog.find(EpisodeLog.environment == pk).all())\n", + "if len(all_episodes) == 0:\n", + " print(\"No episodes found for this task, Please try to sample another task.\")\n", + "else:\n", + " episode = random.choice(all_episodes)\n", + " print(episode)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "dYx2N8njZAIi" + }, + "source": [ + "### Find all young chefs in Sotopia\n", + "\n", + "Powered by `redis_om`, the database of sotopia can be easily indexed by simple logics" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 33 + }, + "id": "7mAMGMXgYGRE", + "outputId": "8b85b2fa-c3de-4054-d466-223530ceea18" + }, + "outputs": [], + "source": [ + "young_chefs = AgentProfile.find(\n", + " (AgentProfile.occupation == \"Chef\") & (AgentProfile.age < 45)\n", + ").all()\n", + "print(\n", + " f\"There are {len(young_chefs)} young chefs in sotopia. They are: {', '.join(chef.first_name for chef in young_chefs)}\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "8iIG2EWOa1A1" + }, + "source": [ + "### Tagging system in Sotopia\n", + "\n", + "You might notice that Sotopia episodes are all \"tagged\" which allows for tracing the source of the generation. You can list all of the tags" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "sDST-ZcJeubQ", + "outputId": "1750cc27-909d-4b93-9d5d-b3f8e8cfc82d" + }, + "outputs": [], + "source": [ + "def get_episode_tag(episode_id):\n", + " try:\n", + " episode = EpisodeLog.get(episode_id)\n", + " return episode.tag\n", + " except Exception as _:\n", + " return \"\"\n", + "\n", + "\n", + "set(get_episode_tag(episode) for episode in EpisodeLog.all_pks())" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "9YNRGLsRfMvG" + }, + "source": [ + "## Conclusion\n", + "\n", + "In this very short tutorial, I demonstrated how to load the existing data from sotopia(-pi) experiments and browse the data with the easy-to-use api in sotopia. You can enumerate or find a random character and social task, and you can also index the interaction episodes with the task id or character id." + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} From 960dda2ae91442ad10374f4ff43719898f637518 Mon Sep 17 00:00:00 2001 From: Hao Date: Fri, 7 Jun 2024 14:58:05 -0400 Subject: [PATCH 5/6] add platform tab --- docs/bun.lockb | Bin 325450 -> 328309 bytes docs/components/ui/tabs.tsx | 53 ++++++++++++++++++++++++++++++++++++ docs/package.json | 1 + docs/pages/index.mdx | 38 ++++++++++++++++++++++++-- docs/tailwind.config.ts | 1 + 5 files changed, 91 insertions(+), 2 deletions(-) create mode 100644 docs/components/ui/tabs.tsx diff --git a/docs/bun.lockb b/docs/bun.lockb index 5cda3bd6603abf531a396fc0a2cb0bfb12315db9..b23959b6ceac0f21595c1d69fabc27baa122b74f 100755 GIT binary patch delta 57204 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 delta 55292 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 diff --git a/docs/components/ui/tabs.tsx b/docs/components/ui/tabs.tsx new file mode 100644 index 000000000..f57fffdb5 --- /dev/null +++ b/docs/components/ui/tabs.tsx @@ -0,0 +1,53 @@ +import * as React from "react" +import * as TabsPrimitive from "@radix-ui/react-tabs" + +import { cn } from "@/lib/utils" + +const Tabs = TabsPrimitive.Root + +const TabsList = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +TabsList.displayName = TabsPrimitive.List.displayName + +const TabsTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +TabsTrigger.displayName = TabsPrimitive.Trigger.displayName + +const TabsContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +TabsContent.displayName = TabsPrimitive.Content.displayName + +export { Tabs, TabsList, TabsTrigger, TabsContent } diff --git a/docs/package.json b/docs/package.json index bca31d540..75cfa080a 100644 --- a/docs/package.json +++ b/docs/package.json @@ -18,6 +18,7 @@ "@radix-ui/react-popover": "^1.0.7", "@radix-ui/react-separator": "^1.0.3", "@radix-ui/react-slot": "^1.0.2", + "@radix-ui/react-tabs": "^1.0.4", "@tanstack/react-table": "^8.16.0", "class-variance-authority": "^0.7.0", "clsx": "^2.1.0", diff --git a/docs/pages/index.mdx b/docs/pages/index.mdx index 7da796513..3f6dcf5ed 100644 --- a/docs/pages/index.mdx +++ b/docs/pages/index.mdx @@ -4,6 +4,8 @@ import { Button } from "../components/ui/button" import { MoveRight } from "lucide-react" import { Accordion, AccordionItem, AccordionContent, AccordionTrigger } from "../components/ui/accordion" import { Steps, Callout } from 'nextra/components' +import { Tabs, TabsContent, TabsList, TabsTrigger } from "../components/ui/tabs" + # Sotopia - Getting Started @@ -119,6 +121,14 @@ Redis stack is a required dependency for using Sotopia. There are two ways to se No, I don't want to use Docker. + + + Linux + MacOS + Windows + + + ### Download the Redis stack ```bash @@ -129,14 +139,33 @@ Redis stack is a required dependency for using Sotopia. There are two ways to se # if you are using Ubunutu 22.04, please do an extra step wget http://nz2.archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2.22_amd64.deb sudo dpkg -i libssl1.1_1.1.1f-1ubuntu2.22_amd64.deb - # if you are using macOs + ``` + + ### Start the server + ```bash + ./redis-stack-server-7.2.0-v10/bin/redis-stack-server --daemonize yes + ``` + + + + ### The `REDIS_OM_URL` need to be set before loading and saving agents: + ```bash + conda env config vars set REDIS_OM_URL="redis://user:password@host:port" + ``` + If you are using the default settings, you can set the `REDIS_OM_URL` to `redis://localhost:6379`. + + + + + ### Download the Redis stack + ```bash brew tap redis-stack/redis-stack brew install redis-stack ``` ### Start the server ```bash - ./redis-stack-server-7.2.0-v10/bin/redis-stack-server --daemonize yes + redis-stack-server --daemonize yes ``` For other platforms, please check the [instruction](https://redis.io/docs/latest/operate/oss_and_stack/install/install-stack/). @@ -147,6 +176,11 @@ Redis stack is a required dependency for using Sotopia. There are two ways to se ``` If you are using the default settings, you can set the `REDIS_OM_URL` to `redis://localhost:6379`. + + + For Windows, unfortunately only docker is supported. Check the [official documentation](https://redis.io/docs/latest/operate/oss_and_stack/install/install-stack/windows/). + + diff --git a/docs/tailwind.config.ts b/docs/tailwind.config.ts index 479a527ee..8449b5f8e 100644 --- a/docs/tailwind.config.ts +++ b/docs/tailwind.config.ts @@ -8,6 +8,7 @@ const config = { './app/**/*.{ts,tsx}', './src/**/*.{ts,tsx}', ], + safelist: ['dark'], prefix: "", theme: { container: { From aa75d30e3000d04ac4a0c21b68c5c2be1375ca10 Mon Sep 17 00:00:00 2001 From: Hao Date: Fri, 7 Jun 2024 15:40:19 -0400 Subject: [PATCH 6/6] updated open in colab instruction --- docs/pages/index.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/pages/index.mdx b/docs/pages/index.mdx index 3f6dcf5ed..39883c42a 100644 --- a/docs/pages/index.mdx +++ b/docs/pages/index.mdx @@ -36,7 +36,7 @@ https://github.com/sotopia-lab/sotopia
    Check out - + Open in Colab for a quick tutorial
    @@ -45,7 +45,7 @@ https://github.com/sotopia-lab/sotopia ### Basic Usage -This package supports Python 3.10 and above. Tested on Ubuntu 22.04 with python 3.11. +This package supports Python 3.10 and above.