Skip to content
This repository has been archived by the owner on Sep 19, 2024. It is now read-only.

2 introduce llm model abstraction #5

Closed
wants to merge 7 commits into from

Conversation

dudizimber
Copy link
Contributor

@dudizimber dudizimber commented Jul 3, 2024

fix #2
fix #8

Summary by CodeRabbit

  • New Features

    • Introduced spellcheck and test workflows in GitHub Actions.
    • Added GeminiGenerativeModel and GeminiChatSession classes for advanced generative model functionalities.
    • Included new dependencies: python-abc, ratelimit, and python-dotenv.
  • Bug Fixes

    • Improved handling of model responses and finish reasons in multiple steps, ensuring more reliable data extraction and query processing.
  • Tests

    • Added new test cases for auto-detection of ontology and Knowledge Graph system.

@dudizimber dudizimber added the enhancement New feature or request label Jul 3, 2024
@dudizimber dudizimber requested a review from swilly22 July 3, 2024 12:01
@dudizimber dudizimber self-assigned this Jul 3, 2024
@dudizimber dudizimber linked an issue Jul 3, 2024 that may be closed by this pull request
Copy link

coderabbitai bot commented Jul 3, 2024

Walkthrough

The updates introduce significant enhancements to the falkordb_gemini_kg module, integrating a new GenerativeModel system, streamlining various steps, and introducing workflow automation for spell checks and tests. The changes encompass code refactoring, new classes for generative models, and comprehensive test cases to ensure system accuracy and reliability. Automation workflows further enhance code quality and reliability.

Changes

Files Change Summaries
.github/workflows/spellcheck.yml Introduces a GitHub Actions workflow for spell checking Markdown files.
.github/workflows/test.yml Establishes a GitHub Actions workflow to run tests, setting up a Python environment and running pytest.
falkordb_gemini_kg/init.py Removes the import of StepModelConfig.
falkordb_gemini_kg/.../attribute.py Renames _AttributeType to AttributeType, updating all references accordingly.
falkordb_gemini_kg/.../edge.py Updates the import and reference from _AttributeType to AttributeType.
falkordb_gemini_kg/.../model_config.py Replaces StepModelConfig with GenerativeModel, removing and adding relevant methods and attributes.
falkordb_gemini_kg/.../node.py Updates references to AttributeType, reflecting internal refactoring.
falkordb_gemini_kg/.../ontology.py Replaces StepModelConfig with GenerativeModel for the from_sources method.
falkordb_gemini_kg/helpers.py Removes a debug logging statement for ontology_edge.
falkordb_gemini_kg/kg.py Modifies references to model_config, affecting logic for graph creation and query processing.
falkordb_gemini_kg/models/... Introduces classes GeminiGenerativeModel and GenerativeModel, facilitating new generative capabilities.
falkordb_gemini_kg/steps/... Refactors various step files to align with the new GenerativeModel, updating method signatures and internal logic.
pyproject.toml Adds new dependencies and updates pytest configuration.
tests/data/madoff.txt New data file containing information about the TV mini-series "Madoff: The Monster of Wall Street".
tests/test_auto_create_ontology.py Introduces a test case for auto-detecting ontology using a generative model.
tests/test_kg.py Adds test cases for Knowledge Graph creation, querying, and deletion.

Sequence Diagrams

New Generative Model Workflow

sequenceDiagram
    participant User
    participant GenerativeModel
    participant KnowledgeGraph
    participant DataProcess

    User->>GenerativeModel: Input prompts
    GenerativeModel->>KnowledgeGraph: Creates/Updates graph
    KnowledgeGraph->>DataProcess: Queries/Processes data
    DataProcess->>GenerativeModel: Returns results
    GenerativeModel->>User: Outputs results
Loading

Old vs. New Flow in falkordb_gemini_kg/steps

%% Old Flow
sequenceDiagram
    participant User
    participant StepModelConfig
    participant System

    User->>StepModelConfig: Init Config
    StepModelConfig->>System: Process Step
    System->>StepModelConfig: Return Data
    StepModelConfig->>User: Output Data

%% New Flow
sequenceDiagram
    participant User
    participant GenerativeModel
    participant System

    User->>GenerativeModel: Init Model
    GenerativeModel->>System: Process Step
    System->>GenerativeModel: Return Data
    GenerativeModel->>User: Output Data
Loading

Poem

In the code, a tale arose,
Generative models, like a rose.
Workflows checking every spell,
Tests that run so very well.
Knowledge graphs now bright and clear,
Hopping forward, far and near.
Code evolves, we cheer and beam,
In our rabbit's coding dream.

🐰

Tip

AI model upgrade

gpt-4o model for reviews and chat is now live

OpenAI claims that this model is better at understanding and generating code than the previous models. Please join our Discord Community to provide any feedback or to report any issues.


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>.
    • 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 generate interesting stats about this repository and render them as a table.
    • @coderabbitai show all the console.log statements in this repository.
    • @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 as 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.

Additionally, you can add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.

CodeRabbit Configration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

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.

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: 22

Outside diff range and nitpick comments (7)
tests/test_auto_create_ontology.py (2)

3-3: Consider adding a blank line after imports.

For better readability, consider adding a blank line after the import statements.

+ 

23-23: Consider parameterizing the file path.

Hardcoding file paths can reduce flexibility. Consider parameterizing the file path for better maintainability.

-        file_path = "tests/data/madoff.txt"
+        file_path = os.getenv("TEST_FILE_PATH", "tests/data/madoff.txt")
falkordb_gemini_kg/steps/create_ontology_step.py (2)

Line range hint 36-45: Avoid mutable default arguments.

Using mutable default arguments like dictionaries can lead to unexpected behavior. Consider using None as the default value and initializing the dictionary within the method.

-        config: dict = {
-            "max_workers": 16,
-            "max_input_tokens": 500000,
-            "max_output_tokens": 8192,
-        },
+        config: dict = None,
...
+        self.config = config if config is not None else {
+            "max_workers": 16,
+            "max_input_tokens": 500000,
+            "max_output_tokens": 8192,
+        }

Line range hint 170-178: Add logging for retries in _call_model.

Consider adding logging to track the number of retries when handling quota exceeded errors.

            if "Quota exceeded" in str(e) and retry > 0:
                time.sleep(10)
                retry -= 1
+                logger.debug(f"Retrying... attempts left: {retry}")
                return self._call_model(chat_session, prompt, retry)
falkordb_gemini_kg/helpers.py (3)

Line range hint 13-34: Consider using list comprehension for better readability.

Using a list comprehension can make the code more readable.

    cypher = "{"
    if isinstance(d, list):
        if len(d) == 0:
            return "{}"
        cypher = ", ".join([f"{i}: {item}" for i, item in enumerate(d)]) + "}"
        return cypher
    for key, value in d.items():
        # Check value type
        if isinstance(value, str):
            # Find unescaped quotes
            reg = r"((?<!\\)(\"))|((?<!\\)(\'))"
            search = re.search(reg, value)
            if search:
                i = 0
                for match in re.finditer(reg, value):
                    value = (
                        value[: match.start() + i] + "\\" + value[match.start() + i :]
                    )
                    i += 1
            value = f'"{value}"' if f"{value}" != "None" else '""'
        else:
            value = str(value) if f"{value}" != "None" else '""'
        cypher += f"{key}: {value}, "
    cypher = (cypher[:-2] if len(cypher) > 1 else cypher) + "}"
    return cypher
Tools
Ruff

169-169: Use ontology_edge.source.label != source_label instead of not ontology_edge.source.label == source_label

Replace with != operator

(SIM201)


170-170: Use ontology_edge.target.label != target_label instead of not ontology_edge.target.label == target_label

Replace with != operator

(SIM201)


Line range hint 65-83: Consider providing more specific error messages.

Providing more specific error messages can help in debugging.

        if not cypher or len(cypher) == 0:
            return "Cypher statement is empty"

        errors = []

        # Check if nodes exist in ontology
        errors.extend(validate_cypher_nodes_exist(cypher, ontology))

        # Check if edges exist in ontology
        errors.extend(validate_cypher_edges_exist(cypher, ontology))

        # Check if edge directions are correct
        errors.extend(validate_cypher_edge_directions(cypher, ontology))

        if len(errors) > 0:
            return errors

        return None
    except Exception as e:
        print(f"Failed to verify cypher labels: {e}")
        return None
Tools
Ruff

169-169: Use ontology_edge.source.label != source_label instead of not ontology_edge.source.label == source_label

Replace with != operator

(SIM201)


170-170: Use ontology_edge.target.label != target_label instead of not ontology_edge.target.label == target_label

Replace with != operator

(SIM201)


Line range hint 112-171: Consider using != operator for better readability.

Using != operator can make the code more readable.

            if (
-                not ontology_edge.source.label == source_label
-                or not ontology_edge.target.label == target_label
+                ontology_edge.source.label != source_label
+                or ontology_edge.target.label != target_label
            ):
                errors.append(
                    f"Edge {edge_label} has a mismatched source or target. Make sure the edge direction is correct. The edge should connect {ontology_edge.source.label} to {ontology_edge.target.label}."
                )
Tools
Ruff

169-169: Use ontology_edge.source.label != source_label instead of not ontology_edge.source.label == source_label

Replace with != operator

(SIM201)


170-170: Use ontology_edge.target.label != target_label instead of not ontology_edge.target.label == target_label

Replace with != operator

(SIM201)

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 8f43ac5 and 33024f9.

Files ignored due to path filters (1)
  • poetry.lock is excluded by !**/*.lock
Files selected for processing (22)
  • .github/workflows/spellcheck.yml (1 hunks)
  • .github/workflows/test.yml (1 hunks)
  • falkordb_gemini_kg/init.py (1 hunks)
  • falkordb_gemini_kg/classes/init.py (1 hunks)
  • falkordb_gemini_kg/classes/attribute.py (3 hunks)
  • falkordb_gemini_kg/classes/edge.py (2 hunks)
  • falkordb_gemini_kg/classes/model_config.py (1 hunks)
  • falkordb_gemini_kg/classes/node.py (2 hunks)
  • falkordb_gemini_kg/classes/ontology.py (2 hunks)
  • falkordb_gemini_kg/helpers.py (1 hunks)
  • falkordb_gemini_kg/kg.py (2 hunks)
  • falkordb_gemini_kg/models/init.py (1 hunks)
  • falkordb_gemini_kg/models/gemini.py (1 hunks)
  • falkordb_gemini_kg/models/model.py (1 hunks)
  • falkordb_gemini_kg/steps/create_ontology_step.py (9 hunks)
  • falkordb_gemini_kg/steps/extract_data_step.py (7 hunks)
  • falkordb_gemini_kg/steps/graph_query_step.py (5 hunks)
  • falkordb_gemini_kg/steps/qa_step.py (2 hunks)
  • pyproject.toml (2 hunks)
  • tests/data/madoff.txt (1 hunks)
  • tests/test_auto_create_ontology.py (1 hunks)
  • tests/test_kg.py (1 hunks)
Files not reviewed due to errors (1)
  • falkordb_gemini_kg/steps/extract_data_step.py (no review received)
Files skipped from review due to trivial changes (3)
  • .github/workflows/spellcheck.yml
  • .github/workflows/test.yml
  • pyproject.toml
Additional context used
Ruff
falkordb_gemini_kg/models/__init__.py

1-1: from .model import * used; unable to detect undefined names

(F403)

falkordb_gemini_kg/classes/__init__.py

2-2: .source.Source imported but unused; consider removing, adding to __all__, or using a redundant alias

(F401)


3-3: .node.Node imported but unused; consider removing, adding to __all__, or using a redundant alias

(F401)


4-4: .edge.Edge imported but unused; consider removing, adding to __all__, or using a redundant alias

(F401)


5-5: .attribute.Attribute imported but unused; consider removing, adding to __all__, or using a redundant alias

(F401)


5-5: .attribute.AttributeType imported but unused; consider removing, adding to __all__, or using a redundant alias

(F401)

falkordb_gemini_kg/__init__.py

1-1: .classes.source.Source imported but unused; consider removing, adding to __all__, or using a redundant alias

(F401)


2-2: .classes.ontology.Ontology imported but unused; consider removing, adding to __all__, or using a redundant alias

(F401)


3-3: .kg.KnowledgeGraph imported but unused; consider removing, adding to __all__, or using a redundant alias

(F401)


4-4: .classes.model_config.KnowledgeGraphModelConfig imported but unused; consider removing, adding to __all__, or using a redundant alias

(F401)


5-5: .steps.create_ontology_step.CreateOntologyStep imported but unused; consider removing, adding to __all__, or using a redundant alias

(F401)

falkordb_gemini_kg/steps/qa_step.py

4-4: falkordb_gemini_kg.fixtures.prompts.GRAPH_QA_SYSTEM imported but unused

Remove unused import: falkordb_gemini_kg.fixtures.prompts.GRAPH_QA_SYSTEM

(F401)


19-19: Do not use mutable data structures for argument defaults

Replace with None; initialize within function

(B006)

falkordb_gemini_kg/steps/graph_query_step.py

7-7: falkordb_gemini_kg.fixtures.prompts.CYPHER_GEN_SYSTEM imported but unused

Remove unused import: falkordb_gemini_kg.fixtures.prompts.CYPHER_GEN_SYSTEM

(F401)


33-33: Do not use mutable data structures for argument defaults

Replace with None; initialize within function

(B006)

falkordb_gemini_kg/models/gemini.py

1-1: from .model import * used; unable to detect undefined names

(F403)


10-10: GenerativeModel may be undefined, or defined from star imports

(F405)


17-17: GenerativeModelConfig may be undefined, or defined from star imports

(F405)


44-44: GenerativeModel may be undefined, or defined from star imports

(F405)


51-51: GenerativeModelChatSession may be undefined, or defined from star imports

(F405)


54-54: GenerationResponse may be undefined, or defined from star imports

(F405)


60-60: GenerationResponse may be undefined, or defined from star imports

(F405)


61-61: GenerationResponse may be undefined, or defined from star imports

(F405)


64-64: FinishReason may be undefined, or defined from star imports

(F405)


68-68: FinishReason may be undefined, or defined from star imports

(F405)


70-70: FinishReason may be undefined, or defined from star imports

(F405)


76-76: GenerativeModelChatSession may be undefined, or defined from star imports

(F405)


87-87: GenerationResponse may be undefined, or defined from star imports

(F405)

falkordb_gemini_kg/classes/edge.py

6-6: from falkordb_gemini_kg.fixtures.regex import * used; unable to detect undefined names

(F403)

falkordb_gemini_kg/steps/create_ontology_step.py

18-18: falkordb_gemini_kg.models.GenerativeModelConfig imported but unused

Remove unused import: falkordb_gemini_kg.models.GenerativeModelConfig

(F401)


128-128: f-string without any placeholders

Remove extraneous f prefix

(F541)

falkordb_gemini_kg/helpers.py

169-169: Use ontology_edge.source.label != source_label instead of not ontology_edge.source.label == source_label

Replace with != operator

(SIM201)


170-170: Use ontology_edge.target.label != target_label instead of not ontology_edge.target.label == target_label

Replace with != operator

(SIM201)

falkordb_gemini_kg/steps/extract_data_step.py

8-8: falkordb_gemini_kg.models.GenerativeModelConfig imported but unused

Remove unused import: falkordb_gemini_kg.models.GenerativeModelConfig

(F401)

LanguageTool
tests/data/madoff.txt

[duplication] ~50-~50: Possible typo: you repeated a word
Context: ...5 /10 BROWSE EPISODES Videos 2 Official Trailer Trailer 1:50 Watch Official Trailer Madoff: The...

(ENGLISH_WORD_REPEAT_RULE)


[grammar] ~69-~69: This phrase is duplicated. You should probably use “Joseph Scotto” only once.
Context: ... Monster of Wall Street (2023) Top cast Joseph Scotto Joseph Scotto Bernie Madoff Melony Feliciano Melony F...

(PHRASE_REPETITION)


[grammar] ~72-~72: This phrase is duplicated. You should probably use “Melony Feliciano” only once.
Context: ...seph Scotto Joseph Scotto Bernie Madoff Melony Feliciano Melony Feliciano Background Extra Donna Pastorello Donna...

(PHRASE_REPETITION)


[grammar] ~75-~75: This phrase is duplicated. You should probably use “Donna Pastorello” only once.
Context: ...ciano Melony Feliciano Background Extra Donna Pastorello Donna Pastorello Eleanor Squillari Isa Camyar Isa Camyar...

(PHRASE_REPETITION)


[grammar] ~78-~78: This phrase is duplicated. You should probably use “Isa Camyar” only once.
Context: ...ello Donna Pastorello Eleanor Squillari Isa Camyar Isa Camyar Frank DiPascali Sarah Kuklis Sarah Kukl...

(PHRASE_REPETITION)


[grammar] ~81-~81: This phrase is duplicated. You should probably use “Sarah Kuklis” only once.
Context: ...i Isa Camyar Isa Camyar Frank DiPascali Sarah Kuklis Sarah Kuklis Ellen Hales Alex Olson Alex Olson Mark ...

(PHRASE_REPETITION)


[grammar] ~84-~84: This phrase is duplicated. You should probably use “Alex Olson” only once.
Context: ...i Sarah Kuklis Sarah Kuklis Ellen Hales Alex Olson Alex Olson Mark Madoff Elijah George Elijah George...

(PHRASE_REPETITION)


[grammar] ~87-~87: This phrase is duplicated. You should probably use “Elijah George” only once.
Context: ...Hales Alex Olson Alex Olson Mark Madoff Elijah George Elijah George 19th Floor Trader Howie Schaal Howie Sc...

(PHRASE_REPETITION)


[grammar] ~90-~90: This phrase is duplicated. You should probably use “Howie Schaal” only once.
Context: ... George Elijah George 19th Floor Trader Howie Schaal Howie Schaal Jerry O'Hara Stephanie Beauchamp Jodi C...

(PHRASE_REPETITION)


[grammar] ~95-~95: This phrase is duplicated. You should probably use “Cris Colicchio” only once.
Context: ...y O'Hara Stephanie Beauchamp Jodi Crupi Cris Colicchio Cris Colicchio Peter Madoff Alex Hammerli Madoff Emplo...

(PHRASE_REPETITION)


[grammar] ~108-~108: This phrase is duplicated. You should probably use “Paul Faggione” only once.
Context: ... Madoff Robert Loftus 19th Floor Trader Paul Faggione Paul Faggione Jeffrey Tucker Marla Freeman Marla Free...

(PHRASE_REPETITION)


[grammar] ~111-~111: This phrase is duplicated. You should probably use “Marla Freeman” only once.
Context: ...l Faggione Paul Faggione Jeffrey Tucker Marla Freeman Marla Freeman Sonja Kohn Rafael Antonio Vasquez Rafae...

(PHRASE_REPETITION)


[style] ~178-~178: The expression “way too slow” can be considered informal. Consider replacing the phrase to sound more professional.
Context: ... FEATURED REVIEW 6 /10 Good to know but way too slow. A very interesting documentary on a to...

(WAY_TOO_MUCH)


[style] ~179-~179: To make your text more readable, consider placing this phrase between commas.
Context: ... interesting documentary on a topic that I think is good to know for most people. But, i...

(WHICH_I_THOUGHT_COMMA)


[style] ~179-~179: The expression “way too many” can be considered informal. Consider replacing the phrase to sound more professional.
Context: ...al Netflix fashion, is dragged out over way too many episodes and cost you way too much of y...

(WAY_TOO_MUCH)


[style] ~179-~179: The expression “way too much” can be considered informal. Consider replacing the phrase to sound more professional.
Context: ...over way too many episodes and cost you way too much of your time. The lack of original foo...

(WAY_TOO_MUCH)


[style] ~181-~181: The phrase ‘a lot of’ might be wordy and overused. Consider using an alternative.
Context: ...dlessly repeated. Good they interviewed a lot of involved people and they got a hand on ...

(A_LOT_OF)


[uncategorized] ~181-~181: Use a comma before ‘and’ if it connects two independent clauses (unless they are closely connected and short).
Context: ...hey interviewed a lot of involved people and they got a hand on some original conten...

(COMMA_COMPOUND_SENTENCE)


[typographical] ~181-~181: It seems that a comma is missing.
Context: ...they got a hand on some original content though. But it feels like it could fit in a 1 ...

(THOUGH_COMMA)


[uncategorized] ~181-~181: When a number forms part of an adjectival compound, use a hyphen.
Context: ...gh. But it feels like it could fit in a 1 hour documentary movie. So yes this is a gre...

(MISSING_HYPHEN)


[typographical] ~181-~181: It seems that a comma is missing.
Context: ...d fit in a 1 hour documentary movie. So yes this is a great topic, but I'd rather a...

(YES_NO_COMMA)


[uncategorized] ~181-~181: “advice” (noun, “piece of advice”) seems less likely than “advise” (verb, “recommend”).
Context: ...s this is a great topic, but I'd rather advice to read a news article on it than to sp...

(AI_HYDRA_LEO_CP_ADVICE_ADVISE)


[duplication] ~212-~212: Possible typo: you repeated a word
Context: ...echnical specs Runtime 1 hour 2 minutes Color Color Sound mix Dolby Digital Aspect ratio 16...

(ENGLISH_WORD_REPEAT_RULE)

Additional comments not posted (59)
falkordb_gemini_kg/classes/model_config.py (3)

1-1: Consider adding type hints for GenerativeModel.

The import statement is correct, but ensure that the GenerativeModel class is correctly defined and used.


8-10: Constructor looks good.

The constructor correctly initializes the attributes with instances of GenerativeModel.


17-21: Static method with_model looks good.

The static method correctly creates a KnowledgeGraphModelConfig instance with the provided GenerativeModel.

tests/test_auto_create_ontology.py (3)

1-2: Ensure environment variables are set.

The load_dotenv() function loads environment variables from a .env file. Ensure that the .env file exists and contains the necessary variables.


32-32: Verify the Ontology.from_sources method.

Ensure that the Ontology.from_sources method is correctly used and the boundaries and model parameters are valid.

Verification successful

Verification of Ontology.from_sources Method

The Ontology.from_sources method is correctly defined and utilized. The parameters boundaries and model are valid and appropriately used within the method.

  • Definition Location: falkordb_gemini_kg/classes/ontology.py
  • Usage Location: tests/test_auto_create_ontology.py

The parameters boundaries and model are passed and used correctly in the method implementation.

Scripts executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Verify the `Ontology.from_sources` method usage.

# Test: Check if `Ontology.from_sources` method is defined and used correctly.
rg --type python 'def from_sources' && rg --type python 'Ontology.from_sources'

Length of output: 68



Script:

#!/bin/bash
# Description: Verify the `Ontology.from_sources` method usage.

# Test: Check if `Ontology.from_sources` method is defined and used correctly.
rg 'def from_sources' --glob '*.py'
rg 'Ontology.from_sources' --glob '*.py'

Length of output: 260



Script:

#!/bin/bash
# Description: Extract the `Ontology.from_sources` method definition.

# Extract the full definition of the `from_sources` method from `falkordb_gemini_kg/classes/ontology.py`.
rg -A 20 'def from_sources' falkordb_gemini_kg/classes/ontology.py

Length of output: 683


27-27: Verify the existence and initialization of GeminiGenerativeModel.

Ensure that the GeminiGenerativeModel class is correctly imported and initialized.

Verification successful

GeminiGenerativeModel class is correctly defined and initialized.

The GeminiGenerativeModel class is defined in falkordb_gemini_kg/models/gemini.py and it is initialized with the specified model name in the test files.

  • falkordb_gemini_kg/models/gemini.py: class GeminiGenerativeModel(GenerativeModel)
  • tests/test_kg.py: GeminiGenerativeModel(model_name="gemini-1.5-flash-001")
  • tests/test_auto_create_ontology.py: GeminiGenerativeModel(model_name="gemini-1.5-flash-001")
Scripts executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Verify the existence and initialization of `GeminiGenerativeModel`.

# Test: Check if `GeminiGenerativeModel` class is defined and used correctly.
rg --type python 'class GeminiGenerativeModel' && rg --type python 'GeminiGenerativeModel(model_name="gemini-1.5-flash-001")'

Length of output: 79



Script:

#!/bin/bash
# Description: Verify the existence and initialization of `GeminiGenerativeModel`.

# Test: Check if `GeminiGenerativeModel` class is defined.
ast-grep --lang python --pattern 'class GeminiGenerativeModel { $$$ }'

# Test: Check if `GeminiGenerativeModel` is initialized with the specified model name.
ast-grep --lang python --pattern 'GeminiGenerativeModel(model_name="gemini-1.5-flash-001")'

Length of output: 832



Script:

#!/bin/bash
# Description: Verify the existence and initialization of `GeminiGenerativeModel`.

# Test: Check if `GeminiGenerativeModel` class is defined.
ast-grep --lang python --pattern 'class GeminiGenerativeModel: $$$'

Length of output: 69



Script:

#!/bin/bash
# Description: Verify the existence and initialization of `GeminiGenerativeModel`.

# Test: Check if `GeminiGenerativeModel` class is defined.
rg 'class GeminiGenerativeModel'

Length of output: 116

falkordb_gemini_kg/models/model.py (5)

4-7: LGTM!

The FinishReason class defines constants for different finish reasons.


26-30: LGTM!

The GenerationResponse class defines the response structure for a generative model.


33-41: LGTM!

The GenerativeModelChatSession class is an abstract base class for chat sessions.


44-55: LGTM!

The GenerativeModel class is an abstract base class for generative models.


10-23: LGTM! But verify the class usage and parameter initialization.

The GenerativeModelConfig class defines the configuration for a generative model.

However, ensure that all instances of GenerativeModelConfig are correctly initialized with the required parameters.

falkordb_gemini_kg/classes/node.py (7)

Line range hint 7-10: LGTM!

The __init__ method initializes the Node class with a label and attributes.


Line range hint 22-27: LGTM!

The from_json method creates a Node instance from a JSON string or dictionary.


Line range hint 28-30: LGTM!

The to_json method converts a Node instance to a JSON dictionary.


Line range hint 31-42: LGTM!

The combine method overwrites attributes of the current node with attributes of another node.


Line range hint 43-44: LGTM!

The get_unique_attributes method returns a list of unique attributes.


Line range hint 45-47: LGTM!

The to_graph_query method converts a Node instance to a Cypher query.


Line range hint 11-21: Verify the AttributeType.fromString method usage.

Ensure that the AttributeType.fromString method is correctly used and the node.properties parameter is valid.

Verification successful

AttributeType.fromString method usage is verified.

The AttributeType.fromString method is correctly defined and used in the codebase.

  • falkordb_gemini_kg/classes/attribute.py: Method definition found.
  • falkordb_gemini_kg/classes/node.py: Usage found.
  • falkordb_gemini_kg/classes/edge.py: Usage found.
Scripts executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Verify the `AttributeType.fromString` method usage.

# Test: Check if `AttributeType.fromString` method is defined and used correctly.
rg --type python 'def fromString' && rg --type python 'AttributeType.fromString'

Length of output: 66



Script:

#!/bin/bash
# Description: Verify the `AttributeType.fromString` method usage.

# Test: Check if `AttributeType.fromString` method is defined and used correctly.
rg --type py 'def fromString' && rg --type py 'AttributeType.fromString'

Length of output: 343

falkordb_gemini_kg/classes/attribute.py (6)

15-19: LGTM!

The fromString method converts a string to an AttributeType.


Line range hint 23-28: LGTM!

The __init__ method initializes the Attribute class with a name, type, unique flag, and required flag.


Line range hint 29-39: LGTM!

The from_json method creates an Attribute instance from a JSON string or dictionary.


Line range hint 40-58: LGTM!

The from_string method creates an Attribute instance from a string.


Line range hint 59-63: LGTM!

The to_json method converts an Attribute instance to a JSON dictionary.


Line range hint 64-66: LGTM!

The __str__ method converts an Attribute instance to a string.

tests/test_kg.py (9)

1-3: Remove unnecessary load_dotenv call if not required.

The load_dotenv function is used to load environment variables from a .env file. Ensure that this is necessary for the tests; otherwise, it can be removed to avoid potential issues with environment variable management.


4-7: Imports look good!

The imports for Ontology, Node, Edge, Attribute, and AttributeType are appropriate for the tests.


8-18: Logging setup looks good!

The logging configuration is set to DEBUG level, which is useful for detailed output during testing.


20-20: Ensure vertexai.init is necessary.

The vertexai.init function initializes Vertex AI with project and location details. Verify that this initialization is required for the tests.


23-26: Class documentation looks good!

The class TestKG is well-documented, explaining that it tests the Knowledge Graph.


28-45: Setup class method looks good!

The setUpClass method initializes the ontology with nodes and edges. The structure and logic are appropriate.


75-80: Model initialization and KG creation look good!

The model is initialized with GeminiGenerativeModel, and the KG is created with KnowledgeGraph. Ensure that the model name is correct and available.


82-95: Test KG creation method looks good!

The test_kg_creation method tests the creation and querying of the KG. The assertions and logging are appropriate.


96-102: Test KG delete method looks good!

The test_kg_delete method tests the deletion of the KG. The assertions and logic are appropriate.

falkordb_gemini_kg/models/gemini.py (9)

10-12: Class definition looks good!

The GeminiGenerativeModel class inherits from GenerativeModel.

Tools
Ruff

10-10: GenerativeModel may be undefined, or defined from star imports

(F405)


14-22: Constructor looks good!

The constructor initializes the model with the provided parameters. Ensure that the model_name is valid and available.

Tools
Ruff

17-17: GenerativeModelConfig may be undefined, or defined from star imports

(F405)


24-42: Model retrieval method looks good!

The _get_model method retrieves the model, initializing it if necessary. Ensure that the VertexAiGenerativeModel class and its parameters are correct.


44-49: Method chaining looks good!

The with_system_instruction method allows method chaining by returning self.

Tools
Ruff

44-44: GenerativeModel may be undefined, or defined from star imports

(F405)


51-53: Chat session method looks good!

The start_chat method starts a chat session with the model.

Tools
Ruff

51-51: GenerativeModelChatSession may be undefined, or defined from star imports

(F405)


54-56: Ask method looks good!

The ask method sends a message to the model and returns the response.

Tools
Ruff

54-54: GenerationResponse may be undefined, or defined from star imports

(F405)


58-73: Response parsing method looks good!

The parse_generate_content_response method parses the model's response into a GenerationResponse object.

Tools
Ruff

60-60: GenerationResponse may be undefined, or defined from star imports

(F405)


61-61: GenerationResponse may be undefined, or defined from star imports

(F405)


64-64: FinishReason may be undefined, or defined from star imports

(F405)


68-68: FinishReason may be undefined, or defined from star imports

(F405)


70-70: FinishReason may be undefined, or defined from star imports

(F405)


76-80: Class definition and constructor look good!

The GeminiChatSession class initializes a chat session with the model.

Tools
Ruff

76-76: GenerativeModelChatSession may be undefined, or defined from star imports

(F405)


87-89: Send message method looks good!

The send_message method sends a message to the chat session and returns the response.

Tools
Ruff

87-87: GenerationResponse may be undefined, or defined from star imports

(F405)

falkordb_gemini_kg/classes/edge.py (2)

4-4: Imports look good!

The imports for Attribute and AttributeType are appropriate.


Line range hint 61-71: Ensure correct attribute mapping.

The from_graph method maps edge.properties to AttributeType. Verify that AttributeType.fromString correctly handles the properties.

falkordb_gemini_kg/kg.py (5)

Line range hint 1-10: Imports look good!

The imports for Ontology, FalkorDB, AbstractSource, KnowledgeGraphModelConfig, ExtractDataStep, GraphQueryGenerationStep, QAStep, and ChatSession are appropriate.


Line range hint 12-18: Logging setup looks good!

The logging configuration is set to DEBUG level, which is useful for detailed output.


Line range hint 20-42: Constructor looks good!

The constructor initializes the KnowledgeGraph with the provided parameters. Ensure that the model_config and ontology are correctly passed and used.


107-109: Ensure correct model usage.

The _create_graph_with_sources method uses self._model_config.extract_data. Verify that extract_data is correctly configured and used.


127-138: Ensure correct chat session usage.

The ask method uses self._model_config.cypher_generation and self._model_config.qa. Verify that these configurations are correct and used appropriately.

falkordb_gemini_kg/classes/ontology.py (2)

4-4: Imports look good!

The import for GenerativeModel is appropriate.


22-27: Ensure correct model usage.

The from_sources method uses GenerativeModel. Verify that the model is correctly configured and used.

falkordb_gemini_kg/steps/create_ontology_step.py (3)

49-49: LGTM!

The _create_chat method is correctly implemented.


Line range hint 127-148: Verify finish reasons and improve JSON extraction error handling.

Ensure the FinishReason.MAX_TOKENS and FinishReason.STOP are used consistently across the model. Additionally, improve the error handling for JSON extraction.

        try:
            new_ontology = Ontology.from_json(extract_json(combined_text))
        except Exception as e:
            print(f"Exception while extracting JSON: {e}")
            new_ontology = None

-        if new_ontology is not None:
+        if new_ontology:
            o = o.merge_with(new_ontology)
Verification successful

Line range hint 127-148: Verified consistent usage of FinishReason.MAX_TOKENS and FinishReason.STOP.

The FinishReason constants are used consistently across the codebase. However, consider improving the error handling for JSON extraction as suggested.

  • falkordb_gemini_kg/models/gemini.py
  • falkordb_gemini_kg/steps/extract_data_step.py
  • falkordb_gemini_kg/steps/create_ontology_step.py
Scripts executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Verify the usage of FinishReason constants in the codebase.

# Test: Search for the usage of FinishReason constants. Expect consistent usage.
rg --type python $'FinishReason.MAX_TOKENS'
rg --type python $'FinishReason.STOP'

Length of output: 141



Script:

#!/bin/bash
# Description: Verify the usage of FinishReason constants in the codebase.

# Test: Search for the usage of FinishReason constants. Expect consistent usage.
rg 'FinishReason\.MAX_TOKENS'
rg 'FinishReason\.STOP'

Length of output: 1045


Line range hint 84-109: Verify finish reasons and improve JSON extraction error handling.

Ensure the FinishReason.MAX_TOKENS and FinishReason.STOP are used consistently across the model. Additionally, improve the error handling for JSON extraction.

        try:
            new_ontology = Ontology.from_json(extract_json(combined_text))
        except Exception as e:
            logger.debug(f"Exception while extracting JSON: {e}")
            new_ontology = None

-        if new_ontology is not None:
+        if new_ontology:
            o = o.merge_with(new_ontology)
Verification successful

Line range hint 84-109: Verify finish reasons and improve JSON extraction error handling.

The FinishReason.MAX_TOKENS and FinishReason.STOP constants are used consistently across the codebase. Consider improving the error handling for JSON extraction as follows:

  • File: falkordb_gemini_kg/steps/create_ontology_step.py
          try:
              new_ontology = Ontology.from_json(extract_json(combined_text))
          except Exception as e:
              logger.debug(f"Exception while extracting JSON: {e}")
              new_ontology = None
    
    -        if new_ontology is not None:
    +        if new_ontology:
              o = o.merge_with(new_ontology)
Scripts executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Verify the usage of FinishReason constants in the codebase.

# Test: Search for the usage of FinishReason constants. Expect consistent usage.
rg --type python $'FinishReason.MAX_TOKENS'
rg --type python $'FinishReason.STOP'

Length of output: 141



Script:

#!/bin/bash
# Description: Verify the usage of FinishReason constants in the codebase.

# Test: Search for the usage of FinishReason constants. Expect consistent usage.
rg 'FinishReason\.MAX_TOKENS' --glob '*.py'
rg 'FinishReason\.STOP' --glob '*.py'

Length of output: 1073

falkordb_gemini_kg/helpers.py (5)

Line range hint 6-10: LGTM!

The extract_json function is correctly implemented.

Tools
Ruff

169-169: Use ontology_edge.source.label != source_label instead of not ontology_edge.source.label == source_label

Replace with != operator

(SIM201)


170-170: Use ontology_edge.target.label != target_label instead of not ontology_edge.target.label == target_label

Replace with != operator

(SIM201)


Line range hint 37-53: LGTM!

The stringify_falkordb_response function is correctly implemented.

Tools
Ruff

169-169: Use ontology_edge.source.label != source_label instead of not ontology_edge.source.label == source_label

Replace with != operator

(SIM201)


170-170: Use ontology_edge.target.label != target_label instead of not ontology_edge.target.label == target_label

Replace with != operator

(SIM201)


Line range hint 56-62: LGTM!

The extract_cypher function is correctly implemented.

Tools
Ruff

169-169: Use ontology_edge.source.label != source_label instead of not ontology_edge.source.label == source_label

Replace with != operator

(SIM201)


170-170: Use ontology_edge.target.label != target_label instead of not ontology_edge.target.label == target_label

Replace with != operator

(SIM201)


Line range hint 86-96: LGTM!

The validate_cypher_nodes_exist function is correctly implemented.

Tools
Ruff

169-169: Use ontology_edge.source.label != source_label instead of not ontology_edge.source.label == source_label

Replace with != operator

(SIM201)


170-170: Use ontology_edge.target.label != target_label instead of not ontology_edge.target.label == target_label

Replace with != operator

(SIM201)


Line range hint 99-109: LGTM!

The validate_cypher_edges_exist function is correctly implemented.

Tools
Ruff

169-169: Use ontology_edge.source.label != source_label instead of not ontology_edge.source.label == source_label

Replace with != operator

(SIM201)


170-170: Use ontology_edge.target.label != target_label instead of not ontology_edge.target.label == target_label

Replace with != operator

(SIM201)

@@ -0,0 +1 @@
from .model import *
Copy link

Choose a reason for hiding this comment

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

Avoid using wildcard imports.

Using from .model import * can lead to namespace pollution and makes it difficult to track which names are imported. Replace the wildcard import with explicit imports.

- from .model import *
+ from .model import GenerativeModel, GenerativeModelConfig, GenerativeModelChatSession, FinishReason, GenerationResponse
Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
from .model import *
from .model import GenerativeModel, GenerativeModelConfig, GenerativeModelChatSession, FinishReason, GenerationResponse
Tools
Ruff

1-1: from .model import * used; unable to detect undefined names

(F403)

@@ -2,8 +2,10 @@
from .source import Source
from .node import Node
from .edge import Edge
Copy link

Choose a reason for hiding this comment

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

Remove unused import Edge.

The Edge class is imported but not used in this file. Consider removing it.

- from .edge import Edge
Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
from .edge import Edge
Tools
Ruff

4-4: .edge.Edge imported but unused; consider removing, adding to __all__, or using a redundant alias

(F401)

@@ -2,8 +2,10 @@
from .source import Source
Copy link

Choose a reason for hiding this comment

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

Remove unused import Source.

The Source class is imported but not used in this file. Consider removing it.

- from .source import Source
Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
from .source import Source
Tools
Ruff

2-2: .source.Source imported but unused; consider removing, adding to __all__, or using a redundant alias

(F401)

@@ -2,8 +2,10 @@
from .source import Source
from .node import Node
Copy link

Choose a reason for hiding this comment

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

Remove unused import Node.

The Node class is imported but not used in this file. Consider removing it.

- from .node import Node
Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
from .node import Node
Tools
Ruff

3-3: .node.Node imported but unused; consider removing, adding to __all__, or using a redundant alias

(F401)

@@ -2,8 +2,10 @@
from .source import Source
from .node import Node
from .edge import Edge
from .attribute import Attribute, AttributeType
Copy link

Choose a reason for hiding this comment

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

Remove unused import AttributeType.

The AttributeType class is imported but not used in this file. Consider removing it.

- from .attribute import AttributeType

Committable suggestion was skipped due to low confidence.

Tools
Ruff

5-5: .attribute.Attribute imported but unused; consider removing, adding to __all__, or using a redundant alias

(F401)


5-5: .attribute.AttributeType imported but unused; consider removing, adding to __all__, or using a redundant alias

(F401)


Remove unused import Attribute.

The Attribute class is imported but not used in this file. Consider removing it.

- from .attribute import Attribute, AttributeType
+ from .attribute import AttributeType
Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
from .attribute import Attribute, AttributeType
from .attribute import AttributeType
Tools
Ruff

5-5: .attribute.Attribute imported but unused; consider removing, adding to __all__, or using a redundant alias

(F401)


5-5: .attribute.AttributeType imported but unused; consider removing, adding to __all__, or using a redundant alias

(F401)

BROWSE EPISODES
Videos
2
Official Trailer
Copy link

Choose a reason for hiding this comment

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

Fix the repeated word "Trailer".

The word "Trailer" is repeated. Consider removing the repetition.

- Official Trailer Trailer 1:50
+ Official Trailer 1:50
Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
Official Trailer
Official Trailer 1:50
Tools
LanguageTool

[duplication] ~50-~50: Possible typo: you repeated a word
Context: ...5 /10 BROWSE EPISODES Videos 2 Official Trailer Trailer 1:50 Watch Official Trailer Madoff: The...

(ENGLISH_WORD_REPEAT_RULE)

Bernie Madoff
Melony Feliciano
Melony Feliciano
Background Extra
Copy link

Choose a reason for hiding this comment

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

Fix the repeated phrase "Donna Pastorello".

The phrase "Donna Pastorello" is repeated. Consider removing the repetition.

- Donna Pastorello Donna Pastorello Eleanor Squillari
+ Donna Pastorello Eleanor Squillari
Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
Background Extra
Donna Pastorello Eleanor Squillari
Tools
LanguageTool

[grammar] ~75-~75: This phrase is duplicated. You should probably use “Donna Pastorello” only once.
Context: ...ciano Melony Feliciano Background Extra Donna Pastorello Donna Pastorello Eleanor Squillari Isa Camyar Isa Camyar...

(PHRASE_REPETITION)

@@ -0,0 +1,89 @@
from .model import *
Copy link

Choose a reason for hiding this comment

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

Avoid using star imports.

The star import (from .model import *) can lead to undefined names and makes it harder to track dependencies. Import specific classes and functions instead.

- from .model import *
+ from .model import GenerativeModel, GenerativeModelConfig, GenerationResponse, GenerativeModelChatSession, FinishReason
Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
from .model import *
from .model import GenerativeModel, GenerativeModelConfig, GenerationResponse, GenerativeModelChatSession, FinishReason
Tools
Ruff

1-1: from .model import * used; unable to detect undefined names

(F403)

@@ -1,7 +1,7 @@
import json
import re
import logging
from .attribute import Attribute, _AttributeType
from .attribute import Attribute, AttributeType
from falkordb import Node as GraphNode, Edge as GraphEdge
from falkordb_gemini_kg.fixtures.regex import *
Copy link

Choose a reason for hiding this comment

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

Avoid using star imports.

The star import (from falkordb_gemini_kg.fixtures.regex import *) can lead to undefined names and makes it harder to track dependencies. Import specific classes and functions instead.

- from falkordb_gemini_kg.fixtures.regex import *
+ from falkordb_gemini_kg.fixtures.regex import EDGE_LABEL_REGEX, NODE_LABEL_REGEX, EDGE_REGEX
Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
from falkordb_gemini_kg.fixtures.regex import *
from falkordb_gemini_kg.fixtures.regex import EDGE_LABEL_REGEX, NODE_LABEL_REGEX, EDGE_REGEX
Tools
Ruff

6-6: from falkordb_gemini_kg.fixtures.regex import * used; unable to detect undefined names

(F403)

Comment on lines +32 to 33
chat_session: GenerativeModelChatSession,
config: dict = {},
Copy link

Choose a reason for hiding this comment

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

Fix mutable default argument.

Do not use mutable data structures for argument defaults. Replace with None and initialize within the function.

-        config: dict = {},
+        config: dict = None,
+        self.config = config if config is not None else {}
Tools
Ruff

33-33: Do not use mutable data structures for argument defaults

Replace with None; initialize within function

(B006)

@dudizimber dudizimber linked an issue Jul 7, 2024 that may be closed by this pull request
@AviAvni AviAvni closed this Jul 31, 2024
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
enhancement New feature or request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Support Gemini Introduce LLM model abstraction
2 participants