diff --git a/.github/code_spell_ignore.txt b/.github/code_spell_ignore.txt
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/.github/license_template.txt b/.github/license_template.txt
new file mode 100644
index 0000000000..4987549106
--- /dev/null
+++ b/.github/license_template.txt
@@ -0,0 +1,13 @@
+Copyright (c) 2024 Intel Corporation
+
+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.
\ No newline at end of file
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
new file mode 100644
index 0000000000..e7f8c055ef
--- /dev/null
+++ b/.pre-commit-config.yaml
@@ -0,0 +1,122 @@
+ci:
+  autofix_prs: true
+  autoupdate_schedule: quarterly
+
+repos:
+  - repo: https://github.com/pre-commit/pre-commit-hooks
+    rev: v4.5.0
+    hooks:
+      - id: end-of-file-fixer
+        files: (.*\.(py|md|rst|yaml|yml|json|ts|js|html|svelte|sh))$
+      - id: check-json
+        exclude: |
+          (?x)^(
+              ChatQnA/ui/tsconfig.json
+          )$
+      - id: check-yaml
+      - id: debug-statements
+      - id: requirements-txt-fixer
+      - id: trailing-whitespace
+        files: (.*\.(py|rst|cmake|yaml|yml|json|ts|js|html|svelte|sh))$
+
+  - repo: https://github.com/Lucas-C/pre-commit-hooks
+    rev: v1.5.5
+    hooks:
+      - id: insert-license
+        files: |
+          (?x)^(
+            (ChatQnA|CodeGen|DocSum|VisualQnA)/.*(py|yaml|yml|sh)|
+          )$
+        args:
+          [
+            --license-filepath=.github/license_template.txt,
+            --use-current-year,
+            --detect-license-in-X-top-lines=40,
+            --skip-license-insertion-comment=Copyright,
+          ]
+      - id: insert-license
+        files: |
+          (?x)^(
+            (ChatQnA|CodeGen|DocSum|VisualQnA)/.*(ts|js)|
+          )$
+        args:
+          [
+            --license-filepath=.github/license_template.txt,
+            --use-current-year,
+            --detect-license-in-X-top-lines=40,
+            --skip-license-insertion-comment=Copyright,
+            --comment-style=//,
+          ]
+      - id: insert-license
+        files: |
+          (?x)^(
+            (ChatQnA|CodeGen|DocSum|VisualQnA)/.*(html|svelte)|
+          )$
+        args:
+          [
+            --license-filepath=.github/license_template.txt,
+            --use-current-year,
+            --detect-license-in-X-top-lines=40,
+            --skip-license-insertion-comment=Copyright,
+            --comment-style=<!--| |-->,
+          ]
+
+  - repo: https://github.com/asottile/yesqa
+    rev: v1.5.0
+    hooks:
+      - id: yesqa
+        name: Unused noqa
+
+  - repo: https://github.com/pycqa/isort
+    rev: 5.13.2
+    hooks:
+      - id: isort
+
+  - repo: https://github.com/PyCQA/docformatter
+    rev: v1.7.5
+    hooks:
+      - id: docformatter
+        args: [
+            --in-place,
+            --wrap-summaries=0, # 0 means disable wrap
+            --wrap-descriptions=0, # 0 means disable wrap
+            --black,
+            --style=google,
+          ]
+
+  - repo: https://github.com/pre-commit/mirrors-prettier
+    rev: "v3.1.0" # Use the sha / tag you want to point at
+    hooks:
+      - id: prettier
+        args: [--print-width=120]
+        types_or: [yaml, markdown, html, css, scss, javascript, json]
+        additional_dependencies:
+          - prettier@3.2.5
+
+  - repo: https://github.com/psf/black.git
+    rev: 24.3.0
+    hooks:
+      - id: black
+        files: (.*\.py)$
+
+  - repo: https://github.com/asottile/blacken-docs
+    rev: 1.16.0
+    hooks:
+      - id: blacken-docs
+        args: [--line-length=120, --skip-errors]
+        additional_dependencies:
+          - black==24.3.0
+
+  - repo: https://github.com/codespell-project/codespell
+    rev: v2.2.6
+    hooks:
+      - id: codespell
+        args: [-w]
+        additional_dependencies:
+          - tomli
+
+  - repo: https://github.com/astral-sh/ruff-pre-commit
+    rev: v0.3.4
+    hooks:
+      - id: ruff
+        args: [--fix, --exit-non-zero-on-fix, --no-cache]
diff --git a/ChatQnA/langchain/test/README.md b/ChatQnA/langchain/test/README.md
index 929c99eb1d..44d338e33b 100644
--- a/ChatQnA/langchain/test/README.md
+++ b/ChatQnA/langchain/test/README.md
@@ -6,11 +6,13 @@ Pre-requisite: Signup in langsmith [https://www.langchain.com/langsmith] and get
 3. Statr redis container with docker-compose-redis.yml
 4. Add your hugging face access token in docker-compose-langchain.yml and start langchain-rag-server container
 5. enter into langchain-rag-server container and start jupyter notebook server (can specify needed IP address and jupyter will run on port 8888)
-        ```
-        docker exec -it langchain-rag-server bash
-        cd /test
-        jupyter notebook --allow-root --ip=X.X.X.X
-        ```
+
+```
+docker exec -it langchain-rag-server bash
+cd /test
+jupyter notebook --allow-root --ip=X.X.X.X
+```
+
 6. Launch jupyter notebook in your browser and open the tgi_gaudi.ipynb notebook
 7. Add langsmith api key in first cell of the notebook [os.environ["LANGCHAIN_API_KEY"] = "add-your-langsmith-key"  # Your API key]
 8. Clear all the cells and run all the cells
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000000..c6087c97f1
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,108 @@
+[tool.isort]
+profile = "black"
+line_length = 120
+extend_skip_glob = ["**/__init__.py"]
+
+
+[tool.black]
+line-length = 120
+
+
+[tool.codespell]
+skip = '*.po,*.js,*.map,*.js.map,*.css.map,*.json'
+count = ''
+quiet-level = 3
+ignore-words = ".github/code_spell_ignore.txt"
+
+
+[tool.ruff]
+# Exclude a variety of commonly ignored directories.
+exclude = [
+    ".bzr",
+    ".direnv",
+    ".eggs",
+    ".git",
+    ".git-rewrite",
+    ".hg",
+    ".ipynb_checkpoints",
+    ".mypy_cache",
+    ".nox",
+    ".pants.d",
+    ".pyenv",
+    ".pytest_cache",
+    ".pytype",
+    ".ruff_cache",
+    ".svn",
+    ".tox",
+    ".venv",
+    ".vscode",
+    "__pypackages__",
+    "_build",
+    "buck-out",
+    "build",
+    "dist",
+    "node_modules",
+    "site-packages",
+    "venv",
+]
+
+# Same as Black.
+line-length = 120
+indent-width = 4
+
+# Assume Python 3.10
+target-version = "py310"
+
+[tool.ruff.lint]
+# Enable Pyflakes (`F`) and a subset of the pycodestyle (`E`)  codes by default.
+# Unlike Flake8, Ruff doesn't enable pycodestyle warnings (`W`) or
+# McCabe complexity (`C901`) by default.
+select = ["E4", "E7", "E9", "F"]
+ignore = [
+    "E402", # Module level import not at top of file
+    "E501", # Line too long (121 > 120 characters)
+    "E721", # Do not compare types, use isinstance()
+    "E722", # Do not use bare except
+    "E731", # Do not assign a lambda expression, use a def
+    "E741", # Do not use variables named ‘l’, ‘O’, or ‘I’
+    "F401", # {name} imported but unused
+    "F403", # from {name} import * used; unable to detect undefined names
+    "F405", # {name} may be undefined, or defined from star imports
+    "F841", # Local variable is assigned to but never used{name}
+]
+
+# Allow fix for all enabled rules (when `--fix`) is provided.
+fixable = ["ALL"]
+unfixable = []
+
+# Allow unused variables when underscore-prefixed.
+dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"
+
+ignore-init-module-imports = true
+
+[tool.ruff.format]
+# Like Black, use double quotes for strings.
+quote-style = "double"
+
+# Like Black, indent with spaces, rather than tabs.
+indent-style = "space"
+
+# Like Black, respect magic trailing commas.
+skip-magic-trailing-comma = false
+
+# Like Black, automatically detect the appropriate line ending.
+line-ending = "auto"
+
+# Enable auto-formatting of code examples in docstrings. Markdown,
+# reStructuredText code/literal blocks and doctests are all supported.
+#
+# This is currently disabled by default, but it is planned for this
+# to be opt-out in the future.
+docstring-code-format = false
+
+# Set the line length limit used when formatting code snippets in
+# docstrings.
+#
+# This only has an effect when the `docstring-code-format` setting is
+# enabled.
+docstring-code-line-length = "dynamic"
