From 3d925165f2b18379640a63fbb42de95440d63b64 Mon Sep 17 00:00:00 2001 From: Harry Mellor <19981378+hmellor@users.noreply.github.com> Date: Mon, 22 Apr 2024 17:36:54 +0100 Subject: [PATCH] Add example scripts to documentation (#4225) Co-authored-by: Harry Mellor --- .gitignore | 2 + docs/source/conf.py | 9 ++- docs/source/generate_examples.py | 61 +++++++++++++++++++ .../examples/examples_index.template.rst | 8 +++ docs/source/index.rst | 1 + ...nt.py => openai_chat_completion_client.py} | 0 6 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 docs/source/generate_examples.py create mode 100644 docs/source/getting_started/examples/examples_index.template.rst rename examples/{openai_chatcompletion_client.py => openai_chat_completion_client.py} (100%) diff --git a/.gitignore b/.gitignore index b1513ef0ddb0c..e077366d1e4a1 100644 --- a/.gitignore +++ b/.gitignore @@ -70,6 +70,8 @@ instance/ # Sphinx documentation docs/_build/ +docs/source/getting_started/examples/*.rst +!**/*.template.rst # PyBuilder .pybuilder/ diff --git a/docs/source/conf.py b/docs/source/conf.py index cfa956b143ba3..aac8cbb63ebeb 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -48,7 +48,7 @@ # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This pattern also affects html_static_path and html_extra_path. -exclude_patterns: List[str] = [] +exclude_patterns: List[str] = ["**/*.template.rst"] # Exclude the prompt "$" when copying code copybutton_prompt_text = r"\$ " @@ -73,6 +73,13 @@ # so a file named "default.css" will overwrite the builtin "default.css". # html_static_path = ['_static'] + +# Generate additional rst documentation here. +def setup(app): + from docs.source.generate_examples import generate_examples + generate_examples() + + # Mock out external dependencies here. autodoc_mock_imports = [ "cpuinfo", diff --git a/docs/source/generate_examples.py b/docs/source/generate_examples.py new file mode 100644 index 0000000000000..79b49a186236a --- /dev/null +++ b/docs/source/generate_examples.py @@ -0,0 +1,61 @@ +import re +from pathlib import Path + + +def fix_case(text: str) -> str: + subs = [ + ("api", "API"), + ("llm", "LLM"), + ("vllm", "vLLM"), + ("openai", "OpenAI"), + ("multilora", "MultiLoRA"), + ] + for sub in subs: + text = re.sub(*sub, text, flags=re.IGNORECASE) + return text + + +def underline(title: str, character: str = "=") -> str: + return f"{title}\n{character * len(title)}" + + +def generate_title(filename: str) -> str: + # Turn filename into a title + title = filename.replace("_", " ").title() + # Handle acronyms and names + title = fix_case(title) + # Underline title + title = underline(title) + return title + + +def generate_examples(): + root_dir = Path(__file__).parent.parent.parent.resolve() + + # Source paths + script_dir = root_dir / "examples" + script_paths = sorted(script_dir.glob("*.py")) + + # Destination paths + doc_dir = root_dir / "docs/source/getting_started/examples" + doc_paths = [doc_dir / f"{path.stem}.rst" for path in script_paths] + + # Generate the example docs for each example script + for script_path, doc_path in zip(script_paths, doc_paths): + script_url = f"https://github.com/vllm-project/vllm/blob/main/examples/{script_path.name}" + # Make script_path relative to doc_path and call it include_path + include_path = '../../../..' / script_path.relative_to(root_dir) + content = (f"{generate_title(doc_path.stem)}\n\n" + f"Source {script_url}.\n\n" + f".. literalinclude:: {include_path}\n" + " :language: python\n" + " :linenos:\n") + with open(doc_path, "w+") as f: + f.write(content) + + # Generate the toctree for the example scripts + with open(doc_dir / "examples_index.template.rst") as f: + examples_index = f.read() + with open(doc_dir / "examples_index.rst", "w+") as f: + example_docs = "\n ".join(path.stem for path in script_paths) + f.write(examples_index.replace(r"%EXAMPLE_DOCS%", example_docs)) diff --git a/docs/source/getting_started/examples/examples_index.template.rst b/docs/source/getting_started/examples/examples_index.template.rst new file mode 100644 index 0000000000000..1b34cccbae15a --- /dev/null +++ b/docs/source/getting_started/examples/examples_index.template.rst @@ -0,0 +1,8 @@ +Examples +================================= + +.. toctree:: + :maxdepth: 1 + :caption: Scripts + + %EXAMPLE_DOCS% diff --git a/docs/source/index.rst b/docs/source/index.rst index 5d5d52696ba34..e8daa5f052754 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -65,6 +65,7 @@ Documentation getting_started/neuron-installation getting_started/cpu-installation getting_started/quickstart + getting_started/examples/examples_index .. toctree:: :maxdepth: 1 diff --git a/examples/openai_chatcompletion_client.py b/examples/openai_chat_completion_client.py similarity index 100% rename from examples/openai_chatcompletion_client.py rename to examples/openai_chat_completion_client.py