diff --git a/docs/api_reference/create_api_rst.py b/docs/api_reference/create_api_rst.py index f957452f17..448a3c4d6f 100644 --- a/docs/api_reference/create_api_rst.py +++ b/docs/api_reference/create_api_rst.py @@ -10,12 +10,21 @@ from pathlib import Path from typing import Dict, List, Literal, Optional, Sequence, TypedDict, Union import toml +import typing_extensions +from langchain_core.runnables import Runnable, RunnableSerializable from pydantic import BaseModel ROOT_DIR = Path(__file__).parents[2].absolute() HERE = Path(__file__).parent -ClassKind = Literal["TypedDict", "Regular", "Pydantic", "enum"] +ClassKind = Literal[ + "TypedDict", + "Regular", + "Pydantic", + "enum", + "RunnablePydantic", + "RunnableNonPydantic", +] class ClassInfo(TypedDict): @@ -69,8 +78,36 @@ def _load_module_members(module_path: str, namespace: str) -> ModuleMembers: continue if inspect.isclass(type_): - if type(type_) == typing._TypedDictMeta: # type: ignore + # The clasification of the class is used to select a template + # for the object when rendering the documentation. + # See `templates` directory for defined templates. + # This is a hacky solution to distinguish between different + # kinds of thing that we want to render. + if type(type_) is typing_extensions._TypedDictMeta: # type: ignore kind: ClassKind = "TypedDict" + elif type(type_) is typing._TypedDictMeta: # type: ignore + kind: ClassKind = "TypedDict" + elif ( + issubclass(type_, Runnable) + and issubclass(type_, BaseModel) + and type_ is not Runnable + ): + # RunnableSerializable subclasses from Pydantic which + # for which we use autodoc_pydantic for rendering. + # We need to distinguish these from regular Pydantic + # classes so we can hide inherited Runnable methods + # and provide a link to the Runnable interface from + # the template. + kind = "RunnablePydantic" + elif ( + issubclass(type_, Runnable) + and not issubclass(type_, BaseModel) + and type_ is not Runnable + ): + # These are not pydantic classes but are Runnable. + # We'll hide all the inherited methods from Runnable + # but use a regular class template to render. + kind = "RunnableNonPydantic" elif issubclass(type_, Enum): kind = "enum" elif issubclass(type_, BaseModel): @@ -251,6 +288,10 @@ Classes template = "enum.rst" elif class_["kind"] == "Pydantic": template = "pydantic.rst" + elif class_["kind"] == "RunnablePydantic": + template = "runnable_pydantic.rst" + elif class_["kind"] == "RunnableNonPydantic": + template = "runnable_non_pydantic.rst" else: template = "class.rst" diff --git a/docs/api_reference/templates/class.rst b/docs/api_reference/templates/class.rst index 6c0256324e..15046e2702 100644 --- a/docs/api_reference/templates/class.rst +++ b/docs/api_reference/templates/class.rst @@ -33,4 +33,4 @@ {% endblock %} -.. example_links:: {{ objname }} \ No newline at end of file +.. example_links:: {{ objname }} diff --git a/docs/api_reference/templates/pydantic.rst b/docs/api_reference/templates/pydantic.rst index 72a4c28b82..2c447ea110 100644 --- a/docs/api_reference/templates/pydantic.rst +++ b/docs/api_reference/templates/pydantic.rst @@ -15,6 +15,8 @@ :member-order: groupwise :show-inheritance: True :special-members: __call__ + :exclude-members: construct, copy, dict, from_orm, parse_file, parse_obj, parse_raw, schema, schema_json, update_forward_refs, validate, json, is_lc_serializable, to_json, to_json_not_implemented, lc_secrets, lc_attributes, lc_id, get_lc_namespace + {% block attributes %} {% endblock %} diff --git a/docs/api_reference/templates/runnable_non_pydantic.rst b/docs/api_reference/templates/runnable_non_pydantic.rst new file mode 100644 index 0000000000..7b9f8681e6 --- /dev/null +++ b/docs/api_reference/templates/runnable_non_pydantic.rst @@ -0,0 +1,39 @@ +:mod:`{{module}}`.{{objname}} +{{ underline }}============== + +.. NOTE:: {{objname}} implements the standard :py:class:`Runnable Interface `. 🏃 + + +.. currentmodule:: {{ module }} + +.. autoclass:: {{ objname }} + + {% block attributes %} + {% if attributes %} + .. rubric:: {{ _('Attributes') }} + + .. autosummary:: + {% for item in attributes %} + ~{{ name }}.{{ item }} + {%- endfor %} + {% endif %} + {% endblock %} + + {% block methods %} + {% if methods %} + .. rubric:: {{ _('Methods') }} + + .. autosummary:: + {% for item in methods %} + ~{{ name }}.{{ item }} + {%- endfor %} + + {% for item in methods %} + .. automethod:: {{ name }}.{{ item }} + {%- endfor %} + + {% endif %} + {% endblock %} + + +.. example_links:: {{ objname }} diff --git a/docs/api_reference/templates/runnable_pydantic.rst b/docs/api_reference/templates/runnable_pydantic.rst new file mode 100644 index 0000000000..9532a5da64 --- /dev/null +++ b/docs/api_reference/templates/runnable_pydantic.rst @@ -0,0 +1,22 @@ +:mod:`{{module}}`.{{objname}} +{{ underline }}============== + +.. NOTE:: {{objname}} implements the standard :py:class:`Runnable Interface `. 🏃 + +.. currentmodule:: {{ module }} + +.. autopydantic_model:: {{ objname }} + :model-show-json: False + :model-show-config-summary: False + :model-show-validator-members: False + :model-show-field-summary: False + :field-signature-prefix: param + :members: + :undoc-members: + :inherited-members: + :member-order: groupwise + :show-inheritance: True + :special-members: __call__ + :exclude-members: construct, copy, dict, from_orm, parse_file, parse_obj, parse_raw, schema, schema_json, update_forward_refs, validate, json, is_lc_serializable, to_json, to_json_not_implemented, lc_secrets, lc_attributes, lc_id, get_lc_namespace, invoke, ainvoke, batch, abatch, batch_as_completed, abatch_as_completed, astream_log, stream, astream, astream_events, transform, atransform, get_output_schema, get_prompts, configurable_fields, configurable_alternatives, config_schema, map, pick, pipe, with_listeners, with_alisteners, with_config, with_fallbacks, with_types, with_retry, InputType, OutputType, config_specs, output_schema, get_input_schema, get_graph, get_name, input_schema, name, bind, assign + +.. example_links:: {{ objname }}