Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add mypy checker #346

Merged
merged 16 commits into from
Oct 8, 2024
Merged

Add mypy checker #346

merged 16 commits into from
Oct 8, 2024

Conversation

leehuwuj
Copy link
Collaborator

@leehuwuj leehuwuj commented Oct 7, 2024

Summary by CodeRabbit

  • New Features

    • Added a pre-commit hook for formatting checks on template files.
    • Enhanced dependency management for various model configurations.
    • Improved error handling and logging during initialization processes.
  • Bug Fixes

    • Updated handling of environment variables to prevent potential errors.
    • Added checks to prevent errors in event handling logic.
  • Documentation

    • Enhanced type annotations and comments for better clarity across multiple files.
  • Chores

    • Introduced mypy for type-checking capabilities in the project.

Copy link

changeset-bot bot commented Oct 7, 2024

⚠️ No Changeset found

Latest commit: 472a9b4

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

Copy link

coderabbitai bot commented Oct 7, 2024

Walkthrough

This pull request introduces several changes across multiple files, focusing on enhancing code quality, improving error handling, and refining type annotations. Notably, a new command for formatting checks is added to the pre-commit hook. The test suite for resolving Python dependencies is restructured for specific checks, while various functions across the codebase receive updates to their type annotations and error handling mechanisms. Additionally, the pyproject.toml file is updated to include a new section for development dependencies, specifically for mypy, enhancing type-checking capabilities.

Changes

File Change Summary
.husky/pre-commit Added command: uvx ruff format --check templates/ for formatting checks.
e2e/python/resolve_dependencies.spec.ts Restructured test suite for specific checks on Mypy, vector databases, tools, and data sources; improved error handling and logging in createAndCheckLlamaProject.
helpers/python.ts Changed PostgreSQL dependency from "psycopg2" to "psycopg2-binary"; added new dependencies based on modelConfig.provider.
templates/components/engines/python/agent/engine.py Added type annotations for tools and configured_tools variables in get_chat_engine.
templates/components/engines/python/agent/tools/__init__.py Updated method signatures for load_tools and from_env with improved type annotations.
templates/components/engines/python/agent/tools/artifact.py Added # type: ignore comment for type checking on sllm assignment in artifact method.
templates/components/engines/python/agent/tools/duckduckgo.py Simplified parameter handling by removing intermediate dictionary in duckduckgo_search and duckduckgo_image_search.
templates/components/engines/python/chat/__init__.py Added get_chat_engine to __all__ for public API exposure.
templates/components/engines/python/chat/engine.py Added # type: ignore comment for node_postprocessors parameter in get_chat_engine.
templates/components/loaders/python/__init__.py Updated return types for load_configs and get_documents functions with type annotations.
templates/components/loaders/python/db.py Added error handling for DatabaseReader import in get_db_documents function.
templates/components/loaders/python/web.py Changed driver_arguments to Optional[List[str]] in WebLoaderConfig.
templates/components/settings/python/llmhub.py Enhanced error handling in init_llmhub function with logging.
templates/components/settings/python/settings.py Improved error handling in multiple initialization functions for model providers.
templates/components/vectordbs/python/astra/vectordb.py Set default value of 768 for EMBEDDING_DIM in get_vector_store.
templates/components/vectordbs/python/chroma/vectordb.py Updated port handling in get_vector_store to use default value of "8001".
templates/components/vectordbs/python/milvus/vectordb.py Set default value of 768 for EMBEDDING_DIM in get_vector_store.
templates/types/extractor/fastapi/app/engine/generate.py Added import for DocstoreStrategy and updated run_pipeline function for type safety.
templates/types/extractor/fastapi/app/engine/index.py Updated get_index signature for improved type clarity.
templates/types/streaming/fastapi/app/api/routers/chat.py Updated import for get_chat_engine with # type: ignore.
templates/types/streaming/fastapi/app/api/routers/events.py Enhanced CallbackEvent methods with additional checks and updated method signatures.
templates/types/streaming/fastapi/app/api/routers/models.py Improved type annotations in Annotation class and SourceNodes class methods.
templates/types/streaming/fastapi/app/engine/__init__.py Added __all__ declaration for public entity export.
templates/types/streaming/fastapi/pyproject.toml Added mypy dependency and configuration settings for type checking.

Possibly related PRs

Suggested reviewers

  • marcusschiesser: Suggested for review due to relevant expertise in the codebase.

Poem

🐇 In the burrow where code does play,
Formatting checks come out to stay.
With tests refined and types in line,
Our project grows, oh how it shines!
Dependencies managed, errors caught,
A hop and a skip, we’ve changed a lot! 🐇


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@leehuwuj leehuwuj force-pushed the feat/add-mypy-checker branch from 47942fd to 434063b Compare October 8, 2024 02:56
@leehuwuj leehuwuj force-pushed the feat/add-mypy-checker branch from 5c832c0 to 5ad2924 Compare October 8, 2024 03:13
@leehuwuj leehuwuj marked this pull request as ready for review October 8, 2024 03:27
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 12

🧹 Outside diff range and nitpick comments (24)
templates/components/vectordbs/python/milvus/vectordb.py (2)

19-19: Approve change with suggestions for further improvement

The modification to provide a default value for EMBEDDING_DIM is a good improvement in robustness. It prevents potential ValueErrors when the environment variable is not set.

However, consider the following enhancements for even better user experience and robustness:

  1. Add a warning log when falling back to the default value, to notify users that they haven't set EMBEDDING_DIM.
  2. Consider adding a validation check to ensure the dimension is within an expected range for your use case.

Here's a suggested implementation incorporating these improvements:

import logging

# ... (rest of the imports)

def get_vector_store():
    # ... (previous code)
    
    embedding_dim = os.getenv("EMBEDDING_DIM")
    if embedding_dim is None:
        logging.warning("EMBEDDING_DIM not set. Using default value of 768.")
        embedding_dim = 768
    else:
        embedding_dim = int(embedding_dim)
    
    # Optional: Add validation
    if not (100 <= embedding_dim <= 2000):  # adjust range as needed
        raise ValueError(f"EMBEDDING_DIM {embedding_dim} is outside the expected range (100-2000)")
    
    store = MilvusVectorStore(
        # ... (other parameters)
        dim=embedding_dim,
    )
    return store

This implementation provides more visibility into the use of default values and adds a safeguard against unexpected dimension values.


Consistent Handling of Environment Variables

The verification confirms that environment variables across the codebase are handled inconsistently. Implementing a uniform approach, as suggested in the review comment, will enhance code robustness and maintainability.

🔗 Analysis chain

Line range hint 1-21: Suggest consistent handling of environment variables

While the function correctly handles critical environment variables and the recent change improves robustness for EMBEDDING_DIM, there's an opportunity to make the handling of all environment variables more consistent. This would improve overall code quality and prevent potential issues.

Consider refactoring the function to handle all environment variables uniformly. Here's a suggested approach:

import os
import logging
from typing import Optional

from llama_index.vector_stores.milvus import MilvusVectorStore

def get_env_var(name: str, default: Optional[str] = None, required: bool = False) -> Optional[str]:
    value = os.getenv(name, default)
    if required and value is None:
        raise ValueError(f"Environment variable {name} is required but not set.")
    return value

def get_vector_store() -> MilvusVectorStore:
    address = get_env_var("MILVUS_ADDRESS", required=True)
    collection = get_env_var("MILVUS_COLLECTION", required=True)
    username = get_env_var("MILVUS_USERNAME")
    password = get_env_var("MILVUS_PASSWORD")
    
    embedding_dim_str = get_env_var("EMBEDDING_DIM", default="768")
    try:
        embedding_dim = int(embedding_dim_str)
        if not (100 <= embedding_dim <= 2000):  # adjust range as needed
            raise ValueError
    except ValueError:
        logging.warning(f"Invalid EMBEDDING_DIM '{embedding_dim_str}'. Using default value of 768.")
        embedding_dim = 768

    return MilvusVectorStore(
        uri=address,
        user=username,
        password=password,
        collection_name=collection,
        dim=embedding_dim,
    )

This refactoring:

  1. Introduces a helper function get_env_var for consistent environment variable handling.
  2. Treats all variables consistently, with clear indication of which are required.
  3. Improves error handling and logging for the EMBEDDING_DIM variable.
  4. Makes the function more readable and maintainable.

To ensure this refactoring doesn't introduce any regressions, please run the following verification script:

This script will help identify any other places in the codebase where these environment variables are used, ensuring that the proposed changes are consistent with the rest of the project.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the usage of environment variables in the codebase

# Test: Search for direct os.getenv calls that might need updating
echo "Searching for direct os.getenv calls:"
rg --type python 'os\.getenv\(' --glob '!templates/components/vectordbs/python/milvus/vectordb.py'

# Test: Check for other uses of the environment variables to ensure consistency
echo "Checking for other uses of MILVUS_ environment variables:"
rg --type python 'MILVUS_' --glob '!templates/components/vectordbs/python/milvus/vectordb.py'

echo "Checking for other uses of EMBEDDING_DIM:"
rg --type python 'EMBEDDING_DIM' --glob '!templates/components/vectordbs/python/milvus/vectordb.py'

Length of output: 690


Script:

#!/bin/bash
# Description: Verify the usage of environment variables in the codebase

# Test: Search for direct os.getenv calls that might need updating
echo "Searching for direct os.getenv calls:"
rg --type py 'os\.getenv\(' --glob '!templates/components/vectordbs/python/milvus/vectordb.py'

# Test: Check for other uses of the MILVUS_ environment variables to ensure consistency
echo "Checking for other uses of MILVUS_ environment variables:"
rg --type py 'MILVUS_' --glob '!templates/components/vectordbs/python/milvus/vectordb.py'

# Test: Check for other uses of EMBEDDING_DIM
echo "Checking for other uses of EMBEDDING_DIM:"
rg --type py 'EMBEDDING_DIM' --glob '!templates/components/vectordbs/python/milvus/vectordb.py'

Length of output: 11239

templates/components/vectordbs/python/astra/vectordb.py (1)

18-18: Approved: Good error handling improvement

The change enhances the robustness of the get_vector_store function by providing a default value for EMBEDDING_DIM. This prevents potential ValueErrors when the environment variable is not set, which aligns well with the PR's objective of improving error handling.

For improved clarity and maintainability, consider extracting the default value to a named constant at the module level. For example:

DEFAULT_EMBEDDING_DIM = 768

# ... in the function ...
embedding_dimension=int(os.getenv("EMBEDDING_DIM", DEFAULT_EMBEDDING_DIM)),

This makes it easier to update the default value in the future if needed and provides context for why this specific number was chosen.

templates/components/loaders/python/db.py (1)

15-21: Approve error handling for DatabaseReader import

The addition of error handling for the DatabaseReader import is a good improvement. It provides a clear error message and maintains the original exception.

Consider adding a type hint for the DatabaseReader import to improve code readability:

from llama_index.readers.database import DatabaseReader as DatabaseReaderType

Then use DatabaseReaderType in the function body.

templates/components/loaders/python/web.py (1)

13-14: LGTM: Improved type annotations in WebLoaderConfig class.

The changes to the WebLoaderConfig class are good improvements:

  1. Making driver_arguments optional with a default empty list improves flexibility.
  2. Using List instead of list for urls is more consistent with type hinting best practices.

These changes align well with the PR objective of adding mypy checker and improving type checking.

Consider adding a type annotation to the get_web_documents function for consistency:

def get_web_documents(config: WebLoaderConfig) -> List[Any]:  # or a more specific return type

This would further improve type checking and code readability.

templates/types/streaming/fastapi/pyproject.toml (1)

27-39: Approve mypy configuration with suggestions for improvement

The addition of a mypy configuration is a positive step towards better type checking. However, some settings might be too permissive:

  1. Consider enabling warn_unused_ignores = true to catch unnecessary type ignore comments.
  2. The ignore_missing_imports = true setting might hide real import issues. Consider using stub files for third-party libraries instead.
  3. follow_imports = "silent" might suppress important error messages from imported modules.
  4. implicit_optional = true and strict_optional = false could allow None to be used where it's not expected. Consider making these stricter.
  5. The disable_error_code list includes important checks. Consider removing or narrowing these disabled checks.

Also, verify if Pydantic is used in the project, as the plugins = "pydantic.mypy" setting is included.

These suggestions aim to make the type checking stricter and catch more potential issues.

templates/components/loaders/python/__init__.py (1)

Line range hint 19-38: LGTM: Return type annotation added correctly.

The return type annotation List[Document] accurately reflects the function's behavior of aggregating and returning a list of documents.

Consider adding a type annotation for the document variable in each case of the match statement. This would improve type checking and make the code more self-documenting. For example:

document: List[Document] = get_file_documents(FileLoaderConfig(**loader_config))

This change would be consistent with the function's return type and provide more precise type information throughout the function.

templates/components/engines/python/agent/engine.py (2)

30-31: LGTM: Improved handling of configured tools with type annotation.

The introduction of the configured_tools variable with the List[BaseTool] type annotation enhances type safety. Using extend instead of += is a good practice for list concatenation.

Consider adding a comment explaining the purpose of ToolFactory.from_env() for better code documentation. For example:

# Load additional tools from environment configuration
configured_tools: List[BaseTool] = ToolFactory.from_env()

Line range hint 14-41: Overall improvements in type safety and code quality.

The changes to the get_chat_engine function enhance type safety and code quality without altering its core functionality. The addition of type annotations and the improved handling of configured tools align well with the PR objective of adding a mypy checker. These modifications will facilitate better static type checking and potentially catch type-related errors earlier in the development process.

Consider adding type annotations to the function parameters and return value to further improve type safety and documentation. For example:

def get_chat_engine(
    filters: Optional[Dict[str, Any]] = None,
    params: Optional[Dict[str, Any]] = None,
    event_handlers: Optional[List[BaseEventHandler]] = None,
    **kwargs: Any
) -> AgentRunner:
    # ... function body ...

This would provide a more complete type-safe interface for the function.

templates/components/settings/python/llmhub.py (2)

57-61: Improved error handling for OpenAILike import.

The addition of the try-except block for importing OpenAILike is a good improvement:

  1. It provides better error handling and user feedback.
  2. The error message is informative, suggesting the potential fix.
  3. Logging the error before raising the exception aids in debugging.

Consider adding more context to the error message:

logger.error("Failed to import OpenAILike. Make sure llama_index is installed and up to date.")

This additional information might help users troubleshoot version-related issues as well.


Line range hint 1-61: Consider adding more type hints for improved code quality.

While the code generally has good type annotations, there are a few areas where additional type hints could be beneficial:

  1. In llm_config_from_env() and embedding_config_from_env(), consider adding type hints to local variables.
  2. Add a return type annotation to init_llmhub(), even if it's None.

Here's an example of how you could improve type hinting in llm_config_from_env():

def llm_config_from_env() -> Dict[str, Union[str, float, int, None]]:
    from llama_index.core.constants import DEFAULT_TEMPERATURE

    model: str = os.getenv("MODEL", DEFAULT_MODEL)
    temperature: str = os.getenv("LLM_TEMPERATURE", str(DEFAULT_TEMPERATURE))
    max_tokens: Optional[str] = os.getenv("LLM_MAX_TOKENS")
    api_key: Optional[str] = os.getenv("T_SYSTEMS_LLMHUB_API_KEY")
    api_base: Optional[str] = os.getenv("T_SYSTEMS_LLMHUB_BASE_URL")

    config: Dict[str, Union[str, float, int, None]] = {
        "model": model,
        "api_key": api_key,
        "api_base": api_base,
        "temperature": float(temperature),
        "max_tokens": int(max_tokens) if max_tokens is not None else None,
    }
    return config

Similar improvements can be made to embedding_config_from_env(). For init_llmhub(), you can add a return type:

def init_llmhub() -> None:
    # ... existing code ...

These changes will enhance code readability and help catch potential type-related issues earlier in the development process.

templates/types/streaming/fastapi/app/engine/generate.py (1)

Line range hint 1-85: Suggestion: Add type annotations to functions for better type checking.

While the changes made are good, to fully leverage the mypy checker being added, consider adding type annotations to function parameters and return values throughout the file. This would further enhance type safety and align with the PR objective.

For example, the generate_datasource function could be annotated like this:

def generate_datasource() -> None:
    ...

Similarly, other functions like get_doc_store, run_pipeline, and persist_storage could benefit from type annotations.

Would you like assistance in adding type annotations to these functions?

templates/types/streaming/fastapi/app/api/routers/chat.py (1)

Line range hint 23-45: Enhance error handling and logging in the chat endpoint

While the current implementation catches and logs exceptions, there's room for improvement in error handling and logging to aid in debugging and maintenance.

Consider the following enhancements:

  1. Log input parameters (excluding sensitive data) at the beginning of the function to aid in debugging.
  2. Use more specific exception types instead of catching all exceptions.
  3. Include more context in the error message returned to the client.

Here's a suggested implementation:

@r.post("")
async def chat(
    request: Request,
    data: ChatData,
    background_tasks: BackgroundTasks,
):
    logger.info(f"Received chat request with {len(data.messages)} messages")
    try:
        last_message_content = data.get_last_message_content()
        messages = data.get_history_messages()

        doc_ids = data.get_chat_document_ids()
        filters = generate_filters(doc_ids)
        params = data.data or {}
        logger.info(
            f"Creating chat engine with filters: {str(filters)} and {len(params)} additional parameters",
        )
        event_handler = EventCallbackHandler()
        chat_engine = get_chat_engine(
            filters=filters, params=params, event_handlers=[event_handler]
        )
        response = await chat_engine.astream_chat(last_message_content, messages)
        process_response_nodes(response.source_nodes, background_tasks)

        return VercelStreamResponse(request, event_handler, response, data)
    except ValueError as ve:
        logger.error(f"Invalid input: {str(ve)}", exc_info=True)
        raise HTTPException(
            status_code=status.HTTP_400_BAD_REQUEST,
            detail=f"Invalid input: {str(ve)}",
        ) from ve
    except Exception as e:
        logger.exception("Unexpected error in chat engine", exc_info=True)
        raise HTTPException(
            status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
            detail="An unexpected error occurred while processing your request. Please try again later.",
        ) from e

This implementation provides more detailed logging and distinguishes between input validation errors and unexpected exceptions, improving the ability to diagnose and respond to issues.

templates/components/engines/python/agent/tools/__init__.py (2)

47-57: LGTM: Method signature and docstring improvements

The return type of from_env has been updated to be more specific using Union[Dict[str, List[FunctionTool]], List[FunctionTool]]. The docstring has been improved to reflect this change and provide more detailed information about the method's behavior.

Consider adding a brief explanation of what this method does at the beginning of the docstring. For example:

"""
Load tools from the configured file based on the environment.

Args:
    map_result: If True, return a map of tool names to their corresponding tools.

Returns:
    A dictionary of tool names to lists of FunctionTools if map_result is True,
    otherwise a list of FunctionTools.
"""

68-74: LGTM with suggestions: Improved readability and type handling

The load_tools call has been split across multiple lines, improving readability. The addition of # type: ignore comments addresses potential type checking issues.

To avoid using # type: ignore comments, consider using type casting or creating a custom type for tools. For example:

from typing import Dict, List, Union, TypeVar

T = TypeVar('T', Dict[str, List[FunctionTool]], List[FunctionTool])

class ToolFactory:
    # ...

    @staticmethod
    def from_env(
        map_result: bool = False,
    ) -> Union[Dict[str, List[FunctionTool]], List[FunctionTool]]:
        tools: T = {} if map_result else []  # type: ignore
        
        # ...
        
        if map_result:
            tools = cast(Dict[str, List[FunctionTool]], tools)
            tools[tool_name] = loaded_tools
        else:
            tools = cast(List[FunctionTool], tools)
            tools.extend(loaded_tools)

        return tools

This approach provides better type safety and eliminates the need for # type: ignore comments.

templates/components/engines/python/agent/tools/artifact.py (1)

Line range hint 66-95: Consider refactoring the artifact method for improved readability and error handling.

While the current implementation works, there are a few areas where it could be improved:

  1. Error Handling: The current try-except block catches all exceptions. Consider catching specific exceptions and providing more detailed error messages.

  2. Type Annotations: Add type annotations to the response variable and the return value of the method.

  3. Logging: Consider adding more detailed logging throughout the method to aid in debugging.

Here's a suggested refactoring of the artifact method:

from llama_index.core.base.llms.types import ChatResponse
import json

def artifact(self, query: str, old_code: Optional[str] = None) -> Dict[str, Any]:
    """Generate a code artifact based on the input."""
    try:
        user_message = f"{query}\n\nThe existing code is: \n```\n{old_code}\n```" if old_code else query
        messages: List[ChatMessage] = [
            ChatMessage(role="system", content=CODE_GENERATION_PROMPT),
            ChatMessage(role="user", content=user_message),
        ]
        
        sllm = Settings.llm.as_structured_llm(output_cls=CodeArtifact)
        response: ChatResponse = sllm.chat(messages)
        data: CodeArtifact = response.raw
        
        logger.info(f"Successfully generated artifact: {data.title}")
        return data.model_dump()
    except AttributeError as e:
        logger.error(f"Invalid Settings configuration: {str(e)}")
        raise ValueError("Invalid Settings configuration") from e
    except json.JSONDecodeError as e:
        logger.error(f"Failed to parse response: {str(e)}")
        raise ValueError("Invalid response format") from e
    except Exception as e:
        logger.error(f"Unexpected error while generating artifact: {str(e)}")
        raise RuntimeError("Failed to generate artifact") from e

This refactored version:

  1. Adds more specific exception handling.
  2. Includes type annotations for response and the return value.
  3. Adds more detailed logging.
  4. Simplifies the user message construction.

Please consider implementing these changes to improve the overall quality and maintainability of the code.

templates/types/streaming/fastapi/app/api/routers/events.py (2)

34-35: Improved error handling in get_tool_message method.

The addition of null checks for self.payload and tool enhances the robustness of the method by preventing potential NoneType attribute access errors. This is a good practice for defensive programming.

Consider combining the two checks to reduce the number of early returns:

if self.payload is None or self.payload.get("tool") is None:
    return None

This would make the code slightly more concise while maintaining the same functionality.

Also applies to: 39-40


125-125: LGTM: Enhanced on_event_start method with parent_id and return value.

The addition of the parent_id parameter and the return of event_id improve the functionality and usability of the on_event_start method. These changes allow for better event tracking and relationship management.

Consider adding a docstring to the on_event_start method to explain the purpose of the parent_id parameter and the return value. This would improve the method's documentation and make it easier for other developers to understand and use the method correctly.

Also applies to: 131-131

templates/types/streaming/fastapi/app/api/routers/models.py (2)

65-81: LGTM: Improved type annotations and error handling.

The changes in the Annotation class improve type safety and error handling:

  1. Using Union instead of | for type unions enhances compatibility.
  2. The to_content method now includes type checking and better error handling.

Consider adding a type annotation for the csv_files variable on line 71 for consistency:

csv_files: List[File] = [file for file in self.data.files if file.filetype == "csv"]

254-254: LGTM: Improved return type annotation in get_url_from_metadata.

The change from str to Optional[str] as the return type is accurate and consistent with the method's logic. This improves type safety and helps prevent potential issues.

Consider adding type annotations to the local variables within the method for consistency. For example:

url_prefix: Optional[str] = os.getenv("FILESERVER_URL_PREFIX")
file_name: Optional[str] = metadata.get("file_name")
helpers/python.ts (2)

Line range hint 201-217: Good addition of 'groq' provider dependencies with version constraints.

The addition of specific dependencies for the 'groq' provider, including the Python version constraint, is a good practice to ensure compatibility. However, consider adding a comment explaining why the Python version is constrained to less than 3.13, as it might not be immediately clear to other developers.

+ # Fastembed==0.2.0 does not support python3.13 at the moment
  dependencies.push({
    name: "python",
    version: "^3.11,<3.13",
  });

This will help maintain the code's clarity and make it easier for future updates.


Line range hint 218-234: Consistent implementation for 'anthropic' provider dependencies.

The changes for the 'anthropic' provider are consistent with those made for the 'groq' provider, which is excellent for maintaining code uniformity. As suggested for the 'groq' case, consider adding a comment explaining the Python version constraint:

+ # Fastembed==0.2.0 does not support python3.13 at the moment
  dependencies.push({
    name: "python",
    version: "^3.11,<3.13",
  });

This will enhance code readability and make future maintenance easier.

e2e/python/resolve_dependencies.spec.ts (2)

18-18: Address the TODO comment for supporting other templates

The code includes a TODO comment indicating that support for other templates should be added. Please ensure this is tracked or addressed to enhance the test coverage for other templates.

Would you like assistance in implementing support for other templates or opening a GitHub issue to track this task?


233-234: Remove redundant assertion

The assertion expect(true).toBeTruthy(); is unnecessary because if the code reaches this point without throwing an error, the test has already passed. Removing this line will clean up the code without affecting functionality.

Consider removing the redundant assertion:

-// If we reach this point without throwing an error, the test passes
-expect(true).toBeTruthy();
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between 7652b2b and 5ad2924.

📒 Files selected for processing (26)
  • .husky/pre-commit (1 hunks)
  • e2e/python/resolve_dependencies.spec.ts (3 hunks)
  • helpers/python.ts (1 hunks)
  • templates/components/engines/python/agent/engine.py (2 hunks)
  • templates/components/engines/python/agent/tools/init.py (3 hunks)
  • templates/components/engines/python/agent/tools/artifact.py (1 hunks)
  • templates/components/engines/python/agent/tools/duckduckgo.py (2 hunks)
  • templates/components/engines/python/chat/init.py (1 hunks)
  • templates/components/engines/python/chat/engine.py (1 hunks)
  • templates/components/loaders/python/init.py (1 hunks)
  • templates/components/loaders/python/db.py (2 hunks)
  • templates/components/loaders/python/web.py (2 hunks)
  • templates/components/settings/python/llmhub.py (2 hunks)
  • templates/components/settings/python/settings.py (3 hunks)
  • templates/components/vectordbs/python/astra/vectordb.py (1 hunks)
  • templates/components/vectordbs/python/chroma/vectordb.py (2 hunks)
  • templates/components/vectordbs/python/milvus/vectordb.py (2 hunks)
  • templates/components/vectordbs/python/none/index.py (1 hunks)
  • templates/types/extractor/fastapi/app/engine/generate.py (2 hunks)
  • templates/types/extractor/fastapi/app/engine/index.py (1 hunks)
  • templates/types/streaming/fastapi/app/api/routers/chat.py (1 hunks)
  • templates/types/streaming/fastapi/app/api/routers/events.py (5 hunks)
  • templates/types/streaming/fastapi/app/api/routers/models.py (4 hunks)
  • templates/types/streaming/fastapi/app/engine/init.py (1 hunks)
  • templates/types/streaming/fastapi/app/engine/generate.py (2 hunks)
  • templates/types/streaming/fastapi/pyproject.toml (1 hunks)
✅ Files skipped from review due to trivial changes (3)
  • templates/components/engines/python/chat/init.py
  • templates/components/engines/python/chat/engine.py
  • templates/types/streaming/fastapi/app/engine/init.py
🧰 Additional context used
📓 Path-based instructions (20)
templates/components/engines/python/agent/engine.py (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/engines/python/agent/tools/__init__.py (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/engines/python/agent/tools/artifact.py (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/engines/python/agent/tools/duckduckgo.py (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/loaders/python/__init__.py (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/loaders/python/db.py (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/loaders/python/web.py (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/settings/python/llmhub.py (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/settings/python/settings.py (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/vectordbs/python/astra/vectordb.py (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/vectordbs/python/chroma/vectordb.py (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/vectordbs/python/milvus/vectordb.py (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/vectordbs/python/none/index.py (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/types/extractor/fastapi/app/engine/generate.py (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/types/extractor/fastapi/app/engine/index.py (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/types/streaming/fastapi/app/api/routers/chat.py (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/types/streaming/fastapi/app/api/routers/events.py (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/types/streaming/fastapi/app/api/routers/models.py (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/types/streaming/fastapi/app/engine/generate.py (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/types/streaming/fastapi/pyproject.toml (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

🪛 Ruff
templates/components/settings/python/settings.py

40-42: Within an except clause, raise exceptions with raise ... from err or raise ... from None to distinguish them from errors in exception handling

(B904)


83-85: Within an except clause, raise exceptions with raise ... from err or raise ... from None to distinguish them from errors in exception handling

(B904)


120-122: Within an except clause, raise exceptions with raise ... from err or raise ... from None to distinguish them from errors in exception handling

(B904)


145-147: Within an except clause, raise exceptions with raise ... from err or raise ... from None to distinguish them from errors in exception handling

(B904)


158-160: Within an except clause, raise exceptions with raise ... from err or raise ... from None to distinguish them from errors in exception handling

(B904)

🔇 Additional comments (33)
templates/components/vectordbs/python/chroma/vectordb.py (1)

22-22: Consider the implications of passing port as a string

The change from int(os.getenv("CHROMA_PORT")) to os.getenv("CHROMA_PORT", "8001") has several implications:

  1. It provides a default value of "8001", improving robustness when the environment variable is not set.
  2. It removes the explicit integer conversion, which changes the type of the port parameter from int to str.

While this change increases flexibility and removes a potential ValueError from invalid integer conversions, it may have unintended consequences:

  • If ChromaVectorStore expects an integer for the port, this could lead to type-related issues.
  • Configuration errors (non-numeric ports) that were previously caught by the int() conversion will now be passed through, potentially causing issues later.

To ensure this change doesn't introduce issues, please verify:

  1. ChromaVectorStore can handle string port values correctly.
  2. There's no loss of error checking for invalid port values.

You can use the following script to check the ChromaVectorStore implementation:

If ChromaVectorStore expects an integer, consider keeping the int() conversion:

port=int(os.getenv("CHROMA_PORT", "8001")),

This maintains the default value while ensuring type consistency and error checking.

templates/components/loaders/python/web.py (1)

1-1: LGTM: Import statement updated for better type hinting.

The addition of Optional from the typing module is a good improvement. It allows for more precise type annotations, which is in line with the PR objective of adding mypy checker for enhanced type checking.

templates/types/extractor/fastapi/app/engine/index.py (1)

19-19: Excellent type annotation improvements!

The updated function signature enhances type clarity and aligns well with the PR objective of adding mypy checker:

  1. Using Optional[IndexConfig] is more explicit and mypy-friendly.
  2. Adding the return type annotation -> VectorStoreIndex clearly specifies the function's output.

These changes will facilitate more accurate type checking by mypy while maintaining the function's existing behavior.

templates/types/streaming/fastapi/pyproject.toml (1)

20-21: LGTM: mypy added as a development dependency

The addition of mypy as a development dependency is consistent with the PR objective of adding a mypy checker. The version specification "^1.8.0" allows for compatible updates, which is a good practice for maintaining up-to-date dependencies.

templates/components/loaders/python/__init__.py (3)

2-2: LGTM: Import statements are correctly updated.

The new imports for typing annotations and Document from llama_index.core are appropriate for the added type hints. The type ignore comment for yaml is also acceptable if there are known issues with its type stubs.

Also applies to: 4-4, 8-8


13-17: LGTM: Appropriate return type annotation added.

The return type annotation Dict[str, Any] accurately reflects the function's behavior of loading and returning YAML content as a dictionary.


Line range hint 1-38: Summary: Type annotations successfully added.

The changes in this file successfully introduce type annotations to the load_configs and get_documents functions, as well as add necessary imports. These modifications align well with the PR objective of adding a mypy checker and will enhance the code's type safety and readability.

The added type annotations will facilitate static type checking with mypy, potentially catching type-related errors early in the development process. This improvement in code quality is a positive step towards more robust and maintainable code.

templates/components/vectordbs/python/none/index.py (2)

Line range hint 1-52: Overall implementation looks good.

The file structure, use of environment variables for configuration, and caching implementation for get_storage_context are well-designed. The type annotations are consistent throughout the file, which aligns with the PR objective of adding mypy checker support.


6-6: Consider addressing the type ignore comment.

The addition of # type: ignore to the import statement suggests that there might be type-related issues with the cachetools library. While this change allows the code to pass mypy checks, it's worth considering if there's a more robust solution.

To better understand the nature of the type-related issue, let's run a verification script:

Depending on the results, consider the following options:

  1. If type stubs are available for cachetools, install them to resolve the issue without using # type: ignore.
  2. If the issue is due to an outdated version of cachetools, consider upgrading to a version with better type support.
  3. If the issue persists and is known, add a comment explaining why the type ignore is necessary.
templates/components/engines/python/agent/engine.py (2)

2-2: LGTM: Import statements for type hinting added.

The addition of List from typing and BaseTool from llama_index.core.tools is appropriate for the new type annotations in the code. This change supports the PR objective of adding a mypy checker by enabling proper type hinting.

Also applies to: 9-9


16-16: LGTM: Type annotation added to tools variable.

The addition of the type annotation List[BaseTool] to the tools variable improves type safety and code readability. This change is in line with the PR objective of adding a mypy checker and will help catch type-related errors early in the development process.

templates/components/settings/python/llmhub.py (1)

1-1: LGTM: Improved imports and added logging.

The changes to the import statements and the addition of logging are good improvements:

  1. Adding logging import enhances error tracking capabilities.
  2. Import statements are now properly ordered according to PEP 8 style guide.
  3. Logger initialization is correctly implemented.

These changes will contribute to better code organization and easier debugging.

Also applies to: 3-8

templates/components/engines/python/agent/tools/duckduckgo.py (2)

26-32: Improved code clarity and directness

The changes to the duckduckgo_search function enhance readability by directly passing keyword arguments to ddg.text(). This approach is more Pythonic and aligns with the principle of explicitness. The functionality remains the same, but the code is now more straightforward.


56-62: Consistent improvement in code clarity

The changes to duckduckgo_image_search mirror those made to duckduckgo_search, maintaining consistency across the file. By directly passing keyword arguments to ddg.images(), the code becomes more readable and explicit. This change aligns well with Python best practices and improves overall code quality.

templates/types/extractor/fastapi/app/engine/generate.py (3)

9-9: LGTM: New import statement is correctly placed and necessary.

The addition of DocstoreStrategy import is consistent with the file's coding style and is required for the changes in the run_pipeline function.


44-44: Good improvement: Using enum instead of string literal.

The change from "upserts_and_delete" to DocstoreStrategy.UPSERTS_AND_DELETE enhances type safety and reduces the risk of typos. It also improves code maintainability by providing better IDE support for code completion and refactoring.


44-44: Query: Why is # type: ignore necessary here?

The addition of # type: ignore suggests that there might be a type checking issue. Could you please explain why this comment is needed? If there's an underlying type mismatch, it would be better to address it directly rather than suppressing the type checker.

To investigate this further, let's check the type hints for the IngestionPipeline class:

This will help us understand if there's a mismatch between the expected type and the DocstoreStrategy enum.

templates/types/streaming/fastapi/app/engine/generate.py (2)

9-17: LGTM: Import changes enhance type safety and readability.

The addition of DocstoreStrategy import and the reordering of import statements improve type safety and code organization. These changes align well with the PR objective of adding a mypy checker.


44-44: Approve enum usage, but question type ignore comment.

The use of DocstoreStrategy.UPSERTS_AND_DELETE instead of a string literal is a good improvement for type safety. However, the addition of # type: ignore seems to contradict the PR objective of adding mypy checking.

Could you explain why the # type: ignore comment is necessary here? If it's due to a mypy error, we should investigate how to resolve it without suppressing the type check. Let's run a mypy check on this file:

If mypy is not installed or configured, we might need to add it to the project's development dependencies.

templates/components/engines/python/agent/tools/__init__.py (3)

3-5: LGTM: Import changes look good

The new import from typing is necessary for the updated type annotations in the file. The # type: ignore comment for the yaml import is appropriate if there are known issues with type checking for this library.


21-22: LGTM: Method signature update improves type hinting

The return type of load_tools has been updated from list[FunctionTool] to List[FunctionTool]. This change is consistent with the new import from typing and provides better type hinting.


59-61: LGTM: Improved type annotation for tools variable

The tools variable now has a proper type annotation that matches the method's return type. This change improves type safety and code readability while maintaining the same initialization logic.

templates/components/engines/python/agent/tools/artifact.py (1)

90-90: ⚠️ Potential issue

Consider addressing the underlying type issue instead of using a type ignore comment.

The addition of # type: ignore suggests there's a type-related issue that mypy is detecting. While this temporarily resolves the mypy error, it's generally better to address the underlying issue rather than suppressing it.

To better understand and potentially resolve this issue, please run the following script:

This script will help us understand:

  1. The specific mypy error being suppressed.
  2. The definition of the Settings class and as_structured_llm method.
  3. Any existing type annotations for Settings.llm.

With this information, we can provide more specific guidance on how to properly type-annotate this code instead of using a type ignore comment.

templates/types/streaming/fastapi/app/api/routers/events.py (3)

2-2: LGTM: Import statements updated appropriately.

The addition of json and AsyncGenerator imports aligns with the new functionality in the code. These changes improve the module's capabilities for JSON handling and asynchronous operations.

Also applies to: 4-4


57-58: LGTM: Improved error handling in get_agent_tool_response method.

The addition of a null check for self.payload enhances the robustness of the method by preventing potential NoneType attribute access errors. This is consistent with the improvements made in the get_tool_message method and follows good defensive programming practices.


Line range hint 1-162: LGTM: Overall improvements to error handling and type annotations.

The changes made to this file consistently improve error handling and maintain good type annotation practices. The modifications enhance the robustness of the event handling logic while preserving the existing structure and style of the code.

The enhancements to null checks and the addition of the parent_id parameter in the EventCallbackHandler class contribute to a more reliable and flexible event handling system. Great job on maintaining code quality and improving functionality!

templates/types/streaming/fastapi/app/api/routers/models.py (3)

3-3: LGTM: Import statement updated correctly.

The addition of Union to the import statement is consistent with the changes made in the file. This improves compatibility with older Python versions and aligns with the type annotation updates in the code.


224-226: LGTM: Enhanced type checking in get_chat_document_ids.

The additional type checking for annotation.data improves type safety and prevents potential runtime errors. This change ensures that the files attribute is only accessed when annotation.data is an instance of AnnotationFileData.


Line range hint 1-324: Overall LGTM: Improved type annotations and error handling.

The changes in this file consistently improve type annotations and error handling throughout the code. These improvements align well with the PR objective of adding mypy checker and will help catch potential type-related issues earlier in the development process. The code is now more robust and type-safe.

Key improvements:

  1. Use of Union for complex type annotations.
  2. More accurate return type annotations (e.g., Optional[str]).
  3. Enhanced type checking in methods like get_chat_document_ids.
  4. Consistent use of Optional instead of | None.

These changes will make the codebase more maintainable and less prone to type-related bugs.

helpers/python.ts (2)

126-128: Improved PostgreSQL dependency.

The change from "psycopg2" to "psycopg2-binary" is a good improvement. This pre-compiled binary version is easier to install and doesn't require a compiler, which can simplify the setup process for many users.


Line range hint 1-590: Overall improvements in dependency management and provider support.

The changes made to this file significantly enhance the dependency management for various providers, particularly for PostgreSQL, 'groq', and 'anthropic'. The use of specific versions and version constraints helps ensure compatibility and prevents potential issues with newer, incompatible versions.

The consistency in implementing these changes across different providers is commendable. It makes the code more maintainable and easier to update in the future.

The only suggestion for improvement is to add comments explaining the rationale behind certain version constraints, which will aid in future maintenance and updates.

Great job on these enhancements!

templates/components/settings/python/settings.py (2)

70-73: Ensure default embedding model is valid in init_openai

The default embedding model is set to "text-embedding-3-small". Verify that this model name is valid and supported by OpenAI's API. Using an incorrect model name could lead to runtime errors.

Would you like to confirm that "text-embedding-3-small" is a valid model name? If unsure, consider updating it to a known valid model like "text-embedding-ada-002".


63-67: Ensure default LLM model is valid in init_openai

The default LLM model is set to "gpt-4o-mini". Please verify that this model is available and correctly specified. An invalid model name could result in runtime errors.

Would you like to confirm that "gpt-4o-mini" is a valid OpenAI model? If it's a custom or lesser-known model, ensure it's accessible in your environment or update the default to a commonly used model like "gpt-3.5-turbo".

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between 5ad2924 and 472a9b4.

📒 Files selected for processing (1)
  • templates/components/settings/python/settings.py (4 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
templates/components/settings/python/settings.py (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

🪛 Ruff
templates/components/settings/python/settings.py

40-42: Within an except clause, raise exceptions with raise ... from err or raise ... from None to distinguish them from errors in exception handling

(B904)


83-85: Within an except clause, raise exceptions with raise ... from err or raise ... from None to distinguish them from errors in exception handling

(B904)


120-122: Within an except clause, raise exceptions with raise ... from err or raise ... from None to distinguish them from errors in exception handling

(B904)


145-147: Within an except clause, raise exceptions with raise ... from err or raise ... from None to distinguish them from errors in exception handling

(B904)


158-160: Within an except clause, raise exceptions with raise ... from err or raise ... from None to distinguish them from errors in exception handling

(B904)


180-182: Within an except clause, raise exceptions with raise ... from err or raise ... from None to distinguish them from errors in exception handling

(B904)

🔇 Additional comments (9)
templates/components/settings/python/settings.py (9)

36-42: LGTM!

The exception handling and import statements for init_ollama are appropriately implemented.

🧰 Tools
🪛 Ruff

40-42: Within an except clause, raise exceptions with raise ... from err or raise ... from None to distinguish them from errors in exception handling

(B904)


64-67: Verify default LLM model name in init_openai

The default model name for the LLM is set to "gpt-4o-mini" (line 64). Please verify that this is the correct model name and corresponds to a valid OpenAI model, as it may not be a standard model provided by OpenAI.


71-73: Verify default embedding model name in init_openai

The default embedding model name is set to "text-embedding-3-small" (line 71). Please verify that this is the intended model and corresponds to a valid OpenAI embedding model.


79-85: LGTM!

The exception handling for missing Azure OpenAI dependencies is correctly implemented in init_azure_openai.

🧰 Tools
🪛 Ruff

83-85: Within an except clause, raise exceptions with raise ... from err or raise ... from None to distinguish them from errors in exception handling

(B904)


117-122: LGTM!

The exception handling for the FastEmbed import is properly implemented in init_fastembed.

🧰 Tools
🪛 Ruff

120-122: Within an except clause, raise exceptions with raise ... from err or raise ... from None to distinguish them from errors in exception handling

(B904)


131-134: LGTM!

The check for the EMBEDDING_MODEL environment variable ensures that it is set before proceeding.


142-147: LGTM!

Exception handling in init_groq for missing dependencies is correctly implemented.

🧰 Tools
🪛 Ruff

145-147: Within an except clause, raise exceptions with raise ... from err or raise ... from None to distinguish them from errors in exception handling

(B904)


155-160: LGTM!

The exception handling for importing Anthropic dependencies in init_anthropic is appropriate.

🧰 Tools
🪛 Ruff

158-160: Within an except clause, raise exceptions with raise ... from err or raise ... from None to distinguish them from errors in exception handling

(B904)


176-182: LGTM!

The import statements and exception handling for init_gemini are correctly structured.

🧰 Tools
🪛 Ruff

180-182: Within an except clause, raise exceptions with raise ... from err or raise ... from None to distinguish them from errors in exception handling

(B904)

@marcusschiesser marcusschiesser merged commit c60182a into main Oct 8, 2024
31 checks passed
@marcusschiesser marcusschiesser deleted the feat/add-mypy-checker branch October 8, 2024 08:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants