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

Implement a Gemini LLMClient #1901

Open
kevinmessiaen opened this issue Apr 18, 2024 · 7 comments
Open

Implement a Gemini LLMClient #1901

kevinmessiaen opened this issue Apr 18, 2024 · 7 comments
Assignees
Labels
enhancement New feature or request good first issue Good for newcomers

Comments

@kevinmessiaen
Copy link
Member

🚀 Feature Request

Create a Gemini client that extends LLMClient.

🔈 Motivation

This will allow to run the scan and tests using Gemini models

🛰 Alternatives

N/A

📎 Additional context

Example can be seen with mistral and openai.

@kevinmessiaen kevinmessiaen added enhancement New feature or request good first issue Good for newcomers labels Apr 18, 2024
@marouanetalaa
Copy link
Contributor

Hello, is this implementation still needed ? I would like to contribute to this issue

@kevinmessiaen
Copy link
Member Author

Hello @marouanetalaa ,

yes we still need this implementation. It would be appreciated if you can contribute to this issue!

I assigned you to it, let me know if you need help or information.

@sudharshanavp
Copy link

Hey, I just tried replicating the changes in the pull request on my system and set my gemini api key and tried to run a scan.

I get this for all the LLM Assisted Detectors

2024-07-02 22:16:07,754 pid:17976 MainThread giskard.scanner.logger INFO     LLMStereotypesDetector: Generating test case requirements
2024-07-02 22:16:07,756 pid:17976 MainThread root         WARNING  Unsupported format 'json', ignoring.
2024-07-02 22:16:07,758 pid:17976 MainThread giskard.scanner.logger ERROR    Detector LLMStereotypesDetector failed with error: GenerationConfig.__init__() got an unexpected keyword argument 'seed' 

I have added these lines of code to setup the client

import google.generativeai as genai
from giskard.llm.client.gemini import GeminiClient

genai.configure(api_key=os.environ["GEMINI_API_KEY"])
giskard.llm.set_default_client(GeminiClient())

@Khaliq88
Copy link

Khaliq88 commented Jul 2, 2024

import google.generativeai as genai
from giskard.llm.client.gemini import GeminiClient

genai.configure(api_key=os.environ["GEMINI_API_KEY"])
giskard.llm.set_default_client(GeminiClient())

@kevinmessiaen
Copy link
Member Author

Hey, I just tried replicating the changes in the pull request on my system and set my gemini api key and tried to run a scan.

I get this for all the LLM Assisted Detectors

2024-07-02 22:16:07,754 pid:17976 MainThread giskard.scanner.logger INFO     LLMStereotypesDetector: Generating test case requirements
2024-07-02 22:16:07,756 pid:17976 MainThread root         WARNING  Unsupported format 'json', ignoring.
2024-07-02 22:16:07,758 pid:17976 MainThread giskard.scanner.logger ERROR    Detector LLMStereotypesDetector failed with error: GenerationConfig.__init__() got an unexpected keyword argument 'seed' 

I have added these lines of code to setup the client

import google.generativeai as genai
from giskard.llm.client.gemini import GeminiClient

genai.configure(api_key=os.environ["GEMINI_API_KEY"])
giskard.llm.set_default_client(GeminiClient())

Thanks for reporting the issue, I corrected this inside of #1975

@sudharshanavp
Copy link

sudharshanavp commented Jul 3, 2024

Hey, now I'm having this issue

2024-07-03 20:40:01,087 pid:11428 MainThread giskard.scanner.logger INFO     Running detectors: ['LLMBasicSycophancyDetector', 'LLMCharsInjectionDetector', 'LLMHarmfulContentDetector', 'LLMImplausibleOutputDetector', 'LLMInformationDisclosureDetector', 'LLMOutputFormattingDetector', 'LLMPromptInjectionDetector', 'LLMStereotypesDetector', 'LLMFaithfulnessDetector']
Running detector LLMBasicSycophancyDetector…
2024-07-03 20:40:01,283 pid:11428 MainThread root         WARNING  Unsupported format 'json', ignoring.
2024-07-03 20:40:03,589 pid:11428 MainThread giskard.scanner.logger ERROR    Detector LLMBasicSycophancyDetector failed with error: 400 Please use a valid role: user, model.
Traceback (most recent call last):
  File "e:\Work\1. Projects\giskard_demo\.venv\Lib\site-packages\giskard\scanner\scanner.py", line 152, in _run_detectors
    detected_issues = detector.run(model, dataset, features=features)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "e:\Work\1. Projects\giskard_demo\.venv\Lib\site-packages\giskard\scanner\llm\llm_basic_sycophancy_detector.py", line 85, in run
    dataset1, dataset2 = generator.generate_dataset(
                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "e:\Work\1. Projects\giskard_demo\.venv\Lib\site-packages\giskard\llm\generators\sycophancy.py", line 101, in generate_dataset
    out = self.llm_client.complete(
          ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "e:\Work\1. Projects\giskard_demo\.venv\Lib\site-packages\giskard\llm\client\gemini.py", line 75, in complete
    contents=_format(messages),
             ^^^^^^^^^^^^^^^^^^
  File "e:\Work\1. Projects\giskard_demo\.venv\Lib\site-packages\google\generativeai\generative_models.py", line 331, in generate_content
    response = self._client.generate_content(
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "e:\Work\1. Projects\giskard_demo\.venv\Lib\site-packages\google\ai\generativelanguage_v1beta\services\generative_service\client.py", line 827, in generate_content
    response = rpc(
               ^^^^
  File "e:\Work\1. Projects\giskard_demo\.venv\Lib\site-packages\google\api_core\gapic_v1\method.py", line 131, in __call__
    return wrapped_func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "e:\Work\1. Projects\giskard_demo\.venv\Lib\site-packages\google\api_core\retry\retry_unary.py", line 293, in retry_wrapped_func
    return retry_target(
           ^^^^^^^^^^^^^
  File "e:\Work\1. Projects\giskard_demo\.venv\Lib\site-packages\google\api_core\retry\retry_unary.py", line 153, in retry_target
    _retry_error_helper(
  File "e:\Work\1. Projects\giskard_demo\.venv\Lib\site-packages\google\api_core\retry\retry_base.py", line 212, in _retry_error_helper
    raise final_exc from source_exc
  File "e:\Work\1. Projects\giskard_demo\.venv\Lib\site-packages\google\api_core\retry\retry_unary.py", line 144, in retry_target
    result = target()
             ^^^^^^^^
  File "e:\Work\1. Projects\giskard_demo\.venv\Lib\site-packages\google\api_core\timeout.py", line 120, in func_with_timeout
    return func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "e:\Work\1. Projects\giskard_demo\.venv\Lib\site-packages\google\api_core\grpc_helpers.py", line 78, in error_remapped_callable
    raise exceptions.from_grpc_error(exc) from exc
google.api_core.exceptions.InvalidArgument: 400 Please use a valid role: user, model.
LLMBasicSycophancyDetector: 0 issue detected. (Took 0:00:02.711737)

I think Gemini only accepts user or model as role.

Also https://ai.google.dev/gemini-api/docs/system-instructions?lang=python is a thing. How would we ideally use this within the GeminiClient?

@kevinmessiaen
Copy link
Member Author

kevinmessiaen commented Jul 4, 2024

Hey, now I'm having this issue

2024-07-03 20:40:01,087 pid:11428 MainThread giskard.scanner.logger INFO     Running detectors: ['LLMBasicSycophancyDetector', 'LLMCharsInjectionDetector', 'LLMHarmfulContentDetector', 'LLMImplausibleOutputDetector', 'LLMInformationDisclosureDetector', 'LLMOutputFormattingDetector', 'LLMPromptInjectionDetector', 'LLMStereotypesDetector', 'LLMFaithfulnessDetector']
Running detector LLMBasicSycophancyDetector…
2024-07-03 20:40:01,283 pid:11428 MainThread root         WARNING  Unsupported format 'json', ignoring.
2024-07-03 20:40:03,589 pid:11428 MainThread giskard.scanner.logger ERROR    Detector LLMBasicSycophancyDetector failed with error: 400 Please use a valid role: user, model.
Traceback (most recent call last):
  File "e:\Work\1. Projects\giskard_demo\.venv\Lib\site-packages\giskard\scanner\scanner.py", line 152, in _run_detectors
    detected_issues = detector.run(model, dataset, features=features)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "e:\Work\1. Projects\giskard_demo\.venv\Lib\site-packages\giskard\scanner\llm\llm_basic_sycophancy_detector.py", line 85, in run
    dataset1, dataset2 = generator.generate_dataset(
                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "e:\Work\1. Projects\giskard_demo\.venv\Lib\site-packages\giskard\llm\generators\sycophancy.py", line 101, in generate_dataset
    out = self.llm_client.complete(
          ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "e:\Work\1. Projects\giskard_demo\.venv\Lib\site-packages\giskard\llm\client\gemini.py", line 75, in complete
    contents=_format(messages),
             ^^^^^^^^^^^^^^^^^^
  File "e:\Work\1. Projects\giskard_demo\.venv\Lib\site-packages\google\generativeai\generative_models.py", line 331, in generate_content
    response = self._client.generate_content(
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "e:\Work\1. Projects\giskard_demo\.venv\Lib\site-packages\google\ai\generativelanguage_v1beta\services\generative_service\client.py", line 827, in generate_content
    response = rpc(
               ^^^^
  File "e:\Work\1. Projects\giskard_demo\.venv\Lib\site-packages\google\api_core\gapic_v1\method.py", line 131, in __call__
    return wrapped_func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "e:\Work\1. Projects\giskard_demo\.venv\Lib\site-packages\google\api_core\retry\retry_unary.py", line 293, in retry_wrapped_func
    return retry_target(
           ^^^^^^^^^^^^^
  File "e:\Work\1. Projects\giskard_demo\.venv\Lib\site-packages\google\api_core\retry\retry_unary.py", line 153, in retry_target
    _retry_error_helper(
  File "e:\Work\1. Projects\giskard_demo\.venv\Lib\site-packages\google\api_core\retry\retry_base.py", line 212, in _retry_error_helper
    raise final_exc from source_exc
  File "e:\Work\1. Projects\giskard_demo\.venv\Lib\site-packages\google\api_core\retry\retry_unary.py", line 144, in retry_target
    result = target()
             ^^^^^^^^
  File "e:\Work\1. Projects\giskard_demo\.venv\Lib\site-packages\google\api_core\timeout.py", line 120, in func_with_timeout
    return func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "e:\Work\1. Projects\giskard_demo\.venv\Lib\site-packages\google\api_core\grpc_helpers.py", line 78, in error_remapped_callable
    raise exceptions.from_grpc_error(exc) from exc
google.api_core.exceptions.InvalidArgument: 400 Please use a valid role: user, model.
LLMBasicSycophancyDetector: 0 issue detected. (Took 0:00:02.711737)

I think Gemini only accepts user or model as role.

Also https://ai.google.dev/gemini-api/docs/system-instructions?lang=python is a thing. How would we ideally use this within the GeminiClient?

You're right, it will be more robust to switch to the system_instruction. However since we ask the user to provide the GenerativeModel we don't have access to it, I'll take a look on how to implement this properly.

I also comitted a fix for the role name, it was implemented but somehow the variable used in the end was the initial one

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request good first issue Good for newcomers
Development

No branches or pull requests

4 participants