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

LLM Tools support for Google Generative AI integration #117644

Merged
merged 28 commits into from
May 20, 2024

Conversation

Shulyaka
Copy link
Contributor

@Shulyaka Shulyaka commented May 17, 2024

Proposed change

Implement LLM Tools feature (#115464) for google_generative_ai_conversation. Added as a model picker and API picker in options flow:

CleanShot 2024-05-18 at 22 57 16@2x

Type of change

  • Dependency upgrade
  • Bugfix (non-breaking change which fixes an issue)
  • New integration (thank you!)
  • New feature (which adds functionality to an existing integration)
  • Deprecation (breaking change to happen in the future)
  • Breaking change (fix/feature causing existing functionality to break)
  • Code quality improvements to existing code or addition of tests

Additional information

Checklist

  • The code change is tested and works locally.
  • Local tests pass. Your PR cannot be merged unless tests pass
  • There is no commented out code in this PR.
  • I have followed the development checklist
  • I have followed the perfect PR recommendations
  • The code has been formatted using Ruff (ruff format homeassistant tests)
  • Tests have been added to verify that the new code works.

If user exposed functionality or configuration variables are added/changed:

If the code communicates with devices, web services, or third-party tools:

  • The manifest file has all fields filled out correctly.
    Updated and included derived files by running: python3 -m script.hassfest.
  • New or updated dependencies have been added to requirements_all.txt.
    Updated by running python3 -m script.gen_requirements_all.
  • For the updated dependencies - a link to the changelog, or at minimum a diff between library versions is added to the PR description.
  • Untested files have been added to .coveragerc.

To help with the load of incoming pull requests:

@home-assistant
Copy link

Hey there @tronikos, mind taking a look at this pull request as it has been labeled with an integration (google_generative_ai_conversation) you are listed as a code owner for? Thanks!

Code owner commands

Code owners of google_generative_ai_conversation can trigger bot actions by commenting:

  • @home-assistant close Closes the pull request.
  • @home-assistant rename Awesome new title Renames the pull request.
  • @home-assistant reopen Reopen the pull request.
  • @home-assistant unassign google_generative_ai_conversation Removes the current integration label and assignees on the pull request, add the integration domain after the command.
  • @home-assistant add-label needs-more-information Add a label (needs-more-information, problem in dependency, problem in custom component) to the pull request.
  • @home-assistant remove-label needs-more-information Remove a label (needs-more-information, problem in dependency, problem in custom component) on the pull request.

genai.get_model, entry.options.get(CONF_CHAT_MODEL, DEFAULT_CHAT_MODEL)
)
)
await hass.async_add_executor_job(partial(genai.get_model, DEFAULT_CHAT_MODEL))
Copy link
Member

Choose a reason for hiding this comment

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

I changed this because when I had configured a bad model, the config entry refused to startup

Copy link
Contributor

Choose a reason for hiding this comment

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

Why is that bad? Isn't it better to fail as soon as possible?

Copy link
Member

Choose a reason for hiding this comment

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

The config entry wouldn't set up and the user couldn't change the model anymore 🙈

Copy link
Member

Choose a reason for hiding this comment

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

(happened to me)

@balloob balloob marked this pull request as ready for review May 18, 2024 04:23
@balloob balloob requested a review from a team as a code owner May 18, 2024 04:23
@home-assistant
Copy link

Please take a look at the requested changes, and use the Ready for review button when you are done, thanks 👍

Learn more about our pull request process.

@home-assistant home-assistant bot marked this pull request as draft May 18, 2024 04:40
@balloob balloob marked this pull request as ready for review May 18, 2024 04:45
@home-assistant home-assistant bot requested a review from allenporter May 18, 2024 04:45
)
return conversation.ConversationResult(
response=intent_response, conversation_id=conversation_id
LOGGER.debug("Tool call: %s(%s)", tool_input.name, tool_input.tool_args)
Copy link
Contributor

Choose a reason for hiding this comment

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

tool_input.tool_name

@@ -80,6 +135,11 @@ async def async_process(
self, user_input: conversation.ConversationInput
) -> conversation.ConversationResult:
"""Process a sentence."""
tools: list[dict[str, Any]] | None = None
Copy link
Contributor

Choose a reason for hiding this comment

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

Do the tools need to be constructed on every interaction with the conversation entity? How about constructing them in init once and maybe even share them among the multiple conversation entities?

Copy link
Member

Choose a reason for hiding this comment

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

It's up to the LLM API objects to decide if they want to cache them. Here we just fetch them.

@tronikos
Copy link
Contributor

Don't forget to update the documentation and link to it here. It says "This conversation agent is unable to control your house"

@balloob balloob marked this pull request as draft May 18, 2024 16:01
@balloob
Copy link
Member

balloob commented May 18, 2024

Marked as draft as we want to change the LLM helper slightly.

@balloob balloob marked this pull request as ready for review May 19, 2024 02:59
genai.get_model, entry.options.get(CONF_CHAT_MODEL, DEFAULT_CHAT_MODEL)
)
)
await hass.async_add_executor_job(partial(genai.get_model, DEFAULT_CHAT_MODEL))
Copy link
Contributor

Choose a reason for hiding this comment

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

Why is that bad? Isn't it better to fail as soon as possible?

"models/gemini-1.0-pro", # duplicate of gemini-pro
"models/gemini-1.5-flash-latest",
)
and "Vision" not in api_model.display_name
Copy link
Contributor

Choose a reason for hiding this comment

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

Not sure if the API is translating the display name. Seems safer to check api_model.name instead.

@balloob balloob merged commit c3196a5 into home-assistant:dev May 20, 2024
33 of 34 checks passed
bajansen pushed a commit to bajansen/homeassistant that referenced this pull request May 20, 2024
…t#117644)

* initial commit

* Undo prompt chenges

* Move format_tool out of the class

* Only catch HomeAssistantError and vol.Invalid

* Add config flow option

* Fix type

* Add translation

* Allow changing API access from options flow

* Allow model picking

* Remove allowing HASS Access in main flow

* Move model to the top in options flow

* Make prompt conditional based on API access

* convert only once to dict

* Reduce debug logging

* Update title

* re-order models

* Address comments

* Move things

* Update labels

* Add tool call tests

* coverage

* Use LLM APIs

* Fixes

* Address comments

* Reinstate the title to not break entity name

---------

Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
@github-actions github-actions bot locked and limited conversation to collaborators May 21, 2024
@home-assistant home-assistant unlocked this conversation May 21, 2024
@balloob balloob mentioned this pull request May 21, 2024
20 tasks
@github-actions github-actions bot locked and limited conversation to collaborators May 22, 2024
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

5 participants