From 0e635bbca95f56c8f07b62b7f4fe2a8e066f4a04 Mon Sep 17 00:00:00 2001 From: GitLab CI Date: Wed, 19 Nov 2025 16:21:52 +0000 Subject: [PATCH] chore: Regenerate all playbooks --- LICENSE-3rd-party | 1993 +++++++++++++++++ nvidia/txt2kg/README.md | 2 + .../assets/deploy/services/gpu-viz/Dockerfile | 1 - .../assets/deploy/services/gpu-viz/README.md | 77 +- .../services/gpu-viz/pygraphistry_service.py | 712 ------ .../deploy/services/gpu-viz/requirements.txt | 2 - .../services/gpu-viz/unified_gpu_service.py | 288 +-- 7 files changed, 2169 insertions(+), 906 deletions(-) create mode 100644 LICENSE-3rd-party delete mode 100644 nvidia/txt2kg/assets/deploy/services/gpu-viz/pygraphistry_service.py diff --git a/LICENSE-3rd-party b/LICENSE-3rd-party new file mode 100644 index 0000000..2e1e156 --- /dev/null +++ b/LICENSE-3rd-party @@ -0,0 +1,1993 @@ +================================================== +Third Party Licenses +================================================== + +----------------------------------------------------------------------------------------- + +== PyTorch + +Copyright (c) 2016-2024 Facebook, Inc. and its affiliates. All rights reserved. + +BSD 3-Clause License + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +----------------------------------------------------------------------------------------- + +== Transformers (Hugging Face) + +Copyright 2018- The Hugging Face team. All rights reserved. + +Apache License 2.0 + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +----------------------------------------------------------------------------------------- + +== NumPy + +Copyright (c) 2005-2024, NumPy Developers. +All rights reserved. + +BSD 3-Clause License + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +----------------------------------------------------------------------------------------- + +== Pandas + +Copyright (c) 2008-2024, AQR Capital Management, LLC, Lambda Foundry, Inc. +and PyData Development Team. All rights reserved. + +BSD 3-Clause License + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +----------------------------------------------------------------------------------------- + +== FastAPI + +Copyright (c) 2018 Sebastián Ramírez + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------------------------------------------------------------------------------------- + +== Flask + +Copyright 2010 Pallets + +BSD 3-Clause License + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +----------------------------------------------------------------------------------------- + +== Gunicorn + +Copyright 2009-2024 Benoit Chesneau + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------------------------------------------------------------------------------------- + +== LangChain + +Copyright (c) 2022 Harrison Chase + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------------------------------------------------------------------------------------- + +== JAX + +Copyright 2018 Google LLC + +Apache License 2.0 + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +----------------------------------------------------------------------------------------- + +== Sentence-Transformers + +Copyright 2019 Nils Reimers + +Apache License 2.0 + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +----------------------------------------------------------------------------------------- + +== Graphistry + +Copyright (c) 2015-2024, Graphistry, Inc. +All rights reserved. + +BSD 3-Clause License + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +----------------------------------------------------------------------------------------- + +== NetworkX + +Copyright (C) 2004-2024, NetworkX Developers +Aric Hagberg +Dan Schult +Pieter Swart +All rights reserved. + +BSD 3-Clause License + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +----------------------------------------------------------------------------------------- + +== scikit-learn + +Copyright (c) 2007-2024 The scikit-learn developers. +All rights reserved. + +BSD 3-Clause License + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +----------------------------------------------------------------------------------------- + +== Requests + +Copyright 2019 Kenneth Reitz + +Apache License 2.0 + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +----------------------------------------------------------------------------------------- + +== Pydantic + +Copyright (c) 2017 to present Samuel Colvin and other contributors + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------------------------------------------------------------------------------------- + +== Uvicorn + +Copyright © 2017-present, Encode OSS Ltd. All rights reserved. + +BSD 3-Clause License + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +----------------------------------------------------------------------------------------- + +== TRL (Transformer Reinforcement Learning) + +Copyright 2022 The HuggingFace Team. All rights reserved. + +Apache License 2.0 + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +----------------------------------------------------------------------------------------- + +== PEFT (Parameter-Efficient Fine-Tuning) + +Copyright 2023 The HuggingFace Team. All rights reserved. + +Apache License 2.0 + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +----------------------------------------------------------------------------------------- + +== Datasets (Hugging Face) + +Copyright 2020 The HuggingFace Datasets Authors. + +Apache License 2.0 + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +----------------------------------------------------------------------------------------- + +== Pillow (PIL Fork) + +Copyright (c) 1997-2011 by Secret Labs AB +Copyright (c) 1995-2011 by Fredrik Lundh +Copyright (c) 2010-2024 by Jeffrey A. Clark (Alex) and contributors + +Historical Permission Notice and Disclaimer (HPND) + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, provided +that the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting documentation, +and that the name of Secret Labs AB or the author not be used in advertising +or publicity pertaining to distribution of the software without specific, +written prior permission. + +SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS +SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. +IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR BE LIABLE FOR ANY SPECIAL, +INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. + +----------------------------------------------------------------------------------------- + +== OpenCV + +Copyright (C) 2000-2024, Intel Corporation, all rights reserved. +Copyright (C) 2009-2011, Willow Garage Inc., all rights reserved. +Copyright (C) 2009-2016, NVIDIA Corporation, all rights reserved. +Copyright (C) 2010-2013, Advanced Micro Devices, Inc., all rights reserved. +Copyright (C) 2015-2016, OpenCV Foundation, all rights reserved. +Copyright (C) 2015-2016, Itseez Inc., all rights reserved. + +Apache License 2.0 + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +----------------------------------------------------------------------------------------- + +== Plotly + +Copyright (c) 2016-2024 Plotly, Inc + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------------------------------------------------------------------------------------- + +== tqdm + +`tqdm` is a product of collaborative work. +Unless otherwise stated, all authors (see commit logs) retain copyright +for their respective work, and release the work under the MIT licence +(text below). + +Exceptions or notable authors are listed below +in reverse chronological order: + +* files: * + MPL-2.0 2015-2024 (c) Casper da Costa-Luis + [casperdcl](https://github.com/casperdcl). +* files: tqdm/_tqdm.py + MIT 2016 (c) [PR #96] on behalf of Google Inc. +* files: tqdm/_tqdm.py README.rst .gitignore + MIT 2013 (c) Noam Yorav-Raphael, original author. + +[PR #96]: https://github.com/tqdm/tqdm/pull/96 + + +Mozilla Public Licence (MPL) v. 2.0 - Exhibit A +----------------------------------------------- + +This Source Code Form is subject to the terms of the +Mozilla Public License, v. 2.0. +If a copy of the MPL was not distributed with this project, +You can obtain one at https://mozilla.org/MPL/2.0/. + + +MIT License (MIT) +----------------- + +Copyright (c) 2013 noamraph + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------------------------------------------------------------------------------------- + +== python-arango + +Copyright 2016-2024 Joohwan Oh + +Apache License 2.0 + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +----------------------------------------------------------------------------------------- + +== arangojs + +Copyright 2012-2024 ArangoDB GmbH, Cologne, Germany + +Apache License 2.0 + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +----------------------------------------------------------------------------------------- + +== Marimo + +Copyright 2024 Marimo, Inc. + +Apache License 2.0 + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +----------------------------------------------------------------------------------------- + +== Decord + +Copyright (c) 2019 by Contributors + +Apache License 2.0 + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +----------------------------------------------------------------------------------------- + +== PyPDF2 + +Copyright (c) 2006-2024, Mathieu Fenniak and PyPDF2 contributors +All rights reserved. + +BSD 3-Clause License + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +----------------------------------------------------------------------------------------- + +== asyncpg + +Copyright (C) 2016-present the asyncpg authors and contributors + +Apache License 2.0 + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +----------------------------------------------------------------------------------------- + +== websockets + +Copyright (c) 2013-2024 Aymeric Augustin and contributors + +BSD 3-Clause License + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +----------------------------------------------------------------------------------------- + +== python-dotenv + +Copyright (c) 2014, Saurabh Kumar +All rights reserved. + +BSD 3-Clause License + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +----------------------------------------------------------------------------------------- + +== python-multipart + +Copyright Andrew Dunham and contributors + +Apache License 2.0 + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +----------------------------------------------------------------------------------------- + +== bitsandbytes + +Copyright (c) Facebook, Inc. and its affiliates. +Copyright (c) Tim Dettmers + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------------------------------------------------------------------------------------- + +== torch-geometric + +Copyright (c) 2021 Matthias Fey + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------------------------------------------------------------------------------------- + +== Unsloth + +Copyright (c) 2023-2024 Unsloth AI + +Apache License 2.0 + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +----------------------------------------------------------------------------------------- + +== aiofiles + +Copyright 2015-2024 Tin Tvrtkovic and contributors + +Apache License 2.0 + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +----------------------------------------------------------------------------------------- + +== LangGraph + +Copyright (c) 2024 LangChain, Inc. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------------------------------------------------------------------------------------- + +== React + +Copyright (c) Meta Platforms, Inc. and affiliates. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------------------------------------------------------------------------------------- + +== Next.js + +Copyright (c) 2024 Vercel, Inc. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------------------------------------------------------------------------------------- + +== TypeScript + +Copyright (c) Microsoft Corporation. All rights reserved. + +Apache License 2.0 + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +----------------------------------------------------------------------------------------- + +== Radix UI + +Copyright (c) 2022 WorkOS + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------------------------------------------------------------------------------------- + +== Tailwind CSS + +Copyright (c) Tailwind Labs, Inc. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------------------------------------------------------------------------------------- + +== D3 + +Copyright 2010-2024 Mike Bostock + +ISC License + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + +----------------------------------------------------------------------------------------- + +== Three.js + +Copyright © 2010-2024 three.js authors + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------------------------------------------------------------------------------------- + +== Axios + +Copyright (c) 2014-present Matt Zabriskie and contributors + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------------------------------------------------------------------------------------- + +== Zod + +Copyright (c) 2020 Colin McDonnell + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------------------------------------------------------------------------------------- + +== lucide-react + +Copyright (c) for portions of Lucide are held by Cole Bemis 2013-2022 as part +of Feather (MIT). All other copyright for Lucide are held by Lucide +Contributors 2022. + +ISC License + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + +----------------------------------------------------------------------------------------- + +== neo4j-driver + +Copyright (c) "Neo4j" +Neo4j Sweden AB [https://neo4j.com] + +Apache License 2.0 + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +----------------------------------------------------------------------------------------- + +== OpenAI Node SDK + +Copyright 2024 OpenAI + +Apache License 2.0 + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +----------------------------------------------------------------------------------------- + +== react-markdown + +Copyright (c) 2015 Espen Hovlandsdal + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------------------------------------------------------------------------------------- + +== react-syntax-highlighter + +Copyright (c) 2016 Conor Hastings + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------------------------------------------------------------------------------------- + +== remark-gfm + +Copyright (c) 2020 Titus Wormer + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------------------------------------------------------------------------------------- + +== ESLint + +Copyright OpenJS Foundation and other contributors, + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------------------------------------------------------------------------------------- + +== PostCSS + +Copyright 2013 Andrey Sitnik + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------------------------------------------------------------------------------------- + +== Autoprefixer + +Copyright 2013 Andrey Sitnik + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------------------------------------------------------------------------------------- + +== class-variance-authority + +Copyright (c) 2023 Joe Bell + +Apache License 2.0 + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +----------------------------------------------------------------------------------------- + +== clsx + +Copyright (c) Luke Edwards (lukeed.com) + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------------------------------------------------------------------------------------- + +== tailwind-merge + +Copyright (c) 2021 Dany Castillo + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------------------------------------------------------------------------------------- + +== tailwindcss-animate + +Copyright (c) 2023 Jamie Kyle + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------------------------------------------------------------------------------------- + +== react-hook-form + +Copyright (c) 2019-present Beier(Bill) Luo + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------------------------------------------------------------------------------------- + +== react-resizable-panels + +Copyright (c) Meta Platforms, Inc. and affiliates. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------------------------------------------------------------------------------------- + +== next-themes + +Copyright (c) 2020 Paco Coursey + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------------------------------------------------------------------------------------- + +== 3d-force-graph + +Copyright (c) 2017 Vasco Asturiano + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------------------------------------------------------------------------------------- + +== Docker + +Copyright 2013-2024 Docker, Inc. + +Apache License 2.0 + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +----------------------------------------------------------------------------------------- + +== uv (Astral) + +Copyright (c) 2023 Astral Software Inc. + +Dual License: Apache 2.0 or MIT + +Apache License 2.0 + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------------------------------------------------------------------------------------- + +== AWS SDK for JavaScript + +Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + +Apache License 2.0 + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +----------------------------------------------------------------------------------------- + +== Node.js + +Copyright Node.js contributors. All rights reserved. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------------------------------------------------------------------------------------- + +== Python + +Copyright (c) 2001-2024 Python Software Foundation. All Rights Reserved. + +PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 + +1. This LICENSE AGREEMENT is between the Python Software Foundation ("PSF"), +and the Individual or Organization ("Licensee") accessing and otherwise using +Python software in source or binary form and its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, PSF hereby +grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, +analyze, test, perform and/or display publicly, prepare derivative works, +distribute, and otherwise use Python alone or in any derivative version, +provided, however, that PSF's License Agreement and PSF's notice of copyright, +i.e., "Copyright © 2001-2024 Python Software Foundation; All Rights Reserved" +are retained in Python alone or in any derivative version prepared by Licensee. + +3. In the event Licensee prepares a derivative work that is based on or +incorporates Python or any part thereof, and wants to make the derivative work +available to others as provided herein, then Licensee hereby agrees to include +in any such work a brief summary of the changes made to Python. + +4. PSF is making Python available to Licensee on an "AS IS" basis. PSF MAKES +NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT +NOT LIMITATION, PSF MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY OF +MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON +WILL NOT INFRINGE ANY THIRD PARTY RIGHTS. + +5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON FOR ANY +INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF MODIFYING, +DISTRIBUTING, OR OTHERWISE USING PYTHON, OR ANY DERIVATIVE THEREOF, EVEN IF +ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material breach +of its terms and conditions. + +7. Nothing in this License Agreement shall be deemed to create any relationship +of agency, partnership, or joint venture between PSF and Licensee. This License +Agreement does not grant permission to use PSF trademarks or trade name in a +trademark sense to endorse or promote products or services of Licensee, or any +third party. + +8. By copying, installing or otherwise using Python, Licensee agrees to be +bound by the terms and conditions of this License Agreement. + +----------------------------------------------------------------------------------------- + +== FFmpeg + +Copyright (c) 2000-2024 the FFmpeg developers + +GNU Lesser General Public License (LGPL) version 2.1 + +FFmpeg is free software; you can redistribute it and/or modify it under the +terms of the GNU Lesser General Public License as published by the Free Software +Foundation; either version 2.1 of the License, or (at your option) any later +version. + +FFmpeg is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with FFmpeg; if not, write to the Free Software Foundation, Inc., 51 Franklin +Street, Fifth Floor, Boston, MA 02110-1301 USA + +Full license text available at: https://www.gnu.org/licenses/lgpl-2.1.html + +NOTE: Some parts of FFmpeg are licensed under the GNU General Public License +(GPL) version 2 or later. See the FFmpeg documentation for details. + +----------------------------------------------------------------------------------------- + +== langchain-milvus + +Copyright (c) 2024 Milvus + +Apache License 2.0 + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +----------------------------------------------------------------------------------------- + +== langchain-mcp-adapters + +Copyright (c) 2024 Anthropic + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------------------------------------------------------------------------------------- + +== langchain-openai + +Copyright (c) 2024 LangChain, Inc. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------------------------------------------------------------------------------------- + +== langchain-text-splitters + +Copyright (c) 2024 LangChain, Inc. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------------------------------------------------------------------------------------- + +== langchain-unstructured + +Copyright (c) 2024 Unstructured Technologies, Inc. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------------------------------------------------------------------------------------- + +== MCP (Model Context Protocol) + +Copyright (c) 2024 Anthropic + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------------------------------------------------------------------------------------- + +== @hookform/resolvers + +Copyright (c) 2019-present Beier(Bill) Luo + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------------------------------------------------------------------------------------- diff --git a/nvidia/txt2kg/README.md b/nvidia/txt2kg/README.md index fda02a7..9df8a8a 100644 --- a/nvidia/txt2kg/README.md +++ b/nvidia/txt2kg/README.md @@ -55,6 +55,8 @@ The setup includes: - **Rollback**: Stop and remove Docker containers, delete downloaded models if needed +Last Updated: 11/19/2025 + ## Instructions ## Step 1. Clone the repository diff --git a/nvidia/txt2kg/assets/deploy/services/gpu-viz/Dockerfile b/nvidia/txt2kg/assets/deploy/services/gpu-viz/Dockerfile index 5f2ac1c..2d12aff 100644 --- a/nvidia/txt2kg/assets/deploy/services/gpu-viz/Dockerfile +++ b/nvidia/txt2kg/assets/deploy/services/gpu-viz/Dockerfile @@ -23,7 +23,6 @@ RUN pip install --no-cache-dir -r requirements.txt # Copy the service code COPY unified_gpu_service.py . -COPY pygraphistry_service.py . # Create a non-root user for security (using a different UID to avoid conflicts) RUN useradd -m -u 1001 appuser && chown -R appuser:appuser /app diff --git a/nvidia/txt2kg/assets/deploy/services/gpu-viz/README.md b/nvidia/txt2kg/assets/deploy/services/gpu-viz/README.md index c6fd1d9..9851501 100644 --- a/nvidia/txt2kg/assets/deploy/services/gpu-viz/README.md +++ b/nvidia/txt2kg/assets/deploy/services/gpu-viz/README.md @@ -9,12 +9,11 @@ This directory contains optional GPU-accelerated graph visualization services th ## 📦 Available Services ### 1. Unified GPU Service (`unified_gpu_service.py`) -Combines **PyGraphistry Cloud** and **Local GPU (cuGraph)** processing into a single FastAPI service. +Provides **Local GPU (cuGraph)** and **CPU (NetworkX)** processing in a single FastAPI service. **Processing Modes:** | Mode | Description | Requirements | |------|-------------|--------------| -| **PyGraphistry Cloud** | Interactive GPU embeds in browser | API credentials | | **Local GPU (cuGraph)** | Full GPU processing on your hardware | NVIDIA GPU + cuGraph | | **Local CPU** | NetworkX fallback processing | None | @@ -27,9 +26,8 @@ Local GPU processing service with WebSocket support for real-time updates. ## 🛠️ Setup ### Prerequisites -- NVIDIA GPU with CUDA support (for GPU modes) +- NVIDIA GPU with CUDA support (for GPU mode) - RAPIDS cuGraph (for local GPU processing) -- PyGraphistry account (for cloud mode) ### Installation @@ -94,9 +92,8 @@ Response: ```json { "processing_modes": { - "pygraphistry_cloud": {"available": true, "description": "..."}, - "local_gpu": {"available": true, "description": "..."}, - "local_cpu": {"available": true, "description": "..."} + "local_gpu": {"available": true, "description": "Local GPU processing with cuGraph/RAPIDS"}, + "local_cpu": {"available": true, "description": "Local CPU fallback processing with NetworkX"} }, "has_rapids": true, "gpu_available": true @@ -108,33 +105,18 @@ Response: The txt2kg frontend includes built-in components for GPU visualization: - `UnifiedGPUViewer`: Connects to unified GPU service -- `PyGraphistryViewer`: Direct PyGraphistry cloud integration - `ForceGraphWrapper`: Three.js WebGPU visualization (default) ### Using GPU Services in Frontend The frontend has API routes that can connect to these services: -- `/api/pygraphistry/*`: PyGraphistry integration - `/api/unified-gpu/*`: Unified GPU service integration To use these services, ensure they are running separately and configure the frontend environment variables accordingly. -### Mode-Specific Processing +### Processing Graph Data ```javascript -// PyGraphistry Cloud mode -const response = await fetch('/api/unified-gpu/visualize', { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ - graph_data: { nodes, links }, - processing_mode: 'pygraphistry_cloud', - layout_type: 'force', - clustering: true, - gpu_acceleration: true - }) -}) - // Local GPU mode const response = await fetch('/api/unified-gpu/visualize', { method: 'POST', @@ -147,15 +129,20 @@ const response = await fetch('/api/unified-gpu/visualize', { compute_centrality: true }) }) + +// Local CPU mode +const response = await fetch('/api/unified-gpu/visualize', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + graph_data: { nodes, links }, + processing_mode: 'local_cpu' + }) +}) ``` ## 🔧 Configuration Options -### PyGraphistry Cloud Mode -- `layout_type`: "force", "circular", "hierarchical" -- `gpu_acceleration`: true/false -- `clustering`: true/false - ### Local GPU Mode - `layout_algorithm`: "force_atlas2", "spectral", "fruchterman_reingold" - `clustering_algorithm`: "leiden", "louvain", "spectral" @@ -172,8 +159,7 @@ const response = await fetch('/api/unified-gpu/visualize', { "processed_nodes": [...], "processed_edges": [...], "processing_mode": "local_gpu", - "embed_url": "https://hub.graphistry.com/...", // Only for cloud mode - "layout_positions": {...}, // Only for local GPU mode + "layout_positions": {...}, "clusters": {...}, "centrality": {...}, "stats": { @@ -187,18 +173,17 @@ const response = await fetch('/api/unified-gpu/visualize', { } ``` -## 🚀 Benefits of Unified Approach +## 🚀 Benefits ### ✅ Advantages - **Single service** - One port, one deployment - **Mode switching** - Choose best processing per graph - **Fallback handling** - Graceful degradation if GPU unavailable - **Consistent API** - Same interface for all modes -- **Better testing** - Easy comparison between modes +- **No GPL dependencies** - All dependencies are permissively licensed ### 🎯 Use Cases -- **PyGraphistry Cloud**: Sharing visualizations, demos, production embeds -- **Local GPU**: Private data, large-scale processing, custom algorithms +- **Local GPU**: Private data, large-scale processing, GPU-accelerated algorithms - **Local CPU**: Development, testing, small graphs ## 🐛 Troubleshooting @@ -212,16 +197,6 @@ nvidia-smi python -c "import cudf, cugraph; print('RAPIDS OK')" ``` -### PyGraphistry Credentials -```bash -# Verify credentials are set -echo $GRAPHISTRY_PERSONAL_KEY -echo $GRAPHISTRY_SECRET_KEY - -# Test connection -python -c "import graphistry; graphistry.register(personal_key_id='$GRAPHISTRY_PERSONAL_KEY', personal_key_secret='$GRAPHISTRY_SECRET_KEY'); print('PyGraphistry OK')" -``` - ### Service Health ```bash curl http://localhost:8080/api/health @@ -229,7 +204,13 @@ curl http://localhost:8080/api/health ## 📈 Performance Tips -1. **Large graphs (>100k nodes)**: Use `local_gpu` mode -2. **Sharing/demos**: Use `pygraphistry_cloud` mode -3. **Development**: Use `local_cpu` mode for speed -4. **Mixed workloads**: Switch modes dynamically based on graph size \ No newline at end of file +1. **Large graphs (>100k nodes)**: Use `local_gpu` mode with RAPIDS cuGraph +2. **Development**: Use `local_cpu` mode for speed and simplicity +3. **Mixed workloads**: Switch modes dynamically based on graph size and GPU availability + +## 📝 License Compliance + +This service has been updated to remove all GPL-licensed dependencies: +- ❌ Removed: `igraph` (GPL v2+) +- ❌ Removed: `graphistry` with `compute_igraph` (uses igraph internally) +- ✅ Uses only: NetworkX (BSD), cuGraph (Apache 2.0), NumPy (BSD), pandas (BSD) \ No newline at end of file diff --git a/nvidia/txt2kg/assets/deploy/services/gpu-viz/pygraphistry_service.py b/nvidia/txt2kg/assets/deploy/services/gpu-viz/pygraphistry_service.py deleted file mode 100644 index 9be0fa7..0000000 --- a/nvidia/txt2kg/assets/deploy/services/gpu-viz/pygraphistry_service.py +++ /dev/null @@ -1,712 +0,0 @@ -import graphistry -import pandas as pd -import numpy as np -from typing import Dict, List, Any, Optional -import asyncio -import json -from datetime import datetime -import logging -from fastapi import FastAPI, HTTPException, BackgroundTasks -from pydantic import BaseModel -import uvicorn -import os -import time -from concurrent.futures import ThreadPoolExecutor -import networkx as nx -from enum import Enum - -# Configure logging -logging.basicConfig(level=logging.INFO) -logger = logging.getLogger(__name__) - -# Initialize PyGraphistry -def init_graphistry(): - """Initialize PyGraphistry with GPU acceleration""" - try: - # Set up authentication - check for different credential types - api_key = os.getenv('GRAPHISTRY_API_KEY') - personal_key = os.getenv('GRAPHISTRY_PERSONAL_KEY') - secret_key = os.getenv('GRAPHISTRY_SECRET_KEY') - username = os.getenv('GRAPHISTRY_USERNAME') - password = os.getenv('GRAPHISTRY_PASSWORD') - - if personal_key and secret_key: - # Configure for cloud API with personal key and secret - graphistry.register( - api=3, - protocol="https", - server="hub.graphistry.com", - personal_key_id=personal_key, - personal_key_secret=secret_key - ) - logger.info("PyGraphistry initialized with personal key/secret for cloud GPU acceleration") - return True - elif api_key: - # Configure for cloud API with API key - graphistry.register(api=3, protocol="https", server="hub.graphistry.com", api_key=api_key) - logger.info("PyGraphistry initialized with API key for cloud GPU acceleration") - return True - elif username and password: - # Configure for cloud API with username/password - graphistry.register(api=3, protocol="https", server="hub.graphistry.com", - username=username, password=password) - logger.info("PyGraphistry initialized with username/password for cloud GPU acceleration") - return True - else: - # Configure for local mode - graphistry.register(api=3) - logger.info("PyGraphistry initialized in local CPU mode") - return True - - except Exception as e: - logger.error(f"Failed to initialize PyGraphistry: {e}") - return False - -class GraphPattern(str, Enum): - RANDOM = "random" - SCALE_FREE = "scale-free" - SMALL_WORLD = "small-world" - CLUSTERED = "clustered" - HIERARCHICAL = "hierarchical" - GRID = "grid" - -class GraphData(BaseModel): - nodes: List[Dict[str, Any]] - links: List[Dict[str, Any]] - -class GraphGenerationRequest(BaseModel): - num_nodes: int - pattern: GraphPattern = GraphPattern.SCALE_FREE - avg_degree: Optional[int] = 5 - num_clusters: Optional[int] = 100 - small_world_k: Optional[int] = 6 - small_world_p: Optional[float] = 0.1 - grid_dimensions: Optional[List[int]] = [100, 100] - seed: Optional[int] = None - -class VisualizationRequest(BaseModel): - graph_data: GraphData - layout_type: Optional[str] = "force" - gpu_acceleration: Optional[bool] = True - clustering: Optional[bool] = False - node_size_attribute: Optional[str] = None - node_color_attribute: Optional[str] = None - edge_weight_attribute: Optional[str] = None - -class GraphGenerationStatus(BaseModel): - task_id: str - status: str # "running", "completed", "failed" - progress: float - message: str - result: Optional[Dict[str, Any]] = None - error: Optional[str] = None - -class LargeGraphGenerator: - """Optimized graph generation using NetworkX and NumPy for performance""" - - @staticmethod - def generate_random_graph(num_nodes: int, avg_degree: int = 5, seed: Optional[int] = None) -> GraphData: - """Generate random graph using Erdős–Rényi model""" - if seed: - np.random.seed(seed) - - # Calculate edge probability for desired average degree - p = avg_degree / (num_nodes - 1) - - # Use NetworkX for efficient generation - G = nx.erdos_renyi_graph(num_nodes, p, seed=seed) - - return LargeGraphGenerator._networkx_to_graphdata(G) - - @staticmethod - def generate_scale_free_graph(num_nodes: int, m: int = 3, seed: Optional[int] = None) -> GraphData: - """Generate scale-free graph using Barabási–Albert model""" - G = nx.barabasi_albert_graph(num_nodes, m, seed=seed) - return LargeGraphGenerator._networkx_to_graphdata(G) - - @staticmethod - def generate_small_world_graph(num_nodes: int, k: int = 6, p: float = 0.1, seed: Optional[int] = None) -> GraphData: - """Generate small-world graph using Watts-Strogatz model""" - G = nx.watts_strogatz_graph(num_nodes, k, p, seed=seed) - return LargeGraphGenerator._networkx_to_graphdata(G) - - @staticmethod - def generate_clustered_graph(num_nodes: int, num_clusters: int = 100, seed: Optional[int] = None) -> GraphData: - """Generate clustered graph with intra and inter-cluster connections""" - if seed: - np.random.seed(seed) - - cluster_size = num_nodes // num_clusters - G = nx.Graph() - - # Add nodes with cluster information - for i in range(num_nodes): - cluster_id = i // cluster_size - G.add_node(i, cluster=cluster_id) - - # Generate intra-cluster edges - intra_prob = 0.1 - for cluster in range(num_clusters): - cluster_start = cluster * cluster_size - cluster_end = min(cluster_start + cluster_size, num_nodes) - cluster_nodes = list(range(cluster_start, cluster_end)) - - # Create subgraph for cluster - cluster_subgraph = nx.erdos_renyi_graph(len(cluster_nodes), intra_prob) - - # Add edges to main graph with proper node mapping - for edge in cluster_subgraph.edges(): - G.add_edge(cluster_nodes[edge[0]], cluster_nodes[edge[1]]) - - # Generate inter-cluster edges - inter_prob = 0.001 - for i in range(num_nodes): - for j in range(i + 1, num_nodes): - if G.nodes[i].get('cluster') != G.nodes[j].get('cluster'): - if np.random.random() < inter_prob: - G.add_edge(i, j) - - return LargeGraphGenerator._networkx_to_graphdata(G) - - @staticmethod - def generate_hierarchical_graph(num_nodes: int, branching_factor: int = 3, seed: Optional[int] = None) -> GraphData: - """Generate hierarchical (tree-like) graph""" - G = nx.random_tree(num_nodes, seed=seed) - - # Add some cross-links to make it more interesting - if seed: - np.random.seed(seed) - - # Add 10% additional edges for cross-connections - num_additional_edges = max(1, num_nodes // 10) - nodes = list(G.nodes()) - - for _ in range(num_additional_edges): - u, v = np.random.choice(nodes, 2, replace=False) - if not G.has_edge(u, v): - G.add_edge(u, v) - - return LargeGraphGenerator._networkx_to_graphdata(G) - - @staticmethod - def generate_grid_graph(dimensions: List[int], seed: Optional[int] = None) -> GraphData: - """Generate 2D or 3D grid graph""" - if len(dimensions) == 2: - G = nx.grid_2d_graph(dimensions[0], dimensions[1]) - elif len(dimensions) == 3: - G = nx.grid_graph(dimensions) - else: - raise ValueError("Grid dimensions must be 2D or 3D") - - # Convert coordinate tuples to integer node IDs - mapping = {node: i for i, node in enumerate(G.nodes())} - G = nx.relabel_nodes(G, mapping) - - return LargeGraphGenerator._networkx_to_graphdata(G) - - @staticmethod - def _networkx_to_graphdata(G: nx.Graph) -> GraphData: - """Convert NetworkX graph to GraphData format""" - nodes = [] - links = [] - - # Convert nodes - for node_id in G.nodes(): - node_data = G.nodes[node_id] - node = { - "id": f"n{node_id}", - "name": f"Node {node_id}", - "val": np.random.randint(1, 11), - "degree": G.degree(node_id) - } - - # Add cluster information if available - if 'cluster' in node_data: - node['group'] = f"cluster_{node_data['cluster']}" - else: - node['group'] = f"group_{node_id % 10}" - - nodes.append(node) - - # Convert edges - for edge in G.edges(): - link = { - "source": f"n{edge[0]}", - "target": f"n{edge[1]}", - "name": f"link_{edge[0]}_{edge[1]}", - "weight": np.random.uniform(0.1, 5.0) - } - links.append(link) - - return GraphData(nodes=nodes, links=links) - -class PyGraphistryService: - def __init__(self): - self.initialized = init_graphistry() - self.generation_tasks = {} # Store background tasks - self.executor = ThreadPoolExecutor(max_workers=4) - - async def generate_graph_async(self, request: GraphGenerationRequest, task_id: str): - """Generate graph asynchronously""" - try: - self.generation_tasks[task_id] = GraphGenerationStatus( - task_id=task_id, - status="running", - progress=0.0, - message="Starting graph generation..." - ) - - start_time = time.time() - - # Update progress - self.generation_tasks[task_id].progress = 10.0 - self.generation_tasks[task_id].message = f"Generating {request.pattern.value} graph with {request.num_nodes} nodes..." - - # Generate graph based on pattern - if request.pattern == GraphPattern.RANDOM: - graph_data = LargeGraphGenerator.generate_random_graph( - request.num_nodes, request.avg_degree, request.seed - ) - elif request.pattern == GraphPattern.SCALE_FREE: - m = min(request.avg_degree, request.num_nodes - 1) if request.avg_degree else 3 - graph_data = LargeGraphGenerator.generate_scale_free_graph( - request.num_nodes, m, request.seed - ) - elif request.pattern == GraphPattern.SMALL_WORLD: - graph_data = LargeGraphGenerator.generate_small_world_graph( - request.num_nodes, - request.small_world_k or 6, - request.small_world_p or 0.1, - request.seed - ) - elif request.pattern == GraphPattern.CLUSTERED: - graph_data = LargeGraphGenerator.generate_clustered_graph( - request.num_nodes, request.num_clusters or 100, request.seed - ) - elif request.pattern == GraphPattern.HIERARCHICAL: - graph_data = LargeGraphGenerator.generate_hierarchical_graph( - request.num_nodes, seed=request.seed - ) - elif request.pattern == GraphPattern.GRID: - # Calculate grid dimensions for given number of nodes - if request.grid_dimensions: - dimensions = request.grid_dimensions - else: - side_length = int(np.sqrt(request.num_nodes)) - dimensions = [side_length, side_length] - graph_data = LargeGraphGenerator.generate_grid_graph(dimensions, request.seed) - else: - raise ValueError(f"Unknown graph pattern: {request.pattern}") - - # Update progress - self.generation_tasks[task_id].progress = 80.0 - self.generation_tasks[task_id].message = "Computing graph statistics..." - - # Calculate statistics - generation_time = time.time() - start_time - stats = { - "node_count": len(graph_data.nodes), - "edge_count": len(graph_data.links), - "generation_time": generation_time, - "density": len(graph_data.links) / (len(graph_data.nodes) * (len(graph_data.nodes) - 1) / 2) if len(graph_data.nodes) > 1 else 0, - "avg_degree": 2 * len(graph_data.links) / len(graph_data.nodes) if len(graph_data.nodes) > 0 else 0, - "pattern": request.pattern.value, - "parameters": request.model_dump() - } - - # Complete task - self.generation_tasks[task_id].status = "completed" - self.generation_tasks[task_id].progress = 100.0 - self.generation_tasks[task_id].message = f"Generated {stats['node_count']} nodes and {stats['edge_count']} edges in {generation_time:.2f}s" - self.generation_tasks[task_id].result = { - "graph_data": graph_data.model_dump(), - "stats": stats - } - - logger.info(f"Graph generation completed for task {task_id}: {stats}") - - except Exception as e: - logger.error(f"Graph generation failed for task {task_id}: {e}") - self.generation_tasks[task_id].status = "failed" - self.generation_tasks[task_id].error = str(e) - self.generation_tasks[task_id].message = f"Generation failed: {e}" - - async def start_graph_generation(self, request: GraphGenerationRequest) -> str: - """Start graph generation as background task""" - task_id = f"gen_{int(time.time() * 1000)}" - - # Run generation in thread pool to avoid blocking - loop = asyncio.get_event_loop() - loop.run_in_executor( - self.executor, - lambda: asyncio.run(self.generate_graph_async(request, task_id)) - ) - - return task_id - - def get_generation_status(self, task_id: str) -> Optional[GraphGenerationStatus]: - """Get status of graph generation task""" - return self.generation_tasks.get(task_id) - - async def process_graph_data(self, request: VisualizationRequest) -> Dict[str, Any]: - """Process graph data with PyGraphistry GPU acceleration""" - try: - if not self.initialized: - raise HTTPException(status_code=500, detail="PyGraphistry not initialized") - - # Convert to pandas DataFrames for PyGraphistry - nodes_df = pd.DataFrame(request.graph_data.nodes) - edges_df = pd.DataFrame(request.graph_data.links) - - # Ensure required columns exist - if 'id' not in nodes_df.columns: - nodes_df['id'] = nodes_df.index - if 'source' not in edges_df.columns or 'target' not in edges_df.columns: - raise HTTPException(status_code=400, detail="Links must have source and target columns") - - logger.info(f"Processing graph with {len(nodes_df)} nodes and {len(edges_df)} edges") - - # Create PyGraphistry graph object - try: - g = graphistry.edges(edges_df, 'source', 'target').nodes(nodes_df, 'id') - logger.info(f"Created PyGraphistry graph object") - except Exception as e: - logger.error(f"Failed to create PyGraphistry graph: {e}") - raise HTTPException(status_code=500, detail=f"Graph creation failed: {e}") - - # Apply GPU-accelerated processing - if request.gpu_acceleration: - g = await self._apply_gpu_acceleration(g, request) - - # Apply clustering if requested - if request.clustering: - g = await self._apply_clustering(g) - - # Generate layout - g = await self._generate_layout(g, request.layout_type) - - # Extract processed data - try: - processed_nodes = g._nodes.to_dict('records') if g._nodes is not None else nodes_df.to_dict('records') - processed_edges = g._edges.to_dict('records') if g._edges is not None else edges_df.to_dict('records') - logger.info(f"Extracted {len(processed_nodes)} nodes and {len(processed_edges)} edges") - except Exception as e: - logger.warning(f"Data extraction failed, using original data: {e}") - processed_nodes = nodes_df.to_dict('records') - processed_edges = edges_df.to_dict('records') - - # Generate embedding URL for interactive visualization - embed_url = None - local_viz_data = None - - try: - embed_url = g.plot(render=False) - logger.info(f"Generated PyGraphistry embed URL: {embed_url}") - except Exception as e: - logger.warning(f"Could not generate embed URL (likely running in local mode): {e}") - - # Create local visualization data as fallback - try: - local_viz_data = self._create_local_viz_data(g, processed_nodes, processed_edges) - logger.info("Generated local visualization data as fallback") - except Exception as viz_e: - logger.warning(f"Could not generate local visualization data: {viz_e}") - - return { - "processed_nodes": processed_nodes, - "processed_edges": processed_edges, - "embed_url": embed_url, - "local_viz_data": local_viz_data, - "stats": { - "node_count": len(processed_nodes), - "edge_count": len(processed_edges), - "gpu_accelerated": request.gpu_acceleration, - "clustered": request.clustering, - "layout_type": request.layout_type, - "has_embed_url": embed_url is not None, - "has_local_viz": local_viz_data is not None - }, - "timestamp": datetime.now().isoformat() - } - - except Exception as e: - logger.error(f"Error processing graph data: {e}") - raise HTTPException(status_code=500, detail=str(e)) - - async def _apply_gpu_acceleration(self, g, request: VisualizationRequest): - """Apply GPU acceleration using PyGraphistry's vector processing""" - try: - if not request.gpu_acceleration: - logger.info("GPU acceleration disabled by request") - return g - - logger.info("=== GPU ACCELERATION ATTEMPT ===") - logger.info(f"PyGraphistry object type: {type(g)}") - logger.info(f"Available methods: {[method for method in dir(g) if not method.startswith('_')]}") - - # Check what GPU methods are actually available - has_compute_igraph = hasattr(g, 'compute_igraph') - has_umap = hasattr(g, 'umap') - logger.info(f"Has compute_igraph: {has_compute_igraph}") - logger.info(f"Has UMAP: {has_umap}") - - gpu_operations_successful = 0 - total_gpu_operations = 0 - - # Compute centrality measures if available - total_gpu_operations += 1 - try: - if has_compute_igraph and len(g._nodes) < 50000: # Limit for performance - logger.info("Attempting PageRank computation...") - g = g.compute_igraph('pagerank', out_col='pagerank') - logger.info("✓ SUCCESS: Computed PageRank centrality with GPU") - gpu_operations_successful += 1 - else: - reason = "too many nodes" if len(g._nodes) >= 50000 else "compute_igraph not available" - logger.warning(f"✗ SKIPPED: PageRank computation ({reason})") - except Exception as e: - logger.warning(f"✗ FAILED: PageRank computation failed: {e}") - - # Apply UMAP for node positioning if available and beneficial - total_gpu_operations += 1 - try: - if has_umap and len(g._nodes) > 100 and len(g._nodes) < 10000: - logger.info("Attempting UMAP for node positioning...") - g = g.umap() - logger.info("✓ SUCCESS: Applied UMAP for node positioning") - gpu_operations_successful += 1 - else: - reason = ("UMAP not available" if not has_umap else - "too few nodes" if len(g._nodes) <= 100 else "too many nodes") - logger.warning(f"✗ SKIPPED: UMAP processing ({reason})") - except Exception as e: - logger.warning(f"✗ FAILED: UMAP processing failed: {e}") - - logger.info(f"=== GPU ACCELERATION SUMMARY ===") - logger.info(f"GPU operations successful: {gpu_operations_successful}/{total_gpu_operations}") - logger.info(f"GPU utilization: {(gpu_operations_successful/total_gpu_operations)*100:.1f}%") - - return g - except Exception as e: - logger.warning(f"GPU acceleration failed completely, falling back to CPU: {e}") - return g - - async def _apply_clustering(self, g): - """Apply GPU-accelerated clustering""" - try: - logger.info("=== CLUSTERING ATTEMPT ===") - - # Use PyGraphistry's built-in clustering if available - if hasattr(g, 'compute_igraph') and len(g._nodes) < 20000: # Limit for performance - logger.info("Attempting Leiden community detection...") - try: - g = g.compute_igraph('community_leiden', out_col='cluster') - logger.info("✓ SUCCESS: Applied Leiden community detection") - return g - except Exception as e: - logger.warning(f"✗ FAILED: Leiden clustering failed: {e}") - logger.info("Attempting Louvain community detection as fallback...") - try: - g = g.compute_igraph('community_louvain', out_col='cluster') - logger.info("✓ SUCCESS: Applied Louvain community detection") - return g - except Exception as e2: - logger.warning(f"✗ FAILED: Louvain clustering also failed: {e2}") - else: - reason = "too many nodes" if len(g._nodes) >= 20000 else "compute_igraph not available" - logger.warning(f"✗ SKIPPED: Clustering ({reason})") - - logger.info("=== CLUSTERING SUMMARY: No clustering applied ===") - return g - except Exception as e: - logger.warning(f"Clustering failed completely: {e}") - return g - - async def _generate_layout(self, g, layout_type: str = "force"): - """Generate layout using PyGraphistry's algorithms""" - try: - logger.info(f"Generating {layout_type} layout") - - # Only apply layout computation for reasonable graph sizes - if len(g._nodes) > 50000: - logger.info("Skipping layout computation for very large graph") - return g - - if hasattr(g, 'compute_igraph'): - try: - if layout_type == "force": - g = g.compute_igraph('layout_fruchterman_reingold', out_cols=['x', 'y']) - logger.info("Applied Fruchterman-Reingold force layout") - elif layout_type == "circular": - g = g.compute_igraph('layout_circle', out_cols=['x', 'y']) - logger.info("Applied circular layout") - elif layout_type == "hierarchical": - g = g.compute_igraph('layout_sugiyama', out_cols=['x', 'y']) - logger.info("Applied hierarchical layout") - else: - # Default to force-directed - g = g.compute_igraph('layout_fruchterman_reingold', out_cols=['x', 'y']) - logger.info("Applied default force layout") - except Exception as e: - logger.warning(f"Layout computation failed: {e}") - else: - logger.info("Layout computation not available, using default positioning") - - return g - except Exception as e: - logger.warning(f"Layout generation failed: {e}") - return g - - def _create_local_viz_data(self, g, processed_nodes: List[Dict], processed_edges: List[Dict]) -> Dict[str, Any]: - """Create local visualization data when embed URL cannot be generated""" - try: - # Extract layout positions if available - positions = {} - if g._nodes is not None and 'x' in g._nodes.columns and 'y' in g._nodes.columns: - for _, row in g._nodes.iterrows(): - node_id = row.get('id', row.name) - positions[str(node_id)] = { - 'x': float(row['x']) if pd.notna(row['x']) else 0, - 'y': float(row['y']) if pd.notna(row['y']) else 0 - } - - # Add cluster information if available - clusters = {} - if g._nodes is not None and 'cluster' in g._nodes.columns: - for _, row in g._nodes.iterrows(): - node_id = row.get('id', row.name) - if pd.notna(row['cluster']): - clusters[str(node_id)] = int(row['cluster']) - - # Create enhanced nodes with layout and cluster info - enhanced_nodes = [] - for node in processed_nodes: - enhanced_node = node.copy() - node_id = str(node.get('id', '')) - - if node_id in positions: - enhanced_node.update(positions[node_id]) - - if node_id in clusters: - enhanced_node['cluster'] = clusters[node_id] - - enhanced_nodes.append(enhanced_node) - - return { - "nodes": enhanced_nodes, - "edges": processed_edges, - "positions": positions, - "clusters": clusters, - "layout_computed": len(positions) > 0, - "clusters_computed": len(clusters) > 0 - } - - except Exception as e: - logger.error(f"Failed to create local visualization data: {e}") - return { - "nodes": processed_nodes, - "edges": processed_edges, - "positions": {}, - "clusters": {}, - "layout_computed": False, - "clusters_computed": False - } - - async def get_graph_stats(self, graph_data: GraphData) -> Dict[str, Any]: - """Get GPU-accelerated graph statistics""" - try: - nodes_df = pd.DataFrame(graph_data.nodes) - edges_df = pd.DataFrame(graph_data.links) - - g = graphistry.edges(edges_df, 'source', 'target').nodes(nodes_df, 'id') - - # Compute various graph metrics using GPU acceleration - stats = { - "node_count": len(nodes_df), - "edge_count": len(edges_df), - "density": len(edges_df) / (len(nodes_df) * (len(nodes_df) - 1)) if len(nodes_df) > 1 else 0, - "timestamp": datetime.now().isoformat() - } - - # Add centrality measures if possible - try: - if len(nodes_df) < 10000 and hasattr(g, 'compute_igraph'): # Only for reasonably sized graphs - g_with_metrics = g.compute_igraph('pagerank', out_col='pagerank') - - if g_with_metrics._nodes is not None and 'pagerank' in g_with_metrics._nodes.columns: - pagerank_data = g_with_metrics._nodes['pagerank'].to_list() - stats.update({ - "avg_pagerank": float(np.mean(pagerank_data)), - "max_pagerank": float(np.max(pagerank_data)) - }) - logger.info("Computed PageRank statistics") - except Exception as e: - logger.warning(f"Could not compute centrality measures: {e}") - - return stats - - except Exception as e: - logger.error(f"Error computing graph stats: {e}") - raise HTTPException(status_code=500, detail=str(e)) - -# FastAPI app -app = FastAPI(title="PyGraphistry GPU Visualization Service", version="1.0.0") -service = PyGraphistryService() - -@app.post("/api/generate") -async def generate_graph(request: GraphGenerationRequest): - """Start graph generation as background task""" - if request.num_nodes > 1000000: - raise HTTPException(status_code=400, detail="Maximum 1 million nodes allowed") - - task_id = await service.start_graph_generation(request) - return {"task_id": task_id, "status": "started"} - -@app.get("/api/generate/{task_id}") -async def get_generation_status(task_id: str): - """Get status of graph generation task""" - status = service.get_generation_status(task_id) - if not status: - raise HTTPException(status_code=404, detail="Task not found") - return status - -@app.post("/api/visualize") -async def visualize_graph(request: VisualizationRequest): - """Process graph data with PyGraphistry GPU acceleration""" - return await service.process_graph_data(request) - -@app.post("/api/stats") -async def get_graph_statistics(graph_data: GraphData): - """Get GPU-accelerated graph statistics""" - return await service.get_graph_stats(graph_data) - -@app.get("/api/health") -async def health_check(): - """Health check endpoint""" - return { - "status": "healthy", - "pygraphistry_initialized": service.initialized, - "timestamp": datetime.now().isoformat() - } - -@app.get("/api/patterns") -async def get_available_patterns(): - """Get list of available graph generation patterns""" - return { - "patterns": [ - { - "name": pattern.value, - "description": { - GraphPattern.RANDOM: "Random graph using Erdős–Rényi model", - GraphPattern.SCALE_FREE: "Scale-free graph using Barabási–Albert model", - GraphPattern.SMALL_WORLD: "Small-world graph using Watts-Strogatz model", - GraphPattern.CLUSTERED: "Clustered graph with community structure", - GraphPattern.HIERARCHICAL: "Hierarchical tree-like graph with cross-links", - GraphPattern.GRID: "2D or 3D grid graph" - }[pattern] - } for pattern in GraphPattern - ] - } - -if __name__ == "__main__": - uvicorn.run(app, host="0.0.0.0", port=8080) \ No newline at end of file diff --git a/nvidia/txt2kg/assets/deploy/services/gpu-viz/requirements.txt b/nvidia/txt2kg/assets/deploy/services/gpu-viz/requirements.txt index ef16d7a..a1e53d8 100644 --- a/nvidia/txt2kg/assets/deploy/services/gpu-viz/requirements.txt +++ b/nvidia/txt2kg/assets/deploy/services/gpu-viz/requirements.txt @@ -1,4 +1,3 @@ -graphistry>=0.32.0 pandas>=2.0.0 numpy>=1.24.0 fastapi>=0.104.0 @@ -7,7 +6,6 @@ pydantic>=2.0.0 networkx>=3.0 # For efficient graph generation algorithms # cudf, cuml, cugraph are already included in PyG container # cupy>=12.0.0 # Already included in PyG container -igraph>=0.10.0 # For additional graph algorithms scikit-learn>=1.3.0 # For additional ML features requests>=2.31.0 aiofiles>=23.0.0 diff --git a/nvidia/txt2kg/assets/deploy/services/gpu-viz/unified_gpu_service.py b/nvidia/txt2kg/assets/deploy/services/gpu-viz/unified_gpu_service.py index 91f6682..624e583 100644 --- a/nvidia/txt2kg/assets/deploy/services/gpu-viz/unified_gpu_service.py +++ b/nvidia/txt2kg/assets/deploy/services/gpu-viz/unified_gpu_service.py @@ -2,8 +2,7 @@ """ Unified GPU Graph Visualization Service -Combines PyGraphistry cloud processing and local GPU processing with cuGraph -into a single FastAPI service for maximum flexibility. +Provides local GPU processing with cuGraph and CPU fallback with NetworkX. """ import os @@ -23,9 +22,6 @@ from concurrent.futures import ThreadPoolExecutor import networkx as nx from enum import Enum -# PyGraphistry imports -import graphistry - # GPU-accelerated imports (available in NVIDIA PyG container) try: import cudf @@ -52,7 +48,6 @@ logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) class ProcessingMode(str, Enum): - PYGRAPHISTRY_CLOUD = "pygraphistry_cloud" LOCAL_GPU = "local_gpu" LOCAL_CPU = "local_cpu" @@ -80,12 +75,7 @@ class GraphGenerationRequest(BaseModel): class UnifiedVisualizationRequest(BaseModel): graph_data: GraphData - processing_mode: ProcessingMode = ProcessingMode.PYGRAPHISTRY_CLOUD - - # PyGraphistry Cloud options - layout_type: Optional[str] = "force" - gpu_acceleration: Optional[bool] = True - clustering: Optional[bool] = False + processing_mode: ProcessingMode = ProcessingMode.LOCAL_GPU # Local GPU options layout_algorithm: Optional[str] = "force_atlas2" @@ -100,8 +90,144 @@ class GraphGenerationStatus(BaseModel): result: Optional[Dict[str, Any]] = None error: Optional[str] = None -# Import graph generation classes (keeping existing code) -from pygraphistry_service import LargeGraphGenerator, init_graphistry +class LargeGraphGenerator: + """Optimized graph generation using NetworkX and NumPy for performance""" + + @staticmethod + def generate_random_graph(num_nodes: int, avg_degree: int = 5, seed: Optional[int] = None) -> GraphData: + """Generate random graph using Erdős–Rényi model""" + if seed: + np.random.seed(seed) + + # Calculate edge probability for desired average degree + p = avg_degree / (num_nodes - 1) + + # Use NetworkX for efficient generation + G = nx.erdos_renyi_graph(num_nodes, p, seed=seed) + + return LargeGraphGenerator._networkx_to_graphdata(G) + + @staticmethod + def generate_scale_free_graph(num_nodes: int, m: int = 3, seed: Optional[int] = None) -> GraphData: + """Generate scale-free graph using Barabási–Albert model""" + G = nx.barabasi_albert_graph(num_nodes, m, seed=seed) + return LargeGraphGenerator._networkx_to_graphdata(G) + + @staticmethod + def generate_small_world_graph(num_nodes: int, k: int = 6, p: float = 0.1, seed: Optional[int] = None) -> GraphData: + """Generate small-world graph using Watts-Strogatz model""" + G = nx.watts_strogatz_graph(num_nodes, k, p, seed=seed) + return LargeGraphGenerator._networkx_to_graphdata(G) + + @staticmethod + def generate_clustered_graph(num_nodes: int, num_clusters: int = 100, seed: Optional[int] = None) -> GraphData: + """Generate clustered graph with intra and inter-cluster connections""" + if seed: + np.random.seed(seed) + + cluster_size = num_nodes // num_clusters + G = nx.Graph() + + # Add nodes with cluster information + for i in range(num_nodes): + cluster_id = i // cluster_size + G.add_node(i, cluster=cluster_id) + + # Generate intra-cluster edges + intra_prob = 0.1 + for cluster in range(num_clusters): + cluster_start = cluster * cluster_size + cluster_end = min(cluster_start + cluster_size, num_nodes) + cluster_nodes = list(range(cluster_start, cluster_end)) + + # Create subgraph for cluster + cluster_subgraph = nx.erdos_renyi_graph(len(cluster_nodes), intra_prob) + + # Add edges to main graph with proper node mapping + for edge in cluster_subgraph.edges(): + G.add_edge(cluster_nodes[edge[0]], cluster_nodes[edge[1]]) + + # Generate inter-cluster edges + inter_prob = 0.001 + for i in range(num_nodes): + for j in range(i + 1, num_nodes): + if G.nodes[i].get('cluster') != G.nodes[j].get('cluster'): + if np.random.random() < inter_prob: + G.add_edge(i, j) + + return LargeGraphGenerator._networkx_to_graphdata(G) + + @staticmethod + def generate_hierarchical_graph(num_nodes: int, branching_factor: int = 3, seed: Optional[int] = None) -> GraphData: + """Generate hierarchical (tree-like) graph""" + G = nx.random_tree(num_nodes, seed=seed) + + # Add some cross-links to make it more interesting + if seed: + np.random.seed(seed) + + # Add 10% additional edges for cross-connections + num_additional_edges = max(1, num_nodes // 10) + nodes = list(G.nodes()) + + for _ in range(num_additional_edges): + u, v = np.random.choice(nodes, 2, replace=False) + if not G.has_edge(u, v): + G.add_edge(u, v) + + return LargeGraphGenerator._networkx_to_graphdata(G) + + @staticmethod + def generate_grid_graph(dimensions: List[int], seed: Optional[int] = None) -> GraphData: + """Generate 2D or 3D grid graph""" + if len(dimensions) == 2: + G = nx.grid_2d_graph(dimensions[0], dimensions[1]) + elif len(dimensions) == 3: + G = nx.grid_graph(dimensions) + else: + raise ValueError("Grid dimensions must be 2D or 3D") + + # Convert coordinate tuples to integer node IDs + mapping = {node: i for i, node in enumerate(G.nodes())} + G = nx.relabel_nodes(G, mapping) + + return LargeGraphGenerator._networkx_to_graphdata(G) + + @staticmethod + def _networkx_to_graphdata(G: nx.Graph) -> GraphData: + """Convert NetworkX graph to GraphData format""" + nodes = [] + links = [] + + # Convert nodes + for node_id in G.nodes(): + node_data = G.nodes[node_id] + node = { + "id": f"n{node_id}", + "name": f"Node {node_id}", + "val": np.random.randint(1, 11), + "degree": G.degree(node_id) + } + + # Add cluster information if available + if 'cluster' in node_data: + node['group'] = f"cluster_{node_data['cluster']}" + else: + node['group'] = f"group_{node_id % 10}" + + nodes.append(node) + + # Convert edges + for edge in G.edges(): + link = { + "source": f"n{edge[0]}", + "target": f"n{edge[1]}", + "name": f"link_{edge[0]}_{edge[1]}", + "weight": np.random.uniform(0.1, 5.0) + } + links.append(link) + + return GraphData(nodes=nodes, links=links) class LocalGPUProcessor: """GPU-accelerated graph processing using cuGraph""" @@ -207,109 +333,10 @@ class LocalGPUProcessor: logger.error(f"GPU centrality computation failed: {e}") return {} -class PyGraphistryProcessor: - """PyGraphistry cloud processing (existing functionality)""" - - def __init__(self): - self.initialized = init_graphistry() - - async def process_graph_data(self, request: UnifiedVisualizationRequest) -> Dict[str, Any]: - """Process graph data with PyGraphistry GPU acceleration""" - try: - if not self.initialized: - raise HTTPException(status_code=500, detail="PyGraphistry not initialized") - - # Convert to pandas DataFrames for PyGraphistry - nodes_df = pd.DataFrame(request.graph_data.nodes) - edges_df = pd.DataFrame(request.graph_data.links) - - # Ensure required columns exist - if 'id' not in nodes_df.columns: - nodes_df['id'] = nodes_df.index - if 'source' not in edges_df.columns or 'target' not in edges_df.columns: - raise HTTPException(status_code=400, detail="Links must have source and target columns") - - logger.info(f"Processing graph with {len(nodes_df)} nodes and {len(edges_df)} edges") - - # Create PyGraphistry graph object - g = graphistry.edges(edges_df, 'source', 'target').nodes(nodes_df, 'id') - - # Apply GPU-accelerated processing - if request.gpu_acceleration: - g = await self._apply_gpu_acceleration(g, request) - - # Apply clustering if requested - if request.clustering: - g = await self._apply_clustering(g) - - # Generate layout - g = await self._generate_layout(g, request.layout_type) - - # Extract processed data - processed_nodes = g._nodes.to_dict('records') if g._nodes is not None else nodes_df.to_dict('records') - processed_edges = g._edges.to_dict('records') if g._edges is not None else edges_df.to_dict('records') - - # Generate embedding URL for interactive visualization - embed_url = None - local_viz_data = None - - try: - embed_url = g.plot(render=False) - logger.info(f"Generated PyGraphistry embed URL: {embed_url}") - except Exception as e: - logger.warning(f"Could not generate embed URL (likely running in local mode): {e}") - - # Create local visualization data as fallback - try: - local_viz_data = self._create_local_viz_data(g, processed_nodes, processed_edges) - logger.info("Generated local visualization data as fallback") - except Exception as viz_e: - logger.warning(f"Could not generate local visualization data: {viz_e}") - - return { - "processed_nodes": processed_nodes, - "processed_edges": processed_edges, - "embed_url": embed_url, - "local_viz_data": local_viz_data, - "processing_mode": ProcessingMode.PYGRAPHISTRY_CLOUD, - "stats": { - "node_count": len(processed_nodes), - "edge_count": len(processed_edges), - "gpu_accelerated": request.gpu_acceleration, - "clustered": request.clustering, - "layout_type": request.layout_type, - "has_embed_url": embed_url is not None, - "has_local_viz": local_viz_data is not None - }, - "timestamp": datetime.now().isoformat() - } - - except Exception as e: - logger.error(f"Error processing graph data: {e}") - raise HTTPException(status_code=500, detail=str(e)) - - # ... (include other PyGraphistry methods from original service) - async def _apply_gpu_acceleration(self, g, request): - # Implementation from original service - pass - - async def _apply_clustering(self, g): - # Implementation from original service - pass - - async def _generate_layout(self, g, layout_type): - # Implementation from original service - pass - - def _create_local_viz_data(self, g, processed_nodes, processed_edges): - # Implementation from original service - pass - class UnifiedGPUService: - """Unified service offering both PyGraphistry cloud and local GPU processing""" + """Unified service offering local GPU and CPU processing""" def __init__(self): - self.pygraphistry_processor = PyGraphistryProcessor() self.local_gpu_processor = LocalGPUProcessor() self.generation_tasks = {} self.executor = ThreadPoolExecutor(max_workers=4) @@ -318,12 +345,8 @@ class UnifiedGPUService: async def process_graph(self, request: UnifiedVisualizationRequest) -> Dict[str, Any]: """Process graph with selected processing mode""" - if request.processing_mode == ProcessingMode.PYGRAPHISTRY_CLOUD: - return await self.pygraphistry_processor.process_graph_data(request) - - elif request.processing_mode == ProcessingMode.LOCAL_GPU: + if request.processing_mode == ProcessingMode.LOCAL_GPU: return await self._process_with_local_gpu(request) - else: # LOCAL_CPU return await self._process_with_local_cpu(request) @@ -435,7 +458,7 @@ service = UnifiedGPUService() @app.post("/api/visualize") async def visualize_graph(request: UnifiedVisualizationRequest): - """Process graph with unified service (supports all processing modes)""" + """Process graph with unified service (supports local GPU and CPU modes)""" result = await service.process_graph(request) # Broadcast to connected WebSocket clients @@ -462,17 +485,13 @@ async def get_capabilities(): """Get GPU capabilities and available processing modes""" return { "processing_modes": { - "pygraphistry_cloud": { - "available": service.pygraphistry_processor.initialized, - "description": "PyGraphistry cloud GPU processing with interactive embeds" - }, "local_gpu": { "available": HAS_RAPIDS, "description": "Local GPU processing with cuGraph/RAPIDS" }, "local_cpu": { "available": True, - "description": "Local CPU fallback processing" + "description": "Local CPU fallback processing with NetworkX" } }, "has_rapids": HAS_RAPIDS, @@ -524,7 +543,6 @@ async def health_check(): """Health check endpoint""" return { "status": "healthy", - "pygraphistry_initialized": service.pygraphistry_processor.initialized, "local_gpu_available": HAS_RAPIDS, "torch_geometric": HAS_TORCH_GEOMETRIC, "timestamp": datetime.now().isoformat() @@ -555,7 +573,6 @@ async def get_visualization_page():
@@ -740,23 +757,8 @@ def startup_diagnostics(): else: print("⚠ PyTorch Geometric not available") - # Check PyGraphistry credentials - print("Checking PyGraphistry credentials...") - personal_key = os.getenv('GRAPHISTRY_PERSONAL_KEY') - secret_key = os.getenv('GRAPHISTRY_SECRET_KEY') - api_key = os.getenv('GRAPHISTRY_API_KEY') - - if personal_key and secret_key: - print("✓ PyGraphistry personal key/secret found") - elif api_key: - print("✓ PyGraphistry API key found") - else: - print("⚠ No PyGraphistry credentials found - cloud mode will be limited") - print(" Set GRAPHISTRY_PERSONAL_KEY + GRAPHISTRY_SECRET_KEY for full cloud features") - print("") print("🎯 Available Processing Modes:") - print(" ☁️ PyGraphistry Cloud - Interactive GPU embeds (requires credentials)") print(" 🚀 Local GPU (cuGraph) - Full local GPU processing") print(" 💻 Local CPU - NetworkX fallback") print("") @@ -770,4 +772,4 @@ def startup_diagnostics(): if __name__ == "__main__": startup_diagnostics() - uvicorn.run(app, host="0.0.0.0", port=8080) \ No newline at end of file + uvicorn.run(app, host="0.0.0.0", port=8080)